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

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,66 @@ 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
+ }
2625
+ config_set_calibration_factor_217(sensor_mac, value){
2626
+ console.log('config_set_calibration_factor_217');
2627
+ var packet = [244, 48, 0, 0, 0];
2628
+ let value_ = int2Bytes(value, 4);
2629
+ packet.push(...value_);
2630
+ console.log(packet);
2631
+ return this.config_send(sensor_mac, packet);
2632
+ }
2573
2633
  config_get_delay(sensor_mac){
2574
2634
  return new Promise((fulfill, reject) => {
2575
2635
  this.config_send(sensor_mac, [247, 21, 0, 0, 0]).then((res) => {
@@ -8524,6 +8584,28 @@ function sensor_types(parent){
8524
8584
  }
8525
8585
  }
8526
8586
  },
8587
+ '99': {
8588
+ name: 'Laser Sensor',
8589
+ parse: (d) => {
8590
+ return {
8591
+ distance: d.slice(0, 2).reduce(msbLsb)
8592
+ };
8593
+ },
8594
+ 'parse_fly': (frame) => {
8595
+ return {
8596
+ 'firmware': frame[2],
8597
+ 'hardware_id': frame.slice(12, 15),
8598
+ 'report_rate': frame.slice(15, 19).reduce(msbLsb) + " sec",
8599
+ 'tx_life_counter': frame.slice(19, 23).reduce(msbLsb),
8600
+ 'machine_values': {
8601
+ 'firmware': frame[2],
8602
+ 'hardware_id': frame.slice(12, 15),
8603
+ 'report_rate': frame.slice(15, 19),
8604
+ 'tx_life_counter': frame.slice(19, 23)
8605
+ }
8606
+ }
8607
+ }
8608
+ },
8527
8609
  '101':{
8528
8610
  name: 'Pro Vibration',
8529
8611
  parse: (d, full)=>{
@@ -9425,7 +9507,7 @@ function sensor_types(parent){
9425
9507
  }
9426
9508
  },
9427
9509
  'parse_fly': (frame) => {
9428
- if(frame[2] == 19){ // Screen version fw 19
9510
+ if(frame[2] > 18){
9429
9511
  let reset_mode = "Disabled";
9430
9512
  switch(frame[38]){
9431
9513
  case 0:
@@ -9551,165 +9633,10 @@ function sensor_types(parent){
9551
9633
  'acc_odr': acc_odr,
9552
9634
  'screen_control': screen_control,
9553
9635
  '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),
9636
+ 'interrupt_timeout': frame.slice(43, 45).reduce(msbLsb) + ' msec',
9637
+ 'hardware_id': frame.slice(45, 48),
9638
+ 'report_rate': frame.slice(48, 52).reduce(msbLsb) + " sec",
9639
+ 'tx_life_counter': frame.slice(52, 56).reduce(msbLsb),
9713
9640
  'machine_values': {
9714
9641
  'firmware': frame[2],
9715
9642
  'accelerometer_threshold': frame[16],
@@ -9730,12 +9657,13 @@ function sensor_types(parent){
9730
9657
  'acc_odr': frame[40],
9731
9658
  'screen_control': frame[41],
9732
9659
  '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)
9660
+ 'interrupt_timeout': frame.slice(43, 45),
9661
+ 'hardware_id': frame.slice(45, 48),
9662
+ 'report_rate': frame.slice(48, 52),
9663
+ 'tx_life_counter': frame.slice(52, 56)
9736
9664
  }
9737
9665
  }
9738
- } else if(frame[2] == 14){ // 14
9666
+ }else if(frame[2] > 13){
9739
9667
  let reset_mode = "Disabled";
9740
9668
  switch(frame[38]){
9741
9669
  case 0:
@@ -9869,7 +9797,7 @@ function sensor_types(parent){
9869
9797
  'tx_life_counter': frame.slice(50, 54)
9870
9798
  }
9871
9799
  }
9872
- } else if(frame[2] > 9){ // firmware 10 11 12 13 14 15
9800
+ } else if(frame[2] > 9){
9873
9801
  let reset_mode = "Disabled";
9874
9802
  switch(frame[38]){
9875
9803
  case 0:
@@ -10358,164 +10286,63 @@ function sensor_types(parent){
10358
10286
  let msg_type = (payload[7] & 16)? 'motion' : 'regular';
10359
10287
  if(payload[8] === 1){
10360
10288
  var deviceAddr = mac;
10361
- var firmware = payload[1];
10362
- var hour = payload[12];
10363
- var minute = payload[13];
10289
+ // var firmware = payload[1];
10290
+ // var hour = payload[12];
10291
+ // var minute = payload[13];
10364
10292
  var expected_packets = msbLsb(payload[16], payload[17]);
10365
10293
  var current_packet = msbLsb(payload[18], payload[19]);
10366
10294
  var sdata_start = 20;
10367
10295
 
10368
10296
  if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
10369
- if(expected_packets != 1){
10297
+ if (expected_packets != 1) {
10370
10298
  // 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){
10299
+ if (globalDevices[deviceAddr].last_packet_counter == current_packet) {
10372
10300
  console.log('Duplicated message')
10373
10301
  return;
10374
10302
  }
10375
10303
  // 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
- }
10304
+ if (current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)) {
10305
+ console.log('Recovering bad packet');
10306
+ // clear stream object & timeout
10307
+ parent.sensor_types[110].utils.clear_globalDevices_stream(deviceAddr);
10308
+
10309
+ // init new stream
10310
+ parent.sensor_types[110].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
10311
+
10394
10312
  globalDevices[deviceAddr].last_packet_counter = current_packet;
10395
10313
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10396
10314
  return;
10397
- }
10398
- else{
10315
+ } else {
10399
10316
  globalDevices[deviceAddr].last_packet_counter = current_packet;
10400
10317
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10401
10318
  }
10402
10319
  }
10403
10320
  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;
10321
+ // clear stream object & timeout
10322
+ parent.sensor_types[110].utils.clear_globalDevices_stream(deviceAddr);
10408
10323
 
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);
10324
+ // init new stream
10325
+ parent.sensor_types[110].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
10326
+
10327
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
10328
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10420
10329
  }
10421
10330
  }
10422
10331
  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;
10332
+ // clear stream object & timeout
10333
+ parent.sensor_types[110].utils.clear_globalDevices_stream(deviceAddr);
10334
+
10335
+ // init new stream
10336
+ parent.sensor_types[110].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
10427
10337
 
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
10338
  globalDevices[deviceAddr].last_packet_counter = current_packet;
10438
10339
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10439
10340
  }
10440
10341
  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];
10342
+ // concatenate stream
10343
+ sensor_data = parent.sensor_types[114].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
10344
+ // clear stream object & timeout
10345
+ parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
10519
10346
  return sensor_data;
10520
10347
  }
10521
10348
  else{
@@ -10596,6 +10423,119 @@ function sensor_types(parent){
10596
10423
  // return parsed;
10597
10424
  // }
10598
10425
  },
10426
+ 'utils': {
10427
+ 'clear_globalDevices_stream': (deviceAddr) => {
10428
+ if(Object.hasOwn(globalDevices, deviceAddr)){
10429
+ if(Object.hasOwn(globalDevices[deviceAddr], 'packet_stream_timeout')){
10430
+ clearTimeout(globalDevices[deviceAddr].packet_stream_timeout);
10431
+ }
10432
+ delete globalDevices[deviceAddr];
10433
+ }
10434
+ },
10435
+ 'init_globalDevices_stream'(deviceAddr, payload, expected_packets, parsed, msg_type){
10436
+ globalDevices[deviceAddr] = {
10437
+ data: {},
10438
+ odr: msbLsb(payload[9], payload[10]),
10439
+ mo: payload[8],
10440
+ fsr: payload[11] >> 5,
10441
+ hour: payload[12],
10442
+ minute: payload[13],
10443
+ temperature: msbLsb(payload[14], payload[15]) / 100,
10444
+ expected_packets: expected_packets
10445
+ }
10446
+ globalDevices[deviceAddr].packet_stream_timeout = setTimeout(() => {
10447
+ parsed.sensor_data = parent.sensor_types[110].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
10448
+ parsed.sensor_data.error = 'Time Series Data Stream Timeout - incomplete data received';
10449
+
10450
+ parsed.sensor_name = parent.sensor_types[110].name;
10451
+ parsed.type = 'sensor_data';
10452
+ parsed.addr = deviceAddr;
10453
+ parsed.received = Date.now();
10454
+
10455
+ parent._emitter.emit('sensor_data', parsed);
10456
+ parent._emitter.emit('sensor_data-110', parsed);
10457
+ parent._emitter.emit('sensor_data'+'-'+deviceAddr, parsed);
10458
+ }, 60000);
10459
+ },
10460
+ 'concat_fft_data': (deviceAddr, mode, msg_type) => {
10461
+ var raw_data = new Array();
10462
+ for(const packet in globalDevices[deviceAddr].data){
10463
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
10464
+ }
10465
+ var label = 0;
10466
+
10467
+ var fft_concat = {};
10468
+
10469
+ var en_axis_data = {};
10470
+ en_axis_data.x_offset = 0;
10471
+ en_axis_data.y_offset = 2;
10472
+ en_axis_data.z_offset = 4;
10473
+ en_axis_data.increment = 6;
10474
+ fft_concat = {x: [], y: [], z: []};
10475
+
10476
+ var fsr_mult = .00006;
10477
+ var fsr_text = "";
10478
+
10479
+ switch(globalDevices[deviceAddr].fsr){
10480
+ case 0:
10481
+ fsr_mult = 0.00006;
10482
+ break;
10483
+ case 1:
10484
+ fsr_mult = 0.00012;
10485
+ break;
10486
+ case 2:
10487
+ fsr_mult = 0.00024;
10488
+ break;
10489
+ case 3:
10490
+ fsr_mult = 0.00049;
10491
+ break;
10492
+ }
10493
+ switch(globalDevices[deviceAddr].fsr){
10494
+ case 0:
10495
+ fsr_text = "2g";
10496
+ break;
10497
+ case 1:
10498
+ fsr_text = "4g";
10499
+ break;
10500
+ case 2:
10501
+ fsr_text = "8g";
10502
+ break;
10503
+ case 3:
10504
+ fsr_text = "16g";
10505
+ break;
10506
+ }
10507
+
10508
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
10509
+ label++;
10510
+
10511
+ if('x_offset' in en_axis_data){
10512
+ 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)));
10513
+ }
10514
+ if('y_offset' in en_axis_data){
10515
+ 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)));
10516
+ }
10517
+ if('z_offset' in en_axis_data){
10518
+ 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)));
10519
+ }
10520
+ }
10521
+ var fft_concat_obj = {
10522
+ mode: mode,
10523
+ msg_type: msg_type,
10524
+ time_id: [
10525
+ String(globalDevices[deviceAddr].hour).padStart(2, '0'),
10526
+ String(globalDevices[deviceAddr].minute).padStart(2, '0'),
10527
+ ].join(':'),
10528
+ mac_address: deviceAddr,
10529
+ fsr: fsr_text,
10530
+ odr: globalDevices[deviceAddr].odr,
10531
+ temperature: globalDevices[deviceAddr].temperature,
10532
+ total_samples: label,
10533
+ fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / globalDevices[deviceAddr].expected_packets) * 100).toFixed(2) + '%',
10534
+ data: fft_concat
10535
+ };
10536
+ return fft_concat_obj;
10537
+ }
10538
+ },
10599
10539
  'parse_fly': (frame) => {
10600
10540
  let frame_data = {};
10601
10541
  switch(frame[16]){
@@ -10973,174 +10913,77 @@ function sensor_types(parent){
10973
10913
  let msg_type = (payload[7] & 16)? 'motion' : 'regular';
10974
10914
  if(payload[8] === 1){
10975
10915
  var deviceAddr = mac;
10976
- var firmware = payload[1];
10977
- var hour = payload[12];
10978
- var minute = payload[13];
10916
+ // var firmware = payload[1];
10917
+ // var hour = payload[12];
10918
+ // var minute = payload[13];
10979
10919
  var expected_packets = msbLsb(payload[16], payload[17]);
10980
10920
  var current_packet = msbLsb(payload[18], payload[19]);
10981
10921
  var sdata_start = 20;
10922
+ // If 4th bit is 1 the packet is from the second probe, if 0 from the first
10923
+ var probe;
10924
+ if (payload[7] & 8) {
10925
+ probe = 2;
10926
+ } else {
10927
+ probe = 1;
10928
+ }
10982
10929
 
10983
- if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
10984
- if(expected_packets != 1){
10930
+ // initialize globalDevices for this sensor if it doesn't exist
10931
+ // exlusively for multi-probe sensors
10932
+ if(!Object.hasOwn(globalDevices, deviceAddr)){
10933
+ globalDevices[deviceAddr] = {};
10934
+ }
10935
+ if(globalDevices[deviceAddr].hasOwnProperty(probe) || expected_packets == 1){
10936
+ console.log('Continuing existing probe stream');
10937
+ if (expected_packets != 1) {
10938
+ console.log('Expected packets more than 1');
10985
10939
  // 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){
10940
+ if (globalDevices[deviceAddr][probe].last_packet_counter == current_packet) {
10987
10941
  console.log('Duplicated message')
10988
10942
  return;
10989
10943
  }
10990
10944
  // 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;
10945
+ if (current_packet == 1 || (globalDevices[deviceAddr][probe].last_packet_counter > current_packet)) {
10946
+ console.log('Recovering bad packet');
10947
+ // clear stream object & timeout
10948
+ parent.sensor_types[111].utils.clear_globalDevices_stream(deviceAddr, probe);
10999
10949
 
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;
10950
+ // init new stream
10951
+ parent.sensor_types[111].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type, probe);
11023
10952
 
11024
- globalDevices[deviceAddr] = {
11025
- data: {},
11026
- odr: odr,
11027
- mo: mode,
11028
- fsr: fsr,
11029
- hour: hour,
11030
- minute: minute,
11031
- temperature: temperature,
10953
+ globalDevices[deviceAddr][probe].last_packet_counter = current_packet;
10954
+ globalDevices[deviceAddr][probe].data[current_packet] = payload.slice(sdata_start);
10955
+ return;
10956
+ } else {
10957
+ globalDevices[deviceAddr][probe].last_packet_counter = current_packet;
10958
+ globalDevices[deviceAddr][probe].data[current_packet] = payload.slice(sdata_start);
11032
10959
  }
11033
- globalDevices[deviceAddr].last_packet_counter = current_packet;
11034
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10960
+ } else {
10961
+ // clear stream object & timeout
10962
+ parent.sensor_types[111].utils.clear_globalDevices_stream(deviceAddr, probe);
10963
+
10964
+ // init new stream
10965
+ parent.sensor_types[111].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type, probe);
10966
+
10967
+ globalDevices[deviceAddr][probe].last_packet_counter = current_packet;
10968
+ globalDevices[deviceAddr][probe].data[current_packet] = payload.slice(sdata_start);
11035
10969
  }
11036
10970
  }
11037
10971
  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;
10972
+ // clear stream object & timeout
10973
+ parent.sensor_types[111].utils.clear_globalDevices_stream(deviceAddr, probe);
11042
10974
 
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);
10975
+ // init new stream
10976
+ parent.sensor_types[111].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type, probe);
10977
+
10978
+ globalDevices[deviceAddr][probe].last_packet_counter = current_packet;
10979
+ globalDevices[deviceAddr][probe].data[current_packet] = payload.slice(sdata_start);
11054
10980
  }
11055
10981
  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 = {};
11064
-
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
- }
10982
+ // concatenate stream
10983
+ sensor_data = parent.sensor_types[111].utils.concat_fft_data(deviceAddr, payload[8], msg_type, probe);
11125
10984
 
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];
10985
+ // clear stream object & timeout
10986
+ parent.sensor_types[111].utils.clear_globalDevices_stream(deviceAddr, probe);
11144
10987
  return sensor_data;
