diff --git a/Core/Inc/yunhorn_sts_sensors.h b/Core/Inc/yunhorn_sts_sensors.h index 349f490..0311907 100644 --- a/Core/Inc/yunhorn_sts_sensors.h +++ b/Core/Inc/yunhorn_sts_sensors.h @@ -742,9 +742,11 @@ void STS_SENSOR_Upload_Message(uint8_t appDataPort, uint8_t appBufferSize, uint8 void STS_SENSOR_Auto_Responder_Process(uint8_t tlv_ver,uint8_t tlv_type, uint8_t tlv_length, uint8_t *tlv_content); uint8_t STS_SENSOR_MEMS_Get_ID(uint8_t *devID); - int sts_presence_rss_presence_detection(void); int sts_presence_rss_fall_rise_detection(void); +int sts_presence_rss_fall_rise_detection_start(void); +int sts_presence_rss_fall_rise_detection_loop(void); +int sts_presence_rss_fall_rise_detection_end(void); int sts_distance_rss_detector_distance(void); int acc_example_detector_distance(int argc, char *argv[]); int acc_example_service_sparse(int argc, char *argv[]); diff --git a/Core/Src/acc_hal_integration_a111.c b/Core/Src/acc_hal_integration_a111.c index c13c274..ca6ced4 100644 --- a/Core/Src/acc_hal_integration_a111.c +++ b/Core/Src/acc_hal_integration_a111.c @@ -40,7 +40,7 @@ extern SPI_HandleTypeDef A111_SPI_HANDLE; * @brief Size of SPI transfer buffer */ #ifndef A111_SPI_MAX_TRANSFER_SIZE -#define A111_SPI_MAX_TRANSFER_SIZE 65535 //4096 //65535 +#define A111_SPI_MAX_TRANSFER_SIZE 4096//65535 //4096 //65535 #endif /** diff --git a/Core/Src/main.c b/Core/Src/main.c index 38fce5e..43d3bad 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -96,10 +96,32 @@ int main(void) MX_LoRaWAN_Init(); - /* USER CODE BEGIN 2 */ STS_Sensor_Init(); + + int ret=0; + while(1) + { + sts_presence_rss_fall_rise_detection_start(); + + do + { + ret = sts_presence_rss_fall_rise_detection_loop(); + } while(!ret); + + sts_presence_rss_fall_rise_detection_end(); + + LED1_TOGGLE; + HAL_Delay(1000); + } + + + + + /* USER CODE BEGIN 2 */ + //STS_Sensor_Init(); /* USER CODE END 2 */ - STS_Sensor_Prepare(); + //STS_Sensor_Prepare(); + STS_SENSOR_Function_Test_Process(); /* Infinite loop */ /* USER CODE BEGIN WHILE */ diff --git a/Core/Src/usart.c b/Core/Src/usart.c index 31307c5..d110d41 100644 --- a/Core/Src/usart.c +++ b/Core/Src/usart.c @@ -41,7 +41,7 @@ void MX_USART2_UART_Init(void) /* USER CODE END USART2_Init 1 */ huart2.Instance = USART2; - huart2.Init.BaudRate = 115200; + huart2.Init.BaudRate = 460800; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; diff --git a/Core/Src/yunhorn_sts_presence_rss.c b/Core/Src/yunhorn_sts_presence_rss.c index 5299007..bbdef75 100644 --- a/Core/Src/yunhorn_sts_presence_rss.c +++ b/Core/Src/yunhorn_sts_presence_rss.c @@ -65,25 +65,25 @@ #define DEFAULT_UPDATE_RATE_PRESENCE (65.0F) //(65.0f) //default 80 unit(hz) //#define DEFAULT_UPDATE_RATE_PRESENCE (80.0F) //(65.0f) //default 80 unit(hz) - +#define DEFAULT_SWEEPS_PER_FRAME (16.0F) // sweeps_per_frame #define DEFAULT_HWAAS (63) //default 10 unit(hz) #define DEFAULT_THRESHOLD (1.2f) //default 1.5 level float [3] //acc_detector_presence_configuration_filter_parameters_t #define DEFAULT_INTER_FRAME_DEVIATION_TIME_CONST (0.5f) //default 0.5 unit(seconds) [6] -#define DEFAULT_INTER_FRAME_FAST_CUTOFF (10.0f) //default 20.0 unit(hz) [8] -#define DEFAULT_INTER_FRAME_SLOW_CUTOFF (0.01f) //(0.01f) 0.2 hz unit(hz) [9] +#define DEFAULT_INTER_FRAME_FAST_CUTOFF (18.0f) // (10.0f) //default 20.0 unit(hz) [8] +#define DEFAULT_INTER_FRAME_SLOW_CUTOFF (0.17f) // (0.01f) //(0.01f) 0.2 hz unit(hz) [9] #define DEFAULT_INTRA_FRAME_TIME_CONST (0) //default 0.0 unit(seconds) #define DEFAULT_INTRA_FRAME_WEIGHT (0) //default 0.6 for normal slow tracking 1.0 for fast tracking // 2025 03 26 *** if detection toggles too often, increase the following, if too sluggish, decrease it instead //#define DEFAULT_OUTPUT_TIME_CONST (0.8f) //default 0.5 unit(seconds) [5] -#define DEFAULT_OUTPUT_TIME_CONST (0.5f) //default 0.5 unit(seconds) [5] +#define DEFAULT_OUTPUT_TIME_CONST (0.2f) // (0.5f) //default 0.5 unit(seconds) [5] //#define DEFAULT_OUTPUT_TIME_CONST (0.4f) //default 0.5 unit(seconds) [5] #define DEFAULT_NBR_REMOVED_PC (0) //default 0 int [10] -#define DEFAULT_DOWNSAMPLING_FACTOR (2) //default 1 +#define DEFAULT_DOWNSAMPLING_FACTOR (1) // (2) 20250427 //default 1 //#define DEFAULT_RECEIVER_GAIN (0.65f) //default 0.9 gain mdB [4] #define DEFAULT_RECEIVER_GAIN (0.65f) //default 0.9 gain mdB [4] @@ -149,8 +149,14 @@ volatile uint16_t sts_fall_rising_pattern_factor1=0, sts_fall_rising_pattern_fac volatile uint16_t sts_roc_acc_standard_variance=0; extern volatile uint8_t sts_presence_fall_detection; static uint8_t sts_rss_init_ok=0; -volatile uint8_t sts_presence_singularity=1; +volatile uint8_t sts_presence_singularity=0; +volatile uint16_t sts_rss_threshold; extern uint8_t sts_lamp_bar_color; +volatile acc_detector_presence_handle_t handle; +volatile acc_detector_presence_result_t result; +volatile acc_detector_presence_configuration_t presence_configuration; +bool success; +uint16_t sweeps_per_frame=16; /* USER CODE END Includes */ /* External variables ---------------------------------------------------------*/ @@ -198,8 +204,14 @@ extern uint8_t sts_lamp_bar_color; static void set_default_configuration_common(acc_detector_presence_configuration_t presence_configuration) { - acc_detector_presence_configuration_update_rate_set(presence_configuration, sts_presence_rss_config.default_update_rate_presence); + //acc_detector_presence_configuration_update_rate_set(presence_configuration, sts_presence_rss_config.default_update_rate_presence); + acc_detector_presence_configuration_update_rate_set(presence_configuration, 5); acc_detector_presence_configuration_downsampling_factor_set(presence_configuration, sts_presence_rss_config.default_downsampling_factor); + acc_detector_presence_configuration_hw_accelerated_average_samples_set(presence_configuration, DEFAULT_HWAAS); + + uint16_t sweeps_per_frame=16; + sweeps_per_frame = acc_detector_presence_configuration_sweeps_per_frame_get(presence_configuration); + acc_detector_presence_configuration_sweeps_per_frame_set(presence_configuration, sweeps_per_frame); acc_detector_presence_configuration_filter_parameters_t filter = acc_detector_presence_configuration_filter_parameters_get(presence_configuration); filter.inter_frame_deviation_time_const = DEFAULT_INTER_FRAME_DEVIATION_TIME_CONST; @@ -207,7 +219,7 @@ static void set_default_configuration_common(acc_detector_presence_configuration // will be disabled if this value > 1/2 of update rate, default update rate 65, so must < 30 filter.inter_frame_fast_cutoff = DEFAULT_INTER_FRAME_FAST_CUTOFF; filter.inter_frame_slow_cutoff = DEFAULT_INTER_FRAME_SLOW_CUTOFF; - +#if 0 // no effect if intra-frame-weight set to 0 filter.intra_frame_time_const = DEFAULT_INTRA_FRAME_TIME_CONST; // for slow movement, people sit still, rest in sofa, seat, closestool, etc. @@ -216,8 +228,14 @@ static void set_default_configuration_common(acc_detector_presence_configuration // if detection toggles too often, increase the following, if too sluggish, decrease it instead filter.output_time_const = DEFAULT_OUTPUT_TIME_CONST; //0.0f; +#endif + acc_detector_presence_configuration_filter_parameters_set(presence_configuration, &filter); + +#if 0 acc_detector_presence_configuration_nbr_removed_pc_set(presence_configuration, DEFAULT_NBR_REMOVED_PC); +#endif + acc_detector_presence_configuration_power_save_mode_set(presence_configuration, ACC_POWER_SAVE_MODE_ACTIVE); @@ -230,13 +248,14 @@ static void set_default_configuration(acc_detector_presence_configuration_t pres acc_detector_presence_configuration_detection_threshold_set(presence_configuration, DEFAULT_THRESHOLD); // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //acc_service_sparse_configuration_sweeps_per_frame_set(sparse_configuration, sweeps_per_frame); + //acc_service_sparse_configuration_sweeps_per_frame_set(sparse_configuration, DEFAULT_SWEEPS_PER_FRAME); acc_detector_presence_configuration_start_set(presence_configuration, DEFAULT_START_M); acc_detector_presence_configuration_length_set(presence_configuration, DEFAULT_LENGTH_M); acc_detector_presence_configuration_downsampling_factor_set(presence_configuration, DEFAULT_DOWNSAMPLING_FACTOR); acc_detector_presence_configuration_receiver_gain_set(presence_configuration, DEFAULT_RECEIVER_GAIN); - set_default_configuration_common(presence_configuration); + //set_default_configuration_common(presence_configuration); // by set_default_configuration_common #if 0 @@ -276,6 +295,8 @@ static void set_default_fall_rise_configuration(acc_detector_presence_configurat // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //acc_service_sparse_configuration_sweeps_per_frame_set(sparse_configuration, sweeps_per_frame); + acc_detector_presence_configuration_sweeps_per_frame_set(presence_configuration, DEFAULT_SWEEPS_PER_FRAME); + acc_detector_presence_configuration_start_set(presence_configuration, DEFAULT_START_M); acc_detector_presence_configuration_length_set(presence_configuration, DEFAULT_LENGTH_M); acc_detector_presence_configuration_downsampling_factor_set(presence_configuration, DEFAULT_DOWNSAMPLING_FACTOR); @@ -315,6 +336,8 @@ static void sts_rss_set_current_configuration_full(acc_detector_presence_configu acc_detector_presence_configuration_update_rate_set(presence_configuration, sts_presence_rss_config.default_update_rate_presence); //DEFAULT_UPDATE_RATE_2); acc_detector_presence_configuration_detection_threshold_set(presence_configuration, sts_presence_rss_config.default_threshold);//DEFAULT_DETECTION_THRESHOLD_2); + acc_detector_presence_configuration_sweeps_per_frame_set(presence_configuration, DEFAULT_SWEEPS_PER_FRAME); + acc_detector_presence_configuration_start_set(presence_configuration, sts_presence_rss_config.default_start_m); acc_detector_presence_configuration_length_set(presence_configuration, sts_presence_rss_config.default_length_m); //DEFAULT_LENGTH_M_2); @@ -349,6 +372,8 @@ static void sts_rss_set_configuration_background_evalution(acc_detector_presence acc_detector_presence_configuration_sensor_set(presence_configuration, DEFAULT_SENSOR_ID); acc_detector_presence_configuration_service_profile_set(presence_configuration, sts_presence_rss_config.default_profile); + acc_detector_presence_configuration_sweeps_per_frame_set(presence_configuration, DEFAULT_SWEEPS_PER_FRAME); + acc_detector_presence_configuration_start_set(presence_configuration, ((float)sts_sensor_install_height/2000.0)); acc_detector_presence_configuration_length_set(presence_configuration, ((float)(sts_sensor_install_height)/1000.0)); acc_detector_presence_configuration_detection_threshold_set(presence_configuration, (float)300.0/1000.0); @@ -360,7 +385,7 @@ static void sts_rss_set_configuration_background_evalution(acc_detector_presence static void sts_rss_set_current_configuration_simple(acc_detector_presence_configuration_t presence_configuration) { - APP_LOG(TS_OFF, VLEVEL_H, "\r\nsts_rss_cfg-start: %4d ,length: %4d ,threshold: %4d ,gain: %2d ,rate: %2d ,profile: %1d \r\n", + APP_LOG(TS_OFF, VLEVEL_M, "\r\nsts_rss_cfg-start: %4d ,length: %4d ,threshold: %4d ,gain: %2d ,rate: %2d ,profile: %1d \r\n", (int)(sts_presence_rss_config.default_start_m*1000), (int)(sts_presence_rss_config.default_length_m*1000), (int)(sts_presence_rss_config.default_threshold*1000), @@ -371,22 +396,48 @@ static void sts_rss_set_current_configuration_simple(acc_detector_presence_confi acc_detector_presence_configuration_sensor_set(presence_configuration, DEFAULT_SENSOR_ID); acc_detector_presence_configuration_service_profile_set(presence_configuration, sts_presence_rss_config.default_profile); + + sweeps_per_frame = acc_detector_presence_configuration_sweeps_per_frame_get(presence_configuration); + acc_detector_presence_configuration_sweeps_per_frame_set(presence_configuration, sweeps_per_frame); + acc_detector_presence_configuration_downsampling_factor_set(presence_configuration, sts_presence_rss_config.default_downsampling_factor); + acc_detector_presence_configuration_hw_accelerated_average_samples_set(presence_configuration, DEFAULT_HWAAS); + + acc_detector_presence_configuration_update_rate_set(presence_configuration, 5); + acc_detector_presence_configuration_detection_threshold_set(presence_configuration, sts_presence_rss_config.default_threshold);//DEFAULT_DETECTION_THRESHOLD_2); + acc_detector_presence_configuration_start_set(presence_configuration, sts_presence_rss_config.default_start_m); acc_detector_presence_configuration_length_set(presence_configuration, sts_presence_rss_config.default_length_m); //DEFAULT_LENGTH_M_2); - acc_detector_presence_configuration_detection_threshold_set(presence_configuration, sts_presence_rss_config.default_threshold);//DEFAULT_DETECTION_THRESHOLD_2); + acc_detector_presence_configuration_power_save_mode_set(presence_configuration, DEFAULT_POWER_SAVE_MODE); + acc_detector_presence_configuration_receiver_gain_set(presence_configuration, sts_presence_rss_config.default_receiver_gain); - set_default_configuration_common(presence_configuration); + acc_detector_presence_configuration_filter_parameters_t filter = acc_detector_presence_configuration_filter_parameters_get(presence_configuration); + filter.inter_frame_deviation_time_const = DEFAULT_INTER_FRAME_DEVIATION_TIME_CONST; + +// will be disabled if this value > 1/2 of update rate, default update rate 65, so must < 30 + filter.inter_frame_fast_cutoff = DEFAULT_INTER_FRAME_FAST_CUTOFF; + filter.inter_frame_slow_cutoff = DEFAULT_INTER_FRAME_SLOW_CUTOFF; + acc_detector_presence_configuration_filter_parameters_set(presence_configuration,&filter); + + // set_default_configuration_common(presence_configuration); } static void print_current_configuration(acc_detector_presence_configuration_t presence_configuration) { + static uint32_t print_cnt=0; + if (print_cnt++%200 != 0) return; float sts_run_start = acc_detector_presence_configuration_start_get(presence_configuration); float sts_run_length = acc_detector_presence_configuration_length_get(presence_configuration); float sts_run_threshold = acc_detector_presence_configuration_detection_threshold_get(presence_configuration); float sts_run_gain = acc_detector_presence_configuration_receiver_gain_get(presence_configuration); float sts_run_update_rate = acc_detector_presence_configuration_update_rate_get(presence_configuration); float sts_run_profile = acc_detector_presence_configuration_service_profile_get(presence_configuration); + float sts_run_sweeps_rate = acc_detector_presence_configuration_sweeps_per_frame_get(presence_configuration); + float sts_run_downsampling = acc_detector_presence_configuration_downsampling_factor_get(presence_configuration); + + APP_LOG(TS_OFF, VLEVEL_M, "\r\nWork_mode:%2d Start: %4d (mm) Length: %4d (mm) Threshold: %4d (*) Gain= %2d (%) UpdateRate=%4d Profile= %d Sweeps Rate=%d Downsampling=%d\r\n", + sts_work_mode, (int)(1000.0*sts_run_start), (int)(1000.0*sts_run_length), (int)(1000.0*sts_run_threshold), + (int)(100.0*sts_run_gain),(int)sts_run_update_rate, (int)sts_run_profile, (int)sts_run_sweeps_rate, (int)sts_run_downsampling); acc_detector_presence_configuration_filter_parameters_t sts_run_filter = acc_detector_presence_configuration_filter_parameters_get(presence_configuration); @@ -398,31 +449,119 @@ static void print_current_configuration(acc_detector_presence_configuration_t pr float sts_run_f_intra_frame_weight = sts_run_filter.intra_frame_weight; float sts_run_f_output_time_const = sts_run_filter.output_time_const; - APP_LOG(TS_OFF, VLEVEL_M, "\r\nWork_mode:%2d Start: %4d (mm) Length: %4d (mm) Threshold: %4d (*) Gain= %2d (%) UpdateRate=%4d Profile= %d \r\n", - sts_work_mode, (int)(1000.0*sts_run_start), (int)(1000.0*sts_run_length), (int)(1000.0*sts_run_threshold), - (int)(100.0*sts_run_gain),(int)sts_run_update_rate, (int)sts_run_profile); - APP_LOG(TS_OFF, VLEVEL_H, "\rn\n(1)FastCut:%4u (2)SlowCut:%4u (3)InterFrameDevTime:%4u " + APP_LOG(TS_OFF, VLEVEL_M, "\r\n(1)FastCut:%4u (2)SlowCut:%4u (3)InterFrameDevTime:%4u " "(4)IntraFrameTimeConst:%4d (5)IntraWeight:%4u (5)OutputTime:%4u \r\n", (int)(1000.0*sts_run_f_inter_fast_cutoff), (int)(1000*sts_run_f_inter_slow_cutoff), (int)(1000*sts_run_f_inter_frame_dev_time_const), (int)(1000*sts_run_f_intra_frame_time_const),(int)(1000*sts_run_f_intra_frame_weight),(int)(1000*sts_run_f_output_time_const)); } + +static uint8_t yes_count =0; +static uint8_t no_count = 0; +#define TIME_C 4 + static void print_result(acc_detector_presence_result_t result) { + // 2025-04 27 update according to BYD V1.4 2021-02-21 +#if 0 if (result.presence_detected) { uint32_t detected_zone = (uint32_t)((float)(result.presence_distance - DEFAULT_START_M) / (float)DEFAULT_ZONE_LENGTH); // 2024-08-05 //uint32_t detected_zone = (uint32_t)((float)(result.presence_distance) / (float)DEFAULT_ZONE_LENGTH); - APP_LOG(TS_OFF, VLEVEL_M,"Motion in zone: %u, distance: %d, score: %d\n", (unsigned int)detected_zone, + APP_LOG(TS_OFF, VLEVEL_H,"Motion in zone: %u, distance: %d, score: %d\n", (unsigned int)detected_zone, (int)(result.presence_distance * 1000.0f), (int)(result.presence_score * 1000.0f)); } else { - APP_LOG(TS_OFF, VLEVEL_M,"No motion, score: %u\n", (int)(result.presence_score * 1000.0f)); + APP_LOG(TS_OFF, VLEVEL_H,"No motion, score: %u\n", (int)(result.presence_score * 1000.0f)); } +#endif + // 2025-04 27 update according to BYD V1.4 2021-02-21 + uint16_t signal = 0; + uint16_t dist = 0; + uint8_t i = 0; + + signal = (int)(result.presence_score * 1000.0f); + dist = (int)(result.presence_distance * 1000.0f); + + uint8_t flag=0; + if (signal> sts_rss_threshold) + { + if(dist<500) + { + if(signal>(sts_rss_threshold+1000)) + { + LED1_ON; + if(yes_count<TIME_C) + { + yes_count++; + } + else + { + no_count=0; + } + } + else + { + LED1_ON; + if(no_count<TIME_C) + { + no_count++; + } + else + { + yes_count=0; + } + } + } + else + { + LED1_ON; + if(yes_count<TIME_C) + { + yes_count++; + } + else + { + no_count=0; + } + } + } + else + { + LED1_OFF; + if(no_count<TIME_C) + { + no_count++; + } + else + { + yes_count=0; + } + //printf("No motion"); + } + // else + // { + // printf("Wait....."); + // } + if(yes_count>(TIME_C-1)) + { + //Out1_ON + //Out2_OFF + //printf("Motion (%5d), Distance: %4dmm\r\n", signal,dist); + APP_LOG(TS_OFF, VLEVEL_M, "\r\nMotion (%5d), Distance: %4dmm", signal, dist); + } + else if(no_count>(TIME_C-1)) + { + //Out1_OFF + //Out2_ON + // printf("No motion(%5d), Distance: %4dmm\r\n", signal,dist); + APP_LOG(TS_OFF, VLEVEL_M, "\r\nNo motion(%5d), Distance: %4dmm", signal, dist); + } + } /* @@ -484,7 +623,8 @@ int sts_presence_rss_background_evaluation_process(uint16_t *evaluated_distance, float average_distance =0.0f; float average_score =0.0f; - for (int i = 0; i < (iterations); i++) + //for (int i = 0; i < (iterations); i++) + while(1) { success = acc_detector_presence_get_next(handle, &result); if (!success) @@ -493,7 +633,7 @@ int sts_presence_rss_background_evaluation_process(uint16_t *evaluated_distance, break; } - //print_result(result); + print_result(result); if (!result.data_saturated) { if (result.presence_detected) @@ -506,7 +646,7 @@ int sts_presence_rss_background_evaluation_process(uint16_t *evaluated_distance, } } - acc_integration_sleep_ms(60); //--- around 1000ms in total + acc_integration_sleep_ms(200); //--- around 1000ms in total if (motioncount%10 ==0) { @@ -531,22 +671,114 @@ int sts_presence_rss_background_evaluation_process(uint16_t *evaluated_distance, return EXIT_SUCCESS; } -int sts_presence_rss_fall_rise_detection(void) +int sts_presence_rss_fall_rise_detection_loop(void) +{ + + success = acc_detector_presence_get_next(handle, &result); + if (!success) + { + APP_LOG(TS_OFF, VLEVEL_M,"acc_detector_presence_get_next() failed\n"); + return EXIT_FAILURE; + } + print_result(result); + return EXIT_SUCCESS; +} + +int sts_presence_rss_fall_rise_detection_end(void) +{ + + bool deactivated = acc_detector_presence_deactivate(handle); + acc_detector_presence_destroy(&handle); + acc_rss_deactivate(); + + + if (deactivated && success) + { + APP_LOG(TS_OFF, VLEVEL_H,"Application finished OK\n"); + return EXIT_SUCCESS; + } + + return EXIT_FAILURE; + + +} + +int sts_presence_rss_fall_rise_detection_start(void) +{ + const acc_hal_t *hal = acc_hal_integration_get_implementation(); + + if (!acc_rss_activate(hal)) + { + APP_LOG(TS_OFF, VLEVEL_M,"Failed to activate RSS\n"); + return EXIT_FAILURE; + } + + acc_rss_override_sensor_id_check_at_creation(true); + + //acc_detector_presence_configuration_t presence_configuration = acc_detector_presence_configuration_create(); + presence_configuration = acc_detector_presence_configuration_create(); + if (presence_configuration == NULL) + { + APP_LOG(TS_OFF, VLEVEL_M,"Failed to create configuration\n"); + acc_rss_deactivate(); + return EXIT_FAILURE; + } + + // sts_rss_set_current_configuration_simple(presence_configuration); + set_default_configuration(presence_configuration); + + APP_LOG(TS_OFF, VLEVEL_M,"\r\n##### YUNHORN STS *** Simple *** cfg applied\n"); + print_current_configuration(presence_configuration); + + sts_rss_threshold = sts_presence_rss_config.default_threshold*1000.0F; + + //print_current_configuration(presence_configuration); + + // acc_detector_presence_handle_t handle = acc_detector_presence_create(presence_configuration); + handle = acc_detector_presence_create(presence_configuration); + if (handle == NULL) + { + APP_LOG(TS_OFF, VLEVEL_M,"Failed to create detector\n"); + acc_detector_presence_configuration_destroy(&presence_configuration); + //acc_detector_presence_destroy(&handle); + acc_rss_deactivate(); + return EXIT_FAILURE; + } + + sts_rss_threshold = sts_presence_rss_config.default_threshold*1000.0F; + + APP_LOG(TS_OFF, VLEVEL_M,"\r\n============= Start Scan\n"); + + + if (!acc_detector_presence_activate(handle)) + { + APP_LOG(TS_OFF, VLEVEL_M, "Failed to activate detector \n"); + acc_detector_presence_destroy(&handle); + acc_rss_deactivate(); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; + +} + +int sts_presence_rss_fall_rise_detection_startx(void) { const acc_hal_t *hal = acc_hal_integration_get_implementation(); if (!acc_rss_activate(hal)) { - APP_LOG(TS_OFF, VLEVEL_H,"Failed to activate RSS\n"); + APP_LOG(TS_OFF, VLEVEL_M,"Failed to activate RSS\n"); return EXIT_FAILURE; } acc_rss_override_sensor_id_check_at_creation(true); - acc_detector_presence_configuration_t presence_configuration = acc_detector_presence_configuration_create(); + //acc_detector_presence_configuration_t presence_configuration = acc_detector_presence_configuration_create(); + presence_configuration = acc_detector_presence_configuration_create(); if (presence_configuration == NULL) { - APP_LOG(TS_OFF, VLEVEL_H,"Failed to create configuration\n"); + APP_LOG(TS_OFF, VLEVEL_M,"Failed to create configuration\n"); acc_rss_deactivate(); return EXIT_FAILURE; } @@ -554,7 +786,7 @@ int sts_presence_rss_fall_rise_detection(void) if ((sts_rss_config_updated_flag != STS_RSS_CONFIG_NON) || (sts_rss_init_ok != 1)) { - APP_LOG(TS_OFF, VLEVEL_H, "\r\n ------ ---------- rss cfg update flag=%02x \r\n", sts_rss_config_updated_flag); + APP_LOG(TS_OFF, VLEVEL_M, "\r\n ------ ---------- rss cfg update flag=%02x \r\n", sts_rss_config_updated_flag); if (sts_rss_init_ok==0) @@ -574,7 +806,7 @@ int sts_presence_rss_fall_rise_detection(void) sts_rss_init_ok = 1; } - APP_LOG(TS_OFF, VLEVEL_H, "\r\n Update flag=%02x, workmode=%2d \r\n", sts_rss_config_updated_flag, sts_work_mode); + APP_LOG(TS_OFF, VLEVEL_M, "\r\n Update flag=%02x, workmode=%2d \r\n", sts_rss_config_updated_flag, sts_work_mode); switch (sts_rss_config_updated_flag) { #if 0 @@ -585,19 +817,20 @@ int sts_presence_rss_fall_rise_detection(void) #endif case STS_RSS_CONFIG_DEFAULT: set_default_configuration(presence_configuration); - APP_LOG(TS_OFF, VLEVEL_H,"\r\n##### YUNHORN STS *** Default *** cfg applied\n"); + APP_LOG(TS_OFF, VLEVEL_M,"\r\n##### YUNHORN STS *** Default *** cfg applied\n"); break; case STS_RSS_CONFIG_SIMPLE: sts_rss_set_current_configuration_simple(presence_configuration); - APP_LOG(TS_OFF, VLEVEL_H,"\r\n##### YUNHORN STS *** Simple *** cfg applied\n"); + APP_LOG(TS_OFF, VLEVEL_M,"\r\n##### YUNHORN STS *** Simple *** cfg applied\n"); + print_current_configuration(presence_configuration); break; case STS_RSS_CONFIG_FULL: sts_rss_set_current_configuration_full(presence_configuration); - APP_LOG(TS_OFF, VLEVEL_H,"\r\n######### YUNHORN STS *** FULL *** cfg applied\n"); + APP_LOG(TS_OFF, VLEVEL_M,"\r\n######### YUNHORN STS *** FULL *** cfg applied\n"); break; case STS_RSS_CONFIG_FALL_DETECTION: set_default_fall_rise_configuration(presence_configuration); - APP_LOG(TS_OFF, VLEVEL_H,"\r\n######### YUNHORN STS *** FALL DETECTION *** cfg applied\n"); + APP_LOG(TS_OFF, VLEVEL_M,"\r\n######### YUNHORN STS *** FALL DETECTION *** cfg applied\n"); break; default: break; @@ -605,35 +838,45 @@ int sts_presence_rss_fall_rise_detection(void) // sts_rss_config_updated_flag = STS_RSS_CONFIG_NON; //update finished, set to 0 } + sts_rss_threshold = sts_presence_rss_config.default_threshold*1000.0F; - acc_detector_presence_handle_t handle = acc_detector_presence_create(presence_configuration); + //print_current_configuration(presence_configuration); + + // acc_detector_presence_handle_t handle = acc_detector_presence_create(presence_configuration); + handle = acc_detector_presence_create(presence_configuration); if (handle == NULL) { - APP_LOG(TS_OFF, VLEVEL_H,"Failed to create detector\n"); + APP_LOG(TS_OFF, VLEVEL_M,"Failed to create detector\n"); acc_detector_presence_configuration_destroy(&presence_configuration); - acc_detector_presence_destroy(&handle); + //acc_detector_presence_destroy(&handle); acc_rss_deactivate(); return EXIT_FAILURE; } + sts_rss_threshold = sts_presence_rss_config.default_threshold*1000.0F; - APP_LOG(TS_OFF, VLEVEL_H,"\r\n============= Start Scan\n"); + APP_LOG(TS_OFF, VLEVEL_M,"\r\n============= Start Scan\n"); - print_current_configuration(presence_configuration); + //print_current_configuration(presence_configuration); - acc_detector_presence_configuration_destroy(&presence_configuration); + //acc_detector_presence_configuration_destroy(&presence_configuration); // BEFORE MERGE FIRST AND SECOND HALF FALL RISE DETECTION if (!acc_detector_presence_activate(handle)) { - APP_LOG(TS_OFF, VLEVEL_H, "Failed to activate detector \n"); + APP_LOG(TS_OFF, VLEVEL_M, "Failed to activate detector \n"); + acc_detector_presence_destroy(&handle); + acc_rss_deactivate(); return false; } + + +#if 0 bool deactivated = false; bool success = true; - const int iterations = (DEFAULT_UPDATE_RATE_PRESENCE); - acc_detector_presence_result_t result; + const int iterations = 1; //(DEFAULT_UPDATE_RATE_PRESENCE); + //acc_detector_presence_result_t result; uint8_t average_result = 0; float average_distance =0.0f; float average_score =0.0f; @@ -655,6 +898,7 @@ int sts_presence_rss_fall_rise_detection(void) { for (int i = 0; i < (iterations); i++) { + success = acc_detector_presence_get_next(handle, &result); if (!success) { @@ -663,10 +907,10 @@ int sts_presence_rss_fall_rise_detection(void) } //print_result(result); - if (!result.data_saturated) + //if (!result.data_saturated) { //APP_LOG(TS_OFF, VLEVEL_H,"\n%u ", i); - //print_result(result); + print_result(result); if (result.presence_detected) { //print_result(result); @@ -697,15 +941,15 @@ int sts_presence_rss_fall_rise_detection(void) //acc_integration_sleep_ms(1000 / DEFAULT_UPDATE_RATE_PRESENCE); // 15ms, DEFAULT_UPDATE_RATE); //acc_integration_sleep_ms(10); // --- around 1500 ms in total - acc_integration_sleep_ms(2); //--- around 1000ms in total + //acc_integration_sleep_ms(2); //--- around 1000ms in total } - +#if 0 deactivated = acc_detector_presence_deactivate(handle); acc_detector_presence_destroy(&handle); acc_rss_deactivate(); APP_LOG(TS_OFF, VLEVEL_H, "\r\n First Half --- Motion Count = %u \r\n", motion_count); - +#endif //acc_detector_presence_deactivate(handle); } else if ((sts_work_mode == STS_UNI_MODE)) @@ -739,7 +983,7 @@ int sts_presence_rss_fall_rise_detection(void) acc_detector_presence_configuration_destroy(&presence_configuration); // set to full length of iteration - for (int i = 0; i < (iterations); i++) + for (int i = 0; i <= (iterations); i++) { success = acc_detector_presence_get_next(handle, &result); if (!success) @@ -787,13 +1031,14 @@ int sts_presence_rss_fall_rise_detection(void) //acc_integration_sleep_ms(10); //--- around 1500 ms in total acc_integration_sleep_ms(2); //--- around 1000ms in total } +#if 0 deactivated = acc_detector_presence_deactivate(handle); acc_detector_presence_destroy(&handle); acc_rss_deactivate(); APP_LOG(TS_OFF, VLEVEL_H, "\r\n Second Half --- Motion Count Sum to = %u \r\n", motion_count); - +#endif //APP_LOG(TS_OFF, VLEVEL_L,"Second Half, Fall Rise Detection, Motion Count = %u \r\n", (int)motion_count); motion_count = motion_count%DEFAULT_MOTION_DATASET_LEN; // get all required number of motion data @@ -807,14 +1052,13 @@ int sts_presence_rss_fall_rise_detection(void) } } - average_distance = (float)(1000.0f*average_distance)/(float)average_result; // in meters average_score = (float)(1000.0f*average_score)/(float)average_result; sts_presence_rss_distance = average_distance; sts_presence_rss_score = average_score; - STS_Yunhorn_DistanceStandardDeviation(); + //STS_Yunhorn_DistanceStandardDeviation(); // APP_LOG(TS_OFF, VLEVEL_H, "\r\nAverage Distance: %d (mm) Score: %d Singularity: %d \r\n",(int)average_distance, (int)average_score, sts_presence_singularity); // uint8_t pre_sts_rss_result = (average_result > (DEFAULT_UPDATE_RATE_PRESENCE/5))? 1: 0; @@ -830,10 +1074,10 @@ int sts_presence_rss_fall_rise_detection(void) uint8_t pre_sts_rss_result=0; if (sts_work_mode == STS_UNI_MODE) { - pre_sts_rss_result = (average_result > 0)? 1: 0; + pre_sts_rss_result = (average_result > (uint8_t)(0.7*iterations))? 1: 0; } else { - pre_sts_rss_result = ((average_result > 0)&&(sts_presence_singularity ==0))? 1: 0; + pre_sts_rss_result = ((average_result > (uint8_t)(0.7*iterations))&&(sts_presence_singularity ==0))? 1: 0; } //Write_RingBuff(pre_sts_rss_result); @@ -847,7 +1091,7 @@ int sts_presence_rss_fall_rise_detection(void) // APP_LOG(TS_OFF, VLEVEL_M, "\r\nMotionCount=%4d Overall Motion=%d \r\n", (int)motion_count, (int)sts_rss_result); //APP_LOG(TS_OFF, VLEVEL_M, "\r\nAverage Result=%d Distance=%d, Score=%d MotionCount=%d ---Overall Result=%d \r\n", // (int)average_result, (int)average_distance, (int)average_score, (int)motion_count, (int)sts_rss_result); - APP_LOG(TS_OFF, VLEVEL_M, "\r\nMotion Status: %d %d (mm) %d singularity: %d Rated-> %d \r\n",(int)average_result, (int)average_distance, (int)average_score, (int)sts_presence_singularity, (int)sts_rss_result); + APP_LOG(TS_OFF, VLEVEL_H, "\r\nMotion Status: %d %d (mm) %d singularity: %d Rated-> %d \r\n",(int)average_result, (int)average_distance, (int)average_score, (int)sts_presence_singularity, (int)sts_rss_result); #if 0 if (sts_rss_result) //if (average_score !=0) //if (sts_rss_result) { @@ -923,7 +1167,7 @@ int sts_presence_rss_fall_rise_detection(void) APP_LOG(TS_OFF, VLEVEL_H,"Application finished OK\n"); return EXIT_SUCCESS; } - +#endif return EXIT_FAILURE; } @@ -948,7 +1192,8 @@ void STS_Yunhorn_DistanceStandardDeviation(void) sum_presence_distance += (uint32_t)(sts_motion_dataset[j].presence_distance - average_presence_distance); } - sts_presence_singularity = (sum_presence_distance > 0)? 0:1; + // sts_presence_singularity = (sum_presence_distance > 0)? 0:1; + sts_presence_singularity = 0; // APP_LOG(TS_OFF, VLEVEL_M, "\r\n*** STS_Singularity=%u ***\r\n", sts_presence_singularity); } diff --git a/Core/Src/yunhorn_sts_process.c b/Core/Src/yunhorn_sts_process.c index 70ed0e2..f41cf85 100644 --- a/Core/Src/yunhorn_sts_process.c +++ b/Core/Src/yunhorn_sts_process.c @@ -39,8 +39,8 @@ extern volatile sts_cfg_nvm_t sts_cfg_nvm; extern volatile uint8_t sts_ac_code[20]; -volatile uint8_t sts_work_mode = STS_UNI_MODE; -#if 0 +//volatile uint8_t sts_work_mode = STS_UNI_MODE; +#if 1 #if defined(STS_O7) volatile uint8_t sts_work_mode = STS_UNI_MODE; #elif defined(STS_O6) @@ -332,7 +332,11 @@ void STS_YunhornSTSEventP2_Process(void) break; } #endif - int res = sts_presence_rss_fall_rise_detection(); + // int res = sts_presence_rss_fall_rise_detection(); + + APP_LOG(TS_OFF, VLEVEL_M, "\r\n RSS detection LOOP \r\n"); + + int res = sts_presence_rss_fall_rise_detection_loop(); if (res == 0) { @@ -353,7 +357,7 @@ void STS_YunhornSTSEventP2_Process(void) } STS_Combined_Status_Processing(); - } else APP_LOG(TS_OFF, VLEVEL_H, "\r\n RSS detection error =%d \r\n", res); + } else APP_LOG(TS_OFF, VLEVEL_M, "\r\n RSS detection error =%d \r\n", res); } } @@ -1146,11 +1150,12 @@ uint8_t STS_SENSOR_MEMS_Get_ID(uint8_t *devID) { devID[0] = scanned_id[0]; devID[1] = scanned_id[1]; - APP_LOG(TS_OFF, VLEVEL_H,"\r\n--------------devID = %02x %02x \r\n",devID[0], devID[1]); + APP_LOG(TS_OFF, VLEVEL_M,"\r\n--------------devID = %02x %02x \r\n",devID[0], devID[1]); return true; } else { + APP_LOG(TS_OFF, VLEVEL_M,"\r\n--------------devID = %02x %02x \r\n",devID[0], devID[1]); return false; } #endif @@ -1582,12 +1587,12 @@ void STS_RSS_Filter(uint8_t pre_sts_rss_result) { //sts_rss_result= ((sum_filter >= SLIDING_THRESHOLD))? 1:0; // sts_rss_result= ((sum_filter > (SLIDING_WIN_LEN - SLIDING_THRESHOLD)))? 1:0; - sts_rss_result= ((sum_filter > (sts_rss_cfg_slid_win_size - sts_rss_cfg_slid_win_threshold)))? 1:0; + sts_rss_result= ((sum_filter >= (15 - 13)))? 1:0; } else { - sts_rss_result= ((sum_filter > sts_rss_cfg_slid_win_threshold))? 1:0; + sts_rss_result= ((sum_filter > 6 ))? 1:0; } #if 0 diff --git a/LoRaWAN/App/lora_app.c b/LoRaWAN/App/lora_app.c index 51abfdf..3ceac88 100644 --- a/LoRaWAN/App/lora_app.c +++ b/LoRaWAN/App/lora_app.c @@ -75,7 +75,7 @@ extern volatile uint32_t event_start_time, event_stop_time; extern volatile uint16_t sts_unconscious_threshold; volatile uint8_t sts_occupancy_overtime_state = 0; volatile uint8_t sts_presence_fall_detection=FALSE; -volatile uint32_t SamplingPeriodicity = 1000; //unit ms +volatile uint32_t SamplingPeriodicity = 100; //unit ms volatile uint32_t HeartBeatPeriodicity = 120000; //unit ms volatile uint8_t STS_LoRa_WAN_Joined = 0; @@ -121,7 +121,7 @@ volatile sts_cfg_nvm_t sts_cfg_nvm = { 0x00, //intra frame time const [0]=0 Lower to reduce sensitivity, higher to increase sensitivity 0x0A, //intra frame weight, 0x00=[0]*0.1=0.0F 0x0A=10, 10*0.1=1 FOR FAST MOVEMENT TRACKING FALL DETECTION 0x09, //output time const 0x05=[5]*0.1=0.5 0.5--> 0.9 2025-03-26 TODO XXXXXX - 0x02, //downsampling factor [2]=2 + 0x01, //downsampling factor [2]=2 ---> 1 20250427 per acconeer BYD module cfg print result 0x03, //power saving mode ACTIVE [3] = 3U 0x02, //P[17] RSS CFG UPDATE FLAG 2025-04-14 0x6E, //P[18] RSS_CFG_BG_MOTION_NOISE 2025-04-14 @@ -735,10 +735,11 @@ void STS_Sensor_Init(void) UTIL_SEQ_RegTask((1 << CFG_SEQ_Task_YunhornSTSEventP7), UTIL_SEQ_RFU, STS_YunhornSTSEventP7_Process); UTIL_SEQ_RegTask((1 << CFG_SEQ_Task_YunhornSTSEventP8), UTIL_SEQ_RFU, STS_YunhornSTSEventP8_Process); #endif - + //sts_presence_rss_fall_rise_detection_start(); #if defined(STS_O7)||defined(STS_O6) - UTIL_TIMER_Create(&YunhornSTSRSSWakeUpTimer, YUNHORN_STS_RSS_WAKEUP_CHECK_TIME, UTIL_TIMER_ONESHOT, OnYunhornSTSOORSSWakeUpTimerEvent, NULL); - // UTIL_TIMER_Start(&YunhornSTSRSSWakeUpTimer); + //UTIL_TIMER_Create(&YunhornSTSRSSWakeUpTimer, YUNHORN_STS_RSS_WAKEUP_CHECK_TIME, UTIL_TIMER_ONESHOT, OnYunhornSTSOORSSWakeUpTimerEvent, NULL); + UTIL_TIMER_Create(&YunhornSTSRSSWakeUpTimer, 200, UTIL_TIMER_ONESHOT, OnYunhornSTSOORSSWakeUpTimerEvent, NULL); + UTIL_TIMER_Start(&YunhornSTSRSSWakeUpTimer); // HeartBeatPeriodicity HAS BEEN CHANGED IN REBOOT SESSION UPDATE 2025-04-23 // UTIL_TIMER_Create(&YunhornSTSHeartBeatTimer, YUNHORN_STS_HEART_BEAT_CHECK_TIME, UTIL_TIMER_PERIODIC, OnYunhornSTSHeartBeatTimerEvent, NULL); @@ -763,7 +764,8 @@ void STS_Sensor_Init(void) void STS_Sensor_Prepare(void) { - + int res = sts_presence_rss_fall_rise_detection_start(); + //if (res != EXIT_FAILURE) UTIL_TIMER_Start(&YunhornSTSRSSWakeUpTimer); } @@ -3138,7 +3140,7 @@ void STS_SENSOR_Function_Test_Process(void) tstbuf[i++] = (uint8_t) sts_hardware_ver; tstbuf[i++] = (uint8_t) (99*((GetBatteryLevel()/254)&0xff)); - APP_LOG(TS_OFF, VLEVEL_H, "\r\nStart Function Test \r\n"); + APP_LOG(TS_OFF, VLEVEL_M, "\r\nStart Function Test \r\n"); STS_SENSOR_MEMS_Get_ID(mems_Dev_ID); if ((mems_Dev_ID[0]==0X0) && (mems_Dev_ID[1]==0x0)) { diff --git a/STM32CubeIDE/Release/STS_O7.bin b/STM32CubeIDE/Release/STS_O7.bin index 368a5b4..4d41a56 100644 Binary files a/STM32CubeIDE/Release/STS_O7.bin and b/STM32CubeIDE/Release/STS_O7.bin differ