From 413a928de193b84a6b0b1780e87cf5e5c8b63035 Mon Sep 17 00:00:00 2001 From: YunHorn Technology Date: Mon, 30 Dec 2024 23:28:31 +0800 Subject: [PATCH] fix door jam profile saving issue --- STM32CubeIDE/Release/WLE5CC_NODE_STS.elf | Bin 167072 -> 167072 bytes STS/Core/Inc/yunhorn_sts_sensors.h | 2 +- STS/Core/Src/yunhorn_sts_process.c | 19 +- STS/TOF/App/app_tof_peoplecount.c | 2 +- hk_as923_decoder.js | 295 ++++++++++++++++++++++- 5 files changed, 305 insertions(+), 13 deletions(-) diff --git a/STM32CubeIDE/Release/WLE5CC_NODE_STS.elf b/STM32CubeIDE/Release/WLE5CC_NODE_STS.elf index 1c13d3258599a7436930848ec3d87e9a4a015b45..cfbb94a159eb838fc11e44ba1caf132aa1bf269d 100644 GIT binary patch delta 37643 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 oA-4CT3z&Th1&yJKcDA3=ggUN&YZdJ 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 KqJEY55&J)YL*O$2 diff --git a/STS/Core/Inc/yunhorn_sts_sensors.h b/STS/Core/Inc/yunhorn_sts_sensors.h index 37818a9..11605e3 100644 --- a/STS/Core/Inc/yunhorn_sts_sensors.h +++ b/STS/Core/Inc/yunhorn_sts_sensors.h @@ -164,7 +164,7 @@ typedef struct sts_cfg_nvm { uint8_t p[STS_CFG_PCFG_SIZE]; uint8_t color_occupy_vacant; // occupy color and vacant color define, C_OCCUPY<<4|C_VACANT - uint8_t reserve03; + uint8_t sts_door_jam_profile; uint8_t sensor_install_height_in_10cm; uint8_t alarm_parameter05; uint8_t alarm_mute_reset_timer_in_10sec; //60(0x3C) sec alarm_mute_or_reset_expire_timer_in_sec diff --git a/STS/Core/Src/yunhorn_sts_process.c b/STS/Core/Src/yunhorn_sts_process.c index fb3ec65..35f4738 100644 --- a/STS/Core/Src/yunhorn_sts_process.c +++ b/STS/Core/Src/yunhorn_sts_process.c @@ -109,8 +109,8 @@ volatile sts_cfg_nvm_t sts_cfg_nvm = { #endif }, // above 20 bytes 0x20, // color occupy (red:2) | color vacant (green:1) or other 0x20 occupy(red:2) | color vacant (dark:0) for ATAL-HK 20241230 - 0x00, //reserve3 - 0x20, //sensor install height in dm =10 cm, default 32*10=320cm, 3.2meter + 0x06, // sts_door_jam_profile for O6T + 0x20, // sensor install height in dm =10 cm, default 32*10=320cm, 3.2meter 0x00, //reserve5 alarm_parameter05 0x06, //reserve6 alarm_mute_or_reset_expire_timer_in_10sec, 60 seconds @@ -1099,6 +1099,11 @@ void USER_APP_AUTO_RESPONDER_Parse(uint8_t *parse_buffer, uint8_t parse_buffer_s STS_SENSOR_Function_Test_Process(); #if defined(STS_T6) ppc_cfg_parameter_update(); + sts_cfg_nvm.sensor_install_height_in_10cm = sts_sensor_install_height/100; //in 10 cm, say 4500mm=450cm=45 dm + sts_cfg_nvm.sts_door_jam_profile = sts_door_jam_profile; + APP_LOG(TS_OFF, VLEVEL_M, "\n STS CFG NVM -> SENSOR INSTALL HEIGHT STORED = %d dm(10cm)\n", sts_cfg_nvm.sensor_install_height_in_10cm); + OnStoreSTSCFGContextRequest(); + #endif break; @@ -1126,6 +1131,7 @@ void USER_APP_AUTO_RESPONDER_Parse(uint8_t *parse_buffer, uint8_t parse_buffer_s if (range_distance == 0 ) { sts_cfg_nvm.sensor_install_height_in_10cm = sts_sensor_install_height/100; //in 10 cm, say 4500mm=450cm=45 dm + APP_LOG(TS_OFF, VLEVEL_M, "\n STS CFG NVM -> SENSOR INSTALL HEIGHT STORED = %d dm(10cm)\n", sts_cfg_nvm.sensor_install_height_in_10cm); OnStoreSTSCFGContextRequest(); outbuf[i++] = (uint8_t)(2); //two bytes for distance @@ -1607,7 +1613,7 @@ void OnStoreSTSCFGContextRequest(void) } to_store__value[i++] = sts_cfg_nvm.color_occupy_vacant; - to_store__value[i++] = sts_cfg_nvm.reserve03; + to_store__value[i++] = sts_cfg_nvm.sts_door_jam_profile; to_store__value[i++] = sts_cfg_nvm.sensor_install_height_in_10cm; to_store__value[i++] = sts_cfg_nvm.alarm_parameter05; to_store__value[i++] = sts_cfg_nvm.alarm_mute_reset_timer_in_10sec; @@ -1704,7 +1710,7 @@ void STS_REBOOT_CONFIG_Init(void) } sts_cfg_nvm.color_occupy_vacant =(uint8_t)nvm_store_value[NVM_RESERVE02]; - sts_cfg_nvm.reserve03 =(uint8_t)nvm_store_value[NVM_RESERVE03]; + sts_cfg_nvm.sts_door_jam_profile =(uint8_t)nvm_store_value[NVM_RESERVE03]; sts_cfg_nvm.sensor_install_height_in_10cm =(uint8_t)nvm_store_value[NVM_SENSOR_INSTALL_HEIGHT]; sts_cfg_nvm.alarm_parameter05 =(uint8_t)nvm_store_value[NVM_ALARM_PARAMETER05]; sts_cfg_nvm.alarm_mute_reset_timer_in_10sec = (uint8_t)nvm_store_value[NVM_ALARM_MUTE_RESET_TIMER]; @@ -1788,6 +1794,7 @@ void OnRestoreSTSCFGContextProcess(void) sts_work_mode = sts_cfg_nvm.work_mode; sts_service_mask = sts_cfg_nvm.sts_service_mask; + sts_door_jam_profile = sts_cfg_nvm.sts_door_jam_profile; sts_color_occupy_vacant = sts_cfg_nvm.color_occupy_vacant; APP_LOG(TS_OFF, VLEVEL_M, "\r\n Color Occupy =%02x, VACANT =%02x \r\n",((sts_color_occupy_vacant>>4)&0x0f), sts_color_occupy_vacant&0x0f ); @@ -1868,8 +1875,8 @@ void ppc_cfg_parameter_update(void) ppc_cfg[DOOR_JAM_NOW].profile_name = DOOR_JAM_NOW; ppc_cfg[DOOR_JAM_NOW].distance_array_size = DISTANCES_ARRAY_SIZE; ppc_cfg[DOOR_JAM_NOW].max_distance = sts_sensor_install_height; - ppc_cfg[DOOR_JAM_NOW].min_distance = MAX(0,(sts_sensor_install_height-1800)); - ppc_cfg[DOOR_JAM_NOW].dist_threshold = MAX(500,sts_sensor_install_height - 500); + ppc_cfg[DOOR_JAM_NOW].min_distance = MAX((sts_sensor_install_height*0.2), 200); // 500 mm for toilet seat height + ppc_cfg[DOOR_JAM_NOW].dist_threshold = MAX((sts_sensor_install_height - 500),sts_sensor_install_height*0.8); ppc_cfg[DOOR_JAM_NOW].rows_of_SPADS = ROWS_OF_SPADS; ppc_cfg[DOOR_JAM_NOW].timing_budget = 100; // TIMING_BUDGET, in ms possible values [15, 20, 33, 50, 100, 200, 500] ppc_cfg[DOOR_JAM_NOW].distance_mode = 2; /* 1=short, 2=long, DISTANCE_MODE */ diff --git a/STS/TOF/App/app_tof_peoplecount.c b/STS/TOF/App/app_tof_peoplecount.c index d73847e..2b51115 100644 --- a/STS/TOF/App/app_tof_peoplecount.c +++ b/STS/TOF/App/app_tof_peoplecount.c @@ -794,7 +794,7 @@ int sts_tof_vl53lx_presence_detection_start(void) status = VL53L1X_CheckForDataReady(dev, &dataReady); HAL_Delay(1); wordData++; - if (wordData > 30) return -1; // 50 ms timer, so make this 60% to fail back + if (wordData > 500) return -1; // 50 ms timer, so make this 60% to fail back } status = 0; diff --git a/hk_as923_decoder.js b/hk_as923_decoder.js index 3467a07..c997766 100644 --- a/hk_as923_decoder.js +++ b/hk_as923_decoder.js @@ -4,12 +4,15 @@ // - variables contains the device variables e.g. {"calibration": "3.5"} (both the key / value are of type string) // The function must return an object, e.g. {"temperature": 22.5} // -// Yunhorn SmarToilets Sensor R20241104A01 +// Yunhorn SmarToilets Sensor R20241230A01 // function Decode(fPort, data, variables) { var data = {}; data.length = bytes.length; + var code2color = { "0": "Dark", "1": "Green", "2": "Red", "3": "Blue", "4": "Yellow", "5": "Pink", "6": "Cyan", "7": "White" }; + var code2workmode = { "0": "Network_mode", "1": "Wired_mode", "2": "Hall_element_mode", "3": "Motion_detect_mode", "4": "Dual_mode" }; + switch (fPort) { // RESPOND PORT --- bottom of swith fport // case 1: @@ -238,6 +241,9 @@ function Decode(fPort, data, variables) { data.Battery_Level = bytes[4] + " %"; data.Payload_Size = bytes[5]; data.Presence_State = (bytes[6] == 1) ? "Occupied" : "Vacant"; + data.Motion_state_PIR = (bytes[7] == 1) ? "Motion" : "Motionless"; v + data.Lamp_bar_color_code = bytes[8]; + data.Presence_Distance_cm = bytes[9] * 10 + " cm"; return { "Yunhorn_SmarToilets_data": data }; break; @@ -249,8 +255,21 @@ function Decode(fPort, data, variables) { data.battery_level = bytes[1] * 100 + "mV"; return { "Yunhorn_SmarToilets_data": data }; break; - + // Multi-Function Sensor for Hong Kong HA.gov.hk case 16: + data.LED_State = (bytes[0] & 0x7f === 0) ? "Off" : "On"; + data.MTM_Code_1 = bytes[1]; + data.MTM_Code_2 = bytes[2]; + data.HW_Code = bytes[3]; + data.Battery_Level = bytes[4] + " %"; + data.Payload_Size = bytes[5]; + //data.Presence_State = (bytes[6]==1)? "Occupied":"Vacant"; + data.MF_Fall = bytes[6]; + data.MF_Human_Movement = bytes[7]; + data.MF_Occupancy = bytes[8]; + data.MF_SOS_Alarm = bytes[9]; + return { "Yunhorn_SmarToilets_data": data }; + break; case 18: @@ -262,10 +281,64 @@ function Decode(fPort, data, variables) { break; + case 19: + data.header_board_led = bytes[0] & 0x7f; + data.header_mtm1 = bytes[1]; + data.header_mtm2 = bytes[2]; + data.header_fw = bytes[3]; + data.header_battery_level = bytes[4] + " %"; + data.payload_size = bytes[5]; + data.payload_type = bytes[6]; + switch (bytes[6]) // fall/movement/occupancy/sos status + { + case 0x01: + data.fhmos_state_fall = bytes[7]; + data.fhmos_state_human_movement = bytes[8]; + data.fhmos_state_occupancy = bytes[9]; + data.fhmos_state_sosbutton = bytes[10]; + data.lamp_bar_color = bytes[11]; + data.sensor1_state = bytes[12]; + data.sensor2_state = bytes[13]; + data.sensor3_PIR_state = bytes[14]; + break; + case 0x02: // fall gesture map + data.fhmos_gesture_head_height_cm = bytes[7]; + data.fhmos_gesture_head_x_y = bytes[8]; + data.fhmos_gesture_map1 = String.fromCharCode(bytes[9]); + data.fhmos_gesture_map2 = String.fromCharCode(bytes[10]); + data.fhmos_gesture_map3 = String.fromCharCode(bytes[11]); + data.fhmos_gesture_map4 = String.fromCharCode(bytes[12]); + data.fhmos_gesture_map5 = String.fromCharCode(bytes[13]); + data.fhmos_gesture_map6 = String.fromCharCode(bytes[14]); + data.fhmos_gesture_map7 = String.fromCharCode(bytes[15]); + data.fhmos_gesture_map8 = String.fromCharCode(bytes[16]); + var my_time_zone = 8 * 60 * 60; // (8*60*60) + data.fhmos_fall_event_utc_time = bytes[17] << 24 | bytes[18] << 16 | bytes[19] << 8 | bytes[20]; + data.fhmos_fall_event_time = data.fhmos_fall_event_utc_time + my_time_zone; + var dev_date = new Date(data.fhmos_fall_event_time * 1000); + data.fhmos_fall_event_time_stamp = dev_date.getHours() + ":" + dev_date.getMinutes(); + data.fhmos_fall_event_date_stamp = dev_date.getDate() + "." + (dev_date.getMonth() + 1) + "." + dev_date.getFullYear(); + + break; + case 0x03: // Background mask off map + data.fhmos_gesture_map1 = String.fromCharCode(bytes[7]); + data.fhmos_gesture_map2 = String.fromCharCode(bytes[8]); + data.fhmos_gesture_map3 = String.fromCharCode(bytes[9]); + data.fhmos_gesture_map4 = String.fromCharCode(bytes[10]); + data.fhmos_gesture_map5 = String.fromCharCode(bytes[11]); + data.fhmos_gesture_map6 = String.fromCharCode(bytes[12]); + data.fhmos_gesture_map7 = String.fromCharCode(bytes[13]); + data.fhmos_gesture_map8 = String.fromCharCode(bytes[14]); + break; + } + return { "Yunhorn_SmarToilets_data": data }; + + break; + // Heart-beat for STS-O6 occupancy sensor case 17: // STS-O7 Fall detection sensor - case 19: + case 21: { data.BoardLED = ((bytes[0] & 0x7F) === 0x01) ? "ON" : "OFF"; @@ -338,6 +411,16 @@ function Decode(fPort, data, variables) { case 0x05: data.workmode = "Uni_Mode"; break; + case 0x06: + data.workmode = "STS_REMOTE_REED_RSS_MODE"; + break; + case 0x07: + data.workmode = "STS_DUAL_RSS_MODE"; + break; + + case 0x08: + data.workmode = "STS_TOF_LMZ_RSS_MODE" + break; default: data.workmode = "Unknown Mode"; break; @@ -445,6 +528,18 @@ function Decode(fPort, data, variables) { case 20: break; + // STS-R6 Weight Scale Sensor + case 27: + data.LED_State = (bytes[0] & 0x7f === 0) ? "Off" : "On"; + data.MTM_Code_1 = bytes[1]; + data.MTM_Code_2 = bytes[2]; + data.HW_Code = bytes[3]; + data.Battery_Level = bytes[4] + " %"; + data.Payload_Size = bytes[5]; + data.Weight_g = (bytes[6] << 24 | bytes[7]) << 16 | bytes[8] << 8 + bytes[9] + bytes[10]; + data.Weight_g = (bytes[6] << 24 | bytes[7]) << bytes[8] + bytes[9]; + return { "Yunhorn_SmarToilets_data": data }; + break; @@ -609,6 +704,12 @@ function Decode(fPort, data, variables) { // respond port case 1: switch (bytes[0]) { + //AC CODE RESPONSE + case 0x41: + if ((bytes[1] == 0x43) && (data.length == 22)) + data.RFAC_RESULT = "SUCCESS"; + break; + // NVM config 'C' case 0x43: // report current nvm config @@ -677,7 +778,90 @@ function Decode(fPort, data, variables) { data.Distance_unit = "mm"; break; + // G Fall down Gesture bitmap REPORT + case 0x47: + data.head_level_cm = bytes[7]; + data.head_coordination = "X: " + bytes[8] / 8 + " Y:" + bytes[8] % 8; + var mmm = bytes[11]; + var con = 0x30; + var matrix0 = " [ "; + for (i = 0; i < 8; i++) { + con += ((mmm >> i) & 0x01); + matrix0 += (String.fromCharCode(con) + "__"); + con = 0x30; + } + data.matrix01 = matrix0; + mmm = bytes[12]; + var con = 0x30; + var matrix0 = " [ "; + for (i = 0; i < 8; i++) { + con += ((mmm >> i) & 0x01); + matrix0 += (String.fromCharCode(con) + "__"); + con = 0x30; + } + data.matrix02 = matrix0; + mmm = bytes[13]; + var con = 0x30; + var matrix0 = " [ "; + for (i = 0; i < 8; i++) { + con += ((mmm >> i) & 0x01); + matrix0 += (String.fromCharCode(con) + "__"); + con = 0x30; + } + data.matrix03 = matrix0; + mmm = bytes[14]; + var con = 0x30; + var matrix0 = " [ "; + for (i = 0; i < 8; i++) { + con += ((mmm >> i) & 0x01); + matrix0 += (String.fromCharCode(con) + "__"); + con = 0x30; + } + data.matrix04 = matrix0; + + mmm = bytes[15]; + var con = 0x30; + var matrix0 = " [ "; + for (i = 0; i < 8; i++) { + con += ((mmm >> i) & 0x01); + matrix0 += (String.fromCharCode(con) + "__"); + con = 0x30; + } + data.matrix05 = matrix0; + + mmm = bytes[16]; + var con = 0x30; + var matrix0 = " [ "; + for (i = 0; i < 8; i++) { + con += ((mmm >> i) & 0x01); + matrix0 += (String.fromCharCode(con) + "__"); + con = 0x30; + } + data.matrix06 = matrix0; + + mmm = bytes[17]; + var con = 0x30; + var matrix0 = " [ "; + for (i = 0; i < 8; i++) { + con += ((mmm >> i) & 0x01); + matrix0 += (String.fromCharCode(con) + "__"); + con = 0x30; + } + data.matrix07 = matrix0; + + mmm = bytes[18]; + var con = 0x30; + var matrix0 = " [ "; + for (i = 0; i < 8; i++) { + con += ((mmm >> i) & 0x01); + matrix0 += (String.fromCharCode(con) + "__"); + con = 0x30; + } + data.matrix08 = matrix0; + + return + break; // LoRa Class 'L' case 0x4c: // LoRaWAN Class A/B/C @@ -742,6 +926,12 @@ function Decode(fPort, data, variables) { } } + break; + case 6: + data.P_cmd = "Change Lamp Bar color config"; + data.workmode = code2workmode[bytes[3] - 0x30]; + data.color_occupy = code2color[bytes[4] - 0x30]; + data.color_vacant = code2color[bytes[5] - 0x30]; break; case 7: if (bytes[3] === 0x46) { @@ -823,12 +1013,107 @@ function Decode(fPort, data, variables) { data.sts_verion = bytes[3]; data.sts_hw_ver = bytes[4]; data.battery_level = bytes[5]; - if ((bytes[6] === 0x03)) { // report sensor install height - data.sts_sensor_install_height = (bytes[7] << 8 | bytes[8]); + if ((bytes[6] === 0x0C) || (bytes[6] === 0x04)) { // report sensor install height and bitmap + data.sts_sensor_chip_model_type_ID = (bytes[7] << 8 | bytes[8]); + if ((bytes[7] === 0xF0) && (bytes[8] === 0x0C)) { + data.sts_sensor_chip_model_type = "VL53L8X"; + } + else if ((bytes[7] === 0xEA) & (bytes[8] === 0xCC)) { + data.sts_sensor_chip_model_type = "VL53L1X"; + } + else if ((bytes[7] === 0xEE) & (bytes[8] === 0xAA)) { + data.sts_sensor_chip_model_type = "VL53L0X"; + } + + data.sts_sensor_install_height = (bytes[9] << 8 | bytes[10]); data.sts_sensor_install_height_unit = "mm"; + //data.maskoff_bitmap= String.fromCharCode(bytes[11])+String.fromCharCode(bytes[12])+String.fromCharCode(bytes[13])+String.fromCharCode(bytes[14])+String.fromCharCode(bytes[15])+String.fromCharCode(bytes[16])+String.fromCharCode(bytes[17])+String.fromCharCode(bytes[18]); + if (bytes[6] === 0x0c) { + var mmm = bytes[11]; + var con = 0x30; + var matrix0 = " [ "; + for (i = 0; i < 8; i++) { + con += ((mmm >> i) & 0x01); + matrix0 += (String.fromCharCode(con) + "__"); + con = 0x30; + } + data.matrix01 = matrix0; + mmm = bytes[12]; + var con = 0x30; + var matrix0 = " [ "; + for (i = 0; i < 8; i++) { + con += ((mmm >> i) & 0x01); + matrix0 += (String.fromCharCode(con) + "__"); + con = 0x30; + } + data.matrix02 = matrix0; + + mmm = bytes[13]; + var con = 0x30; + var matrix0 = " [ "; + for (i = 0; i < 8; i++) { + con += ((mmm >> i) & 0x01); + matrix0 += (String.fromCharCode(con) + "__"); + con = 0x30; + } + data.matrix03 = matrix0; + mmm = bytes[14]; + var con = 0x30; + var matrix0 = " [ "; + for (i = 0; i < 8; i++) { + con += ((mmm >> i) & 0x01); + matrix0 += (String.fromCharCode(con) + "__"); + con = 0x30; + } + data.matrix04 = matrix0; + + mmm = bytes[15]; + var con = 0x30; + var matrix0 = " [ "; + for (i = 0; i < 8; i++) { + con += ((mmm >> i) & 0x01); + matrix0 += (String.fromCharCode(con) + "__"); + con = 0x30; + } + data.matrix05 = matrix0; + + mmm = bytes[16]; + var con = 0x30; + var matrix0 = " [ "; + for (i = 0; i < 8; i++) { + con += ((mmm >> i) & 0x01); + matrix0 += (String.fromCharCode(con) + "__"); + con = 0x30; + } + data.matrix06 = matrix0; + + mmm = bytes[17]; + var con = 0x30; + var matrix0 = " [ "; + for (i = 0; i < 8; i++) { + con += ((mmm >> i) & 0x01); + matrix0 += (String.fromCharCode(con) + "__"); + con = 0x30; + } + data.matrix07 = matrix0; + + mmm = bytes[18]; + var con = 0x30; + var matrix0 = " [ "; + for (i = 0; i < 8; i++) { + con += ((mmm >> i) & 0x01); + matrix0 += (String.fromCharCode(con) + "__"); + con = 0x30; + } + data.matrix08 = matrix0; + } + } + else if ((bytes[6] === 0x58)) { data.sts_Test_Result = "### Motion Sensor Not Detected ###"; + } else if ((bytes[6] === 0x78)) { + data.sts_Test_Result = "### Motion Sensor Detected, Yet Not Stable ###"; } else if ((bytes[6] === 0x0E)) //result length, 10 rss bytes, 4 distance bytes { data.sts_Test_Result = "Motion Sensor Test Result:";