11145
10988
  }
11146
10989
  else{
@@ -11291,6 +11134,120 @@ function sensor_types(parent){
11291
11134
  // return parsed;
11292
11135
  // }
11293
11136
  },
11137
+ 'utils': {
11138
+ 'clear_globalDevices_stream': (deviceAddr, probe) => {
11139
+ if(Object.hasOwn(globalDevices, deviceAddr) && Object.hasOwn(globalDevices[deviceAddr], probe)){
11140
+ if(Object.hasOwn(globalDevices[deviceAddr][probe], 'packet_stream_timeout')){
11141
+ clearTimeout(globalDevices[deviceAddr][probe].packet_stream_timeout);
11142
+ }
11143
+ delete globalDevices[deviceAddr][probe];
11144
+ }
11145
+ },
11146
+ 'init_globalDevices_stream'(deviceAddr, payload, expected_packets, parsed, msg_type, probe){
11147
+ globalDevices[deviceAddr][probe] = {
11148
+ data: {},
11149
+ odr: msbLsb(payload[9], payload[10]),
11150
+ mo: payload[8],
11151
+ fsr: payload[11] >> 5,
11152
+ hour: payload[12],
11153
+ minute: payload[13],
11154
+ temperature: msbLsb(payload[14], payload[15]) / 100,
11155
+ expected_packets: expected_packets
11156
+ }
11157
+ globalDevices[deviceAddr][probe].packet_stream_timeout = setTimeout(() => {
11158
+ parsed.sensor_data = parent.sensor_types[111].utils.concat_fft_data(deviceAddr, payload[8], msg_type, probe);
11159
+ parsed.sensor_data.error = 'Time Series Data Stream Timeout - incomplete data received';
11160
+
11161
+ parsed.sensor_name = parent.sensor_types[111].name;
11162
+ parsed.type = 'sensor_data';
11163
+ parsed.addr = deviceAddr;
11164
+ parsed.received = Date.now();
11165
+
11166
+ parent._emitter.emit('sensor_data', parsed);
11167
+ parent._emitter.emit('sensor_data-111', parsed);
11168
+ parent._emitter.emit('sensor_data'+'-'+deviceAddr, parsed);
11169
+ }, 60000);
11170
+ },
11171
+ 'concat_fft_data': (deviceAddr, mode, msg_type, probe) => {
11172
+ var raw_data = new Array();
11173
+ for(const packet in globalDevices[deviceAddr][probe].data){
11174
+ raw_data = raw_data.concat(globalDevices[deviceAddr][probe].data[packet]);
11175
+ }
11176
+ var label = 0;
11177
+
11178
+ var fft_concat = {};
11179
+
11180
+ var en_axis_data = {};
11181
+ en_axis_data.x_offset = 0;
11182
+ en_axis_data.y_offset = 2;
11183
+ en_axis_data.z_offset = 4;
11184
+ en_axis_data.increment = 6;
11185
+ fft_concat = {x: [], y: [], z: []};
11186
+
11187
+ var fsr_mult = .00006;
11188
+ var fsr_text = "";
11189
+
11190
+ switch(globalDevices[deviceAddr][probe].fsr){
11191
+ case 0:
11192
+ fsr_mult = 0.00006;
11193
+ break;
11194
+ case 1:
11195
+ fsr_mult = 0.00012;
11196
+ break;
11197
+ case 2:
11198
+ fsr_mult = 0.00024;
11199
+ break;
11200
+ case 3:
11201
+ fsr_mult = 0.00049;
11202
+ break;
11203
+ }
11204
+ switch(globalDevices[deviceAddr][probe].fsr){
11205
+ case 0:
11206
+ fsr_text = "2g";
11207
+ break;
11208
+ case 1:
11209
+ fsr_text = "4g";
11210
+ break;
11211
+ case 2:
11212
+ fsr_text = "8g";
11213
+ break;
11214
+ case 3:
11215
+ fsr_text = "16g";
11216
+ break;
11217
+ }
11218
+
11219
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
11220
+ label++;
11221
+
11222
+ if('x_offset' in en_axis_data){
11223
+ 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)));
11224
+ }
11225
+ if('y_offset' in en_axis_data){
11226
+ 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)));
11227
+ }
11228
+ if('z_offset' in en_axis_data){
11229
+ 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)));
11230
+ }
11231
+ }
11232
+ var fft_concat_obj = {
11233
+ mode: mode,
11234
+ msg_type: msg_type,
11235
+ probe: probe,
11236
+ time_id: [
11237
+ String(globalDevices[deviceAddr][probe].hour).padStart(2, '0'),
11238
+ String(globalDevices[deviceAddr][probe].minute).padStart(2, '0'),
11239
+ ].join(':'),
11240
+ mac_address: deviceAddr,
11241
+ fsr: fsr_text,
11242
+ odr: globalDevices[deviceAddr][probe].odr,
11243
+ temperature: globalDevices[deviceAddr][probe].temperature,
11244
+ total_samples: label,
11245
+ fft_confidence : ((Object.keys(globalDevices[deviceAddr][probe].data).length / globalDevices[deviceAddr][probe].expected_packets) * 100).toFixed(2) + '%',
11246
+ data: fft_concat
11247
+ };
11248
+ return fft_concat_obj;
11249
+ }
11250
+ },
11294
11251
  'parse_fly': (frame) => {
11295
11252
  let frame_data = {};
11296
11253
  switch(frame[16]){
@@ -11804,192 +11761,66 @@ function sensor_types(parent){
11804
11761
  return parsed;
11805
11762
  }
11806
11763
  let msg_type = (payload[7] & 16)? 'motion' : 'regular';
11807
- if(payload[8] === 1){
11764
+ if (payload[8] === 1) {
11808
11765
  var deviceAddr = mac;
11809
- var firmware = payload[1];
11810
- var hour = payload[12];
11811
- var minute = payload[13];
11766
+ // var firmware = payload[1];
11767
+ // var hour = payload[12];
11768
+ // var minute = payload[13];
11812
11769
  var expected_packets = msbLsb(payload[16], payload[17]);
11813
11770
  var current_packet = msbLsb(payload[18], payload[19]);
11814
11771
  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
- }
11772
+
11773
+
11774
+ if (globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1) {
11775
+ if (expected_packets != 1) {
11776
+ // if current packet is equal to last one (duplicated data). This does not apply to the last package
11777
+ if (globalDevices[deviceAddr].last_packet_counter == current_packet) {
11778
+ console.log('Duplicated message')
11779
+ return;
11861
11780
  }
11862
- else{
11781
+ // if current packet is equal to 1 or last packet counter is higher thant current packet
11782
+ if (current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)) {
11783
+ console.log('Recovering bad packet');
11784
+ // clear stream object & timeout
11785
+ parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
11786
+
11787
+ // init new stream
11788
+ parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
11789
+
11790
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
11791
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11792
+ return;
11793
+ } else {
11794
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
11863
11795
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11864
11796
  }
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
- }
11797
+ } else {
11798
+ // clear stream object & timeout
11799
+ parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
11800
+
11801
+ // init new stream
11802
+ parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
11803
+
11804
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
11882
11805
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11883
11806
  }
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
- }
11807
+ } else {
11808
+ // clear stream object & timeout
11809
+ parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
11810
+
11811
+ // init new stream
11812
+ parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
11813
+
11814
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
11992
11815
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11816
+ }
11817
+ if (current_packet == expected_packets) {
11818
+ // concatenate stream
11819
+ sensor_data = parent.sensor_types[112].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
11820
+ // clear stream object & timeout
11821
+ parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
11822
+ return sensor_data;
11823
+ } else {
11993
11824
  return;
11994
11825
  }
11995
11826
  }
