moel@324: /*
moel@324:  
moel@344:   This Source Code Form is subject to the terms of the Mozilla Public
moel@344:   License, v. 2.0. If a copy of the MPL was not distributed with this
moel@344:   file, You can obtain one at http://mozilla.org/MPL/2.0/.
moel@324:  
moel@344:   Copyright (C) 2011-2012 Michael Möller <mmoeller@openhardwaremonitor.org>
moel@344:   Copyright (C) 2011 Roland Reinl <roland-reinl@gmx.de>
moel@344: 	
moel@324: */
moel@324: 
moel@324: using System;
moel@324: using System.Collections.Generic;
moel@374: using OpenHardwareMonitor.Collections;
moel@324: 
moel@324: namespace OpenHardwareMonitor.Hardware.HDD {
moel@324:   internal class SmartAttribute {
moel@324: 
moel@324:     private RawValueConversion rawValueConversion;
moel@324: 
moel@324:     /// <summary>
moel@324:     /// Initializes a new instance of the <see cref="SmartAttribute"/> class.
moel@324:     /// </summary>
moel@324:     /// <param name="identifier">The SMART identifier of the attribute.</param>
moel@324:     /// <param name="name">The name of the attribute.</param>
moel@324:     public SmartAttribute(byte identifier, string name) : 
moel@324:       this(identifier, name, null, null, 0) { }
moel@324: 
moel@324:     /// <summary>
moel@324:     /// Initializes a new instance of the <see cref="SmartAttribute"/> class.
moel@324:     /// </summary>
moel@324:     /// <param name="identifier">The SMART identifier of the attribute.</param>
moel@324:     /// <param name="name">The name of the attribute.</param>
moel@324:     /// <param name="rawValueConversion">A delegate for converting the raw byte 
moel@324:     /// array into a value (or null to use the attribute value).</param>
moel@324:     public SmartAttribute(byte identifier, string name,
moel@324:       RawValueConversion rawValueConversion) :
moel@324:       this(identifier, name, rawValueConversion, null, 0) { }
moel@324: 
moel@324:     /// <summary>
moel@324:     /// Initializes a new instance of the <see cref="SmartAttribute"/> class.
moel@324:     /// </summary>
moel@324:     /// <param name="identifier">The SMART identifier of the attribute.</param>
moel@324:     /// <param name="name">The name of the attribute.</param>
moel@324:     /// <param name="rawValueConversion">A delegate for converting the raw byte 
moel@324:     /// array into a value (or null to use the attribute value).</param>
moel@324:     /// <param name="sensorType">Type of the sensor or null if no sensor is to 
moel@324:     /// be created.</param>
moel@324:     /// <param name="sensorChannel">If there exists more than one attribute with 
moel@324:     /// the same sensor channel and type, then a sensor is created only for the  
moel@324:     /// first attribute.</param>
moel@340:     /// <param name="defaultHiddenSensor">True to hide the sensor initially.</param>
moel@374:     /// <param name="parameterDescriptions">Description for the parameters of the sensor 
moel@374:     /// (or null).</param>
moel@324:     public SmartAttribute(byte identifier, string name,
moel@324:       RawValueConversion rawValueConversion, SensorType? sensorType, 
moel@374:       int sensorChannel, bool defaultHiddenSensor = false,
moel@374:       ParameterDescription[] parameterDescriptions = null) 
moel@324:     {
moel@324:       this.Identifier = identifier;
moel@324:       this.Name = name;
moel@324:       this.rawValueConversion = rawValueConversion;
moel@324:       this.SensorType = sensorType;
moel@324:       this.SensorChannel = sensorChannel;
moel@340:       this.DefaultHiddenSensor = defaultHiddenSensor;
moel@374:       this.ParameterDescriptions = parameterDescriptions;
moel@324:     }
moel@324: 
moel@324:     /// <summary>
moel@324:     /// Gets the SMART identifier.
moel@324:     /// </summary>
moel@324:     public byte Identifier { get; private set; }
moel@324: 
moel@324:     public string Name { get; private set; }
moel@324: 
moel@324:     public SensorType? SensorType { get; private set; }
moel@324: 
moel@324:     public int SensorChannel { get; private set; }
moel@324: 
moel@340:     public bool DefaultHiddenSensor { get; private set; }
moel@340: 
moel@374:     public ParameterDescription[] ParameterDescriptions { get; private set; }
moel@374: 
moel@324:     public bool HasRawValueConversion {
moel@324:       get {
moel@324:         return rawValueConversion != null;
moel@324:       }
moel@324:     }
moel@324: 
moel@374:     public float ConvertValue(DriveAttributeValue value, 
moel@374:       IReadOnlyArray<IParameter> parameters) 
moel@374:     {
moel@324:       if (rawValueConversion == null) {
moel@324:         return value.AttrValue;
moel@324:       } else {
moel@374:         return rawValueConversion(value.RawValue, value.AttrValue, parameters);
moel@324:       }
moel@324:     }
moel@324: 
moel@374:     public delegate float RawValueConversion(byte[] rawValue, byte value,
moel@374:       IReadOnlyArray<IParameter> parameters);
moel@324:   }
moel@324: }