@ncd-io/node-red-enterprise-sensors 1.6.1 → 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -160,7 +160,7 @@ module.exports = class WirelessSensor{
160
160
  }
161
161
  }
162
162
  // #OTF
163
- var otf_devices = [4,12,21,23,26,29,32,33,39,44,45,48,52,53,54,55,56,58,74,76,78,79,80,81,82,84,88,89,90,91,97,98,101,102,103,105,106,107,108,109,110,111,112,114,117,118,119,120,121,122,123,124,180,181,202,217,211,270,519,520,521,531,535,536,537,538,539,540,541,542,543,545,1010,1011];
163
+ var otf_devices = [4,12,21,23,26,29,32,33,39,44,45,48,52,53,54,55,56,58,74,76,78,79,80,81,82,84,88,89,90,91,97,98,99,101,102,103,105,106,107,108,109,110,111,112,114,117,118,119,120,121,122,123,124,180,181,202,217,211,270,519,520,521,531,535,536,537,538,539,540,541,542,543,545,1010,1011];
164
164
  var device_type = msbLsb(frame.data[6], frame.data[7]);
165
165
  // var device_type = frame.data[7];
166
166
 
@@ -361,7 +361,7 @@ module.exports = class WirelessSensor{
361
361
  };
362
362
 
363
363
  // #OTF
