1 //
2 // Copyright (c) 2010-2024 Antmicro
3 //
4 // This file is licensed under the MIT License.
5 // Full license text is available in 'licenses/MIT.txt'.
6 //
7 using Antmicro.Renode.Exceptions;
8 using Antmicro.Renode.Peripherals.Sensor;
9 using Antmicro.Renode.Utilities;
10 using Antmicro.Renode.Utilities.RESD;
11 
12 namespace Antmicro.Renode.Peripherals.Sensors
13 {
14     public partial class ICM20948 : ITemperatureSensor
15     {
FeedTemperatureSamplesFromRESD(ReadFilePath filePath, uint channelId = 0, RESDStreamSampleOffset sampleOffsetType = RESDStreamSampleOffset.Specified, long sampleOffsetTime = 0)16         public void FeedTemperatureSamplesFromRESD(ReadFilePath filePath, uint channelId = 0,
17             RESDStreamSampleOffset sampleOffsetType = RESDStreamSampleOffset.Specified, long sampleOffsetTime = 0)
18         {
19             resdTemperatureStream?.Dispose();
20             resdTemperatureStream = this.CreateRESDStream<TemperatureSample>(filePath, channelId, sampleOffsetType, sampleOffsetTime);
21         }
22 
23         public decimal DefaultTemperature { get; set; }
24 
25         public decimal Temperature
26         {
27             get
28             {
29                 if(resdTemperatureStream == null)
30                 {
31                     return DefaultTemperature;
32                 }
33 
34                 switch(resdTemperatureStream.TryGetCurrentSample(this, out var sample, out _))
35                 {
36                 case RESDStreamStatus.OK:
37                     return sample.Temperature / 1000m;
38                 case RESDStreamStatus.BeforeStream:
39                     return DefaultTemperature;
40                 case RESDStreamStatus.AfterStream:
41                     resdTemperatureStream.Dispose();
42                     resdTemperatureStream = null;
43                     return DefaultTemperature;
44                 default:
45                     return DefaultTemperature;
46                 }
47             }
48 
49             set => throw new RecoverableException($"Explicitly setting temperature is not supported by this model. " +
50                 $"Temperature should be provided from a RESD file or set via the '{nameof(DefaultTemperature)}' property");
51         }
52 
53         private ushort RawTemperature => ConvertMeasurement(Temperature, value => ((value - RoomTemperatureDegreeCelsius) * TemperatureSensitivity) + RoomTemperatureOffsetDegreeCelsius);
54 
55         private RESDStream<TemperatureSample> resdTemperatureStream;
56 
57         private const decimal RoomTemperatureDegreeCelsius = 21.0m;
58         private const decimal RoomTemperatureOffsetDegreeCelsius = 0.0m;
59         private const decimal TemperatureSensitivity = 333.87m;
60     }
61 }
62