@@ -12063,10 +11894,123 @@ function sensor_types(parent){
12063
11894
  rpm: payload.slice(62, 64).reduce(msbLsb)
12064
11895
  };
12065
11896
  }
12066
- // else{
12067
- // parsed.data = {'error': 'Vibration mode error'}
12068
- // return parsed;
12069
- // }
11897
+ // else{
11898
+ // parsed.data = {'error': 'Vibration mode error'}
11899
+ // return parsed;
11900
+ // }
11901
+ },
11902
+ 'utils': {
11903
+ 'clear_globalDevices_stream': (deviceAddr) => {
11904
+ if(Object.hasOwn(globalDevices, deviceAddr)){
11905
+ if(Object.hasOwn(globalDevices[deviceAddr], 'packet_stream_timeout')){
11906
+ clearTimeout(globalDevices[deviceAddr].packet_stream_timeout);
11907
+ }
11908
+ delete globalDevices[deviceAddr];
11909
+ }
11910
+ },
11911
+ 'init_globalDevices_stream'(deviceAddr, payload, expected_packets, parsed, msg_type){
11912
+ globalDevices[deviceAddr] = {
11913
+ data: {},
11914
+ odr: msbLsb(payload[9], payload[10]),
11915
+ mo: payload[8],
11916
+ fsr: payload[11] >> 5,
11917
+ hour: payload[12],
11918
+ minute: payload[13],
11919
+ temperature: msbLsb(payload[14], payload[15]) / 100,
11920
+ expected_packets: expected_packets
11921
+ }
11922
+ globalDevices[deviceAddr].packet_stream_timeout = setTimeout(() => {
11923
+ parsed.sensor_data = parent.sensor_types[112].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
11924
+ parsed.sensor_data.error = 'Time Series Data Stream Timeout - incomplete data received';
11925
+
11926
+ parsed.sensor_name = parent.sensor_types[112].name;
11927
+ parsed.type = 'sensor_data';
11928
+ parsed.addr = deviceAddr;
11929
+ parsed.received = Date.now();
11930
+
11931
+ parent._emitter.emit('sensor_data', parsed);
11932
+ parent._emitter.emit('sensor_data-112', parsed);
11933
+ parent._emitter.emit('sensor_data'+'-'+deviceAddr, parsed);
11934
+ }, 60000);
11935
+ },
11936
+ 'concat_fft_data': (deviceAddr, mode, msg_type) => {
11937
+ var raw_data = new Array();
11938
+ for(const packet in globalDevices[deviceAddr].data){
11939
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
11940
+ }
11941
+ var label = 0;
11942
+
11943
+ var fft_concat = {};
11944
+
11945
+ var en_axis_data = {};
11946
+ en_axis_data.x_offset = 0;
11947
+ en_axis_data.y_offset = 2;
11948
+ en_axis_data.z_offset = 4;
11949
+ en_axis_data.increment = 6;
11950
+ fft_concat = {x: [], y: [], z: []};
11951
+
11952
+ var fsr_mult = .00006;
11953
+ var fsr_text = "";
11954
+
11955
+ switch(globalDevices[deviceAddr].fsr){
11956
+ case 0:
11957
+ fsr_mult = 0.00006;
11958
+ break;
11959
+ case 1:
11960
+ fsr_mult = 0.00012;
11961
+ break;
11962
+ case 2:
11963
+ fsr_mult = 0.00024;
11964
+ break;
11965
+ case 3:
11966
+ fsr_mult = 0.00049;
11967
+ break;
11968
+ }
11969
+ switch(globalDevices[deviceAddr].fsr){
11970
+ case 0:
11971
+ fsr_text = "2g";
11972
+ break;
11973
+ case 1:
11974
+ fsr_text = "4g";
11975
+ break;
11976
+ case 2:
11977
+ fsr_text = "8g";
11978
+ break;
11979
+ case 3:
11980
+ fsr_text = "16g";
11981
+ break;
11982
+ }
11983
+
11984
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
11985
+ label++;
11986
+
11987
+ if('x_offset' in en_axis_data){
11988
+ 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)));
11989
+ }
11990
+ if('y_offset' in en_axis_data){
11991
+ 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)));
11992
+ }
11993
+ if('z_offset' in en_axis_data){
11994
+ 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)));
11995
+ }
11996
+ }
11997
+ var fft_concat_obj = {
11998
+ mode: mode,
11999
+ msg_type: msg_type,
12000
+ time_id: [
12001
+ String(globalDevices[deviceAddr].hour).padStart(2, '0'),
12002
+ String(globalDevices[deviceAddr].minute).padStart(2, '0'),
12003
+ ].join(':'),
12004
+ mac_address: deviceAddr,
12005
+ fsr: fsr_text,
12006
+ odr: globalDevices[deviceAddr].odr,
12007
+ temperature: globalDevices[deviceAddr].temperature,
12008
+ total_samples: label,
12009
+ fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / globalDevices[deviceAddr].expected_packets) * 100).toFixed(2) + '%',
12010
+ data: fft_concat
12011
+ };
12012
+ return fft_concat_obj;
12013
+ }
12070
12014
  },