364
- var otf_devices = [4,12,21,23,26,29,32,33,39,44,45,48,52,53,54,55,56,58,74,76,78,79,80,81,82,84,88,89,90,91,97,98,101,102,103,105,106,107,108,109,110,111,112,114,117,118,119,120,121,122,123,124,180,181,202,211,217,270,519,520,521,531,535,536,537,538,539,540,541,542,543,545,1010,1011];
364
+ var otf_devices = [4,12,21,23,26,29,32,33,39,44,45,48,52,53,54,55,56,58,74,76,78,79,80,81,82,84,88,89,90,91,97,98,99,101,102,103,105,106,107,108,109,110,111,112,114,117,118,119,120,121,122,123,124,180,181,202,211,217,270,519,520,521,531,535,536,537,538,539,540,541,542,543,545,1010,1011];
365
365
  if(otf_devices.includes(parsed.sensor_type)){
366
366
  // If the message says FLY and there is not FLY timer in progress.
367
367
  if(payload[8] == 70 && payload[9] == 76 && payload[10] == 89) {
@@ -2570,6 +2570,58 @@ module.exports = class WirelessSensor{
2570
2570
  console.log(packet);
2571
2571
  return this.config_send(sensor_mac, packet);
2572
2572
  }
2573
+ config_set_screen_on_time_217(sensor_mac, value){
2574
+ console.log('config_set_screen_on_time_217');
2575
+ let packet = [244, 40, 0, 0, 26, value];
2576
+ console.log(packet);
2577
+ return this.config_send(sensor_mac, packet);
2578
+ }
2579
+ config_set_weight_unit_217(sensor_mac, value){
2580
+ console.log('config_set_weight_unit_217');
2581
+ let packet = [244, 38, 0, 0, 26, value];
2582
+ console.log(packet);
2583
+ return this.config_send(sensor_mac, packet);
2584
+ }
2585
+ config_set_clean_cycle_99(sensor_mac, value){
2586
+ console.log('config_set_clean_cycle_99');
2587
+ let packet = [244, 34, 0, 0, 0, value];
2588
+ console.log(packet);
2589
+ return this.config_send(sensor_mac, packet);
2590
+ }
2591
+ config_set_wiper_rounds_number_99(sensor_mac, value){
2592
+ console.log('config_set_wiper_rounds_number_99');
2593
+ let packet = [244, 36, 0, 0, 0, value];
2594
+ console.log(packet);
2595
+ return this.config_send(sensor_mac, packet);
2596
+ }
2597
+ config_set_distance_under_strength_threshold_99(sensor_mac, distance, threshold){
2598
+ console.log('config_set_distance_under_strength_threshold_99');
2599
+ let packet = [244, 25, 0, 0, 0];
2600
+ let distance_ = int2Bytes(distance, 2);
2601
+ packet.push(...distance_);
2602
+ let threshold_ = int2Bytes(threshold, 2);
2603
+ packet.push(...threshold_);
2604
+ console.log(packet);
2605
+ return this.config_send(sensor_mac, packet);
2606
+ }
2607
+ config_set_clean_sensor_99(sensor_mac, value){
2608
+ console.log('config_set_clean_sensor_99');
2609
+ let packet = [244, 40, 0, 0, 0];
2610
+ console.log(packet);
2611
+ return this.config_send(sensor_mac, packet);
2612
+ }
2613
+ config_set_reset_sensor_99(sensor_mac, value){
2614
+ console.log('config_set_reset_sensor_99');
2615
+ let packet = [244, 38, 0, 0, 0];
2616
+ console.log(packet);
2617
+ return this.config_send(sensor_mac, packet);
2618
+ }
2619
+ config_set_factory_reset_sensor_99(sensor_mac, value){
2620
+ console.log('config_set_factory_reset_sensor_99');
2621
+ let packet = [244, 39, 0, 0, 0];
2622
+ console.log(packet);
2623
+ return this.config_send(sensor_mac, packet);
2624
+ }
2573
2625
  config_get_delay(sensor_mac){
2574
2626
  return new Promise((fulfill, reject) => {
2575
2627
  this.config_send(sensor_mac, [247, 21, 0, 0, 0]).then((res) => {
@@ -8524,6 +8576,28 @@ function sensor_types(parent){
8524
8576
  }
8525
8577
  }
8526
8578
  },
8579
+ '99': {
8580
+ name: 'Laser Sensor',
8581
+ parse: (d) => {
8582
+ return {
8583
+ distance: d.slice(0, 2).reduce(msbLsb)
8584
+ };
8585
+ },
8586
+ 'parse_fly': (frame) => {
8587
+ return {
8588
+ 'firmware': frame[2],
8589
+ 'hardware_id': frame.slice(12, 15),
8590
+ 'report_rate': frame.slice(15, 19).reduce(msbLsb) + " sec",
8591
+ 'tx_life_counter': frame.slice(19, 23).reduce(msbLsb),
8592
+ 'machine_values': {
8593
+ 'firmware': frame[2],
8594
+ 'hardware_id': frame.slice(12, 15),
8595
+ 'report_rate': frame.slice(15, 19),
8596
+ 'tx_life_counter': frame.slice(19, 23)
8597
+ }
8598
+ }
8599
+ }
8600
+ },
8527
8601
  '101':{
8528
8602
  name: 'Pro Vibration',
8529
8603
  parse: (d, full)=>{
@@ -9425,7 +9499,7 @@ function sensor_types(parent){
9425
9499
  }
9426
9500
  },
9427
9501
  'parse_fly': (frame) => {
9428
- if(frame[2] == 19){ // Screen version fw 19
9502
+ if(frame[2] > 18){
9429
9503
  let reset_mode = "Disabled";
9430
9504
  switch(frame[38]){
9431
9505
  case 0:
@@ -9551,165 +9625,10 @@ function sensor_types(parent){
9551
9625
  'acc_odr': acc_odr,
9552
9626
  'screen_control': screen_control,
9553
9627
  'screen_on_time': frame[42] + ' sec',
9554
- 'interrupt_timeout': frame[43] + ' msec',
9555
- 'hardware_id': frame.slice(44, 47),
9556
- 'report_rate': frame.slice(47, 51).reduce(msbLsb) + " sec",
9557
- 'tx_life_counter': frame.slice(51, 55).reduce(msbLsb),
9558
- 'machine_values': {
9559
- 'firmware': frame[2],
9560
- 'accelerometer_threshold': frame[16],
9561
- 'debouncing_timeout': frame.slice(17, 19),
9562
- 'accelero_state': frame[19],
9563
- 'input_1_active_edge': frame[20],
9564
- 'input_2_active_edge': frame[21],
9565
- 'input_3_active_edge': frame[22],
9566
- 'counter_threshold': frame.slice(23, 27),
9567
- 'trasnmit_on_change_status': frame[27],
9568
- 'Shift_end_1': frame.slice(28, 30),
9569
- 'Shift_end_2': frame.slice(30, 32),
9570
- 'Shift_end_3': frame.slice(32, 34),
9571
- 'Shift_end_4': frame.slice(34, 36),
9572
- 'reset_timeout': frame.slice(36, 38),
9573
- 'counter_reset_mode': frame[38],
9574
- 'sampling_interval': frame[39],
9575
- 'acc_odr': frame[40],
9576
- 'screen_control': frame[41],
9577
- 'screen_on_time': frame[42],
9578
- 'interrupt_timeout': frame[43],
9579
- 'hardware_id': frame.slice(44, 47),
9580
- 'report_rate': frame.slice(47, 51),
9581
- 'tx_life_counter': frame.slice(51, 55)
9582
- }
9583
- }
9584
- } else if(frame[2] == 16){ // Screen version
9585
- let reset_mode = "Disabled";
9586
- switch(frame[38]){
9587
- case 0:
9588
- reset_mode = "Disabled";
9589
- break;
9590
- case 1:
9591
- reset_mode = "Shift Ends";
9592
- break;
9593
- case 2:
9594
- reset_mode = "Timeout";
9595
- break;
9596
- }
9597
- let acc_odr = "10Hz";
9598
- switch(frame[40]){
9599
- case 0:
9600
- acc_odr = "10Hz";
9601
- break;
9602
- case 1:
9603
- acc_odr = "20Hz";
9604
- break;
9605
- case 2:
9606
- acc_odr = "50Hz";
9607
- break;
9608
- case 3:
9609
- acc_odr = "100Hz";
9610
- break;
9611
- case 4:
9612
- acc_odr = "200Hz";
9613
- break;
9614
- case 5:
9615
- acc_odr = "400Hz";
9616
- break;
9617
- }
9618
- let rtc_sampling_interval = "5 seconds";
9619
- switch(frame[39]){
9620
- case 0:
9621
- rtc_sampling_interval = "1 minute";
9622
- break;
9623
- case 1:
9624
- rtc_sampling_interval = "5 minutes";
9625
- break;
9626
- case 2:
9627
- rtc_sampling_interval = "15 minutes";
9628
- break;
9629
- case 3:
9630
- rtc_sampling_interval = "30 minutes";
9631
- break;
9632
- case 4:
9633
- rtc_sampling_interval = "1 hour";
9634
- break;
9635
- case 5:
9636
- rtc_sampling_interval = "2 hours";
9637
- break;
9638
- case 6:
9639
- rtc_sampling_interval = "3 hours";
9640
- break;
9641
- case 7:
9642
- rtc_sampling_interval = "6 hours";
9643
- break;
9644
- case 8:
9645
- rtc_sampling_interval = "12 hours";
9646
- break;
9647
- case 9:
9648
- rtc_sampling_interval = "5 seconds";
9649
- break;
9650
- case 10:
9651
- rtc_sampling_interval = "10 seconds";
9652
- break;
9653
- case 11:
9654
- rtc_sampling_interval = "15 seconds";
9655
- break;
9656
- case 12:
9657
- rtc_sampling_interval = "30 seconds";
9658
- break;
9659
- }
9660
- let screen_control = 0;
9661
- switch(frame[41]){
9662
- case 0:
9663
- screen_control = "IO1";
9664
- break;
9665
- case 1:
9666
- screen_control = "IO2";
9667
- break;
9668
- case 2:
9669
- screen_control = "IO3";
9670
- break;
9671
- case 3:
9672
- screen_control = "Accelero";
9673
- break;
9674
- case 4:
9675
- screen_control = "Magneto";
9676
- break;
9677
- }
9678
- return {
9679
- 'firmware': frame[2],
9680
- 'accelerometer_threshold': (frame[16]* 32) + "mg",
9681
- 'debouncing_timeout': frame.slice(17, 19).reduce(msbLsb) + "msec",
9682
- 'accelero_state': frame[19]? "Enabled": "Disabled",
9683
- 'input_1_active_edge': frame[20]? "Rising": "Falling",
9684
- 'input_2_active_edge': frame[21]? "Rising": "Falling",
9685
- 'input_3_active_edge': frame[22]? "Rising": "Falling",
9686
- 'counter_threshold': frame.slice(23, 27).reduce(msbLsb),
9687
- 'trasnmit_on_change_status': frame[27]? "Enabled": "Disabled",
9688
- 'Shift_end_1': [
9689
- String(frame[28]).padStart(2, '0'),
9690
- String(frame[29]).padStart(2, '0')
9691
- ].join(':'),
9692
- 'Shift_end_2': [
9693
- String(frame[30]).padStart(2, '0'),
9694
- String(frame[31]).padStart(2, '0')
9695
- ].join(':'),
9696
- 'Shift_end_3': [
9697
- String(frame[32]).padStart(2, '0'),
9698
- String(frame[33]).padStart(2, '0')
9699
- ].join(':'),
9700
- 'Shift_end_4': [
9701
- String(frame[34]).padStart(2, '0'),
9702
- String(frame[35]).padStart(2, '0')
9703
- ].join(':'),
9704
- 'reset_timeout': frame.slice(36, 38).reduce(msbLsb) + "min",
9705
- 'counter_reset_mode': reset_mode,
9706
- 'sampling_interval': rtc_sampling_interval,
9707
- 'acc_odr': acc_odr,
9708
- 'screen_control': screen_control,
9709
- 'screen_on_time': frame[42] + 'sec',
9710
- 'hardware_id': frame.slice(43, 46),
9711
- 'report_rate': frame.slice(46, 50).reduce(msbLsb) + "sec",
9712
- 'tx_life_counter': frame.slice(50, 54).reduce(msbLsb),
9628
+ 'interrupt_timeout': frame.slice(43, 45).reduce(msbLsb) + ' msec',
9629
+ 'hardware_id': frame.slice(45, 48),
9630
+ 'report_rate': frame.slice(48, 52).reduce(msbLsb) + " sec",
9631
+ 'tx_life_counter': frame.slice(52, 56).reduce(msbLsb),
9713
9632
  'machine_values': {
9714
9633
  'firmware': frame[2],
9715
9634
  'accelerometer_threshold': frame[16],
@@ -9730,12 +9649,13 @@ function sensor_types(parent){
9730
9649
  'acc_odr': frame[40],
9731
9650
  'screen_control': frame[41],
9732
9651
  'screen_on_time': frame[42],
9733
- 'hardware_id': frame.slice(43, 46),
9734
- 'report_rate': frame.slice(46, 50),
9735
- 'tx_life_counter': frame.slice(50, 54)
9652
+ 'interrupt_timeout': frame.slice(43, 45),
9653
+ 'hardware_id': frame.slice(45, 48),
9654
+ 'report_rate': frame.slice(48, 52),
9655
+ 'tx_life_counter': frame.slice(52, 56)
9736
9656
  }
9737
9657
  }
9738
- } else if(frame[2] == 14){ // 14
9658
+ }else if(frame[2] > 13){
9739
9659
  let reset_mode = "Disabled";
9740
9660
  switch(frame[38]){
9741
9661
  case 0:
@@ -9869,7 +9789,7 @@ function sensor_types(parent){
9869
9789
  'tx_life_counter': frame.slice(50, 54)
9870
9790
  }
9871
9791
  }
9872
- } else if(frame[2] > 9){ // firmware 10 11 12 13 14 15
9792
+ } else if(frame[2] > 9){
9873
9793
  let reset_mode = "Disabled";
9874
9794
  switch(frame[38]){
9875
9795
  case 0:
@@ -10358,164 +10278,63 @@ function sensor_types(parent){
10358
10278
  let msg_type = (payload[7] & 16)? 'motion' : 'regular';
10359
10279
  if(payload[8] === 1){
10360
10280
  var deviceAddr = mac;
10361
- var firmware = payload[1];
10362
- var hour = payload[12];
10363
- var minute = payload[13];
10281
+ // var firmware = payload[1];
10282
+ // var hour = payload[12];
10283
+ // var minute = payload[13];
10364
10284
  var expected_packets = msbLsb(payload[16], payload[17]);
10365
10285
  var current_packet = msbLsb(payload[18], payload[19]);
10366
10286
  var sdata_start = 20;
10367
10287
 
10368
10288
  if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
10369
- if(expected_packets != 1){
10289
+ if (expected_packets != 1) {
10370
10290
  // if current packet is equal to last one (duplicated data). This does not apply to the last package
10371
- if (globalDevices[deviceAddr].last_packet_counter == current_packet){
10291
+ if (globalDevices[deviceAddr].last_packet_counter == current_packet) {
10372
10292
  console.log('Duplicated message')
10373
10293
  return;
10374
10294
  }
10375
10295
  // if current packet is equal to 1 or last packet counter is higher thant current packet
10376
- if(current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)){
10377
- // clear stream
10378
- delete globalDevices[deviceAddr];
10379
- // create new stream
10380
- var mode = payload[8];
10381
- var odr = msbLsb(payload[9], payload[10]);
10382
- var fsr = payload[11] >> 5;
10383
- var temperature = msbLsb(payload[14], payload[15])/100;
10384
-
10385
- globalDevices[deviceAddr] = {
10386
- data: {},
10387
- odr: odr,
10388
- mo: mode,
10389
- fsr: fsr,
10390
- hour: hour,
10391
- minute: minute,
10392
- temperature: temperature,
10393
- }
10296
+ if (current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)) {
10297
+ console.log('Recovering bad packet');
10298
+ // clear stream object & timeout
10299
+ parent.sensor_types[110].utils.clear_globalDevices_stream(deviceAddr);
10300
+
10301
+ // init new stream
10302
+ parent.sensor_types[110].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
10303
+
10394
10304
  globalDevices[deviceAddr].last_packet_counter = current_packet;
10395
10305
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10396
10306
  return;
10397
- }
10398
- else{
10307
+ } else {
10399
10308
  globalDevices[deviceAddr].last_packet_counter = current_packet;
10400
10309
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10401
10310
  }
10402
10311
  }
10403
10312
  else{
10404
- var mode = payload[8];
10405
- var odr = msbLsb(payload[9], payload[10]);
10406
- var fsr = payload[11] >> 5;
10407
- var temperature = msbLsb(payload[14], payload[15])/100;
10313
+ // clear stream object & timeout
10314
+ parent.sensor_types[110].utils.clear_globalDevices_stream(deviceAddr);
10408
10315
 
10409
- globalDevices[deviceAddr] = {
10410
- data: {},
10411
- odr: odr,
10412
- mo: mode,
10413
- fsr: fsr,
10414
- hour: hour,
10415
- minute: minute,
10416
- temperature: temperature,
10417
- }
10418
- globalDevices[deviceAddr].last_packet_counter = current_packet;
10419
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10316
+ // init new stream
10317
+ parent.sensor_types[110].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
10318
+
10319
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
10320
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10420
10321
  }
10421
10322
  }
10422
10323
  else{
10423
- var mode = payload[8];
10424
- var odr = msbLsb(payload[9], payload[10]);
10425
- var fsr = payload[11] >> 5;
10426
- var temperature = msbLsb(payload[14], payload[15])/100;
10324
+ // clear stream object & timeout
10325
+ parent.sensor_types[110].utils.clear_globalDevices_stream(deviceAddr);
10326
+
10327
+ // init new stream
10328
+ parent.sensor_types[110].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
10427
10329
 
10428
- globalDevices[deviceAddr] = {
10429
- data: {},
10430
- odr: odr,
10431
- mo: mode,
10432
- fsr: fsr,
10433
- hour: hour,
10434
- minute: minute,
10435
- temperature: temperature,
10436
- }
10437
10330
  globalDevices[deviceAddr].last_packet_counter = current_packet;
10438
10331
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10439
10332
  }
10440
10333
  if(current_packet == expected_packets){
10441
- var raw_data = new Array();
10442
- for(const packet in globalDevices[deviceAddr].data){
10443
- raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
10444
- }
10445
- var label = 0;
10446
-
10447
- var fft = new Array();
10448
- var fft_concat = {};
10449
-
10450
- var en_axis_data = {};
10451
- en_axis_data.x_offset = 0;
10452
- en_axis_data.y_offset = 2;
10453
- en_axis_data.z_offset = 4;
10454
- en_axis_data.increment = 6;
10455
- fft_concat = {x: [], y: [], z: []};
10456
-
10457
- var fsr_mult = .00006;
10458
- var fsr_text = "";
10459
-
10460
- switch(globalDevices[deviceAddr].fsr){
10461
- case 0:
10462
- fsr_mult = 0.00006;
10463
- break;
10464
- case 1:
10465
- fsr_mult = 0.00012;
10466
- break;
10467
- case 2:
10468
- fsr_mult = 0.00024;
10469
- break;
10470
- case 3:
10471
- fsr_mult = 0.00049;
10472
- break;
10473
- }
10474
- switch(globalDevices[deviceAddr].fsr){
10475
- case 0:
10476
- fsr_text = "2g";
10477
- break;
10478
- case 1:
10479
- fsr_text = "4g";
10480
- break;
10481
- case 2:
10482
- fsr_text = "8g";
10483
- break;
10484
- case 3:
10485
- fsr_text = "16g";
10486
- break;
10487
- }
10488
-
10489
- for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
10490
- label++;
10491
-
10492
- if('x_offset' in en_axis_data){
10493
- fft_concat.x.push(parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2)));
10494
- }
10495
- if('y_offset' in en_axis_data){
10496
- fft_concat.y.push(parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2)));
10497
- }
10498
- if('z_offset' in en_axis_data){
10499
- fft_concat.z.push(parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2)));
10500
- }
10501
- }
10502
- var fft_concat_obj = {
10503
- mode: payload[8],
10504
- msg_type: msg_type,
10505
- time_id: [
10506
- String(globalDevices[deviceAddr].hour).padStart(2, '0'),
10507
- String(globalDevices[deviceAddr].minute).padStart(2, '0'),
10508
- ].join(':'),
10509
- mac_address: deviceAddr,
10510
- fsr: fsr_text,
10511
- odr: globalDevices[deviceAddr].odr,
10512
- temperature: globalDevices[deviceAddr].temperature,
10513
- total_samples: label,
10514
- fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / expected_packets) * 100).toFixed(2) + '%',
10515
- data: fft_concat
10516
- };
10517
- sensor_data = fft_concat_obj;
10518
- delete globalDevices[deviceAddr];
10334
+ // concatenate stream
10335
+ sensor_data = parent.sensor_types[114].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
10336
+ // clear stream object & timeout
10337
+ parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
10519
10338
  return sensor_data;
10520
10339
  }
10521
10340
  else{
@@ -10596,6 +10415,119 @@ function sensor_types(parent){
10596
10415
  // return parsed;
10597
10416
  // }
10598
10417
  },
10418
+ 'utils': {
10419
+ 'clear_globalDevices_stream': (deviceAddr) => {
10420
+ if(Object.hasOwn(globalDevices, deviceAddr)){
10421
+ if(Object.hasOwn(globalDevices[deviceAddr], 'packet_stream_timeout')){
10422
+ clearTimeout(globalDevices[deviceAddr].packet_stream_timeout);
10423
+ }
10424
+ delete globalDevices[deviceAddr];
10425
+ }
10426
+ },
10427
+ 'init_globalDevices_stream'(deviceAddr, payload, expected_packets, parsed, msg_type){
10428
+ globalDevices[deviceAddr] = {
10429
+ data: {},
10430
+ odr: msbLsb(payload[9], payload[10]),
10431
+ mo: payload[8],
10432
+ fsr: payload[11] >> 5,
10433
+ hour: payload[12],
10434
+ minute: payload[13],
10435
+ temperature: msbLsb(payload[14], payload[15]) / 100,
10436
+ expected_packets: expected_packets
10437
+ }
10438
+ globalDevices[deviceAddr].packet_stream_timeout = setTimeout(() => {
10439
+ parsed.sensor_data = parent.sensor_types[110].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
10440
+ parsed.sensor_data.error = 'Time Series Data Stream Timeout - incomplete data received';
10441
+
10442
+ parsed.sensor_name = parent.sensor_types[110].name;
10443
+ parsed.type = 'sensor_data';
10444
+ parsed.addr = deviceAddr;
10445
+ parsed.received = Date.now();
10446
+
10447
+ parent._emitter.emit('sensor_data', parsed);
10448
+ parent._emitter.emit('sensor_data-110', parsed);
10449
+ parent._emitter.emit('sensor_data'+'-'+deviceAddr, parsed);
10450
+ }, 60000);
10451
+ },
10452
+ 'concat_fft_data': (deviceAddr, mode, msg_type) => {
10453
+ var raw_data = new Array();
10454
+ for(const packet in globalDevices[deviceAddr].data){
10455
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
10456
+ }
10457
+ var label = 0;
10458
+
10459
+ var fft_concat = {};
10460
+
10461
+ var en_axis_data = {};
10462
+ en_axis_data.x_offset = 0;
10463
+ en_axis_data.y_offset = 2;
10464
+ en_axis_data.z_offset = 4;
10465
+ en_axis_data.increment = 6;
10466
+ fft_concat = {x: [], y: [], z: []};
10467
+
10468
+ var fsr_mult = .00006;
10469
+ var fsr_text = "";
10470
+
10471
+ switch(globalDevices[deviceAddr].fsr){
10472
+ case 0:
10473
+ fsr_mult = 0.00006;
10474
+ break;
10475
+ case 1:
10476
+ fsr_mult = 0.00012;
10477
+ break;
10478
+ case 2:
10479
+ fsr_mult = 0.00024;
10480
+ break;
10481
+ case 3:
10482
+ fsr_mult = 0.00049;
10483
+ break;
10484
+ }
10485
+ switch(globalDevices[deviceAddr].fsr){
10486
+ case 0:
10487
+ fsr_text = "2g";
10488
+ break;
10489
+ case 1:
10490
+ fsr_text = "4g";
10491
+ break;
10492
+ case 2:
10493
+ fsr_text = "8g";
10494
+ break;
10495
+ case 3:
10496
+ fsr_text = "16g";
10497
+ break;
10498
+ }
10499
+
10500
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
10501
+ label++;
10502
+
10503
+ if('x_offset' in en_axis_data){
10504
+ fft_concat.x.push(parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2)));
10505
+ }
10506
+ if('y_offset' in en_axis_data){
10507
+ fft_concat.y.push(parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2)));
10508
+ }
10509
+ if('z_offset' in en_axis_data){
10510
+ fft_concat.z.push(parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2)));
10511
+ }
10512
+ }
10513
+ var fft_concat_obj = {
10514
+ mode: mode,
10515
+ msg_type: msg_type,
10516
+ time_id: [
10517
+ String(globalDevices[deviceAddr].hour).padStart(2, '0'),
10518
+ String(globalDevices[deviceAddr].minute).padStart(2, '0'),
10519
+ ].join(':'),
10520
+ mac_address: deviceAddr,
10521
+ fsr: fsr_text,
10522
+ odr: globalDevices[deviceAddr].odr,
10523
+ temperature: globalDevices[deviceAddr].temperature,
10524
+ total_samples: label,
10525
+ fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / globalDevices[deviceAddr].expected_packets) * 100).toFixed(2) + '%',
10526
+ data: fft_concat
10527
+ };
10528
+ return fft_concat_obj;
10529
+ }
10530
+ },
10599
10531
  'parse_fly': (frame) => {
10600
10532
  let frame_data = {};
10601
10533
  switch(frame[16]){
@@ -10960,7 +10892,7 @@ function sensor_types(parent){
10960
10892
  '111': {
10961
10893
  name: 'Two Channel Vibration Plus v4',
10962
10894
  parse: (payload, parsed, mac) => {
10963
- parsed.data = {};
10895
+ // parsed.data = {};
10964
10896
  if(payload[7] & 2){
10965
10897
  parsed.data['probe_1_error'] = true;
10966
10898
  }
@@ -10973,174 +10905,77 @@ function sensor_types(parent){
10973
10905
  let msg_type = (payload[7] & 16)? 'motion' : 'regular';
10974
10906
  if(payload[8] === 1){
10975
10907
  var deviceAddr = mac;
10976
- var firmware = payload[1];
10977
- var hour = payload[12];
10978
- var minute = payload[13];
10908
+ // var firmware = payload[1];
10909
+ // var hour = payload[12];
10910
+ // var minute = payload[13];
10979
10911
  var expected_packets = msbLsb(payload[16], payload[17]);
10980
10912
  var current_packet = msbLsb(payload[18], payload[19]);
10981
10913
  var sdata_start = 20;
10914
+ // If 4th bit is 1 the packet is from the second probe, if 0 from the first
10915
+ var probe;
10916
+ if (payload[7] & 8) {
10917
+ probe = 2;
10918
+ } else {
10919
+ probe = 1;
10920
+ }
10982
10921
 
10983
- if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
10984
- if(expected_packets != 1){
10922
+ // initialize globalDevices for this sensor if it doesn't exist
10923
+ // exlusively for multi-probe sensors
10924
+ if(!Object.hasOwn(globalDevices, deviceAddr)){
10925
+ globalDevices[deviceAddr] = {};
10926
+ }
10927
+ if(globalDevices[deviceAddr].hasOwnProperty(probe) || expected_packets == 1){
10928
+ console.log('Continuing existing probe stream');
10929
+ if (expected_packets != 1) {
10930
+ console.log('Expected packets more than 1');
10985
10931
  // if current packet is equal to last one (duplicated data). This does not apply to the last package
10986
- if (globalDevices[deviceAddr].last_packet_counter == current_packet){
10932
+ if (globalDevices[deviceAddr][probe].last_packet_counter == current_packet) {
10987
10933
  console.log('Duplicated message')
10988
10934
  return;
10989
10935
  }
10990
10936
  // if current packet is equal to 1 or last packet counter is higher thant current packet
10991
- if(current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)){
10992
- // clear stream
10993
- delete globalDevices[deviceAddr];
10994
- // create new stream
10995
- var mode = payload[8];
10996
- var odr = msbLsb(payload[9], payload[10]);
10997
- var fsr = payload[11] >> 5;
10998
- var temperature = msbLsb(payload[14], payload[15])/100;
10937
+ if (current_packet == 1 || (globalDevices[deviceAddr][probe].last_packet_counter > current_packet)) {
10938
+ console.log('Recovering bad packet');
10939
+ // clear stream object & timeout
10940
+ parent.sensor_types[111].utils.clear_globalDevices_stream(deviceAddr, probe);
10999
10941
 
11000
- globalDevices[deviceAddr] = {
11001
- data: {},
11002
- odr: odr,
11003
- mo: mode,
11004
- fsr: fsr,
11005
- hour: hour,
11006
- minute: minute,
11007
- temperature: temperature,
11008
- }
11009
- globalDevices[deviceAddr].last_packet_counter = current_packet;
11010
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11011
- return;
11012
- }
11013
- else{
11014
- globalDevices[deviceAddr].last_packet_counter = current_packet;
11015
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11016
- }
11017
- }
11018
- else{
11019
- var mode = payload[8];
11020
- var odr = msbLsb(payload[9], payload[10]);
11021
- var fsr = payload[11] >> 5;
11022
- var temperature = msbLsb(payload[14], payload[15])/100;
10942
+ // init new stream
10943
+ parent.sensor_types[111].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type, probe);
11023
10944
 
11024
- globalDevices[deviceAddr] = {
11025
- data: {},
11026
- odr: odr,
11027
- mo: mode,
11028
- fsr: fsr,
11029
- hour: hour,
11030
- minute: minute,
11031
- temperature: temperature,
10945
+ globalDevices[deviceAddr][probe].last_packet_counter = current_packet;
10946
+ globalDevices[deviceAddr][probe].data[current_packet] = payload.slice(sdata_start);
10947
+ return;
10948
+ } else {
10949
+ globalDevices[deviceAddr][probe].last_packet_counter = current_packet;
10950
+ globalDevices[deviceAddr][probe].data[current_packet] = payload.slice(sdata_start);
11032
10951
  }
11033
- globalDevices[deviceAddr].last_packet_counter = current_packet;
11034
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10952
+ } else {
10953
+ // clear stream object & timeout
10954
+ parent.sensor_types[111].utils.clear_globalDevices_stream(deviceAddr, probe);
10955
+
10956
+ // init new stream
10957
+ parent.sensor_types[111].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type, probe);
10958
+
10959
+ globalDevices[deviceAddr][probe].last_packet_counter = current_packet;
10960
+ globalDevices[deviceAddr][probe].data[current_packet] = payload.slice(sdata_start);
11035
10961
  }
11036
10962
  }
11037
10963
  else{
11038
- var mode = payload[8];
11039
- var odr = msbLsb(payload[9], payload[10]);
11040
- var fsr = payload[11] >> 5;
11041
- var temperature = msbLsb(payload[14], payload[15])/100;
10964
+ // clear stream object & timeout
10965
+ parent.sensor_types[111].utils.clear_globalDevices_stream(deviceAddr, probe);
11042
10966
 
11043
- globalDevices[deviceAddr] = {
11044
- data: {},
11045
- odr: odr,
11046
- mo: mode,
11047
- fsr: fsr,
11048
- hour: hour,
11049
- minute: minute,
11050
- temperature: temperature,
11051
- }
11052
- globalDevices[deviceAddr].last_packet_counter = current_packet;
11053
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10967
+ // init new stream
10968
+ parent.sensor_types[111].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type, probe);
10969
+
10970
+ globalDevices[deviceAddr][probe].last_packet_counter = current_packet;
10971
+ globalDevices[deviceAddr][probe].data[current_packet] = payload.slice(sdata_start);
11054
10972
  }
11055
10973
  if(current_packet == expected_packets){
11056
- var raw_data = new Array();
11057
- for(const packet in globalDevices[deviceAddr].data){
11058
- raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
11059
- }
11060
- var label = 0;
11061
-
11062
- var fft = new Array();
11063
- var fft_concat = {};
10974
+ // concatenate stream
10975
+ sensor_data = parent.sensor_types[111].utils.concat_fft_data(deviceAddr, payload[8], msg_type, probe);
11064
10976
 
11065
- var en_axis_data = {};
11066
- en_axis_data.x_offset = 0;
11067
- en_axis_data.y_offset = 2;
11068
- en_axis_data.z_offset = 4;
11069
- en_axis_data.increment = 6;
11070
- fft_concat = {x: [], y: [], z: []};
11071
-
11072
- var fsr_mult = .00006;
11073
- var fsr_text = "";
11074
-
11075
- switch(globalDevices[deviceAddr].fsr){
11076
- case 0:
11077
- fsr_mult = 0.00006;
11078
- break;
11079
- case 1:
11080
- fsr_mult = 0.00012;
11081
- break;
11082
- case 2:
11083
- fsr_mult = 0.00024;
11084
- break;
11085
- case 3:
11086
- fsr_mult = 0.00049;
11087
- break;
11088
- }
11089
- switch(globalDevices[deviceAddr].fsr){
11090
- case 0:
11091
- fsr_text = "2g";
11092
- break;
11093
- case 1:
11094
- fsr_text = "4g";
11095
- break;
11096
- case 2:
11097
- fsr_text = "8g";
11098
- break;
11099
- case 3:
11100
- fsr_text = "16g";
11101
- break;
11102
- }
11103
-
11104
- for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
11105
- label++;
11106
-
11107
- if('x_offset' in en_axis_data){
11108
- fft_concat.x.push(parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2)));
11109
- }
11110
- if('y_offset' in en_axis_data){
11111
- fft_concat.y.push(parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2)));
11112
- }
11113
- if('z_offset' in en_axis_data){
11114
- fft_concat.z.push(parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2)));
11115
- }
11116
- }
11117
- // If 4th bit is 1 the packet is from the second probe, if 0 from the first
11118
- var probe = '';
11119
- if(payload[7] & 8){
11120
- probe = '2';
11121
- }
11122
- else{
11123
- probe = '1';
11124
- }
11125
-
11126
- var fft_concat_obj = {
11127
- mode: payload[8],
11128
- msg_type: msg_type,
11129
- probe: probe,
11130
- time_id: [
11131
- String(globalDevices[deviceAddr].hour).padStart(2, '0'),
11132
- String(globalDevices[deviceAddr].minute).padStart(2, '0'),
11133
- ].join(':'),
11134
- mac_address: deviceAddr,
11135
- fsr: fsr_text,
11136
- odr: globalDevices[deviceAddr].odr,
11137
- temperature: globalDevices[deviceAddr].temperature,
11138
- total_samples: label,
11139
- fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / expected_packets) * 100).toFixed(2) + '%',
11140
- data: fft_concat
11141
- };
11142
- sensor_data = fft_concat_obj;
11143
- delete globalDevices[deviceAddr];
10977
+ // clear stream object & timeout
10978
+ parent.sensor_types[111].utils.clear_globalDevices_stream(deviceAddr, probe);
11144
10979
  return sensor_data;
