21
21
using System . Windows ;
22
22
using System . Windows . Data ;
23
23
using System . Windows . Threading ;
24
+ using SmartThermo . Core . Enums ;
25
+ using SmartThermo . Services . Configuration ;
24
26
25
27
namespace SmartThermo . Modules . DataViewer . ViewModels . Represent
26
28
{
@@ -37,6 +39,7 @@ public class LoadDataViewerWindowViewModel : ViewModelBase, IRegionMemberLifetim
37
39
38
40
private static readonly object Lock = new object ( ) ;
39
41
42
+ private readonly IConfiguration _configuration ;
40
43
private readonly IDeviceConnector _deviceConnector ;
41
44
private readonly List < int > _groupSensorId = new List < int > ( ) ;
42
45
private ObservableCollection < LimitRelay > _limitRelayItems = new ObservableCollection < LimitRelay > ( ) ;
@@ -47,7 +50,7 @@ public class LoadDataViewerWindowViewModel : ViewModelBase, IRegionMemberLifetim
47
50
private List < double > _axisYMax = new List < double > ( ) ;
48
51
private List < double > _axisYMin = new List < double > ( ) ;
49
52
private List < bool > _selectMode = new List < bool > ( ) ;
50
- private List < int ? > _temperature = new List < int ? > ( ) ;
53
+ private List < SensorsData > _sensorsData = new List < SensorsData > ( ) ;
51
54
52
55
#endregion
53
56
@@ -105,10 +108,10 @@ public List<bool> SelectMode
105
108
set => SetProperty ( ref _selectMode , value ) ;
106
109
}
107
110
108
- public List < int ? > Temperature
111
+ public List < SensorsData > SensorsData
109
112
{
110
- get => _temperature ;
111
- set => SetProperty ( ref _temperature , value ) ;
113
+ get => _sensorsData ;
114
+ set => SetProperty ( ref _sensorsData , value ) ;
112
115
}
113
116
114
117
public DelegateCommand < int ? > ChangeSelectModeCommand { get ; }
@@ -121,8 +124,12 @@ public List<int?> Temperature
121
124
122
125
#region Constructor
123
126
124
- public LoadDataViewerWindowViewModel ( IDeviceConnector deviceConnector , INotifications notifications )
127
+ public LoadDataViewerWindowViewModel (
128
+ IConfiguration configuration ,
129
+ IDeviceConnector deviceConnector ,
130
+ INotifications notifications )
125
131
{
132
+ _configuration = configuration ;
126
133
_deviceConnector = deviceConnector ;
127
134
_deviceConnector . SettingDeviceChanged += DeviceConnector_SettingDeviceChanged ;
128
135
_deviceConnector . StatusConnectChanged += DeviceConnector_StatusConnectChanged ;
@@ -195,24 +202,27 @@ private void DeviceConnector_SettingDeviceChanged(object sender, SettingDeviceEv
195
202
196
203
private void DeviceConnector_RegistersRequested ( object sender , List < SensorInfoEventArgs > sensorData )
197
204
{
198
- var sensorEhterItems = sensorData . Where ( x => x . IsAir )
205
+ var sensorEtherItems = sensorData . Where ( x => x . IsAir )
199
206
. Select ( x => new SensorsEther
200
207
{
201
208
Id = x . Number ,
202
209
Time = x . TimeLastBroadcast
203
210
} )
204
211
. ToList ( ) ;
205
212
SensorsEtherItems . Clear ( ) ;
206
- SensorsEtherItems . AddRange ( sensorEhterItems ) ;
207
-
208
- _temperature . Clear ( ) ;
209
- _temperature . AddRange ( sensorData
210
- . Select ( x => x . IsAir ? ( int ? ) x . Temperature : null )
213
+ SensorsEtherItems . AddRange ( sensorEtherItems ) ;
214
+
215
+ _sensorsData . Clear ( ) ;
216
+ _sensorsData . AddRange ( sensorData
217
+ . Select ( x => new SensorsData
218
+ {
219
+ Temperature = x . IsAir ? ( int ? ) x . Temperature : null ,
220
+ StatusSensor = x . IsAir ? GetStatusSensor ( x . TimeLastBroadcast ) : StatusSensor . Offline ,
221
+ } )
211
222
. ToList ( ) ) ;
212
- RaisePropertyChanged ( nameof ( Temperature ) ) ;
223
+ RaisePropertyChanged ( nameof ( SensorsData ) ) ;
213
224
214
225
var now = DateTime . Now . Round ( TimeSpan . FromSeconds ( 1 ) ) ;
215
- // Вызов диспетчера требуется для корректной работы отрисовки графика при переключении окон.
216
226
Application . Current ? . Dispatcher ? . InvokeAsync ( ( ) =>
217
227
{
218
228
for ( var i = 0 ; i < 36 ; i ++ )
@@ -230,7 +240,19 @@ private void DeviceConnector_RegistersRequested(object sender, List<SensorInfoEv
230
240
foreach ( var item in ChartValues . Where ( item => item . Count > 25 ) )
231
241
item . RemoveAt ( 0 ) ;
232
242
233
- SaveDataToDatabaseAsync ( now , sensorData ) ;
243
+ if ( _configuration . IsWriteToDatabase )
244
+ SaveDataToDatabaseAsync ( now , sensorData ) ;
245
+ }
246
+
247
+ private StatusSensor GetStatusSensor ( int time )
248
+ {
249
+ return time switch
250
+ {
251
+ var n when ( n < _configuration . TimeBeforeWarning ) => StatusSensor . Online ,
252
+ var n when ( n >= _configuration . TimeBeforeWarning ) => StatusSensor . Wait ,
253
+ var n when ( n >= _configuration . TimeBeforeOffline ) => StatusSensor . Offline ,
254
+ _ => throw new ArgumentOutOfRangeException ( nameof ( time ) , time , null )
255
+ } ;
234
256
}
235
257
236
258
private async void SaveDataToDatabaseAsync ( DateTime time , IReadOnlyList < SensorInfoEventArgs > sensorData )
@@ -268,8 +290,12 @@ private void InitCharts()
268
290
ChartValues . AddRange ( Enumerable . Range ( 0 , 36 )
269
291
. Select ( x => new ChartValues < MeasureData > ( ) )
270
292
. ToList ( ) ) ;
271
- Temperature . AddRange ( Enumerable . Range ( 0 , 36 )
272
- . Select ( x => default ( int ? ) )
293
+ SensorsData . AddRange ( Enumerable . Range ( 0 , 36 )
294
+ . Select ( x => new SensorsData ( )
295
+ {
296
+ Temperature = default ,
297
+ StatusSensor = StatusSensor . Offline
298
+ } )
273
299
. ToList ( ) ) ;
274
300
LimitRelayItems . AddRange ( Enumerable . Range ( 0 , 6 )
275
301
. Select ( x => new LimitRelay ( ) )
@@ -283,38 +309,8 @@ private void InitCharts()
283
309
SetAxisXLimits ( DateTime . Now ) ;
284
310
SetAxisYLimits ( ) ;
285
311
SetRelayLimits ( ) ;
286
-
287
- //LoadTestDataAsync();
288
312
}
289
-
290
- //private async Task LoadTestDataAsync()
291
- //{
292
- // await Task.Delay(1000);
293
- // var random = new Random();
294
-
295
- // var myDates = new DateTime[1000_000];
296
- // for (var i = 0; i < 1000_000; i++)
297
- // myDates[i] = DateTime.Now.AddSeconds(i);
298
-
299
- // await using var context = new Context();
300
- // var result = Enumerable.Range(0, 1000_000)
301
- // .Select((x, index) => new SensorInformation
302
- // {
303
- // Id = index + 1,
304
- // Value1 = (int)(120 + 5 * Math.Cos(index * 0.0001d) + random.Next(0, 1)),
305
- // Value2 = (int)(100 + 5 * Math.Sin(index * 0.001d) + random.Next(0, 3)),
306
- // Value3 = (int)(80 + 5 * Math.Cos(index * 0.001d) + random.Next(0, 4)),
307
- // Value4 = (int)(60 + 5 * Math.Cos(index * 0.0003d) + random.Next(0, 2)),
308
- // Value5 = (int)(40 + 5 * Math.Asin(index * 0.00001d) + random.Next(0, 1)),
309
- // Value6 = (int)(20 + 5 * Math.Acos(index * 0.0001d) + random.Next(0, 2)),
310
- // DataTime = myDates[index].Round(TimeSpan.FromSeconds(1)),
311
- // SensorGroupId = _groupSensorId[0]
312
- // }).ToList();
313
-
314
- // await context.SensorInformations.AddRangeAsync(result);
315
- // await context.SaveChangesAsync();
316
- //}
317
-
313
+
318
314
private void GetSelectMode ( )
319
315
{
320
316
using var context = new Context ( ) ;
@@ -348,7 +344,8 @@ private void SetDataFromSetting(ushort data)
348
344
: 0 ;
349
345
350
346
LimitRelayItems [ i ] . TemperatureThreshold1 = data . IsBitSet ( i )
351
- ? _deviceConnector . SettingDevice . TemperatureThreshold [ 0 ] - LimitRelayItems [ i ] . HysteresisThreshold1 / 2d
347
+ ? _deviceConnector . SettingDevice . TemperatureThreshold [ 0 ] -
348
+ LimitRelayItems [ i ] . HysteresisThreshold1 / 2d
352
349
: 0 ;
353
350
}
354
351
break ;
@@ -358,11 +355,13 @@ private void SetDataFromSetting(ushort data)
358
355
for ( var i = 0 ; i < LimitRelayItems . Count ; i ++ )
359
356
{
360
357
LimitRelayItems [ i ] . HysteresisThreshold2 = data . IsBitSet ( i )
361
- ? ( ( _deviceConnector . SettingDevice . TemperatureHysteresis & 0b1111_1111_0000_0000 ) >> 8 ) * 2d
358
+ ? ( ( _deviceConnector . SettingDevice . TemperatureHysteresis & 0b1111_1111_0000_0000 ) >>
359
+ 8 ) * 2d
362
360
: 0 ;
363
361
364
362
LimitRelayItems [ i ] . TemperatureThreshold2 = data . IsBitSet ( i )
365
- ? _deviceConnector . SettingDevice . TemperatureThreshold [ 1 ] - LimitRelayItems [ i ] . HysteresisThreshold2 / 2d
363
+ ? _deviceConnector . SettingDevice . TemperatureThreshold [ 1 ] -
364
+ LimitRelayItems [ i ] . HysteresisThreshold2 / 2d
366
365
: 0 ;
367
366
}
368
367
break ;
0 commit comments