12071
12015
  'parse_fly': (frame) => {
12072
12016
  let frame_data = {};
@@ -12440,9 +12384,9 @@ function sensor_types(parent){
12440
12384
  let msg_type = (payload[7] & 16)? 'motion' : 'regular';
12441
12385
  if(payload[8] === 1){
12442
12386
  var deviceAddr = mac;
12443
- var firmware = payload[1];
12444
- var hour = payload[12];
12445
- var minute = payload[13];
12387
+ // var firmware = payload[1];
12388
+ // var hour = payload[12];
12389
+ // var minute = payload[13];
12446
12390
  var expected_packets = msbLsb(payload[16], payload[17]);
12447
12391
  var current_packet = msbLsb(payload[18], payload[19]);
12448
12392
  var sdata_start = 20;
@@ -12456,23 +12400,13 @@ function sensor_types(parent){
12456
12400
  }
12457
12401
  // if current packet is equal to 1 or last packet counter is higher thant current packet
12458
12402
  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;
12403
+ console.log('Recovering bad packet');
12404
+ // clear stream object & timeout
12405
+ parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
12406
+
12407
+ // init new stream
12408
+ parent.sensor_types[114].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
12466
12409
 
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
12410
  globalDevices[deviceAddr].last_packet_counter = current_packet;
12477
12411
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
12478
12412
  return;
@@ -12483,121 +12417,31 @@ function sensor_types(parent){
12483
12417
  }
12484
12418
  }
12485
12419
  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;
12420
+ // clear stream object & timeout
12421
+ parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
12422
+
12423
+ // init new stream
12424
+ parent.sensor_types[114].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
12490
12425
 
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
12426
  globalDevices[deviceAddr].last_packet_counter = current_packet;
12501
12427
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
12502
12428
  }
12503
12429
  }