11145
10980
  }
11146
10981
  else{
@@ -11291,6 +11126,120 @@ function sensor_types(parent){
11291
11126
  // return parsed;
11292
11127
  // }
11293
11128
  },
11129
+ 'utils': {
11130
+ 'clear_globalDevices_stream': (deviceAddr, probe) => {
11131
+ if(Object.hasOwn(globalDevices, deviceAddr) && Object.hasOwn(globalDevices[deviceAddr], probe)){
11132
+ if(Object.hasOwn(globalDevices[deviceAddr][probe], 'packet_stream_timeout')){
11133
+ clearTimeout(globalDevices[deviceAddr][probe].packet_stream_timeout);
11134
+ }
11135
+ delete globalDevices[deviceAddr][probe];
11136
+ }
11137
+ },
11138
+ 'init_globalDevices_stream'(deviceAddr, payload, expected_packets, parsed, msg_type, probe){
11139
+ globalDevices[deviceAddr][probe] = {
11140
+ data: {},
11141
+ odr: msbLsb(payload[9], payload[10]),
11142
+ mo: payload[8],
11143
+ fsr: payload[11] >> 5,
11144
+ hour: payload[12],
11145
+ minute: payload[13],
11146
+ temperature: msbLsb(payload[14], payload[15]) / 100,
11147
+ expected_packets: expected_packets
11148
+ }
11149
+ globalDevices[deviceAddr][probe].packet_stream_timeout = setTimeout(() => {
11150
+ parsed.sensor_data = parent.sensor_types[111].utils.concat_fft_data(deviceAddr, payload[8], msg_type, probe);
11151
+ parsed.sensor_data.error = 'Time Series Data Stream Timeout - incomplete data received';
11152
+
11153
+ parsed.sensor_name = parent.sensor_types[111].name;
11154
+ parsed.type = 'sensor_data';
11155
+ parsed.addr = deviceAddr;
11156
+ parsed.received = Date.now();
11157
+
11158
+ parent._emitter.emit('sensor_data', parsed);
11159
+ parent._emitter.emit('sensor_data-111', parsed);
11160
+ parent._emitter.emit('sensor_data'+'-'+deviceAddr, parsed);
11161
+ }, 60000);
11162
+ },
11163
+ 'concat_fft_data': (deviceAddr, mode, msg_type, probe) => {
11164
+ var raw_data = new Array();
11165
+ for(const packet in globalDevices[deviceAddr][probe].data){
11166
+ raw_data = raw_data.concat(globalDevices[deviceAddr][probe].data[packet]);
11167
+ }
11168
+ var label = 0;
11169
+
11170
+ var fft_concat = {};
11171
+
11172
+ var en_axis_data = {};
11173
+ en_axis_data.x_offset = 0;
11174
+ en_axis_data.y_offset = 2;
11175
+ en_axis_data.z_offset = 4;
11176
+ en_axis_data.increment = 6;
11177
+ fft_concat = {x: [], y: [], z: []};
11178
+
11179
+ var fsr_mult = .00006;
11180
+ var fsr_text = "";
11181
+
11182
+ switch(globalDevices[deviceAddr][probe].fsr){
11183
+ case 0:
11184
+ fsr_mult = 0.00006;
11185
+ break;
11186
+ case 1:
11187
+ fsr_mult = 0.00012;
11188
+ break;
11189
+ case 2:
11190
+ fsr_mult = 0.00024;
11191
+ break;
11192
+ case 3:
11193
+ fsr_mult = 0.00049;
11194
+ break;
11195
+ }
11196
+ switch(globalDevices[deviceAddr][probe].fsr){
11197
+ case 0:
11198
+ fsr_text = "2g";
11199
+ break;
11200
+ case 1:
11201
+ fsr_text = "4g";
11202
+ break;
11203
+ case 2:
11204
+ fsr_text = "8g";
11205
+ break;
11206
+ case 3:
11207
+ fsr_text = "16g";
11208
+ break;
11209
+ }
11210
+
11211
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
11212
+ label++;
11213
+
11214
+ if('x_offset' in en_axis_data){
11215
+ fft_concat.x.push(parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2)));
11216
+ }
11217
+ if('y_offset' in en_axis_data){
11218
+ fft_concat.y.push(parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2)));
11219
+ }
11220
+ if('z_offset' in en_axis_data){
11221
+ fft_concat.z.push(parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2)));
11222
+ }
11223
+ }
11224
+ var fft_concat_obj = {
11225
+ mode: mode,
11226
+ msg_type: msg_type,
11227
+ probe: probe,
11228
+ time_id: [
11229
+ String(globalDevices[deviceAddr][probe].hour).padStart(2, '0'),
11230
+ String(globalDevices[deviceAddr][probe].minute).padStart(2, '0'),
11231
+ ].join(':'),
11232
+ mac_address: deviceAddr,
11233
+ fsr: fsr_text,
11234
+ odr: globalDevices[deviceAddr][probe].odr,
11235
+ temperature: globalDevices[deviceAddr][probe].temperature,
11236
+ total_samples: label,
11237
+ fft_confidence : ((Object.keys(globalDevices[deviceAddr][probe].data).length / globalDevices[deviceAddr][probe].expected_packets) * 100).toFixed(2) + '%',
11238
+ data: fft_concat
11239
+ };
11240
+ return fft_concat_obj;
11241
+ }
11242
+ },
11294
11243
  'parse_fly': (frame) => {
11295
11244
  let frame_data = {};
11296
11245
  switch(frame[16]){
@@ -11804,192 +11753,66 @@ function sensor_types(parent){
11804
11753
  return parsed;
11805
11754
  }
11806
11755
  let msg_type = (payload[7] & 16)? 'motion' : 'regular';
11807
- if(payload[8] === 1){
11756
+ if (payload[8] === 1) {
11808
11757
  var deviceAddr = mac;
11809
- var firmware = payload[1];
11810
- var hour = payload[12];
11811
- var minute = payload[13];
11758
+ // var firmware = payload[1];
11759
+ // var hour = payload[12];
11760
+ // var minute = payload[13];
11812
11761
  var expected_packets = msbLsb(payload[16], payload[17]);
11813
11762
  var current_packet = msbLsb(payload[18], payload[19]);
11814
11763
  var sdata_start = 20;
11815
-
11816
- if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
11817
- if(expected_packets != 1){
11818
- // if a packet is already stored with the same packet ID, or if packet ID is 1, or if current packet ID is not one more than last packet ID
11819
- if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !((current_packet-1) in globalDevices[deviceAddr].data)) {
11820
- console.log('-----');
11821
- console.log('bad packet breakdown deleting stream');
11822
- console.log(current_packet);
11823
- console.log(expected_packets);
11824
- console.log(current_packet in globalDevices[deviceAddr].data);
11825
- console.log(current_packet == 1);
11826
- console.log(!((current_packet-1) in globalDevices[deviceAddr].data));
11827
- if(this.hasOwnProperty('failure_no')){
11828
- this.failure_no = this.failure_no + 1;
11829
- }
11830
- else{
11831
- this.failure_no = 1;
11832
- }
11833
- if(this.hasOwnProperty('failure_no')){
11834
- console.log('####falure no');
11835
- console.log(this.failure_no);
11836
- }
11837
- // console.log(globalDevices[deviceAddr].data);
11838
- delete globalDevices[deviceAddr];
11839
- if(current_packet != 1){
11840
- return;
11841
- } else{
11842
-
11843
- var mode = payload[8];
11844
- var odr = msbLsb(payload[9], payload[10]);
11845
- var fsr = payload[11] >> 5;
11846
- var temperature = msbLsb(payload[14], payload[15])/100;
11847
-
11848
- globalDevices[deviceAddr] = {
11849
- // stream_size: expected_packets,
11850
- data: {},
11851
- odr: odr,
11852
- mo: mode,
11853
- fsr: fsr,
11854
- hour: hour,
11855
- minute: minute,
11856
- temperature: temperature,
11857
- }
11858
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11859
- return;
11860
- }
11764
+
11765
+
11766
+ if (globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1) {
11767
+ if (expected_packets != 1) {
11768
+ // if current packet is equal to last one (duplicated data). This does not apply to the last package
11769
+ if (globalDevices[deviceAddr].last_packet_counter == current_packet) {
11770
+ console.log('Duplicated message')
11771
+ return;
11861
11772
  }
11862
- else{
11773
+ // if current packet is equal to 1 or last packet counter is higher thant current packet
11774
+ if (current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)) {
11775
+ console.log('Recovering bad packet');
11776
+ // clear stream object & timeout
11777
+ parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
11778
+
11779
+ // init new stream
11780
+ parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
11781
+
11782
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
11783
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11784
+ return;
11785
+ } else {
11786
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
11863
11787
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11864
11788
  }
11865
- }
11866
- else{
11867
- var mode = payload[8];
11868
- var odr = msbLsb(payload[9], payload[10]);
11869
- var fsr = payload[11] >> 5;
11870
- var temperature = msbLsb(payload[14], payload[15])/100;
11871
-
11872
- globalDevices[deviceAddr] = {
11873
- // stream_size: expected_packets,
11874
- data: {},
11875
- odr: odr,
11876
- mo: mode,
11877
- fsr: fsr,
11878
- hour: hour,
11879
- minute: minute,
11880
- temperature: temperature,
11881
- }
11789
+ } else {
11790
+ // clear stream object & timeout
11791
+ parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
11792
+
11793
+ // init new stream
11794
+ parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
11795
+
11796
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
11882
11797
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11883
11798
  }
11884
- if(Object.keys(globalDevices[deviceAddr].data).length == expected_packets){
11885
- var raw_data = new Array();
11886
- for(const packet in globalDevices[deviceAddr].data){
11887
- raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
11888
- }
11889
- var label = 0;
11890
-
11891
- var fft = new Array();
11892
- var fft_concat = {};
11893
-
11894
- var en_axis_data = {};
11895
- en_axis_data.x_offset = 0;
11896
- en_axis_data.y_offset = 2;
11897
- en_axis_data.z_offset = 4;
11898
- en_axis_data.increment = 6;
11899
- fft_concat = {x: [], y: [], z: []};
11900
-
11901
- var fsr_mult = .00006;
11902
- var fsr_text = "";
11903
- switch(globalDevices[deviceAddr].fsr){
11904
- case 0:
11905
- fsr_mult = 0.00006;
11906
- break;
11907
- case 1:
11908
- fsr_mult = 0.00012;
11909
- break;
11910
- case 2:
11911
- fsr_mult = 0.00024;
11912
- break;
11913
- case 3:
11914
- fsr_mult = 0.00049;
11915
- break;
11916
- }
11917
- switch(globalDevices[deviceAddr].fsr){
11918
- case 0:
11919
- fsr_text = "2g";
11920
- break;
11921
- case 1:
11922
- fsr_text = "4g";
11923
- break;
11924
- case 2:
11925
- fsr_text = "8g";
11926
- break;
11927
- case 3:
11928
- fsr_text = "16g";
11929
- break;
11930
- }
11931
-
11932
- for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
11933
- label++;
11934
-
11935
- if('x_offset' in en_axis_data){
11936
- fft_concat.x.push(parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2)));
11937
- }
11938
- if('y_offset' in en_axis_data){
11939
- fft_concat.y.push(parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2)));
11940
- }
11941
- if('z_offset' in en_axis_data){
11942
- fft_concat.z.push(parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2)));
11943
- }
11944
- }
11945
- var fft_concat_obj = {
11946
- mode: payload[8],
11947
- msg_type: msg_type,
11948
- time_id: [
11949
- String(globalDevices[deviceAddr].hour).padStart(2, '0'),
11950
- String(globalDevices[deviceAddr].minute).padStart(2, '0'),
11951
- ].join(':'),
11952
- mac_address: deviceAddr,
11953
- fsr: fsr_text,
11954
- odr: globalDevices[deviceAddr].odr,
11955
- temperature: globalDevices[deviceAddr].temperature,
11956
- total_samples: label,
11957
- data: fft_concat
11958
- };
11959
- // console.log(globalDevices[deviceAddr].data);
11960
- // console.log(raw_data);
11961
- sensor_data = fft_concat_obj;
11962
- // parsed.raw_packets = globalDevices[deviceAddr].data;
11963
- // parsed.raw_data = raw_data;
11964
- delete globalDevices[deviceAddr];
11965
- if(this.hasOwnProperty('failure_no')){
11966
- console.log('####falure no');
11967
- console.log(this.failure_no);
11968
- }
11969
-
11970
- return sensor_data;
11971
- }
11972
- else{
11973
- return;
11974
- }
11975
- }else{
11976
-
11977
- var mode = payload[8];
11978
- var odr = msbLsb(payload[9], payload[10]);
11979
- var fsr = payload[11] >> 5;
11980
- var temperature = msbLsb(payload[14], payload[15])/100;
11981
-
11982
- globalDevices[deviceAddr] = {
11983
- // stream_size: expected_packets,
11984
- data: {},
11985
- odr: odr,
11986
- mo: mode,
11987
- fsr: fsr,
11988
- hour: hour,
11989
- minute: minute,
11990
- temperature: temperature,
11991
- }
11799
+ } else {
11800
+ // clear stream object & timeout
11801
+ parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
11802
+
11803
+ // init new stream
11804
+ parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
11805
+
11806
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
11992
11807
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11808
+ }
11809
+ if (current_packet == expected_packets) {
11810
+ // concatenate stream
11811
+ sensor_data = parent.sensor_types[112].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
11812
+ // clear stream object & timeout
11813
+ parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
11814
+ return sensor_data;
11815
+ } else {
11993
11816
  return;
11994
11817
  }
