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