1 //
2 // Copyright (c) 2010-2021 Antmicro
3 //
4 //  This file is licensed under the MIT License.
5 //  Full license text is available in 'licenses/MIT.txt'.
6 //
7 using System;
8 using Antmicro.Renode.Peripherals.Bus;
9 using Antmicro.Renode.Peripherals.Sensor;
10 using Antmicro.Renode.Peripherals.I2C;
11 using Antmicro.Renode.Utilities;
12 using Antmicro.Renode.Logging;
13 using Antmicro.Renode.Core.Structure.Registers;
14 
15 namespace Antmicro.Renode.Peripherals.Sensors
16 {
17     // This class implements a common ST sensor
18     // register handling logic.
19     // It can be used as a base for all I2C sensors that
20     // support 7-bit-length registers addresses.
21 
22     // it should be enum instead of IConvertible, but earlier versions of C# do not support this
23     public abstract class ST_I2CSensorBase<T> : I2CPeripheralBase<T> where T : IConvertible
24     {
ST_I2CSensorBase()25         public ST_I2CSensorBase() : base(7)
26         {
27         }
28 
GetScaledValue(decimal value, short sensitivity, bool upperByte)29         protected byte GetScaledValue(decimal value, short sensitivity, bool upperByte)
30         {
31             var scaled = (short)(value * sensitivity);
32             return upperByte
33                 ? (byte)(scaled >> 8)
34                 : (byte)scaled;
35         }
36 
CalculateScale(int minVal, int maxVal, int width)37         protected short CalculateScale(int minVal, int maxVal, int width)
38         {
39             var range = maxVal - minVal;
40             return (short)(((1 << width) / range) - 1);
41         }
42     }
43 }
44