From 5aed732764e1e4990570fd43b3016ff8ff99bf87 Mon Sep 17 00:00:00 2001 From: YunHorn Technology Date: Sat, 2 Nov 2024 21:05:55 +0800 Subject: [PATCH] wip, not good --- STM32CubeIDE/Release/WLE5CC_NODE_STS.elf | Bin 159960 -> 159456 bytes STS/Core/Src/yunhorn_sts_process.c | 33 ++++++++++---- STS/TOF/App/app_tof.c | 10 +++-- STS/TOF/App/app_tof_peoplecount.c | 52 ++++++++++++++++++++--- STS/TOF/App/app_tof_peoplecount.h | 1 + 5 files changed, 80 insertions(+), 16 deletions(-) diff --git a/STM32CubeIDE/Release/WLE5CC_NODE_STS.elf b/STM32CubeIDE/Release/WLE5CC_NODE_STS.elf index 35a1ed080996d27b919e70c36177cd063e31a187..3c0989b8bffb33c94179f69c32d99c1cbedd3f0a 100644 GIT binary patch delta 43755 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 z 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 ZNQrV diff --git a/STS/Core/Src/yunhorn_sts_process.c b/STS/Core/Src/yunhorn_sts_process.c index 31a25e6..78cfb0c 100644 --- a/STS/Core/Src/yunhorn_sts_process.c +++ b/STS/Core/Src/yunhorn_sts_process.c @@ -1041,6 +1041,7 @@ void USER_APP_AUTO_RESPONDER_Parse(uint8_t *parse_buffer, uint8_t parse_buffer_s //OnSystemReset(); break; case 'S': /* "YZS": Self Function Testing */ + STS_SENSOR_Function_Test_Process(); break; @@ -1067,14 +1068,16 @@ void USER_APP_AUTO_RESPONDER_Parse(uint8_t *parse_buffer, uint8_t parse_buffer_s outbuf[i++] = (uint8_t)sts_version; outbuf[i++] = (uint8_t)sts_hardware_ver; outbuf[i++] = (uint8_t)(99*((GetBatteryLevel()/254)&0xff)); - outbuf[i++] = (uint8_t)(4); //four bytes for distance + outbuf[i++] = (uint8_t)(2); //two bytes for distance #if defined(VL53LX)||defined(VL53L0) +#if 0 outbuf[i++] = (uint8_t)(sts_sensor_install_height/1000+0x30)&0xff; outbuf[i++] = (uint8_t)((sts_sensor_install_height/100)%10+0x30)&0xff; outbuf[i++] = (uint8_t)((sts_sensor_install_height/10)%10+0x30)&0xff; outbuf[i++] = (uint8_t)((sts_sensor_install_height/1)%10+0x30)&0xff; - //outbuf[i++] = (uint8_t)(sts_sensor_install_height>>8)&0xFF; - //outbuf[i++] = (uint8_t)(sts_sensor_install_height)&0xFF; +#endif + outbuf[i++] = (uint8_t)(sts_sensor_install_height>>8)&0xFF; + outbuf[i++] = (uint8_t)(sts_sensor_install_height)&0xFF; #endif STS_SENSOR_Upload_Message(YUNHORN_STS_USER_APP_CTRL_REPLY_PORT, i, (uint8_t *)outbuf); @@ -1732,8 +1735,12 @@ void STS_SENSOR_Distance_Test_Process(void) #if defined(VL53LX)||defined(L8) //MX_TOF_Init(); //MX_TOF_Process(); - sts_sensor_install_height = (uint16_t)MX_TOF_Ranging_Process(); + int status=0; + uint16_t range_distance =0; + status = sts_tof_vl53lx_range_distance(&range_distance); + sts_sensor_install_height = range_distance; APP_LOG(TS_OFF, VLEVEL_M, "\n STS SENSOR INSTALLATION HEIGHT =%d mm\n\r", (uint16_t)sts_sensor_install_height); + #endif #if defined(VL53L0) STS_TOF_VL53L0X_Range_Process(); @@ -1762,14 +1769,20 @@ void STS_SENSOR_Function_Test_Process(void) tstbuf[i++] = (uint8_t) (99*GetBatteryLevel()/254)&0xff; #if (defined(STS_P2)||defined(STS_T6)) - STS_SENSOR_MEMS_Get_ID(&sensor_id); + //STS_SENSOR_MEMS_Get_ID(&sensor_id); + + APP_LOG(TS_OFF, VLEVEL_M, "\r\nSensor_id=%04x\r\n", sensor_id); if (((sensor_id & 0xff)!= 0xCC) && (((sensor_id >>8) & 0xFF)!=0xEA)) // no VL53L1X found { tstbuf[i++] = (uint8_t) 'X'; // Slave MEMS Not Avaliable } else { - STS_SENSOR_Distance_Test_Process(); + //STS_SENSOR_Distance_Test_Process(); + int status=0; + uint16_t range_distance =0; + status = sts_tof_vl53lx_range_distance(&range_distance); + sts_sensor_install_height = range_distance; APP_LOG(TS_OFF, VLEVEL_M, "\nSensor Install Height =%4d mm\n", sts_sensor_install_height); tstbuf[i++] = (uint8_t) (2)&0xff; //length of following data tstbuf[i++] = (uint8_t) (sts_sensor_install_height>>8)&0xff; // MSB of sensor height @@ -1785,12 +1798,16 @@ void STS_SENSOR_Function_Test_Process(void) if (sts_sensor_install_height >= 2000) sts_door_jam_profile ++; //DOOR_JAM_2400 + if (sts_sensor_install_height >= 2400) sts_door_jam_profile ++; //DOOR_JAM_3000 + if (sts_sensor_install_height >= 3000) sts_door_jam_profile ++; //DOOR_JAM_3500 + if (sts_sensor_install_height >= 3500) sts_door_jam_profile ++; //DOOR_JAM_4000 + APP_LOG(TS_OFF, VLEVEL_M, "\r\nDOOR JAM PROFILE=%d \r\n", sts_door_jam_profile); } #endif #ifdef YUNHORN_STS_O6_ENABLED @@ -1817,8 +1834,8 @@ void STS_SENSOR_Function_Test_Process(void) #endif //MX_TOF_Process(); #ifdef STS_P2 - MX_TOF_Init(); - MX_TOF_Ranging_Process(); + //MX_TOF_Init(); + //MX_TOF_Ranging_Process(); #endif #ifdef VL53L0 PME_ON; diff --git a/STS/TOF/App/app_tof.c b/STS/TOF/App/app_tof.c index 226a4d3..601d9ba 100644 --- a/STS/TOF/App/app_tof.c +++ b/STS/TOF/App/app_tof.c @@ -134,7 +134,7 @@ uint16_t MX_TOF_Ranging_Process(void) #if (defined(STS_P2)||defined(STS_T6)) uint16_t range_distance=0; - uint8_t range_mode = 2; //STS_TOF_LONG_RANGE; + uint8_t range_mode = STS_TOF_LONG_RANGE; //STS_TOF_LONG_RANGE; STS_TOF_VL53LX_Range_Process(range_mode, &range_distance); APP_LOG(TS_OFF, VLEVEL_M, "\n VL53L1 Range distance =%u mm \n\r", (uint16_t)range_distance); @@ -483,10 +483,13 @@ void BSP_PB_Callback(Button_TypeDef Button) uint8_t sts_vl53lx_ranging(uint16_t *ranged_distance, uint8_t range_mode, uint16_t distance_threshold_mm, uint16_t inter_measurement_ms, uint16_t macro_timing, uint16_t roi_width, uint16_t sigma_mm, uint16_t signal_kcps) { + uint8_t status=0, dev=0x52; + uint16_t estimated_distance_mm=0; +#if 0 uint8_t status=0, dev=0x52; uint16_t estimated_distance_mm=0; status = VL53L1X_SensorInit(dev); - status += VL53L1X_SetDistanceMode(dev, 2); /* 1=short, 2=long, DISTANCE_MODE */ + status += VL53L1X_SetDistanceMode(dev, range_mode); /* 1=short, 2=long, DISTANCE_MODE */ status += VL53L1X_SetTimingBudgetInMs(dev, 100); /* TIMING_BUDGET, in ms possible values [15, 20, 50, 100, 200, 500] */ status += VL53L1X_SetInterMeasurementInMs(dev, 50); status += VL53L1X_SetROI(dev, 8, 8); /* minimum ROI 4,4 */ @@ -499,8 +502,9 @@ uint16_t roi_width, uint16_t sigma_mm, uint16_t signal_kcps) APP_LOG(TS_OFF, VLEVEL_L,"Start Range failed\n"); return (-1); } - +#endif status = VL53L1X_GetDistance(dev, &estimated_distance_mm); + status = VL53L1X_ClearInterrupt(dev); /* clear interrupt has to be called to enable next interrupt*/ APP_LOG(TS_OFF,VLEVEL_M,"Target detected! Distance =%d mm \r\n", estimated_distance_mm ); *ranged_distance = estimated_distance_mm; status = VL53L1X_StopRanging(dev); diff --git a/STS/TOF/App/app_tof_peoplecount.c b/STS/TOF/App/app_tof_peoplecount.c index 7f58865..a1b0bfb 100644 --- a/STS/TOF/App/app_tof_peoplecount.c +++ b/STS/TOF/App/app_tof_peoplecount.c @@ -39,7 +39,7 @@ volatile sts_zone_center_by_rows_of_spads_t zone_center[4]={ extern volatile uint8_t sts_door_jam_profile; volatile uint8_t sts_presence_state=0; static int PresenceState=0, PrevPresenceState=0; -volatile uint8_t sts_distance_mode = DOOR_JAM_2400; //sts_door_jam_profile; //DOOR_JAM_3000; +volatile uint8_t sts_distance_mode = DOOR_JAM_2400; //DOOR_JAM_2400; //sts_door_jam_profile; //DOOR_JAM_3000; #endif #if (defined(STS_P2)) volatile uint8_t sts_people_count_number_changed = 0; @@ -117,12 +117,13 @@ int ProcessPresenceDetectionData(int16_t Distance, uint8_t zone, uint8_t RangeSt MinDistance = Distances[zone][i]; } } - + APP_LOG(TS_OFF, VLEVEL_M, "\r\nMin Distance =%d ", MinDistance); if (MinDistance < ppc_cfg[sts_distance_mode].dist_threshold) { // Someone is in ! CurrentZoneStatus = SOMEONE; + APP_LOG(TS_OFF, VLEVEL_M, "---> Someone is in"); } - + APP_LOG(TS_OFF, VLEVEL_M, "\r\n"); //return CurrentZoneStatus; #if 1 // left zone @@ -275,11 +276,13 @@ int ProcessPeopleCountingData(int16_t Distance, uint8_t zone, uint8_t RangeStatu MinDistance = Distances[zone][i]; } } - + APP_LOG(TS_OFF, VLEVEL_M, "\r\n MinDistance & dist_threshold ---%d %d", MinDistance,ppc_cfg[sts_distance_mode].dist_threshold); if (MinDistance < ppc_cfg[sts_distance_mode].dist_threshold) { // Someone is in ! CurrentZoneStatus = SOMEONE; + APP_LOG(TS_OFF, VLEVEL_M, ">SOMEONE IN"); } + APP_LOG(TS_OFF, VLEVEL_M, "\r\n"); // left zone if (zone == LEFT) { @@ -352,6 +355,9 @@ int ProcessPeopleCountingData(int16_t Distance, uint8_t zone, uint8_t RangeStatu APP_LOG(TS_OFF, VLEVEL_M,"Walk In, People Count=%d\n", PeopleCount); sts_people_count_sensor_data.Walk_In_People_Count ++; sts_people_count_number_changed = 1; + //LED1_ON; //TODO XXX, CHANGE TO (LED_IN_ON && LED_OUT_OFF); + LED1_TOGGLE; + } else if ((PathTrack[1] == 2) && (PathTrack[2] == 3) && (PathTrack[3] == 1)) { // This an exit PeopleCount --; @@ -360,11 +366,14 @@ int ProcessPeopleCountingData(int16_t Distance, uint8_t zone, uint8_t RangeStatu DistancesTableSize[1] = 0; APP_LOG(TS_OFF, VLEVEL_M,"Walk Out, People Count=%d\n", PeopleCount); sts_people_count_sensor_data.Walk_Out_People_Count ++; + //LED1_ON; //TODO XXX, CHANGE TO (LED_IN_OFF && LED_OUT_ON); + LED1_TOGGLE; sts_people_count_number_changed = 1; } else { // reset the table filling size also in case of unexpected path DistancesTableSize[0] = 0; DistancesTableSize[1] = 0; + APP_LOG(TS_OFF, VLEVEL_M,"Walk Around ie. Wrong path\n"); sts_people_count_sensor_data.Walk_Around_People_Count ++; } @@ -394,6 +403,7 @@ int ProcessPeopleCountingData(int16_t Distance, uint8_t zone, uint8_t RangeStatu #endif #endif } + //printf ("Inside PeopleCount = %d , returned\n", PeopleCount); // output debug data to main host machine return(PeopleCount); @@ -692,6 +702,10 @@ int sts_tof_vl53lx_peoplecount_init(void) /* Initialize and configure the device according to people counting need */ status = VL53L1X_SensorInit(dev); + sts_distance_mode = sts_door_jam_profile; + APP_LOG(TS_OFF, VLEVEL_M, "\r\n Door Jam Profile=%d, distance Mode =%d \r\n", sts_door_jam_profile, sts_distance_mode); + APP_LOG(TS_OFF, VLEVEL_M, "\r\n MaxDistance=%d, \nMinDistance=%d \ndist_threshold=%d \n timing_budget=%d \n distance_mode=%d \r\n", + ppc_cfg[sts_distance_mode].max_distance, ppc_cfg[sts_distance_mode].min_distance, ppc_cfg[sts_distance_mode].dist_threshold,ppc_cfg[sts_distance_mode].timing_budget,ppc_cfg[sts_distance_mode].distance_mode); status += VL53L1X_SetDistanceMode(dev, ppc_cfg[sts_distance_mode].distance_mode); /* 1=short, 2=long, DISTANCE_MODE */ status += VL53L1X_SetTimingBudgetInMs(dev, ppc_cfg[sts_distance_mode].timing_budget); /* TIMING_BUDGET, in ms possible values [15, 20, 50, 100, 200, 500] */ status += VL53L1X_SetInterMeasurementInMs(dev, ppc_cfg[sts_distance_mode].timing_budget); @@ -756,6 +770,7 @@ int sts_tof_vl53lx_peoplecount_start(void) if ((RangeStatus == 0) || (RangeStatus == 4) || (RangeStatus == 7)) { if (Distance <= ppc_cfg[sts_distance_mode].min_distance) //MIN_DISTANCE) // wraparound case see the explanation at the constants definition place Distance = ppc_cfg[sts_distance_mode].max_distance + ppc_cfg[sts_distance_mode].min_distance; //MAX_DISTANCE + MIN_DISTANCE; + APP_LOG(TS_OFF, VLEVEL_M, "\r\nRangeStatus=%d Distance=%d \r\n", RangeStatus, Distance); } else // severe error cases Distance = ppc_cfg[sts_distance_mode].max_distance; //MAX_DISTANCE; @@ -764,9 +779,36 @@ int sts_tof_vl53lx_peoplecount_start(void) //printf("\nPplCounter =%d \n\r", PplCounter); //sprintf(DisplayStr, "%4d", PplCounter); // only use for special EVK with display //XNUCLEO53L1A1_SetDisplayString(DisplayStr); - //APP_LOG(TS_OFF, VLEVEL_M,"%d,%d,%d\n", Zone, Distance, Signal); + //APP_LOG(TS_OFF, VLEVEL_M,"Zone, Distance, Signal = %d,%d,%d\n", Zone, Distance, Signal); Zone++; Zone = Zone%2; return 0; } +int sts_tof_vl53lx_range_distance(uint16_t *range_distance) +{ + + uint16_t wordData=0, Distance=0; + uint8_t RangeStatus; + uint8_t dataReady=0, status=0, dev=0x52; + + /* read and display data */ + + while (dataReady == 0) { + status = VL53L1X_CheckForDataReady(dev, &dataReady); + HAL_Delay(1); + wordData++; + if (wordData > 30) return -1; // 50 ms timer, so make this 60% to fail back + } + dataReady = 0; + //status += VL53L1X_GetRangeStatus(dev, &RangeStatus); + status += VL53L1X_GetDistance(dev, &Distance); + status += VL53L1X_ClearInterrupt(dev); /* clear interrupt has to be called to enable next interrupt*/ + if (status != 0) { + APP_LOG(TS_OFF, VLEVEL_L,"Error in operating the device\n"); + return (-1); + } + APP_LOG(TS_OFF, VLEVEL_M,"\r\nVL53L1X RANGE DISTANCE =%d \r\n", Distance); + *range_distance = Distance; + return status; +} diff --git a/STS/TOF/App/app_tof_peoplecount.h b/STS/TOF/App/app_tof_peoplecount.h index c5a6ed8..b84f7a6 100644 --- a/STS/TOF/App/app_tof_peoplecount.h +++ b/STS/TOF/App/app_tof_peoplecount.h @@ -172,6 +172,7 @@ int sts_tof_vl53lx_presence_detection_start(void); int sts_tof_vl53lx_peoplecount_init(void); int sts_tof_vl53lx_peoplecount_start(void); +int sts_tof_vl53lx_range_distance(uint16_t *range_distance); //int sts_tof_vl53lx_peoplecount(void);