11995
11818
  }
@@ -12068,6 +11891,119 @@ function sensor_types(parent){
12068
11891
  // return parsed;
12069
11892
  // }
12070
11893
  },
11894
+ 'utils': {
11895
+ 'clear_globalDevices_stream': (deviceAddr) => {
11896
+ if(Object.hasOwn(globalDevices, deviceAddr)){
11897
+ if(Object.hasOwn(globalDevices[deviceAddr], 'packet_stream_timeout')){
11898
+ clearTimeout(globalDevices[deviceAddr].packet_stream_timeout);
11899
+ }
11900
+ delete globalDevices[deviceAddr];
11901
+ }
11902
+ },
11903
+ 'init_globalDevices_stream'(deviceAddr, payload, expected_packets, parsed, msg_type){
11904
+ globalDevices[deviceAddr] = {
11905
+ data: {},
11906
+ odr: msbLsb(payload[9], payload[10]),
11907
+ mo: payload[8],
11908
+ fsr: payload[11] >> 5,
11909
+ hour: payload[12],
11910
+ minute: payload[13],
11911
+ temperature: msbLsb(payload[14], payload[15]) / 100,
11912
+ expected_packets: expected_packets
11913
+ }
11914
+ globalDevices[deviceAddr].packet_stream_timeout = setTimeout(() => {
11915
+ parsed.sensor_data = parent.sensor_types[112].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
11916
+ parsed.sensor_data.error = 'Time Series Data Stream Timeout - incomplete data received';
11917
+
11918
+ parsed.sensor_name = parent.sensor_types[112].name;
11919
+ parsed.type = 'sensor_data';
11920
+ parsed.addr = deviceAddr;
11921
+ parsed.received = Date.now();
11922
+
11923
+ parent._emitter.emit('sensor_data', parsed);
11924
+ parent._emitter.emit('sensor_data-112', parsed);
11925
+ parent._emitter.emit('sensor_data'+'-'+deviceAddr, parsed);
11926
+ }, 60000);
11927
+ },
11928
+ 'concat_fft_data': (deviceAddr, mode, msg_type) => {
11929
+ var raw_data = new Array();
11930
+ for(const packet in globalDevices[deviceAddr].data){
11931
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
11932
+ }
11933
+ var label = 0;
11934
+
11935
+ var fft_concat = {};
11936
+
11937
+ var en_axis_data = {};
11938
+ en_axis_data.x_offset = 0;
11939
+ en_axis_data.y_offset = 2;
11940
+ en_axis_data.z_offset = 4;
11941
+ en_axis_data.increment = 6;
11942
+ fft_concat = {x: [], y: [], z: []};
11943
+
11944
+ var fsr_mult = .00006;
11945
+ var fsr_text = "";
11946
+
11947
+ switch(globalDevices[deviceAddr].fsr){
11948
+ case 0:
11949
+ fsr_mult = 0.00006;
11950
+ break;
11951
+ case 1:
11952
+ fsr_mult = 0.00012;
11953
+ break;
11954
+ case 2:
11955
+ fsr_mult = 0.00024;
11956
+ break;
11957
+ case 3:
11958
+ fsr_mult = 0.00049;
11959
+ break;
11960
+ }
11961
+ switch(globalDevices[deviceAddr].fsr){
11962
+ case 0:
11963
+ fsr_text = "2g";
11964
+ break;
11965
+ case 1:
11966
+ fsr_text = "4g";
11967
+ break;
11968
+ case 2:
11969
+ fsr_text = "8g";
11970
+ break;
11971
+ case 3:
11972
+ fsr_text = "16g";
11973
+ break;
11974
+ }
11975
+
11976
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
11977
+ label++;
11978
+
11979
+ if('x_offset' in en_axis_data){
11980
+ fft_concat.x.push(parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2)));
11981
+ }
11982
+ if('y_offset' in en_axis_data){
11983
+ fft_concat.y.push(parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2)));
11984
+ }
11985
+ if('z_offset' in en_axis_data){
11986
+ fft_concat.z.push(parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2)));
11987
+ }
11988
+ }
11989
+ var fft_concat_obj = {
11990
+ mode: mode,
11991
+ msg_type: msg_type,
11992
+ time_id: [
11993
+ String(globalDevices[deviceAddr].hour).padStart(2, '0'),
11994
+ String(globalDevices[deviceAddr].minute).padStart(2, '0'),
11995
+ ].join(':'),
11996
+ mac_address: deviceAddr,
11997
+ fsr: fsr_text,
11998
+ odr: globalDevices[deviceAddr].odr,
11999
+ temperature: globalDevices[deviceAddr].temperature,
12000
+ total_samples: label,
12001
+ fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / globalDevices[deviceAddr].expected_packets) * 100).toFixed(2) + '%',
12002
+ data: fft_concat
12003
+ };
12004
+ return fft_concat_obj;
12005
+ }
12006
+ },
12071
12007
  'parse_fly': (frame) => {
12072
12008
  let frame_data = {};
12073
12009
  switch(frame[16]){
@@ -12440,9 +12376,9 @@ function sensor_types(parent){
12440
12376
  let msg_type = (payload[7] & 16)? 'motion' : 'regular';
12441
12377
  if(payload[8] === 1){
12442
12378
  var deviceAddr = mac;
12443
- var firmware = payload[1];
12444
- var hour = payload[12];
12445
- var minute = payload[13];
12379
+ // var firmware = payload[1];
12380
+ // var hour = payload[12];
12381
+ // var minute = payload[13];
12446
12382
  var expected_packets = msbLsb(payload[16], payload[17]);
12447
12383
  var current_packet = msbLsb(payload[18], payload[19]);
12448
12384
  var sdata_start = 20;
@@ -12456,23 +12392,13 @@ function sensor_types(parent){
12456
12392
  }
12457
12393
  // if current packet is equal to 1 or last packet counter is higher thant current packet
12458
12394
  if(current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)){
12459
- // clear stream
12460
- delete globalDevices[deviceAddr];
12461
- // create new stream
12462
- var mode = payload[8];
12463
- var odr = msbLsb(payload[9], payload[10]);
12464
- var fsr = payload[11] >> 5;
12465
- var temperature = msbLsb(payload[14], payload[15])/100;
12395
+ console.log('Recovering bad packet');
12396
+ // clear stream object & timeout
12397
+ parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
12398
+
12399
+ // init new stream
12400
+ parent.sensor_types[114].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
12466
12401
 
12467
- globalDevices[deviceAddr] = {
12468
- data: {},
12469
- odr: odr,
12470
- mo: mode,
12471
- fsr: fsr,
12472
- hour: hour,
12473
- minute: minute,
12474
- temperature: temperature,
12475
- }
12476
12402
  globalDevices[deviceAddr].last_packet_counter = current_packet;
12477
12403
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
12478
12404
  return;
@@ -12483,121 +12409,31 @@ function sensor_types(parent){
12483
12409
  }
12484
12410
  }
12485
12411
  else{
12486
- var mode = payload[8];
12487
- var odr = msbLsb(payload[9], payload[10]);
12488
- var fsr = payload[11] >> 5;
12489
- var temperature = msbLsb(payload[14], payload[15])/100;
12412
+ // clear stream object & timeout
12413
+ parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
12414
+
12415
+ // init new stream
12416
+ parent.sensor_types[114].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
12490
12417
 
12491
- globalDevices[deviceAddr] = {
12492
- data: {},
12493
- odr: odr,
12494
- mo: mode,
12495
- fsr: fsr,
12496
- hour: hour,
12497
- minute: minute,
12498
- temperature: temperature,
12499
- }
12500
12418
  globalDevices[deviceAddr].last_packet_counter = current_packet;
12501
12419
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
12502
12420
  }
12503
12421
  }
12504
12422
  else{
12505
- var mode = payload[8];
12506
- var odr = msbLsb(payload[9], payload[10]);
12507
- var fsr = payload[11] >> 5;
12508
- var temperature = msbLsb(payload[14], payload[15])/100;
12423
+ // clear stream object & timeout
12424
+ parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
12425
+
12426
+ // init new stream
12427
+ parent.sensor_types[114].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
12509
12428
 
12510
- globalDevices[deviceAddr] = {
12511
- data: {},
12512
- odr: odr,
12513
- mo: mode,
12514
- fsr: fsr,
12515
- hour: hour,
12516
- minute: minute,
12517
- temperature: temperature,
12518
- }
12519
12429
  globalDevices[deviceAddr].last_packet_counter = current_packet;
12520
12430
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
12521
12431
  }
12522
12432
  if(current_packet == expected_packets){
12523
- var raw_data = new Array();
12524
- for(const packet in globalDevices[deviceAddr].data){
12525
- raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
12526
- }
12527
- var label = 0;
12528
-
12529
- var fft = new Array();
12530
- var fft_concat = {};
12531
-
12532
- var en_axis_data = {};
12533
- en_axis_data.x_offset = 0;
12534
- en_axis_data.y_offset = 2;
12535
- en_axis_data.z_offset = 4;
12536
- en_axis_data.increment = 6;
12537
- fft_concat = {x: [], y: [], z: []};
12538
-
12539
- var fsr_mult = .00006;
12540
- var fsr_text = "";
12541
-
12542
- switch(globalDevices[deviceAddr].fsr){
12543
- case 0:
12544
- fsr_mult = 0.00006;
12545
- break;
12546
- case 1:
12547
- fsr_mult = 0.00012;
12548
- break;
12549
- case 2:
12550
- fsr_mult = 0.00024;
12551
- break;
12552
- case 3:
12553
- fsr_mult = 0.00049;
12554
- break;
12555
- }
12556
- switch(globalDevices[deviceAddr].fsr){
12557
- case 0:
12558
- fsr_text = "2g";
12559
- break;
12560
- case 1:
12561
- fsr_text = "4g";
12562
- break;
12563
- case 2:
12564
- fsr_text = "8g";
12565
- break;
12566
- case 3:
12567
- fsr_text = "16g";
12568
- break;
12569
- }
12570
-
12571
- for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
12572
- label++;
12573
-
12574
- if('x_offset' in en_axis_data){
12575
- fft_concat.x.push(parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2)));
12576
- }
12577
- if('y_offset' in en_axis_data){
12578
- fft_concat.y.push(parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2)));
12579
- }
12580
- if('z_offset' in en_axis_data){
12581
- fft_concat.z.push(parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2)));
12582
- }
12583
- }
12584
- var fft_concat_obj = {
12585
- mode: payload[8],
12586
- msg_type: msg_type,
12587
- time_id: [
12588
- String(globalDevices[deviceAddr].hour).padStart(2, '0'),
12589
- String(globalDevices[deviceAddr].minute).padStart(2, '0'),
12590
- ].join(':'),
12591
- mac_address: deviceAddr,
12592
- fsr: fsr_text,
12593
- odr: globalDevices[deviceAddr].odr,
12594
- temperature: globalDevices[deviceAddr].temperature,
12595
- total_samples: label,
12596
- fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / expected_packets) * 100).toFixed(2) + '%',
12597
- data: fft_concat
12598
- };
12599
- sensor_data = fft_concat_obj;
12600
- delete globalDevices[deviceAddr];
12433
+ // concatenate stream
12434
+ sensor_data = parent.sensor_types[114].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
12435
+ // clear stream object & timeout
12436
+ parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
12601
12437
  return sensor_data;
