From 53eef4569b618499bd9bf62fbcec5d4ffbc9aab9 Mon Sep 17 00:00:00 2001 From: YunHorn Technology Date: Sun, 3 Nov 2024 18:08:44 +0800 Subject: [PATCH] wip --- STM32CubeIDE/Release/WLE5CC_NODE_STS.elf | Bin 159408 -> 159648 bytes STS/Core/Inc/yunhorn_sts_prd_conf.h | 4 +- STS/Core/Inc/yunhorn_sts_sensors.h | 4 +- STS/Core/Src/yunhorn_sts_process.c | 71 +++++++-- STS/TOF/App/app_tof_peoplecount.c | 181 +++++++++++++++-------- STS/TOF/App/app_tof_peoplecount.h | 17 ++- 6 files changed, 200 insertions(+), 77 deletions(-) diff --git a/STM32CubeIDE/Release/WLE5CC_NODE_STS.elf b/STM32CubeIDE/Release/WLE5CC_NODE_STS.elf index d6cdfe95d80066b83e5111a4d83cd084c2826eab..812681e82ecd41f1fc14ab7c0bd4cb4aa7f4713a 100644 GIT binary patch delta 47383 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 O+jWjdkD#>b-~R!5>OgY< diff --git a/STS/Core/Inc/yunhorn_sts_prd_conf.h b/STS/Core/Inc/yunhorn_sts_prd_conf.h index be73bb6..59ecd04 100644 --- a/STS/Core/Inc/yunhorn_sts_prd_conf.h +++ b/STS/Core/Inc/yunhorn_sts_prd_conf.h @@ -369,7 +369,9 @@ enum sts_lamp_color { */ #define STS_CONFIG_NVM_BASE_ADDRESS FLASH_USER_START_ADDR -#define STS_CONFIG_NVM_CONFIG_SIZE FLASH_USER_CONFIG_SIZE +#define STS_CONFIG_NVM_CONFIG_SIZE FLASH_USER_CONFIG_SIZE +#define STS_SENSOR_DATA_NVM_BASE_ADDRESS ((void *) 0x0803F000U) // Last 4kB of flash +#define STS_SENSOR_DATA_NVM_SIZE ((void *) 0x000007FFU) //0x400=1KB=1024 /*---------------------------------------------------------------------------*/ /* LoRaWAN NVM configuration */ /*---------------------------------------------------------------------------*/ diff --git a/STS/Core/Inc/yunhorn_sts_sensors.h b/STS/Core/Inc/yunhorn_sts_sensors.h index 4fa99cb..8dc2ce4 100644 --- a/STS/Core/Inc/yunhorn_sts_sensors.h +++ b/STS/Core/Inc/yunhorn_sts_sensors.h @@ -238,7 +238,9 @@ void OnStoreSTSCFGContextRequest(void); /** * @brief Read config from flash */ -void OnRestoreSTSCFGContextRequest(uint8_t *cfg_in_nvm); +void OnRestoreSTSCFGContextRequest(void *cfg_in_nvm); + +void OnRestoreSTSLOGContextRequest(void *log_in_nvm); void STS_REBOOT_CONFIG_Init(void); diff --git a/STS/Core/Src/yunhorn_sts_process.c b/STS/Core/Src/yunhorn_sts_process.c index 392b9a9..1a8c6ba 100644 --- a/STS/Core/Src/yunhorn_sts_process.c +++ b/STS/Core/Src/yunhorn_sts_process.c @@ -47,8 +47,10 @@ #if defined(STS_P2)||defined(STS_T6) #include "app_tof.h" #include "app_tof_peoplecount.h" +extern volatile sts_people_count_sensor_data_t *sts_people_count_sensor_data; extern volatile uint8_t sts_door_jam_profile; extern volatile uint8_t sts_tof_presence_state_changed; +extern volatile sts_ppc_cfg_type_t ppc_cfg[]; #elif defined(L8) #include "app_tof.h" #endif @@ -71,6 +73,11 @@ volatile sts_cfg_nvm_t sts_cfg_nvm = { 0x00, //sts_ioc_mask 0x20, //32 bytes, below start of p[0] 20 BYTES AND 12 BYTES FALL DOWN CFG { // below 20 bytes +#ifdef STS_P2 + 0x0,0x8,0x10,0x0,0x3,0x8,0x21,0x1,0xaf,0xe7, //current work config profile short + 0x1,0x8,0x10,0x0,0x3,0x8,0x21,0x1,0xaf,0xe7, //current work config profile long, after measured distance + // change the max distance, min distance, SPAD, front center and back center, etc. +#else 0x08, //start_m [8]*0.1 meter =0.8 0x19, //lenght_m 0x19=[25]*0.1=2.5f meter 0x0F, //threshold 0X0F=[15]*0.1=1.5f @@ -91,6 +98,7 @@ volatile sts_cfg_nvm_t sts_cfg_nvm = { 0x00, //reserve --P[17] 0x00, //reserve --P[18] 0x00, //reserve --P[19] +#endif }, // above 20 bytes 0x00, //reserve2 0x00, //reserve3 @@ -137,7 +145,7 @@ extern volatile int sts_tof_distance_data[MAX_TOF_COUNT]; volatile sts_tof_range_data_t sts_range_sensor_data={0x0,0x0,0x0}; #endif #if defined(STS_P2)||defined(STS_T6) -volatile uint8_t sts_door_jam_profile = 0; +volatile uint8_t sts_door_jam_profile = DOOR_JAM_2400; #endif #ifdef STS_R4 volatile uint8_t sts_soap_level_state=0; @@ -647,6 +655,22 @@ void USER_APP_Parse_CMD_P(uint8_t *parse_buffer, uint8_t parse_buffer_size) break; case 12: break; + case 13: + for (uint8_t i=0; i<10; i++) { + sts_cfg_nvm.p[i] = (uint8_t)parse_buffer[CFG_CMD4+i]; + } + + ppc_cfg[parse_buffer[CFG_CMD4]].distance_array_size = (uint8_t)parse_buffer[CFG_CMD4+1]; + ppc_cfg[parse_buffer[CFG_CMD4]].max_distance = (uint8_t)parse_buffer[CFG_CMD4+2]; + ppc_cfg[parse_buffer[CFG_CMD4]].min_distance = (uint8_t)parse_buffer[CFG_CMD4+3]; + ppc_cfg[parse_buffer[CFG_CMD4]].dist_threshold = (uint8_t)parse_buffer[CFG_CMD4+4]; + ppc_cfg[parse_buffer[CFG_CMD4]].rows_of_SPADS = (uint8_t)parse_buffer[CFG_CMD4+5]; + ppc_cfg[parse_buffer[CFG_CMD4]].timing_budget = (uint8_t)parse_buffer[CFG_CMD4+6]; + ppc_cfg[parse_buffer[CFG_CMD4]].distance_mode = (uint8_t)parse_buffer[CFG_CMD4+7]; + ppc_cfg[parse_buffer[CFG_CMD4]].front_zone_center = (uint8_t)parse_buffer[CFG_CMD4+8]; + ppc_cfg[parse_buffer[CFG_CMD4]].back_zone_center = (uint8_t)parse_buffer[CFG_CMD4+9]; + break; + default: break; } @@ -1084,6 +1108,7 @@ void USER_APP_AUTO_RESPONDER_Parse(uint8_t *parse_buffer, uint8_t parse_buffer_s break; case 'M': /* "YZM": Mask level */ i = 0; + outbuf[i++] = (uint8_t)'Y'; outbuf[i++] = (uint8_t)'M'; outbuf[i++] = (uint8_t)sts_service_mask; outbuf[i++] = (uint8_t)sts_work_mode; @@ -1169,6 +1194,17 @@ void USER_APP_AUTO_RESPONDER_Parse(uint8_t *parse_buffer, uint8_t parse_buffer_s STS_SENSOR_Upload_Message(YUNHORN_STS_USER_APP_CTRL_REPLY_PORT, i, (uint8_t *)outbuf); break; + case 'M': + uint8_t log_in_nvm[YUNHORN_STS_MAX_NVM_CFG_SIZE]={0x0}; + OnRestoreSTSLOGContextRequest((void*)&log_in_nvm); + i=0; + outbuf[0] = 0x4D; // 'M' for MEM IN FLASH + UTIL_MEM_cpy_8(outbuf+1, log_in_nvm,32); + i=33; + STS_SENSOR_Upload_Message(YUNHORN_STS_USER_APP_CTRL_REPLY_PORT, i, (uint8_t *)outbuf); + + break; + default: break; } @@ -1252,8 +1288,12 @@ void USER_APP_AUTO_RESPONDER_Parse(uint8_t *parse_buffer, uint8_t parse_buffer_s APP_LOG(TS_OFF,VLEVEL_M, "\nSTS Tx Periodicty changed to %u sec\n\r", STS_TxPeriod_sec); #ifdef STS_R4 OnYunhornSTSTxPeriodicityChanged(STS_TxPeriod_sec*1000); -#elif defined(STS_R1D)||defined(STS_R1)||defined(STS_R5)||defined(STS_P2)||defined(STS_O6T)||defined(STS_R2)||defined(STS_R3)||defined(STS_R6)||defined(STS_O5)||defined(STS_M1) +#elif defined(STS_R1D)||defined(STS_R1)||defined(STS_R5)||defined(STS_O6T)||defined(STS_R2)||defined(STS_R3)||defined(STS_R6)||defined(STS_O5)||defined(STS_M1) OnYunhornSTSTxPeriodicityChanged(STS_TxPeriod_sec*1000); +#elif defined(STS_P2) + OnYunhornSTSTxPeriodicityChanged(STS_TxPeriod_sec*1000); + sts_people_count_sensor_data->Count_Period = (uint8_t)((tlv_buf[CFG_CMD3]-0x30)*10+ (tlv_buf[CFG_CMD4]-0x30)); + sts_people_count_sensor_data->Count_Period_Unit = (uint8_t)tlv_buf[CFG_CMD5]; #elif defined(STS_O6)||defined(STS_O7) OnYunhornSTSHeartBeatPeriodicityChanged(periodicity_length); #endif @@ -1551,7 +1591,7 @@ void OnStoreSTSCFGContextRequest(void) /* USER CODE END OnStoreContextRequest_Last */ } -void OnRestoreSTSCFGContextRequest(uint8_t *cfg_in_nvm) +void OnRestoreSTSCFGContextRequest(void *cfg_in_nvm) { /* USER CODE BEGIN OnRestoreSTSCFGContextRequest_1 */ @@ -1562,6 +1602,16 @@ void OnRestoreSTSCFGContextRequest(uint8_t *cfg_in_nvm) /* USER CODE END OnRestoreSTSCFGContextRequest_Last */ } +void OnRestoreSTSLOGContextRequest(void *log_in_nvm) +{ + /* USER CODE BEGIN OnRestoreSTSCFGContextRequest_1 */ + + /* USER CODE END OnRestoreSTSCFGContextRequest_1 */ + UTIL_MEM_cpy_8((void*)log_in_nvm, (void *)STS_SENSOR_DATA_NVM_BASE_ADDRESS, YUNHORN_STS_MAX_NVM_CFG_SIZE); + /* USER CODE BEGIN OnRestoreSTSCFGContextRequest_Last */ + + /* USER CODE END OnRestoreSTSCFGContextRequest_Last */ +} void STS_REBOOT_CONFIG_Init(void) { @@ -1672,6 +1722,8 @@ void OnRestoreSTSCFGContextProcess(void) #ifdef STS_P2 STS_TxPeriod_sec = periodicity; STS_HeartBeatTimerPeriod_sec = sampling_heartbeat_periodicity; + sts_people_count_sensor_data->Count_Period = sts_cfg_nvm.periodicity; + sts_people_count_sensor_data->Count_Period_Unit = sts_cfg_nvm.unit; #endif @@ -1795,21 +1847,22 @@ void STS_SENSOR_Function_Test_Process(void) if ((sts_sensor_install_height >= 1500)&&(sts_sensor_install_height<=4000)) { - sts_door_jam_profile = DOOR_JAM_2000; // DOOR_JAM_2000: assume door_jame less 2000mm + sts_door_jam_profile = DOOR_JAM_1600; // assume door_jame less 1600mm profile =1 - if (sts_sensor_install_height >= 2000) - sts_door_jam_profile ++; //DOOR_JAM_2400 + if (sts_sensor_install_height >= 1600) + sts_door_jam_profile ++; //DOOR_JAM_2400, profile =2 if (sts_sensor_install_height >= 2400) - sts_door_jam_profile ++; //DOOR_JAM_3000 + sts_door_jam_profile ++; //DOOR_JAM_3000, profile =3 if (sts_sensor_install_height >= 3000) - sts_door_jam_profile ++; //DOOR_JAM_3500 + sts_door_jam_profile ++; //DOOR_JAM_3500, profile = 4 if (sts_sensor_install_height >= 3500) - sts_door_jam_profile ++; //DOOR_JAM_4000 + sts_door_jam_profile ++; //DOOR_JAM_4000, profile = 5 APP_LOG(TS_OFF, VLEVEL_M, "\r\nDOOR JAM PROFILE=%d \r\n", sts_door_jam_profile); } + #endif #ifdef YUNHORN_STS_O6_ENABLED tstbuf[i++] = (uint8_t)20; //length of following data diff --git a/STS/TOF/App/app_tof_peoplecount.c b/STS/TOF/App/app_tof_peoplecount.c index f4df1e1..b51bd60 100644 --- a/STS/TOF/App/app_tof_peoplecount.c +++ b/STS/TOF/App/app_tof_peoplecount.c @@ -5,6 +5,8 @@ /* USER CODE BEGIN Includes */ #include "yunhorn_sts_sensors.h" #include "app_tof_peoplecount.h" +#include "flash_if.h" +#include "stm32_mem.h" #ifdef STS_P2 #include "VL53L1X_API.h" #include "VL53l1X_calibration.h" @@ -19,22 +21,19 @@ extern I2C_HandleTypeDef hi2c2; volatile sts_people_count_sensor_data_t sts_people_count_sensor_data={0,0,0,2,'M',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}; extern volatile uint32_t STS_TOFScanPeriod_sec, STS_TxPeriod_sec, STS_HeartBeatTimerPeriod_sec; extern volatile sts_cfg_nvm_t sts_cfg_nvm; +extern volatile uint8_t nvm_store_value[]; volatile uint8_t sts_tof_presence_state=0, sts_tof_presence_state_changed=0; /* TIMING_BUDGET, in ms possible values [15, 20, 50, 100, 200, 500] */ /* DISTANCE_THRESHOLD = MAX - ASSUME_CHILD_HEIGHT(800mm) */ +// door jam profile volatile sts_ppc_cfg_type_t ppc_cfg[6] = { - {DOOR_JAM_2000, 8, 2000,0,1600,8,33,DISTANCE_MODE_SHORT,175,247}, - {DOOR_JAM_2000, 8, 2000,0,1600,8,33,DISTANCE_MODE_SHORT,175,247}, - {DOOR_JAM_2400, 10, 2400,0,1600,8,33,DISTANCE_MODE_LONG,175,231}, -/* - {DOOR_JAM_2000, 16, 2000,0, 1200,16, tbms_33,DISTANCE_MODE_LONG,199,199}, - {DOOR_JAM_2400, 10, 2400,0, 1600,8, tbms_50,DISTANCE_MODE_LONG,175,231}, - {DOOR_JAM_3000, 10, 3000,0, 2200,8,tbms_100,DISTANCE_MODE_LONG,175,231}, - {DOOR_JAM_3500, 10, 3500,0, 2700,8,tbms_100,DISTANCE_MODE_LONG,175,231}, - {DOOR_JAM_4000, 10, 4000,0, 3200,8,tbms_200,DISTANCE_MODE_LONG,175,231}, - {DOOR_SIDE_1600, 8, 1600,0, 300,8, tbms_33,DISTANCE_MODE_SHORT,175,231}, -*/ + {DOOR_SIDE_1300,10, 1300,0, 1200,8,33, DISTANCE_MODE_SHORT,175,231}, + {DOOR_JAM_1600, 10, 1600,0, 1300,8,33, DISTANCE_MODE_SHORT,175,231}, + {DOOR_JAM_2400, 10, 2400,0, 1600,8,33, DISTANCE_MODE_LONG,175,231}, + {DOOR_JAM_3000, 10, 3000,0, 2200,8,100,DISTANCE_MODE_LONG,175,231}, + {DOOR_JAM_3500, 10, 3500,0, 2700,8,100,DISTANCE_MODE_LONG,175,231}, + {DOOR_JAM_4000, 10, 4000,0, 3200,8,200,DISTANCE_MODE_LONG,175,231}, }; volatile sts_zone_center_by_rows_of_spads_t zone_center[4]={ {4, 151, 247}, @@ -50,8 +49,8 @@ volatile uint8_t sts_distance_mode = DOOR_JAM_2400; //DOOR_JAM_2400; //sts_door_ #endif #if (defined(STS_P2)) volatile uint8_t sts_people_count_number_changed = 0; -static uint32_t cnt_today=0, cnt_week=0; -static uint8_t last_year=0, this_year=0,last_month=0, this_month=0,last_week=0, this_week=0,last_day=0, this_day=0; +static uint32_t cnt_today=0, cnt_day=0, cnt_week=0, cnt_month=0, cnt_year=0; +//static uint8_t last_year=0, this_year=0,last_month=0, this_month=0,last_week=0, this_week=0,last_day=0, this_day=0; #endif uint16_t dev=0x52; extern uint16_t sensor_id; @@ -60,7 +59,8 @@ volatile int IntCount; #define isInterrupt 1 /* If isInterrupt = 1 then device working in interrupt mode, else device working in polling mode */ /* USER CODE END PV */ static int PplCounter; -static int center[2] = {FRONT_ZONE_CENTER,BACK_ZONE_CENTER}; //{ppc_cfg[sts_distance_mode].front_zone_center, ppc_cfg[sts_distance_mode].back_zone_center}; /* these are the spad center of the 2 4*16 zones */ +static int center[2] = {FRONT_ZONE_CENTER,BACK_ZONE_CENTER}; + static int Zone = 0; static int PathTrack[] = {0,0,0,0}; static int PathTrackFillingSize = 1; // init this to 1 as we start from state where nobody is any of the zones @@ -265,14 +265,14 @@ int ProcessPeopleCountingData(int16_t Distance, uint8_t zone, uint8_t RangeStatu int AnEventHasOccured = 0; // Add just picked distance to the table of the corresponding zone - if (DistancesTableSize[zone] < ppc_cfg[sts_distance_mode].distance_array_size) { + if (DistancesTableSize[zone] < ppc_cfg[sts_door_jam_profile].distance_array_size) { Distances[zone][DistancesTableSize[zone]] = Distance; DistancesTableSize[zone] ++; } else { - for (i=1; iSOMEONE IN"); @@ -429,8 +429,8 @@ void STS_people_count_sensor_Read(sts_people_count_sensor_data_t *sts_p2_sensor_ sts_p2_sensor_data->Walk_In_People_Count = sts_people_count_sensor_data.Walk_In_People_Count; sts_p2_sensor_data->Walk_Out_People_Count = sts_people_count_sensor_data.Walk_Out_People_Count; sts_p2_sensor_data->Walk_Around_People_Count = sts_people_count_sensor_data.Walk_Around_People_Count; - sts_p2_sensor_data->Count_Period = sts_people_count_sensor_data.Count_Period; - sts_p2_sensor_data->Count_Period_Unit = sts_people_count_sensor_data.Count_Period_Unit; + sts_p2_sensor_data->Count_Period = sts_cfg_nvm.periodicity; //sts_people_count_sensor_data.Count_Period; + sts_p2_sensor_data->Count_Period_Unit = sts_cfg_nvm.unit; //sts_people_count_sensor_data.Count_Period_Unit; // Sum Day counting // if not end of day --- @@ -506,40 +506,80 @@ void STS_people_count_sensor_Read(sts_people_count_sensor_data_t *sts_p2_sensor_ sts_people_count_sensor_data.Walk_Around_People_Count = 0; } - if (cnt_today ==0) + //if (cnt_today ==0) { // new day, then check week/month/year, not check every time // reset counter at end of day TODO XXX - if (last_day != this_day) { - cnt_today = 0; - + cnt_day ++; + if (cnt_day >=7) { + cnt_day = 0; sts_people_count_sensor_data.Sum_Day_Walk_In_People_Count = 0; sts_people_count_sensor_data.Sum_Day_Walk_Out_People_Count = 0; sts_people_count_sensor_data.Sum_Day_Walk_Around_People_Count = 0; - } - if (cnt_week) - // reset counter at end of week TODO XXX - if (last_week != this_week) { + cnt_week++; + if (cnt_week >= 4 ) { + cnt_week =0; + sts_people_count_sensor_data.Sum_Week_Walk_In_People_Count = 0; + sts_people_count_sensor_data.Sum_Week_Walk_Out_People_Count = 0; + sts_people_count_sensor_data.Sum_Week_Walk_Around_People_Count = 0; - sts_people_count_sensor_data.Sum_Week_Walk_In_People_Count = 0; - sts_people_count_sensor_data.Sum_Week_Walk_Out_People_Count = 0; - sts_people_count_sensor_data.Sum_Week_Walk_Around_People_Count = 0; + cnt_month++; + if (cnt_month >=12) { + cnt_month =0; + + sts_people_count_sensor_data.Sum_Month_Walk_In_People_Count = 0; + sts_people_count_sensor_data.Sum_Month_Walk_Out_People_Count = 0; + sts_people_count_sensor_data.Sum_Month_Walk_Around_People_Count = 0; + + cnt_year++; + sts_people_count_sensor_data.Sum_Year_Walk_In_People_Count = 0; + sts_people_count_sensor_data.Sum_Year_Walk_Out_People_Count = 0; + sts_people_count_sensor_data.Sum_Year_Walk_Around_People_Count = 0; + } + } } - // reset counter at end of month TODO XXX - if (last_month != this_month) { + uint16_t sts_p2_data_to_nvm[32] ={0x0}, pp =0; + // OnRestoreSTSLOGContextRequest((void*)sts_p2_data_to_nvm); + // TODO XXX, better read the data in flash and then add up today's data + // TODO XXX - sts_people_count_sensor_data.Sum_Month_Walk_In_People_Count = 0; - sts_people_count_sensor_data.Sum_Month_Walk_Out_People_Count = 0; - sts_people_count_sensor_data.Sum_Month_Walk_Around_People_Count = 0; - } + sts_p2_data_to_nvm[pp++] = sts_people_count_sensor_data.Sum_Day_Walk_In_People_Count; + sts_p2_data_to_nvm[pp++] = sts_people_count_sensor_data.Sum_Day_Walk_Out_People_Count; + sts_p2_data_to_nvm[pp++] = sts_people_count_sensor_data.Sum_Day_Walk_Around_People_Count; - if (last_year != this_year) { + sts_p2_data_to_nvm[pp++] = sts_people_count_sensor_data.Sum_Week_Walk_In_People_Count; + sts_p2_data_to_nvm[pp++] = sts_people_count_sensor_data.Sum_Week_Walk_Out_People_Count; + sts_p2_data_to_nvm[pp++] = sts_people_count_sensor_data.Sum_Week_Walk_Around_People_Count; + + sts_p2_data_to_nvm[pp++] = sts_people_count_sensor_data.Sum_Month_Walk_In_People_Count; + sts_p2_data_to_nvm[pp++] = sts_people_count_sensor_data.Sum_Month_Walk_Out_People_Count; + sts_p2_data_to_nvm[pp++] = sts_people_count_sensor_data.Sum_Month_Walk_Around_People_Count; + + + sts_p2_data_to_nvm[pp++] = sts_people_count_sensor_data.Sum_Year_Walk_In_People_Count; + sts_p2_data_to_nvm[pp++] = sts_people_count_sensor_data.Sum_Year_Walk_Out_People_Count; + sts_p2_data_to_nvm[pp++] = sts_people_count_sensor_data.Sum_Year_Walk_Around_People_Count; + + sts_p2_data_to_nvm[pp++] = sts_people_count_sensor_data.Sum_LifeCycle_Walk_In_People_Count; + sts_p2_data_to_nvm[pp++] = sts_people_count_sensor_data.Sum_LifeCycle_Walk_Out_People_Count; + sts_p2_data_to_nvm[pp++] = sts_people_count_sensor_data.Sum_LifeCycle_Walk_Around_People_Count; +/* + APP_LOG(TS_OFF, VLEVEL_M, "\n-----------------------------------------------\n"); + APP_LOG(TS_OFF, VLEVEL_M, "\n00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15\n"); + for (uint8_t i=0; i