diff --git a/.project b/.project new file mode 100644 index 0000000..0be5481 --- /dev/null +++ b/.project @@ -0,0 +1,11 @@ + + + STS_O7 + + + + + + + + diff --git a/AS923_HK_DECODER.js b/AS923_HK_DECODER.js index aa41973..a1ab8f1 100644 --- a/AS923_HK_DECODER.js +++ b/AS923_HK_DECODER.js @@ -6,6 +6,7 @@ // for Yunhorn SmarToilets STS-O7 Occupancy/Fall Detection/Over stay sensor function Decode(fPort, data, variables) { var data = {}; + data.length = bytes.length; if ((fPort === 10)) { // STS_O2_O6 V3 version 2023,pixel-network version switch (bytes[0]) { case 0x00: @@ -86,8 +87,12 @@ function Decode(fPort, data, variables) { // For NC(Normal Closed states //data.Sensor1_Door_Contact_Open = bytes[3]===1?"Door Closed":"Door Open"; - - data.Sensor2_Motion_Detected = bytes[3] === 0 ? "No Motion" : "Motion Detected"; + if (bytes[1] == 0x02) //Hall_element_mode + { + data.Sensor2_SOS_Pushed = bytes[3] === 0 ? "PushDown" : "RelaseUP"; + } else if (bytes[1] > 0x02) { + data.Sensor2_Motion_Detected = bytes[3] === 0 ? "No Motion" : "Motion Detected"; + } return { "Yunhorn_SmarToilets_data": data }; } @@ -172,10 +177,10 @@ function Decode(fPort, data, variables) { // For NC(Normal Closed states //data.Sensor1_Door_Contact_Open = bytes[3]===1?"Door Closed":"Door Open"; + data.Sensor2_Emergency_Button = bytes[4] === 0 ? "Alarm Push Down" : "No Alarm, Released"; + data.Sensor3_Motion_Detected = bytes[5] === 0 ? "No Motion" : "Motion Detected"; - data.Sensor2_Motion_Detected = bytes[4] === 0 ? "No Motion" : "Motion Detected"; - data.Sensor3_Emergency_Button = bytes[5] === 0 ? "Alarm Push Down" : "No Alarm, Released"; - data.length = bytes.length + data.length = bytes.length; if (data.length === 9) { data.Over_stay_state = (bytes[6] === 0) ? "False" : "True"; data.Over_Stay_duration_in_Seconds = (bytes[7] << 8 | bytes[8]); @@ -183,13 +188,14 @@ function Decode(fPort, data, variables) { return { "Yunhorn_SmarToilets_data": data }; } else if (data.length > 9) { - data.Sensor4 = (bytes[6] === 0) ? "No" : "Yes"; - data.Distance_in_mm = (bytes[7] << 8 | bytes[8]); - data.MotionLevel = (bytes[9] << 8 | bytes[10]); + data.Sensor4_ALARM_MUTE = (bytes[6] === 0) ? "Down Mute" : "No Mute"; + data.Sensor5_ALARM_RESET = (bytes[7] === 0) ? "Down RESET" : "NO Reset"; + data.Distance_in_mm = (bytes[8] << 8 | bytes[9]); + data.MotionLevel = (bytes[10] << 8 | bytes[11]); - data.Unconcious_State = (bytes[11] == 0) ? "False" : "True"; + data.Unconcious_State = (bytes[12] == 0) ? "False" : "True"; - switch (bytes[12]) { + switch (bytes[13]) { case 0x0: data.Fall_Down_Detected_State = "Presence_Normal"; break; @@ -212,26 +218,33 @@ function Decode(fPort, data, variables) { data.Fall_Down_Detected_State = "Presence_Normal"; break; } - data.OverStay_Detected_State = (bytes[13] == 0x0) ? "False" : "True"; - data.OverStay_Duration_in_Seconds = (bytes[14] << 8 | bytes[15]); - data.No_Movement_Duration_in_Seconds = (bytes[16] << 8 | bytes[17]); - data.Unconcious_Duration_in_Seconds = (bytes[16] << 8 | bytes[17]); - data.Fall_Down_Speed_in_m_per_s = (bytes[18]); - data.Fall_Down_Gravity_in_g = (bytes[19]); - data.SOS_PushDown_Stamp = (bytes[20] << 24 | bytes[21] << 16 | bytes[22] << 8 | bytes[23]); - var sos_start = new Date(1000 * data.SOS_PushDown_Stamp); - data.SOS_ReleaseUP_Stamp = (bytes[24] << 24 | bytes[25] << 16 | bytes[26] << 8 | bytes[27]); - var sos_stop = new Date(1000 * data.SOS_ReleaseUP_Stamp); - data.SOS_PushDown_Time = "[" + sos_start.getDate() + "." + (sos_start.getMonth() + 1) + "." + (sos_start.getFullYear()) + "] " + sos_start.getHours() + ":" + sos_start.getMinutes() + ":" + sos_start.getSeconds(); - data.SOS_ReleaseUP_Time = "[" + sos_stop.getDate() + "." + (sos_stop.getMonth() + 1) + "." + (sos_stop.getFullYear()) + "] " + sos_stop.getHours() + ":" + sos_stop.getMinutes() + ":" + sos_stop.getSeconds(); - - data.Fall_Down_Stamp = (bytes[28] << 24 | bytes[29] << 16 | bytes[30] << 8 | bytes[31]); - var fall_start = new Date(1000 * data.Fall_Down_Stamp); - data.Fall_RiseUp_Stamp = (bytes[32] << 24 | bytes[33] << 16 | bytes[34] << 8 | bytes[35]); - var fall_stop = new Date(1000 * data.Fall_RiseUp_Stamp); - data.Fall_Down_Time = "[" + fall_start.getDate() + "." + (fall_start.getMonth() + 1) + "." + (fall_start.getFullYear()) + "] " + fall_start.getHours() + ":" + fall_start.getMinutes() + ":" + fall_start.getSeconds(); - data.Fall_RiseUp_Time = "[" + fall_stop.getDate() + "." + (fall_stop.getMonth() + 1) + "." + (fall_stop.getFullYear()) + "] " + fall_stop.getHours() + ":" + fall_stop.getMinutes() + ":" + fall_stop.getSeconds(); + data.OverStay_Detected_State = (bytes[14] == 0x0) ? "False" : "True"; + data.OverStay_Duration_in_Seconds = (bytes[15] << 8 | bytes[16]); + data.No_Movement_Duration_in_Seconds = (bytes[17] << 8 | bytes[18]); + data.Unconcious_Duration_in_Seconds = (bytes[17] << 8 | bytes[18]); + data.Fall_Down_Speed_in_m_per_s = (bytes[19]); + data.Fall_Down_Gravity_in_g = (bytes[20]); + data.SOS_PushDown_Stamp = (bytes[21] << 24 | bytes[22] << 16 | bytes[23] << 8 | bytes[24]); + if (data.SOS_PushDown_Stamp != 0) { + var sos_start = new Date(1000 * data.SOS_PushDown_Stamp); + data.SOS_PushDown_Time = "[" + sos_start.getDate() + "." + (sos_start.getMonth() + 1) + "." + (sos_start.getFullYear()) + "] " + sos_start.getHours() + ":" + sos_start.getMinutes() + ":" + sos_start.getSeconds(); + } else data.SOS_PushDown_Time = "N/A"; + data.SOS_ReleaseUP_Stamp = (bytes[25] << 24 | bytes[26] << 16 | bytes[27] << 8 | bytes[28]); + if (data.SOS_ReleaseUP_Stamp != 0) { + var sos_stop = new Date(1000 * data.SOS_ReleaseUP_Stamp); + data.SOS_ReleaseUP_Time = "[" + sos_stop.getDate() + "." + (sos_stop.getMonth() + 1) + "." + (sos_stop.getFullYear()) + "] " + sos_stop.getHours() + ":" + sos_stop.getMinutes() + ":" + sos_stop.getSeconds(); + } else data.SOS_ReleaseUP_Time = "N/A"; + data.Fall_Down_Stamp = (bytes[29] << 24 | bytes[30] << 16 | bytes[31] << 8 | bytes[32]); + if (data.Fall_Down_Stamp != 0) { + var fall_start = new Date(1000 * data.Fall_Down_Stamp); + data.Fall_Down_Time = "[" + fall_start.getDate() + "." + (fall_start.getMonth() + 1) + "." + (fall_start.getFullYear()) + "] " + fall_start.getHours() + ":" + fall_start.getMinutes() + ":" + fall_start.getSeconds(); + } else data.Fall_RiseUp_Stamp = "N/A"; + data.Fall_RiseUp_Stamp = (bytes[33] << 24 | bytes[34] << 16 | bytes[35] << 8 | bytes[36]); + if (data.Fall_RiseUp_Stamp != 0) { + var fall_stop = new Date(1000 * data.Fall_RiseUp_Stamp); + data.Fall_RiseUp_Time = "[" + fall_stop.getDate() + "." + (fall_stop.getMonth() + 1) + "." + (fall_stop.getFullYear()) + "] " + fall_stop.getHours() + ":" + fall_stop.getMinutes() + ":" + fall_stop.getSeconds(); + } else data.Fall_RiseUp_Time = "N/A"; } return { "Yunhorn_SmarToilets_data": data }; } @@ -249,11 +262,39 @@ function Decode(fPort, data, variables) { var data = {}; data.length = bytes.length; - if (data.length === 4) { + if ((data.length === 4) && (bytes[0] == 0x52) && (bytes[1] = 0x46)) //RFAC + { + data.Request_Performed = "OK"; data.RFAC = "OK"; data.AC0 = bytes[0]; data.AC1 = bytes[1]; } + else if ((data.length === 4) && (bytes[0] === 0x50) && (bytes[1] === 0x31) && (bytes[2] === 0x31)) { + data.Work_Mode_Switch = "OK"; + switch (bytes[3] - 0x30) { + case 0x0: + data.workmode = "Network_mode"; + break; + case 0x01: + data.workmode = "Wired_Mode"; + break; + case 0x02: + data.workmode = "Hall_element_mode"; + break; + case 0x03: + data.workmode = "MotionDetect_mode"; + break; + case 0x04: + data.workmode = "Dual_mode"; + break; + case 0x05: + data.workmode = "Uni_Mode"; + break; + default: + data.workmode = "Unknown Mode"; + break; + } + } if ((bytes[0] === 0x59) && (bytes[1] === 0x44)) //Duration interval @@ -303,7 +344,7 @@ function Decode(fPort, data, variables) { data.rss_reserve04 = bytes[32]; data.reserve2 = bytes[33]; data.reserve3 = bytes[34]; - data.reserve4 = bytes[35]; + data.sensor_install_height = bytes[35] * 10 + " cm"; data.alarm_parameter05 = bytes[36]; data.alarm_mute_expire_timer = bytes[37]; @@ -373,6 +414,59 @@ function Decode(fPort, data, variables) { data.LocalTime_EST8 = "GMT+8: " + data.L_year + "/" + data.L_mon + "/" + data.L_day + " " + (data.L_hour + 8) + ":" + data.L_min + ":" + data.L_sec; } } + else if (bytes[0] === 0x50) { // P cmd report + if (data.length == 7) { + switch (bytes[3]) { + case 0x46: // F --- fall down & unconscious detection threshold + data.FALL_acceleration = (bytes[4] == 0x30 ? "Disabled" : ((bytes[4] - 0x30) * 10) + " mg/s2"); + data.FALL_depth_measure = (bytes[5] == 0x30 ? "Disabled" : ((bytes[5] - 0x30) * 10) + " cm"); + data.FALL_confirm_threshold = (bytes[6] == 0x30 ? "Disabled" : ((bytes[6] - 0x30) * 10) + " seconds"); + //data.FALL_reserved = (bytes[7]==0x0?"Disabled":((bytes[6]-0x30)*10)+" min"); + break; + } //switch + } + else if (data.length == 8) { + switch (bytes[3]) { + case 0x4f: // O -- over stay, onconscious, long stay + data.OMU_Motionless_duration_in_min = (bytes[4] == 0x30 ? "Disabled" : ((bytes[4] - 0x30)) + " Min"); + data.OMU_Long_Occupy_duration_in_Min = (bytes[5] == 0x30 ? "Disabled" : ((bytes[5] - 0x30) * 10) + " Min"); + data.OMU_Unconcious_Threshold = (bytes[6] == 0x30 ? "Disabled" : ((bytes[6] - 0x30) * 100) + "ml"); + data.OMU_Alarm_Mute_Reset_Timer = (bytes[7] == 0x30 ? "Disabled" : ((bytes[7] - 0x30) * 10) + " Seconds"); + break; + case 0x46: // F --- fall down & unconscious detection threshold + data.FALL_acceleration = (bytes[4] == 0x30 ? "Disabled" : ((bytes[4] - 0x30) * 10) + " mg/s2"); + data.FALL_depth_measure = (bytes[5] == 0x30 ? "Disabled" : ((bytes[5] - 0x30) * 10) + " cm"); + data.FALL_confirm_threshold = (bytes[6] == 0x30 ? "Disabled" : ((bytes[6] - 0x30) * 10) + " seconds"); + data.FALL_reserved = (bytes[7] == 0x30 ? "Disabled" : ((bytes[6] - 0x30) * 10) + " min"); + break; + } //switch + } else if (data.length == 11) { // P 1108201365 + data.RSS_SIMPLE_Start = ((bytes[3] - 0x30) * 100 + (bytes[4] - 0x30) * 10) + " cm"; + data.RSS_SIMPLE_Length = ((bytes[5] - 0x30) * 100 + (bytes[6] - 0x030) * 10) + " cm"; + data.RSS_SIMPLE_Threshold = ((bytes[7] - 0x30) * 1000 + (bytes[8] - 0x30) * 100) + " ml"; + data.RSS_SIMPLE_Gain = ((bytes[9] - 0x30) * 10 + (bytes[10] - 0x30)) + " %"; + } else if (data.length == 33) { // P 11 + data.RSS_FULL_Start = ((bytes[3] - 0x30) * 100 + (bytes[4] - 0x30) * 10) + " cm"; + data.RSS_FULL_Length = ((bytes[5] - 0x30) * 100 + (bytes[6] - 0x30) * 10) + " cm"; + data.RSS_FULL_Threshold = ((bytes[7] - 0x30) * 1000 + (bytes[8] - 0x30) * 100) + " ml"; + data.RSS_FULL_Gain = ((bytes[9] - 0x30) * 10 + (bytes[10] - 0x30)) + " %"; + data.RSS_FULL_Profile = (bytes[11] - 0x30); + data.RSS_FULL_Rate_Tracking = ((bytes[12] - 0x30) * 10 + (bytes[13] - 0x30)); + data.RSS_FULL_Rate_Presence = ((bytes[14] - 0x30) * 10 + (bytes[15] - 0x30)); + data.RSS_FULL_HWAAS = ((bytes[16] - 0x30) * 10 + (bytes[17] - 0x30)); + data.RSS_FULL_Num_Removed_PC = (bytes[18] - 0x30); + data.RSS_FULL_Inter_Deviation_Time_Const_in_Sec = ((bytes[19] - 0x30) + (bytes[20] - 0x30) * 0.1); + data.RSS_FULL_Inter_Fast_Cut_Off = ((bytes[21] - 0x30) * 10 + (bytes[22] - 0x30)); + data.RSS_FULL_Inter_Slow_Cut_Off = ((bytes[23] - 0x30) * 0.1 + (bytes[24] - 0x30) * 0.001); + data.RSS_FULL_Inter_Time_Const_in_Sec = ((bytes[25] - 0x30) * 10 + (bytes[26] - 0x30)); + data.RSS_FULL_Inter_Weight = ((bytes[27] - 0x30) + (bytes[28] - 0x30) * 0.1); + data.RSS_FULL_Output_Time_Const_in_Sec = ((bytes[29] - 0x30) + (bytes[30] - 0x30) * 0.1); + data.RSS_FULL_DownSampling_factor = (bytes[31] - 0x30); + data.RSS_FULL_Power_Saving_mode = (bytes[32] - 0x30); + + + } + } return { "Yunhorn_SmarToilets_data": data }; } -} +} \ No newline at end of file diff --git a/Core/Inc/main.h b/Core/Inc/main.h index cddfa5d..3e16249 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -99,9 +99,22 @@ void Error_Handler(void); #define HALL2_GPIO_Port GPIOA #define HALL2_EXTI_IRQn EXTI1_IRQn -#define HALL1_STATE HAL_GPIO_ReadPin(HALL1_GPIO_Port, HALL1_Pin) -#define HALL2_STATE HAL_GPIO_ReadPin(HALL2_GPIO_Port, HALL2_Pin) +#define HALL3_Pin GPIO_PIN_9 // ALARM MUTE PIN +#define HALL3_GPIO_Port GPIOA +#define HALL3_EXTI_IRQn EXTI9_5_IRQn +#define HALL4_Pin GPIO_PIN_10 // ALARM RESET PIN +#define HALL4_GPIO_Port GPIOA +#define HALL4_EXTI_IRQn EXTI15_10_IRQn + +#define ALARM_MUTE_Pin HALL3_Pin // ALARM MUTE BUTTON +#define ALARM_RESET_Pin HALL4_Pin // ALARM RESET BUTTON + + +#define HALL1_STATE HAL_GPIO_ReadPin(HALL1_GPIO_Port, HALL1_Pin) //DOOR CONTACT +#define HALL2_STATE HAL_GPIO_ReadPin(HALL2_GPIO_Port, HALL2_Pin) //SOS BUTTON +#define HALL3_STATE HAL_GPIO_ReadPin(HALL3_GPIO_Port, HALL3_Pin) //ALARM MUTE BUTTON +#define HALL4_STATE HAL_GPIO_ReadPin(HALL4_GPIO_Port, HALL4_Pin) //ALARM RESET BUTTON #else #define BUT1_Pin GPIO_PIN_0 diff --git a/Core/Inc/sts_lamp_bar.h b/Core/Inc/sts_lamp_bar.h index 601ec88..ba213eb 100644 --- a/Core/Inc/sts_lamp_bar.h +++ b/Core/Inc/sts_lamp_bar.h @@ -34,6 +34,10 @@ extern "C" { #define STS_Status_Door_Open (1) //Normal Close NC:Close **2024-07-15 changed #define STS_Status_SOS_Pushdown (0) //Normal Open NO:Open #define STS_Status_SOS_Release (1) //Normal Open NO:Close +#define STS_Status_Alarm_Mute_Pushdown (0) //Normal Open NO:Open +#define STS_Status_Alarm_Mute_Release (1) //Normal Open NO:Close# +#define STS_Status_Alarm_Reset_Pushdown (0) //Normal Open NO:Open +#define STS_Status_Alarm_Reset_Release (1) //Normal Open NO:Close# enum sts_lamp_color { STS_DARK = 0, //灭:0, Code 0x00 @@ -48,8 +52,17 @@ enum sts_lamp_color { STS_GREEN_DARK=0x10, //0b0001 0000 GREEN DARK STS_RED_DARK=0x20, //0b0010 0000, + STS_RED_GREEN=0x21, STS_RED_BLUE=0x23, //0b0010 0011 RED BLUE FLASH - STS_BLUE_DARK=0x30 //0b0011 0000 BLUE DARK + STS_BLUE_DARK=0x30, //0b0011 0000 BLUE DARK + STS_BLUE_GREEN=0x31, + + STS_GREENDARK=0x41, // GREEN FLASH 'A' + STS_REDDARK=0x42, // RED FLASH 'B' + STS_REDBLUE=0x43, // RED/BLUE FLASH 'C' + STS_BLUEDARK=0x44, // BLUE FLASH 'D' + STS_REDGREEN=0x45, // RED/GREEN FLASH 'E' + STS_BLUEGREEN=0x46 // BLUE/GREEN FLASH 'F' }; enum sts_oo_work_mode { diff --git a/Core/Inc/yunhorn_sts_prd_conf.h b/Core/Inc/yunhorn_sts_prd_conf.h index bc59c99..868044e 100644 --- a/Core/Inc/yunhorn_sts_prd_conf.h +++ b/Core/Inc/yunhorn_sts_prd_conf.h @@ -223,23 +223,31 @@ //#define YUNHORN_STS_M10_LORA_APP_DATA_PORT 9U //#define YUNHORN_STS_M10_LORA_APP_HTBT_PORT 9U -#define STS_IOC_IN_0 ((uint8_t)0x01) /* I/O Control sensor 1 */ -#define STS_IOC_IN_1 ((uint8_t)0x02) /* I/O Control sensor 2 */ -#define STS_IOC_IN_2 ((uint8_t)0x04) /* I/O Control sensor 3 */ -#define STS_IOC_IN_3 ((uint8_t)0x08) /* I/O Control sensor 4 */ +#define STS_IOC_IN_0 ((uint8_t)0x01) /* I/O Control sensor 1 */ // HALL-1 +#define STS_IOC_IN_1 ((uint8_t)0x02) /* I/O Control sensor 2 */ // HALL-2 +#define STS_IOC_IN_2 ((uint8_t)0x04) /* I/O Control sensor 3 */ // MOTION-1 +#define STS_IOC_IN_3 ((uint8_t)0x08) /* I/O Control sensor 4 */ // HALL-4 + #define STS_IOC_OUT_0 ((uint8_t)0x10) /* I/O Control out interface 1 */ #define STS_IOC_OUT_1 ((uint8_t)0x20) /* I/O Control out interface 2 */ #define STS_IOC_OUT_2 ((uint8_t)0x40) /* I/O Control out interface 3 */ #define STS_IOC_OUT_3 ((uint8_t)0x80) /* I/O Control out interface 4 */ -#define STS_IOC_MASK (0xFFu) /* I/O Control mask */ +#define STS_IOC_MASK_ALL (0xFF) /* I/O Control mask */ +#define STS_IOC_MASK_NONE (0x00) /* NONE enabled */ #define STS_IOC_IN_ALL (STS_IOC_IN_0|STS_IOC_IN_1 |STS_IOC_IN_2 |STS_IOC_IN_3) #define STS_IOC_OUT_ALL (STS_IOC_OUT_0|STS_IOC_OUT_1|STS_IOC_OUT_2|STS_IOC_OUT_3) #define IS_STS_LAMP_BAR_OUTPUT_ENABLE STS_IOC_OUT_0 #define IS_STS_RS485_OUTPUT_ENABLE STS_IOC_OUT_1 +#define STS_IOC_MODE_0_MASK STS_IOC_OUT_0 //NETWOR MODE, NO ON-BOARD INTERFACE, OUT LAMP BAR ENABLED +#define STS_IOC_MODE_1_MASK STS_IOC_IN_1 //WIRED MODE, ONE ON-BOARD INTEFACE ENABLE, NO LAMP BAR +#define STS_IOC_MODE_2_MASK STS_IOC_IN_0|STS_IOC_IN_1 //REEDSWITCH MODE, ONE ON-BOARD INTERFACE ENABLED, LAMP BAR ENABLED +#define STS_IOC_MODE_3_MASK STS_IOC_IN_2|STS_IOC_IN_1|STS_IOC_OUT_0 // RSS MODE, ONE ON-BOARD INTERFACE MOTION ENABLED, LAMP BAR ENABLED +#define STS_IOC_MODE_4_MASK STS_IOC_IN_0|STS_IOC_IN_1|STS_IOC_IN_2|STS_IOC_OUT_0|STS_IOC_OUT_1 //DUAL MODE +#define STS_IOC_MODE_5_MASK STS_IOC_IN_ALL|STS_IOC_OUT_ALL //UNI_MODE #define MajorVer 24U -#define MinorVer 07U -#define SubMinorVer 26U +#define MinorVer 8U +#define SubMinorVer 15U #define FirmwareVersion 3U #define YUNHORN_STS_MAX_NVM_CFG_SIZE 64U @@ -247,8 +255,8 @@ #define STS_O7_NVM_CFG_SIZE 32U #define STS_O7_CFG_PCFG_SIZE 20U -#define STS_O7_CFG_CMD_SIZE 30U -#define STS_O7_CFG_CMD_SHORT_LEN 8U +#define STS_O7_CFG_CMD_SIZE 33U +#define STS_O7_CFG_CMD_SHORT_LEN 11U #define STS_MODE_COLOR_CMD_LEN 5U #define sts_mtmcode1 0U @@ -265,8 +273,8 @@ #define sts_sendhtbtport (YUNHORN_STS_O6_LORA_APP_HTBT_PORT) #endif #ifdef STS_O7 -#define sts_senddataport (YUNHORN_STS_O6_LORA_APP_DATA_PORT) -#define sts_sendhtbtport (YUNHORN_STS_O6_LORA_APP_HTBT_PORT) +#define sts_senddataport (YUNHORN_STS_O7_LORA_APP_DATA_PORT) +#define sts_sendhtbtport (YUNHORN_STS_O7_LORA_APP_HTBT_PORT) #endif #if defined(STS_O6)||defined(STS_O7) #define sts_appctrlport (YUNHORN_STS_O7_USER_APP_CTRL_PORT) @@ -429,8 +437,8 @@ * Address range 0800 0000H - 0803 FFFFH Size: 0x0004 0000 */ -#define FLASH_USER_START_ADDR ((void *) 0x0803F800U) // Last 2kB of flash -#define FLASH_USER_CONFIG_SIZE ((void *) 0x000007FFU) //0x400=1KB=1024 +#define FLASH_USER_START_ADDR ((void *) 0x0803F800UL) // Last 2kB of flash +#define FLASH_USER_CONFIG_SIZE ((void *) 0x000007FFUL) //0x400=1KB=1024 #define FLASH_USER_END_ADDR (FLASH_USER_START_ADDR + FLASH_USER_CONFIG - 1) /* 2KB = 2048 = 0x800 End @ of user Flash area */ diff --git a/Core/Inc/yunhorn_sts_sensors.h b/Core/Inc/yunhorn_sts_sensors.h index 8ebbf36..60d5bef 100644 --- a/Core/Inc/yunhorn_sts_sensors.h +++ b/Core/Inc/yunhorn_sts_sensors.h @@ -50,7 +50,9 @@ enum cfg_cmd_order{ CFG_CMD7, CFG_CMD8, CFG_CMD9, - CFG_CMD10 + CFG_CMD10, CFG_CMD11, CFG_CMD12, CFG_CMD13, CFG_CMD14,CFG_CMD15, CFG_CMD16, CFG_CMD17, CFG_CMD18, CFG_CMD19, + CFG_CMD20, CFG_CMD21, CFG_CMD22, CFG_CMD23, CFG_CMD24,CFG_CMD25, CFG_CMD26, CFG_CMD27, CFG_CMD28, CFG_CMD29, + CFG_CMD30, CFG_CMD31, CFG_CMD32, CFG_CMD33, CFG_CMD34,CFG_CMD35, CFG_CMD36, CFG_CMD37, CFG_CMD38, CFG_CMD39 }; enum p_cmd_order{ P_CMD=0, //'P' //P_MTM_CODE, // #1 @@ -88,10 +90,12 @@ enum RSS_CFG_order{ #if defined(STS_O7)||defined(STS_O6) -enum sts_rss_config_t { - STS_RSS_CONFIG_DEFAULT=0, +enum sts_rss_config_update_t { + STS_RSS_CONFIG_NON=0, + STS_RSS_CONFIG_DEFAULT, STS_RSS_CONFIG_SIMPLE, - STS_RSS_CONFIG_FULL + STS_RSS_CONFIG_FULL, + STS_RSS_CONFIG_FALL_DETECTION }; enum sts_ctrl_cmd_type { @@ -166,7 +170,8 @@ typedef struct STS_OO_SensorStatusDataTypeDef uint8_t state_sensor1_on_off; /* reedswitch or hall element 0: open, 1: closed */ uint8_t state_sensor2_on_off; /* reedswitch or hall element 0: open, 1: closed */ uint8_t state_sensor3_on_off; /* motion RSS, pcr_sensor_on_off; 1: occupancy, 0: no occupancy */ - uint8_t state_sensor4_on_off; /* reserved_sensor_on_off sensor state */ + uint8_t state_sensor4_on_off; /* alarm mute button_on_off sensor state */ + uint8_t state_sensor5_on_off; /* alarm reset button_on_off sensor state */ uint16_t rss_presence_distance; // in mm uint8_t rss_presence_zone[10]; uint8_t rss_presence_zone_count[10]; @@ -208,6 +213,9 @@ typedef struct STS_OO_SensorStatusDataTypeDef uint32_t event_sensor3_fall_stop_time; uint32_t event_sensor3_fall_duration; + uint16_t event_sensor3_fall_distance; + uint16_t event_sensor3_fall_motionscore; + uint32_t event_sensor3_no_movement_start_time; uint32_t event_sensor3_no_movement_stop_time; uint32_t event_sensor3_no_movement_duration; @@ -217,11 +225,21 @@ typedef struct STS_OO_SensorStatusDataTypeDef uint32_t event_sensor3_unconcious_duration; uint32_t event_sensor4_start_time; /* reserved */ + uint32_t event_sensor4_start_timestamp; uint32_t event_sensor4_stop_time; + uint32_t event_sensor4_stop_timestamp; uint32_t event_sensor4_duration; uint8_t alarm_indictor_mute_state; + + + uint32_t event_sensor5_start_time; /* reserved */ + uint32_t event_sensor5_stop_time; + uint32_t event_sensor5_start_timestamp; + uint32_t event_sensor5_stop_timestamp; + uint32_t event_sensor5_duration; uint8_t alarm_indictor_reset_state; + } STS_OO_SensorStatusDataTypeDef; //#endif @@ -251,12 +269,12 @@ enum sts_sensor_result_t { typedef struct { - float p_dist_avg; - float p_dist_v; - float p_dist_standard; - float m_score_avg; - float roc_avg; - float roc_standard; + uint16_t p_dist_avg; + uint16_t p_dist_v; + uint16_t p_dist_standard; + uint16_t m_score_avg; + uint16_t roc_avg; + uint16_t roc_standard; uint8_t fall_rising; } STS_PRESENCE_Motion_Featuer_t; @@ -654,7 +672,7 @@ void OnStoreSTSCFGContextRequest(void); /** * @brief Read config from flash */ -void OnRestoreSTSCFGContextRequest(uint8_t *cfg_in_nvm); +void OnRestoreSTSCFGContextRequest(void *cfg_in_nvm); void STS_REBOOT_CONFIG_Init(void); @@ -679,10 +697,12 @@ void STS_YunhornSTSEventP8_Process(void); void OnSensor1StateChanged(void); void OnSensor2StateChanged(void); void OnSensor3StateChanged(void); -void OnSensor3AStateChanged(void); -void OnSensor3BStateChanged(void); -void OnSensor3CStateChanged(void); void OnSensor4StateChanged(void); + +void OnSensorRSS3AStateChanged(void); +void OnSensorRSS3BStateChanged(void); +void OnSensorRSS3CStateChanged(void); + uint32_t STS_Get_Date_Time_Stamp(void);//uint32_t *time_stamp, uint8_t *datetimestamp); void STS_SENSOR_MEMS_Reset(uint8_t cnt); @@ -732,12 +752,13 @@ void STS_MOTION_SENSOR_Enable_Wake_Up_Detection(void); void STS_MOTION_SENSOR_Initialization(void); */ -void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, size_t tlv_buf_size); +void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, uint8_t tlv_buf_size); void STS_SENSOR_Function_Test_Process(void); void STS_SENSOR_Distance_Test_Process(void); void STS_PRESENCE_SENSOR_Function_Test_Process(uint8_t *self_test_result, uint8_t count); void STS_PRESENCE_SENSOR_Distance_Measure_Process(void); +float KalmanFilter(float inData); /* USER CODE BEGIN Private defines */ /* diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c index 147e89a..1014ec6 100644 --- a/Core/Src/gpio.c +++ b/Core/Src/gpio.c @@ -52,15 +52,15 @@ void MX_GPIO_Init(void) /*Configure GPIO pin Output Level */ //HAL_GPIO_WritePin(GPIOB, LED1_Pin|LED2_Pin|PROB2_Pin|PROB1_Pin|LED3_Pin, GPIO_PIN_RESET); - HAL_GPIO_WritePin(GPIOB, LED1_Pin, GPIO_PIN_RESET); - HAL_GPIO_WritePin(GPIOA, A111_CS_N_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(A111_CS_N_GPIO_Port, A111_CS_N_Pin, GPIO_PIN_RESET); /*Configure GPIO pins : PBPin PBPin PBPin */ GPIO_InitStruct.Pin = LED1_Pin; //|LED2_Pin|LED3_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + GPIO_InitStruct.Pull = GPIO_PULLDOWN; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct); GPIO_InitStruct.Pin = MEMS_POWER_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; @@ -88,11 +88,11 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(A111_SENSOR_INTERRUPT_GPIO_Port, &GPIO_InitStruct); -#ifdef STS_O7 - GPIO_InitStruct.Pin = HALL1_Pin|HALL2_Pin; +#if defined(STS_O7)||defined(STS_O6)||defined(STS_O2) + GPIO_InitStruct.Pin = HALL1_Pin|HALL2_Pin|HALL3_Pin|HALL4_Pin; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); #else /*Configure GPIO pins : PAPin PAPin */ @@ -116,13 +116,19 @@ void MX_GPIO_Init(void) HAL_GPIO_Init(BUT3_GPIO_Port, &GPIO_InitStruct); #endif -#ifdef STS_O7 +#if defined(STS_O7)||defined(STS_O6)||defined(STS_O2) HAL_NVIC_SetPriority(HALL1_EXTI_IRQn, 15, 0); HAL_NVIC_EnableIRQ(HALL1_EXTI_IRQn); HAL_NVIC_SetPriority(HALL2_EXTI_IRQn, 15, 0); HAL_NVIC_EnableIRQ(HALL2_EXTI_IRQn); + HAL_NVIC_SetPriority(HALL3_EXTI_IRQn, 15, 0); + HAL_NVIC_EnableIRQ(HALL3_EXTI_IRQn); + + HAL_NVIC_SetPriority(HALL4_EXTI_IRQn, 15, 0); + HAL_NVIC_EnableIRQ(HALL4_EXTI_IRQn); + HAL_NVIC_SetPriority(A111_SENSOR_INTERRUPT_EXTI_IRQn, 0, 0); HAL_NVIC_EnableIRQ(A111_SENSOR_INTERRUPT_EXTI_IRQn); diff --git a/Core/Src/main.c b/Core/Src/main.c index 8558c2f..3414667 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -25,16 +25,10 @@ #include "usart.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ -#include "yunhorn_sts_sensors.h" -#include "sts_cmox_hmac_sha.h" #include "spi.h" #include "dma.h" #include "tim.h" -#include "sts_lamp_bar.h" #include "sys_app.h" - -#include "acc_hal_integration.h" -#include "acc_detector_presence.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -99,15 +93,11 @@ int main(void) /* USER CODE END SysInit */ /* Initialize all configured peripherals */ - LED1_ON; + MX_LoRaWAN_Init(); - STS_Lamp_Bar_Self_Test_Simple(); - /* USER CODE BEGIN 2 */ - - /* USER CODE END 2 */ /* Infinite loop */ diff --git a/Core/Src/stm32wlxx_it.c b/Core/Src/stm32wlxx_it.c index 92ab009..8f8d6fd 100644 --- a/Core/Src/stm32wlxx_it.c +++ b/Core/Src/stm32wlxx_it.c @@ -231,7 +231,7 @@ void EXTI0_IRQHandler(void) /* USER CODE BEGIN EXTI0_IRQn 0 */ /* USER CODE END EXTI0_IRQn 0 */ -#ifdef STS_O7 +#if defined(STS_O7)||defined(STS_O6)||defined(STS_O2) //sts_reed_hall_1_changed = 1; HAL_GPIO_EXTI_IRQHandler(HALL1_Pin); #else @@ -251,7 +251,7 @@ void EXTI1_IRQHandler(void) /* USER CODE BEGIN EXTI1_IRQn 0 */ /* USER CODE END EXTI1_IRQn 0 */ -#ifdef STS_O7 +#if defined(STS_O7)||defined(STS_O6)||defined(STS_O2) //sts_reed_hall_2_changed = 1; HAL_GPIO_EXTI_IRQHandler(HALL2_Pin); #else @@ -358,20 +358,41 @@ void DMA1_Channel7_IRQHandler(void) /** * @brief This function handles EXTI Lines [9:5] Interrupt. */ -#if 1 + void EXTI9_5_IRQHandler(void) { /* USER CODE BEGIN EXTI9_5_IRQn 0 */ /* USER CODE END EXTI9_5_IRQn 0 */ - //HAL_GPIO_EXTI_IRQHandler(BUT3_Pin); + + HAL_GPIO_EXTI_IRQHandler(HALL3_Pin); // GPIOA -9 + /* USER CODE BEGIN EXTI9_5_IRQn 1 */ #ifdef RM2 HAL_GPIO_EXTI_IRQHandler(A111_SENSOR_INTERRUPT_Pin); #endif /* USER CODE END EXTI9_5_IRQn 1 */ } + +/** + * @brief This function handles EXTI Lines [15:10] Interrupt. + */ + +void EXTI15_10_IRQHandler(void) +{ + /* USER CODE BEGIN EXTI9_5_IRQn 0 */ + + /* USER CODE END EXTI9_5_IRQn 0 */ + + HAL_GPIO_EXTI_IRQHandler(HALL4_Pin); // GPIOA -10 + + /* USER CODE BEGIN EXTI9_5_IRQn 1 */ +#ifdef RM2 + HAL_GPIO_EXTI_IRQHandler(A111_SENSOR_INTERRUPT_Pin); #endif + /* USER CODE END EXTI9_5_IRQn 1 */ +} + /** * @brief This function handles SPI1 Interrupt. */ diff --git a/Core/Src/sts_lamp_bar.c b/Core/Src/sts_lamp_bar.c index a19b9a1..7974d6d 100644 --- a/Core/Src/sts_lamp_bar.c +++ b/Core/Src/sts_lamp_bar.c @@ -63,6 +63,7 @@ extern volatile uint8_t sts_occupancy_status; extern volatile uint8_t sts_reed_hall_result, sts_emergency_button_pushed; // inital 0 = close volatile uint8_t sts_hall1_read=STS_Status_Door_Open,sts_hall2_read=STS_Status_SOS_Release; // Above hall1_read == reed_hall_result, hall2_read == emergency_button +volatile uint8_t sts_hall3_read=STS_Status_Alarm_Mute_Release,sts_hall4_read=STS_Status_Alarm_Reset_Release; extern volatile uint8_t sts_reed_hall_1_result, sts_reed_hall_2_result; extern volatile uint8_t sts_tof_result_changed_flag; @@ -73,7 +74,7 @@ extern volatile uint8_t sts_rss_result; extern volatile uint8_t sts_rss_2nd_result; //2nd RSS sensor status extern volatile uint8_t sts_tof_result; -//extern volatile uint8_t last_sts_reed_hall_result = 2; //Initial state, not 0, not 1 + volatile uint8_t last_lamp_bar_color=STS_GREEN; extern volatile uint8_t sts_presence_fall_detection; extern volatile uint8_t sts_fall_rising_detected_result; @@ -125,13 +126,12 @@ void STS_Lamp_Bar_Scoller(uint8_t color, uint8_t lum_level) for(uint8_t i = 0; i ( b ) ) ? ( a ) : ( b ) ) +#endif + /* #define DEFAULT_START_M (0.2f) #define DEFAULT_LENGTH_M (1.4f) @@ -50,7 +58,7 @@ #define DEFAULT_SENSOR_ID (1) #define DEFAULT_START_M (0.8f) //(0.80f) //default 0.2 unit(meter) [1] -#define DEFAULT_LENGTH_M (2.5f) // (2.0f)) //default 1.0 unit(meter) [2] +#define DEFAULT_LENGTH_M (3.5f) // (2.0f)) //default 1.0 unit(meter) [2] #define DEFAULT_ZONE_LENGTH (0.4f) //default 0.4 unit(meter) #define DEFAULT_UPDATE_RATE_WAKEUP (2.0f) //default 80 unit(hz) #define DEFAULT_UPDATE_RATE_TRACKING (10.0f) //default 80 unit(hz) [7] @@ -59,14 +67,14 @@ //#define DEFAULT_UPDATE_RATE_PRESENCE (80.0F) //(65.0f) //default 80 unit(hz) #define DEFAULT_HWAAS (63) //default 10 unit(hz) -#define DEFAULT_THRESHOLD (1.2f) //default 1.5 level float [3] +#define DEFAULT_THRESHOLD (1.5f) //default 1.5 level float [3] //acc_detector_presence_configuration_filter_parameters_t #define DEFAULT_INTER_FRAME_DEVIATION_TIME_CONST (0.5f) //default 0.5 unit(seconds) [6] #define DEFAULT_INTER_FRAME_FAST_CUTOFF (10.0f) //default 20.0 unit(hz) [8] #define DEFAULT_INTER_FRAME_SLOW_CUTOFF (0.01f) //(0.01f) 0.2 hz unit(hz) [9] #define DEFAULT_INTRA_FRAME_TIME_CONST (0) //default 0.0 unit(seconds) -#define DEFAULT_INTRA_FRAME_WEIGHT (0) //default 0.6 +#define DEFAULT_INTRA_FRAME_WEIGHT (0) //default 0.6 for normal slow tracking 1.0 for fast tracking #define DEFAULT_OUTPUT_TIME_CONST (0.5f) //default 0.5 unit(seconds) [5] //#define DEFAULT_OUTPUT_TIME_CONST (0.4f) //default 0.5 unit(seconds) [5] @@ -74,8 +82,8 @@ #define DEFAULT_NBR_REMOVED_PC (0) //default 0 int [10] #define DEFAULT_DOWNSAMPLING_FACTOR (2) //default 1 -#define DEFAULT_RECEIVER_GAIN (0.65f) //default 0.9 gain mdB [4] -//#define DEFAULT_RECEIVER_GAIN (0.65f) //default 0.9 gain mdB [4] +//#define DEFAULT_RECEIVER_GAIN (0.65f) //default 0.9 gain mdB [4] +#define DEFAULT_RECEIVER_GAIN (0.40f) //default 0.9 gain mdB [4] #define DEFAULT_MOTION_DATASET_LEN (128) //MOTION DATASET/PATTERN COLLECTION #define DEFAULT_MOTION_FEATURE_LEN (10) //MOTION FEATURE IDENDIFIED @@ -111,8 +119,9 @@ extern volatile uint8_t sts_fall_detection_acc_threshold, sts_fall_detection_dep volatile uint8_t sts_unconscious_state=0; volatile uint16_t sts_unconscious_threshold=1280, sts_unconscious_duration=0; extern volatile uint8_t sts_rss_result, sts_rss_config_updated_flag, last_sts_rss_result; -extern volatile float sts_distance_rss_distance, sts_sensor_install_height; - +extern volatile uint16_t sts_distance_rss_distance, sts_sensor_install_height; +extern volatile uint8_t sts_work_mode; +extern volatile STS_OO_SensorStatusDataTypeDef sts_o7_sensorData; volatile float sts_presence_rss_distance, sts_presence_rss_score; volatile STS_OO_RSS_SensorTuneDataTypeDef sts_presence_rss_config; //static void update_configuration(acc_detector_presence_configuration_t presence_configuration); @@ -121,13 +130,19 @@ volatile uint8_t motion_detected_count=0; volatile uint8_t motion_in_hs_zone[12][10]={0}; //0.4*12=4.8meter high, past 10 measures volatile uint8_t detected_hs_zone=0;; volatile uint16_t motion_count=0, motion_feature_count=0; -static acc_detector_presence_result_t sts_motion_dataset[DEFAULT_MOTION_DATASET_LEN]; +typedef struct +{ + uint32_t presence_score; // 1000* + uint32_t presence_distance; // 1000*, in mm +} STS_presence_result_t; + +static STS_presence_result_t sts_motion_dataset[DEFAULT_MOTION_DATASET_LEN]; static STS_PRESENCE_Motion_Featuer_t sts_motion_feature[DEFAULT_MOTION_FEATURE_LEN]; volatile uint8_t sts_fall_rising_detected_result = STS_PRESENCE_NORMAL; volatile uint8_t sts_fall_rising_detected_result_changed_flag =0; volatile uint8_t last_sts_fall_rising_detected_result= STS_PRESENCE_NORMAL; -volatile float last_average_presence_distance; -volatile uint16_t sts_fall_rising_pattern_factor1=0, sts_fall_rising_pattern_factor2=0; +volatile uint16_t last_average_presence_distance=0; +volatile uint16_t sts_fall_rising_pattern_factor1=0, sts_fall_rising_pattern_factor2=0, sts_fall_rising_pattern_factor3=0; volatile uint16_t sts_roc_acc_standard_variance=0; extern volatile uint8_t sts_presence_fall_detection; /* USER CODE END Includes */ @@ -169,21 +184,6 @@ extern volatile uint8_t sts_presence_fall_detection; /* Exported functions --------------------------------------------------------*/ -void STS_PRESENCE_RSS_update_default_configuration(acc_detector_presence_configuration_t presence_configuration) -{ - acc_detector_presence_configuration_sensor_set(presence_configuration, DEFAULT_SENSOR_ID); - - acc_detector_presence_configuration_service_profile_set(presence_configuration, DEFAULT_PROFILE); - - acc_detector_presence_configuration_update_rate_set(presence_configuration, DEFAULT_UPDATE_RATE); - acc_detector_presence_configuration_detection_threshold_set(presence_configuration, DEFAULT_DETECTION_THRESHOLD); - acc_detector_presence_configuration_start_set(presence_configuration, DEFAULT_START_M); - acc_detector_presence_configuration_length_set(presence_configuration, DEFAULT_LENGTH_M); - acc_detector_presence_configuration_power_save_mode_set(presence_configuration, DEFAULT_POWER_SAVE_MODE); - acc_detector_presence_configuration_nbr_removed_pc_set(presence_configuration, DEFAULT_NBR_REMOVED_PC); - -} - /** * @brief Set default values in presence configuration * @@ -315,14 +315,16 @@ static void print_result(acc_detector_presence_result_t result) { if (result.presence_detected) { - uint32_t detected_zone = (uint32_t)((float)(result.presence_distance - DEFAULT_START_M) / (float)DEFAULT_ZONE_LENGTH); + //uint32_t detected_zone = (uint32_t)((float)(result.presence_distance - DEFAULT_START_M) / (float)DEFAULT_ZONE_LENGTH); + // 2024-08-05 + uint32_t detected_zone = (uint32_t)((float)(result.presence_distance) / (float)DEFAULT_ZONE_LENGTH); APP_LOG(TS_OFF, VLEVEL_H,"Motion in zone: %u, distance: %d, score: %d\n", (unsigned int)detected_zone, (int)(result.presence_distance * 1000.0f), (int)(result.presence_score * 1000.0f)); } else { - APP_LOG(TS_OFF, VLEVEL_H,"No motion, score: %d\n", (int)(result.presence_score * 1000.0f)); + APP_LOG(TS_OFF, VLEVEL_H,"No motion, score: %u\n", (int)(result.presence_score * 1000.0f)); } } @@ -353,22 +355,30 @@ int sts_presence_rss_fall_rise_detection(void) switch (sts_rss_config_updated_flag) { + case STS_RSS_CONFIG_NON: + APP_LOG(TS_OFF, VLEVEL_M,"\r\n##### YUNHORN STS *** Non *** cfg \n"); + return EXIT_SUCCESS; + break; case STS_RSS_CONFIG_DEFAULT: set_default_configuration(presence_configuration); + APP_LOG(TS_OFF, VLEVEL_M,"\r\n##### YUNHORN STS *** Default *** cfg applied\n"); break; case STS_RSS_CONFIG_SIMPLE: sts_rss_set_current_configuration_simple(presence_configuration); - APP_LOG(TS_OFF, VLEVEL_L,"\r\n##### YUNHORN STS *** Simple *** cfg applied\n"); - + APP_LOG(TS_OFF, VLEVEL_M,"\r\n##### YUNHORN STS *** Simple *** cfg applied\n"); break; case STS_RSS_CONFIG_FULL: sts_rss_set_current_configuration_full(presence_configuration); - APP_LOG(TS_OFF, VLEVEL_L,"\r\n######### YUNHORN STS *** FULL *** cfg applied\n"); + APP_LOG(TS_OFF, VLEVEL_M,"\r\n######### YUNHORN STS *** FULL *** cfg applied\n"); + break; + case STS_RSS_CONFIG_FALL_DETECTION: + set_default_fall_rise_configuration(presence_configuration); + APP_LOG(TS_OFF, VLEVEL_M,"\r\n######### YUNHORN STS *** FALL DETECTION *** cfg applied\n"); break; default: break; } - sts_rss_config_updated_flag = STS_RSS_CONFIG_DEFAULT; //update finished, set to 0 + //sts_rss_config_updated_flag = STS_RSS_CONFIG_DEFAULT; //update finished, set to 0 acc_detector_presence_handle_t handle = acc_detector_presence_create(presence_configuration); if (handle == NULL) @@ -386,7 +396,7 @@ int sts_presence_rss_fall_rise_detection(void) APP_LOG(TS_OFF, VLEVEL_H, "Failed to activate detector \n"); return false; } - + bool deactivated = false; bool success = true; const int iterations = (DEFAULT_UPDATE_RATE_PRESENCE+1); acc_detector_presence_result_t result; @@ -399,203 +409,237 @@ int sts_presence_rss_fall_rise_detection(void) for (uint8_t k=0;k<12;k++) motion_in_hs_zone[k][motion_detected_count]=0; + UTIL_MEM_set_8(sts_motion_dataset, 0x0, sizeof(sts_motion_dataset)); + motion_count =0; + //memset((void*)motion_in_hs_zone, 0x0, 12*10); //past 10 times of detection with 5 zones from ground to ceiling //for (k=0; k<5; k++) {motion_in_zone[k]=0;} -#if 1 - for (int i = 0; i < (iterations/2); i++) + if ((sts_work_mode == STS_DUAL_MODE)||(sts_work_mode == STS_RSS_MODE)) { - success = acc_detector_presence_get_next(handle, &result); - if (!success) - { - APP_LOG(TS_OFF, VLEVEL_H,"acc_detector_presence_get_next() failed\n"); - break; - } - - print_result(result); - if (!result.data_saturated) - { - if (result.presence_detected) + for (int i = 0; i < (iterations); i++) { - average_result++; - average_distance += result.presence_distance; - average_score += result.presence_score; - detected_zone = (uint16_t)((float)(result.presence_distance - DEFAULT_START_M) / (float)DEFAULT_ZONE_LENGTH); - motion_in_zone[detected_zone]++; - // new add 2024-06-18 - //detected_hs_zone = (uint16_t)((float)(sts_sensor_install_height/1000.0f - (result.presence_distance))/(float)DEFAULT_ZONE_LENGTH); - //if (detected_hs_zone == 0) - //APP_LOG(TS_OFF, VLEVEL_L, "\r\nPresence_Distance=%u \r\n", (int)result.presence_distance*1000.0); - //APP_LOG(TS_OFF, VLEVEL_L, "\r\nHS_ZONE=%u", (int)detected_hs_zone); - detected_hs_zone = 6 - detected_zone; - motion_in_hs_zone[detected_hs_zone][(motion_detected_count)]++; - } - - sts_motion_dataset[motion_count].presence_distance = result.presence_distance; - sts_motion_dataset[motion_count].presence_score = result.presence_score; - - if (sts_presence_fall_detection == TRUE) - { - if (motion_count ++ == DEFAULT_MOTION_DATASET_LEN) + success = acc_detector_presence_get_next(handle, &result); + if (!success) { - // STS_YunhornCheckStandardDeviation(); no Deviation in middle 2024 -7-22 - motion_count = 0; + APP_LOG(TS_OFF, VLEVEL_H,"acc_detector_presence_get_next() failed\n"); + break; } + + //print_result(result); + if (!result.data_saturated) + { + //APP_LOG(TS_OFF, VLEVEL_H,"\n%u ", i); + //print_result(result); + if (result.presence_detected) + { + //print_result(result); + average_result++; + average_distance += result.presence_distance; + average_score += result.presence_score; + //detected_zone = (uint16_t)((float)(result.presence_distance - DEFAULT_START_M) / (float)DEFAULT_ZONE_LENGTH); + //2024-08-05 + detected_zone = (uint16_t)((float)(result.presence_distance) / (float)DEFAULT_ZONE_LENGTH); + motion_in_zone[detected_zone]++; + // new add 2024-06-18 + //detected_hs_zone = (uint16_t)((float)(sts_sensor_install_height/1000.0f - (result.presence_distance))/(float)DEFAULT_ZONE_LENGTH); + //if (detected_hs_zone == 0) + //APP_LOG(TS_OFF, VLEVEL_L, "\r\nPresence_Distance=%u \r\n", (int)result.presence_distance*1000.0); + //APP_LOG(TS_OFF, VLEVEL_L, "\r\nHS_ZONE=%u", (int)detected_hs_zone); + detected_hs_zone = 10 - detected_zone; + motion_in_hs_zone[detected_hs_zone][(motion_detected_count)]++; + + + sts_motion_dataset[motion_count].presence_distance = 1000*result.presence_distance; + sts_motion_dataset[motion_count].presence_score = 1000*result.presence_score; + + motion_count++; + + } + } + + acc_integration_sleep_ms(1000 / DEFAULT_UPDATE_RATE_PRESENCE); // 15ms, DEFAULT_UPDATE_RATE); + //acc_integration_sleep_ms(1); } - } - //acc_integration_sleep_ms(1000 / DEFAULT_UPDATE_RATE_PRESENCE); // 15ms, DEFAULT_UPDATE_RATE); - //acc_integration_sleep_ms(1); + deactivated = acc_detector_presence_deactivate(handle); + acc_detector_presence_destroy(&handle); + acc_rss_deactivate(); + + APP_LOG(TS_OFF, VLEVEL_H, "\r\n First Half --- Motion Count = %u \r\n", motion_count); + + //acc_detector_presence_deactivate(handle); } + else if ((sts_work_mode == STS_UNI_MODE)) + { - acc_detector_presence_deactivate(handle); - + // ******** Second Half detection of fall down and rise up + //if (sts_presence_fall_detection == TRUE) + //{ + // the following has been updated, no need to re-cofig +#if 0 + set_default_fall_rise_configuration(presence_configuration); + if (!acc_detector_presence_reconfigure(&handle, presence_configuration)) + { + APP_LOG(TS_OFF, VLEVEL_H,"Failed to reconfigure detector\n"); + acc_detector_presence_configuration_destroy(&presence_configuration); + acc_detector_presence_destroy(&handle); + acc_rss_deactivate(); + return EXIT_FAILURE; + } #endif -// ******** Second Half detection of fall down and rise up -//if (sts_presence_fall_detection == TRUE) -//{ - set_default_fall_rise_configuration(presence_configuration); - - if (!acc_detector_presence_reconfigure(&handle, presence_configuration)) - { - APP_LOG(TS_OFF, VLEVEL_M,"Failed to reconfigure detector\n"); - acc_detector_presence_configuration_destroy(&presence_configuration); - acc_detector_presence_destroy(&handle); - acc_rss_deactivate(); - return EXIT_FAILURE; - } - - - if (!acc_detector_presence_activate(handle)) - { - APP_LOG(TS_OFF, VLEVEL_H, "Failed to activate detector \n"); - return false; - } - acc_detector_presence_configuration_destroy(&presence_configuration); -// set to full length of iteration - for (int i = 0; i < (iterations/2); i++) - { - success = acc_detector_presence_get_next(handle, &result); - if (!success) - { - APP_LOG(TS_OFF, VLEVEL_H,"acc_detector_presence_get_next() failed\n"); - break; - } - - print_result(result); - if (!result.data_saturated) - { - if (result.presence_detected) + // activated already +#if 0 + if (!acc_detector_presence_activate(handle)) { - average_result++; - average_distance += result.presence_distance; - average_score += result.presence_score; - detected_zone = (uint16_t)((float)(result.presence_distance - DEFAULT_START_M) / (float)DEFAULT_ZONE_LENGTH); - motion_in_zone[detected_zone]++; - // new add 2024-06-18 - - //detected_hs_zone = (uint16_t)((float)(sts_sensor_install_height/1000.0f - (result.presence_distance))/(float)DEFAULT_ZONE_LENGTH); - //if (detected_hs_zone == 0) - //APP_LOG(TS_OFF, VLEVEL_L, "\r\nPresence_Distance=%u \r\n", (int)result.presence_distance*1000.0); - //APP_LOG(TS_OFF, VLEVEL_L, "\r\nHS_ZONE=%u", detected_hs_zone); - detected_hs_zone = 6 - detected_zone; - motion_in_hs_zone[detected_hs_zone][(motion_detected_count)]++; - + APP_LOG(TS_OFF, VLEVEL_H, "Failed to activate detector \n"); + return false; } +#endif - if (sts_presence_fall_detection == TRUE) + acc_detector_presence_configuration_destroy(&presence_configuration); + + // set to full length of iteration + for (int i = 0; i < (iterations); i++) { - sts_motion_dataset[motion_count].presence_distance = result.presence_distance; - sts_motion_dataset[motion_count].presence_score = result.presence_score; - - if (motion_count ++ == DEFAULT_MOTION_DATASET_LEN) + success = acc_detector_presence_get_next(handle, &result); + if (!success) { + APP_LOG(TS_OFF, VLEVEL_H,"acc_detector_presence_get_next() failed\n"); + break; + } - STS_YunhornCheckStandardDeviation(); - motion_count = 0; + + if (!result.data_saturated) + { + //APP_LOG(TS_OFF, VLEVEL_H,"\n%u ", i); + //print_result(result); + if ((result.presence_detected) && (result.presence_score > DEFAULT_THRESHOLD)) + { + //print_result(result); + average_result++; + average_distance += result.presence_distance; + average_score += result.presence_score; + //detected_zone = (uint16_t)((float)(result.presence_distance - DEFAULT_START_M) / (float)DEFAULT_ZONE_LENGTH); + // 2024-08-05 + detected_zone = (uint16_t)((float)(result.presence_distance) / (float)DEFAULT_ZONE_LENGTH); + motion_in_zone[detected_zone]++; + // new add 2024-06-18 + + //detected_hs_zone = (uint16_t)((float)(sts_sensor_install_height/1000.0f - (result.presence_distance))/(float)DEFAULT_ZONE_LENGTH); + //if (detected_hs_zone == 0) + //APP_LOG(TS_OFF, VLEVEL_L, "\r\nPresence_Distance=%u \r\n", (int)result.presence_distance*1000.0); + //APP_LOG(TS_OFF, VLEVEL_L, "\r\nHS_ZONE=%u", detected_hs_zone); + //(sts_sensor_install_height/1000)/(DEFAULT_ZONE_LENGTH) + detected_hs_zone = (sts_sensor_install_height/1000)/(DEFAULT_ZONE_LENGTH) - detected_zone; + motion_in_hs_zone[detected_hs_zone][(motion_detected_count)]++; + + sts_motion_dataset[motion_count].presence_distance = 1000*result.presence_distance; + sts_motion_dataset[motion_count].presence_score = 1000*result.presence_score; + + + motion_count++; + } } + // ~12 ms per RSS scan + // acc_integration_sleep_ms(1000 / DEFAULT_UPDATE_RATE_PRESENCE); // 15 ms, DEFAULT_UPDATE_RATE); + //acc_integration_sleep_ms(10); --- around 1500 ms in total + acc_integration_sleep_ms(2); //--- around 1000ms in total } - } + deactivated = acc_detector_presence_deactivate(handle); + acc_detector_presence_destroy(&handle); + acc_rss_deactivate(); - //acc_integration_sleep_ms(1000 / DEFAULT_UPDATE_RATE_PRESENCE); // 15 ms, DEFAULT_UPDATE_RATE); - //acc_integration_sleep_ms(1); - } - //APP_LOG(TS_OFF, VLEVEL_L,"Second Half, Fall Rise Detection, Motion Count = %u \r\n", (int)motion_count); - //uint8_t thiscnt= motion_detected_count; + APP_LOG(TS_OFF, VLEVEL_M, "\r\n Second Half --- Motion Count Sum to = %u \r\n", motion_count); + + //APP_LOG(TS_OFF, VLEVEL_L,"Second Half, Fall Rise Detection, Motion Count = %u \r\n", (int)motion_count); + + motion_count = motion_count%DEFAULT_MOTION_DATASET_LEN; // get all required number of motion data + + //sts_fall_rising_detected_result = STS_PRESENCE_NORMAL; + + if ((sts_presence_fall_detection == TRUE)&& (motion_count> (DEFAULT_MOTION_DATASET_LEN/2))) + { + // major fall/rise/laydown/unconscious suggestion process + STS_YunhornCheckStandardDeviation(); + } - if (motion_detected_count++ == 10) { - motion_detected_count=0; - } else { - OnSensor3CStateChanged(); } - sts_rss_result = (average_result > 3)? 1: 0; + average_distance = (1000.0f*average_distance)/average_result; // in meters + average_score = (1000.0f*average_score)/average_result; + + sts_presence_rss_distance = average_distance; + sts_presence_rss_score = average_score; + sts_rss_result = (average_result > (DEFAULT_UPDATE_RATE_PRESENCE/5))? 1: 0; + + //if (average_result) //if (average_score !=0) //if (sts_rss_result) + { + APP_LOG(TS_OFF, VLEVEL_L,"\r\n######## Motion: %u Distance=%u mm, Score=%u Average_result=%u out of %u \r\n", + (uint8_t)sts_rss_result,(int) sts_presence_rss_distance, (int)(sts_presence_rss_score), (int)average_result, (int)iterations); + } + + +// RSS feature 1: Motion, No-motion process + + if (sts_rss_result) { LED1_ON; - OnSensor3AStateChanged(); + OnSensorRSS3AStateChanged(); } else { LED1_OFF; } - +// RSS feature 2: Fall Detection process /* TODO XXXX 2024-06-06 * Fall Detection settings */ - if (sts_fall_rising_detected_result) { + if (sts_fall_rising_detected_result) + { LED1_ON; - OnSensor3BStateChanged(); + OnSensorRSS3BStateChanged(); + sts_fall_rising_detected_result_changed_flag = sts_fall_rising_detected_result; } else { LED1_OFF; } - - -#ifdef LOG_RSS - APP_LOG(TS_OFF, VLEVEL_L,"\r\nSensor at Ceiling Height: %4u mm\r\n",(int)sts_sensor_install_height); - - for (uint8_t k=0; k<12; k++) { - if (motion_in_hs_zone[k][thiscnt]>0) { - - APP_LOG(TS_OFF, VLEVEL_L,"\r\nMotion Distance Zone: %2u %4u Height< %4u cm", k, (uint8_t)motion_in_hs_zone[k][thiscnt], (int)(k+1)*40); - } - else - { - APP_LOG(TS_OFF, VLEVEL_L,"\r\nMotion Distance Zone: %2u %4s", k, " "); - } - } -#endif - average_distance = (1000.0f*average_distance)/average_result; // in meters - average_score = (1000.0f*average_score)/average_result; - sts_presence_rss_distance = average_distance; - sts_presence_rss_score = average_score; - if (average_score) //if (average_score !=0) //if (sts_rss_result) - { -#ifdef LOG_RSS - APP_LOG(TS_OFF, VLEVEL_L,"\r\n######## Motion: %u Distance=%u mm, Score=%u Average_result=%u out of %u \r\n", - (uint8_t)sts_rss_result,(int) average_distance, (int)(average_score), (int)average_result, (int)iterations); -#endif -#ifdef LOG_RSS - for (uint8_t j=0; j<5; j++) { - APP_LOG(TS_OFF, VLEVEL_M,"\r\n######## Motion: %u Distance=%u mm, Score=%u Average_result=%u out of %u \r\n", - (uint8_t)sts_rss_result,(int) average_distance, (int)(average_score), (int)average_result, (int)iterations); - } -#endif +// RSS feature 3: No motion, or stay still , or unconscious process + uint8_t thiscnt= motion_detected_count; + if (motion_detected_count++ == 10) { + motion_detected_count=0; + } else { + OnSensorRSS3CStateChanged(); } +//#ifdef LOG_RSS + if (sts_work_mode == STS_UNI_MODE) + { + APP_LOG(TS_OFF, VLEVEL_M,"\r\nSensor at Ceiling Height: %u cm\r\n",(uint16_t)sts_sensor_install_height/10); + APP_LOG(TS_OFF, VLEVEL_M,"\r\n|Motion Distance Zone| ##### |Height cm|\r\n"); + uint8_t kk = (uint8_t)((uint16_t)(sts_sensor_install_height/1000)/(DEFAULT_ZONE_LENGTH)); + APP_LOG(TS_OFF, VLEVEL_M,"\r\n|-----------Ceiling-------Sensor---V-----|\r\n"); + for (uint8_t k=0; k <=kk; k++) + { + if (motion_in_hs_zone[kk - k][thiscnt] > 0) + { + APP_LOG(TS_OFF, VLEVEL_M,"\r\n| %2u | %4u | %4u |\r\n", + (kk-k), (uint8_t)motion_in_hs_zone[kk-k][thiscnt], (int)(kk-k)*40); + } else { + APP_LOG(TS_OFF, VLEVEL_M,"\r\n| %2u | | |\r\n", kk-k); + } + } + APP_LOG(TS_OFF, VLEVEL_M,"\r\n|-----------Floor Ground-----------^-----|\r\n"); + } +//#endif - bool deactivated = acc_detector_presence_deactivate(handle); - - acc_detector_presence_destroy(&handle); - - acc_rss_deactivate(); if (deactivated && success) { @@ -610,114 +654,134 @@ int sts_presence_rss_fall_rise_detection(void) void STS_YunhornCheckStandardDeviation(void) { uint16_t i,j; // sts_sensor_install_height <--- average_presence_distance should be approaching this distance - 50cm - float sum_presence_distance = 0, sum_presence_score=0; //presence score act as magnetic or amplitude of motion - float average_presence_distance = 0, average_presence_score=0; - float variance_presence_distance = 0, variance_presence_score=0; - float standard_variance_presence_distance = 0, standard_variance_presence_score=0; + uint32_t sum_presence_distance = 0, sum_presence_score=0; //presence score act as magnetic or amplitude of motion + uint32_t average_presence_distance = 0, average_presence_score=0; + uint32_t variance_presence_distance = 0, variance_presence_score=0; + uint32_t standard_variance_presence_distance = 0, standard_variance_presence_score=0; // ROC -- rate of change - float roc_distance[DEFAULT_MOTION_DATASET_LEN]={0}, sum_roc_distance=0, average_roc_distance=0, variance_roc_distance=0, standard_variance_roc_distance=0; - float roc_acc[DEFAULT_MOTION_DATASET_LEN]={0}, sum_roc_acc=0.0f, average_roc_acc=0.0f, variance_roc_acc=0.0f, standard_variance_roc_acc=0.0f;; + uint32_t roc_distance[DEFAULT_MOTION_DATASET_LEN]={0}, sum_roc_distance=0, average_roc_distance=0, variance_roc_distance=0, standard_variance_roc_distance=0; + uint32_t roc_acc[DEFAULT_MOTION_DATASET_LEN]={0}, sum_roc_acc=0, average_roc_acc=0, variance_roc_acc=0, standard_variance_roc_acc=0; //act as speed of change at given time slot acc_integration_sleep_ms(1000 / DEFAULT_UPDATE_RATE_PRESENCE); + uint8_t SAMPLE_DATASET_NUM = MIN(motion_count,DEFAULT_MOTION_DATASET_LEN ); + APP_LOG(TS_OFF, VLEVEL_M, "\r\n Sample dataset for deviation process =%u \r\n",SAMPLE_DATASET_NUM); - //SUM - for(i= 0; i< DEFAULT_MOTION_DATASET_LEN; i++) + // initial state + sts_fall_rising_detected_result = STS_PRESENCE_NORMAL; + + //SUM of samples + for(i= 0; i< SAMPLE_DATASET_NUM; i++) { - sum_presence_distance += (float)sts_motion_dataset[i].presence_distance; - sum_presence_score += (float)sts_motion_dataset[i].presence_score; + sum_presence_distance += (uint32_t)sts_motion_dataset[i].presence_distance; + sum_presence_score += (uint32_t)sts_motion_dataset[i].presence_score; } - // AVERAGE - average_presence_distance = ((float)sum_presence_distance/(float)DEFAULT_MOTION_DATASET_LEN); - average_presence_score = ((float)sum_presence_score/(float)DEFAULT_MOTION_DATASET_LEN); + // AVERAGE of all samples ( u (miu) ) + average_presence_distance = ((uint32_t)sum_presence_distance/(uint32_t)(SAMPLE_DATASET_NUM)); + average_presence_score = ((uint32_t)sum_presence_score/(uint32_t)(SAMPLE_DATASET_NUM)); - // VARIANCE - for (j = 0; j < DEFAULT_MOTION_DATASET_LEN; j++) + // 1) VARIANCE^2 + for (j = 0; j < SAMPLE_DATASET_NUM; j++) { - variance_presence_distance += (float)pow(sts_motion_dataset[j].presence_distance - average_presence_distance,2); - variance_presence_score += (float)pow(sts_motion_dataset[j].presence_score - average_presence_score,2); + sum_presence_distance += (uint32_t)pow(sts_motion_dataset[j].presence_distance - average_presence_distance,2); + sum_presence_score += (uint32_t)pow(sts_motion_dataset[j].presence_score - average_presence_score,2); } - variance_presence_distance /= (float)DEFAULT_MOTION_DATASET_LEN; - variance_presence_score /= (float)DEFAULT_MOTION_DATASET_LEN; - - //STANDARD VARIANCE - standard_variance_presence_distance = (float)pow(variance_presence_distance,0.5); - standard_variance_presence_score = (float)pow(variance_presence_score,0.5); + variance_presence_distance =sum_presence_distance/(uint32_t)(SAMPLE_DATASET_NUM-1); + variance_presence_score =sum_presence_score/(uint32_t)(SAMPLE_DATASET_NUM-1); + //STANDARD VARIANCE sigma + standard_variance_presence_distance = (uint32_t)sqrt(sum_presence_distance/SAMPLE_DATASET_NUM); + standard_variance_presence_score = (uint32_t)sqrt(sum_presence_score/SAMPLE_DATASET_NUM); + APP_LOG(TS_OFF, VLEVEL_M, "\r\n Standard Variance_Presence_Distance=%u \r\n Standard Variance Presence Score=%u\r\n", + standard_variance_presence_distance, standard_variance_presence_score); // ROC distance // SUM - for(i= 0; i< (DEFAULT_MOTION_DATASET_LEN-1); i++) + for(i= 0; i< (SAMPLE_DATASET_NUM-1); i++) { - roc_distance[i] = (float)(labs(sts_motion_dataset[i+1].presence_distance - sts_motion_dataset[i].presence_distance)); - sum_roc_distance += ((float)roc_distance[i]); + roc_distance[i] = (uint32_t)(labs(sts_motion_dataset[i+1].presence_distance - sts_motion_dataset[i].presence_distance)); + sum_roc_distance += ((uint32_t)roc_distance[i]); } - average_roc_distance = (float)sum_roc_distance/(float)(DEFAULT_MOTION_DATASET_LEN-1); + average_roc_distance = (uint32_t)sum_roc_distance/(SAMPLE_DATASET_NUM-1); - for (j = 0; j < (DEFAULT_MOTION_DATASET_LEN-1); j++) + for (j = 0; j < (SAMPLE_DATASET_NUM-1); j++) { - variance_roc_distance += (float)(pow((float)roc_distance[j] - (float)average_roc_distance,2.0f)); + sum_roc_distance += (uint32_t)(pow(roc_distance[j] - average_roc_distance,2)); } + // average + variance_roc_distance =sum_roc_distance/(uint32_t)(SAMPLE_DATASET_NUM-2); - variance_roc_distance /= (float)(DEFAULT_MOTION_DATASET_LEN-1); - - standard_variance_roc_distance = (float)pow((float)variance_roc_distance,0.5f); + //???? + standard_variance_roc_distance = (uint32_t)sqrt((uint32_t)variance_roc_distance)/(SAMPLE_DATASET_NUM-1); // ROC Acceleration - for(i= 0; i< (DEFAULT_MOTION_DATASET_LEN-2); i++) + for(i= 0; i< (SAMPLE_DATASET_NUM-2); i++) { - roc_acc[i] = (float)(labs((float)roc_distance[i+1] - (float)roc_distance[i])); - sum_roc_acc += ((float)roc_acc[i]); + roc_acc[i] = (uint32_t)(labs((uint32_t)roc_distance[i+1] - (uint32_t)roc_distance[i])); + sum_roc_acc += ((uint32_t)roc_acc[i]); } - average_roc_acc = (float)sum_roc_acc/(float)(DEFAULT_MOTION_DATASET_LEN-2); + average_roc_acc = (uint32_t)sum_roc_acc/(SAMPLE_DATASET_NUM-3); - for (j = 0; j < (DEFAULT_MOTION_DATASET_LEN-2); j++) + for (j = 0; j < (SAMPLE_DATASET_NUM-3); j++) { - variance_roc_acc += (float)pow((float)((float)roc_acc[j] - (float)average_roc_acc),2.0f); + sum_roc_acc += (uint32_t)pow((uint32_t)((uint32_t)roc_acc[j] - (uint32_t)average_roc_acc),2); } - variance_roc_acc /= (float)(DEFAULT_MOTION_DATASET_LEN-2); + variance_roc_acc = sum_roc_acc/(uint32_t)(SAMPLE_DATASET_NUM-4); - standard_variance_roc_acc = (float)pow((float)variance_roc_acc,0.5f); + standard_variance_roc_acc = (uint32_t)sqrt((uint32_t)sum_roc_acc)/(SAMPLE_DATASET_NUM-3); //Normallize to m/s --- * DEFAULT_MOTION_DATASET_LEN for One single second +#if 0 + average_roc_distance *= (uint32_t)DEFAULT_MOTION_DATASET_LEN; + variance_roc_distance *= (uint32_t)DEFAULT_MOTION_DATASET_LEN; + standard_variance_roc_distance *= (uint32_t)DEFAULT_MOTION_DATASET_LEN; - average_roc_distance *= (float)DEFAULT_MOTION_DATASET_LEN; - variance_roc_distance *= (float)DEFAULT_MOTION_DATASET_LEN; - standard_variance_roc_distance *= (float)DEFAULT_MOTION_DATASET_LEN; - - average_roc_acc *= (float)DEFAULT_MOTION_DATASET_LEN; - variance_roc_acc *= (float)DEFAULT_MOTION_DATASET_LEN; - standard_variance_roc_acc *= (float)DEFAULT_MOTION_DATASET_LEN; - + average_roc_acc *= (uint32_t)DEFAULT_MOTION_DATASET_LEN; + variance_roc_acc *= (uint32_t)DEFAULT_MOTION_DATASET_LEN; + standard_variance_roc_acc *= (uint32_t)DEFAULT_MOTION_DATASET_LEN; +#endif // print result -#ifdef LOG_RSS - APP_LOG(TS_OFF, VLEVEL_L, "\r\n---Sensor Install Height=%6u-----Distance Average =%6u; Variance = %6u ; Standard =%6u \r\n", - (int)sts_sensor_install_height, (int)(average_presence_distance*1000.0f), (int)(variance_presence_distance*1000.0f), (int)(standard_variance_presence_distance*1000.0f)); -#endif -#ifdef LOG_RSS - APP_LOG(TS_OFF, VLEVEL_M, "-------------Motion Average =%6u; Variance = %6u ; Standard =%6u \r\n", - (int)(average_presence_score*1000.0f), (int)(variance_presence_score*1000.0f), (int)(standard_variance_presence_score*1000.0f)); -#endif -#ifdef LOG_RSS - APP_LOG(TS_OFF, VLEVEL_L, "-------------ROC Dist Average =%6u; Variance = %6u ; Standard =%6u \r\n", - (int)(average_roc_distance), (int)(variance_roc_distance), (int)(standard_variance_roc_distance)); +//#ifdef LOG_RSS + APP_LOG(TS_OFF, VLEVEL_M, "\r\n---Sensor Install Height=%4u (mm)-----\r\n-------------Distance Average =%6u (mm); Standard_Variance =%04u (mm)\r\n", + (int)sts_sensor_install_height, (int)(average_presence_distance), (int)(standard_variance_presence_distance)); +//#endif +//#ifdef LOG_RSS + APP_LOG(TS_OFF, VLEVEL_M, "\r\n\n-------------Motion Average (score)=%04u; Standard_Variance (score)=%04u \r\n", + (int)(average_presence_score), (int)(standard_variance_presence_score)); - APP_LOG(TS_OFF, VLEVEL_L, "-------------ROC ACC Average =%6u; Variance = %6u ; Standard =%6u \r\n", - (int)(average_roc_acc), (int)(variance_roc_acc), (int)(standard_variance_roc_acc)); + sts_o7_sensorData.event_sensor3_fall_distance =(uint16_t)average_presence_distance; + sts_o7_sensorData.event_sensor3_fall_motionscore =(uint16_t)average_presence_score; - sts_fall_rising_pattern_factor1 = (int)(standard_variance_roc_distance); - sts_fall_rising_pattern_factor2 = (int)(fabs(average_presence_distance - fmax(0,last_average_presence_distance))*100.0f); // in cm - APP_LOG(TS_OFF, VLEVEL_L,"Avg-Dist =%6u, Last_AVG-Dist =%6u \r\n", (int)(average_presence_distance*1000.0f), (int)(last_average_presence_distance*1000.0f)); +//#endif +//#ifdef LOG_RSS + APP_LOG(TS_OFF, VLEVEL_M, "\r\n-------------ROC Dist Average (mm/s) =%6u; Standard_Variance =%6u (mm/s)\r\n", + (int)(average_roc_distance), (int)(standard_variance_roc_distance)); - APP_LOG(TS_OFF, VLEVEL_L, "Threshold 1: \r\nAcc = %6u \r\nMeasure 1 = %6u ---- \r\n", + APP_LOG(TS_OFF, VLEVEL_M, "\r\n-------------ROC ACC Average =%6u (mm/s2); Standard_Variance =%6u (mm/s2)\r\n", + (int)(average_roc_acc), (int)(standard_variance_roc_acc)); + + //sts_fall_rising_pattern_factor1 = (int)(standard_variance_roc_distance); + sts_fall_rising_pattern_factor1 = (int)(average_roc_distance); + if (last_average_presence_distance >0) + sts_fall_rising_pattern_factor2 = (uint16_t)(abs((uint16_t)average_presence_distance - (uint16_t)last_average_presence_distance)); + //sts_fall_rising_pattern_factor2 = (uint16_t)(abs((uint16_t)average_presence_distance - (uint16_t)sts_sensor_install_height)); + //APP_LOG(TS_OFF, VLEVEL_M, "\r\n*************** factor2=%6u ---- average_distance=%6u ----install height=%6u\r\n", sts_fall_rising_pattern_factor2,average_presence_distance,sts_sensor_install_height ) + sts_fall_rising_pattern_factor3 = (int)(standard_variance_presence_score); + + APP_LOG(TS_OFF, VLEVEL_L,"\r\nAvg-Dist =%6u (mm), Last_AVG-Dist =%6u (mm)\r\n", (int)(average_presence_distance), (int)(last_average_presence_distance)); + APP_LOG(TS_OFF, VLEVEL_L,"\r\nStandard Variance Presence_score =%u (score)\r\n", (int)(standard_variance_presence_score)); + + APP_LOG(TS_OFF, VLEVEL_M, "\r\nThreshold 1: Acc = %6u (mm/s) ---- Measure 1 = %6u (mm/s)---- \r\n", (int)(sts_fall_detection_acc_threshold), (int)(sts_fall_rising_pattern_factor1)); - APP_LOG(TS_OFF, VLEVEL_L, "Threshold 2: \r\nDis = %6u cm \r\nMeasure 2 = %6u cm ---- \r\n", - (int)(sts_fall_detection_depth_threshold), (int)(sts_fall_rising_pattern_factor2)); -#endif + APP_LOG(TS_OFF, VLEVEL_M, "\r\nThreshold 2: Dis = %6u (cm) --- Measure 2 = %6u (cm) ---- \r\n", + (int)(sts_fall_detection_depth_threshold), (int)(sts_fall_rising_pattern_factor2/10)); + + APP_LOG(TS_OFF, VLEVEL_M, "\r\nMeasure 3 = %6u (score) ---- \r\n", (int)(sts_fall_rising_pattern_factor3)); +//#endif // ******************************************* // *********** detection situation suggestion @@ -726,17 +790,24 @@ void STS_YunhornCheckStandardDeviation(void) { sts_fall_rising_detected_result = STS_PRESENCE_STAYSTILL; //sts_fall_rising_detected_result = STS_PRESENCE_NO_MOVEMENT; - } else { - sts_fall_rising_detected_result = STS_PRESENCE_NORMAL; } + // + // Considering factor #1 --- fall down speed, say > 0.3g or in less than 0.3 seconds + // + if ( sts_fall_rising_pattern_factor1 > (uint16_t)sts_fall_detection_acc_threshold) { // if ((average_presence_distance > (sts_motion_feature[motion_feature_count].p_dist_avg + sts_motion_feature[motion_feature_count].p_dist_v))) // if ((average_presence_distance > (sts_motion_feature[motion_feature_count].p_dist_avg + sts_motion_feature[motion_feature_count].p_dist_v))) // if ((average_presence_distance > (last_average_presence_distance + sts_fall_detection_depth_threshold*0.1))) - if ((sts_fall_rising_pattern_factor2 > sts_fall_detection_depth_threshold ) && (average_presence_distance > DEFAULT_START_M)) + + // + // Considering factor #2 --- fall down depth, say > 30 cm 40 cm in given factor 1 time unit + // + + if ((sts_fall_rising_pattern_factor2 > (sts_fall_detection_depth_threshold*10) ) && (average_presence_distance > 1000*DEFAULT_START_M)) { sts_fall_rising_detected_result = STS_PRESENCE_FALL; //last_sts_fall_rising_detected_result = sts_fall_rising_detected_result; @@ -766,7 +837,7 @@ void STS_YunhornCheckStandardDeviation(void) } } - if ((last_sts_fall_rising_detected_result == STS_PRESENCE_FALL)) + if ((last_sts_fall_rising_detected_result == STS_PRESENCE_FALL)&&( sts_fall_rising_detected_result != STS_PRESENCE_FALL )) { if ((average_presence_distance < (sts_motion_feature[motion_feature_count].p_dist_avg + sts_motion_feature[motion_feature_count].p_dist_standard))) { @@ -780,21 +851,15 @@ void STS_YunhornCheckStandardDeviation(void) } last_sts_fall_rising_detected_result = sts_fall_rising_detected_result; + } else if ((average_presence_distance + sts_motion_feature[motion_feature_count].p_dist_standard) > last_average_presence_distance) { sts_fall_rising_detected_result = STS_PRESENCE_LAYDOWN; - } else { - sts_fall_rising_detected_result = STS_PRESENCE_NORMAL; } } last_sts_fall_rising_detected_result = sts_fall_rising_detected_result; last_average_presence_distance = average_presence_distance; -#if 0 - if (sts_fall_rising_detected_result != STS_PRESENCE_NORMAL) - { - STS_FallDetection_LampBarProcess(); - } -#endif + } diff --git a/Core/Src/yunhorn_sts_presence_rss_bring_up_test.c b/Core/Src/yunhorn_sts_presence_rss_bring_up_test.c index 75fa886..d631606 100644 --- a/Core/Src/yunhorn_sts_presence_rss_bring_up_test.c +++ b/Core/Src/yunhorn_sts_presence_rss_bring_up_test.c @@ -45,7 +45,7 @@ int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result) uint8_t t=0; uint8_t test_result[20]={0x0}; - APP_LOG(TS_OFF, VLEVEL_H,"-- 0 -- Acconeer software version %s\n", acc_version_get()); + APP_LOG(TS_OFF, VLEVEL_L,"-- 0 -- Acconeer software version %s\n", acc_version_get()); const acc_hal_t *hal = acc_hal_integration_get_implementation(); @@ -89,7 +89,7 @@ int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result) acc_rss_assembly_test_configuration_communication_write_read_test_disable(configuration); // Enable and run: Interrupt Test - APP_LOG(TS_OFF, VLEVEL_H,"-- Interrupt Test --- Start ********************\r\n"); + APP_LOG(TS_OFF, VLEVEL_L,"-- Interrupt Test --- Start ********************\r\n"); acc_rss_assembly_test_configuration_communication_interrupt_test_enable(configuration); if (!run_test(configuration)) @@ -104,10 +104,10 @@ int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result) } acc_rss_assembly_test_configuration_communication_interrupt_test_disable(configuration); - APP_LOG(TS_OFF, VLEVEL_H,"-- Interrupt Test --- End ********************\r\n"); + APP_LOG(TS_OFF, VLEVEL_L,"-- Interrupt Test --- End ********************\r\n"); // Enable and run: Clock Test - APP_LOG(TS_OFF, VLEVEL_H,"-- Clock Test --- Start ********************\r\n"); + APP_LOG(TS_OFF, VLEVEL_L,"-- Clock Test --- Start ********************\r\n"); acc_rss_assembly_test_configuration_clock_test_enable(configuration); if (!run_test(configuration)) { @@ -121,11 +121,11 @@ int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result) } acc_rss_assembly_test_configuration_clock_test_disable(configuration); - APP_LOG(TS_OFF, VLEVEL_H,"-- Clock Test --- end ********************\r\n"); + APP_LOG(TS_OFF, VLEVEL_L,"-- Clock Test --- end ********************\r\n"); // Enable and run: Power cycle test - APP_LOG(TS_OFF, VLEVEL_H,"-- Power cycle test --- Start ********************\r\n"); + APP_LOG(TS_OFF, VLEVEL_L,"-- Power cycle test --- Start ********************\r\n"); acc_rss_assembly_test_configuration_power_cycle_test_enable(configuration); if (!run_test(configuration)) { @@ -139,11 +139,11 @@ int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result) } acc_rss_assembly_test_configuration_power_cycle_test_disable(configuration); - APP_LOG(TS_OFF, VLEVEL_H,"-- Power cycle test --- end ********************\r\n"); + APP_LOG(TS_OFF, VLEVEL_L,"-- Power cycle test --- end ********************\r\n"); // Enable and run: Hibernate Test - APP_LOG(TS_OFF, VLEVEL_H,"-- Hibernate Test --- Start ********************\r\n"); + APP_LOG(TS_OFF, VLEVEL_L,"-- Hibernate Test --- Start ********************\r\n"); acc_rss_assembly_test_configuration_communication_hibernate_test_enable(configuration); if (!run_test(configuration)) { @@ -157,10 +157,10 @@ int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result) } acc_rss_assembly_test_configuration_communication_hibernate_test_disable(configuration); - APP_LOG(TS_OFF, VLEVEL_H,"-- Hibernate Test --- End ********************\r\n"); + APP_LOG(TS_OFF, VLEVEL_L,"-- Hibernate Test --- End ********************\r\n"); // Enable and run: Supply Test - APP_LOG(TS_OFF, VLEVEL_H,"-- Supply Test --- Start ********************\r\n"); + APP_LOG(TS_OFF, VLEVEL_L,"-- Supply Test --- Start ********************\r\n"); acc_rss_assembly_test_configuration_supply_test_enable(configuration); if (!run_test(configuration)) { @@ -174,10 +174,10 @@ int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result) } acc_rss_assembly_test_configuration_supply_test_disable(configuration); - APP_LOG(TS_OFF, VLEVEL_H,"-- Supply Test --- End ********************\r\n"); + APP_LOG(TS_OFF, VLEVEL_L,"-- Supply Test --- End ********************\r\n"); // Enable and run: Clock Test - APP_LOG(TS_OFF, VLEVEL_H,"-- Clock Test --- Start ********************\r\n"); + APP_LOG(TS_OFF, VLEVEL_L,"-- Clock Test --- Start ********************\r\n"); acc_rss_assembly_test_configuration_clock_test_enable(configuration); if (!run_test(configuration)) { @@ -191,10 +191,10 @@ int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result) } acc_rss_assembly_test_configuration_clock_test_disable(configuration); - APP_LOG(TS_OFF, VLEVEL_H,"-- Clock Test --- end ********************\r\n"); + APP_LOG(TS_OFF, VLEVEL_L,"-- Clock Test --- end ********************\r\n"); // Enable and run: Power cycle test - APP_LOG(TS_OFF, VLEVEL_H,"-- Power cycle test --- Start ********************\r\n"); + APP_LOG(TS_OFF, VLEVEL_L,"-- Power cycle test --- Start ********************\r\n"); acc_rss_assembly_test_configuration_power_cycle_test_enable(configuration); if (!run_test(configuration)) { @@ -208,14 +208,14 @@ int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result) } acc_rss_assembly_test_configuration_power_cycle_test_disable(configuration); - APP_LOG(TS_OFF, VLEVEL_H,"-- Power cycle test --- end ********************\r\n"); + APP_LOG(TS_OFF, VLEVEL_L,"-- Power cycle test --- end ********************\r\n"); - APP_LOG(TS_OFF, VLEVEL_H,"-- 10 -- Bring up test: All tests passed\n"); + APP_LOG(TS_OFF, VLEVEL_L,"-- 10 -- Bring up test: All tests passed\n"); test_result[t++] = 1; //(10) memcpy(rss_self_test_result, test_result, 12); - APP_LOG(TS_OFF, VLEVEL_H,"--Bring up test result #=%d \r\n", t); + APP_LOG(TS_OFF, VLEVEL_L,"--Bring up test result #=%d \r\n", t); acc_rss_assembly_test_configuration_destroy(&configuration); acc_rss_deactivate(); @@ -231,17 +231,17 @@ static bool run_test(acc_rss_assembly_test_configuration_t configuration) if (!acc_rss_assembly_test(configuration, test_results, &nr_of_test_results)) { - APP_LOG(TS_OFF, VLEVEL_H,"Bring up test: Failed to complete\n"); + APP_LOG(TS_OFF, VLEVEL_L,"Bring up test: Failed to complete\n"); return false; } else { - APP_LOG(TS_OFF, VLEVEL_H,"Bring up test: SUCCESS to complete\n"); + APP_LOG(TS_OFF, VLEVEL_L,"Bring up test: SUCCESS to complete\n"); } for (uint16_t i = 0; i < nr_of_test_results; i++) { const bool passed = test_results[i].test_passed; - APP_LOG(TS_OFF, VLEVEL_H,"Name: %s, result: %s\n", test_results[i].test_name, passed ? "Pass" : "Fail"); + APP_LOG(TS_OFF, VLEVEL_L,"Name: %s, result: %s\n", test_results[i].test_name, passed ? "Pass" : "Fail"); if (!passed) { diff --git a/Core/Src/yunhorn_sts_process.c b/Core/Src/yunhorn_sts_process.c index 96329c2..8e61c1c 100644 --- a/Core/Src/yunhorn_sts_process.c +++ b/Core/Src/yunhorn_sts_process.c @@ -37,44 +37,56 @@ /* USER CODE BEGIN Includes */ extern volatile sts_cfg_nvm_t sts_cfg_nvm; + extern volatile uint8_t sts_ac_code[20]; +volatile uint8_t sts_work_mode = STS_UNI_MODE; +#if 0 +#if defined(STS_O7) +volatile uint8_t sts_work_mode = STS_UNI_MODE; +#elif defined(STS_O6) +volatile uint8_t sts_work_mode = STS_DUAL_MODE; +#elif defined(STS_O2) +volatile uint8_t sts_work_mode = STS_RSS_MODE; +#endif +#endif volatile uint8_t sts_service_mask=0; volatile uint32_t rfac_timer; volatile uint8_t sensor_data_ready=0; +volatile STS_PRESENCE_SENSOR_Event_Status_t sts_o7_event_status; +// GPIO reed hall pin extern volatile uint8_t sts_reed_hall_result; volatile uint8_t last_sts_reed_hall_result; +extern volatile uint8_t sts_hall1_read,sts_hall2_read, sts_hall3_read, sts_hall4_read; +volatile uint8_t sts_reed_hall_1_result=STS_Status_Door_Open,sts_reed_hall_2_result=STS_Status_SOS_Release, last_sts_reed_hall_1_result=STS_Status_Door_Open, last_sts_reed_hall_2_result=STS_Status_SOS_Release; +volatile uint8_t sts_reed_hall_3_result=STS_Status_Door_Open, last_sts_reed_hall_3_result=STS_Status_Door_Open, sts_reed_hall_4_result=STS_Status_Door_Open, last_sts_reed_hall_4_result=STS_Status_Door_Open; volatile uint8_t sts_soap_level_state; + +// RSS motion and distance volatile STS_OO_SensorStatusDataTypeDef sts_o7_sensorData; -volatile STS_PRESENCE_SENSOR_Event_Status_t sts_o7_event_status; -volatile float sts_distance_rss_distance, sts_sensor_install_height=0;//in mm +volatile uint16_t sts_distance_rss_distance=0, sts_sensor_install_height=0;//in mm extern volatile float sts_presence_rss_distance, sts_presence_rss_score; -extern volatile uint8_t sts_hall1_read,sts_hall2_read; -volatile uint8_t sts_reed_hall_1_result=STS_Status_Door_Open,sts_reed_hall_2_result=STS_Status_SOS_Release, last_sts_reed_hall_1_result=STS_Status_Door_Open, last_sts_reed_hall_2_result=STS_Status_SOS_Release; - -volatile uint8_t sts_rss_config_updated_flag = 0; -extern volatile uint8_t mems_int1_detected, link_wakeup, link_sleep; -volatile uint32_t event_start_time=0, event_stop_time=0; -volatile uint32_t event_door_lock_start_time=0,event_door_lock_stop_time=0; +volatile uint8_t sts_rss_config_updated_flag = STS_RSS_CONFIG_NON; extern volatile uint8_t sts_occupancy_overtime_state; -//extern volatile STS_OO_RSS_SensorTuneDataTypeDef sts_presence_rss_config; -extern volatile sts_cfg_nvm_t sts_cfg_nvm; -extern volatile uint8_t sts_fall_detection_acc_threshold, sts_fall_detection_depth_threshold, sts_occupancy_overtime_threshold_in_10min; -extern volatile uint8_t sts_fall_rising_detected_result_changed_flag; -extern volatile uint8_t last_sts_fall_rising_detected_result; - - -extern volatile uint16_t sts_motionless_duration_threshold_in_min; -extern volatile uint8_t sts_emergency_button_pushed, sts_rss_2nd_result,sts_tof_result, sts_status_color, sts_lamp_bar_color, sts_service_mask; extern volatile distance_measure_cfg_t distance_cfg; -extern uint8_t sts_fall_rising_detected_result; extern volatile uint16_t sts_fall_rising_pattern_factor1; extern volatile uint16_t sts_roc_acc_standard_variance; +volatile uint32_t last_sts_rss_time_stamp=0; + +// RSS fall detection +extern volatile uint8_t sts_fall_detection_acc_threshold, sts_fall_detection_depth_threshold, sts_occupancy_overtime_threshold_in_10min; +extern volatile uint8_t sts_fall_rising_detected_result, sts_fall_rising_detected_result_changed_flag; +extern volatile uint8_t sts_presence_fall_detection; +extern volatile uint8_t last_sts_fall_rising_detected_result; + +extern volatile uint16_t sts_motionless_duration_threshold_in_min; +extern volatile uint8_t sts_status_color, sts_lamp_bar_color;//puColor +extern volatile uint8_t sts_cloud_netcolor; //netColor extern uint8_t luminance_level; SysTime_t mems_event_time; -volatile uint32_t last_sts_rss_time_stamp=0; -extern volatile uint8_t sts_reed_hall_ext_int; + + volatile uint8_t sts_occupancy_status; volatile uint8_t sts_hall1_changed_flag=0, sts_hall2_changed_flag=0, last_sts_hall1_result=0, last_sts_hall2_result=0; volatile uint8_t sts_reed_hall_changed_flag = 0; @@ -96,12 +108,6 @@ extern volatile uint8_t detected_hs_zone; extern volatile STS_OO_RSS_SensorTuneDataTypeDef sts_presence_rss_config; volatile uint32_t cnt=0; -extern volatile distance_measure_cfg_t distance_cfg; -volatile uint8_t sts_work_mode = STS_RSS_MODE; -extern uint8_t luminance_level; -extern volatile uint8_t sts_status_color; -extern volatile uint8_t sts_lamp_bar_color; //puColor -extern volatile uint8_t sts_cloud_netcolor; //netColor volatile uint8_t sts_tof_result_changed_flag = 0; @@ -222,20 +228,38 @@ void STS_YunhornSTSEventRFAC_Process(void) void STS_YunhornSTSEventP1_Process(void) { + sts_reed_hall_1_result = HALL1_STATE; //sts_hall1_read; if (sts_reed_hall_1_result != last_sts_reed_hall_1_result) { - sts_reed_hall_changed_flag = TRUE; + sts_reed_hall_changed_flag |= 0x01; + } last_sts_reed_hall_1_result = sts_reed_hall_1_result; sts_reed_hall_2_result = HALL2_STATE;// sts_hall2_read; if (sts_reed_hall_2_result != last_sts_reed_hall_2_result) { - sts_reed_hall_changed_flag = TRUE; + sts_reed_hall_changed_flag |= 0x02; + } last_sts_reed_hall_2_result = sts_reed_hall_2_result; + sts_reed_hall_3_result = sts_hall3_read;//HALL3_STATE;// sts_hall3_read; + if (sts_reed_hall_3_result != last_sts_reed_hall_3_result) + { + sts_reed_hall_changed_flag |= 0x04; + } + last_sts_reed_hall_3_result = sts_reed_hall_3_result; + + sts_reed_hall_4_result = sts_hall4_read;//HALL4_STATE;// sts_hall3_read; + if (sts_reed_hall_4_result != last_sts_reed_hall_4_result) + { + sts_reed_hall_changed_flag |= 0x08; + } + last_sts_reed_hall_4_result = sts_reed_hall_4_result; + + STS_Combined_Status_Processing(); } @@ -250,12 +274,30 @@ void STS_YunhornSTSEventP2_Process(void) //STS_Lamp_Bar_Refresh(); //TODO XXX eliminate refresh every second.... try if ((sts_work_mode >= STS_RSS_MODE) && (sts_work_mode <= STS_TOF_RSS_MODE)) { + switch (sts_work_mode) { + case STS_RSS_MODE: + sts_rss_config_updated_flag = STS_RSS_CONFIG_DEFAULT; + break; + case STS_DUAL_MODE: + sts_rss_config_updated_flag = STS_RSS_CONFIG_DEFAULT; + break; + case STS_UNI_MODE: + sts_rss_config_updated_flag = STS_RSS_CONFIG_FALL_DETECTION; + break; + default: + break; + } + sts_presence_rss_fall_rise_detection(); sts_rss_result_changed_flag = (sts_rss_result == last_sts_rss_result)? 0:1; + last_sts_rss_result = sts_rss_result; - sts_fall_rising_detected_result_changed_flag = (sts_fall_rising_detected_result == last_sts_fall_rising_detected_result)?0:1; + //sts_fall_rising_detected_result_changed_flag = (sts_fall_rising_detected_result == last_sts_fall_rising_detected_result)?0:1; + //sts_fall_rising_detected_result_changed_flag = (sts_fall_rising_detected_result != last_sts_fall_rising_detected_result)?1:0; + + last_sts_fall_rising_detected_result = sts_fall_rising_detected_result; if (sts_service_mask > 0 ) { @@ -274,7 +316,7 @@ void STS_Reed_Hall_Presence_Detection(void) // HAL_Delay(50); // BOUNCING ELIMIATION sts_reed_hall_1_result = (sts_hall1_read==0)?STS_Status_Door_Close:STS_Status_Door_Open; sts_reed_hall_2_result = (sts_hall2_read==0)?STS_Status_Door_Close:STS_Status_Door_Open; - + sts_reed_hall_3_result = (sts_hall3_read==0)?STS_Status_Door_Close:STS_Status_Door_Open; //sts_reed_hall_result = ((STS_Reed_Hall_State)&STS_Status_Door_Open); @@ -282,7 +324,7 @@ void STS_Reed_Hall_Presence_Detection(void) sts_reed_hall_changed_flag = 0; - sts_reed_hall_ext_int = 0; + } @@ -461,6 +503,8 @@ void STS_Combined_Status_Processing(void) { case STS_NETWORK_MODE: sts_status_color = sts_cloud_netcolor; + sts_lamp_bar_color = sts_cloud_netcolor; + break; case STS_WIRED_MODE: // NO LAMP BAR FOR THOSE WATER LEAKAGE SENSOR OR SOAP CAPACITY SENSORS sts_status_color = STS_DARK; @@ -502,11 +546,13 @@ void STS_Combined_Status_Processing(void) break; case STS_UNI_MODE: //FOR STS-O7 - if ((sts_rss_result == STS_RESULT_NO_MOTION) && (sts_reed_hall_1_result == STS_Status_Door_Open )&& (sts_reed_hall_2_result == STS_Status_SOS_Release )) + if ((sts_rss_result == STS_RESULT_NO_MOTION) && (sts_reed_hall_1_result == STS_Status_Door_Open )&& (sts_reed_hall_2_result == STS_Status_SOS_Release ) + && (sts_reed_hall_3_result == STS_Status_Alarm_Mute_Release )&& (sts_reed_hall_4_result == STS_Status_Alarm_Reset_Release )) { sts_status_color = STS_GREEN; - } else if ((sts_rss_result == STS_RESULT_MOTION) || (sts_reed_hall_1_result == STS_Status_Door_Close )||(sts_reed_hall_2_result == STS_Status_SOS_Pushdown )) + } else if ((sts_rss_result == STS_RESULT_MOTION) || (sts_reed_hall_1_result == STS_Status_Door_Close )||(sts_reed_hall_2_result == STS_Status_SOS_Pushdown ) + || (sts_reed_hall_3_result == STS_Status_Alarm_Mute_Pushdown )|| (sts_reed_hall_4_result == STS_Status_Alarm_Reset_Pushdown )) { sts_status_color = STS_RED; @@ -623,10 +669,11 @@ void STS_Combined_Status_Processing(void) } - if ((sts_rss_result_changed_flag)|| (sts_reed_hall_changed_flag)) + if ((sts_rss_result_changed_flag)|| (sts_reed_hall_changed_flag)||(sts_fall_rising_detected_result_changed_flag)) { //sts_rss_result_changed_flag =0; //sts_reed_hall_changed_flag =0; + //sts_fall_rising_detected_result_changed_flag =0; //sts_tof_result_changed_flag =0; sensor_data_ready = 1; //STS_PRESENCE_SENSOR_Prepare_Send_Data(); @@ -655,8 +702,10 @@ void STS_PRESENCE_SENSOR_NVM_CFG(void) sts_presence_rss_config.default_inter_frame_deviation_time_const = (float)(sts_cfg_nvm.p[RSS_CFG_ITE_DEVIATION]*0.1f); sts_presence_rss_config.default_inter_frame_fast_cutoff = (float)(sts_cfg_nvm.p[RSS_CFG_ITE_FAST_CUTOFF]); sts_presence_rss_config.default_inter_frame_slow_cutoff = (float)(sts_cfg_nvm.p[RSS_CFG_ITE_SLOW_CUTOFF]*0.01f); + sts_presence_rss_config.default_intra_frame_time_const = (float)(sts_cfg_nvm.p[RSS_CFG_ITR_TIME]); sts_presence_rss_config.default_intra_frame_weight = (float)(sts_cfg_nvm.p[RSS_CFG_ITR_WEIGHT]*0.1f); + sts_presence_rss_config.default_output_time_const = (float)(sts_cfg_nvm.p[RSS_CFG_OUTPUT_TIME]*0.1f); //filter parameter @@ -697,22 +746,25 @@ void STS_PRESENCE_SENSOR_Init_Send_Data(void) sts_o7_sensorData.unconscious_duration = 0x0; sts_o7_sensorData.no_movement_duration = 0x0; - sts_o7_sensorData.event_sensor1_start_time = 0x0; - sts_o7_sensorData.event_sensor1_duration = 0x0; + sts_o7_sensorData.event_sensor1_start_time = 0x0; + sts_o7_sensorData.event_sensor1_duration = 0x0; - sts_o7_sensorData.event_sensor2_start_time = 0x0; - sts_o7_sensorData.event_sensor2_duration = 0x0; - sts_o7_sensorData.event_sensor2_start_timestamp = 0x0; - sts_o7_sensorData.event_sensor2_stop_timestamp = 0x0; + sts_o7_sensorData.event_sensor2_start_time = 0x0; + sts_o7_sensorData.event_sensor2_duration = 0x0; + sts_o7_sensorData.event_sensor2_start_timestamp = 0x0; + sts_o7_sensorData.event_sensor2_stop_timestamp = 0x0; - sts_o7_sensorData.event_sensor3_motion_start_time = 0x0; - sts_o7_sensorData.event_sensor3_motion_duration = 0x0; - sts_o7_sensorData.event_sensor3_fall_start_time = 0x0; - sts_o7_sensorData.event_sensor3_fall_start_time_stamp = 0x0; - sts_o7_sensorData.event_sensor3_fall_duration = 0x0; + sts_o7_sensorData.event_sensor3_motion_start_time = 0x0; + sts_o7_sensorData.event_sensor3_motion_duration = 0x0; + sts_o7_sensorData.event_sensor3_fall_start_time = 0x0; + sts_o7_sensorData.event_sensor3_fall_start_time_stamp = 0x0; + sts_o7_sensorData.event_sensor3_fall_duration = 0x0; sts_o7_sensorData.event_sensor3_fall_stop_time_stamp = 0x0; - sts_o7_sensorData.event_sensor4_start_time = 0x0; - sts_o7_sensorData.event_sensor4_duration = 0x0; + sts_o7_sensorData.event_sensor4_start_time = 0x0; + sts_o7_sensorData.event_sensor4_duration = 0x0; + sts_o7_sensorData.event_sensor3_fall_distance = 0x0; + sts_o7_sensorData.event_sensor3_fall_motionscore = 0x0; + sts_o7_sensorData.battery_Pct = 99; // 99% as init value sts_o7_sensorData.dutycycletimelevel = 1; @@ -723,10 +775,13 @@ void STS_PRESENCE_SENSOR_Prepare_Send_Data(STS_OO_SensorStatusDataTypeDef *senso { sensor_data->lamp_bar_color = sts_lamp_bar_color; sensor_data->workmode = sts_work_mode; + +// #1 for HALL_ELEMENT, DOOR CONTACT, SENSOR STATE PROCESS sensor_data->state_sensor1_on_off = HALL1_STATE;//sts_hall1_read; //sts_hsts_reed_hall_result; // sts_hall1_read sensor_data->state_sensor2_on_off = HALL2_STATE;//sts_hall2_read; //sts_emergency_button_pushed; //sts_hall2_read sensor_data->state_sensor3_on_off = sts_rss_result; - sensor_data->state_sensor4_on_off = sts_rss_2nd_result; + sensor_data->state_sensor4_on_off = sts_hall3_read; //for alarm mute button + sensor_data->state_sensor5_on_off = sts_hall4_read; //for alarm reset button if (sensor_data->state_sensor2_on_off==STS_Status_SOS_Pushdown) { @@ -740,17 +795,18 @@ void STS_PRESENCE_SENSOR_Prepare_Send_Data(STS_OO_SensorStatusDataTypeDef *senso sts_o7_sensorData.event_sensor2_stop_timestamp = 0; } +// #2 for MOTION RELATED SENSOR STATE PROCESS, OCCUPY/VACANT/OVERSTAY/LONGSTAY/UNCONSCIOUS if (sts_rss_result == STS_RESULT_MOTION) { - sensor_data->rss_presence_distance = (uint16_t)(sts_presence_rss_distance)&0xFFFF; - sensor_data->rss_presence_score = (uint16_t)(sts_presence_rss_score)&0xFFFF; + sensor_data->rss_presence_distance = (uint16_t)(sts_presence_rss_distance); + sensor_data->rss_presence_score = (uint16_t)(sts_presence_rss_score); // uint8_t sts_unconscious_state; // uint16_t sts_unconscious_threshold, sts_unconscious_threshold_duration; - } else { - - sensor_data->rss_presence_distance = 0x0; - sensor_data->rss_presence_score = 0x0; } + //else { + // sensor_data->rss_presence_distance = 0x0; + // sensor_data->rss_presence_score = 0x0; + // } // no_movement or unconscious duration sensor_data->unconscious_state = ((sts_fall_rising_detected_result == STS_PRESENCE_UNCONSCIOUS) || @@ -762,24 +818,24 @@ void STS_PRESENCE_SENSOR_Prepare_Send_Data(STS_OO_SensorStatusDataTypeDef *senso sensor_data->no_movement_duration = sts_o7_sensorData.event_sensor3_no_movement_duration; if (sensor_data->unconscious_state !=0) { - APP_LOG(TS_OFF,VLEVEL_L,"\r\n ... Unconscious or No Movement Duration = %u Sec [Threshold: %u Seconds]\r\n", + APP_LOG(TS_OFF,VLEVEL_M,"\r\n ... Unconscious or No Movement Duration = %u Sec [Threshold: %u Seconds]\r\n", sensor_data->unconscious_duration, sts_motionless_duration_threshold_in_min*60); } - // Over stay, long stay duration and state sensor_data->over_stay_state = sts_o7_sensorData.over_stay_state; sensor_data->over_stay_duration = sts_o7_sensorData.event_sensor1_duration; if (sensor_data->over_stay_state !=0) { - APP_LOG(TS_OFF,VLEVEL_L,"\r\n ... Over Stay Duration = %u Sec [Threshold: %u Seconds]\r\n", + APP_LOG(TS_OFF,VLEVEL_M,"\r\n ... Over Stay Duration = %u Sec [Threshold: %u Seconds]\r\n", sensor_data->over_stay_duration, sts_occupancy_overtime_threshold_in_10min*60); } - // Fall detection and duration, confirmation duration +// #3 for FALL DETECTION, FALL, RISING, LAYDOWN DURATION CONFIRMATION STATE PROCESS sensor_data->fall_state = sts_fall_rising_detected_result; if ((sts_fall_rising_detected_result == STS_PRESENCE_FALL)|| + (sts_fall_rising_detected_result == STS_PRESENCE_RISING)|| (sts_fall_rising_detected_result == STS_PRESENCE_LAYDOWN)) { APP_LOG(TS_OFF, VLEVEL_M, "\r\n......FALL RISING DETECTION RESULT: %25s \r\n", @@ -788,7 +844,8 @@ void STS_PRESENCE_SENSOR_Prepare_Send_Data(STS_OO_SensorStatusDataTypeDef *senso sensor_data->fall_gravity = (uint8_t)sts_roc_acc_standard_variance; sensor_data->event_sensor3_fall_start_time_stamp = sts_o7_sensorData.event_sensor3_fall_start_time_stamp; sensor_data->event_sensor3_fall_stop_time_stamp = sts_o7_sensorData.event_sensor3_fall_stop_time_stamp; - + sensor_data->event_sensor3_fall_distance = (uint16_t)(sts_o7_sensorData.event_sensor3_fall_distance); + sensor_data->event_sensor3_fall_motionscore = (uint16_t)(sts_o7_sensorData.event_sensor3_fall_motionscore); } else { sensor_data->fall_speed = 0; sensor_data->fall_gravity = 0; @@ -796,9 +853,10 @@ void STS_PRESENCE_SENSOR_Prepare_Send_Data(STS_OO_SensorStatusDataTypeDef *senso sensor_data->event_sensor3_fall_stop_time_stamp =0; } - // For occupancy over time process - //SysTime_t occupy_check_time = SysTimeGetMcuTime(); + #if 0 + // TODO XXXX + // FOR ALARM MUTE AND RESET if ((sts_occupancy_overtime_threshold_in_10min != 0) && (event_start_time !=0)) { if (sts_occupancy_overtime_state == 1U) { @@ -825,7 +883,7 @@ void STS_PRESENCE_SENSOR_Init(void) APP_LOG(TS_ON, VLEVEL_M, "##### YunHorn SmarToilets(r) Presence Sensor Started\r\n"); sts_o7_sensorData.workmode = (uint8_t)sts_work_mode; //STS_DUAL_MODE; - //sts_o7_sensorData.lamp_bar_color = (uint8_t)STS_GREEN; + sts_o7_sensorData.lamp_bar_color = (uint8_t)STS_GREEN; sts_o7_sensorData.battery_Pct = 99; sts_o7_sensorData.dutycycletimelevel = 1; sts_o7_sensorData.event_sensor1_start_time = 0; @@ -861,13 +919,13 @@ void STS_PRESENCE_SENSOR_Init(void) sts_o7_sensorData.unconscious_state = 0; sts_o7_sensorData.unconscious_duration = 0; - PME_ON; - STS_PRESENCE_SENSOR_REEDSWITCH_HALL_Init(); + //PME_ON; + //STS_PRESENCE_SENSOR_REEDSWITCH_HALL_Init(); //STS_PRESENCE_SENSOR_TOF_Init(); //HAL_Delay(2000); //STS_PRESENCE_SENSOR_Distance_Measure_Process(); - mems_int1_detected=0; + } void STS_PRESENCE_SENSOR_TOF_Init(void) @@ -885,26 +943,42 @@ void STS_PRESENCE_SENSOR_RSS_Init(void) { APP_LOG(TS_ON, VLEVEL_H, "##### YunHorn SmarToilets(r) MEMS RSS Initializing \r\n"); - PME_ON; +// PME_ON; - if ((sts_distance_rss_distance==0)&&(sts_sensor_install_height==0)) + //if ((sts_distance_rss_distance==0)&&(sts_sensor_install_height==0)) { uint8_t exit_status =0; - exit_status=sts_distance_rss_detector_distance(); - if (exit_status ==0) { - APP_LOG(TS_ON, VLEVEL_M, "##### RSS Installation Height =%u \r\n", (uint16_t)sts_distance_rss_distance); - } - else { - APP_LOG(TS_ON, VLEVEL_M, "##### RSS Installation Height Error \r\n"); - } - sts_sensor_install_height=sts_distance_rss_distance; + do { + exit_status=sts_distance_rss_detector_distance(); + if (exit_status ==0) { + APP_LOG(TS_ON, VLEVEL_H, "##### RSS Installation Height =%u \r\n", (uint16_t)sts_distance_rss_distance); + } + else { + APP_LOG(TS_ON, VLEVEL_H, "##### RSS Installation Height Error \r\n"); + HAL_Delay(100); + } + } while((0)); + + sts_sensor_install_height = (uint16_t)sts_distance_rss_distance; } STS_PRESENCE_SENSOR_NVM_CFG(); - sts_rss_config_updated_flag = STS_RSS_CONFIG_DEFAULT; + switch (sts_work_mode) + { + case STS_RSS_MODE: + sts_rss_config_updated_flag = STS_RSS_CONFIG_DEFAULT; + break; + case STS_DUAL_MODE: + sts_rss_config_updated_flag = STS_RSS_CONFIG_DEFAULT; + break; - mems_int1_detected=0; + case STS_UNI_MODE: + sts_rss_config_updated_flag = STS_RSS_CONFIG_FALL_DETECTION; + break; + default: + break; + } } @@ -950,8 +1024,8 @@ void STS_PRESENCE_SENSOR_Function_Test_Process(uint8_t *self_test_result, uint8_ } HAL_Delay(1000); - memcpy(self_test_result, bring_up_result, 10); - mems_int1_detected=0; + UTIL_MEM_cpy_8(self_test_result, bring_up_result, 10); + } uint8_t STS_SENSOR_MEMS_Get_ID(uint8_t *devID) @@ -974,20 +1048,6 @@ uint8_t STS_SENSOR_MEMS_Get_ID(uint8_t *devID) } -void STS_SENSOR_MEMS_Reset(uint8_t cnt) -{ - switch (cnt) { - case 0: - case 1: - case 2: - HAL_GPIO_TogglePin(MEMS_POWER_GPIO_Port, MEMS_POWER_Pin); - break; - default: - break; - } - -} - #ifdef STS_R4 void YUNHORN_STS_R4_SENSOR_Read(STS_R0_SensorDataTypeDef *r4_data) { @@ -1092,7 +1152,7 @@ void OnSensor2StateChanged(void) } /* motion sensor RSS ON-OFF */ -void OnSensor3StateChanged(void) +void OnSensorRSS3StateChanged(void) { SysTime_t sensor_event_time = SysTimeGetMcuTime(); #if 0 @@ -1119,7 +1179,7 @@ void OnSensor3StateChanged(void) } /* motion sensor A: Motion/No-Motion Detection, Unconscious Detection */ -void OnSensor3AStateChanged(void) +void OnSensorRSS3AStateChanged(void) { SysTime_t sensor_event_time = SysTimeGetMcuTime(); #if 0 @@ -1145,7 +1205,7 @@ void OnSensor3AStateChanged(void) } /* motion sensor B, Fall Detection suggestionF */ -void OnSensor3BStateChanged(void) +void OnSensorRSS3BStateChanged(void) { SysTime_t sensor_event_time = SysTimeGetMcuTime(); uint32_t time_stamp=STS_Get_Date_Time_Stamp(); @@ -1163,15 +1223,21 @@ void OnSensor3BStateChanged(void) break; case STS_PRESENCE_FALL: - if (motion_in_hs_zone[0][motion_detected_count]) { + //if (motion_in_hs_zone[0][motion_detected_count]) + { sts_o7_sensorData.event_sensor3_fall_start_time_stamp = time_stamp; sts_o7_sensorData.event_sensor3_fall_start_time = sensor_event_time.Seconds; + + //start counter of fall after rising up or other release actions/states sts_o7_sensorData.event_sensor3_fall_duration = 0; + sts_o7_sensorData.event_sensor3_fall_stop_time_stamp = 0; + sts_o7_sensorData.event_sensor3_fall_stop_time = 0; } break; case STS_PRESENCE_RISING: - + sts_o7_sensorData.event_sensor3_fall_stop_time_stamp = time_stamp; + sts_o7_sensorData.event_sensor3_fall_stop_time = sensor_event_time.Seconds; break; case STS_PRESENCE_LAYDOWN: @@ -1198,7 +1264,7 @@ void OnSensor3BStateChanged(void) } /* motion sensor C: Over stay detection */ -void OnSensor3CStateChanged(void) +void OnSensorRSS3CStateChanged(void) { SysTime_t sensor_event_time = SysTimeGetMcuTime(); #if 0 @@ -1223,6 +1289,38 @@ void OnSensor3CStateChanged(void) } +void OnSensor3StateChanged(void) +{ +#if 0 + SysTime_t sensor_event_time = SysTimeGetMcuTime(); + // reserved... to be finalized 2024-06-03 + + if (sts_xxx_result) + sts_o7_sensorData.event_sensor4_start_time = sensor_event_time.Seconds; + else + sts_o7_sensorData.event_sensor4_stop_time = sensor_event_time.Seconds; +#endif + SysTime_t sensor_event_time = SysTimeGetMcuTime(); + uint32_t time_stamp=STS_Get_Date_Time_Stamp(); + + if (sts_hall3_read==STS_Status_Alarm_Mute_Pushdown) + { + sts_o7_sensorData.event_sensor4_start_time = sensor_event_time.Seconds; + sts_o7_sensorData.event_sensor4_start_timestamp = time_stamp; + sts_o7_sensorData.event_sensor4_stop_time = 0; + sts_o7_sensorData.event_sensor4_duration = 0; + APP_LOG(TS_OFF, VLEVEL_L, "Alarm Mute PushDown ---Timer start: %u\r\n",sts_o7_sensorData.event_sensor4_start_time ); + }else if (sts_hall3_read==STS_Status_Alarm_Mute_Release) + { + sts_o7_sensorData.event_sensor4_start_time = 0; + sts_o7_sensorData.event_sensor4_start_timestamp = 0; + sts_o7_sensorData.event_sensor4_stop_time = sensor_event_time.Seconds; + sts_o7_sensorData.event_sensor4_stop_timestamp = time_stamp; + //sts_o7_sensorData.over_stay_state = 0; + //sts_o7_sensorData.event_sensor2_duration = 0; + } +} + void OnSensor4StateChanged(void) { #if 0 @@ -1234,9 +1332,43 @@ void OnSensor4StateChanged(void) else sts_o7_sensorData.event_sensor4_stop_time = sensor_event_time.Seconds; #endif + SysTime_t sensor_event_time = SysTimeGetMcuTime(); + uint32_t time_stamp=STS_Get_Date_Time_Stamp(); + + if (sts_hall4_read==STS_Status_Alarm_Mute_Pushdown) + { + sts_o7_sensorData.event_sensor5_start_time = sensor_event_time.Seconds; + sts_o7_sensorData.event_sensor5_start_timestamp = time_stamp; + sts_o7_sensorData.event_sensor5_stop_time = 0; + sts_o7_sensorData.event_sensor5_duration = 0; + APP_LOG(TS_OFF, VLEVEL_L, "Alarm RESET PushDown ---Timer start: %u\r\n",sts_o7_sensorData.event_sensor5_start_time ); + }else if (sts_hall4_read==STS_Status_Alarm_Mute_Release) + { + sts_o7_sensorData.event_sensor5_start_time = 0; + sts_o7_sensorData.event_sensor5_start_timestamp = 0; + sts_o7_sensorData.event_sensor5_stop_time = sensor_event_time.Seconds; + sts_o7_sensorData.event_sensor5_stop_timestamp = time_stamp; + //sts_o7_sensorData.over_stay_state = 0; + //sts_o7_sensorData.event_sensor2_duration = 0; + } } +//卡尔曼滤波 +float KalmanFilter(float inData) +{ + static float prevData = 0; //先前数值 + static float p = 10, q = 0.001, r = 0.001, kGain = 0; // q控制误差 r控制响应速度 + + p = p + q; + kGain = p / ( p + r ); //计算卡尔曼增益 + inData = prevData + ( kGain * ( inData - prevData ) ); //计算本次滤波估计值 + p = ( 1 - kGain ) * p; //更新测量方差 + prevData = inData; + return inData; //返回滤波值 + + +} /* USER CODE BEGIN EF */ diff --git a/LoRaWAN/App/app_lorawan.c b/LoRaWAN/App/app_lorawan.c index 718fef8..8c72b4c 100644 --- a/LoRaWAN/App/app_lorawan.c +++ b/LoRaWAN/App/app_lorawan.c @@ -69,7 +69,8 @@ void MX_LoRaWAN_Init(void) /* USER CODE END MX_LoRaWAN_Init_1 */ SystemApp_Init(); /* USER CODE BEGIN MX_LoRaWAN_Init_2 */ - + //STS_Lamp_Bar_Self_Test_Simple(); + //STS_Lamp_Bar_Self_Test(); /* USER CODE END MX_LoRaWAN_Init_2 */ LoRaWAN_Init(); /* USER CODE BEGIN MX_LoRaWAN_Init_3 */ diff --git a/LoRaWAN/App/lora_app.c b/LoRaWAN/App/lora_app.c index b399655..65be4de 100644 --- a/LoRaWAN/App/lora_app.c +++ b/LoRaWAN/App/lora_app.c @@ -52,9 +52,9 @@ extern volatile uint8_t sts_service_mask; extern volatile uint32_t rfac_timer; volatile uint8_t sts_ac_code[YUNHORN_STS_AC_CODE_SIZE]={0x0}; extern hmac_result_t hmac_result; -extern volatile uint8_t sts_reed_hall_ext_int; -extern volatile uint8_t sts_hall1_read, sts_hall2_read; -volatile uint8_t last_sts_hall1_read=STS_Status_Door_Open, last_sts_hall2_read=STS_Status_SOS_Release; + +extern volatile uint8_t sts_hall1_read, sts_hall2_read, sts_hall3_read, sts_hall4_read; +volatile uint8_t last_sts_hall1_read=STS_Status_Door_Open, last_sts_hall2_read=STS_Status_SOS_Release, last_sts_hall3_read=STS_Status_Door_Open, last_sts_hall4_read=STS_Status_Door_Open ; volatile uint8_t sts_reed_hall_result =0, sts_emergency_button_pushed=0; // inital 0 = close extern volatile uint8_t sts_work_mode, sts_cloud_netcolor, sts_lamp_bar_color, sts_status_color; @@ -62,7 +62,7 @@ extern volatile uint8_t sts_lamp_bar_flashing_color; volatile uint8_t last_sts_lamp_bar_color=STS_DARK; extern volatile uint8_t sts_rss_result; extern volatile uint8_t sts_rss_result_changed_flag, sts_hall1_changed_flag, sts_hall2_changed_flag, sts_reed_hall_changed_flag; -volatile uint8_t sts_fall_detection_acc_threshold = 10, +volatile uint8_t sts_fall_detection_acc_threshold = 30, //0.3g sts_fall_detection_depth_threshold=20, sts_fall_confirm_threshold_in_10sec=1, sts_occupancy_overtime_threshold_in_10min=2; @@ -70,20 +70,21 @@ volatile uint8_t sts_unconscious_or_motionless_level_threshold=6; //6*128 volatile uint8_t sts_motionless_duration_threshold_in_min=1; // test mode, 1 min, normal 10 min. long occupation 30 min volatile uint16_t sts_unconscious_level_threshold=600; volatile uint8_t sts_alarm_mute_reset_timer_in_10sec=6; -extern volatile uint8_t sts_fall_rising_detected_result; +extern volatile uint8_t sts_fall_rising_detected_result, sts_fall_rising_detected_result_changed_flag, last_sts_fall_rising_detected_result; extern volatile uint32_t event_start_time, event_stop_time; extern volatile uint16_t sts_unconscious_threshold; volatile uint8_t sts_occupancy_overtime_state = 0; -volatile uint8_t sts_presence_fall_detection=TRUE; -volatile uint32_t SamplingPeriodicity = 1000; //unit ms +volatile uint8_t sts_presence_fall_detection=FALSE; +volatile uint32_t SamplingPeriodicity = 3000; //unit ms volatile uint32_t HeartBeatPeriodicity = 120000; //unit ms volatile uint8_t STS_LoRa_WAN_Joined = 0; -volatile uint8_t mems_int1_detected = 0; + volatile uint8_t upload_message_timer=0; volatile uint8_t heart_beat_timer =0; volatile uint32_t wcnt=0; volatile bool p2_work_finished=true; -uint8_t outbuf[128]={0x0}; +extern volatile uint8_t luminance_level; +uint8_t outbuf[255]={0x0}; volatile static bool r_b=true; volatile sts_cfg_nvm_t sts_cfg_nvm = { sts_mtmcode1, @@ -111,8 +112,8 @@ volatile sts_cfg_nvm_t sts_cfg_nvm = { 0x05, //inter frame deviation time const 0x05=[5]*0.1=0.5f 0x0A, //inter frame fast cutoff 0x0A=[10] = 10U 0x01, //inter frame slow cutoff,0x01=1[1]*0.01=0.01f - 0x00, //intra frame time const [0]=0 - 0x00, //intra frame weight, 0x00=[0]*0.1=0.0F + 0x00, //intra frame time const [0]=0 Lower to reduce sensitivity, higher to increase sensitivity + 0x0A, //intra frame weight, 0x00=[0]*0.1=0.0F 0x0A=10, 10*0.1=1 FOR FAST MOVEMENT TRACKING FALL DETECTION 0x05, //output time const 0x05=[5]*0.1=0.5 0x02, //downsampling factor [2]=2 0x03, //power saving mode ACTIVE [3] = 3U @@ -142,8 +143,8 @@ volatile sts_cfg_nvm_t sts_cfg_nvm = { #if defined(STS_O6)||defined(STS_O7) extern volatile uint8_t sensor_data_ready; extern volatile STS_OO_SensorStatusDataTypeDef sts_o7_sensorData; -extern volatile float sts_distance_rss_distance, sts_sensor_install_height; - +extern volatile uint16_t sts_distance_rss_distance, sts_sensor_install_height; +extern volatile uint8_t sts_rss_config_updated_flag; //#define STS_Status_Door_Close (1) //Normal Close NC:Open **2024-07-15 changed //#define STS_Status_Door_Open (0) //Normal Close NC:Close **2024-07-15 changed @@ -222,7 +223,7 @@ typedef enum TxEventType_e /* USER CODE BEGIN PTD */ #define YUNHORN_STS_RSS_WAKEUP_CHECK_TIME SamplingPeriodicity //3000 ms #define YUNHORN_STS_SAMPLING_CHECK_TIME SamplingPeriodicity -#define YUNHORN_STS_HEART_BEAT_CHECK_TIME HeartBeatPeriodicity +#define YUNHORN_STS_HEART_BEAT_CHECK_TIME 300000 //300 sec, 5 min /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ @@ -487,7 +488,7 @@ static LmHandlerParams_t LmHandlerParams = /** * @brief Type of Event to generate application Tx */ -static TxEventType_t EventType = TX_ON_EVENT; //TX_ON_TIMER;//TX_ON_EVENT; +static TxEventType_t EventType = TX_ON_TIMER; //TX_ON_TIMER; /** * @brief Timer to handle the application Tx @@ -612,8 +613,8 @@ void LoRaWAN_Init(void) UTIL_TIMER_Create(&TxLedTimer, LED_PERIOD_TIME, UTIL_TIMER_ONESHOT, OnTxTimerLedEvent, NULL); UTIL_TIMER_Create(&RxLedTimer, LED_PERIOD_TIME, UTIL_TIMER_ONESHOT, OnRxTimerLedEvent, NULL); - UTIL_TIMER_Create(&JoinLedTimer, LED_PERIOD_TIME, UTIL_TIMER_ONESHOT, OnJoinTimerLedEvent, NULL); - UTIL_TIMER_Create(&STSLampBarColorTimer, LED_PERIOD_TIME, UTIL_TIMER_PERIODIC, OnYunhornSTSLampBarColorTimerEvent, NULL); + UTIL_TIMER_Create(&JoinLedTimer, LED_PERIOD_TIME, UTIL_TIMER_PERIODIC, OnJoinTimerLedEvent, NULL); + UTIL_TIMER_Create(&STSLampBarColorTimer, LED_PERIOD_TIME, UTIL_TIMER_ONESHOT, OnYunhornSTSLampBarColorTimerEvent, NULL); UTIL_TIMER_Create(&STSDurationCheckTimer, 20*LED_PERIOD_TIME, UTIL_TIMER_PERIODIC, OnYunhornSTSDurationCheckTimerEvent, NULL); if (FLASH_IF_Init(NULL) != FLASH_IF_OK) @@ -647,8 +648,6 @@ void LoRaWAN_Init(void) /* USER CODE BEGIN LoRaWAN_Init_2 */ UTIL_TIMER_Start(&JoinLedTimer); - - /* USER CODE END LoRaWAN_Init_2 */ LmHandlerJoin(ActivationType, ForceRejoin); @@ -684,22 +683,18 @@ void LoRaWAN_Init(void) #endif #if defined(STS_O7)||defined(STS_O6) - UTIL_TIMER_Create(&YunhornSTSRSSWakeUpTimer, - YUNHORN_STS_RSS_WAKEUP_CHECK_TIME, - UTIL_TIMER_ONESHOT, OnYunhornSTSOORSSWakeUpTimerEvent, NULL); - UTIL_TIMER_Start(&YunhornSTSRSSWakeUpTimer); + //UTIL_TIMER_Create(&YunhornSTSRSSWakeUpTimer, YUNHORN_STS_RSS_WAKEUP_CHECK_TIME, UTIL_TIMER_ONESHOT, OnYunhornSTSOORSSWakeUpTimerEvent, NULL); + //UTIL_TIMER_Start(&YunhornSTSRSSWakeUpTimer); - UTIL_TIMER_Create(&YunhornSTSHeartBeatTimer, - YUNHORN_STS_HEART_BEAT_CHECK_TIME, - UTIL_TIMER_PERIODIC, OnYunhornSTSHeartBeatTimerEvent, NULL); + UTIL_TIMER_Create(&YunhornSTSHeartBeatTimer, YUNHORN_STS_HEART_BEAT_CHECK_TIME, UTIL_TIMER_PERIODIC, OnYunhornSTSHeartBeatTimerEvent, NULL); UTIL_TIMER_Start(&YunhornSTSHeartBeatTimer); - UTIL_TIMER_Start(&STSDurationCheckTimer); + UTIL_TIMER_Start(&STSLampBarColorTimer); + + //UTIL_TIMER_Start(&STSDurationCheckTimer); #else - UTIL_TIMER_Create(&YunhornSTSSamplingCheckTimer, - YUNHORN_STS_SAMPLING_CHECK_TIME, - UTIL_TIMER_PERIODIC, OnYunhornSTSSamplingCheckTimerEvent, NULL); + UTIL_TIMER_Create(&YunhornSTSSamplingCheckTimer, YUNHORN_STS_SAMPLING_CHECK_TIME, UTIL_TIMER_PERIODIC, OnYunhornSTSSamplingCheckTimerEvent, NULL); UTIL_TIMER_Start(&YunhornSTSSamplingCheckTimer); #endif /* USER CODE END LoRaWAN_Init_Last */ @@ -727,6 +722,7 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) STS_YunhornSTSEventP1_Process(); UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); //SendTxData(); + sts_reed_hall_changed_flag &= !(0x01); } last_sts_hall1_read = sts_hall1_read; } @@ -744,18 +740,54 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { STS_YunhornSTSEventP1_Process(); UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); - + sts_reed_hall_changed_flag &= !(0x02); } last_sts_hall2_read = sts_hall2_read; } break; + case HALL3_Pin: + sts_hall3_read = HALL3_STATE; + HAL_Delay(30); //de-bouncing + if (sts_hall3_read == HALL3_STATE) + { + APP_LOG(TS_OFF, VLEVEL_L, "\n\n ALARM MUTE Button Read = %02x --%s\r\n", sts_hall3_read, sts_sos_status_code[sts_hall3_read]); + OnSensor3StateChanged(); + //sensor_data_ready =1; + //UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP1), CFG_SEQ_Prio_0); + { + STS_YunhornSTSEventP1_Process(); + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); + sts_reed_hall_changed_flag &= !(0x04); + } + last_sts_hall3_read = sts_hall3_read; + } + break; + + case HALL4_Pin: + sts_hall4_read = HALL4_STATE; + HAL_Delay(30); //de-bouncing + if (sts_hall4_read == HALL4_STATE) + { + APP_LOG(TS_OFF, VLEVEL_L, "\n\n ALARM RESET Button Read = %02x --%s\r\n", sts_hall4_read, sts_sos_status_code[sts_hall4_read]); + OnSensor4StateChanged(); + //sensor_data_ready =1; + //UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP1), CFG_SEQ_Prio_0); + { + STS_YunhornSTSEventP1_Process(); + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); + sts_reed_hall_changed_flag &= !(0x08); + } + last_sts_hall4_read = sts_hall4_read; + } + break; + #else case BUT1_Pin: HAL_Delay(20); //de-bouncing - //sts_reed_hall_ext_int = 1; + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP1), CFG_SEQ_Prio_0); - //sts_reed_hall_ext_int = 0; + /* Note: when "EventType == TX_ON_TIMER" this GPIO is not initialized */ // if (EventType == TX_ON_EVENT) { @@ -766,10 +798,11 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) case BUT2_Pin: UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaStopJoinEvent), CFG_SEQ_Prio_0); break; -#endif + case BUT3_Pin: UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaStoreContextEvent), CFG_SEQ_Prio_0); break; +#endif default: break; } @@ -897,15 +930,17 @@ static void SendTxData(void) if (LmHandlerIsBusy() == false) { uint32_t i = 0; - STS_PRESENCE_SENSOR_Prepare_Send_Data(&sensorData); + if (sts_work_mode == STS_DUAL_MODE) { AppData.Port = (uint8_t)YUNHORN_STS_O6_LORA_APP_DATA_PORT; - } else if (sts_work_mode == STS_UNI_MODE) { + } else if (sts_work_mode == STS_UNI_MODE) + { AppData.Port = (uint8_t)YUNHORN_STS_O7_LORA_APP_DATA_PORT; - } else if ((sts_work_mode == STS_RSS_MODE)||(sts_work_mode == STS_REEDSWITCH_MODE)) + } else if ((sts_work_mode == STS_RSS_MODE)||(sts_work_mode == STS_REEDSWITCH_MODE)||(sts_work_mode == STS_NETWORK_MODE)||(sts_work_mode == STS_WIRED_MODE)) + { AppData.Port = (uint8_t)YUNHORN_STS_O2_LORA_APP_DATA_PORT; } @@ -915,11 +950,13 @@ static void SendTxData(void) if ((heart_beat_timer != 0L)) // sensor data OVERWRITE heart-beat message, 2024-05-12 { heart_beat_timer=0; + sensor_data_ready = 0; if (sts_work_mode == STS_DUAL_MODE) AppData.Port = (uint8_t)YUNHORN_STS_O6_LORA_APP_HTBT_PORT; //LORAWAN_USER_APP_PORT+1; else if (sts_work_mode == STS_UNI_MODE) AppData.Port = (uint8_t)YUNHORN_STS_O7_LORA_APP_HTBT_PORT; //LORAWAN_USER_APP_PORT+1; - else if ((sts_work_mode == STS_RSS_MODE)||(sts_work_mode == STS_REEDSWITCH_MODE)) + else if ((sts_work_mode == STS_RSS_MODE)||(sts_work_mode == STS_REEDSWITCH_MODE)||(sts_work_mode == STS_NETWORK_MODE)||(sts_work_mode == STS_WIRED_MODE)) + AppData.Port = (uint8_t)YUNHORN_STS_O2_LORA_APP_HTBT_PORT; //LORAWAN_USER_APP_PORT+1; //AppData.Port = (uint8_t)sts_sendhtbtport; //LORAWAN_USER_APP_PORT+1; @@ -939,10 +976,10 @@ static void SendTxData(void) AppData.Buffer[i++] = (uint8_t)(sensorData.workmode)&0xff; //02 WORK MODE if (sts_work_mode == STS_REEDSWITCH_MODE) { - AppData.Buffer[i++] = (uint8_t)(sensorData.state_sensor1_on_off)&0xff; //03 Sensor head #1 status reed switch - AppData.Buffer[i++] = (uint8_t)(sensorData.state_sensor2_on_off)&0xff; //04 Sensor head #2 status reed switch - } - else if (sts_work_mode == STS_RSS_MODE) + AppData.Buffer[i++] = (uint8_t)(sensorData.state_sensor1_on_off)&0xff; //03 Sensor head #1 status reed switch + AppData.Buffer[i++] = (uint8_t)(sensorData.state_sensor2_on_off)&0xff; //04 Sensor head #2 status reed switch + } else if (sts_work_mode == STS_RSS_MODE) + { AppData.Buffer[i++] = (uint8_t)(sensorData.state_sensor1_on_off)&0xff; //03 Sensor head #1 status reed switch AppData.Buffer[i++] = (uint8_t)(sensorData.state_sensor3_on_off)&0xff; //04 Sensor head #3 status RSS motion @@ -962,45 +999,45 @@ static void SendTxData(void) AppData.Buffer[i++] = (uint8_t)(sensorData.state_sensor1_on_off)&0xff; //03 Sensor head #1 status reedswitch AppData.Buffer[i++] = (uint8_t)(sensorData.state_sensor2_on_off)&0xff; //04 Sensor head #2 status SOS button AppData.Buffer[i++] = (uint8_t)(sensorData.state_sensor3_on_off)&0xff; //05 Sensor head #3 status RSS motion - AppData.Buffer[i++] = (uint8_t)(sensorData.state_sensor4_on_off)&0xff; //06 Sensor head #4 status reserved + AppData.Buffer[i++] = (uint8_t)(sensorData.state_sensor4_on_off)&0xff; //06 Sensor head #4 status ALARM MUTE + AppData.Buffer[i++] = (uint8_t)(sensorData.state_sensor5_on_off)&0xff; //07 Sensor head #5 status ALARM RESET + + AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor3_fall_distance>>8)&0xff; //08 MSB distance + AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor3_fall_distance)&0xff; //09 LSB distance + AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor3_fall_motionscore>>8)&0xff; //10 MSB score + AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor3_fall_motionscore)&0xff; //11 LSB score + + AppData.Buffer[i++] = (uint8_t)(sensorData.unconscious_state)&0xff; //12 unconscious state detected or not + AppData.Buffer[i++] = (uint8_t)(sensorData.fall_state)&0xff; //13 fall detected or not + AppData.Buffer[i++] = (uint8_t)(sensorData.over_stay_state)&0xff; //14 occupancy over time or not + AppData.Buffer[i++] = (uint8_t)(sensorData.over_stay_duration>>8)&0xff; //15 occupancy over stay duration MSB + AppData.Buffer[i++] = (uint8_t)(sensorData.over_stay_duration)&0xff; //16 occupancy over stay duration LSB + AppData.Buffer[i++] = (uint8_t)(sensorData.no_movement_duration>>8)&0xff; //17 occupancy over stay duration LSB + AppData.Buffer[i++] = (uint8_t)(sensorData.no_movement_duration)&0xff; //18 occupancy over stay duration LSB + + AppData.Buffer[i++] = (uint8_t)(sensorData.fall_speed)&0xff; //19 fall detected speed + AppData.Buffer[i++] = (uint8_t)(sensorData.fall_gravity)&0xff; //20 fall detected gravity + + AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor2_start_timestamp>>24)&0xff; //21 SOS start time stamp + AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor2_start_timestamp>>16)&0xff; //22 SOS start time stamp + AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor2_start_timestamp>>8)&0xff; //23 SOS start time stamp + AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor2_start_timestamp)&0xff; //24 SOS start time stamp + + AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor2_stop_timestamp>>24)&0xff; //25 SOS stop time stamp + AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor2_stop_timestamp>>16)&0xff; //26 SOS stop time stamp + AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor2_stop_timestamp>>8)&0xff; //27 SOS stop time stamp + AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor2_stop_timestamp)&0xff; //28 SOS stop time stamp - AppData.Buffer[i++] = (uint8_t)(sensorData.rss_presence_distance>>8)&0xff; //07 MSB distance - AppData.Buffer[i++] = (uint8_t)(sensorData.rss_presence_distance)&0xff; //08 LSB distance - AppData.Buffer[i++] = (uint8_t)(sensorData.rss_presence_score>>8)&0xff; //09 MSB score - AppData.Buffer[i++] = (uint8_t)(sensorData.rss_presence_score)&0xff; //10 LSB score + AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor3_fall_start_time_stamp>>24)&0xff; //29 fall start time stamp + AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor3_fall_start_time_stamp>>16)&0xff; //30 fall start time stamp + AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor3_fall_start_time_stamp>>8)&0xff; //31 fall start time stamp + AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor3_fall_start_time_stamp)&0xff; //32 fall start time stamp - AppData.Buffer[i++] = (uint8_t)(sensorData.unconscious_state)&0xff; //11 unconscious state detected or not - AppData.Buffer[i++] = (uint8_t)(sensorData.fall_state)&0xff; //12 fall detected or not - AppData.Buffer[i++] = (uint8_t)(sensorData.over_stay_state)&0xff; //13 occupancy over time or not - AppData.Buffer[i++] = (uint8_t)(sensorData.over_stay_duration>>8)&0xff; //14 occupancy over stay duration MSB - AppData.Buffer[i++] = (uint8_t)(sensorData.over_stay_duration)&0xff; //15 occupancy over stay duration LSB - AppData.Buffer[i++] = (uint8_t)(sensorData.no_movement_duration>>8)&0xff; //16 occupancy over stay duration LSB - AppData.Buffer[i++] = (uint8_t)(sensorData.no_movement_duration)&0xff; //17 occupancy over stay duration LSB - - AppData.Buffer[i++] = (uint8_t)(sensorData.fall_speed)&0xff; //18 fall detected speed - AppData.Buffer[i++] = (uint8_t)(sensorData.fall_gravity)&0xff; //19 fall detected gravity - - AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor2_start_timestamp>>24)&0xff; //20 SOS start time stamp - AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor2_start_timestamp>>16)&0xff; //21 SOS start time stamp - AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor2_start_timestamp>>8)&0xff; //22 SOS start time stamp - AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor2_start_timestamp)&0xff; //23 SOS start time stamp - - AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor2_stop_timestamp>>24)&0xff; //24 SOS stop time stamp - AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor2_stop_timestamp>>16)&0xff; //25 SOS stop time stamp - AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor2_stop_timestamp>>8)&0xff; //26 SOS stop time stamp - AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor2_stop_timestamp)&0xff; //27 SOS stop time stamp - - - AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor3_fall_start_time_stamp>>24)&0xff; //28 fall start time stamp - AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor3_fall_start_time_stamp>>16)&0xff; //29 fall start time stamp - AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor3_fall_start_time_stamp>>8)&0xff; //30 fall start time stamp - AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor3_fall_start_time_stamp)&0xff; //31 fall start time stamp - - AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor3_fall_stop_time_stamp>>24)&0xff; //32 fall stop time stamp - AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor3_fall_stop_time_stamp>>16)&0xff; //33 fall stop time stamp - AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor3_fall_stop_time_stamp>>8)&0xff; //34 fall stop time stamp - AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor3_fall_stop_time_stamp)&0xff; //35 fall stop time stamp + AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor3_fall_stop_time_stamp>>24)&0xff; //33 fall stop time stamp + AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor3_fall_stop_time_stamp>>16)&0xff; //34 fall stop time stamp + AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor3_fall_stop_time_stamp>>8)&0xff; //35 fall stop time stamp + AppData.Buffer[i++] = (uint8_t)(sensorData.event_sensor3_fall_stop_time_stamp)&0xff; //36 fall stop time stamp } uint8_t ich= (sts_lamp_bar_color>>4 & 0x0f); @@ -1009,12 +1046,12 @@ static void SendTxData(void) strcpy(colorshow, (ich==0)?"":sts_lamp_color_code[ich]); APP_LOG(TS_OFF, VLEVEL_L, - "\r\n######| Color = %s%s | Mode = %5s |\r\n",(char *)colorshow, sts_lamp_color_code[icl], (char*)sts_work_mode_code[sensorData.workmode]); + "\r\n######| Color = %s%s | Mode = %5s |\r\n",(char *)colorshow, sts_lamp_color_code[icl], (char*)sts_work_mode_code[sts_work_mode]); if (sts_work_mode == STS_UNI_MODE) { APP_LOG(TS_OFF, VLEVEL_L, - "\r\n######| S1-Door | S2-SOS | S3-Motion | S4 |Distance(mm) | MotionScore| Unconscious | Over_Stay_(min) | Fall Detected|" - "\r\n######| %s | %s | %d | %1d | %04d | %04d | %1d | %4d | %s |\r\n", + "\r\n######| S1-Door | S2-SOS | S3-Motion| S4 |Distance(mm) | MotionScore| Unconscious | Over_Stay_(min) | Fall Detected|" + "\r\n######| %s | %s | %d | %1d | %04d | %04d | %1d | %4d | %s |\r\n", sts_door_status_code[sensorData.state_sensor1_on_off], sts_sos_status_code[sensorData.state_sensor2_on_off], sensorData.state_sensor3_on_off, @@ -1029,7 +1066,15 @@ static void SendTxData(void) sts_door_status_code[sensorData.state_sensor1_on_off], sts_sos_status_code[sensorData.state_sensor2_on_off], sensorData.state_sensor3_on_off); + } else if (sts_work_mode == STS_RSS_MODE) { + APP_LOG(TS_OFF, VLEVEL_L, + "\r\n######| S3-Motion |\r\n" + "\r\n######| %d |\r\n",sensorData.state_sensor3_on_off); + } else { + APP_LOG(TS_OFF, VLEVEL_M,"\r\n\n**************************************** UNKNOWN MODE \r\n"); } + } else if (sensor_data_ready == 0) { + APP_LOG(TS_OFF, VLEVEL_M,"\r\n\n**************************************** SENSOR_DATA_READY =%u \r\n", sensor_data_ready); } AppData.BufferSize = (uint8_t)(sts_service_mask > STS_SERVICE_MASK_L1? 0:i)&0xff;; @@ -1063,12 +1108,13 @@ static void SendTxData(void) nextTxIn = LmHandlerGetDutyCycleWaitTime(); if (nextTxIn > 0) { - APP_LOG(TS_ON, VLEVEL_H, "Next Tx in : ~%d second(s)\r\n", (nextTxIn / 1000)); + APP_LOG(TS_ON, VLEVEL_M, "Next Tx in : ~%d second(s)\r\n", (nextTxIn / 1000)); } } } + //else { APP_LOG(TS_OFF, VLEVEL_M, "\r\n ######## LmHandlerIsBusy ************** \r\n"); } - if (EventType == TX_ON_TIMER) + if ((EventType == TX_ON_TIMER)) //||((EventType == TX_ON_EVENT)&&(nextTxIn >0))) { UTIL_TIMER_Stop(&TxTimer); UTIL_TIMER_SetPeriod(&TxTimer, MAX(nextTxIn, TxPeriodicity)); @@ -1083,23 +1129,14 @@ static void OnTxTimerEvent(void *context) /* USER CODE BEGIN OnTxTimerEvent_1 */ /* USER CODE END OnTxTimerEvent_1 */ - //heart_beat_timer = 1; + if ((sensor_data_ready ==1)) //|| (sts_reed_hall_changed_flag)) //||(sts_rss_result_changed_flag)||(sts_fall_rising_detected_result_changed_flag)) + { + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); - UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); -#if 0 - if (sts_ac_code[0]==0x0) { - /* RFAC Challenge */ - if (rfac_timer < (STS_BURN_IN_RFAC+3)) { - rfac_timer ++; + /*Wait for next tx slot*/ - UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventRFAC), CFG_SEQ_Prio_0); - } - - } -#endif - /*Wait for next tx slot*/ - - UTIL_TIMER_Start(&TxTimer); + UTIL_TIMER_Start(&TxTimer); + } /* USER CODE BEGIN OnTxTimerEvent_2 */ @@ -1140,40 +1177,24 @@ static void OnYunhornSTSLampBarColorTimerEvent(void *context) //HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); /* STS GREEN */ //if ((sts_work_mode != STS_WIRED_MODE)) uint8_t high4=(sts_lamp_bar_color>>4)&0x0f, low4=sts_lamp_bar_color&0x0f; - HAL_Delay(10); +#if 0 + luminance_level += 10; + luminance_level %= 60; + luminance_level = MAX(10,luminance_level); +#endif + + UTIL_TIMER_Stop(&STSLampBarColorTimer); + if (high4==0) { - if (last_sts_lamp_bar_color != sts_lamp_bar_color) - { - __disable_irq(); - STS_Lamp_Bar_Set_STS_RGB_Color(sts_lamp_bar_color, DEFAULT_LUMINANCE_LEVEL); - __enable_irq(); - //STS_WS2812B_Refresh(); - last_sts_lamp_bar_color = sts_lamp_bar_color; - } + STS_Lamp_Bar_Set_STS_RGB_Color(sts_lamp_bar_color, luminance_level); - } else { - if (r_b) - { - //__disable_irq(); - STS_Lamp_Bar_Set_STS_RGB_Color(high4, DEFAULT_LUMINANCE_LEVEL); - //__enable_irq(); - last_sts_lamp_bar_color = high4; - //STS_WS2812B_Refresh(); - } - else { - //__disable_irq(); - STS_Lamp_Bar_Set_STS_RGB_Color(low4, DEFAULT_LUMINANCE_LEVEL); - //__enable_irq(); - last_sts_lamp_bar_color = low4; - //STS_WS2812B_Refresh(); - } - - r_b = !r_b; + } else + { + STS_Lamp_Bar_Set_STS_RGB_Color(r_b?high4:low4, luminance_level); + r_b = !r_b; } - -//UTIL_TIMER_Start(&STSLampBarColorTimer); - + UTIL_TIMER_Start(&STSLampBarColorTimer); } static void OnYunhornSTSDurationCheckTimerEvent(void *context) @@ -1258,6 +1279,12 @@ static void OnYunhornSTSDurationCheckTimerEvent(void *context) case STS_PRESENCE_NORMAL: sts_o7_sensorData.fall_state = STS_PRESENCE_NORMAL; sts_o7_sensorData.fall_laydown_duration=0; + if (last_sts_fall_rising_detected_result == STS_PRESENCE_FALL) + { + sts_o7_sensorData.event_sensor3_fall_stop_time_stamp = time_stamp; + sts_o7_sensorData.fall_laydown_duration = sts_o7_sensorData.event_sensor3_fall_duration; + } + sts_o7_sensorData.unconscious_state =STS_PRESENCE_NORMAL; sts_o7_sensorData.unconscious_duration =0; sts_o7_sensorData.no_movement_duration =0; @@ -1311,8 +1338,9 @@ static void OnYunhornSTSDurationCheckTimerEvent(void *context) sts_o7_sensorData.event_sensor3_event_duration = sensor_event_time.Seconds - sts_o7_sensorData.event_sensor4_start_time; #endif - if (over_threshold == TRUE) { - sensor_data_ready = 1; + if (over_threshold == TRUE) + { + if (sts_o7_sensorData.fall_state == STS_PRESENCE_LAYDOWN) { sts_status_color = sts_lamp_bar_flashing_color; //STS_RED_BLUE; @@ -1321,7 +1349,9 @@ static void OnYunhornSTSDurationCheckTimerEvent(void *context) sts_status_color = STS_RED_DARK; sts_lamp_bar_color = STS_RED_DARK; //sts_lamp_bar_flashing_color; } - SendTxData(); + + sensor_data_ready = 1; + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); over_threshold = FALSE; } } @@ -1366,9 +1396,9 @@ static void OnJoinRequest(LmHandlerJoinParams_t *joinParams) if (joinParams->Status == LORAMAC_HANDLER_SUCCESS) { UTIL_TIMER_Stop(&JoinLedTimer); - //STS_Lamp_Bar_Set_Dark(); + sts_lamp_bar_color = STS_GREEN; - STS_WS2812B_Refresh(); + #ifndef STM32WLE5xx HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET); /* LED_RED */ #endif @@ -1383,9 +1413,6 @@ static void OnJoinRequest(LmHandlerJoinParams_t *joinParams) } STS_LoRa_WAN_Joined = (uint8_t) joinParams->Mode; - - OnYunhornSTSHeartBeatPeriodicityChanged(HeartBeatPeriodicity); - //OnTxPeriodicityChanged(TxPeriodicity); APP_LOG(TS_OFF, VLEVEL_L,"\r\n STS_LoRa_WAN_Joined = %s \r\n", (STS_LoRa_WAN_Joined == 1)?"ABP":"OTAA"); } else @@ -1395,12 +1422,32 @@ static void OnJoinRequest(LmHandlerJoinParams_t *joinParams) APP_LOG(TS_OFF, VLEVEL_H, "###### U/L FRAME:JOIN | DR:%d | PWR:%d\r\n", joinParams->Datarate, joinParams->TxPower); } - heart_beat_timer = 1; - UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); - //HAL_Delay(3000); - UTIL_TIMER_Start(&STSLampBarColorTimer); - //UTIL_TIMER_Start(&YunhornSTSRSSWakeUpTimer); + if (STS_LoRa_WAN_Joined) + { + heart_beat_timer = 1; + //SendTxData(); + + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); + + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); + + //UTIL_TIMER_Start(&TxTimer); + //UTIL_TIMER_Start(&STSDurationCheckTimer); + OnYunhornSTSHeartBeatPeriodicityChanged(HeartBeatPeriodicity); + + //UTIL_TIMER_Create(&YunhornSTSRSSWakeUpTimer, YUNHORN_STS_RSS_WAKEUP_CHECK_TIME, UTIL_TIMER_PERIODIC, OnYunhornSTSOORSSWakeUpTimerEvent, NULL); + + STS_SENSOR_Distance_Test_Process(); + + APP_LOG(TS_OFF, VLEVEL_H, "\r\nRSS Measured Distance=[%u] mm \r\n", (uint16_t)sts_distance_rss_distance); + + UTIL_TIMER_Create(&YunhornSTSRSSWakeUpTimer, YUNHORN_STS_RSS_WAKEUP_CHECK_TIME, UTIL_TIMER_ONESHOT, OnYunhornSTSOORSSWakeUpTimerEvent, NULL); + UTIL_TIMER_Start(&YunhornSTSRSSWakeUpTimer); + + + } + /* USER CODE END OnJoinRequest_1 */ } @@ -1478,8 +1525,6 @@ static void OnTxPeriodicityChanged(uint32_t periodicity) TxPeriodicity = APP_TX_DUTYCYCLE; } - HeartBeatPeriodicity = TxPeriodicity; - /* Update timer periodicity */ UTIL_TIMER_Stop(&TxTimer); UTIL_TIMER_SetPeriod(&TxTimer, TxPeriodicity); @@ -1654,16 +1699,23 @@ static void OnRestoreContextRequest(void *nvm, uint32_t nvm_size) */ static void OnYunhornSTSOORSSWakeUpTimerEvent(void *context) { - UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP2), CFG_SEQ_Prio_0); - //APP_LOG(TS_OFF,VLEVEL_L,"\r\n RSS result changed flag=%d \r\n", sts_rss_result_changed_flag); - if ((STS_LoRa_WAN_Joined != 0)&&(sts_rss_result_changed_flag==1)) + if ((sts_work_mode == STS_RSS_MODE)||(sts_work_mode == STS_DUAL_MODE)||(sts_work_mode == STS_UNI_MODE)) { - sts_rss_result_changed_flag = 0; - UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); - //if ((last_sts_rss_result ==STS_RESULT_NO_MOTION)&& (sts_rss_result==STS_RESULT_MOTION)) - { - //OnSensor3StateChanged(); - } + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP2), CFG_SEQ_Prio_0); + + if ((sts_rss_result_changed_flag == 1) || (sts_fall_rising_detected_result_changed_flag == 1)) + { + //SendTxData(); + sts_rss_result_changed_flag = 0; + sts_fall_rising_detected_result_changed_flag = 0; + + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); + //if ((last_sts_rss_result ==STS_RESULT_NO_MOTION)&& (sts_rss_result==STS_RESULT_MOTION)) + { + //OnSensor3StateChanged(); + } + } + } UTIL_TIMER_Start(&YunhornSTSRSSWakeUpTimer); @@ -1678,7 +1730,6 @@ static void OnYunhornSTSHeartBeatTimerEvent(void *context) { heart_beat_timer = 1; UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); - UTIL_TIMER_Start(&YunhornSTSHeartBeatTimer); if ((STS_LoRa_WAN_Joined ) && (sts_ac_code[0]==0x0) && (sts_ac_code[19]==0x0)) { @@ -1688,6 +1739,7 @@ static void OnYunhornSTSHeartBeatTimerEvent(void *context) } UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventRFAC), CFG_SEQ_Prio_0); } + UTIL_TIMER_Start(&YunhornSTSHeartBeatTimer); } /** @@ -1701,6 +1753,7 @@ static void OnYunhornSTSHeartBeatPeriodicityChanged(uint32_t periodicity) /* USER CODE BEGIN OnTxPeriodicityChanged_1 */ /* USER CODE END OnTxPeriodicityChanged_1 */ +#if 1 HeartBeatPeriodicity = periodicity; if (HeartBeatPeriodicity == 0) @@ -1708,7 +1761,7 @@ static void OnYunhornSTSHeartBeatPeriodicityChanged(uint32_t periodicity) /* Revert to application default periodicity */ HeartBeatPeriodicity = 10*APP_TX_DUTYCYCLE; } - +#endif /* Update timer periodicity */ UTIL_TIMER_Stop(&YunhornSTSHeartBeatTimer); @@ -1716,7 +1769,7 @@ static void OnYunhornSTSHeartBeatPeriodicityChanged(uint32_t periodicity) UTIL_TIMER_Start(&YunhornSTSHeartBeatTimer); /* USER CODE BEGIN OnTxPeriodicityChanged_2 */ - APP_LOG(TS_OFF, VLEVEL_H,"**************** HeartBeatPeriodicity Changed to: %u (ms)\r\n", HeartBeatPeriodicity ); + APP_LOG(TS_OFF, VLEVEL_H,"**************** HeartBeatPeriodicity = %u (sec)\r\n", periodicity/1000 ); /* USER CODE END OnTxPeriodicityChanged_2 */ } @@ -1741,10 +1794,13 @@ static void OnYunhornSTSSamplingPeriodicityChanged(uint32_t periodicity) /* Update timer periodicity */ #if defined(STS_O6)||defined(STS_O7) - UTIL_TIMER_Stop(&YunhornSTSRSSWakeUpTimer); - UTIL_TIMER_SetPeriod(&YunhornSTSRSSWakeUpTimer, SamplingPeriodicity); - UTIL_TIMER_Start(&YunhornSTSRSSWakeUpTimer); - APP_LOG(TS_OFF, VLEVEL_M,"**************** Sampling Timer Periodicity = %u (sec)\r\n", (SamplingPeriodicity/1000) ); + if (STS_LoRa_WAN_Joined !=0) + { + UTIL_TIMER_Stop(&YunhornSTSRSSWakeUpTimer); + UTIL_TIMER_SetPeriod(&YunhornSTSRSSWakeUpTimer, SamplingPeriodicity); + UTIL_TIMER_Start(&YunhornSTSRSSWakeUpTimer); + APP_LOG(TS_OFF, VLEVEL_M,"**************** Sampling Timer Periodicity = %u (sec)\r\n", (SamplingPeriodicity/1000) ); + } #else UTIL_TIMER_Stop(&YunhornSTSSamplingCheckTimer); @@ -1856,7 +1912,7 @@ static void OnYunhornSTSSamplingCheckTimerEvent(void *context) * */ -void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, size_t tlv_buf_size) +void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, uint8_t tlv_buf_size) { uint8_t i=0, mems_ver, invalid_flag=1; UTIL_MEM_set_8((void*)outbuf,0x0, sizeof(outbuf)); @@ -2076,9 +2132,10 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, size_t tlv_buf_size) { //STS_SENSOR_Power_ON((uint8_t)(tlv_buf[CFG_CMD3]-0x30)); PME_ON; - i=0; - UTIL_MEM_set_8(outbuf, 0x0, sizeof(outbuf)); - UTIL_MEM_cpy_8(outbuf, tlv_buf,tlv_buf_size); + // 2024-07-31 + UTIL_MEM_set_8((void*)outbuf, 0x0, sizeof(outbuf)); + UTIL_MEM_cpy_8((void*)outbuf,(void*)tlv_buf,tlv_buf_size); + i = tlv_buf_size; STS_SENSOR_Upload_Message(LORAWAN_USER_APP_CTRL_REPLY_PORT, i, (uint8_t *)outbuf); } else { @@ -2090,10 +2147,10 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, size_t tlv_buf_size) // TODO # of modules if (((uint8_t)(tlv_buf[CFG_CMD3]-0x30) >= 0) && ((uint8_t)tlv_buf[CFG_CMD3]-0x30) <=9) { //STS_SENSOR_Power_OFF((tlv_buf[CFG_CMD3]-0x30)); - PME_OFF; - i=0; - UTIL_MEM_set_8(outbuf, 0x0, sizeof(outbuf)); - UTIL_MEM_cpy_8(outbuf, tlv_buf,tlv_buf_size); + PME_OFF; + // 2024-07-31 + UTIL_MEM_set_8((void*)outbuf, 0x0, sizeof(outbuf)); + UTIL_MEM_cpy_8((void*)outbuf,(void*)tlv_buf,tlv_buf_size); i = tlv_buf_size; STS_SENSOR_Upload_Message(LORAWAN_USER_APP_CTRL_REPLY_PORT, i, (uint8_t *)outbuf); } else { @@ -2103,10 +2160,12 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, size_t tlv_buf_size) case 'H': // TODO # of modules if (((uint8_t)(tlv_buf[CFG_CMD3]-0x30) >= 0) && ((uint8_t)tlv_buf[CFG_CMD3]-0x30) <=9) { - STS_SENSOR_MEMS_Reset((tlv_buf[CFG_CMD3]-0x30)); - i=0; - UTIL_MEM_set_8(outbuf, 0x0, sizeof(outbuf)); - UTIL_MEM_cpy_8(outbuf, tlv_buf,tlv_buf_size); + PME_ON; + PME_OFF; + PME_ON; + // 2024-07-31 + UTIL_MEM_set_8((void*)outbuf, 0x0, sizeof(outbuf)); + UTIL_MEM_cpy_8((void*)outbuf,(void*)tlv_buf,tlv_buf_size); i = tlv_buf_size; STS_SENSOR_Upload_Message(LORAWAN_USER_APP_CTRL_REPLY_PORT, i, (uint8_t *)outbuf); } else { @@ -2126,17 +2185,17 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, size_t tlv_buf_size) } else if ((char)tlv_buf[CFG_CMD5] == 'H') { periodicity_length *= 3600; } - TxPeriodicity = periodicity_length*1000; //translate to 1000ms=1s - HeartBeatPeriodicity = TxPeriodicity; + periodicity_length = periodicity_length*1000; //translate to 1000ms=1s + //OnTxPeriodicityChanged(TxPeriodicity); #if defined(STS_O6)||defined(STS_O7) - OnYunhornSTSHeartBeatPeriodicityChanged(TxPeriodicity); + HeartBeatPeriodicity = periodicity_length; + OnYunhornSTSHeartBeatPeriodicityChanged(periodicity_length); #endif - - i = 0; - UTIL_MEM_set_8(outbuf, 0x0, sizeof(outbuf)); - UTIL_MEM_cpy_8(outbuf, tlv_buf,tlv_buf_size); + // 2024-07-31 + UTIL_MEM_set_8((void*)outbuf, 0x0, sizeof(outbuf)); + UTIL_MEM_cpy_8((void*)outbuf,(void*)tlv_buf,tlv_buf_size); i = tlv_buf_size; STS_SENSOR_Upload_Message(LORAWAN_USER_APP_CTRL_REPLY_PORT, i, (uint8_t *)outbuf); @@ -2151,7 +2210,7 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, size_t tlv_buf_size) sts_cfg_nvm.sts_service_mask = (uint8_t)sts_service_mask; OnStoreSTSCFGContextRequest(); - APP_LOG(TS_OFF, VLEVEL_M, "###### YUNHORN Periodicity Changed to [ %d ] Seconds\r\n", periodicity_length); + //APP_LOG(TS_OFF, VLEVEL_M, "###### YUNHORN Periodicity Changed to [ %d ] Seconds\r\n", periodicity_length); } else { STS_SENSOR_Upload_Config_Invalid_Message(); @@ -2182,9 +2241,9 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, size_t tlv_buf_size) SamplingPeriodicity = heart_beat_or_sampling_periodicity_length*1000; //translate to 1000ms=1s OnYunhornSTSSamplingPeriodicityChanged(SamplingPeriodicity); #endif - i = 0; - UTIL_MEM_set_8(outbuf, 0x0, sizeof(outbuf)); - UTIL_MEM_cpy_8(outbuf, tlv_buf,tlv_buf_size); + // 2024-07-31 + UTIL_MEM_set_8((void*)outbuf, 0x0, sizeof(outbuf)); + UTIL_MEM_cpy_8((void*)outbuf,(void*)tlv_buf,tlv_buf_size); i = tlv_buf_size; STS_SENSOR_Upload_Message(LORAWAN_USER_APP_CTRL_REPLY_PORT, i, (uint8_t *)outbuf); @@ -2237,38 +2296,72 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, size_t tlv_buf_size) sts_work_mode = (uint8_t)(tlv_buf[CFG_CMD4] - 0x30); if (sts_work_mode == STS_NETWORK_MODE) - { //network mode + { //network mode sts_cloud_netcolor = (uint8_t)(tlv_buf[CFG_CMD5]-0x30); - APP_LOG(TS_OFF, VLEVEL_L, "\r\n Cloud Color Set to %u \r\n", sts_cloud_netcolor); + if (sts_cloud_netcolor == STS_COLOR_MAX) sts_cloud_netcolor = STS_RED_BLUE; + else if (sts_cloud_netcolor > STS_COLOR_MAX) + { +#if 1 + switch((uint8_t)tlv_buf[CFG_CMD5]) + { + case STS_GREENDARK: + sts_lamp_bar_color = STS_GREEN_DARK; + sts_cloud_netcolor = STS_GREEN_DARK; + break; + case STS_REDDARK: + sts_lamp_bar_color = STS_RED_DARK; + sts_cloud_netcolor = STS_RED_DARK; + break; + case STS_REDBLUE: + sts_lamp_bar_color = STS_RED_BLUE; + sts_cloud_netcolor = STS_RED_BLUE; + break; + case STS_BLUEDARK: + sts_lamp_bar_color = STS_BLUE_DARK; + sts_cloud_netcolor = STS_BLUE_DARK; + break; + case STS_REDGREEN: + sts_lamp_bar_color = STS_RED_GREEN; + sts_cloud_netcolor = STS_RED_GREEN; + break; + case STS_BLUEGREEN: + sts_lamp_bar_color = STS_BLUE_GREEN; + sts_cloud_netcolor = STS_BLUE_GREEN; + break; + } + } +#endif + APP_LOG(TS_OFF, VLEVEL_L, "\r\n Cloud Color Set to 0X%02X \r\n",sts_cloud_netcolor); } sts_service_mask = STS_SERVICE_MASK_L0; - sts_lamp_bar_color = sts_cloud_netcolor; + sts_cfg_nvm.work_mode = (uint8_t)sts_work_mode; sts_cfg_nvm.sts_service_mask = (uint8_t)sts_service_mask; OnStoreSTSCFGContextRequest(); i=0; // Step 1: Prepare status update message - UTIL_MEM_set_8(outbuf, 0x0, sizeof(outbuf)); - UTIL_MEM_cpy_8(outbuf, tlv_buf,tlv_buf_size); + UTIL_MEM_set_8((void*)outbuf, 0x0, sizeof(outbuf)); + UTIL_MEM_cpy_8((void*)outbuf,(void*)tlv_buf, tlv_buf_size); i = tlv_buf_size; STS_Combined_Status_Processing(); } else if (tlv_buf_size == 7 && tlv_buf[CFG_CMD4]=='F') // Change fall detection { - invalid_flag = 0; // P 1 1 F A D C + invalid_flag = 0; // P 1 1 F A B C + if (((tlv_buf[CFG_CMD5] >='0') && (tlv_buf[CFG_CMD5]<='9')) && ((tlv_buf[CFG_CMD6]<='9') && (tlv_buf[CFG_CMD6]>='0')) - && ((tlv_buf[CFG_CMD7]<='9') && (tlv_buf[CFG_CMD7]>='0'))&& ((tlv_buf[CFG_CMD8]<='9') && (tlv_buf[CFG_CMD8]>='0'))) + && ((tlv_buf[CFG_CMD7]<='9') && (tlv_buf[CFG_CMD7]>='0'))) //&& ((tlv_buf[CFG_CMD8]<='9') && (tlv_buf[CFG_CMD8]>='0'))) { sts_fall_detection_acc_threshold = (uint8_t)(tlv_buf[CFG_CMD5] - 0x30)*10; //A: acc *10 mg/s2 sts_fall_detection_depth_threshold = (uint8_t)(tlv_buf[CFG_CMD6] - 0x30)*10; //D: depth *10 in cm - sts_fall_confirm_threshold_in_10sec = (uint8_t)(tlv_buf[CFG_CMD7] - 0x30+1)*128; //C: fall_confirm_threshold_in_10sec + sts_fall_confirm_threshold_in_10sec = (uint8_t)(tlv_buf[CFG_CMD7] - 0x30)*10; //C: fall_confirm_threshold_in_10sec - //sts_occupancy_overtime_threshold_in_10min = (uint8_t)(tlv_buf[CFG_CMD8] - 0x30)*10; // overtime *10 min + //sts_occupancy_overtime_threshold_in_10min = (uint8_t)(tlv_buf[CFG_CMD8] - 0x30)*10; //T: overtime *10 min sts_cfg_nvm.fall_detection_acc_threshold = (uint8_t)(tlv_buf[CFG_CMD5] - 0x30); sts_cfg_nvm.fall_detection_depth_threshold = (uint8_t)(tlv_buf[CFG_CMD6] - 0x30); - sts_cfg_nvm.fall_confirm_threshold_in_10sec = (uint8_t)(tlv_buf[CFG_CMD7] - 0x30+1); + sts_cfg_nvm.fall_confirm_threshold_in_10sec = (uint8_t)(tlv_buf[CFG_CMD7] - 0x30); //sts_cfg_nvm.occupancy_overtime_threshold_in_10min = (uint8_t)(tlv_buf[CFG_CMD8] - 0x30); @@ -2277,15 +2370,19 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, size_t tlv_buf_size) if ((sts_fall_detection_acc_threshold ==0)&&(sts_fall_detection_depth_threshold==0)) { sts_presence_fall_detection = FALSE; + } else { + sts_presence_fall_detection = TRUE; } } OnStoreSTSCFGContextRequest(); i=0; // Step 1: Prepare status update message - UTIL_MEM_set_8(outbuf, 0x0, sizeof(outbuf)); - UTIL_MEM_cpy_8(outbuf, tlv_buf,tlv_buf_size); + UTIL_MEM_set_8((void*)outbuf, 0x0, sizeof(outbuf)); + UTIL_MEM_cpy_8((void*)outbuf,(void*)tlv_buf, tlv_buf_size); i = tlv_buf_size; + APP_LOG(TS_OFF, VLEVEL_M, "###### Fall detection CFG = %s\r\n",(char*)outbuf); + STS_Combined_Status_Processing(); } @@ -2310,9 +2407,10 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, size_t tlv_buf_size) OnStoreSTSCFGContextRequest(); i=0; // Step 1: Prepare status update message - UTIL_MEM_set_8(outbuf, 0x0, sizeof(outbuf)); - UTIL_MEM_cpy_8(outbuf, tlv_buf,tlv_buf_size); + UTIL_MEM_set_8((void*)outbuf, 0x0, sizeof(outbuf)); + UTIL_MEM_cpy_8((void*)outbuf,(void*)tlv_buf, tlv_buf_size); i = tlv_buf_size; + APP_LOG(TS_OFF, VLEVEL_M, "###### Occupancy/Overstay/unconscious config changed =%s\r\n",(char *)outbuf); STS_Combined_Status_Processing(); } } @@ -2331,18 +2429,52 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, size_t tlv_buf_size) } i=0; // Step 1: Prepare status update message - UTIL_MEM_set_8(outbuf, 0x0, sizeof(outbuf)); - UTIL_MEM_cpy_8(outbuf, tlv_buf,tlv_buf_size); + UTIL_MEM_set_8((void*)outbuf, 0x0, sizeof(outbuf)); + UTIL_MEM_cpy_8((void*)outbuf,(void*)tlv_buf, tlv_buf_size); i = tlv_buf_size; + APP_LOG(TS_OFF, VLEVEL_L, "###### P Work mode switched =%s\r\n",(char *)outbuf); //sts_service_mask = STS_SERVICE_MASK_L0; //sts_lamp_bar_color = STS_GREEN; - sts_cfg_nvm.work_mode = (uint8_t)sts_work_mode; - if (sts_work_mode == STS_UNI_MODE) { + sts_presence_fall_detection=FALSE; + sts_rss_config_updated_flag = STS_RSS_CONFIG_NON; + + switch (sts_work_mode) { + case STS_NETWORK_MODE: + sts_cfg_nvm.sts_ioc_mask = STS_IOC_MODE_0_MASK; + break; + + case STS_WIRED_MODE: + sts_cfg_nvm.sts_ioc_mask = STS_IOC_MODE_1_MASK; + break; + + case STS_REEDSWITCH_MODE: + sts_cfg_nvm.sts_ioc_mask = STS_IOC_MODE_2_MASK; + break; + + case STS_RSS_MODE: + sts_cfg_nvm.sts_ioc_mask = STS_IOC_MODE_3_MASK; + sts_rss_config_updated_flag = STS_RSS_CONFIG_DEFAULT; + break; + + case STS_DUAL_MODE: + sts_cfg_nvm.sts_ioc_mask = STS_IOC_MODE_4_MASK; + sts_rss_config_updated_flag = STS_RSS_CONFIG_DEFAULT; + break; + + case STS_UNI_MODE: + sts_cfg_nvm.sts_ioc_mask = STS_IOC_MODE_5_MASK; + sts_rss_config_updated_flag = STS_RSS_CONFIG_FALL_DETECTION; sts_presence_fall_detection=TRUE; - } else { - sts_presence_fall_detection=FALSE; + break; + + default: + + sts_cfg_nvm.sts_ioc_mask = STS_IOC_MASK_NONE; + break; } + sts_cfg_nvm.work_mode = (uint8_t)sts_work_mode; + sts_cfg_nvm.sts_service_mask = (uint8_t)sts_service_mask; OnStoreSTSCFGContextRequest(); @@ -2355,39 +2487,56 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, size_t tlv_buf_size) invalid_flag = 1; } - } else if (tlv_buf_size >= CFG_CMD_RSS_FULL_SIZE) + } else if (tlv_buf_size == CFG_CMD_RSS_FULL_SIZE) { invalid_flag = 0; - for (j =0; j < CFG_CMD_RSS_FULL_SIZE; j++) + for (j =0; j < CFG_CMD_RSS_FULL_SIZE-3; j++) { if ((tlv_buf[CFG_CMD4+j] >='0') && (tlv_buf[CFG_CMD4+j]<='9')) { - sts_cfg_nvm.p[j] = (uint8_t)((tlv_buf[CFG_CMD4+j] - 0x30)&0xFF); - APP_LOG(TS_OFF,VLEVEL_H,"\r\n tlv_buf %d = %02x cfg->p[%d]=%02x \r\n", - j,tlv_buf[CFG_CMD4+j], j, sts_cfg_nvm.p[j]); + //sts_cfg_nvm.p[j] = (uint8_t)((tlv_buf[CFG_CMD4+j] - 0x30)&0xFF); + //APP_LOG(TS_OFF,VLEVEL_H,"\r\n tlv_buf %d = %02x cfg->p[%d]=%02x \r\n",j,tlv_buf[CFG_CMD4+j], j, sts_cfg_nvm.p[j]); } else { invalid_flag = 1; } } + i=0; + sts_cfg_nvm.p[RSS_CFG_START_M] = (uint8_t)((tlv_buf[CFG_CMD4] - 0x30)*10+(tlv_buf[CFG_CMD5] - 0x30)); + sts_cfg_nvm.p[RSS_CFG_LENGTH_M] = (uint8_t)((tlv_buf[CFG_CMD6] - 0x30)*10+(tlv_buf[CFG_CMD7] - 0x30)); + sts_cfg_nvm.p[RSS_CFG_THRESHOLD] = (uint8_t)((tlv_buf[CFG_CMD8] - 0x30)*10+(tlv_buf[CFG_CMD9] - 0x30)); + sts_cfg_nvm.p[RSS_CFG_RECEIVER_GAIN] = (uint8_t)((tlv_buf[CFG_CMD10]- 0x30)*10+(tlv_buf[CFG_CMD11]- 0x30)); - if (invalid_flag != 1) + sts_cfg_nvm.p[RSS_CFG_PROFILE] = (uint8_t)((tlv_buf[CFG_CMD12]- 0x30)); + sts_cfg_nvm.p[RSS_CFG_RATE_TRACKING] = (uint8_t)((tlv_buf[CFG_CMD13]- 0x30)*10+(tlv_buf[CFG_CMD14]- 0x30)); + sts_cfg_nvm.p[RSS_CFG_RATE_PRESENCE] = (uint8_t)((tlv_buf[CFG_CMD15]- 0x30)*10+(tlv_buf[CFG_CMD16]- 0x30)); + sts_cfg_nvm.p[RSS_CFG_HWAAS] = (uint8_t)((tlv_buf[CFG_CMD17]- 0x30)*10+(tlv_buf[CFG_CMD18]- 0x30)); + + sts_cfg_nvm.p[RSS_CFG_NBR_REMOVED_PC] = (uint8_t)((tlv_buf[CFG_CMD19]- 0x30)); + + sts_cfg_nvm.p[RSS_CFG_ITE_DEVIATION] = (uint8_t)((tlv_buf[CFG_CMD20]- 0x30)*10+(tlv_buf[CFG_CMD21]- 0x30)); + sts_cfg_nvm.p[RSS_CFG_ITE_FAST_CUTOFF] = (uint8_t)((tlv_buf[CFG_CMD22]- 0x30)*10+(tlv_buf[CFG_CMD23]- 0x30)); + sts_cfg_nvm.p[RSS_CFG_ITE_SLOW_CUTOFF] = (uint8_t)((tlv_buf[CFG_CMD24]- 0x30)*10+(tlv_buf[CFG_CMD25]- 0x30)); + + sts_cfg_nvm.p[RSS_CFG_ITR_TIME] = (uint8_t)((tlv_buf[CFG_CMD26]- 0x30)*10+(tlv_buf[CFG_CMD27]- 0x30)); + sts_cfg_nvm.p[RSS_CFG_ITR_WEIGHT] = (uint8_t)((tlv_buf[CFG_CMD28]- 0x30)*10+(tlv_buf[CFG_CMD29]- 0x30)); + + sts_cfg_nvm.p[RSS_CFG_OUTPUT_TIME] = (uint8_t)((tlv_buf[CFG_CMD30]- 0x30)*10+(tlv_buf[CFG_CMD31]- 0x30)); + + sts_cfg_nvm.p[RSS_CFG_DOWNSAMPLING_FACTOR] = (uint8_t)((tlv_buf[CFG_CMD32]- 0x30)); + sts_cfg_nvm.p[RSS_CFG_POWER_MODE] = (uint8_t)((tlv_buf[CFG_CMD33]- 0x30)); + + + + if (invalid_flag == 0) { STS_PRESENCE_SENSOR_NVM_CFG(); i=0; // Step 1: Prepare status update message - - outbuf[i++] = (char) 'P'; - outbuf[i++] = sts_mtmcode1; - outbuf[i++] = sts_mtmcode2; - outbuf[i++] = sts_version; - outbuf[i++] = sts_hardware_ver; - - for (uint8_t j=0; j < CFG_CMD_RSS_FULL_SIZE; j++) - { - //outbuf[i++] = (uint8_t)(sts_cfg_nvm.p[j]+0x30)&0xff; - outbuf[i++] = tlv_buf[CFG_CMD4+j]; - } + UTIL_MEM_set_8((void*)outbuf, 0x0, sizeof(outbuf)); + UTIL_MEM_cpy_8((void*)outbuf,(void*)tlv_buf, tlv_buf_size); + i = tlv_buf_size; + APP_LOG(TS_OFF, VLEVEL_M, "###### RSS Full CFG=%s\r\n",(char *)outbuf); // Step 2: Save valid config to NVM sts_cfg_nvm.mtmcode1 = sts_mtmcode1; @@ -2396,37 +2545,44 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, size_t tlv_buf_size) sts_cfg_nvm.hardware_ver = sts_hardware_ver; sts_cfg_nvm.work_mode = sts_work_mode; sts_cfg_nvm.sts_service_mask = sts_service_mask; - sts_cfg_nvm.length = CFG_CMD_RSS_FULL_SIZE; + //sts_cfg_nvm.length = CFG_CMD_RSS_FULL_SIZE; OnStoreSTSCFGContextRequest(); } - } else if (tlv_buf_size >= CFG_CMD_RSS_SIMPLE_SIZE) + } else if (tlv_buf_size == CFG_CMD_RSS_SIMPLE_SIZE) { //Validation check invalid_flag = 0; - - for (j =0; j < CFG_CMD_RSS_SIMPLE_SIZE; j++) +#if 1 + for (j =0; j < CFG_CMD_RSS_SIMPLE_SIZE-3; j++) { if ((tlv_buf[CFG_CMD4+j] >='0') && (tlv_buf[CFG_CMD4+j]<='9')) { - sts_cfg_nvm.p[j] = (uint8_t)((tlv_buf[CFG_CMD4+j] - 0x30)&0xff); - // APP_LOG(TS_OFF,VLEVEL_H,"\r\n tlv_buf %d = %02x cfg->p[%d]=%02x \r\n", j,tlv_buf[CFG_CMD4+j], j, sts_cfg_nvm.p[j]); + + //sts_cfg_nvm.p[j] = (uint8_t)((tlv_buf[CFG_CMD4+j] - 0x30)&0xff); + //APP_LOG(TS_OFF,VLEVEL_H,"\r\n tlv_buf %d = %02x cfg->p[%d]=%02x \r\n",j,tlv_buf[CFG_CMD4+j], j, sts_cfg_nvm.p[j]); + } else { invalid_flag = 1; } } +#endif + sts_cfg_nvm.p[RSS_CFG_START_M] = (uint8_t)((tlv_buf[CFG_CMD4] - 0x30)*10+(tlv_buf[CFG_CMD5] - 0x30)); + sts_cfg_nvm.p[RSS_CFG_LENGTH_M] = (uint8_t)((tlv_buf[CFG_CMD6] - 0x30)*10+(tlv_buf[CFG_CMD7] - 0x30)); + sts_cfg_nvm.p[RSS_CFG_THRESHOLD] = (uint8_t)((tlv_buf[CFG_CMD8] - 0x30)*10+(tlv_buf[CFG_CMD9] - 0x30)); + sts_cfg_nvm.p[RSS_CFG_RECEIVER_GAIN] = (uint8_t)((tlv_buf[CFG_CMD10]- 0x30)*10+(tlv_buf[CFG_CMD11]- 0x30)); - if (invalid_flag != 1) + if (invalid_flag == 0) { STS_PRESENCE_SENSOR_NVM_CFG_SIMPLE(); i=0; // Step 1: Prepare status update message - - UTIL_MEM_set_8(outbuf, 0x0, sizeof(outbuf)); - UTIL_MEM_cpy_8(outbuf, tlv_buf,tlv_buf_size); + UTIL_MEM_set_8((void*)outbuf, 0x0, sizeof(outbuf)); + UTIL_MEM_cpy_8((void*)outbuf,(void*)tlv_buf, tlv_buf_size); i = tlv_buf_size; - APP_LOG(TS_OFF, VLEVEL_L, "###### RSS Simple CFG=%s\r\n",(char*)outbuf); + APP_LOG(TS_OFF, VLEVEL_M, "###### RSS Simple CFG=%s\r\n",(char*)outbuf); + // Step 2: Save valid config to NVM sts_cfg_nvm.mtmcode1 = sts_mtmcode1; @@ -2435,7 +2591,7 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, size_t tlv_buf_size) sts_cfg_nvm.hardware_ver = sts_hardware_ver; sts_cfg_nvm.work_mode = sts_work_mode; sts_cfg_nvm.sts_service_mask = sts_service_mask; - sts_cfg_nvm.length = CFG_CMD_RSS_SIMPLE_SIZE; + //sts_cfg_nvm.length = CFG_CMD_RSS_SIMPLE_SIZE; OnStoreSTSCFGContextRequest(); } @@ -2503,9 +2659,8 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, size_t tlv_buf_size) } i=0; - for (uint8_t j=0; j <(tlv_buf_size) ; j++) { - outbuf[i++] = (uint8_t) tlv_buf[j]; - } + UTIL_MEM_set_8((void*)outbuf, 0x0, sizeof(outbuf)); + UTIL_MEM_cpy_8((void*)outbuf,(void*)tlv_buf, tlv_buf_size); STS_SENSOR_Upload_Message(LORAWAN_USER_APP_CTRL_REPLY_PORT, i, (uint8_t *)outbuf); } @@ -2593,7 +2748,7 @@ void OnStoreSTSCFGContextRequest(void) nvm_store_value[i++] = sts_cfg_nvm.work_mode; nvm_store_value[i++] = sts_cfg_nvm.sts_service_mask; nvm_store_value[i++] = sts_cfg_nvm.sts_ioc_mask; - nvm_store_value[i++] = (uint8_t) STS_O7_NVM_CFG_SIZE; //sts_cfg_nvm.length; + nvm_store_value[i++] = sts_cfg_nvm.length; //(uint8_t) STS_O7_NVM_CFG_SIZE; //sts_cfg_nvm.length; for (j = 0; j < STS_O7_CFG_PCFG_SIZE; j++) { nvm_store_value[i++] = (sts_cfg_nvm.p[j]); @@ -2633,7 +2788,7 @@ void OnStoreSTSCFGContextRequest(void) /* USER CODE END OnStoreContextRequest_Last */ } -void OnRestoreSTSCFGContextRequest(uint8_t *cfg_in_nvm) +void OnRestoreSTSCFGContextRequest(void *cfg_in_nvm) { /* USER CODE BEGIN OnRestoreSTSCFGContextRequest_1 */ // uint8_t nvm_store_value[YUNHORN_STS_MAX_NVM_CFG_SIZE]="", nvm_store_size=YUNHORN_STS_MAX_NVM_CFG_SIZE; @@ -2641,7 +2796,8 @@ void OnRestoreSTSCFGContextRequest(uint8_t *cfg_in_nvm) APP_LOG(TS_OFF, VLEVEL_M, "Restore NVM start\r\n"); /* USER CODE END OnRestoreSTSCFGContextRequest_1 */ - UTIL_MEM_cpy_8(cfg_in_nvm, (void *)STS_CONFIG_NVM_BASE_ADDRESS, YUNHORN_STS_MAX_NVM_CFG_SIZE); + FLASH_IF_Read(cfg_in_nvm, STS_CONFIG_NVM_BASE_ADDRESS, YUNHORN_STS_MAX_NVM_CFG_SIZE); + //UTIL_MEM_cpy_8(cfg_in_nvm, (void *)STS_CONFIG_NVM_BASE_ADDRESS, YUNHORN_STS_MAX_NVM_CFG_SIZE); /* USER CODE BEGIN OnRestoreSTSCFGContextRequest_Last */ @@ -2657,7 +2813,8 @@ void STS_REBOOT_CONFIG_Init(void) uint8_t nvm_stored_value[YUNHORN_STS_MAX_NVM_CFG_SIZE]={0x0}; /* USER CODE END OnRestoreContextRequest_1 */ - UTIL_MEM_cpy_8(nvm_stored_value, (void *)STS_CONFIG_NVM_BASE_ADDRESS, YUNHORN_STS_MAX_NVM_CFG_SIZE); + //UTIL_MEM_cpy_8(nvm_stored_value, (void *)STS_CONFIG_NVM_BASE_ADDRESS, YUNHORN_STS_MAX_NVM_CFG_SIZE); + FLASH_IF_Read(nvm_stored_value, STS_CONFIG_NVM_BASE_ADDRESS, YUNHORN_STS_MAX_NVM_CFG_SIZE); /* USER CODE BEGIN OnRestoreContextRequest_Last */ //#if (defined(STS_O7)||defined(STS_O5) || defined(STS_O6) || defined(STS_R0) || defined(STS_R5)|| defined(STS_R4)|| defined(STS_R1D)) @@ -2673,6 +2830,7 @@ void STS_REBOOT_CONFIG_Init(void) sts_cfg_nvm.mtmcode2 = (uint8_t)nvm_stored_value[NVM_MTM2]; sts_cfg_nvm.version = (uint8_t)nvm_stored_value[NVM_VER]; sts_cfg_nvm.hardware_ver = (uint8_t)nvm_stored_value[NVM_HWV]; + sts_cfg_nvm.periodicity = (uint8_t)(nvm_stored_value[NVM_PERIODICITY]); sts_cfg_nvm.unit = (uint8_t)(nvm_stored_value[NVM_UNIT]); sts_cfg_nvm.sampling = (uint8_t)(nvm_stored_value[NVM_SAMPLING]); @@ -2723,9 +2881,7 @@ void OnRestoreSTSCFGContextProcess(void) } else if ((char) sts_cfg_nvm.unit =='S') { periodicity *= 1; } - periodicity = (periodicity > 10)? periodicity : 10; // in seconds unit - //TxPeriodicity= periodicity*1000; // to ms - //OnTxPeriodicityChanged(TxPeriodicity); // in msec unit + periodicity *= 1000; // to ms uint32_t sampling = (sts_cfg_nvm.sampling); if ((char)sts_cfg_nvm.s_unit =='M') { @@ -2741,6 +2897,7 @@ void OnRestoreSTSCFGContextProcess(void) { // ensure it's not in production yet OnTxPeriodicityChanged(APP_TX_DUTYCYCLE); // in msec unit OnYunhornSTSHeartBeatPeriodicityChanged(HeartBeatPeriodicity); + OnYunhornSTSSamplingPeriodicityChanged(sampling); // in m-sec unit } else { //OnTxPeriodicityChanged(TxPeriodicity); // in msec unit @@ -2750,7 +2907,14 @@ void OnRestoreSTSCFGContextProcess(void) HeartBeatPeriodicity = samplingperiodicity*1000; #endif #if defined(STS_O7)|| defined(STS_O6) ||defined(STS_O5) - OnYunhornSTSHeartBeatPeriodicityChanged(periodicity*1000); + //if (STS_LoRa_WAN_Joined !=0) + { + HeartBeatPeriodicity = periodicity; + OnYunhornSTSHeartBeatPeriodicityChanged(HeartBeatPeriodicity); + } //else { + //OnYunhornSTSHeartBeatPeriodicityChanged(APP_TX_DUTYCYCLE); + //} + OnYunhornSTSSamplingPeriodicityChanged(sampling); // in m-sec unit #endif @@ -2785,27 +2949,21 @@ void OnRestoreSTSCFGContextProcess(void) #if defined(STS_O7)||defined(STS_O6) - if ((sts_version == sts_cfg_nvm.version)&& (NVM_CFG_PARAMETER_SIZE == sts_cfg_nvm.length)) +// if ((sts_version == sts_cfg_nvm.version)&& (NVM_CFG_PARAMETER_SIZE == sts_cfg_nvm.length)) { STS_PRESENCE_SENSOR_Init(); //STS_PRESENCE_SENSOR_RSS_Init(); } #endif + //STS_SENSOR_Distance_Test_Process(); + //APP_LOG(TS_OFF, VLEVEL_L, "\r\nDistance Measured =%u mm, Ceiling Height=%u \r\n", (uint16_t)sts_distance_rss_distance, (uint16_t)sts_sensor_install_height); } void STS_SENSOR_Distance_Test_Process(void) { #if defined(STS_O6)||defined(STS_O7) - //sts_distance_rss_distance =0; uint8_t i=0; - //do { STS_PRESENCE_SENSOR_Distance_Measure_Process(); -// HAL_Delay(200); -// i++; -// } while((sts_distance_rss_distance == 0)&&(i<2)); - - APP_LOG(TS_OFF, VLEVEL_L, "\r\nSensor Function Test: Distance Measured =%u mm\r\n", (uint16_t)sts_distance_rss_distance); - #endif #if defined(YUNHORN_STS_R0_ENABLED)||defined(YUNHORN_STS_R5_ENABLED) @@ -2870,15 +3028,15 @@ void STS_SENSOR_Function_Test_Process(void) #endif } - memset((void*)outbuf,0x0, sizeof(outbuf)); - memcpy((void*)outbuf, tstbuf, i); + //memset((void*)outbuf,0x0, sizeof(outbuf)); + UTIL_MEM_cpy_8((void*)outbuf, (void*)tstbuf, i); STS_SENSOR_Upload_Message(LORAWAN_USER_APP_CTRL_REPLY_PORT, i, (uint8_t*)outbuf); } uint32_t STS_Get_Date_Time_Stamp(void) { - struct tm localtime; + struct tm localtime={0}; SysTime_t UnixEpoch = SysTimeGet(); UnixEpoch.Seconds -= 18; /*removing leap seconds*/ diff --git a/LoRaWAN/App/lora_app.h b/LoRaWAN/App/lora_app.h index 62c4511..a56d02a 100644 --- a/LoRaWAN/App/lora_app.h +++ b/LoRaWAN/App/lora_app.h @@ -73,8 +73,11 @@ extern "C" { /*! * LoRaWAN default class */ +#ifndef STS_BAT #define LORAWAN_DEFAULT_CLASS CLASS_C - +#elif defined(STS_BAT) +#define LORAWAN_DEFAULT_CLASS CLASS_A +#endif /*! * LoRaWAN default confirm state */ @@ -90,8 +93,11 @@ extern "C" { * LoRaWAN Default Data Rate * @note Please note that LORAWAN_DEFAULT_DATA_RATE is used only when LORAWAN_ADR_STATE is disabled */ +#ifndef STS_BAT #define LORAWAN_DEFAULT_DATA_RATE DR_0 - +#elif defined(STS_BAT) +#define LORAWAN_DEFAULT_DATA_RATE DR_5 +#endif /*! * LoRaWAN Default Tx output power * @note LORAWAN_DEFAULT_TX_POWER must be defined in the [XXXX_MIN_TX_POWER - XXXX_MAX_TX_POWER] range, diff --git a/STM32CubeIDE/.cproject b/STM32CubeIDE/.cproject index 24a19c7..40fb73e 100644 --- a/STM32CubeIDE/.cproject +++ b/STM32CubeIDE/.cproject @@ -39,7 +39,7 @@