12602
12438
  }
12603
12439
  else{
@@ -12678,6 +12514,114 @@ function sensor_types(parent){
12678
12514
  // return parsed;
12679
12515
  // }
12680
12516
  },
12517
+ 'utils': {
12518
+ 'clear_globalDevices_stream': (deviceAddr) => {
12519
+ if(Object.hasOwn(globalDevices, deviceAddr)){
12520
+ if(Object.hasOwn(globalDevices[deviceAddr], 'packet_stream_timeout')){
12521
+ clearTimeout(globalDevices[deviceAddr].packet_stream_timeout);
12522
+ }
12523
+ delete globalDevices[deviceAddr];
12524
+ }
12525
+ },
12526
+ 'init_globalDevices_stream'(deviceAddr, payload, expected_packets, parsed, msg_type){
12527
+ globalDevices[deviceAddr] = {
12528
+ data: {},
12529
+ odr: msbLsb(payload[9], payload[10]),
12530
+ mo: payload[8],
12531
+ fsr: payload[11] >> 5,
12532
+ hour: payload[12],
12533
+ minute: payload[13],
12534
+ temperature: msbLsb(payload[14], payload[15]) / 100,
12535
+ expected_packets: expected_packets
12536
+ }
12537
+ globalDevices[deviceAddr].packet_stream_timeout = setTimeout(() => {
12538
+ parsed.sensor_data = parent.sensor_types[114].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
12539
+ parsed.sensor_data.error = 'Time Series Data Stream Timeout - incomplete data received';
12540
+
12541
+ parent._emitter.emit('sensor_data', parsed);
12542
+ parent._emitter.emit('sensor_data-114', parsed);
12543
+ parent._emitter.emit('sensor_data'+'-'+deviceAddr, parsed);
12544
+ }, 60000);
12545
+ },
12546
+ 'concat_fft_data': (deviceAddr, mode, msg_type) => {
12547
+ var raw_data = new Array();
12548
+ for(const packet in globalDevices[deviceAddr].data){
12549
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
12550
+ }
12551
+ var label = 0;
12552
+
12553
+ var fft_concat = {};
12554
+
12555
+ var en_axis_data = {};
12556
+ en_axis_data.x_offset = 0;
12557
+ en_axis_data.y_offset = 2;
12558
+ en_axis_data.z_offset = 4;
12559
+ en_axis_data.increment = 6;
12560
+ fft_concat = {x: [], y: [], z: []};
12561
+
12562
+ var fsr_mult = .00006;
12563
+ var fsr_text = "";
12564
+
12565
+ switch(globalDevices[deviceAddr].fsr){
12566
+ case 0:
12567
+ fsr_mult = 0.00006;
12568
+ break;
12569
+ case 1:
12570
+ fsr_mult = 0.00012;
12571
+ break;
12572
+ case 2:
12573
+ fsr_mult = 0.00024;
12574
+ break;
12575
+ case 3:
12576
+ fsr_mult = 0.00049;
12577
+ break;
12578
+ }
12579
+ switch(globalDevices[deviceAddr].fsr){
12580
+ case 0:
12581
+ fsr_text = "2g";
12582
+ break;
12583
+ case 1:
12584
+ fsr_text = "4g";
12585
+ break;
12586
+ case 2:
12587
+ fsr_text = "8g";
12588
+ break;
12589
+ case 3:
12590
+ fsr_text = "16g";
12591
+ break;
12592
+ }
12593
+
12594
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
12595
+ label++;
12596
+
12597
+ if('x_offset' in en_axis_data){
12598
+ fft_concat.x.push(parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2)));
12599
+ }
12600
+ if('y_offset' in en_axis_data){
12601
+ fft_concat.y.push(parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2)));
12602
+ }
12603
+ if('z_offset' in en_axis_data){
12604
+ fft_concat.z.push(parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2)));
12605
+ }
12606
+ }
12607
+ var fft_concat_obj = {
12608
+ mode: mode,
12609
+ msg_type: msg_type,
12610
+ time_id: [
12611
+ String(globalDevices[deviceAddr].hour).padStart(2, '0'),
12612
+ String(globalDevices[deviceAddr].minute).padStart(2, '0'),
12613
+ ].join(':'),
12614
+ mac_address: deviceAddr,
12615
+ fsr: fsr_text,
12616
+ odr: globalDevices[deviceAddr].odr,
12617
+ temperature: globalDevices[deviceAddr].temperature,
12618
+ total_samples: label,
12619
+ fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / globalDevices[deviceAddr].expected_packets) * 100).toFixed(2) + '%',
12620
+ data: fft_concat
12621
+ };
12622
+ return fft_concat_obj;
12623
+ }
12624
+ },
12681
12625
  'parse_fly': (frame) => {
12682
12626
  let frame_data = {};
12683
12627
  switch(frame[16]){
@@ -14562,12 +14506,85 @@ function sensor_types(parent){
14562
14506
  parsed.data = {error: 'Error found, Load cell comm error'};
14563
14507
  return parsed;
14564
14508
  }
14565
- return {
14566
- weight: signInt(d.slice(8, 12).reduce(msbLsb), 32) / 100
14567
- };
14509
+ let firmware = d[1];
14510
+ if(firmware > 4){
14511
+ let unit = 'Lb';
14512
+ switch(d[12]){
14513
+ case 1:
14514
+ unit = 'Lb';
14515
+ break;
14516
+ case 2:
14517
+ unit = 'Kg';
14518
+ break;
14519
+ }
14520
+ return{
14521
+ weight: signInt(d.slice(8, 12).reduce(msbLsb), 32) / 100,
14522
+ unit: unit,
14523
+ raw_adc: signInt(d.slice(13, 17).reduce(msbLsb), 32)
14524
+ }
14525
+ }
14526
+ else {
14527
+ return {
14528
+ weight: signInt(d.slice(8, 12).reduce(msbLsb), 32) / 100
14529
+ };
14530
+ }
14568
14531
  },
14569
14532
  'parse_fly': (frame) => {
14570
- if(frame[2] > 3){
14533
+ if(frame[2] > 4){
14534
+ let date = [
14535
+ String(frame.slice(20, 22).reduce(msbLsb)),
14536
+ String(frame[22]).padStart(2, '0'),
14537
+ String(frame[23]).padStart(2, '0')
14538
+ ].join('-');
14539
+ let time = [
14540
+ String(frame[24]).padStart(2, '0'),
14541
+ String(frame[25]).padStart(2, '0'),
14542
+ String(frame[26]).padStart(2, '0')
14543
+ ].join(':');
14544
+ let screen_on_time = "always_off";
14545
+ switch(frame[27]){
14546
+ case 0:
14547
+ screen_on_time = "always_off";
14548
+ break;
14549
+ case 255:
14550
+ screen_on_time = "always_on";
14551
+ break;
14552
+ default:
14553
+ screen_on_time = frame[27] + "Sec";
14554
+ break;
14555
+ }
14556
+ let unit = "Lb";
14557
+ switch(frame[28]){
14558
+ case 1:
14559
+ unit = "Lb";
14560
+ break;
14561
+ case 2:
14562
+ unit = "Kg";
14563
+ break;
14564
+ }
14565
+ return {
14566
+ 'firmware': frame[2],
14567
+ 'calibration_tare': frame.slice(12, 16).reduce(msbLsb),
14568
+ 'tare_counter': frame.slice(16, 20).reduce(msbLsb),
14569
+ 'timestamp': date + "T" + time,
14570
+ 'screen_on_time': screen_on_time,
14571
+ 'weight_unit': unit,
14572
+ 'hardware_id': frame.slice(29, 32),
14573
+ 'report_rate': frame.slice(32, 36).reduce(msbLsb) + "Sec",
14574
+ 'tx_life_counter': frame.slice(36, 40).reduce(msbLsb),
14575
+ 'machine_values': {
14576
+ 'firmware': frame[2],
14577
+ 'calibration_tare': frame.slice(12, 16).reduce(msbLsb),
14578
+ 'tare_counter': frame.slice(16, 20).reduce(msbLsb),
14579
+ 'timestamp': date + "T" + time,
14580
+ 'screen_on_time': screen_on_time,
14581
+ 'weight_unit': unit,
14582
+ 'hardware_id': frame.slice(29, 32),
14583
+ 'report_rate': frame.slice(32, 36).reduce(msbLsb),
14584
+ 'tx_life_counter': frame.slice(36, 40).reduce(msbLsb)
14585
+ }
14586
+ }
14587
+ }else if(frame[2] == 4){
14571
14588
  let date = [
14572
14589
  String(frame.slice(20, 22).reduce(msbLsb)),
14573
14590
  String(frame[22]).padStart(2, '0'),