12504
12430
  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;
12431
+ // clear stream object & timeout
12432
+ parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
12433
+
12434
+ // init new stream
12435
+ parent.sensor_types[114].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
12509
12436
 
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
12437
  globalDevices[deviceAddr].last_packet_counter = current_packet;
12520
12438
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
12521
12439
  }
12522
12440
  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];
12441
+ // concatenate stream
12442
+ sensor_data = parent.sensor_types[114].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
12443
+ // clear stream object & timeout
12444
+ parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
12601
12445
  return sensor_data;
12602
12446
  }
12603
12447
  else{
@@ -12678,6 +12522,114 @@ function sensor_types(parent){
12678
12522
  // return parsed;
12679
12523
  // }
12680
12524
  },
12525
+ 'utils': {
12526
+ 'clear_globalDevices_stream': (deviceAddr) => {
12527
+ if(Object.hasOwn(globalDevices, deviceAddr)){
12528
+ if(Object.hasOwn(globalDevices[deviceAddr], 'packet_stream_timeout')){
12529
+ clearTimeout(globalDevices[deviceAddr].packet_stream_timeout);
12530
+ }
12531
+ delete globalDevices[deviceAddr];
12532
+ }
12533
+ },
12534
+ 'init_globalDevices_stream'(deviceAddr, payload, expected_packets, parsed, msg_type){
12535
+ globalDevices[deviceAddr] = {
12536
+ data: {},
12537
+ odr: msbLsb(payload[9], payload[10]),
12538
+ mo: payload[8],
12539
+ fsr: payload[11] >> 5,
12540
+ hour: payload[12],
12541
+ minute: payload[13],
12542
+ temperature: msbLsb(payload[14], payload[15]) / 100,
12543
+ expected_packets: expected_packets
12544
+ }
12545
+ globalDevices[deviceAddr].packet_stream_timeout = setTimeout(() => {
12546
+ parsed.sensor_data = parent.sensor_types[114].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
12547
+ parsed.sensor_data.error = 'Time Series Data Stream Timeout - incomplete data received';
12548
+
12549
+ parent._emitter.emit('sensor_data', parsed);
12550
+ parent._emitter.emit('sensor_data-114', parsed);
12551
+ parent._emitter.emit('sensor_data'+'-'+deviceAddr, parsed);
12552
+ }, 60000);
12553
+ },
12554
+ 'concat_fft_data': (deviceAddr, mode, msg_type) => {
12555
+ var raw_data = new Array();
12556
+ for(const packet in globalDevices[deviceAddr].data){
12557
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
12558
+ }
12559
+ var label = 0;
12560
+
12561
+ var fft_concat = {};
12562
+
12563
+ var en_axis_data = {};
12564
+ en_axis_data.x_offset = 0;
12565
+ en_axis_data.y_offset = 2;
12566
+ en_axis_data.z_offset = 4;
12567
+ en_axis_data.increment = 6;
12568
+ fft_concat = {x: [], y: [], z: []};
12569
+
12570
+ var fsr_mult = .00006;
12571
+ var fsr_text = "";
12572
+
12573
+ switch(globalDevices[deviceAddr].fsr){
12574
+ case 0:
12575
+ fsr_mult = 0.00006;
12576
+ break;
12577
+ case 1:
12578
+ fsr_mult = 0.00012;
12579
+ break;
12580
+ case 2:
12581
+ fsr_mult = 0.00024;
12582
+ break;
12583
+ case 3:
12584
+ fsr_mult = 0.00049;
12585
+ break;
12586
+ }
12587
+ switch(globalDevices[deviceAddr].fsr){
12588
+ case 0:
12589
+ fsr_text = "2g";
12590
+ break;
12591
+ case 1:
12592
+ fsr_text = "4g";
12593
+ break;
12594
+ case 2:
12595
+ fsr_text = "8g";
12596
+ break;
12597
+ case 3:
12598
+ fsr_text = "16g";
12599
+ break;
12600
+ }
12601
+
12602
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
12603
+ label++;
12604
+
12605
+ if('x_offset' in en_axis_data){
12606
+ 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)));
12607
+ }
12608
+ if('y_offset' in en_axis_data){
12609
+ 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)));
12610
+ }
12611
+ if('z_offset' in en_axis_data){
12612
+ 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)));
12613
+ }
12614
+ }
12615
+ var fft_concat_obj = {
12616
+ mode: mode,
12617
+ msg_type: msg_type,
12618
+ time_id: [
12619
+ String(globalDevices[deviceAddr].hour).padStart(2, '0'),
12620
+ String(globalDevices[deviceAddr].minute).padStart(2, '0'),
12621
+ ].join(':'),
12622
+ mac_address: deviceAddr,
12623
+ fsr: fsr_text,
12624
+ odr: globalDevices[deviceAddr].odr,
12625
+ temperature: globalDevices[deviceAddr].temperature,
12626
+ total_samples: label,
12627
+ fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / globalDevices[deviceAddr].expected_packets) * 100).toFixed(2) + '%',
12628
+ data: fft_concat
12629
+ };
12630
+ return fft_concat_obj;
12631
+ }
12632
+ },
12681
12633
  'parse_fly': (frame) => {
12682
12634
  let frame_data = {};
12683
12635
  switch(frame[16]){
@@ -14562,12 +14514,142 @@ function sensor_types(parent){
14562
14514
  parsed.data = {error: 'Error found, Load cell comm error'};
14563
14515
  return parsed;
14564
14516
  }
14565
- return {
14566
- weight: signInt(d.slice(8, 12).reduce(msbLsb), 32) / 100
14567
- };
14517
+ let firmware = d[1];
14518
+ if(firmware > 4){
14519
+ let unit = 'Lb';
14520
+ switch(d[12]){
14521
+ case 1:
14522
+ unit = 'Lb';
14523
+ break;
14524
+ case 2:
14525
+ unit = 'Kg';
14526
+ break;
14527
+ }
14528
+ return{
14529
+ weight: signInt(d.slice(8, 12).reduce(msbLsb), 32) / 100,
14530
+ unit: unit,
14531
+ raw_adc: signInt(d.slice(13, 17).reduce(msbLsb), 32),
14532
+ weight_factor_mult: signInt(d.slice(17, 21).reduce(msbLsb), 32)
14533
+ }
14534
+ }
14535
+ else {
14536
+ return {
14537
+ weight: signInt(d.slice(8, 12).reduce(msbLsb), 32) / 100
14538
+ };
14539
+ }
14568
14540
  },
14569
14541
  'parse_fly': (frame) => {
14570
- if(frame[2] > 3){
14542
+ if(frame[2] > 5){
14543
+ let date = [
14544
+ String(frame.slice(20, 22).reduce(msbLsb)),
14545
+ String(frame[22]).padStart(2, '0'),
14546
+ String(frame[23]).padStart(2, '0')
14547
+ ].join('-');
14548
+ let time = [
14549
+ String(frame[24]).padStart(2, '0'),
14550
+ String(frame[25]).padStart(2, '0'),
14551
+ String(frame[26]).padStart(2, '0')
14552
+ ].join(':');
14553
+ let screen_on_time = "always_off";
14554
+ switch(frame[27]){
14555
+ case 0:
14556
+ screen_on_time = "always_off";
14557
+ break;
14558
+ case 255:
14559
+ screen_on_time = "always_on";
14560
+ break;
14561
+ default:
14562
+ screen_on_time = frame[27] + "Sec";
14563
+ break;
14564
+ }
14565
+ let unit = "Lb";
14566
+ switch(frame[28]){
14567
+ case 1:
14568
+ unit = "Lb";
14569
+ break;
14570
+ case 2:
14571
+ unit = "Kg";
14572
+ break;
14573
+ }
14574
+ return {
14575
+ 'firmware': frame[2],
14576
+ 'calibration_tare': frame.slice(12, 16).reduce(msbLsb),
14577
+ 'tare_counter': frame.slice(16, 20).reduce(msbLsb),
14578
+ 'timestamp': date + "T" + time,
14579
+ 'screen_on_time': screen_on_time,
14580
+ 'weight_unit': unit,
14581
+ 'calibration_factor': frame.slice(29, 33).reduce(msbLsb),
14582
+ 'hardware_id': frame.slice(33, 36),
14583
+ 'report_rate': frame.slice(36, 40).reduce(msbLsb) + "Sec",
14584
+ 'tx_life_counter': frame.slice(40, 44).reduce(msbLsb),
14585
+ 'machine_values': {
14586
+ 'firmware': frame[2],
14587
+ 'calibration_tare': frame.slice(12, 16),
14588
+ 'tare_counter': frame.slice(16, 20),
14589
+ 'timestamp': date + "T" + time,
14590
+ 'screen_on_time': screen_on_time,
14591
+ 'weight_unit': unit,
14592
+ 'calibration_factor': frame.slice(29, 33),
14593
+ 'hardware_id': frame.slice(33, 36),
14594
+ 'report_rate': frame.slice(36, 40),
14595
+ 'tx_life_counter': frame.slice(40, 44)
14596
+ }
14597
+ }
14598
+ } else if(frame[2] > 4){
14599
+ let date = [
14600
+ String(frame.slice(20, 22).reduce(msbLsb)),
14601
+ String(frame[22]).padStart(2, '0'),
14602
+ String(frame[23]).padStart(2, '0')
14603
+ ].join('-');
14604
+ let time = [
14605
+ String(frame[24]).padStart(2, '0'),
14606
+ String(frame[25]).padStart(2, '0'),
14607
+ String(frame[26]).padStart(2, '0')
14608
+ ].join(':');
14609
+ let screen_on_time = "always_off";
14610
+ switch(frame[27]){
14611
+ case 0:
14612
+ screen_on_time = "always_off";
14613
+ break;
14614
+ case 255:
14615
+ screen_on_time = "always_on";
14616
+ break;
14617
+ default:
14618
+ screen_on_time = frame[27] + "Sec";
14619
+ break;
14620
+ }
14621
+ let unit = "Lb";
14622
+ switch(frame[28]){
14623
+ case 1:
14624
+ unit = "Lb";
14625
+ break;
14626
+ case 2:
14627
+ unit = "Kg";
14628
+ break;
14629
+ }
14630
+ return {
14631
+ 'firmware': frame[2],
14632
+ 'calibration_tare': frame.slice(12, 16).reduce(msbLsb),
14633
+ 'tare_counter': frame.slice(16, 20).reduce(msbLsb),
14634
+ 'timestamp': date + "T" + time,
14635
+ 'screen_on_time': screen_on_time,
14636
+ 'weight_unit': unit,
14637
+ 'hardware_id': frame.slice(29, 32),
14638
+ 'report_rate': frame.slice(32, 36).reduce(msbLsb) + "Sec",
14639
+ 'tx_life_counter': frame.slice(36, 40).reduce(msbLsb),
14640
+ 'machine_values': {
14641
+ 'firmware': frame[2],
14642
+ 'calibration_tare': frame.slice(12, 16),
14643
+ 'tare_counter': frame.slice(16, 20),
14644
+ 'timestamp': date + "T" + time,
14645
+ 'screen_on_time': screen_on_time,
14646
+ 'weight_unit': unit,
14647
+ 'hardware_id': frame.slice(29, 32),
14648
+ 'report_rate': frame.slice(32, 36),
14649
+ 'tx_life_counter': frame.slice(36, 40)
14650
+ }
14651
+ }
14652
+ }else if(frame[2] == 4){
14571
14653
  let date = [
14572
14654
  String(frame.slice(20, 22).reduce(msbLsb)),
14573
14655
  String(frame[22]).padStart(2, '0'),