From a80b70e3dde9bd5eb77bff7ca64e538cfc839ac7 Mon Sep 17 00:00:00 2001 From: YunHorn Technology Date: Mon, 16 Dec 2024 05:28:11 +0800 Subject: [PATCH] workable Fall detection with code 2/3 upload and gesture map --- LoRaWAN/App/lora_app.c | 13 ++- STM32CubeIDE/Release/WLE5CC_NODE_STS.bin | Bin 187064 -> 187808 bytes STM32CubeIDE/Release/WLE5CC_NODE_STS.elf | Bin 275856 -> 275904 bytes STS/Core/Inc/yunhorn_sts_sensors.h | 12 +-- STS/Core/Src/sts_cmox_hmac_sha.c | 2 +- STS/Core/Src/yunhorn_sts_process.c | 95 +++++++++++------ STS/TOF/App/app_tof.c | 125 ++++++++++++++++++----- 7 files changed, 180 insertions(+), 67 deletions(-) diff --git a/LoRaWAN/App/lora_app.c b/LoRaWAN/App/lora_app.c index 79c589d..e290931 100644 --- a/LoRaWAN/App/lora_app.c +++ b/LoRaWAN/App/lora_app.c @@ -628,7 +628,7 @@ 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; - APP_LOG(TS_OFF, VLEVEL_M,"\r\n EXIT_CALLBACK, Door Open: sts status color =%d, lampbar_color=%d \r\n", sts_status_color, sts_lamp_bar_color); + //APP_LOG(TS_OFF, VLEVEL_M,"\r\n EXTI_CALLBACK, Door Open: sts status color =%d, lampbar_color=%d \r\n", sts_status_color, sts_lamp_bar_color); } // 3) combine states and colors //STS_YunhornSTSEventP1_Process(); @@ -1237,6 +1237,17 @@ static void SendTxData(void) AppData.Buffer[i++] = fhmos_data.state_hall_1; AppData.Buffer[i++] = fhmos_data.state_hall_2; AppData.Buffer[i++] = fhmos_data.state_PIR; + + if (fhmos_data.state_fall_released == 1) + { + fhmos_data.state_fall_released == 0; + + AppData.Buffer[i++] = (uint8_t) 0xff&(fhmos_data.time_stamp_fall_confirmed>>24); + AppData.Buffer[i++] = (uint8_t) 0xff&(fhmos_data.time_stamp_fall_confirmed>>16); + AppData.Buffer[i++] = (uint8_t) 0xff&(fhmos_data.time_stamp_fall_confirmed>>8); + AppData.Buffer[i++] = (uint8_t) 0xff&(fhmos_data.time_stamp_fall_confirmed); + + } } // AppData.Buffer[i++] = 0x01; // payload type, 0x01= regular payload #if 0 diff --git a/STM32CubeIDE/Release/WLE5CC_NODE_STS.bin b/STM32CubeIDE/Release/WLE5CC_NODE_STS.bin index aacf24985a40915a63e34d49444d985b28413fbe..85c046fd61921c8c47a6b7816761c6513a7bea1e 100644 GIT binary patch delta 14702 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 z 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 diff --git a/STM32CubeIDE/Release/WLE5CC_NODE_STS.elf b/STM32CubeIDE/Release/WLE5CC_NODE_STS.elf index 26c8ceea615eb1a510f2fd5d6e735b429448d6cf..bc5c16f48bbce1962369c2aaa7cf33cc92f6d528 100644 GIT binary patch delta 47502 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 G|NTF!M-R6E delta 46901 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

