From 180f71b1eb9ec432a782b38a2d0e2b203f0e311a Mon Sep 17 00:00:00 2001 From: YunHorn Technology Date: Sat, 7 Dec 2024 17:31:58 +0800 Subject: [PATCH] wip --- Core/Inc/sts_lamp_bar.h | 12 +- Core/Src/sts_lamp_bar.c | 3 +- LoRaWAN/App/lora_app.c | 77 ++++-- STM32CubeIDE/Release/WLE5CC_NODE_STS.bin | Bin 187760 -> 188132 bytes STM32CubeIDE/Release/WLE5CC_NODE_STS.elf | Bin 277536 -> 276900 bytes STS/Core/Inc/yunhorn_sts_sensors.h | 31 ++- STS/Core/Src/yunhorn_sts_process.c | 303 +++++++++++++++------- STS/TOF/App/app_tof.c | 310 ++++------------------- 8 files changed, 346 insertions(+), 390 deletions(-) diff --git a/Core/Inc/sts_lamp_bar.h b/Core/Inc/sts_lamp_bar.h index 99db16f..fdd98ac 100644 --- a/Core/Inc/sts_lamp_bar.h +++ b/Core/Inc/sts_lamp_bar.h @@ -38,7 +38,8 @@ extern "C" { #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# - +#define STS_Status_PIR_Motion_Detected (1) // +#define STS_Status_PIR_Motion_Ended (0) enum sts_lamp_color { STS_DARK = 0, //灭:0, Code 0x00 STS_GREEN, //绿:1 0 1 0 code 0x01 0b0000 0001 @@ -69,9 +70,16 @@ enum sts_lamp_color { #define STS_OCCUPY_COLOR STS_GREEN #define STS_SOS_COLOR STS_RED_BLUE +#define STS_FALL_NORMAL_COLOR STS_GREEN #define STS_FALL_SUSPICIOUS_COLOR STS_YELLOW #define STS_FALL_CONFIRMED_COLOR STS_RED -#define STS_HUMAN_MOVEMENT_MOTIONLESS_COLOR STS_YELLOW + +#define STS_HUMAN_MOVEMENT_MOTIONLESS_NORMAL STS_GREEN +#define STS_HUMAN_MOVEMENT_MOTIONLESS_SHORT_COLOR STS_YELLOW +#define STS_HUMAN_MOVEMENT_MOTIONLESS_LONG_COLOR STS_RED + +#define STS_OCCUPANCY_NORMAL_COLOR STS_GREEN +#define STS_OCCUPANCY_STAYLONGER_COLOR STS_YELLOW //NOT REALLY USED, JUST TO ALIGN FOR COLORS PATTERN #define STS_OCCUPANCY_OVERSTAY_COLOR STS_RED /* enum sts_oo_work_mode { diff --git a/Core/Src/sts_lamp_bar.c b/Core/Src/sts_lamp_bar.c index 4947660..52cd6a1 100644 --- a/Core/Src/sts_lamp_bar.c +++ b/Core/Src/sts_lamp_bar.c @@ -249,7 +249,8 @@ void STS_Lamp_Bar_Self_Test(void) STS_Lamp_Bar_Set_Dark(); } else { - STS_Lamp_Bar_Set_STS_RGB_Color(STS_GREEN, lum_level); + //STS_Lamp_Bar_Set_STS_RGB_Color(STS_GREEN, lum_level); + STS_Lamp_Bar_Set_STS_RGB_Color(STS_VACANT_COLOR, lum_level); } diff --git a/LoRaWAN/App/lora_app.c b/LoRaWAN/App/lora_app.c index 565a790..eae20f5 100644 --- a/LoRaWAN/App/lora_app.c +++ b/LoRaWAN/App/lora_app.c @@ -59,7 +59,7 @@ extern volatile uint8_t sts_ac_code[20]; extern volatile sts_cfg_nvm_t sts_cfg_nvm; extern volatile uint8_t sts_work_mode, sts_cloud_netcolor, sts_lamp_bar_color, sts_status_color, luminance_level; volatile static bool r_b=true; -extern volatile uint8_t sts_pir_state; +extern volatile uint8_t sts_pir_read; extern volatile uint32_t rfac_timer; extern volatile uint32_t STS_TOFScanPeriod_msec, STS_TxPeriod_sec, STS_HeartBeatTimerPeriod_sec; volatile uint8_t sts_data_buf[LORAWAN_APP_DATA_BUFFER_MAX_SIZE]={0x0}; @@ -73,12 +73,18 @@ extern volatile sts_fhmos_sensor_ambient_height_t fhmos_bg; // volatile LmHandlerAppData_t sts_app_data={ 0, 0, sts_data_buf }; extern volatile uint8_t sts_hall1_read, sts_hall2_read; // Above hall1_read == reed_hall_result, hall2_read == emergency_button extern volatile uint8_t sts_hall3_read, sts_hall4_read; -extern volatile uint8_t sts_pir_state; +//extern volatile uint8_t sts_pir_state, sts_pir_result; extern volatile uint8_t last_sts_hall1_read, last_sts_hall2_read, last_sts_hall3_read, last_sts_hall4_read; -volatile uint8_t sts_PIR_read = 0; +//volatile uint8_t sts_PIR_read = 0; volatile bool locklow = false; volatile uint32_t lowin=0; volatile bool takelowTime; +uint32_t check_time=0; +volatile bool motionDetected =false; +uint32_t lastMotionTime =0; +const uint32_t ledOnDuration = 10000; + + /* USER CODE END EV */ /* Private typedef -----------------------------------------------------------*/ @@ -497,7 +503,7 @@ void LoRaWAN_Init(void) UTIL_TIMER_Create(&RxLedTimer, LED_PERIOD_TIME, UTIL_TIMER_ONESHOT, OnRxTimerLedEvent, 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, 30*LED_PERIOD_TIME, UTIL_TIMER_PERIODIC, OnYunhornSTSDurationCheckTimerEvent, NULL); + UTIL_TIMER_Create(&STSDurationCheckTimer, 1000, UTIL_TIMER_PERIODIC, OnYunhornSTSDurationCheckTimerEvent, NULL); if (FLASH_IF_Init(NULL) != FLASH_IF_OK) { @@ -589,7 +595,7 @@ void LoRaWAN_Init(void) #endif UTIL_TIMER_Start(&STSLampBarColorTimer); - + UTIL_TIMER_Start(&STSDurationCheckTimer); //UTIL_TIMER_Create(&YunhornSTSHeartBeatTimer, 1000*STS_HeartBeatTimerPeriod_sec, UTIL_TIMER_PERIODIC, OnYunhornSTSHeartBeatTimerEvent, NULL); // UTIL_TIMER_Create(&YunhornSTSHeartBeatTimer, 1000*STS_HeartBeatTimerPeriod_sec, UTIL_TIMER_ONESHOT, OnYunhornSTSHeartBeatTimerEvent, NULL); // UTIL_TIMER_Start(&YunhornSTSHeartBeatTimer); @@ -620,9 +626,12 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) // 2) change lamp bar color if (sts_hall1_read == STS_Status_Door_Close) { - sts_lamp_bar_color = STS_OCCUPY_COLOR; + sts_lamp_bar_color = STS_OCCUPANCY_NORMAL_COLOR; //prev_color = sts_lamp_bar_color; - sts_status_color = STS_OCCUPY_COLOR; + sts_status_color = STS_OCCUPANCY_NORMAL_COLOR; + + printf("\r\n EXIT_CALLBACK, Door Open: sts status color =%d, lampbar_color=%d \r\n", sts_status_color, sts_lamp_bar_color); + //printf("\r\n Door Closed sts status color =%d", sts_status_color); } else @@ -631,21 +640,24 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) //sts_lamp_bar_color = prev_color; sts_status_color = STS_VACANT_COLOR; sts_lamp_bar_color = STS_VACANT_COLOR; - //printf("\r\n Door Open: sts status color =%d", sts_status_color); + printf("\r\n EXIT_CALLBACK, Door Open: sts status color =%d, lampbar_color=%d \r\n", sts_status_color, sts_lamp_bar_color); } //printf("\r\n sts status color =0x%02x \r\n", sts_status_color); // 3) combine states and colors - STS_YunhornSTSEventP1_Process(); + //STS_YunhornSTSEventP1_Process(); //STS_Combined_Status_Processing(); // 4) upload state change messages //if (EventType == TX_ON_EVENT) +#if 0 if (sts_hall1_read == STS_Status_Door_Close) { fhmos_occupancy = 1; } +#endif + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); last_sts_hall1_read = sts_hall1_read; break; @@ -668,27 +680,27 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) sts_status_color = STS_SOS_COLOR; fhmos_sos_alarm = 1; } - //printf("\r\n lamp bar color =0x%02x \r\n", sts_lamp_bar_color); - if (sts_hall2_read ==STS_Status_SOS_Release) + else if (sts_hall2_read ==STS_Status_SOS_Release) { sts_lamp_bar_color = STS_VACANT_COLOR; sts_status_color = STS_VACANT_COLOR; fhmos_sos_alarm = 0; - UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); } last_sts_hall2_read = sts_hall2_read; // 3) combine states and colors - STS_YunhornSTSEventP1_Process(); + //STS_YunhornSTSEventP1_Process(); // 4) upload state change messages +#if 0 if (sts_hall2_read == STS_Status_SOS_Release) { fhmos_sos_alarm = 0; } - UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); - last_sts_hall1_read = sts_hall1_read; +#endif + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); + last_sts_hall2_read = sts_hall2_read; break; @@ -701,39 +713,48 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) #endif #if 1 case PIR_Pin: - sts_pir_state = PIR_STATE; - printf("\r\n pir state =%u \r\n", sts_pir_state); + sts_pir_read = PIR_STATE; - if (sts_pir_state) +#if 0 + motionDetected = true; + lastMotionTime = TIMER_IF_GetTimerValue(); + printf("\r\n pir state =%u \r\n", sts_pir_read); + + + //sts_pir_read = PIR_STATE; + + + if (sts_pir_read) { if (locklow) { - sts_PIR_read = 1; + sts_pir_read = 1; locklow = false; - printf("\r\n Motion detected, PIR state =%d \r\n", sts_PIR_read); + printf("\r\n Motion detected, PIR state =%d \r\n", sts_pir_read); HAL_Delay(50); } takelowTime=true; } - else if (!sts_pir_state) + else if (!sts_pir_read) { //printf("\r\n pir state =%u \r\n", sts_pir_state); - uint32_t check_time=TIMER_IF_GetTimerValue(); + check_time=TIMER_IF_GetTimerValue(); if (takelowTime) { lowin = check_time; printf("\r\n lowin start at: %u \r\n", lowin); takelowTime = false; } //printf("\r\n low duration=%d \r\n", check_time-lowin); - if ((!locklow && (check_time - lowin >= 50))) { + else if ((!locklow && (check_time - lowin >= 5000))) { printf("\r\n low duration=%d \r\n", check_time-lowin); - sts_PIR_read = 0; + sts_pir_read = 0; locklow = true; - printf("\r\n Motion End, PIR state =%d \r\n", sts_PIR_read); + printf("\r\n Motion End, PIR state =%d \r\n", sts_pir_read); } } +#endif OnSensorPIR1StateChanged(); #endif @@ -1185,8 +1206,8 @@ static void SendTxData(void) AppData.Buffer[i++] = fhmos_data.state_human_movement; AppData.Buffer[i++] = fhmos_data.state_occupancy; AppData.Buffer[i++] = fhmos_data.state_sos_alarm; - AppData.Buffer[i++] = fhmos_data.lamp_bar_color; + AppData.Buffer[i++] = fhmos_data.lamp_bar_color; AppData.Buffer[i++] = fhmos_data.state_hall_1; AppData.Buffer[i++] = fhmos_data.state_hall_2; AppData.Buffer[i++] = fhmos_data.state_PIR; @@ -1195,7 +1216,7 @@ static void SendTxData(void) sts_data->lamp_bar_color = sts_lamp_bar_color; sts_data->state_hall_1 = sts_hall1_read; sts_data->state_hall_2 = sts_hall2_read; - sts_data->state_PIR = sts_pir_result;; + sts_data->state_PIR = sts_pir_read;; AppData.Buffer[i++] = 8; AppData.Buffer[i++] = fhmos_data.state_fall; @@ -1655,7 +1676,7 @@ static void OnYunhornSTSLampBarColorTimerEvent(void *context) */ static void OnYunhornSTSDurationCheckTimerEvent(void *context) { - printf("\r\n----Duration check process ----"); + //printf("\r\n----Duration check process ----"); YunhornSTSDurationCheckTimer(); #ifdef STS_O6 diff --git a/STM32CubeIDE/Release/WLE5CC_NODE_STS.bin b/STM32CubeIDE/Release/WLE5CC_NODE_STS.bin index ec6b209e280393b0cb79b3d60c1007c9627f5f12..0ffaeb783406080e7969a1f26bc8702948932c1a 100644 GIT binary patch delta 15839 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

E?Yb$Pf(!-vOeLQ|FOGi|d~aa0x5j`% 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 sts_occupancy_overtime_threshold_in_10min*600) - //if (sts_o7_sensorData.event_sensor1_duration > (sts_occupancy_overtime_threshold_in_10min*60)) //for debug if (sts_o7_sensorData.event_sensor1_duration > fhmos_cfg.th_occupancy_overstay_15sec*15) { fhmos_data.state_occupancy = STS_FHMOS_OCCUPANCY_OVERSTAY; sts_o7_sensorData.over_stay_state = 1; sts_o7_sensorData.over_stay_duration = sts_o7_sensorData.event_sensor1_duration; - over_threshold = TRUE; - APP_LOG(TS_OFF, VLEVEL_L, "\r\nSensor 1 Over Stay State=%d, Duration= %d Sec, Threshold =%u \r\n", + + APP_LOG(TS_OFF, VLEVEL_M, "\r\nSensor 1 Over Stay State=%d, Duration= %d Sec, Threshold =%u \r\n", sts_o7_sensorData.over_stay_state, (sts_o7_sensorData.over_stay_duration), (fhmos_cfg.th_occupancy_overstay_15sec*15)); - //(sts_occupancy_overtime_threshold_in_10min*60) ); + sts_lamp_bar_color = STS_OCCUPANCY_OVERSTAY_COLOR; - //sts_lamp_bar_flashing_color = 0x20; - //volatile uint8_t sts_lamp_bar_color = STS_GREEN; //puColor - //volatile uint8_t sts_lamp_bar_flashing_color = 0x23; // RED_BLUE; + APP_LOG(TS_OFF, VLEVEL_M, "\r\nSensor1 overstay set color to %d \r\n",sts_lamp_bar_color); + over_threshold |= 1<<1; } - } else { - sts_o7_sensorData.event_sensor1_duration =0; + } else { + fhmos_data.state_occupancy = STS_FHMOS_OCCUPANCY_NO_OCCUPY; + + sts_o7_sensorData.event_sensor1_duration =0; + over_threshold &= 1<<1; sts_o7_sensorData.over_stay_state = 0; fhmos_data.state_occupancy = STS_FHMOS_OCCUPANCY_NO_OCCUPY; + sts_lamp_bar_color = STS_VACANT_COLOR; + //APP_LOG(TS_OFF, VLEVEL_M, "\r\nSensor1 set VACANT color to %d \r\n",sts_lamp_bar_color); + } + + if (last_sensor1_state != fhmos_data.state_occupancy) + { + sts_sensor1_changed = TRUE; + last_sensor1_state = fhmos_data.state_occupancy; } // to be defined later for SOS threshold TODO XXXX @@ -2228,71 +2250,122 @@ void YunhornSTSDurationCheckTimer(void) //if (sts_o7_sensorData.event_sensor2_duration > sts_occupancy_overtime_threshold_in_10min*60) //for debug if (sts_o7_sensorData.event_sensor2_duration > fhmos_cfg.th_occupancy_overstay_15sec*15) { + sts_o7_sensorData.over_stay_state = 1; fhmos_data.state_sos_alarm = STS_FHMOS_SOS_ALARM_BUTTON_PUSHED; // 2024-07-15 update, no overwrite sensor1 duration value //sts_o7_sensorData.over_stay_duration = sts_o7_sensorData.event_sensor2_duration; // - over_threshold = TRUE; - } + over_threshold |= 1<<2; // to be defiend later for SOS threshold TODO XXXX - - } else { + } else + { sts_o7_sensorData.event_sensor2_duration =0; - fhmos_data.state_sos_alarm = STS_FHMOS_SOS_ALARM_BUTTON_RESET; // OR NORMAL TODO XXX - //sts_o7_sensorData.over_stay_state = 0; + fhmos_data.state_sos_alarm = STS_FHMOS_SOS_ALARM_BUTTON_NORMAL; // OR NORMAL TODO XXX + //sts_o7_sensorData.over_stay_state = 0; + over_threshold &= 1<<2; + } } - if (STS_FHMOS_FALL_STATE_POTENTIAL == fhmos_data.state_fall) + if (last_sensor2_state != fhmos_data.state_sos_alarm ) { - fhmos_data.head_low_level_duration = current_time.Seconds - fhmos_data.head_low_level_start_time; + sts_sensor2_changed = TRUE; + last_sensor2_state = fhmos_data.state_sos_alarm; + } - if (fhmos_data.head_low_level_duration > fhmos_cfg.th_motionless_long_15sec*15) + + if ((STS_Status_PIR_Motion_Ended == sts_pir_read)&&(sts_hall1_read ==STS_Status_Door_Close )) + { + sts_o7_sensorData.event_sensor3_no_movement_duration = current_time.Seconds - sts_o7_sensorData.event_sensor3_no_movement_start_time; + + //if (sts_o7_sensorData.event_sensor1_duration > sts_occupancy_overtime_threshold_in_10min*600) + //if (sts_o7_sensorData.event_sensor1_duration > (sts_occupancy_overtime_threshold_in_10min*60)) //for debug + if (sts_o7_sensorData.event_sensor3_no_movement_duration > fhmos_cfg.th_motionless_long_15sec*15) // th_occupancy_overstay_15sec*15) { fhmos_data.state_human_movement = STS_FHMOS_HUMAN_MOVEMENT_MOTIONLESS_LONG; - sts_o7_sensorData.over_stay_state = 1; - sts_o7_sensorData.over_stay_duration = sts_o7_sensorData.event_sensor1_duration; - over_threshold = TRUE; - APP_LOG(TS_OFF, VLEVEL_L, "\r\nSensor 1 Over Stay State=%d, Duration= %d Sec, Threshold =%u \r\n", - sts_o7_sensorData.over_stay_state, - (sts_o7_sensorData.over_stay_duration), - (fhmos_cfg.th_occupancy_overstay_15sec*15)); - //(sts_occupancy_overtime_threshold_in_10min*60) ); - sts_lamp_bar_color = STS_OCCUPANCY_OVERSTAY_COLOR; - //sts_lamp_bar_flashing_color = 0x20; - //volatile uint8_t sts_lamp_bar_color = STS_GREEN; //puColor - //volatile uint8_t sts_lamp_bar_flashing_color = 0x23; // RED_BLUE; + APP_LOG(TS_OFF, VLEVEL_M, "\r\nSensor 3 Human Movement =%d, Duration= %d Sec, Threshold =%u \r\n", + fhmos_data.state_human_movement, + sts_o7_sensorData.event_sensor3_no_movement_duration, + (fhmos_cfg.th_motionless_long_15sec*15)); + + + sts_lamp_bar_color = STS_HUMAN_MOVEMENT_MOTIONLESS_LONG_COLOR; + APP_LOG(TS_OFF, VLEVEL_M, "\r\nSensor PIR set MOTIONLESS LONG color to %d \r\n",sts_lamp_bar_color); + over_threshold |= 1<<3; + if (last_sensor3_state != fhmos_data.state_human_movement) + { + sts_sensor3_changed = TRUE; + last_sensor3_state = fhmos_data.state_human_movement; + } + + } else if ((sts_o7_sensorData.event_sensor3_no_movement_duration >= fhmos_cfg.th_motionless_short_15sec*15) && + (sts_o7_sensorData.event_sensor3_no_movement_duration < fhmos_cfg.th_motionless_long_15sec*15)) + { + fhmos_data.state_human_movement = STS_FHMOS_HUMAN_MOVEMENT_MOTIONLESS_SHORT; + + APP_LOG(TS_OFF, VLEVEL_M, "\r\nSensor 3 Human Movement =%d, Duration= %d Sec, Threshold =%u \r\n", + fhmos_data.state_human_movement, + sts_o7_sensorData.event_sensor3_no_movement_duration, + (fhmos_cfg.th_motionless_short_15sec*15)); + + APP_LOG(TS_OFF, VLEVEL_M, "\r\nSensor PIR set MOTIONLESS SHORT color to %d \r\n",sts_lamp_bar_color); + sts_lamp_bar_color = STS_HUMAN_MOVEMENT_MOTIONLESS_SHORT_COLOR; + over_threshold |= 1<<4; + } + + } else { + //sts_o7_sensorData.event_sensor1_duration =0; + + sts_o7_sensorData.event_sensor3_no_movement_duration = 0; + fhmos_data.state_human_movement = STS_FHMOS_HUMAN_MOVEMENT_NORMAL; + fhmos_data.color_human_movement =STS_HUMAN_MOVEMENT_MOTIONLESS_NORMAL; + //sts_lamp_bar_color = STS_HUMAN_MOVEMENT_MOTIONLESS_NORMAL; + over_threshold &= 1<<3; + over_threshold &= 1<<4; } - else if (sts_o7_sensorData.event_sensor3_duration > fhmos_cfg.th_motionless_short_15sec*15) + + if (last_sensor3_state != fhmos_data.state_human_movement) { - fhmos_data.state_human_movement = STS_FHMOS_HUMAN_MOVEMENT_MOTIONLESS_SHORT; - sts_o7_sensorData.over_stay_state = 1; - sts_o7_sensorData.over_stay_duration = sts_o7_sensorData.event_sensor1_duration; - over_threshold = TRUE; - APP_LOG(TS_OFF, VLEVEL_L, "\r\nSensor 1 Over Stay State=%d, Duration= %d Sec, Threshold =%u \r\n", - sts_o7_sensorData.over_stay_state, - (sts_o7_sensorData.over_stay_duration), - (fhmos_cfg.th_occupancy_overstay_15sec*15)); - - //(sts_occupancy_overtime_threshold_in_10min*60) ); - sts_lamp_bar_color = STS_OCCUPANCY_OVERSTAY_COLOR; - + sts_sensor3_changed = TRUE; + last_sensor3_state = fhmos_data.state_human_movement; } - if ((fhmos_fall == STS_FHMOS_FALL_STATE_POTENTIAL)||(fhmos_fall == STS_FHMOS_FALL_STATE_CONFIRMED)) - { - fhmos_data.state_fall = STS_FHMOS_FALL_STATE_POTENTIAL; + //if (fhmos_data.state_fall > STS_FHMOS_FALL_STATE_NORMAL) // either STS_FHMOS_FALL_STATE_POTENTIAL or STS_FHMOS_FALL_STATE_CONFIRMED + if (sts_head_level_low) + { // counter start + fhmos_data.head_low_level_duration = current_time.Seconds - fhmos_data.head_low_level_start_time; + if (fhmos_data.head_low_level_duration >= fhmos_cfg.th_motionless_long_15sec*15) + { + uint32_t time_stamp=STS_Get_Date_Time_Stamp(); //uint8_t datetimestamp[8]={0}; + fhmos_data.state_fall = STS_FHMOS_FALL_STATE_CONFIRMED; + fhmos_data.time_stamp_fall_confirmed = time_stamp; + sts_lamp_bar_color = STS_FALL_CONFIRMED_COLOR; + APP_LOG(TS_OFF, VLEVEL_M, "\r\nSensor L8 set FALL CONFIRM color to %d \r\n",sts_lamp_bar_color); + over_threshold |= 1<<5; + APP_LOG(TS_OFF, VLEVEL_M, "\r\nGenerate Fall Gesture Map\r\n"); + sts_generate_fall_gesture_map(); + } else if ((fhmos_data.head_low_level_duration >= fhmos_cfg.th_motionless_short_15sec*15) && + (fhmos_data.head_low_level_duration < fhmos_cfg.th_motionless_long_15sec*15)) + { + // stay this state until > long threshold + fhmos_data.state_fall = STS_FHMOS_FALL_STATE_POTENTIAL; + APP_LOG(TS_OFF, VLEVEL_M, "\r\nSensor L8 set FALL POTENTIAL color to %d \r\n",sts_lamp_bar_color); + sts_lamp_bar_color = STS_FALL_SUSPICIOUS_COLOR; + over_threshold |= 1<<6; + } + } else { + over_threshold &= 1<<5; + over_threshold &= 1<<6; } - #ifdef RSS_MOTION if (sts_rss_result==STS_RESULT_MOTION) { @@ -2317,7 +2390,7 @@ void YunhornSTSDurationCheckTimer(void) STS_PRESENCE_UNCONSCIOUS, STS_PRESENCE_STAYSTILL */ - uint32_t time_stamp=STS_Get_Date_Time_Stamp(); //uint8_t datetimestamp[8]={0}; + //uint32_t time_stamp=STS_Get_Date_Time_Stamp(); //uint8_t datetimestamp[8]={0}; //(&time_stamp, datetimestamp); #ifdef RSS_MOTION switch (sts_fall_rising_detected_result){ @@ -2338,6 +2411,7 @@ void YunhornSTSDurationCheckTimer(void) sts_o7_sensorData.fall_state = sts_fall_rising_detected_result; sts_o7_sensorData.fall_laydown_duration =sts_o7_sensorData.event_sensor3_fall_duration; over_threshold = TRUE; + } else { // still laydown, but not over fall down confirmation threshold sts_o7_sensorData.fall_state = STS_PRESENCE_LAYDOWN; sts_o7_sensorData.fall_laydown_duration =sts_o7_sensorData.event_sensor3_fall_duration; @@ -2377,24 +2451,20 @@ void YunhornSTSDurationCheckTimer(void) sts_o7_sensorData.event_sensor3_event_duration = sensor_event_time.Seconds - sts_o7_sensorData.event_sensor4_start_time; #endif - if (over_threshold == TRUE) + //fhmos_data.state_occupancy = STS_FHMOS_OCCUPANCY_OVERSTAY; + + + + sts_cmb_result = sts_sensor1_changed ||sts_sensor2_changed||sts_sensor3_changed||sts_sensor4_changed; + + if ((over_threshold) && (last_sts_cmb_result != sts_cmb_result)) { - - if (sts_o7_sensorData.fall_state == STS_PRESENCE_LAYDOWN) - { - sts_status_color = sts_lamp_bar_flashing_color; //STS_RED_BLUE; - sts_lamp_bar_color = sts_lamp_bar_flashing_color; //STS_RED_BLUE; - } else { - sts_status_color = STS_RED_DARK; - sts_lamp_bar_color = STS_RED_DARK; //sts_lamp_bar_flashing_color; - } - - fhmos_data.state_occupancy = STS_FHMOS_OCCUPANCY_OVERSTAY; - - sensor_data_ready = 1; + APP_LOG(TS_OFF, VLEVEL_M, "\r\n Over Threshold =%02x \r\n", over_threshold); + last_sts_cmb_result = sts_cmb_result; UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); - over_threshold = FALSE; } + + } void OnSensorRange1StateChanged(void) @@ -2421,6 +2491,8 @@ void OnSensor1StateChanged(void) SysTime_t sensor_event_time = SysTimeGetMcuTime(); if (sts_hall1_read == STS_Status_Door_Close) { + APP_LOG(TS_OFF, VLEVEL_M, "\r\n Door Closed \r\n"); + sts_o7_sensorData.event_sensor1_start_time = sensor_event_time.Seconds; sts_o7_sensorData.event_sensor1_duration = 0; //APP_LOG(TS_OFF, VLEVEL_M, "Door Closed ---Timer start: %u\r\n",sts_o7_sensorData.event_sensor1_start_time ); @@ -2429,8 +2501,14 @@ void OnSensor1StateChanged(void) fhmos_data.state_human_movement = STS_FHMOS_HUMAN_MOVEMENT_NORMAL; } else if (sts_hall1_read==STS_Status_Door_Open) { + APP_LOG(TS_OFF, VLEVEL_M, "\r\n Door Opened \r\n"); sts_o7_sensorData.event_sensor1_start_time = 0; sts_o7_sensorData.event_sensor1_stop_time = sensor_event_time.Seconds; + + sts_o7_sensorData.event_sensor3_motion_start_time = 0; + sts_o7_sensorData.event_sensor3_motion_stop_time =0; + sts_o7_sensorData.event_sensor3_no_movement_start_time =0; + //sts_o7_sensorData.event_sensor1_duration = 0; sts_o7_sensorData.over_stay_state = 0; fhmos_data.state_occupancy = STS_FHMOS_OCCUPANCY_NO_OCCUPY; @@ -2449,6 +2527,7 @@ void OnSensor2StateChanged(void) if (sts_hall2_read==STS_Status_SOS_Pushdown) { + APP_LOG(TS_OFF, VLEVEL_M, "\r\n SOS Button Pushed Down \r\n"); sts_o7_sensorData.event_sensor2_start_time = sensor_event_time.Seconds; sts_o7_sensorData.event_sensor2_start_timestamp = time_stamp; sts_o7_sensorData.event_sensor2_stop_time = 0; @@ -2459,6 +2538,7 @@ void OnSensor2StateChanged(void) }else if (sts_hall2_read==STS_Status_SOS_Release) { + APP_LOG(TS_OFF, VLEVEL_M, "\r\n SOS Button Released \r\n"); sts_o7_sensorData.event_sensor2_start_time = 0; sts_o7_sensorData.event_sensor2_start_timestamp = 0; sts_o7_sensorData.event_sensor2_stop_time = sensor_event_time.Seconds; @@ -2621,16 +2701,19 @@ void OnSensorPIR1StateChanged(void) } #endif - if (sts_pir_result == STS_RESULT_MOTION) + if (sts_pir_read == STS_RESULT_MOTION) { + APP_LOG(TS_OFF, VLEVEL_M, "\r\n Motion Human Movement Detected\r\n"); sts_o7_sensorData.event_sensor3_motion_start_time = sensor_event_time.Seconds; sts_o7_sensorData.event_sensor3_motion_duration = 0; - fhmos_data.state_PIR = STS_FHMOS_HUMAN_MOVEMENT_NORMAL; - } else if (sts_pir_result == STS_RESULT_NO_MOTION) + //fhmos_data.state_PIR = STS_FHMOS_HUMAN_MOVEMENT_NORMAL; + } else if (sts_pir_read == STS_RESULT_NO_MOTION) { + APP_LOG(TS_OFF, VLEVEL_M, "\r\n Motionless, Human Movement Ended\r\n"); sts_o7_sensorData.event_sensor3_motion_stop_time = sensor_event_time.Seconds; + sts_o7_sensorData.event_sensor3_no_movement_start_time = sensor_event_time.Seconds; //sts_o7_sensorData.event_sensor3_motion_duration = 0; - fhmos_data.state_PIR = STS_FHMOS_HUMAN_MOVEMENT_MOTIONLESS_SHORT; + //fhmos_data.state_PIR = STS_FHMOS_HUMAN_MOVEMENT_MOTIONLESS_SHORT; } @@ -2705,10 +2788,31 @@ void OnSensor4StateChanged(void) void OnSensorL8AStateChanged(void) { - sensor_event_time = SysTimeGetMcuTime(); + //sensor_event_time = SysTimeGetMcuTime(); + APP_LOG(TS_OFF, VLEVEL_M, "\r\n L8A \r\n"); } +void OnSensorL8BStateChanged(void) +{ + //sensor_event_time = SysTimeGetMcuTime(); + APP_LOG(TS_OFF, VLEVEL_M, "\r\n L8B \r\n"); + printf("\r\n L8B \r\n"); +} + + +void OnSensorL8CStateChanged(void) +{ + //sensor_event_time = SysTimeGetMcuTime(); + APP_LOG(TS_OFF, VLEVEL_M, "\r\n L8C \r\n"); +} + +void OnSensorL8DStateChanged(void) +{ + //sensor_event_time = SysTimeGetMcuTime(); + APP_LOG(TS_OFF, VLEVEL_M, "\r\n L8D \r\n"); +} + void STS_Combined_Status_Processing(void) { //printf("\r\n ********* combined process %d \r\n", sts_work_mode); @@ -2826,22 +2930,35 @@ void STS_Combined_Status_Processing(void) break; case STS_TOF_LMZ_RSS_MODE: // FOR STS-L8 - if ((sts_reed_hall_1_result == STS_Status_Door_Open )&& (sts_reed_hall_2_result == STS_Status_SOS_Release ) - && (sts_fhmos_result == STS_FHMOS_FALL_STATE_NO_OCCUPY)) + //if ((sts_reed_hall_1_result == STS_Status_Door_Open )&& (sts_reed_hall_2_result == STS_Status_SOS_Release )) + if ((sts_hall1_read == STS_Status_Door_Open) && (sts_hall2_read == STS_Status_SOS_Release)) { sts_status_color = STS_VACANT_COLOR; - //printf("\r\n ********* combined process Vacant color = %d \r\n", sts_status_color); + printf("\r\n ********* --1--- combined process Vacant color = 0x%02x \r\n", sts_status_color); - } else if ((sts_reed_hall_1_result == STS_Status_Door_Close )|| (sts_reed_hall_2_result == STS_Status_SOS_Pushdown )) + //} else if ((sts_reed_hall_1_result == STS_Status_Door_Close )|| (sts_reed_hall_2_result == STS_Status_SOS_Pushdown )) //|| (sts_fhmos_result != STS_FHMOS_FALL_STATE_NO_OCCUPY)) + } else if ((sts_hall1_read == STS_Status_Door_Close )|| (sts_hall2_read == STS_Status_SOS_Pushdown )) { sts_status_color = STS_OCCUPY_COLOR; - //printf("\r\n ********* combined process Occupy color = %d \r\n", sts_status_color); + //printf("\r\n ********* --2-- combined Occupy color = %d \r\n", sts_status_color); - if (sts_reed_hall_2_result == STS_Status_SOS_Pushdown ) + if (sts_hall2_read == STS_Status_SOS_Pushdown ) { sts_status_color = STS_RED_BLUE; } + if (fhmos_data.state_occupancy == STS_FHMOS_OCCUPANCY_OVERSTAY) + { + sts_status_color = STS_OCCUPANCY_OVERSTAY_COLOR; + } +#if 0 + if (fhmos_data.color_fall > STS_OCCUPY_COLOR) + { + //printf("\r\n fhmos-data-color-fall =%d \r\n", fhmos_data.color_fall); + sts_status_color = fhmos_data.color_fall; + printf("\r\n FHMOS DATA sts-status-color =%d \r\n", sts_status_color); + } + if ((sts_fhmos_result == STS_FHMOS_FALL_STATE_POTENTIAL) || (sts_fhmos_result == STS_FHMOS_HUMAN_MOVEMENT_MOTIONLESS_SHORT)) { sts_status_color = STS_YELLOW; @@ -2850,8 +2967,10 @@ void STS_Combined_Status_Processing(void) { sts_status_color = STS_RED; } +#endif //printf("\r\n ********* combined process finished status color = %d \r\n", sts_status_color); sts_lamp_bar_color = sts_status_color; + printf("\r\n COMBINED: sts-lamp_bar-color =0x%02x \r\n", sts_lamp_bar_color); } diff --git a/STS/TOF/App/app_tof.c b/STS/TOF/App/app_tof.c index d416ee9..e6ce702 100644 --- a/STS/TOF/App/app_tof.c +++ b/STS/TOF/App/app_tof.c @@ -39,9 +39,9 @@ extern "C" { volatile uint8_t fhmos_fall=0, fhmos_human_movement=0, fhmos_occupancy=0, fhmos_sos_alarm=0; volatile uint32_t fhmos_fall_counter=0; volatile uint32_t sts_low_threshold=1500, sts_high_threshold=2800, sts_occupancy_threshold=2300; - +extern volatile uint8_t sts_head_level_low; volatile sts_fhmos_sensor_data_t fhmos={0x0}; -volatile sts_fhmos_sensor_config_t fhmos_cfg; +volatile sts_fhmos_sensor_config_t fhmos_cfg={70,4,8,8,20,100,50,0}; volatile sts_fhmos_sensor_ambient_height_t fhmos_bg={0x0}, fhmos_gesture={0x0}; volatile sts_fhmos_sensor_data_t fhmos_data; extern volatile uint8_t sts_fhmos_result; @@ -50,7 +50,7 @@ extern volatile uint16_t sts_sensor_install_height; //in mm extern volatile uint8_t sts_lamp_bar_color; extern volatile uint8_t sts_status_color; extern volatile uint8_t sts_hall1_read,sts_hall2_read; // Above hall1_read == reed_hall_result, hall2_read == emergency_button -extern volatile uint8_t sts_pir_result; +extern volatile uint8_t sts_pir_read; extern volatile uint8_t sts_fhmos_state_changed; extern volatile uint8_t sts_fhmos_bitmap_pending; #endif @@ -213,7 +213,7 @@ void STS_LMZ_Ambient_Height_Scan_Process(void) } sts_mask_bitmap[(uint8_t)(i/8)] |= (fhmos_bg.maskoff[i])<<(7-i%8); if (i%8==0) printf("\r\n"); - printf("|%4d %4d ", range_distance, fhmos_bg.h2cm[i]); + printf("|%4ld %4d ", range_distance, fhmos_bg.h2cm[i]); } else { @@ -267,7 +267,7 @@ void sts_generate_fall_gesture_map(void) // debug if (i%8==0) printf("\r\n"); - printf("|%4d %4d ", range_distance, fhmos_gesture.h2cm[i]); + printf("|%4ld %4d ", range_distance, fhmos_gesture.h2cm[i]); } else { fhmos_gesture.h2cm[i] += 0; @@ -286,6 +286,8 @@ void sts_generate_fall_gesture_map(void) printf("%02X\r\n",fhmos_gesture_bitmap[i]); #endif + sts_fhmos_bitmap_pending = 1; + printf("\r\n Fall Gesture bitmap Generated\r\n"); } uint16_t MX_TOF_Ranging_Process(void) { @@ -374,15 +376,19 @@ void STS_TOF_L8_Process(void) if (ToF_EventDetected != 0) { ToF_EventDetected = 0; - - status = VL53L8A1_RANGING_SENSOR_GetDistance(VL53L8A1_DEV_CENTER, &Result); - //printf("\r\n status =%d \r\n", status); - if (status == BSP_ERROR_NONE) +#if 1 + if (sts_hall1_read != STS_Status_Door_Open) { - print_result(&Result); - } else { - printf("\r\n x \r\n"); + status = VL53L8A1_RANGING_SENSOR_GetDistance(VL53L8A1_DEV_CENTER, &Result); + //printf("\r\n status =%d \r\n", status); + if (status == BSP_ERROR_NONE) + { + print_result(&Result); + } else { + printf("\r\n x \r\n"); + } } +#endif } } } @@ -508,18 +514,18 @@ static void print_result(RANGING_SENSOR_Result_t *Result) { int8_t i; int8_t j; - int8_t k; - int8_t l; - uint8_t zones_per_line; - static uint8_t prev_occupy_state=0; + //int8_t k; + //int8_t l; + //uint8_t zones_per_line; + //static uint8_t prev_occupy_state=0; uint32_t center_range_distance=0; uint8_t center_roi[4] = {27,28,35,36}; static uint32_t prev_distance[64]={0}; uint32_t motion_diff=0, motion_power=0; - uint32_t motion_power_threshold = 3200; // 64*50mm + //uint32_t motion_power_threshold = 3200; // 64*50mm - SysTime_t sensor_event_time = SysTimeGetMcuTime(); - uint32_t time_stamp=STS_Get_Date_Time_Stamp(); + //SysTime_t sensor_event_time = SysTimeGetMcuTime(); + // uint32_t time_stamp=STS_Get_Date_Time_Stamp(); //printf("\r\n Motion level Calculation \r\n"); @@ -543,9 +549,10 @@ static void print_result(RANGING_SENSOR_Result_t *Result) #if 0 printf("\r\n Motion Power =%d Average=%d Human Movement =%d, th=%d \r\n", motion_power*64, motion_power, fhmos_human_movement, fhmos_cfg.th_motion_power_level); #endif +#if 0 zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) || (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4; - +#endif //printf("%c[2H", 27); /* clear screen */ for (i=0; i<4; i++) { @@ -557,255 +564,41 @@ static void print_result(RANGING_SENSOR_Result_t *Result) //int32_t roi_distance =(uint32_t)(Result->ZoneResult[j + k].Distance[l]); int32_t roi_distance =(uint32_t)center_range_distance/4; - + uint32_t factor1 = sts_sensor_install_height; + uint32_t factor2 = (sts_high_threshold - 10*fhmos_cfg.th_head_level_height_cm); /* state tree */ + //printf("\r\n th_head_level_cm=%d, factor2=high_th:%d - mm:%d\r\n", fhmos_cfg.th_head_level_height_cm, sts_high_threshold, factor2); + //printf("\r\n roi_D < Facot1 =%d , D (sts_high_threshold - fhmos_cfg.th_head_level_height_cm*10))) // TODO XXX + //if ((roi_distance < sts_sensor_install_height)&&(roi_distance < (sts_high_threshold - fhmos_cfg.th_head_level_height_cm*10))) // TODO XXX + if ((roi_distance < factor1)&& (roi_distance > factor2)) { - printf("\r\nThreshold: low =%d occupy=%d head level=%d high=%d\r\n", sts_low_threshold, sts_occupancy_threshold, fhmos_cfg.th_head_level_height_cm*10, sts_high_threshold); - printf("\r\n YELLOW OR RED Distance=%d \r\n", roi_distance); - fhmos_data.state_fall = STS_FHMOS_FALL_STATE_NORMAL; - fhmos_data.state_human_movement = STS_FHMOS_HUMAN_MOVEMENT_NORMAL; - fhmos_data.status_color = STS_OCCUPY_COLOR; // HOLD THIS COLOR BEFORE ENTER YELLOW STATUS - + //printf("\r\nThreshold: low =%d occupy=%d head level=%d high=%d\r\n", sts_low_threshold, sts_occupancy_threshold, fhmos_cfg.th_head_level_height_cm*10, sts_high_threshold); + printf("\r\n YELLOW OR RED Distance=%ld \r\n", roi_distance); + sts_head_level_low = TRUE; +#if 0 + fhmos_data.state_fall = STS_FHMOS_FALL_STATE_POTENTIAL; + fhmos_data.color_fall = STS_FALL_SUSPICIOUS_COLOR; + printf("\r\n State Fall =%d \r\n", fhmos_data.state_fall); +#endif OnSensorL8AStateChanged(); - fhmos_fall_counter ++; // TODO XXX Timer for confirmation - if ((fhmos_fall_counter >= 30*fhmos_cfg.th_fall_duration_potential_15sec)&& (fhmos_fall_counter < 30*fhmos_cfg.th_fall_duration_confirm_15sec)) - { -#if 0 - printf("\r\n [YELLOW **] Suspicious Fall: distance=%d [high - head level=[%d]] <= distance <= [high-100 =%d] \r\n", - roi_distance, (sts_high_threshold - 10*fhmos_cfg.th_head_level_height_cm), (sts_high_threshold - 100)); - printf("\r\n duration =%d sec, threshold=%d sec\r\n", fhmos_fall_counter, 15*fhmos_cfg.th_fall_duration_potential_15sec); - printf("\r\n Fall state --- Yellow \r\n"); -#endif + sts_fhmos_state_changed |=1; + } else if ((roi_distance < factor2)) // TODO XXX + { - OnSensorL8BStateChanged(); - - fhmos_fall =2; - fhmos_data.state_fall = STS_FHMOS_FALL_STATE_POTENTIAL; - fhmos_data.status_color = STS_FALL_SUSPICIOUS_COLOR; - fhmos_data.state_changed_fall = true; - - sts_fhmos_state_changed |=1; - - } else if (fhmos_fall_counter >= 30*fhmos_cfg.th_fall_duration_confirm_15sec) - { -#if 0 - printf("\r\n [RED **] Configmed Fall: distance=%d [high - head level=[%d]] <= distance <= [high-100 =%d] \r\n", - roi_distance, (sts_high_threshold - 10*fhmos_cfg.th_head_level_height_cm), (sts_high_threshold - 100)); - printf("\r\n duration =%d sec, threshold=%d sec\r\n", fhmos_fall_counter, 15*fhmos_cfg.th_fall_duration_confirm_15sec); - printf("\r\n Fall state --- Red \r\n"); - printf("\r\n [RED ***] Confirmed Fall state: roi_distance =%d -----[high=%4d mm Head Level =%d mm\r\n", roi_distance, sts_high_threshold, 10*fhmos_cfg.th_head_level_height_cm); -#endif - - OnSensorL8CStateChanged(); - - fhmos_fall =3; - fhmos_data.state_fall = STS_FHMOS_FALL_STATE_CONFIRMED; - fhmos_data.status_color = STS_FALL_CONFIRMED_COLOR; - fhmos_data.state_changed_fall = true; - sts_fhmos_state_changed |=1; - sts_generate_fall_gesture_map(); - sts_fhmos_bitmap_pending = 1; - } + fhmos_data.state_fall = STS_FHMOS_FALL_STATE_NORMAL; + //fhmos_data.color_fall = STS_FALL_NORMAL_COLOR; // HOLD THIS COLOR BEFORE ENTER YELLOW STATUS + printf("\r\n NORMAL NO FALL Distance=%4d COLOR =%d \r\n", roi_distance, fhmos_data.color_fall); + OnSensorL8BStateChanged(); } - else if ((roi_distance > sts_low_threshold)&&(roi_distance < sts_occupancy_threshold)) - { - fhmos_fall_counter = 0; - fhmos_fall = 0; - fhmos_human_movement = 1; - OnSensorL8DStateChanged(); -#if 0 - printf("\r\nThreshold: low =%d occupy=%d head level=%d high=%d\r\n", sts_low_threshold, sts_occupancy_threshold, fhmos_cfg.th_head_level_height_cm*10, sts_high_threshold); - printf("\r\n [GREEN ** ]Normal Occupy state: rio distance =%d, low =%d occupy=%d head level=%d high=%d\r\n", roi_distance, sts_low_threshold, sts_occupancy_threshold, fhmos_cfg.th_head_level_height_cm*10, sts_high_threshold); -#endif - //fhmos_occupancy = STS_FHMOS_OCCUPANCY_NORMAL; - fhmos_data.state_occupancy = STS_FHMOS_OCCUPANCY_NORMAL; - fhmos_data.state_human_movement = STS_FHMOS_HUMAN_MOVEMENT_NORMAL; - fhmos_data.state_changed_human_movemen = true; - if (fhmos_data.prev_occupancy != fhmos_data.state_occupancy) - { - fhmos_data.status_color = STS_OCCUPY_COLOR; - sts_fhmos_state_changed |=1; + //sts_fhmos_result = 1; - } - - }else - { -#if 0 - printf("\r\nThreshold: low =%d occupy=%d head level=%d high=%d\r\n", sts_low_threshold, sts_occupancy_threshold, fhmos_cfg.th_head_level_height_cm*10, sts_high_threshold); - printf("\r\n [BLUE *] No occupy status , distance=%d \r\n", roi_distance); -#endif - fhmos_data.state_occupancy = STS_FHMOS_OCCUPANCY_NO_OCCUPY; - fhmos_fall_counter =0; - fhmos_data.state_human_movement = fhmos_human_movement | STS_FHMOS_HUMAN_MOVEMENT_NO_OCCUPY; - fhmos_data.state_fall = STS_FHMOS_FALL_STATE_NO_OCCUPY; - - if (fhmos_data.prev_occupancy != fhmos_data.state_occupancy) - { - fhmos_data.status_color = STS_VACANT_COLOR; - sts_fhmos_state_changed |=1; - } - } - - fhmos_data.prev_occupancy = fhmos_data.state_occupancy; + //STS_Combined_Status_Processing(); - sts_fhmos_result = fhmos_data.state_changed_fall||fhmos_data.state_changed_human_movemen||fhmos_data.state_changed_occupancy; - - if (fhmos_data.status_color != fhmos_data.prev_status_color) - { - fhmos_data.prev_status_color = fhmos_data.status_color; - sts_lamp_bar_color = fhmos_data.status_color; - sts_status_color = sts_lamp_bar_color; - sts_fhmos_result = 1; - STS_Combined_Status_Processing(); - } - -#if 0 - printf("53L8A1 Threshold Detection demo application\n\r"); - printf("-------------------------------------------\n\r"); - printf("-------- Low= %4d High= %4d ------------\n\r", LOW_THRESHOLD, HIGH_THRESHOLD); - printf("Cell Format :"); -#endif - //printf(" \033[38;5;10m%20s\033[0m : %20s\n", "Distance [mm]", "Status\r"); -#if 0 - for (l = 0; l < RANGING_SENSOR_NB_TARGET_PER_ZONE; l++) - { - if ((Profile.EnableAmbient != 0) || (Profile.EnableSignal != 0)) - { - printf(" %20s : %20s\n", "Signal [kcps/spad]", "Ambient [kcps/spad]\r"); - } - } - - printf("\n\n"); -#endif - -#if 0 - for (j = 0; j < Result->NumberOfZones; j += zones_per_line) - { -#if 0 - for (i = 0; i < zones_per_line; i++) /* number of zones per line */ - { - printf(" -----------------"); - } - printf("\n"); - - for (i = 0; i < zones_per_line; i++) - { - printf("| "); - } - printf("|\n"); -#endif - for (l = 0; l < RANGING_SENSOR_NB_TARGET_PER_ZONE; l++) - { -#if 0 - /* Print distance and status */ - for (k = (zones_per_line - 1); k >= 0; k--) - { - if (Result->ZoneResult[j + k].NumberOfTargets > 0) - { uint16_t distance_i = (long)Result->ZoneResult[j + k].Distance[l]; - if ((distance_i >sts_low_threshold)&&(distance_i ZoneResult[j + k].Status[l]); - else printf("| %5s : %5s ", " ", " "); - } - else - printf("| %5s : %5s ", " ", " "); - } - printf("\n"); -#endif - /* ---- origin - printf("| \033[38;5;10m%5ld\033[0m :%2d%5ld ", - (long)Result->ZoneResult[j + k].Distance[l],(j+k), - (long)Result->ZoneResult[j + k].Status[l]); - */ - int32_t roi_distance =(uint32_t)(Result->ZoneResult[j + k].Distance[l]); - /* state tree */ - if ((roi_distance > sts_low_threshold)&&(roi_distance < sts_occupancy_threshold)) - { - //fhmos_occupancy = 1; - sts_fhmos_data.occupancy_state = 1; - sts_lamp_bar_color = STS_RED; - } else { - sts_fhmos_data.occupancy_state = 0; - sts_lamp_bar_color = STS_GREEN; - - } - if ((roi_distance < sts_high_threshold) && (roi_distance > (sts_high_threshold - sts_fhmos_cfg.sts_head_level_height_threshold_cm*10))) // TODO XXX - { - sts_fhmos_data.fall_state = 1; - sts_fhmos_data.human_movement_state = 1; - - fhmos_fall = 1; - fhmos_human_movement = 1; - fhmos_fall_counter ++; // TODO XXX Timer for confirmation - if (fhmos_fall_counter++>60) - fhmos_fall =2; - if (fhmos_fall_counter > 200) - fhmos_fall =3; - sts_lamp_bar_color = STS_YELLOW; - } - - - -#if 0 - - int16_t roi_low = (roi_distance - sts_low_threshold)/10; - int16_t roi_high = (sts_high_threshold - roi_distance)/10; - - if ((roi_low> 0)&&(roi_high>0)) - { - //printf("| \033[38;5;10m%5ld\033[0m :%2d%5ld ", (uint32_t)(roi_distance-LOW_THRESHOLD), (j+k), (uint32_t)Result->ZoneResult[j + k].Status[l]); - printf("| \033[38;5;10m%5d\033[0m : ", (uint16_t)roi_low); - } - else if ((roi_low< 0)|| (roi_high<0)) - { - //printf("| \033[38;5;10m%5s\033[0m :%2d%5ld ", ".",(j+k), (uint32_t)Result->ZoneResult[j + k].Status[l]); - printf("| \033[38;5;10m%5s\033[0m : ", "."); - } -#endif - -#if 0 - if ((Profile.EnableAmbient != 0) || (Profile.EnableSignal != 0)) - { - /* Print Signal and Ambient */ - for (k = (zones_per_line - 1); k >= 0; k--) - { - if (Result->ZoneResult[j + k].NumberOfTargets > 0) - { - if (Profile.EnableSignal != 0) - { - printf("| %5ld : ", (long)Result->ZoneResult[j + k].Signal[l]); - } - else - printf("| %5s : ", "X"); - - if (Profile.EnableAmbient != 0) - { - printf("%5ld ", (long)Result->ZoneResult[j + k].Ambient[l]); - } - else - printf("%5s ", "X"); - } - else - printf("| %5s : %5s ", "X", "X"); - } - printf("|\n"); - } -#endif - } - } -#endif -#if 0 - for (i = 0; i < zones_per_line; i++) - { - printf(" -----------------"); - } - printf("\n"); -#endif } @@ -853,7 +646,8 @@ void STS_FHMOS_sensor_read(sts_fhmos_sensor_data_t *sts_data) sts_data->lamp_bar_color = sts_lamp_bar_color; sts_data->state_hall_1 = sts_hall1_read; sts_data->state_hall_2 = sts_hall2_read; - sts_data->state_PIR = sts_pir_result;; + sts_data->state_PIR = sts_pir_read;; + //sts_data->state_PIR = fhmos_data.state_PIR; }