@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.
- package/lib/WirelessGateway.js +836 -754
- package/package.json +1 -1
- package/wireless.html +157 -7
- package/wireless.js +29 -0
package/lib/WirelessGateway.js
CHANGED
|
@@ -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]
|
|
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
|
|
9555
|
-
'hardware_id': frame.slice(
|
|
9556
|
-
'report_rate': frame.slice(
|
|
9557
|
-
'tx_life_counter': frame.slice(
|
|
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
|
-
'
|
|
9734
|
-
'
|
|
9735
|
-
'
|
|
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
|
-
}
|
|
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){
|
|
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
|
-
|
|
10378
|
-
|
|
10379
|
-
|
|
10380
|
-
|
|
10381
|
-
|
|
10382
|
-
|
|
10383
|
-
|
|
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
|
-
|
|
10405
|
-
|
|
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
|
-
|
|
10410
|
-
|
|
10411
|
-
|
|
10412
|
-
|
|
10413
|
-
|
|
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
|
-
|
|
10424
|
-
|
|
10425
|
-
|
|
10426
|
-
|
|
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
|
-
|
|
10442
|
-
|
|
10443
|
-
|
|
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
|
-
|
|
10984
|
-
|
|
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
|
-
|
|
10993
|
-
|
|
10994
|
-
|
|
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
|
-
|
|
11001
|
-
|
|
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
|
-
|
|
11025
|
-
data
|
|
11026
|
-
|
|
11027
|
-
|
|
11028
|
-
|
|
11029
|
-
|
|
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
|
-
|
|
11034
|
-
|
|
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
|
-
|
|
11039
|
-
|
|
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
|
-
|
|
11044
|
-
|
|
11045
|
-
|
|
11046
|
-
|
|
11047
|
-
|
|
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
|
-
|
|
11057
|
-
|
|
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
|
-
|
|
11127
|
-
|
|
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
|
-
|
|
11817
|
-
|
|
11818
|
-
|
|
11819
|
-
if
|
|
11820
|
-
|
|
11821
|
-
console.log('
|
|
11822
|
-
|
|
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
|
-
|
|
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
|
-
|
|
11867
|
-
|
|
11868
|
-
|
|
11869
|
-
|
|
11870
|
-
|
|
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
|
-
|
|
11885
|
-
|
|
11886
|
-
|
|
11887
|
-
|
|
11888
|
-
|
|
11889
|
-
|
|
11890
|
-
|
|
11891
|
-
|
|
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
|
-
|
|
12460
|
-
|
|
12461
|
-
|
|
12462
|
-
|
|
12463
|
-
|
|
12464
|
-
|
|
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
|
-
|
|
12487
|
-
|
|
12488
|
-
|
|
12489
|
-
|
|
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
|
-
|
|
12506
|
-
|
|
12507
|
-
|
|
12508
|
-
|
|
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
|
-
|
|
12524
|
-
|
|
12525
|
-
|
|
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
|
-
|
|
14566
|
-
|
|
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] >
|
|
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'),
|