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 b3e8844..b5961c5 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,11 @@ 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 81f0e26..8abd66c 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,21 +228,37 @@ 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();
}
@@ -251,12 +273,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 ) {
@@ -275,7 +315,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);
@@ -283,7 +323,7 @@ void STS_Reed_Hall_Presence_Detection(void)
sts_reed_hall_changed_flag = 0;
- sts_reed_hall_ext_int = 0;
+
}
@@ -462,6 +502,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;
@@ -473,10 +515,9 @@ void STS_Combined_Status_Processing(void)
case STS_REEDSWITCH_MODE:
sts_status_color = (sts_reed_hall_1_result == STS_Status_Door_Open )? STS_GREEN: STS_RED;
-
if (sts_reed_hall_2_result == STS_Status_SOS_Pushdown )
{
- sts_status_color = STS_RED_BLUE;
+ sts_status_color = STS_RED_BLUE;
}
break;
@@ -505,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;
@@ -626,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();
@@ -658,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
@@ -700,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;
@@ -726,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)
{
@@ -743,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) ||
@@ -765,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",
@@ -791,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;
@@ -799,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) {
@@ -828,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;
@@ -864,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)
@@ -888,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;
+ }
}
@@ -953,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)
@@ -977,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)
{
@@ -1095,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
@@ -1122,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
@@ -1148,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();
@@ -1166,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:
@@ -1201,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
@@ -1226,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
@@ -1237,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 acf9ef0..76e74d3 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,18 @@ 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;
}
@@ -914,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;
@@ -940,8 +978,7 @@ static void SendTxData(void)
{
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))
+ } 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
@@ -961,45 +998,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);
@@ -1008,12 +1045,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,
@@ -1028,7 +1065,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;;
@@ -1062,12 +1107,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));
@@ -1082,23 +1128,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 */
@@ -1139,34 +1176,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)
- {
- STS_Lamp_Bar_Set_STS_RGB_Color(high4, DEFAULT_LUMINANCE_LEVEL);
- last_sts_lamp_bar_color = high4;
- }
- else {
- STS_Lamp_Bar_Set_STS_RGB_Color(low4, DEFAULT_LUMINANCE_LEVEL);
- last_sts_lamp_bar_color = low4;
- }
-
- 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)
@@ -1251,6 +1278,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;
@@ -1304,8 +1337,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;
@@ -1314,7 +1348,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;
}
}
@@ -1359,9 +1395,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
@@ -1376,9 +1412,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
@@ -1388,12 +1421,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 */
}
@@ -1471,8 +1524,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);
@@ -1647,16 +1698,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);
@@ -1671,7 +1729,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))
{
@@ -1681,6 +1738,7 @@ static void OnYunhornSTSHeartBeatTimerEvent(void *context)
}
UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventRFAC), CFG_SEQ_Prio_0);
}
+ UTIL_TIMER_Start(&YunhornSTSHeartBeatTimer);
}
/**
@@ -1694,6 +1752,7 @@ static void OnYunhornSTSHeartBeatPeriodicityChanged(uint32_t periodicity)
/* USER CODE BEGIN OnTxPeriodicityChanged_1 */
/* USER CODE END OnTxPeriodicityChanged_1 */
+#if 1
HeartBeatPeriodicity = periodicity;
if (HeartBeatPeriodicity == 0)
@@ -1701,7 +1760,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);
@@ -1709,7 +1768,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 */
}
@@ -1734,10 +1793,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);
@@ -1849,7 +1911,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));
@@ -2069,9 +2131,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 {
@@ -2083,10 +2146,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 {
@@ -2096,10 +2159,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 {
@@ -2119,17 +2184,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);
@@ -2144,7 +2209,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();
@@ -2175,9 +2240,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);
@@ -2230,38 +2295,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);
@@ -2270,15 +2369,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();
}
@@ -2303,9 +2406,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();
}
}
@@ -2324,18 +2428,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();
@@ -2348,39 +2486,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;
@@ -2389,37 +2544,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;
@@ -2428,7 +2590,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();
}
@@ -2496,9 +2658,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);
}
@@ -2590,7 +2751,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]);
@@ -2630,7 +2791,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;
@@ -2638,7 +2799,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 */
@@ -2654,7 +2816,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))
@@ -2670,6 +2833,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]);
@@ -2720,9 +2884,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') {
@@ -2738,6 +2900,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
@@ -2747,7 +2910,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
@@ -2782,27 +2952,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)
@@ -2867,15 +3031,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 1d753ee..0852f3c 100644
--- a/STM32CubeIDE/.cproject
+++ b/STM32CubeIDE/.cproject
@@ -39,7 +39,7 @@
-
+
-
+
-
+
+
@@ -153,6 +154,7 @@
+
diff --git a/STM32CubeIDE/Release/STS_O2O6O7_STABLE_RS_RSS_Motion_20240813.bin b/STM32CubeIDE/Release/STS_O2O6O7_STABLE_RS_RSS_Motion_20240813.bin
new file mode 100644
index 0000000..721c2e9
Binary files /dev/null and b/STM32CubeIDE/Release/STS_O2O6O7_STABLE_RS_RSS_Motion_20240813.bin differ
diff --git a/STM32CubeIDE/Release/STS_O2O6O7_STABLE_RS_RSS_Motion_20240814_GOOD.bin b/STM32CubeIDE/Release/STS_O2O6O7_STABLE_RS_RSS_Motion_20240814_GOOD.bin
new file mode 100644
index 0000000..254a5a6
Binary files /dev/null and b/STM32CubeIDE/Release/STS_O2O6O7_STABLE_RS_RSS_Motion_20240814_GOOD.bin differ
diff --git a/STM32CubeIDE/Release/STS_O2O6O7_STABLE_RTM_NO_DEBUG_20240813.bin b/STM32CubeIDE/Release/STS_O2O6O7_STABLE_RTM_NO_DEBUG_20240813.bin
new file mode 100644
index 0000000..cfd0260
Binary files /dev/null and b/STM32CubeIDE/Release/STS_O2O6O7_STABLE_RTM_NO_DEBUG_20240813.bin differ
diff --git a/STM32CubeIDE/Release/STS_O6_DEBUG_RM2_1_pixel_network_20240806a.bin b/STM32CubeIDE/Release/STS_O6_DEBUG_RM2_1_pixel_network_20240806a.bin
new file mode 100644
index 0000000..85dfd75
Binary files /dev/null and b/STM32CubeIDE/Release/STS_O6_DEBUG_RM2_1_pixel_network_20240806a.bin differ
diff --git a/STM32CubeIDE/Release/STS_O6_RTM_PIXEL_NETWORK_20240820.bin b/STM32CubeIDE/Release/STS_O6_RTM_PIXEL_NETWORK_20240820.bin
new file mode 100644
index 0000000..0825b6d
Binary files /dev/null and b/STM32CubeIDE/Release/STS_O6_RTM_PIXEL_NETWORK_20240820.bin differ
diff --git a/STM32CubeIDE/Release/STS_O6_RTM_RM2_1_46cm_pixel_network_20240806b.bin b/STM32CubeIDE/Release/STS_O6_RTM_RM2_1_46cm_pixel_network_20240806b.bin
new file mode 100644
index 0000000..6818931
Binary files /dev/null and b/STM32CubeIDE/Release/STS_O6_RTM_RM2_1_46cm_pixel_network_20240806b.bin differ
diff --git a/STM32CubeIDE/Release/STS_O6_RTM_RM2_1_pixel_network_20240806a.bin b/STM32CubeIDE/Release/STS_O6_RTM_RM2_1_pixel_network_20240806a.bin
new file mode 100644
index 0000000..9fd42dd
Binary files /dev/null and b/STM32CubeIDE/Release/STS_O6_RTM_RM2_1_pixel_network_20240806a.bin differ
diff --git a/STM32CubeIDE/Release/STS_O7_Good_startup_20240809_16pm.bin b/STM32CubeIDE/Release/STS_O7_Good_startup_20240809_16pm.bin
new file mode 100644
index 0000000..5f53157
Binary files /dev/null and b/STM32CubeIDE/Release/STS_O7_Good_startup_20240809_16pm.bin differ
diff --git a/STM32CubeIDE/Release/makefile b/STM32CubeIDE/Release/makefile
index edf16c3..ed02fa8 100644
--- a/STM32CubeIDE/Release/makefile
+++ b/STM32CubeIDE/Release/makefile
@@ -56,12 +56,6 @@ STS_O7.map \
SIZE_OUTPUT += \
default.size.stdout \
-OBJDUMP_LIST += \
-STS_O7.list \
-
-OBJCOPY_HEX += \
-STS_O7.hex \
-
OBJCOPY_BIN += \
STS_O7.bin \
@@ -74,7 +68,7 @@ main-build: STS_O7.elf secondary-outputs
# Tool invocations
STS_O7.elf STS_O7.map: $(OBJS) $(USER_OBJS) D:\ONEDRIVE\STM32WLV13\Projects\NUCLEO-WL55JC\Applications\LoRaWAN\YUNHORN_STS_E5CC_AS923_POC\STM32CubeIDE\STM32WLE5CCUX_FLASH.ld makefile objects.list $(OPTIONAL_TOOL_DEPS)
- arm-none-eabi-gcc -o "STS_O7.elf" @"objects.list" $(USER_OBJS) $(LIBS) -mcpu=cortex-m4 -T"D:\ONEDRIVE\STM32WLV13\Projects\NUCLEO-WL55JC\Applications\LoRaWAN\YUNHORN_STS_E5CC_AS923_POC\STM32CubeIDE\STM32WLE5CCUX_FLASH.ld" --specs=nosys.specs -Wl,-Map="STS_O7.map" -Wl,--gc-sections -static -L"D:\ONEDRIVE\STM32WLV13\Projects\NUCLEO-WL55JC\Applications\LoRaWAN\STS_O7\STM32CubeIDE\rss\lib" -L../../../../../../../Middlewares/ST/STM32_Cryptographic/lib -Xlinker -no-enum-size-warning -z noexecstack --specs=nano.specs -mfloat-abi=soft -mthumb -u _printf_float -Wl,--start-group -lc -lm -Wl,--end-group
+ arm-none-eabi-gcc -o "STS_O7.elf" @"objects.list" $(USER_OBJS) -Wl,--start-group $(LIBS) -Wl,--end-group -mcpu=cortex-m4 -T"D:\ONEDRIVE\STM32WLV13\Projects\NUCLEO-WL55JC\Applications\LoRaWAN\YUNHORN_STS_E5CC_AS923_POC\STM32CubeIDE\STM32WLE5CCUX_FLASH.ld" --specs=nosys.specs -Wl,-Map="STS_O7.map" -Wl,--gc-sections -static -L"D:\ONEDRIVE\STM32WLV13\Projects\NUCLEO-WL55JC\Applications\LoRaWAN\STS_O7\STM32CubeIDE\rss\lib" -L../../../../../../../Middlewares/ST/STM32_Cryptographic/lib -Xlinker -no-enum-size-warning -z noexecstack --specs=nano.specs -mfloat-abi=soft -mthumb -Wl,--start-group -lc -lm -Wl,--end-group
@echo 'Finished building target: $@'
@echo ' '
@@ -83,16 +77,6 @@ default.size.stdout: $(EXECUTABLES) makefile objects.list $(OPTIONAL_TOOL_DEPS)
@echo 'Finished building: $@'
@echo ' '
-STS_O7.list: $(EXECUTABLES) makefile objects.list $(OPTIONAL_TOOL_DEPS)
- arm-none-eabi-objdump -h -S $(EXECUTABLES) > "STS_O7.list"
- @echo 'Finished building: $@'
- @echo ' '
-
-STS_O7.hex: $(EXECUTABLES) makefile objects.list $(OPTIONAL_TOOL_DEPS)
- arm-none-eabi-objcopy -O ihex $(EXECUTABLES) "STS_O7.hex"
- @echo 'Finished building: $@'
- @echo ' '
-
STS_O7.bin: $(EXECUTABLES) makefile objects.list $(OPTIONAL_TOOL_DEPS)
arm-none-eabi-objcopy -O binary $(EXECUTABLES) "STS_O7.bin"
@echo 'Finished building: $@'
@@ -100,10 +84,10 @@ STS_O7.bin: $(EXECUTABLES) makefile objects.list $(OPTIONAL_TOOL_DEPS)
# Other Targets
clean:
- -$(RM) STS_O7.bin STS_O7.elf STS_O7.hex STS_O7.list STS_O7.map default.size.stdout
+ -$(RM) STS_O7.bin STS_O7.elf STS_O7.map default.size.stdout
-@echo ' '
-secondary-outputs: $(SIZE_OUTPUT) $(OBJDUMP_LIST) $(OBJCOPY_HEX) $(OBJCOPY_BIN)
+secondary-outputs: $(SIZE_OUTPUT) $(OBJCOPY_BIN)
fail-specified-linker-script-missing:
@echo 'Error: Cannot find the specified linker script. Check the linker settings in the build configuration.'
diff --git a/readme.txt b/readme.txt
index 583ae81..e784623 100644
--- a/readme.txt
+++ b/readme.txt
@@ -43,8 +43,15 @@ STS_O7 For Occupancy sensors
2024-06-06 before STS_FALL_DETECTION_MODE change
2024-06-17 good for sensor 1 and sensor 2 start stop timer freezed for now
2024-06-26 RTM for pixel-network STS_RSS_MODE = 3 P113 switch
+<<<<<<< HEAD
******************************************************************************
2024-08-05 PIXEL-NETWORK RM2
+=======
+2024-07-30 revert back ...not good for alarm so far
+2024-08-06 start focus on fall detection
+2024-08-06 a...
+*****************************************************************************
+>>>>>>> da4c2742329b0ee8493739f64b95f19a6d5daea3
*/