From 51ac8859e443672590c522900033f87791af853f Mon Sep 17 00:00:00 2001 From: YunHorn Technology Date: Thu, 28 Nov 2024 07:21:42 +0800 Subject: [PATCH] workable L8 --- Core/Src/sts_lamp_bar.c | 6 +- LoRaWAN/App/lora_app.c | 36 +++++----- STM32CubeIDE/Release/WLE5CC_NODE_STS.elf | Bin 277436 -> 277316 bytes STS/Core/Src/yunhorn_sts_process.c | 86 ++++++++++++++++++----- STS/TOF/App/app_tof.c | 61 ++++++++++------ 5 files changed, 133 insertions(+), 56 deletions(-) diff --git a/Core/Src/sts_lamp_bar.c b/Core/Src/sts_lamp_bar.c index 3d9ddeb..4947660 100644 --- a/Core/Src/sts_lamp_bar.c +++ b/Core/Src/sts_lamp_bar.c @@ -231,11 +231,11 @@ void STS_Lamp_Bar_Self_Test(void) { uint8_t color=0, lum_level=DEFAULT_LUMINANCE_LEVEL; - APP_LOG(TS_OFF, VLEVEL_M, "\r\n YunHorn STS Indicative Lamp Self Test\r\n"); + //APP_LOG(TS_OFF, VLEVEL_M, "\r\n YunHorn STS Indicative Lamp Self Test\r\n"); //STS_Lamp_Bar_Self_Test_Simple(); - APP_LOG(TS_OFF, VLEVEL_M, "\r\n [#2] Scoller Testing\r\n"); + //APP_LOG(TS_OFF, VLEVEL_M, "\r\n [#2] Scoller Testing\r\n"); lum_level=50; for (color = STS_GREEN; color < STS_COLOR_MAX; color++) { @@ -243,7 +243,7 @@ void STS_Lamp_Bar_Self_Test(void) } - APP_LOG(TS_OFF, VLEVEL_M, "\r\n [##] YunHorn STS Indicative Lamp Self Test Finished\r\n"); + //APP_LOG(TS_OFF, VLEVEL_M, "\r\n [##] YunHorn STS Indicative Lamp Self Test Finished\r\n"); if ((sts_work_mode == STS_WIRED_MODE) ) { STS_Lamp_Bar_Set_Dark(); diff --git a/LoRaWAN/App/lora_app.c b/LoRaWAN/App/lora_app.c index 05f2076..0a5f6f3 100644 --- a/LoRaWAN/App/lora_app.c +++ b/LoRaWAN/App/lora_app.c @@ -606,11 +606,13 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { case BUT1_Pin: /* Note: when "EventType == TX_ON_TIMER" this GPIO is not initialized */ - HAL_Delay(100); - __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); + + + HAL_Delay(150); + __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); sts_hall1_read = HALL1_STATE; - printf("\r\n HALL 1 state =%d \r\n", sts_hall1_read); + //printf("\r\n HALL 1 state =%d \r\n", sts_hall1_read); // 1) record event start/stop time OnSensor1StateChanged(); @@ -621,7 +623,7 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) sts_lamp_bar_color = STS_OCCUPY_COLOR; //prev_color = sts_lamp_bar_color; sts_status_color = STS_OCCUPY_COLOR; - printf("\r\n Door Closed sts status color =%d", sts_status_color); + //printf("\r\n Door Closed sts status color =%d", sts_status_color); } else { @@ -629,10 +631,10 @@ 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 Door Open: sts status color =%d", sts_status_color); } - printf("\r\n sts status color =0x%02x \r\n", sts_status_color); + //printf("\r\n sts status color =0x%02x \r\n", sts_status_color); // 3) combine states and colors STS_YunhornSTSEventP1_Process(); @@ -640,11 +642,11 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) // 4) upload state change messages //if (EventType == TX_ON_EVENT) - //if (sts_hall1_read == STS_Status_Door_Close) + if (sts_hall1_read == STS_Status_Door_Close) { fhmos_occupancy = 1; - UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); } + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); last_sts_hall1_read = sts_hall1_read; break; @@ -655,7 +657,7 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); sts_hall2_read = HALL2_STATE; - printf("\r\n HALL 2 state =%d \r\n", sts_hall2_read); + //printf("\r\n HALL 2 state =%d \r\n", sts_hall2_read); // 1) record event start/stop time OnSensor2StateChanged(); // 2) change lamp bar color @@ -664,13 +666,14 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { sts_lamp_bar_color = STS_SOS_COLOR; sts_status_color = STS_SOS_COLOR; + fhmos_sos_alarm = 1; } - printf("\r\n lamp bar color =0x%02x \r\n", sts_lamp_bar_color); + //printf("\r\n lamp bar color =0x%02x \r\n", sts_lamp_bar_color); if (sts_hall2_read ==STS_Status_SOS_Release) { sts_lamp_bar_color = STS_VACANT_COLOR; sts_status_color = STS_VACANT_COLOR; - fhmos_sos_alarm = 1; + fhmos_sos_alarm = 0; UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); } last_sts_hall2_read = sts_hall2_read; @@ -679,11 +682,12 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) STS_YunhornSTSEventP1_Process(); // 4) upload state change messages - //if (sts_hall2_read == STS_Status_SOS_Release) + if (sts_hall2_read == STS_Status_SOS_Release) { - fhmos_occupancy = 0; - UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); + fhmos_sos_alarm = 0; + } + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); last_sts_hall1_read = sts_hall1_read; @@ -1043,7 +1047,7 @@ static void SendTxData(void) AppData.Buffer[i++] = (uint8_t) sts_hardware_ver; AppData.Buffer[i++] = (uint8_t) 99*batteryLevel/254; -#if 1 +#if 0 APP_LOG(TS_ON, VLEVEL_M, "VDDA: %d\r\n", batteryLevel); APP_LOG(TS_ON, VLEVEL_M, "temp: %d\r\n", (int16_t)(sensor_data.temperature)); @@ -1173,7 +1177,7 @@ static void SendTxData(void) #if defined(L8) //AppData.Buffer[i++] = 4; - AppData.Buffer[i++] = 14; + AppData.Buffer[i++] = 8; AppData.Buffer[i++] = fhmos_data.state_fall; AppData.Buffer[i++] = fhmos_data.state_human_movement; AppData.Buffer[i++] = fhmos_data.state_occupancy; diff --git a/STM32CubeIDE/Release/WLE5CC_NODE_STS.elf b/STM32CubeIDE/Release/WLE5CC_NODE_STS.elf index 0dfebb8ce1da8b995c727d0474d1b27bb4f85557..79064c1788b490594ca7531916afc3374da6fc5d 100644 GIT binary patch delta 57112 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 diff --git a/STS/Core/Src/yunhorn_sts_process.c b/STS/Core/Src/yunhorn_sts_process.c index a684a3c..330b365 100644 --- a/STS/Core/Src/yunhorn_sts_process.c +++ b/STS/Core/Src/yunhorn_sts_process.c @@ -61,7 +61,7 @@ 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; - +extern volatile sts_fhmos_sensor_ambient_height_t fhmos_bg, fhmos_gesture; extern volatile uint8_t sts_status_color; extern volatile uint8_t sts_lamp_bar_color; //puColor extern volatile uint8_t last_lamp_bar_color; @@ -72,7 +72,8 @@ extern volatile sts_fhmos_sensor_config_t fhmos_cfg; extern volatile uint8_t sts_status_color, sts_lamp_bar_color;//puColor extern uint8_t luminance_level; volatile uint8_t sts_fhmos_state_changed=0; - +extern volatile uint8_t fhmos_gesture_bitmap[8]; +extern volatile sts_fhmos_sensor_data_t fhmos_data; extern volatile uint8_t sts_mask_bitmap[8]; #endif volatile sts_cfg_nvm_t sts_cfg_nvm = { @@ -211,6 +212,7 @@ volatile uint8_t sts_water_leakage_changed_flag=0; volatile uint8_t sts_reed_hall_1_result=STS_Status_Door_Open, sts_reed_hall_2_result=STS_Status_SOS_Release; volatile uint8_t sts_reed_hall_3_result, sts_reed_hall_4_result; volatile uint8_t sts_fhmos_result=STS_FHMOS_FALL_STATE_NO_OCCUPY; +volatile uint8_t sts_fhmos_bitmap_pending=0; #endif @@ -355,10 +357,10 @@ void STS_YunhornSTSEventP1_Process(void) STS_Reed_Hall_Presence_Detection(); if (sts_reed_hall_result == last_sts_reed_hall_result) { - APP_LOG(TS_OFF, VLEVEL_M, "\r\n CHANGE FLAG = 0 \n"); + sts_reed_hall_changed_flag = 0; } else { - APP_LOG(TS_OFF, VLEVEL_M, "\r\n CHANGE FLAG = 1 \n"); + sts_reed_hall_changed_flag = 1; STS_Combined_Status_Processing(); } @@ -515,10 +517,36 @@ void STS_YunhornSTSEventP5_Process(void) UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); } + if (sts_fhmos_bitmap_pending !=0) + { + sts_fhmos_bitmap_pending = 0; + + uint8_t tstbuf[128] ={0x0}; uint8_t i=0; + + tstbuf[i++] = (uint8_t) 'G'; + tstbuf[i++] = (uint8_t) sts_mtmcode1; + tstbuf[i++] = (uint8_t) sts_mtmcode2; + tstbuf[i++] = (uint8_t) sts_version; + tstbuf[i++] = (uint8_t) sts_hardware_ver; + tstbuf[i++] = (uint8_t) (99*GetBatteryLevel()/254)&0xff; + + tstbuf[i++] = (uint8_t) (10)&0xff; //length of following data + tstbuf[i++] = (uint8_t) (fhmos_gesture.head_level)&0xff; // head height in cm + tstbuf[i++] = (uint8_t) (fhmos_gesture.head_xy)&0xff; + // MASK OFF BITMAP + tstbuf[i++] = (uint8_t) (fhmos_gesture_bitmap[0]); + tstbuf[i++] = (uint8_t) (fhmos_gesture_bitmap[1]); + tstbuf[i++] = (uint8_t) (fhmos_gesture_bitmap[2]); + tstbuf[i++] = (uint8_t) (fhmos_gesture_bitmap[3]); + tstbuf[i++] = (uint8_t) (fhmos_gesture_bitmap[4]); + tstbuf[i++] = (uint8_t) (fhmos_gesture_bitmap[5]); + tstbuf[i++] = (uint8_t) (fhmos_gesture_bitmap[6]); + tstbuf[i++] = (uint8_t) (fhmos_gesture_bitmap[7]); + + STS_SENSOR_Upload_Message(YUNHORN_STS_USER_APP_CTRL_REPLY_PORT, i, (uint8_t *)tstbuf); + } - //MX_TOF_Process(); - //MX_TOF_Ranging_Process(); #endif } @@ -1750,7 +1778,7 @@ void STS_REBOOT_CONFIG_Init(void) } } - STS_Show_STS_CFG_NVM((uint8_t*)nvm_store_value); + //STS_Show_STS_CFG_NVM((uint8_t*)nvm_store_value); OnRestoreSTSCFGContextProcess(); /* USER CODE END OnRestoreContextRequest_Last */ @@ -2167,7 +2195,8 @@ void YunhornSTSDurationCheckTimer(void) sts_o7_sensorData.event_sensor1_duration = current_time.Seconds - sts_o7_sensorData.event_sensor1_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_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) { sts_o7_sensorData.over_stay_state = 1; sts_o7_sensorData.over_stay_duration = sts_o7_sensorData.event_sensor1_duration; @@ -2175,8 +2204,10 @@ void YunhornSTSDurationCheckTimer(void) 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), - (sts_occupancy_overtime_threshold_in_10min*60) ); - sts_lamp_bar_color = STS_RED_DARK; + (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; @@ -2192,7 +2223,8 @@ void YunhornSTSDurationCheckTimer(void) if (STS_Status_SOS_Pushdown==sts_hall2_read) { sts_o7_sensorData.event_sensor2_duration = current_time.Seconds - sts_o7_sensorData.event_sensor2_start_time; - if (sts_o7_sensorData.event_sensor2_duration > sts_occupancy_overtime_threshold_in_10min*60) //for debug + //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; // 2024-07-15 update, no overwrite sensor1 duration value @@ -2303,13 +2335,32 @@ void YunhornSTSDurationCheckTimer(void) sts_lamp_bar_color = STS_RED_DARK; //sts_lamp_bar_flashing_color; } + fhmos_data.state_occupancy = 2; + sensor_data_ready = 1; UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); over_threshold = FALSE; } } +void OnSensorRange1StateChanged(void) +{ + SysTime_t sensor_event_time = SysTimeGetMcuTime(); + + if (fhmos_data.state_fall == 1) + { + sts_o7_sensorData.event_sensor3_fall_start_time = sensor_event_time.Seconds; + + sts_o7_sensorData.event_sensor3_fall_duration = 0; + + } else if (fhmos_data.state_fall == 0) + { + sts_o7_sensorData.event_sensor3_fall_start_time = 0; + sts_o7_sensorData.event_sensor3_fall_stop_time_stamp = sensor_event_time.Seconds; + } + +} /* reedswitch 1 on off */ void OnSensor1StateChanged(void) { @@ -2318,7 +2369,7 @@ void OnSensor1StateChanged(void) { 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 ); + //APP_LOG(TS_OFF, VLEVEL_M, "Door Closed ---Timer start: %u\r\n",sts_o7_sensorData.event_sensor1_start_time ); } else if (sts_hall1_read==STS_Status_Door_Open) { sts_o7_sensorData.event_sensor1_start_time = 0; @@ -2579,7 +2630,7 @@ void OnSensor4StateChanged(void) void STS_Combined_Status_Processing(void) { - printf("\r\n ********* combined process %d \r\n", sts_work_mode); + //printf("\r\n ********* combined process %d \r\n", sts_work_mode); switch (sts_work_mode) { @@ -2698,12 +2749,13 @@ void STS_Combined_Status_Processing(void) && (sts_fhmos_result == STS_FHMOS_FALL_STATE_NO_OCCUPY)) { sts_status_color = STS_VACANT_COLOR; + //printf("\r\n ********* combined process Vacant color = %d \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 ) - || (sts_fhmos_result != STS_FHMOS_FALL_STATE_NO_OCCUPY)) + } 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)) { sts_status_color = STS_OCCUPY_COLOR; - printf("\r\n ********* combined process status color = %d \r\n", sts_status_color); + //printf("\r\n ********* combined process Occupy color = %d \r\n", sts_status_color); if (sts_reed_hall_2_result == STS_Status_SOS_Pushdown ) { @@ -2717,7 +2769,7 @@ void STS_Combined_Status_Processing(void) { sts_status_color = STS_RED; } - printf("\r\n ********* combined process finished status color = %d \r\n", sts_status_color); + //printf("\r\n ********* combined process finished status color = %d \r\n", sts_status_color); sts_lamp_bar_color = sts_status_color; } diff --git a/STS/TOF/App/app_tof.c b/STS/TOF/App/app_tof.c index 1a1ddcb..6a121de 100644 --- a/STS/TOF/App/app_tof.c +++ b/STS/TOF/App/app_tof.c @@ -44,13 +44,15 @@ volatile sts_fhmos_sensor_data_t fhmos={0x0}; volatile sts_fhmos_sensor_config_t fhmos_cfg; 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; volatile uint8_t sts_mask_bitmap[8]={0x0}, fhmos_gesture_bitmap[8]={0x0}; 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_fhmos_state_changed; +extern volatile uint8_t sts_fhmos_bitmap_pending; #endif #include "stm32wlxx_nucleo.h" @@ -149,7 +151,7 @@ void MX_TOF_Init(void) /* USER CODE END TOF_Init_PreTreatment */ /* Initialize the peripherals and the TOF components */ - APP_LOG(TS_OFF,VLEVEL_L,"\r\n###################### MX TOF Init... \r\n"); + //APP_LOG(TS_OFF,VLEVEL_L,"\r\n###################### MX TOF Init... \r\n"); //MX_53L1A2_SimpleRanging_Init(); //STS_TOF_VL53LX_PeopleCounting_Process(); @@ -272,8 +274,8 @@ void sts_generate_fall_gesture_map(void) } } - fhmos_gesture.head_level = sts_fall_head_position; - fhmos_gesture.head_xy = head_xy; + fhmos_gesture.head_level = 0xff&((sts_sensor_install_height - sts_fall_head_position)/10); // head level from floor in CM + fhmos_gesture.head_xy = head_xy&0xff; #if 0 for (i=0; i<64; i++) { @@ -527,16 +529,16 @@ static void print_result(RANGING_SENSOR_Result_t *Result) motion_power += motion_diff; prev_distance[j] = (uint16_t)Result->ZoneResult[j].Distance[0]; } - + motion_power /=64; if (motion_power > fhmos_cfg.th_motion_power_level) { fhmos_human_movement =1; } else { fhmos_human_movement =0; } - - //printf("\r\n Motion Power =%d Average=%d Human Movement =%d\r\n", motion_power, motion_power/64, fhmos_human_movement); - +#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 zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) || (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4; @@ -558,12 +560,15 @@ static void print_result(RANGING_SENSOR_Result_t *Result) { 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 = 1; - fhmos_data.state_human_movement = 1; + 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 + //OnSensorRange1StateChanged(); + fhmos_fall_counter ++; // TODO XXX Timer for confirmation - if ((fhmos_fall_counter >= 15*fhmos_cfg.th_fall_duration_potential_15sec)&& (fhmos_fall_counter < 15*fhmos_cfg.th_fall_duration_confirm_15sec)) + + 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", @@ -572,9 +577,13 @@ static void print_result(RANGING_SENSOR_Result_t *Result) printf("\r\n Fall state --- Yellow \r\n"); #endif 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 = STS_FHMOS_FALL_STATE_POTENTIAL; - } else if (fhmos_fall_counter >= 15*fhmos_cfg.th_fall_duration_confirm_15sec) + 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", @@ -584,9 +593,12 @@ static void print_result(RANGING_SENSOR_Result_t *Result) 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 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 = STS_FHMOS_FALL_STATE_CONFIRMED; + fhmos_data.state_changed_fall = true; + sts_fhmos_state_changed |=1; sts_generate_fall_gesture_map(); + sts_fhmos_bitmap_pending = 1; } } @@ -601,10 +613,13 @@ static void print_result(RANGING_SENSOR_Result_t *Result) #endif //fhmos_occupancy = STS_FHMOS_OCCUPANCY_NORMAL; fhmos_data.state_occupancy = STS_FHMOS_OCCUPANCY_NORMAL; - - //if (fhmos_data.prev_occupancy != fhmos_data.state_occupancy) + 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; + fhmos_data.status_color = STS_OCCUPY_COLOR; + sts_fhmos_state_changed |=1; + } }else @@ -618,18 +633,24 @@ static void print_result(RANGING_SENSOR_Result_t *Result) 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; + 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_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(); }