BF*x258` 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 HaR2>3mT_Dm diff --git a/STS/Core/Inc/yunhorn_sts_sensors.h b/STS/Core/Inc/yunhorn_sts_sensors.h index 1b66377..cf068d6 100644 --- a/STS/Core/Inc/yunhorn_sts_sensors.h +++ b/STS/Core/Inc/yunhorn_sts_sensors.h @@ -296,10 +296,10 @@ typedef struct sts_fhmos_sensor_data uint8_t color_occupancy; /* 0/blue: no occupy, 1/green:occupy yet normal, 3/red: over stay */ uint8_t color_sos_alarm; /* 1/green, sos on-duty, 2/yellow, sos button pressed 3/red, alarm */ - uint8_t state_human_movement_updated_tag; - uint8_t state_occupancy_updated_tag; - uint8_t state_sos_alarm_updated_tag; - uint8_t state_fall_updated_tag; + uint8_t state_human_movement_released; + uint8_t state_occupancy_released; + uint8_t state_sos_alarm_released; + uint8_t state_fall_released; uint8_t state_hall_1; uint8_t state_hall_2; @@ -351,8 +351,8 @@ typedef struct sts_fhmos_sensor_config uint8_t th_motionless_short_15sec; // 5 min - 10 min uint8_t th_motionless_long_15sec; // 10 min - 30 min uint8_t th_occupancy_overstay_15sec; // 10 min - 30 min - uint8_t th_gesture_mask_off_height_cm; // motion power level - uint8_t th_fhmos_cfg_reserve1; // reserved 1 + uint8_t th_gesture_mask_off_height_cm; // gesture mask off height cm + uint8_t th_fall_body_min_height_cm; // fall body min height from floor cm } sts_fhmos_sensor_config_t; diff --git a/STS/Core/Src/sts_cmox_hmac_sha.c b/STS/Core/Src/sts_cmox_hmac_sha.c index 20eb025..1e5e0c6 100644 --- a/STS/Core/Src/sts_cmox_hmac_sha.c +++ b/STS/Core/Src/sts_cmox_hmac_sha.c @@ -52,7 +52,7 @@ uint32_t sts_hmac_verify(void) hmac_result.ac_pass = (ret == 0x0)?1U:0U; - //APP_LOG(TS_OFF, VLEVEL_L, "\r\nHMAC Verify Success = %u \r\n", hmac_result.ac_pass); + APP_LOG(TS_OFF, VLEVEL_M, "\r\nHMAC Verify Success = %u \r\n", hmac_result.ac_pass); return ret; } diff --git a/STS/Core/Src/yunhorn_sts_process.c b/STS/Core/Src/yunhorn_sts_process.c index e593c7d..ddeba5e 100644 --- a/STS/Core/Src/yunhorn_sts_process.c +++ b/STS/Core/Src/yunhorn_sts_process.c @@ -62,6 +62,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 uint32_t sts_low_threshold, sts_high_threshold; 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 @@ -151,7 +152,7 @@ volatile sts_cfg_nvm_t sts_cfg_nvm = { 0x50, // uint8_t fhmos_cfg_6; 80*15=1200sec, =20min 0x14, // th_gesture_mask_off_height_cm - 0x00, // reserved + 0x19, // reserved #elif 0x06, //reserve6 alarm_mute_or_reset_expire_timer_in_10sec, 60 seconds 0x23, //reserve7 alarm Lamp Bar Flashing color define, 0x20, 2==STS_RED, 0 = STS_DARK, 0x23, 2=STS_RED, 3=STS_BLUE @@ -545,7 +546,7 @@ void STS_YunhornSTSEventP5_Process(void) UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); } - if (sts_fhmos_bitmap_pending == 0x01) + if (sts_fhmos_bitmap_pending == 1) { STS_FHMOS_sensor_upload_map(0x02); @@ -808,7 +809,7 @@ void USER_APP_Parse_CMD_P(uint8_t *parse_buffer, uint8_t parse_buffer_size) break; case 8: - fhmos_cfg.th_fhmos_cfg_reserve1 = sts_fhmos_cfg_value;; + fhmos_cfg.th_fall_body_min_height_cm = sts_fhmos_cfg_value;; break; case 9: // cmd for upload messages @@ -823,14 +824,14 @@ void USER_APP_Parse_CMD_P(uint8_t *parse_buffer, uint8_t parse_buffer_size) } if (sts_fhmos_cfg_index < 9) { - sts_cfg_nvm.fhmos_cfg_1 = fhmos_cfg.th_head_level_height_cm; - sts_cfg_nvm.fhmos_cfg_2 = fhmos_cfg.th_fall_duration_potential_15sec; - sts_cfg_nvm.fhmos_cfg_3 = fhmos_cfg.th_fall_duration_confirm_15sec; - sts_cfg_nvm.fhmos_cfg_4 = fhmos_cfg.th_motionless_short_15sec; - sts_cfg_nvm.fhmos_cfg_5 = fhmos_cfg.th_motionless_long_15sec; - sts_cfg_nvm.fhmos_cfg_6 = fhmos_cfg.th_occupancy_overstay_15sec; - sts_cfg_nvm.fhmos_cfg_7 = fhmos_cfg.th_gesture_mask_off_height_cm; - sts_cfg_nvm.fhmos_cfg_8 = fhmos_cfg.th_fhmos_cfg_reserve1; + sts_cfg_nvm.fhmos_cfg_1 = fhmos_cfg.th_head_level_height_cm; // default:70 -- 70 cm + sts_cfg_nvm.fhmos_cfg_2 = fhmos_cfg.th_fall_duration_potential_15sec; // default:04 -- 1 min + sts_cfg_nvm.fhmos_cfg_3 = fhmos_cfg.th_fall_duration_confirm_15sec; // default:08 -- 2 min + sts_cfg_nvm.fhmos_cfg_4 = fhmos_cfg.th_motionless_short_15sec; // default:08 -- 2 min + sts_cfg_nvm.fhmos_cfg_5 = fhmos_cfg.th_motionless_long_15sec; // default:14 --26 min + sts_cfg_nvm.fhmos_cfg_6 = fhmos_cfg.th_occupancy_overstay_15sec; // default:50 -- 20 min + sts_cfg_nvm.fhmos_cfg_7 = fhmos_cfg.th_gesture_mask_off_height_cm; // default:14 -- 20 cm + sts_cfg_nvm.fhmos_cfg_8 = fhmos_cfg.th_fall_body_min_height_cm; // default:19 -- 25 cm OnStoreSTSCFGContextRequest(); @@ -1240,6 +1241,9 @@ void USER_APP_AUTO_RESPONDER_Parse(uint8_t *parse_buffer, uint8_t parse_buffer_s break; case 'S': /* "YZS": Self Function Testing */ STS_SENSOR_Function_Test_Process(); + sts_cfg_nvm.sensor_install_height_in_10cm = sts_sensor_install_height/100; //in 10 cm, say 4500mm=450cm=45 dm + APP_LOG(TS_OFF, VLEVEL_M, "\n STS CFG NVM -> SENSOR INSTALL HEIGHT STORED = %d dm(10cm)\n", sts_cfg_nvm.sensor_install_height_in_10cm); + OnStoreSTSCFGContextRequest(); break; case 'C': /* "YZC": report LORAWAN CLASS A/B/C */ @@ -1730,11 +1734,11 @@ void OnStoreSTSCFGContextRequest(void) #endif if ((nvm_store_value[NVM_AC_CODE_START]!= 0x0) && (nvm_store_value[NVM_AC_CODE_START+19]!=0x0)) { - //APP_LOG(TS_OFF, VLEVEL_M, "\n\r Transfer good NVM Stored ac_code to NVM_STORE_VALUE\r\n"); + APP_LOG(TS_OFF, VLEVEL_M, "\n\r Transfer good NVM Stored ac_code to NVM_STORE_VALUE\r\n"); UTIL_MEM_cpy_8((void*)&to_store__value[NVM_AC_CODE_START], (void*)&nvm_store_value[NVM_AC_CODE_START],YUNHORN_STS_AC_CODE_SIZE); } else if ((sts_ac_code[0]!=0x0) && (sts_ac_code[YUNHORN_STS_AC_CODE_SIZE-1]!=0x0)) { - //APP_LOG(TS_OFF, VLEVEL_M, "\n\r Transfer new generated ac_code to NVM_STORE_VALUE\r\n"); + APP_LOG(TS_OFF, VLEVEL_M, "\n\r Transfer new generated ac_code to NVM_STORE_VALUE\r\n"); UTIL_MEM_cpy_8((void*)&to_store__value[NVM_AC_CODE_START], (void*)sts_ac_code,YUNHORN_STS_AC_CODE_SIZE); UTIL_MEM_cpy_8((void*)&nvm_store_value[NVM_AC_CODE_START], (void*)sts_ac_code,YUNHORN_STS_AC_CODE_SIZE); } @@ -1908,11 +1912,11 @@ void OnRestoreSTSCFGContextProcess(void) #endif - //for (uint8_t j=0; j< YUNHORN_STS_AC_CODE_SIZE; j++) - //{ - // sts_ac_code[j] = sts_cfg_nvm.ac[j]; - //} - //UTIL_MEM_cpy_8((void*)sts_ac_code,(void*)sts_cfg_nvm.ac, YUNHORN_STS_AC_CODE_SIZE); + for (uint8_t j=0; j< YUNHORN_STS_AC_CODE_SIZE; j++) + { + sts_ac_code[j] = sts_cfg_nvm.ac[j]; + } + UTIL_MEM_cpy_8((void*)sts_ac_code,(void*)sts_cfg_nvm.ac, YUNHORN_STS_AC_CODE_SIZE); #ifdef YUNHORN_STS_O6_ENABLED if ((sts_version == sts_cfg_nvm.version)&& (NVM_CFG_PARAMETER_SIZE == sts_cfg_nvm.length)) @@ -1942,8 +1946,10 @@ void STS_FHMOS_sensor_config_init(void) fhmos_cfg.th_occupancy_overstay_15sec = 80; // 80*15 = 1200 sec, 20 min. fhmos_cfg.th_gesture_mask_off_height_cm = 20; // gesture mask off height in cm - fhmos_cfg.th_fhmos_cfg_reserve1=0; // reserve + fhmos_cfg.th_fall_body_min_height_cm = 25; // fall body min height from floor 25 cm + sts_high_threshold = sts_cfg_nvm.sensor_install_height_in_10cm*100; + sts_low_threshold = sts_high_threshold - 1400; } void STS_FHMOS_sensor_config_update() @@ -1955,8 +1961,8 @@ void STS_FHMOS_sensor_config_update() fhmos_cfg.th_motionless_short_15sec = sts_cfg_nvm.fhmos_cfg_4; // 4*15 = 60 sec , 1 min. fhmos_cfg.th_motionless_long_15sec = sts_cfg_nvm.fhmos_cfg_5; // 20*15 = 300 sec, 5 min. fhmos_cfg.th_occupancy_overstay_15sec = sts_cfg_nvm.fhmos_cfg_6; // 80*15 = 1200 sec, 20 min. - fhmos_cfg.th_gesture_mask_off_height_cm = sts_cfg_nvm.fhmos_cfg_7; - fhmos_cfg.th_fhmos_cfg_reserve1 = sts_cfg_nvm.fhmos_cfg_8; + fhmos_cfg.th_gesture_mask_off_height_cm = sts_cfg_nvm.fhmos_cfg_7; // 20 cm + fhmos_cfg.th_fall_body_min_height_cm = sts_cfg_nvm.fhmos_cfg_8; // 25 cm } @@ -2058,8 +2064,23 @@ void STS_SENSOR_Distance_Test_Process(void) STSWakeupScanTimerStop(); //STS_TOF_L8_Process(); + uint32_t range_once=0; + //MX_TOF_Process(); - sts_sensor_install_height = (uint16_t)MX_TOF_Ranging_Process(); + uint8_t rpt=0; + for (rpt=0; rpt<3; rpt++) + { + range_once = range_once + (uint16_t)MX_TOF_Ranging_Process(); + //APP_LOG(TS_OFF, VLEVEL_M, "\r\n Range_once=%d \r\n", range_once); + HAL_Delay(150); + } + + range_once /= 3; + + //APP_LOG(TS_OFF, VLEVEL_M, "\r\n Range_once=%d \r\n", range_once); + + sts_sensor_install_height = range_once; //(uint16_t)MX_TOF_Ranging_Process(); + //sts_sensor_install_height = (uint16_t)STS_Get_Center_Range_Distance(); APP_LOG(TS_OFF, VLEVEL_M, "\n STS SENSOR INSTALLATION HEIGHT =%d mm\n\r", (uint16_t)sts_sensor_install_height); @@ -2234,12 +2255,12 @@ void OnYunhornSTSOORSSWakeUpTimerEvent(void *context) * @brief Yunhorn STS Sensor Heart Beat Timer callback function * @param context ptr of STS Sampling Check context */ -#if 0 +#if 1 void OnYunhornSTSHeartBeatTimerEvent(void *context) { -#if 0 +#if 1 uint8_t appDataPort, appBufferSize, appDataBuffer[32]; - appDataPort = YUNHORN_STS_P2_LORA_APP_HTBT_PORT; + appDataPort = YUNHORN_STS_L8_LORA_APP_HTBT_PORT; appBufferSize = 2; appDataBuffer[0]=0x80; appDataBuffer[1]=0x63; //TODO XXX change to battery level % @@ -2332,7 +2353,7 @@ void YunhornSTSDurationCheckTimer(void) sts_lamp_bar_color = STS_OCCUPANCY_OVERSTAY_COLOR; // APP_LOG(TS_OFF, VLEVEL_M, "\r\nSensor1 overstay set color to %d color:%s\r\n",sts_lamp_bar_color, (char*)code2color[sts_lamp_bar_color]); - over_threshold |= 1<<1; + over_threshold |= 1<<0; // APP_LOG(TS_OFF, VLEVEL_M, "\r\n 1<<1 Over Threshold =0x%02x \r\n", over_threshold); } @@ -2371,7 +2392,7 @@ void YunhornSTSDurationCheckTimer(void) // 2024-07-15 update, no overwrite sensor1 duration value //sts_o7_sensorData.over_stay_duration = sts_o7_sensorData.event_sensor2_duration; // - over_threshold |= 1<<2; + over_threshold |= 1<<1; // APP_LOG(TS_OFF, VLEVEL_M, "\r\n 1<<2 Over Threshold =0x%02x \r\n", over_threshold); // to be defiend later for SOS threshold TODO XXXX } else @@ -2456,8 +2477,8 @@ void YunhornSTSDurationCheckTimer(void) //sts_lamp_bar_color = STS_HUMAN_MOVEMENT_MOTIONLESS_NORMAL; } else { - over_threshold &= ~0x04; - over_threshold &= ~0x08; + over_threshold &= ~0x10; + over_threshold &= ~0x20; } @@ -2476,7 +2497,7 @@ void YunhornSTSDurationCheckTimer(void) sts_o7_sensorData.event_sensor3_fall_duration = current_time.Seconds - sts_o7_sensorData.event_sensor3_fall_start_time; //fhmos_data.head_low_level_duration = current_time.Seconds - fhmos_data.head_low_level_start_time; -#if 0 +#if 1 APP_LOG(TS_OFF, VLEVEL_M, "\r\n Head Low duration =%d \r\n Potential threshold=%d sec \r\n Confirm threshold=%d sec", sts_o7_sensorData.event_sensor3_fall_duration, fhmos_cfg.th_fall_duration_potential_15sec*15, @@ -2487,6 +2508,7 @@ void YunhornSTSDurationCheckTimer(void) { 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.state_fall_released = 0; fhmos_data.time_stamp_fall_confirmed = time_stamp; // APP_LOG(TS_OFF, VLEVEL_M, "\r\n 003 fall state set to %d \r\n",fhmos_data.state_fall); @@ -2510,6 +2532,7 @@ void YunhornSTSDurationCheckTimer(void) { // stay this state until > long threshold fhmos_data.state_fall = STS_FHMOS_FALL_STATE_POTENTIAL; + fhmos_data.state_fall_released = 0; // APP_LOG(TS_OFF, VLEVEL_M, "\r\n 002 Fall State =%d \r\n", fhmos_data.state_fall); // sts_lamp_bar_color = STS_FALL_SUSPICIOUS_COLOR; // APP_LOG(TS_OFF, VLEVEL_M, "\r\nSensor L8 set FALL POTENTIAL color to %d color:%s \r\n",sts_lamp_bar_color, (char*) code2color[sts_lamp_bar_color]); @@ -2524,9 +2547,10 @@ void YunhornSTSDurationCheckTimer(void) //fhmos_data.head_low_level_start_time = 0; sts_o7_sensorData.event_sensor3_fall_duration = 0; fhmos_data.state_fall = STS_FHMOS_FALL_STATE_NORMAL; + fhmos_data.state_fall_released = 1; sts_fhmos_bitmap_pending = 0; - over_threshold &= ~0x20; over_threshold &= ~0x40; + over_threshold &= ~0x80; } @@ -2632,7 +2656,8 @@ void YunhornSTSDurationCheckTimer(void) sts_cmb_result = sts_sensor1_changed<<0 |sts_sensor2_changed<<1 |sts_sensor3_changed<<2|sts_sensor4_changed<<3; // APP_LOG(TS_OFF, VLEVEL_M, "\r\n Over_threshold=0x%02x, sts cmb result =0x%02x, last_cmb_result=0x%02x \r\n", over_threshold, sts_cmb_result, last_sts_cmb_result); - if ((over_threshold != 0 ) && (last_sts_cmb_result != sts_cmb_result)) + //if ((over_threshold != 0 ) && (last_sts_cmb_result != sts_cmb_result)) + if ((last_sts_cmb_result != sts_cmb_result)) { // APP_LOG(TS_OFF, VLEVEL_M, "\r\n Over Threshold =0x%02x \r\n", over_threshold); last_sts_cmb_result = sts_cmb_result; @@ -2992,8 +3017,9 @@ void OnSensorL8AStateChanged(void) { fhmos_data.head_low_level_start_time = sensor_event_time.Seconds; + fhmos_data.state_fall_released = 0; - // APP_LOG(TS_OFF, VLEVEL_M, "\r\n Head Level Low -------- state =%d last =%d \r\n", sts_head_level_low, last_head_level_low_state); + APP_LOG(TS_OFF, VLEVEL_M, "\r\n Head Level Low -------- state =%d last =%d \r\n", sts_head_level_low, last_head_level_low_state); sts_o7_sensorData.event_sensor3_fall_start_time = sensor_event_time.Seconds; @@ -3003,8 +3029,9 @@ void OnSensorL8AStateChanged(void) { fhmos_data.head_low_level_stop_time = sensor_event_time.Seconds; fhmos_data.state_fall = STS_FHMOS_FALL_STATE_NORMAL; -// APP_LOG(TS_OFF, VLEVEL_M, "\r\n Head Level Rise up ++++++++++ \r\n"); + APP_LOG(TS_OFF, VLEVEL_M, "\r\n Head Level Rise up ++++++++++ \r\n"); sts_fhmos_state_changed = 1; + fhmos_data.state_fall_released = 1; } } diff --git a/STS/TOF/App/app_tof.c b/STS/TOF/App/app_tof.c index b92ac84..7c5309c 100644 --- a/STS/TOF/App/app_tof.c +++ b/STS/TOF/App/app_tof.c @@ -40,7 +40,7 @@ volatile uint8_t fhmos_fall=0, fhmos_human_movement=0, fhmos_occupancy=0, fhmos_ 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_config_t fhmos_cfg={70,4,8,8,20,80,20,0}; +volatile sts_fhmos_sensor_config_t fhmos_cfg={70,4,8,8,20,80,20,25}; volatile sts_fhmos_sensor_cmd_t fhmos_cmd={0x0}; volatile sts_fhmos_sensor_ambient_height_t fhmos_bg={0x0}, fhmos_gesture={0x0}, fhmos_net={0x0}; volatile sts_fhmos_sensor_data_t fhmos_data={0}; @@ -160,6 +160,10 @@ void MX_TOF_Init(void) MX_53L8A1_ThresholdDetection_Init(); MX_53L8A1_ThresholdDetection_Process(); STS_FHMOS_sensor_config_init(); + //sts_high_threshold = sts_cfg_nvm.sensor_install_height_in_10cm ; + //sts_low_threshold = sts_cfg_nvm.sensor_install_height_in_10cm -1400; + STS_TOF_L8_Reconfig(); + #elif defined(STS_R1D) XWL55_WLE5_53L0X_Init(); #endif @@ -195,7 +199,24 @@ void STS_LMZ_Ambient_Height_Scan_Process(void) sts_low_threshold = sts_sensor_install_height-1400; STS_TOF_L8_Reconfig(); - STS_TOF_L8_Process(); + status = VL53L8A1_RANGING_SENSOR_Start(VL53L8A1_DEV_CENTER, RS_MODE_ASYNC_CONTINUOUS); + + if (status != BSP_ERROR_NONE) + { + printf("VL53L8A1_RANGING_SENSOR_Start failed\n"); + while (1); + } + + if (ToF_EventDetected != 0) + { + ToF_EventDetected = 0; + status = VL53L8A1_RANGING_SENSOR_GetDistance(VL53L8A1_DEV_CENTER, &Result); + if (status != BSP_ERROR_NONE) + { + APP_LOG(TS_OFF, VLEVEL_M, "\r\n x \r\n"); + } + } + //STS_TOF_L8_Process(); APP_LOG(TS_OFF, VLEVEL_M, "\r\n ----------------------" @@ -204,12 +225,12 @@ void STS_LMZ_Ambient_Height_Scan_Process(void) for (uint8_t i = 0; i < 64; i++) { /* Print distance and status */ - if (i%8==0) APP_LOG(TS_OFF, VLEVEL_M, "\r\n"); + if (i%8==0) APP_LOG(TS_OFF, VLEVEL_M, "\r\nPosition from Floor [cm]| "); if ((Result.ZoneResult[i].NumberOfTargets > 0)) { range_distance = (uint32_t)Result.ZoneResult[i].Distance[0]; - fhmos_bg.h2cm[i] = abs(sts_sensor_install_height - range_distance)/20; + fhmos_bg.h2cm[i] = abs(sts_sensor_install_height - range_distance)/20; // in 2 cm if (2*fhmos_bg.h2cm[i] < fhmos_cfg.th_gesture_mask_off_height_cm) { @@ -221,17 +242,17 @@ void STS_LMZ_Ambient_Height_Scan_Process(void) //sts_mask_bitmap[(uint8_t)(i/8)] |= (fhmos_bg.maskoff[i])<<(7-i%8); sts_mask_bitmap[(uint8_t)(i/8)] |= (fhmos_bg.maskoff[i])<<(i%8); // if (i%8==0) APP_LOG(TS_OFF, VLEVEL_M, "\r\n"); - APP_LOG(TS_OFF, VLEVEL_M, "|%4d ", fhmos_bg.h2cm[i]); + APP_LOG(TS_OFF, VLEVEL_M, "|%3d ", fhmos_bg.h2cm[i]*2); } else { fhmos_bg.h2cm[i] = 0; - APP_LOG(TS_OFF, VLEVEL_M, " .%d. ", i); + APP_LOG(TS_OFF, VLEVEL_M, "|%3d ", fhmos_bg.h2cm[i]); } } - APP_LOG(TS_OFF, VLEVEL_M, "\r\n ------- Mask off matrix \r\n"); + APP_LOG(TS_OFF, VLEVEL_M, "\r\n\n ------- Mask off matrix \r\n"); for (i=0; i<64; i++) { @@ -274,8 +295,9 @@ void sts_generate_fall_gesture_map(void) sts_fall_head_position = range_distance; // simply find out the head level head_xy = i; // head x, y coordination in 8x8 matrix } - fhmos_gesture.h2cm[i] = (uint8_t)abs(sts_sensor_install_height - range_distance)/20; - fhmos_gesture.maskoff[i]= ((2*fhmos_gesture.h2cm[i])< fhmos_cfg.th_gesture_mask_off_height_cm)? 0:1; + fhmos_gesture.h2cm[i] = (uint8_t)abs(sts_sensor_install_height - range_distance)/20; + //fhmos_gesture.maskoff[i] = ((2*fhmos_gesture.h2cm[i])< fhmos_cfg.th_gesture_mask_off_height_cm)? 0:1; + fhmos_gesture.maskoff[i] = (fhmos_gesture.h2cm[i]==0)? 0:1; fhmos_gesture_bitmap[(uint8_t)(i/8)] |= (fhmos_gesture.maskoff[i])<<(i%8); // debug // if (i%8==0) printf("\r\n"); @@ -287,6 +309,16 @@ void sts_generate_fall_gesture_map(void) if (i%8==0) APP_LOG(TS_OFF, VLEVEL_M, "\r\n"); APP_LOG(TS_OFF, VLEVEL_M, "|%4d ", fhmos_gesture.h2cm[i]); } + + for (i = 0; i < 64; i++) + { + if (i%8==0) APP_LOG(TS_OFF, VLEVEL_M, "\r\n"); + APP_LOG(TS_OFF, VLEVEL_M, "|%d ", fhmos_gesture.maskoff[i]); + } + + for (i=0; i<8; i++) + APP_LOG(TS_OFF, VLEVEL_M, "%02x",fhmos_gesture_bitmap[i]); + APP_LOG(TS_OFF, VLEVEL_M, "\r\n"); for (i = 0; i < 32; i++) { @@ -342,7 +374,9 @@ uint16_t MX_TOF_Ranging_Process(void) { range_distance= STS_Get_Center_Range_Distance(&Result); } else { - APP_LOG(TS_OFF, VLEVEL_M, "\r\n x \r\n"); + + APP_LOG(TS_OFF, VLEVEL_M, "\r\n status=%d, x \r\n", status); + return 0; } } @@ -484,8 +518,12 @@ static void MX_53L8A1_ThresholdDetection_Process(void) /* threshold parameters */ ITConfig.Criteria = RS_IT_IN_WINDOW; - ITConfig.LowThreshold = LOW_THRESHOLD; /* mm */ - ITConfig.HighThreshold = HIGH_THRESHOLD; /* mm */ + //ITConfig.LowThreshold = LOW_THRESHOLD; /* mm */ + //ITConfig.HighThreshold = HIGH_THRESHOLD; /* mm */ + + ITConfig.LowThreshold = sts_low_threshold; + ITConfig.HighThreshold = sts_high_threshold; + VL53L8A1_RANGING_SENSOR_ConfigIT(VL53L8A1_DEV_CENTER, &ITConfig); @@ -531,11 +569,15 @@ uint32_t STS_Get_Center_Range_Distance(RANGING_SENSOR_Result_t *Result) for (uint8_t i=0; i<4; i++) { + APP_LOG(TS_OFF, VLEVEL_M, "\r\nCenter[%d]: roi=%d Distance=%d \r\n", i, center_roi[i],Result->ZoneResult[center_roi[i]].Distance[0]); + center_range_distance +=(uint32_t)(Result->ZoneResult[center_roi[i]].Distance[0]); + } center_range_distance /= 4; + APP_LOG(TS_OFF, VLEVEL_M, "\r\n Center Range Average=%d mm\r\n", center_range_distance); return center_range_distance; } @@ -586,14 +628,14 @@ static void print_result(RANGING_SENSOR_Result_t *Result) #endif //int32_t roi_distance =(uint32_t)center_range_distance/4; uint16_t factor1_floor_level_from_ceiling = sts_sensor_install_height; // 50mm min body height - uint16_t factor2_head_level_from_floor = (sts_sensor_install_height - 10*fhmos_cfg.th_head_level_height_cm); - uint16_t head_distance_from_floor=0; + uint16_t factor2_head_level_from_floor = (10*fhmos_cfg.th_head_level_height_cm); //(sts_sensor_install_height - 10*fhmos_cfg.th_head_level_height_cm); + uint16_t head_height_level_from_floor=0; sts_head_level_low = 0; - +#if 0 for (i=0; i<64; i++) { - if (i%8 ==0) APP_LOG(TS_OFF, VLEVEL_M, "\r\n"); + if (i%8 ==0) APP_LOG(TS_OFF, VLEVEL_M, "Phase I \r\n"); APP_LOG(TS_OFF, VLEVEL_M, "%2d__%4d ", fhmos_bg.maskoff[i],Result->ZoneResult[i].Distance[0]); if (0 == fhmos_bg.maskoff[i]) // only within the non-mask-off blocks { // Result.ZoneResult[i].NumberOfTargets > 0) @@ -602,20 +644,47 @@ static void print_result(RANGING_SENSOR_Result_t *Result) // find out the min_distance or the highest position level } } + head_height_level_from_floor = sts_sensor_install_height - head_distance_from_ceiling; - head_distance_from_floor = sts_sensor_install_height - head_distance_from_ceiling; - - APP_LOG(TS_OFF, VLEVEL_M, "\r\n #### Head distance from ceiling = %4d \r\n Head distance from floor\r\n",head_distance_from_ceiling, head_distance_from_floor); - /* state tree */ -#if 2 - APP_LOG(TS_OFF, VLEVEL_M,"\r\n factor1_floor_level_from_ceiling=%d mm\r\n, F2 th_high=%d, th_head=%d, \r\nFactor2 (factor2_head_level_from_floor)=%d \r\n", - factor1_floor_level_from_ceiling, (int)sts_high_threshold, (int)10*fhmos_cfg.th_head_level_height_cm, factor2_head_level_from_floor); + APP_LOG(TS_OFF, VLEVEL_M, "\r\n #### Head distance from ceiling = %4d \r\n Head distance from floor =%d \r\n", + head_distance_from_ceiling, head_height_level_from_floor); #endif - if ((head_distance_from_ceiling <= factor1_floor_level_from_ceiling) && ((sts_sensor_install_height - head_distance_from_ceiling) <= (10*fhmos_cfg.th_head_level_height_cm) )) + //APP_LOG(TS_OFF, VLEVEL_M, "\r\n Eliminate edge \r\n"); + uint8_t rio_edge[30]={0,1,2,3,4,5,6,7,8,15,16,23,24,31,32,39,40,47,48,55,56,57,58,59,60,61,62,63}; + + for (i=0; i<30; i++) + fhmos_bg.maskoff[rio_edge[i]] = 1; + + for (i=0; i<64; i++) + { + //if (i%8 ==0) APP_LOG(TS_OFF, VLEVEL_M, "Phase II \r\n"); + //APP_LOG(TS_OFF, VLEVEL_M, "%2d__%4d ", fhmos_bg.maskoff[i],Result->ZoneResult[i].Distance[0]); + if (0 == fhmos_bg.maskoff[i]) // only within the non-mask-off blocks + { // Result.ZoneResult[i].NumberOfTargets > 0) + if ((Result->ZoneResult[i].Distance[0] < head_distance_from_ceiling)&& (Result->ZoneResult[i].NumberOfTargets > 0)) + head_distance_from_ceiling = Result->ZoneResult[i].Distance[0]; + // find out the min_distance or the highest position level + } + } + + + head_height_level_from_floor = sts_sensor_install_height - head_distance_from_ceiling; +#if 0 + APP_LOG(TS_OFF, VLEVEL_M, "\r\n #### Head distance from ceiling = %4d \r\n Head distance from floor =%d \r\n", + head_distance_from_ceiling, head_height_level_from_floor); +#endif + /* state tree */ +#if 0 + APP_LOG(TS_OFF, VLEVEL_M,"\r\n factor1_floor_level_from_ceiling=%d mm\r\n, \r\nFactor2 (factor2_head_level_from_floor)=%d \r\n Min body height=%d cm\r\n", + factor1_floor_level_from_ceiling, factor2_head_level_from_floor, fhmos_cfg.th_fall_body_min_height_cm); + +#endif + APP_LOG(TS_OFF, VLEVEL_M, "\r\nBodyLow=%d < Obj: %d > Head_Max=%d\r\n", 10*fhmos_cfg.th_fall_body_min_height_cm, head_height_level_from_floor, (10*fhmos_cfg.th_head_level_height_cm)); + if ((head_distance_from_ceiling <= factor1_floor_level_from_ceiling) && ((head_height_level_from_floor) <= (10*fhmos_cfg.th_head_level_height_cm)) && (head_height_level_from_floor >= (10*fhmos_cfg.th_fall_body_min_height_cm ))) { - APP_LOG(TS_OFF, VLEVEL_M,"\r\n YELLOW OR RED (head from ceiling) =%d (mm)\r\n Head from floor (mm) \r\n", head_distance_from_ceiling, (sts_sensor_install_height - head_distance_from_ceiling)); + APP_LOG(TS_OFF, VLEVEL_M,"\r\n YELLOW/RED state: (head level from floor=%d (mm)\r\n", head_height_level_from_floor); sts_head_level_low = 1; @@ -685,6 +754,12 @@ void STS_FHMOS_sensor_read(sts_fhmos_sensor_data_t *sts_data) sts_data->time_stamp_fall_confirmed = fhmos_data.time_stamp_fall_confirmed; sts_data->time_stamp_motionless_confirmed = fhmos_data.time_stamp_motionless_confirmed; sts_data->time_stamp_overstay_confirmed = fhmos_data.time_stamp_overstay_confirmed; + sts_data->time_stamp_fall_released = fhmos_data.time_stamp_fall_released; + sts_data->time_stamp_overstay_released = fhmos_data.time_stamp_overstay_released; + sts_data->time_stamp_motionless_released= fhmos_data.time_stamp_motionless_released; + sts_data->state_fall_released = fhmos_data.state_fall_released; + sts_data->state_occupancy_released = fhmos_data.state_occupancy_released; + sts_data->state_human_movement_released = fhmos_data.state_human_movement_released; sts_data->lamp_bar_color = sts_lamp_bar_color; sts_data->state_hall_1 = sts_hall1_read;