From 00e47ea0cee5c1fa37fc1c3faa58a962e1b1483b Mon Sep 17 00:00:00 2001 From: YunHorn Technology Date: Wed, 7 May 2025 22:50:39 +0800 Subject: [PATCH] wip no good for bring up test --- Core/Inc/yunhorn_sts_sensors.h | 15 ++-- Core/Src/example_detector_distance.c | 70 +++++++++++---- Core/Src/yunhorn_sts_distance_rss.c | 69 +++++++++----- Core/Src/yunhorn_sts_presence_rss.c | 84 +++++++++++------- .../yunhorn_sts_presence_rss_bring_up_test.c | 72 +++++++++------ Core/Src/yunhorn_sts_process.c | 72 ++++++++++----- LoRaWAN/App/lora_app.c | 48 +++++----- STM32CubeIDE/Release/STS_O7.bin | Bin 253292 -> 254604 bytes 8 files changed, 279 insertions(+), 151 deletions(-) diff --git a/Core/Inc/yunhorn_sts_sensors.h b/Core/Inc/yunhorn_sts_sensors.h index 7672eba..77331d8 100644 --- a/Core/Inc/yunhorn_sts_sensors.h +++ b/Core/Inc/yunhorn_sts_sensors.h @@ -722,7 +722,7 @@ uint32_t STS_Get_Date_Time_Stamp(void);//uint32_t *time_stamp, uint8_t *datetime void STS_SENSOR_MEMS_Reset(uint8_t cnt); void STS_PRESENCE_SENSOR_NVM_CFG(void); -void STS_PRESENCE_SENSOR_NVM_CFG_SIMPLE(void); +//void STS_PRESENCE_SENSOR_NVM_CFG_SIMPLE(void); void STS_PRESENCE_SENSOR_Read(STS_OO_SensorStatusDataTypeDef *o6_data); void STS_PRESENCE_SENSOR_Prepare_Send_Data(STS_OO_SensorStatusDataTypeDef *sensor_data); @@ -748,11 +748,13 @@ uint8_t STS_SENSOR_MEMS_Get_ID(uint8_t *devID); int sts_presence_rss_detection_init(void); int sts_presence_rss_detection_process(void); int sts_presence_rss_detection_deinit(void); - int sts_presence_rss_presence_detection(void); int sts_presence_rss_fall_rise_detection(void); -int sts_distance_rss_detector_distance(void); -int acc_example_detector_distance(int argc, char *argv[]); +//int sts_distance_rss_detector_distance(void); +int sts_distance_rss_detector_distance(uint16_t *rss_distance); +//int acc_example_detector_distance(int argc, char *argv[]); +//int acc_example_detector_distance(void); +int acc_example_detector_distance(uint16_t *rss_distance); int acc_example_service_sparse(int argc, char *argv[]); int acc_example_detector_distance_recorded(int argc, char *argv[]); int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result); @@ -774,8 +776,9 @@ void STS_MOTION_SENSOR_Initialization(void); void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, uint8_t tlv_buf_size); void STS_SENSOR_Function_Test_Process(void); void STS_SENSOR_Distance_Test_Process(void); -void STS_PRESENCE_SENSOR_Function_Test_Process(uint8_t *self_test_result, uint8_t count); -void STS_PRESENCE_SENSOR_Distance_Measure_Process(void); +void STS_PRESENCE_SENSOR_Function_Test_Process(uint8_t *self_test_result, uint8_t *count); +//void STS_PRESENCE_SENSOR_Distance_Measure_Process(void); +void STS_PRESENCE_SENSOR_Distance_Measure_Process(uint16_t *rss_distance); void STS_PRESENCE_SENSOR_Background_Measure_Process(uint16_t *bg_distance, uint16_t *bg_motion_noise); int sts_presence_rss_background_evaluation_process(uint16_t *evaluated_distance, uint16_t *evaluated_score); void STS_Sensor_Init(void); diff --git a/Core/Src/example_detector_distance.c b/Core/Src/example_detector_distance.c index 230b1a9..f13c1eb 100644 --- a/Core/Src/example_detector_distance.c +++ b/Core/Src/example_detector_distance.c @@ -34,31 +34,33 @@ #define EXAMPLE_PROFILE ACC_SERVICE_PROFILE_2 //2 #define EXAMPLE_HWAAS (63) //63 -volatile distance_measure_cfg_t distance_cfg={1.0, 2.0, 5, 63, 2, 10, 0.5, 1.3, 0.2}; +extern volatile distance_measure_cfg_t distance_cfg; //={1.0, 3.0, 4, 63, 1, 10, 0.5, 1.3, 0.5}; extern float sts_distance_rss_distance; static void update_configuration(acc_detector_distance_configuration_t distance_configuration); - +static void print_configuration(acc_detector_distance_configuration_t distance_configuration); static void print_distances(acc_detector_distance_result_t *result, uint16_t reflection_count); -int acc_example_detector_distance(int argc, char *argv[]); +int acc_example_detector_distance(uint16_t *rss_distance); -int acc_example_detector_distance(int argc, char *argv[]) +int acc_example_detector_distance(uint16_t *rss_distance) { - (void)argc; - (void)argv; + //(void)argc; + //(void)argv; //APP_LOG(TS_OFF, VLEVEL_M, "Acconeer software version %s\n", acc_version_get()); const acc_hal_t *hal = acc_hal_integration_get_implementation(); - +#if 1 if (!acc_rss_activate(hal)) { APP_LOG(TS_OFF, VLEVEL_M, "acc_rss_activate() failed\n"); return EXIT_FAILURE; } +#endif + acc_rss_override_sensor_id_check_at_creation(true); acc_detector_distance_configuration_t distance_configuration = acc_detector_distance_configuration_create(); @@ -81,8 +83,12 @@ int acc_example_detector_distance(int argc, char *argv[]) } */ /// + print_configuration(distance_configuration); + update_configuration(distance_configuration); + acc_detector_distance_handle_t distance_handle = acc_detector_distance_create(distance_configuration); + print_configuration(distance_configuration); if (distance_handle == NULL) { @@ -107,7 +113,7 @@ int acc_example_detector_distance(int argc, char *argv[]) uint16_t number_of_peaks = 5; acc_detector_distance_result_t result[number_of_peaks]; acc_detector_distance_result_info_t result_info; - sts_distance_rss_distance = 0.0; + float sts_distance = 0.0f; for (int i = 0; i < iterations; i++) { @@ -118,11 +124,12 @@ int acc_example_detector_distance(int argc, char *argv[]) APP_LOG(TS_OFF, VLEVEL_M, "acc_detector_distance_get_next() failed\n"); break; } - sts_distance_rss_distance += result->distance_m; + sts_distance += result->distance_m; print_distances(result, result_info.number_of_peaks); + HAL_Delay(20); } - sts_distance_rss_distance = 1000.0f*sts_distance_rss_distance/iterations; + *rss_distance = (sts_distance*1000.0f)/iterations; bool deactivated = acc_detector_distance_deactivate(distance_handle); @@ -132,7 +139,7 @@ int acc_example_detector_distance(int argc, char *argv[]) if (deactivated && success) { - APP_LOG(TS_OFF, VLEVEL_H, "Application finished OK\n"); + APP_LOG(TS_OFF, VLEVEL_M, "Application finished OK\n"); return EXIT_SUCCESS; } @@ -142,11 +149,15 @@ int acc_example_detector_distance(int argc, char *argv[]) static void update_configuration(acc_detector_distance_configuration_t distance_configuration) { - acc_detector_distance_configuration_requested_start_set(distance_configuration, distance_cfg.start_m); //EXAMPLE_START_M); - acc_detector_distance_configuration_requested_length_set(distance_configuration, distance_cfg.length_m); //EXAMPLE_LENGTH_M); - acc_detector_distance_configuration_service_profile_set(distance_configuration, distance_cfg.acc_profile); //EXAMPLE_PROFILE); - acc_detector_distance_configuration_hw_accelerated_average_samples_set(distance_configuration, distance_cfg.hwaas);//EXAMPLE_HWAAS); + acc_detector_distance_configuration_requested_start_set(distance_configuration, EXAMPLE_START_M);// distance_cfg.start_m); //EXAMPLE_START_M); + acc_detector_distance_configuration_requested_length_set(distance_configuration, 3.0); //distance_cfg.length_m); //EXAMPLE_LENGTH_M); + acc_detector_distance_configuration_service_profile_set(distance_configuration, 2); //distance_cfg.acc_profile); //EXAMPLE_PROFILE); + acc_detector_distance_configuration_hw_accelerated_average_samples_set(distance_configuration, EXAMPLE_HWAAS); //distance_cfg.hwaas);//EXAMPLE_HWAAS); + //acc_detector_distance_configuration_record_background_sweeps_set(distance_configuration, 16); + //acc_detector_distance_configuration_downsampling_factor_set(distance_configuration, 1); + //acc_detector_distance_configuration_threshold_sensitivity_set(distance_configuration, 0.2); +#if 1 acc_detector_distance_configuration_threshold_sensitivity_set(distance_configuration, distance_cfg.threshold); acc_detector_distance_configuration_sweep_averaging_set(distance_configuration,distance_cfg.sweep_average); acc_detector_distance_configuration_receiver_gain_set(distance_configuration,distance_cfg.gain); @@ -154,17 +165,42 @@ static void update_configuration(acc_detector_distance_configuration_t distance_ acc_detector_distance_configuration_threshold_type_set(distance_configuration, ACC_DETECTOR_DISTANCE_THRESHOLD_TYPE_CFAR); acc_detector_distance_configuration_record_background_sweeps_set(distance_configuration, 16); +#endif +} + + +static void print_configuration(acc_detector_distance_configuration_t distance_configuration) +{ + float sts_start = acc_detector_distance_configuration_requested_start_get(distance_configuration); + float sts_length = acc_detector_distance_configuration_requested_length_get(distance_configuration); + float sts_profile = acc_detector_distance_configuration_service_profile_get(distance_configuration); + float sts_hwaas = acc_detector_distance_configuration_hw_accelerated_average_samples_get(distance_configuration); + float sts_gain = acc_detector_distance_configuration_receiver_gain_get(distance_configuration); + float sts_threshold = acc_detector_distance_configuration_threshold_sensitivity_get(distance_configuration); + + APP_LOG(TS_OFF, VLEVEL_M, "\r\nDistance CFG: start:%4d length:%4d profile:%2d HWAAS:%2d gain:%3d threshold:%6d \r\n", + (int)(sts_start*1000.0f), (int)(sts_length*1000.0f), (int)(sts_profile), (int)(sts_hwaas), (int)(sts_gain*100.0f), (int)(sts_threshold*1000.0f)); + +#if 0 + acc_detector_distance_configuration_threshold_sensitivity_set(distance_configuration, distance_cfg.threshold); + acc_detector_distance_configuration_sweep_averaging_set(distance_configuration,distance_cfg.sweep_average); + acc_detector_distance_configuration_receiver_gain_set(distance_configuration,distance_cfg.gain); + acc_detector_distance_configuration_downsampling_factor_set(distance_configuration, distance_cfg.downsampling); + + acc_detector_distance_configuration_threshold_type_set(distance_configuration, ACC_DETECTOR_DISTANCE_THRESHOLD_TYPE_CFAR); + acc_detector_distance_configuration_record_background_sweeps_set(distance_configuration, 16); +#endif } static void print_distances(acc_detector_distance_result_t *result, uint16_t reflection_count) { - APP_LOG(TS_OFF, VLEVEL_H, "Found %u peaks:\n", (unsigned int)reflection_count); + APP_LOG(TS_OFF, VLEVEL_M, "Found %u peaks:\n", (unsigned int)reflection_count); for (uint16_t i = 0; i < reflection_count; i++) { - APP_LOG(TS_OFF, VLEVEL_H, "Amplitude %u at %u mm\n", (unsigned int)result[i].amplitude, + APP_LOG(TS_OFF, VLEVEL_M, "Amplitude %u at %u mm\n", (unsigned int)result[i].amplitude, (unsigned int)(result[i].distance_m * 1000)); } } diff --git a/Core/Src/yunhorn_sts_distance_rss.c b/Core/Src/yunhorn_sts_distance_rss.c index a0e4fe5..e4488d3 100644 --- a/Core/Src/yunhorn_sts_distance_rss.c +++ b/Core/Src/yunhorn_sts_distance_rss.c @@ -55,48 +55,52 @@ //volatile distance_measure_cfg_t distance_cfg={1.5, 2.0, 1, 63, 2, 10, 0.5, 1.3, 0.2}; // SPARK FUN EXAMPLE // GOOD --- volatile distance_measure_cfg_t distance_cfg={0.4, 3.5, 4, 63, 0, 10, 0.5, 1.3, 0.2}; +volatile distance_measure_cfg_t distance_cfg={1.6, 3.2, 2, 63, 1, 10, 0.5, 1.3, 0.5}; +//volatile distance_measure_cfg_t distance_cfg={1.2, 3.2, 2, 63, 1, 10, 0.5, 1.3, 0.5}; +//extern volatile distance_measure_cfg_t distance_cfg; // 2024-08-15 volatile distance_measure_cfg_t distance_cfg={0.8, 3.5, 2, 63, 2, 10, 0.5, 1.3, 0.2}; //volatile distance_measure_cfg_t distance_cfg={0.8, 3.5, 4, 63, 2, 10, 0.5, 1.3, 0.2}; -volatile distance_measure_cfg_t distance_cfg={0.8, 3.5, 4, 63, 2, 10, 0.4, 1.2, 0.2}; +//volatile distance_measure_cfg_t distance_cfg={0.8, 3.5, 4, 63, 2, 10, 0.4, 1.2, 0.2}; //volatile distance_measure_cfg_t distance_cfg={1.5, 3.3, 2, 63, 4, 10, 0.8182f, 0.4, 0.2}; extern volatile uint16_t sts_distance_rss_distance, sts_sensor_install_height; static void sts_distance_rss_update_configuration(acc_detector_distance_configuration_t distance_configuration); - - +static void print_configuration(acc_detector_distance_configuration_t distance_configuration); static void print_distances(acc_detector_distance_result_t *result, uint16_t reflection_count); -int sts_distance_rss_detector_distance(void); +int sts_distance_rss_detector_distance(uint16_t *rss_distance); -int sts_distance_rss_detector_distance(void) +int sts_distance_rss_detector_distance(uint16_t *rss_distance) { const acc_hal_t *hal = acc_hal_integration_get_implementation(); if (!acc_rss_activate(hal)) { - APP_LOG(TS_OFF, VLEVEL_L, "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_rss_override_sensor_id_check_at_creation(true); acc_detector_distance_configuration_t distance_configuration = acc_detector_distance_configuration_create(); if (distance_configuration == NULL) { - APP_LOG(TS_OFF, VLEVEL_L, "acc_detector_distance_configuration_create() failed\n"); + APP_LOG(TS_OFF, VLEVEL_M, "acc_detector_distance_configuration_create() failed\n"); acc_rss_deactivate(); return EXIT_FAILURE; } + print_configuration(distance_configuration); sts_distance_rss_update_configuration(distance_configuration); acc_detector_distance_handle_t distance_handle = acc_detector_distance_create(distance_configuration); + print_configuration(distance_configuration); if (distance_handle == NULL) { - APP_LOG(TS_OFF, VLEVEL_L, "acc_detector_distance_create() failed\n"); + APP_LOG(TS_OFF, VLEVEL_M, "acc_detector_distance_create() failed\n"); acc_detector_distance_configuration_destroy(&distance_configuration); acc_rss_deactivate(); return EXIT_FAILURE; @@ -106,14 +110,14 @@ int sts_distance_rss_detector_distance(void) if (!acc_detector_distance_activate(distance_handle)) { - APP_LOG(TS_OFF, VLEVEL_L, "acc_detector_distance_activate() failed\n"); + APP_LOG(TS_OFF, VLEVEL_M, "acc_detector_distance_activate() failed\n"); acc_detector_distance_destroy(&distance_handle); acc_rss_deactivate(); return EXIT_FAILURE; } bool success = true; - const int iterations = 1; //5; + const int iterations = 3; //5; uint16_t number_of_peaks = 1; // FSB first significant Bin acc_detector_distance_result_t result[number_of_peaks]; acc_detector_distance_result_info_t result_info; @@ -125,17 +129,23 @@ int sts_distance_rss_detector_distance(void) if (!success) { - APP_LOG(TS_OFF, VLEVEL_L, "acc_detector_distance_get_next() failed\n"); + APP_LOG(TS_OFF, VLEVEL_M, "acc_detector_distance_get_next() failed\n"); break; } for(uint8_t j=0; j< result_info.number_of_peaks; j++) - tmp_distance = tmp_distance + (result[j].distance_m); //KalmanFilter(result[j].distance_m); + { + tmp_distance = tmp_distance + (result[j].distance_m); //KalmanFilter(result[j].distance_m); + } + print_distances(result, result_info.number_of_peaks); } - sts_distance_rss_distance = (uint16_t)(1000*tmp_distance)/(number_of_peaks*iterations); + + + sts_distance_rss_distance = (uint16_t)(tmp_distance*1000.0f)/(number_of_peaks*iterations); // ensure it's a valid installation height //sts_sensor_install_height = (uint16_t)MAX(sts_distance_rss_distance,2000); + *rss_distance = (uint16_t)sts_distance_rss_distance; sts_sensor_install_height = (uint16_t)sts_distance_rss_distance; APP_LOG(TS_OFF, VLEVEL_M, "\r\nAverage Distance =%u mm --- Assume Sensor Install Height = %u mm\r\n", (uint16_t)sts_distance_rss_distance, (uint16_t)sts_sensor_install_height); @@ -147,13 +157,13 @@ int sts_distance_rss_detector_distance(void) if (deactivated && success) { - APP_LOG(TS_OFF, VLEVEL_H, "Application finished OK\n"); + APP_LOG(TS_OFF, VLEVEL_M, "Application finished OK\n"); return EXIT_SUCCESS; } return EXIT_FAILURE; } - +#if 0 static void sts_distance_rss_update_configuration(acc_detector_distance_configuration_t distance_configuration) { acc_detector_distance_configuration_mur_set(distance_configuration, DEFAULT_FAR_RANGE_MUR); // NEW ADD @@ -161,7 +171,7 @@ static void sts_distance_rss_update_configuration(acc_detector_distance_configur acc_detector_distance_configuration_requested_length_set(distance_configuration, distance_cfg.length_m); acc_detector_distance_configuration_receiver_gain_set(distance_configuration,distance_cfg.gain); acc_detector_distance_configuration_maximize_signal_attenuation_set(distance_configuration, DEFAULT_FAR_MAXIMIZE_SIGNAL_ATTENUATION); // NEW ADD - acc_detector_distance_configuration_service_profile_set(distance_configuration, distance_cfg.acc_profile); + acc_detector_distance_configuration_service_profile_set(distance_configuration, DEFAULT_FAR_RANGE_SERVICE_PROFILE); //distance_cfg.acc_profile); acc_detector_distance_configuration_downsampling_factor_set(distance_configuration, distance_cfg.downsampling); acc_detector_distance_configuration_sweep_averaging_set(distance_configuration,distance_cfg.sweep_average); acc_detector_distance_configuration_threshold_type_set(distance_configuration, ACC_DETECTOR_DISTANCE_THRESHOLD_TYPE_CFAR); @@ -172,9 +182,9 @@ static void sts_distance_rss_update_configuration(acc_detector_distance_configur acc_detector_distance_configuration_cfar_threshold_window_set(distance_configuration,DEFAULT_FAR_RANGE_CFAR_THRESHOLD_WINDOW); acc_detector_distance_configuration_record_background_sweeps_set(distance_configuration, 16); } - +#endif //backup. ... previous setting ----don't delete -/* + static void sts_distance_rss_update_configuration(acc_detector_distance_configuration_t distance_configuration) { acc_detector_distance_configuration_requested_start_set(distance_configuration, distance_cfg.start_m); @@ -182,16 +192,16 @@ static void sts_distance_rss_update_configuration(acc_detector_distance_configur acc_detector_distance_configuration_service_profile_set(distance_configuration, distance_cfg.acc_profile); acc_detector_distance_configuration_hw_accelerated_average_samples_set(distance_configuration, distance_cfg.hwaas); - acc_detector_distance_configuration_threshold_sensitivity_set(distance_configuration, distance_cfg.threshold); + acc_detector_distance_configuration_downsampling_factor_set(distance_configuration, distance_cfg.downsampling); acc_detector_distance_configuration_sweep_averaging_set(distance_configuration,distance_cfg.sweep_average); acc_detector_distance_configuration_receiver_gain_set(distance_configuration,distance_cfg.gain); - acc_detector_distance_configuration_downsampling_factor_set(distance_configuration, distance_cfg.downsampling); + acc_detector_distance_configuration_threshold_sensitivity_set(distance_configuration, distance_cfg.threshold); acc_detector_distance_configuration_threshold_type_set(distance_configuration, ACC_DETECTOR_DISTANCE_THRESHOLD_TYPE_CFAR); acc_detector_distance_configuration_record_background_sweeps_set(distance_configuration, 16); } -*/ + // static void print_distances(acc_detector_distance_result_t *result, uint16_t reflection_count) { @@ -203,3 +213,18 @@ static void print_distances(acc_detector_distance_result_t *result, uint16_t ref (unsigned int)(result[i].distance_m * 1000)); } } + + +static void print_configuration(acc_detector_distance_configuration_t distance_configuration) +{ + float sts_start = acc_detector_distance_configuration_requested_start_get(distance_configuration); + float sts_length = acc_detector_distance_configuration_requested_length_get(distance_configuration); + float sts_profile = acc_detector_distance_configuration_service_profile_get(distance_configuration); + float sts_hwaas = acc_detector_distance_configuration_hw_accelerated_average_samples_get(distance_configuration); + float sts_gain = acc_detector_distance_configuration_receiver_gain_get(distance_configuration); + float sts_threshold = acc_detector_distance_configuration_threshold_sensitivity_get(distance_configuration); + + APP_LOG(TS_OFF, VLEVEL_M, "\r\nDistance CFG: start:%4d length:%4d profile:%2d HWAAS:%2d gain:%3d threshold:%6d \r\n", + (int)(sts_start*1000.0f), (int)(sts_length*1000.0f), (int)(sts_profile), (int)(sts_hwaas), (int)(sts_gain*100.0f), (int)(sts_threshold*1000.0f)); +} + diff --git a/Core/Src/yunhorn_sts_presence_rss.c b/Core/Src/yunhorn_sts_presence_rss.c index e1a838c..34e0446 100644 --- a/Core/Src/yunhorn_sts_presence_rss.c +++ b/Core/Src/yunhorn_sts_presence_rss.c @@ -153,7 +153,8 @@ volatile uint8_t sts_presence_singularity=0; extern uint8_t sts_lamp_bar_color; acc_detector_presence_handle_t rss_handle=NULL; acc_detector_presence_result_t rss_result; -volatile float sts_rss_threshold=1.6f; +volatile float sts_rss_threshold=1.6f, sts_run_start, sts_run_length, sts_run_threshold, sts_run_gain, sts_run_profile, sts_run_f_inter_fast_cutoff,sts_run_f_inter_slow_cutoff; + /* USER CODE END Includes */ /* External variables ---------------------------------------------------------*/ @@ -201,12 +202,12 @@ volatile float sts_rss_threshold=1.6f; uint16_t start_t = 500; -uint16_t end_t = 2000; +uint16_t end_t = 3000; uint16_t update_t = 200; -uint8_t gain_t = 50; +uint8_t gain_t = 80; uint16_t threshold = 1500; uint16_t frame_fast_t = 200; -uint16_t frame_slow_t = 20; +uint16_t frame_slow_t = 17; uint8_t profile = 4; uint16_t Sweeps_per_frame = 16; uint8_t downsampling = 1; @@ -251,7 +252,7 @@ void update_configuration_with_type(acc_detector_presence_configuration_t presen break; case STS_RSS_CONFIG_FULL: - //filter = acc_detector_presence_configuration_filter_parameters_get(presence_configuration); + filter = acc_detector_presence_configuration_filter_parameters_get(presence_configuration); filter.inter_frame_deviation_time_const = sts_presence_rss_config.default_inter_frame_deviation_time_const; filter.inter_frame_fast_cutoff = sts_presence_rss_config.default_inter_frame_fast_cutoff; filter.inter_frame_slow_cutoff = sts_presence_rss_config.default_inter_frame_slow_cutoff; @@ -260,8 +261,14 @@ void update_configuration_with_type(acc_detector_presence_configuration_t presen filter.output_time_const = sts_presence_rss_config.default_output_time_const; //0.0f; acc_detector_presence_configuration_filter_parameters_set(presence_configuration, &filter); break; + case STS_RSS_CONFIG_BGN_SCAN: + acc_detector_presence_configuration_start_set(presence_configuration, 1.5f); + acc_detector_presence_configuration_length_set(presence_configuration, 3.5f); + acc_detector_presence_configuration_detection_threshold_set(presence_configuration, 1.0f); + break; case STS_RSS_CONFIG_FALL_DETECTION: - //filter = acc_detector_presence_configuration_filter_parameters_get(presence_configuration); + //acc_detector_presence_configuration_update_rate_set(presence_configuration, 0.1f); + filter = acc_detector_presence_configuration_filter_parameters_get(presence_configuration); // if intra-frame-weight set to 1.0, then the following inter-frame parameters have no effect filter.inter_frame_deviation_time_const = DEFAULT_INTER_FRAME_DEVIATION_TIME_CONST; filter.inter_frame_fast_cutoff = 10.0f; //DEFAULT_INTER_FRAME_FAST_CUTOFF; @@ -284,7 +291,7 @@ void update_configuration_with_type(acc_detector_presence_configuration_t presen } void update_configuration(acc_detector_presence_configuration_t presence_configuration) { - float start_m_t = 0.0f; + //float start_m_t = 0.0f; start_m = (float)start_t / 1000; length_m = (float)(end_t - start_t) / 1000 + 0.0f; threshold_m = (float)threshold / 1000; @@ -398,6 +405,7 @@ static void set_default_configuration(acc_detector_presence_configuration_t pres * * @param[in] fall_rise_configuration The fall rise configuration to set default values in */ +#if 0 static void set_default_fall_rise_configuration(acc_detector_presence_configuration_t presence_configuration) { acc_detector_presence_configuration_sensor_set(presence_configuration, DEFAULT_SENSOR_ID); @@ -436,8 +444,9 @@ static void set_default_fall_rise_configuration(acc_detector_presence_configurat acc_detector_presence_configuration_nbr_removed_pc_set(presence_configuration, DEFAULT_NBR_REMOVED_PC); acc_detector_presence_configuration_power_save_mode_set(presence_configuration, ACC_POWER_SAVE_MODE_ACTIVE); } +#endif - +#if 0 static void sts_rss_set_current_configuration_full(acc_detector_presence_configuration_t presence_configuration) { acc_detector_presence_configuration_sensor_set(presence_configuration, DEFAULT_SENSOR_ID); @@ -472,7 +481,7 @@ static void sts_rss_set_current_configuration_full(acc_detector_presence_configu acc_detector_presence_configuration_hw_accelerated_average_samples_set(presence_configuration, sts_presence_rss_config.default_hwaas); } - +#endif static void sts_rss_set_configuration_background_evalution(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", @@ -525,21 +534,21 @@ static void sts_rss_set_current_configuration_simple(acc_detector_presence_confi static void print_current_configuration(acc_detector_presence_configuration_t presence_configuration) { - static uint32_t cnt_0=0; - if (cnt_0++%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); + //static uint32_t cnt_0=0; + //if (cnt_0++%200 !=0) return; + sts_run_start = acc_detector_presence_configuration_start_get(presence_configuration); + sts_run_length = acc_detector_presence_configuration_length_get(presence_configuration); + sts_run_threshold = acc_detector_presence_configuration_detection_threshold_get(presence_configuration); + 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); + sts_run_profile = acc_detector_presence_configuration_service_profile_get(presence_configuration); float Sweeps_per_frame = acc_detector_presence_configuration_sweeps_per_frame_get(presence_configuration); sts_rss_threshold = sts_run_threshold; acc_detector_presence_configuration_filter_parameters_t sts_run_filter = acc_detector_presence_configuration_filter_parameters_get(presence_configuration); - float sts_run_f_inter_fast_cutoff = sts_run_filter.inter_frame_fast_cutoff; - float sts_run_f_inter_slow_cutoff = sts_run_filter.inter_frame_slow_cutoff; + sts_run_f_inter_fast_cutoff = sts_run_filter.inter_frame_fast_cutoff; + sts_run_f_inter_slow_cutoff = sts_run_filter.inter_frame_slow_cutoff; #if 0 float sts_run_f_inter_frame_dev_time_const = sts_run_filter.inter_frame_deviation_time_const; @@ -547,7 +556,7 @@ 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; #endif - 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", + APP_LOG(TS_OFF, VLEVEL_M, "\r\nWork_mode:%2d Start: %4d (mm) Length: %4d (mm) Threshold: %d (*) 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_M, "\r\n(1)FastCut:%4u (2)SlowCut:%4u (3)Sweeps_per_frame:%4u \r\n", @@ -571,13 +580,13 @@ static void sts_print_result(acc_detector_presence_result_t result) { uint16_t signal=0; uint16_t dist=0; - uint8_t i=0; + //uint8_t i=0; uint16_t threshold = sts_rss_threshold*1000.0f; signal=(int)(result.presence_score * 1000.0f); dist =(int)(result.presence_distance * 1000.0f); - uint8_t flag=0; + //uint8_t flag=0; if (signal>threshold) { if(dist<500) @@ -642,14 +651,16 @@ static void sts_print_result(acc_detector_presence_result_t result) //Out1_ON //Out2_OFF sts_rss_result=1; - APP_LOG(TS_OFF, VLEVEL_M,"Motion (%5d), Distance: %4dmm Threshold:%6d Yes:%d No:%d \r\n", signal,dist,threshold, yes_count, no_count); + APP_LOG(TS_OFF, VLEVEL_M,"Motion (%5d), Distance: %4dmm [start: %4d length: %4d gain: %3d Threshold:%6d Yes:%d No:%d \r\n", + signal,dist,(int)(sts_run_start*1000.0f), (int)(sts_run_length*1000.0f), (int)(sts_run_gain*100.0f), (int)(sts_run_threshold*1000.0f), yes_count, no_count); } else if(no_count>(TIME_C-1)) { //Out1_OFF //Out2_ON sts_rss_result=0; - APP_LOG(TS_OFF, VLEVEL_M,"NO motion(%5d), Distance: %4dmm Threshold:%6d Yes:%d No:%d \r\n", signal,dist,threshold, yes_count, no_count); + APP_LOG(TS_OFF, VLEVEL_M,"No Motion(%5d), Distance: %4dmm [start: %4d length: %4d gain: %3d Threshold:%6d Yes:%d No:%d \r\n", + signal,dist,(int)(sts_run_start*1000.0f), (int)(sts_run_length*1000.0f), (int)(sts_run_gain*100.0f), (int)(sts_run_threshold*1000.0f), yes_count, no_count); } } @@ -682,10 +693,16 @@ int sts_presence_rss_background_evaluation_process(uint16_t *evaluated_distance, sts_rss_config_updated_flag = STS_RSS_CONFIG_BGN_SCAN; if (rss_handle == NULL) { - sts_presence_rss_detection_init(); + int ret=sts_presence_rss_detection_init(); + if (ret==EXIT_FAILURE) return EXIT_FAILURE; + } else { + sts_presence_rss_detection_deinit(); + int ret2=sts_presence_rss_detection_init(); + if (ret2==EXIT_FAILURE) return EXIT_FAILURE; + } - const int iterations = 1000; + const int iterations = 100; //acc_detector_presence_result_t result; uint16_t motioncount = 0; float average_distance =0.0f; @@ -751,12 +768,10 @@ int sts_presence_rss_detection_init(void) //sts_rss_set_current_configuration_simple(presence_configuration); //update_configuration(presence_configuration); - APP_LOG(TS_OFF, VLEVEL_M, "\r\n STS CFG Configuration \r\n"); - 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_presence_rss_config.default_start_m), (int)(1000.0*sts_presence_rss_config.default_length_m), (int)(1000.0*sts_presence_rss_config.default_threshold), + APP_LOG(TS_OFF, VLEVEL_M, "\r\nBefore Update: Work_mode:%2d CFG: %2d Start: %4d (mm) Length: %4d (mm) Threshold: %4d (*) Gain= %2d (%) UpdateRate=%4d Profile= %d \r\n", + sts_work_mode, sts_rss_config_updated_flag, (int)(1000.0*sts_presence_rss_config.default_start_m), (int)(1000.0*sts_presence_rss_config.default_length_m), (int)(1000.0*sts_presence_rss_config.default_threshold), (int)(100.0*sts_presence_rss_config.default_receiver_gain),(int)sts_presence_rss_config.default_update_rate_presence, (int)sts_presence_rss_config.default_profile); - APP_LOG(TS_OFF, VLEVEL_M, "\r\n STS CFG update flag =%d \r\n", sts_rss_config_updated_flag); update_configuration_with_type(presence_configuration, sts_rss_config_updated_flag); //set_default_configuration(presence_configuration); print_current_configuration(presence_configuration); @@ -796,10 +811,11 @@ int sts_presence_rss_detection_process(void) if (!success) { APP_LOG(TS_OFF, VLEVEL_M,"acc_detector_presence_get_next() failed\n"); - + return EXIT_FAILURE; } sts_print_result(rss_result); + return EXIT_SUCCESS; } int sts_presence_rss_detection_deinit(void) @@ -810,7 +826,7 @@ int sts_presence_rss_detection_deinit(void) if (deactivated) { - APP_LOG(TS_OFF, VLEVEL_M,"Application finished OK\n"); + APP_LOG(TS_OFF, VLEVEL_M,"\r\n rss presence detector De-inited \r\n"); return EXIT_SUCCESS; } else return EXIT_FAILURE; } @@ -860,6 +876,8 @@ int sts_presence_rss_fall_rise_detection(void) } APP_LOG(TS_OFF, VLEVEL_H, "\r\n Update flag=%02x, workmode=%2d \r\n", sts_rss_config_updated_flag, sts_work_mode); + update_configuration_with_type(presence_configuration, sts_rss_config_updated_flag); +#if 0 switch (sts_rss_config_updated_flag) { #if 0 @@ -887,7 +905,7 @@ int sts_presence_rss_fall_rise_detection(void) default: break; } - +#endif // sts_rss_config_updated_flag = STS_RSS_CONFIG_NON; //update finished, set to 0 } @@ -1246,10 +1264,12 @@ void STS_YunhornCheckStandardDeviation(void) uint32_t sum_presence_distance = 0, sum_presence_score=0; //presence score act as magnetic or amplitude of motion uint32_t average_presence_distance = 0, average_presence_score=0; uint32_t variance_presence_distance = 0, variance_presence_score=0; + //uint32_t variance_presence_distance = 0; uint32_t standard_variance_presence_distance = 0, standard_variance_presence_score=0; // ROC -- rate of change uint32_t roc_distance[DEFAULT_MOTION_DATASET_LEN]={0}, sum_roc_distance=0, average_roc_distance=0, variance_roc_distance=0, standard_variance_roc_distance=0; uint32_t roc_acc[DEFAULT_MOTION_DATASET_LEN]={0}, sum_roc_acc=0, average_roc_acc=0, variance_roc_acc=0, standard_variance_roc_acc=0; + //uint32_t roc_acc[DEFAULT_MOTION_DATASET_LEN]={0}, sum_roc_acc=0, average_roc_acc=0, standard_variance_roc_acc=0; //act as speed of change at given time slot acc_integration_sleep_ms(1000 / DEFAULT_UPDATE_RATE_PRESENCE); uint8_t SAMPLE_DATASET_NUM = MIN(motion_count,DEFAULT_MOTION_DATASET_LEN ); APP_LOG(TS_OFF, VLEVEL_M, "\r\n Sample dataset for deviation process =%u \r\n",SAMPLE_DATASET_NUM); diff --git a/Core/Src/yunhorn_sts_presence_rss_bring_up_test.c b/Core/Src/yunhorn_sts_presence_rss_bring_up_test.c index d5f8567..957b4d5 100644 --- a/Core/Src/yunhorn_sts_presence_rss_bring_up_test.c +++ b/Core/Src/yunhorn_sts_presence_rss_bring_up_test.c @@ -43,17 +43,26 @@ int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result); int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result) { uint8_t t=0; - uint8_t test_result[20]={0x0}; + uint8_t test_result[10]={0x0}; - // APP_LOG(TS_OFF, VLEVEL_L,"-- 0 -- Acconeer software version %s\n", acc_version_get()); + APP_LOG(TS_OFF, VLEVEL_H,"-- 0 -- Acconeer software version %s\n", acc_version_get()); const acc_hal_t *hal = acc_hal_integration_get_implementation(); - test_result[t++] = (uint8_t) acc_rss_activate(hal); //(1) + if (!acc_rss_activate(hal)) + { + APP_LOG(TS_OFF, VLEVEL_M, "Failed to activate RSS\n"); + test_result[t++] = 0; + return EXIT_FAILURE; + } else { + test_result[t++] = 1; //(1) + } + + acc_rss_override_sensor_id_check_at_creation(true); acc_rss_assembly_test_configuration_t configuration = acc_rss_assembly_test_configuration_create(); - test_result[t++] = (uint8_t)((configuration != NULL)? 1:0); //(2) + test_result[t++] = (uint8_t)((configuration != NULL)? 2:0); //(2) acc_rss_assembly_test_configuration_sensor_set(configuration, DEFAULT_SENSOR_ID); @@ -69,7 +78,7 @@ int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result) acc_rss_deactivate(); //return EXIT_FAILURE; } else { - test_result[t++] = 1; + test_result[t++] = 3; } acc_rss_assembly_test_configuration_communication_read_test_disable(configuration); @@ -83,13 +92,12 @@ int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result) acc_rss_deactivate(); //return EXIT_FAILURE; } else { - test_result[t++] = 1; + test_result[t++] = 4; } - acc_rss_assembly_test_configuration_communication_write_read_test_disable(configuration); // Enable and run: Interrupt Test - // APP_LOG(TS_OFF, VLEVEL_L,"-- Interrupt Test --- Start ********************\r\n"); + //APP_LOG(TS_OFF, VLEVEL_L,"-- Interrupt Test --- Start ********************\r\n"); acc_rss_assembly_test_configuration_communication_interrupt_test_enable(configuration); if (!run_test(configuration)) @@ -100,14 +108,16 @@ int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result) //return EXIT_FAILURE; } else { - test_result[t++] = 1; + test_result[t++] = 5; } acc_rss_assembly_test_configuration_communication_interrupt_test_disable(configuration); - // APP_LOG(TS_OFF, VLEVEL_L,"-- Interrupt Test --- End ********************\r\n"); + + // APP_LOG(TS_OFF, VLEVEL_L,"-- Interrupt Test --- End ********************\r\n"); +#if 0 // Enable and run: Clock Test - // APP_LOG(TS_OFF, VLEVEL_L,"-- Clock Test --- Start ********************\r\n"); + APP_LOG(TS_OFF, VLEVEL_L,"-- Clock Test --- Start ********************\r\n"); acc_rss_assembly_test_configuration_clock_test_enable(configuration); if (!run_test(configuration)) { @@ -125,7 +135,7 @@ int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result) // Enable and run: Power cycle test - // APP_LOG(TS_OFF, VLEVEL_L,"-- Power cycle test --- Start ********************\r\n"); + APP_LOG(TS_OFF, VLEVEL_L,"-- Power cycle test --- Start ********************\r\n"); acc_rss_assembly_test_configuration_power_cycle_test_enable(configuration); if (!run_test(configuration)) { @@ -140,10 +150,10 @@ int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result) acc_rss_assembly_test_configuration_power_cycle_test_disable(configuration); // APP_LOG(TS_OFF, VLEVEL_L,"-- Power cycle test --- end ********************\r\n"); - +#endif // Enable and run: Hibernate Test - // APP_LOG(TS_OFF, VLEVEL_L,"-- Hibernate Test --- Start ********************\r\n"); + //APP_LOG(TS_OFF, VLEVEL_L,"-- Hibernate Test --- Start ********************\r\n"); acc_rss_assembly_test_configuration_communication_hibernate_test_enable(configuration); if (!run_test(configuration)) { @@ -153,14 +163,14 @@ int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result) //return EXIT_FAILURE; } else { - test_result[t++] = 1; + test_result[t++] = 6; } acc_rss_assembly_test_configuration_communication_hibernate_test_disable(configuration); // APP_LOG(TS_OFF, VLEVEL_L,"-- Hibernate Test --- End ********************\r\n"); // Enable and run: Supply Test - // APP_LOG(TS_OFF, VLEVEL_L,"-- Supply Test --- Start ********************\r\n"); + //APP_LOG(TS_OFF, VLEVEL_L,"-- Supply Test --- Start ********************\r\n"); acc_rss_assembly_test_configuration_supply_test_enable(configuration); if (!run_test(configuration)) { @@ -170,11 +180,11 @@ int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result) //return EXIT_FAILURE; } else { - test_result[t++] = 1; + test_result[t++] = 7; } acc_rss_assembly_test_configuration_supply_test_disable(configuration); - // APP_LOG(TS_OFF, VLEVEL_L,"-- Supply Test --- End ********************\r\n"); + //APP_LOG(TS_OFF, VLEVEL_L,"-- Supply Test --- End ********************\r\n"); // Enable and run: Clock Test // APP_LOG(TS_OFF, VLEVEL_L,"-- Clock Test --- Start ********************\r\n"); @@ -187,14 +197,14 @@ int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result) //return EXIT_FAILURE; } else { - test_result[t++] = 1; + test_result[t++] = 8; } acc_rss_assembly_test_configuration_clock_test_disable(configuration); - // APP_LOG(TS_OFF, VLEVEL_L,"-- Clock Test --- end ********************\r\n"); + //APP_LOG(TS_OFF, VLEVEL_L,"-- Clock Test --- end ********************\r\n"); // Enable and run: Power cycle test - // APP_LOG(TS_OFF, VLEVEL_L,"-- Power cycle test --- Start ********************\r\n"); + //APP_LOG(TS_OFF, VLEVEL_L,"-- Power cycle test --- Start ********************\r\n"); acc_rss_assembly_test_configuration_power_cycle_test_enable(configuration); if (!run_test(configuration)) { @@ -204,18 +214,22 @@ int sts_presence_rss_bring_up_test(uint8_t *rss_self_test_result) //return EXIT_FAILURE; } else { - test_result[t++] = 1; + test_result[t++] = 9; } acc_rss_assembly_test_configuration_power_cycle_test_disable(configuration); - // APP_LOG(TS_OFF, VLEVEL_L,"-- Power cycle test --- end ********************\r\n"); + // APP_LOG(TS_OFF, VLEVEL_L,"-- Power cycle test --- end ********************\r\n"); - // APP_LOG(TS_OFF, VLEVEL_L,"-- 10 -- Bring up test: All tests passed\n"); - test_result[t++] = 1; //(10) + //APP_LOG(TS_OFF, VLEVEL_L,"-- 10 -- Bring up test: All tests passed\n"); + test_result[t++] = 10; //(10) + for (uint8_t j=0; j<10; j++) { + //APP_LOG(TS_OFF, VLEVEL_M, "|%02x ", test_result[j]); + *(rss_self_test_result+j) = (void*)test_result[j]; + //APP_LOG(TS_OFF, VLEVEL_M, "=%02x ", rss_self_test_result[j]); + } - memcpy(rss_self_test_result, test_result, 12); - // APP_LOG(TS_OFF, VLEVEL_L,"--Bring up test result #=%d \r\n", t); + //UTIL_MEM_cpy_8((void*)rss_self_test_result, (void*)test_result, 10); acc_rss_assembly_test_configuration_destroy(&configuration); acc_rss_deactivate(); @@ -231,7 +245,7 @@ static bool run_test(acc_rss_assembly_test_configuration_t configuration) if (!acc_rss_assembly_test(configuration, test_results, &nr_of_test_results)) { - APP_LOG(TS_OFF, VLEVEL_L,"Bring up test: Failed to complete\n"); + APP_LOG(TS_OFF, VLEVEL_M,"Bring up test: Failed to complete\n"); return false; } else { APP_LOG(TS_OFF, VLEVEL_H,"Bring up test: SUCCESS to complete\n"); @@ -241,7 +255,7 @@ static bool run_test(acc_rss_assembly_test_configuration_t configuration) for (uint16_t i = 0; i < nr_of_test_results; i++) { const bool passed = test_results[i].test_passed; - APP_LOG(TS_OFF, VLEVEL_L,"Name: %s, result: %s\n", test_results[i].test_name, passed ? "Pass" : "Fail"); + APP_LOG(TS_OFF, VLEVEL_H,"Name: %s, result: %s\n", test_results[i].test_name, passed ? "Pass" : "Fail"); if (!passed) { diff --git a/Core/Src/yunhorn_sts_process.c b/Core/Src/yunhorn_sts_process.c index 872939d..143d9aa 100644 --- a/Core/Src/yunhorn_sts_process.c +++ b/Core/Src/yunhorn_sts_process.c @@ -333,9 +333,17 @@ void STS_YunhornSTSEventP2_Process(void) } #endif //int res = sts_presence_rss_fall_rise_detection(); - if (rss_handle == NULL) { - sts_presence_rss_detection_init(); + if ((rss_handle == NULL)) { + sts_rss_config_updated_flag &= 0x7F; + int ret=sts_presence_rss_detection_init(); + if (ret==EXIT_FAILURE) return; + } else if ((sts_rss_config_updated_flag&0x80) !=0 ) { + sts_rss_config_updated_flag &= 0x7F; + sts_presence_rss_detection_deinit(); + int ret2=sts_presence_rss_detection_init(); + if (ret2==EXIT_FAILURE) return; } + int res = sts_presence_rss_detection_process(); if (res == 0) { @@ -771,8 +779,9 @@ void STS_PRESENCE_SENSOR_NVM_CFG(void) sts_rss_cfg_slid_win_size = (uint8_t)(sts_cfg_nvm.p[RSS_CFG_SLID_WIN])&0x0F; APP_LOG(TS_ON, VLEVEL_H, "\r\n##### Reboot --- with NVM CFG'ED RSS flag =%02x \r\n", sts_rss_config_updated_flag); -} +} +#if 0 void STS_PRESENCE_SENSOR_NVM_CFG_SIMPLE(void) { sts_presence_rss_config.default_start_m = (float)(sts_cfg_nvm.p[RSS_CFG_START_M]*0.1f); @@ -798,7 +807,7 @@ void STS_PRESENCE_SENSOR_NVM_CFG_SIMPLE(void) sts_rss_cfg_slid_win_threshold = (uint8_t)(sts_cfg_nvm.p[RSS_CFG_SLID_WIN])>>4; sts_rss_cfg_slid_win_size = (uint8_t)(sts_cfg_nvm.p[RSS_CFG_SLID_WIN])&0x0F; } - +#endif void STS_PRESENCE_SENSOR_Init_Send_Data(void) { //sts_o7_sensorData.lamp_bar_color = STS_GREEN; @@ -1060,9 +1069,13 @@ void STS_PRESENCE_SENSOR_RSS_Init(void) } #endif -void STS_PRESENCE_SENSOR_Distance_Measure_Process(void) +void STS_PRESENCE_SENSOR_Distance_Measure_Process(uint16_t *rss_distance) { - uint8_t exit_status = EXIT_SUCCESS, i=0; + int exit_status = EXIT_SUCCESS, i=0; + uint16_t tmp_distance=0; + + + sts_presence_rss_detection_deinit(); APP_LOG(TS_OFF, VLEVEL_M, "\r\n ****start_m=%u length_m=%u profile=%u hwaas=%u \r\n", (unsigned int)(distance_cfg.start_m*1000),(unsigned int)(distance_cfg.length_m*1000), @@ -1070,11 +1083,15 @@ void STS_PRESENCE_SENSOR_Distance_Measure_Process(void) do { LED1_TOGGLE; - exit_status = sts_distance_rss_detector_distance(); - HAL_Delay(10); - i++; - } while ((exit_status == EXIT_FAILURE) && (i < 1)); + // exit_status = sts_distance_rss_detector_distance(); + exit_status = sts_distance_rss_detector_distance(&tmp_distance); + APP_LOG(TS_OFF, VLEVEL_M, "\r\n round: %d exit_status= %d Measured dist= %d \r\n", i, exit_status, tmp_distance); + //HAL_Delay(250); + i++; + } while ((exit_status == EXIT_FAILURE) && (i < 3) && (tmp_distance !=0)); + + *rss_distance = tmp_distance; LED1_ON; } @@ -1082,7 +1099,7 @@ void STS_PRESENCE_SENSOR_Distance_Measure_Process(void) void STS_PRESENCE_SENSOR_Background_Measure_Process(uint16_t *bg_distance, uint16_t *bg_motion_noise) { - uint8_t previous_sts_work_mode = sts_work_mode, previous_sts_lamp_bar_color = sts_lamp_bar_color; + uint8_t previous_sts_work_mode = sts_work_mode, previous_sts_lamp_bar_color = sts_lamp_bar_color, previous_sts_rss_config_updated_flag = sts_rss_config_updated_flag; uint16_t distance_center=0, motion_noise=0; sts_work_mode = STS_RSS_BACKGROUND_MODE; @@ -1090,7 +1107,8 @@ void STS_PRESENCE_SENSOR_Background_Measure_Process(uint16_t *bg_distance, uint1 APP_LOG(TS_OFF, VLEVEL_M, "\r\n SCAN Background Noise ... \r\n"); - sts_presence_rss_background_evaluation_process(&distance_center, &motion_noise); + int ret=sts_presence_rss_background_evaluation_process(&distance_center, &motion_noise); + if (ret== EXIT_FAILURE) return; APP_LOG(TS_OFF, VLEVEL_H, "\r\n Background Distance center at %d mm, and Motion Noise =%d \r\n", distance_center, motion_noise); @@ -1099,48 +1117,56 @@ void STS_PRESENCE_SENSOR_Background_Measure_Process(uint16_t *bg_distance, uint1 sts_work_mode = previous_sts_work_mode; sts_lamp_bar_color = previous_sts_lamp_bar_color; + sts_rss_config_updated_flag = previous_sts_rss_config_updated_flag|0x80; } -void STS_PRESENCE_SENSOR_Function_Test_Process(uint8_t *self_test_result, uint8_t count) +void STS_PRESENCE_SENSOR_Function_Test_Process(uint8_t *self_test_result, uint8_t *count) { uint8_t bring_up_result[18]={0}; uint8_t previous_lamp_bar_color=sts_lamp_bar_color; uint16_t bg_range=0, bg_noise=0; + int test_res=0; PME_ON; HAL_Init(); MX_GPIO_Init(); HAL_Delay(150); //wait for sensor ready - for (uint8_t i=0;i < count; i++) //while(1) + for (uint8_t i=0;i < 1; i++) //while(1) { STS_Lamp_Bar_Self_Test_Simple(); - STS_Lamp_Bar_Refresh(); HAL_Delay(200); sts_lamp_bar_color = STS_PINK; - sts_presence_rss_bring_up_test(bring_up_result); + sts_presence_rss_detection_deinit(); + test_res = sts_presence_rss_bring_up_test(bring_up_result); + if (test_res != EXIT_SUCCESS) { + APP_LOG(TS_OFF, VLEVEL_M, "\r\n Bring up test failed \r\n"); + } else { + APP_LOG(TS_OFF, VLEVEL_M, "\r\n Bring up test success \r\n"); + } HAL_Delay(200); sts_lamp_bar_color = STS_CYAN; - STS_PRESENCE_SENSOR_Distance_Measure_Process(); + uint16_t tmp_dist=0; + STS_PRESENCE_SENSOR_Distance_Measure_Process(&tmp_dist); + sts_sensor_install_height = tmp_dist; bring_up_result[12]=sts_sensor_install_height>>8&0xff; bring_up_result[13]=sts_sensor_install_height&0xff; - HAL_Delay(200); - + HAL_Delay(50); + sts_lamp_bar_color = STS_BLUE; STS_PRESENCE_SENSOR_Background_Measure_Process(&bg_range, &bg_noise); bring_up_result[14]=bg_range>>8&0xff; bring_up_result[15]=bg_range&0xff; bring_up_result[16]=bg_noise>>8&0xff; bring_up_result[17]=bg_noise&0xff; - } - HAL_Delay(200); + HAL_Delay(50); sts_lamp_bar_color = previous_lamp_bar_color; - - UTIL_MEM_cpy_8(self_test_result, bring_up_result, sizeof(bring_up_result)); + *count = sizeof(bring_up_result); + UTIL_MEM_cpy_8((void*)self_test_result, (void*)bring_up_result, sizeof(bring_up_result)); } diff --git a/LoRaWAN/App/lora_app.c b/LoRaWAN/App/lora_app.c index d759f28..e14f538 100644 --- a/LoRaWAN/App/lora_app.c +++ b/LoRaWAN/App/lora_app.c @@ -2041,8 +2041,9 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, uint8_t tlv_buf_size) //STS_SENSOR_Upload_Message(LORAWAN_USER_APP_CTRL_REPLY_PORT, i, (uint8_t *)outbuf); i=0; - + UTIL_TIMER_Stop(&YunhornSTSRSSWakeUpTimer); STS_SENSOR_Function_Test_Process(); + UTIL_TIMER_Start(&YunhornSTSRSSWakeUpTimer); #if 0 HAL_Delay(5000); i=21; @@ -2065,10 +2066,10 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, uint8_t tlv_buf_size) //outbuf[i++] = (uint8_t) 'Z'; //outbuf[i++] = (uint8_t) 'D'; //STS_SENSOR_Upload_Message(LORAWAN_USER_APP_CTRL_REPLY_PORT, i, (uint8_t *)outbuf); + uint16_t rss_distance=0; + STS_PRESENCE_SENSOR_Distance_Measure_Process(&rss_distance); - STS_SENSOR_Distance_Test_Process(); - - APP_LOG(TS_OFF, VLEVEL_H, "\r\nRSS Measured Distance=[%u] mm \r\n", (uint16_t)sts_distance_rss_distance); + APP_LOG(TS_OFF, VLEVEL_M, "\r\nRSS Measured Distance=[%u] mm \r\n", (uint16_t)sts_distance_rss_distance); // Store valid installation height value sts_cfg_nvm.mtmcode1 = (uint8_t)sts_mtmcode1; @@ -2082,7 +2083,7 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, uint8_t tlv_buf_size) i=0; - //memset((void*)outbuf,0x0, sizeof(outbuf)); + memset((void*)outbuf,0x0, sizeof(outbuf)); outbuf[i++] = (uint8_t)'D'; outbuf[i++] = (uint8_t)sts_mtmcode1; outbuf[i++] = (uint8_t)sts_mtmcode2; @@ -2612,21 +2613,22 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, uint8_t tlv_buf_size) case STS_REEDSWITCH_MODE: sts_cfg_nvm.sts_ioc_mask = STS_IOC_MODE_2_MASK; + sts_rss_config_updated_flag = STS_RSS_CONFIG_NON; break; case STS_RSS_MODE: sts_cfg_nvm.sts_ioc_mask = STS_IOC_MODE_3_MASK; - sts_rss_config_updated_flag = STS_RSS_CONFIG_DEFAULT; + sts_rss_config_updated_flag = STS_RSS_CONFIG_SIMPLE|0x80; break; case STS_DUAL_MODE: sts_cfg_nvm.sts_ioc_mask = STS_IOC_MODE_4_MASK; - sts_rss_config_updated_flag = STS_RSS_CONFIG_DEFAULT; + sts_rss_config_updated_flag = STS_RSS_CONFIG_SIMPLE|0x80; break; case STS_UNI_MODE: sts_cfg_nvm.sts_ioc_mask = STS_IOC_MODE_5_MASK; - sts_rss_config_updated_flag = STS_RSS_CONFIG_FALL_DETECTION; + sts_rss_config_updated_flag = STS_RSS_CONFIG_FALL_DETECTION|0x80; sts_presence_fall_detection=TRUE; break; @@ -2692,7 +2694,7 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, uint8_t tlv_buf_size) if (invalid_flag == 0) { - sts_cfg_nvm.p[RSS_CFG_UPDATE_FLAG] = STS_RSS_CONFIG_FULL; + sts_cfg_nvm.p[RSS_CFG_UPDATE_FLAG] = STS_RSS_CONFIG_FULL|0x80; STS_PRESENCE_SENSOR_NVM_CFG(); @@ -2737,8 +2739,9 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, uint8_t tlv_buf_size) APP_LOG(TS_OFF, VLEVEL_M,"\r\nStart,Lenght,threshold,gain=%02x %02x %02x %02x \r\n", sts_cfg_nvm.p[RSS_CFG_START_M],sts_cfg_nvm.p[RSS_CFG_LENGTH_M],sts_cfg_nvm.p[RSS_CFG_THRESHOLD],sts_cfg_nvm.p[RSS_CFG_RECEIVER_GAIN]); - sts_cfg_nvm.p[RSS_CFG_UPDATE_FLAG] = STS_RSS_CONFIG_SIMPLE; - STS_PRESENCE_SENSOR_NVM_CFG_SIMPLE(); + sts_cfg_nvm.p[RSS_CFG_UPDATE_FLAG] = STS_RSS_CONFIG_SIMPLE|0x80; + //STS_PRESENCE_SENSOR_NVM_CFG_SIMPLE(); + STS_PRESENCE_SENSOR_NVM_CFG(); // update 2025 05 06 i=0; // Step 1: Prepare status update message UTIL_MEM_set_8((void*)outbuf, 0x0, sizeof(outbuf)); @@ -2859,9 +2862,9 @@ void STS_SENSOR_Upload_Message(uint8_t appDataPort, uint8_t appBufferSize, uint8 //UTIL_MEM_cpy_8(AppData.Buffer, appDataBuffer, appBufferSize); AppData.Port = appDataPort; - AppData.BufferSize = (sts_service_mask >1 ?0:appBufferSize); + AppData.BufferSize = ((sts_service_mask >1)? 0 :appBufferSize); - APP_LOG(TS_OFF, VLEVEL_L, "###########Service Mask = %d Buffer Size =%d \r\n", sts_service_mask, AppData.BufferSize); + APP_LOG(TS_OFF, VLEVEL_H, "###########Service Mask = %d Buffer Size =%d \r\n", sts_service_mask, AppData.BufferSize); if ((JoinLedTimer.IsRunning) && (LmHandlerJoinStatus() == LORAMAC_HANDLER_SET)) { @@ -2874,25 +2877,26 @@ void STS_SENSOR_Upload_Message(uint8_t appDataPort, uint8_t appBufferSize, uint8 status = LmHandlerSend(&AppData, LmHandlerParams.IsTxConfirmed, false); if (LORAMAC_HANDLER_SUCCESS == status) { - APP_LOG(TS_ON, VLEVEL_H, "SEND REQUEST\r\n"); + APP_LOG(TS_ON, VLEVEL_M, "SEND REQUEST\r\n"); } else if (LORAMAC_HANDLER_DUTYCYCLE_RESTRICTED == status) { nextTxIn = LmHandlerGetDutyCycleWaitTime(); if (nextTxIn > 0) { - APP_LOG(TS_ON, VLEVEL_H, "Next Tx in : ~%d second(s)\r\n", (nextTxIn / 1000)); + APP_LOG(TS_ON, VLEVEL_M, "Next Tx in : ~%d second(s)\r\n", (nextTxIn / 1000)); } } } - +#if 0 if (EventType == TX_ON_TIMER) { UTIL_TIMER_Stop(&TxTimer); UTIL_TIMER_SetPeriod(&TxTimer, MAX(nextTxIn, TxPeriodicity)); UTIL_TIMER_Start(&TxTimer); } +#endif } void OnStoreSTSCFGContextRequest(void) @@ -3132,7 +3136,7 @@ void OnRestoreSTSCFGContextProcess(void) void STS_SENSOR_Distance_Test_Process(void) { #if defined(STS_O6)||defined(STS_O7) - STS_PRESENCE_SENSOR_Distance_Measure_Process(); + //STS_PRESENCE_SENSOR_Distance_Measure_Process(); #endif #if defined(YUNHORN_STS_R0_ENABLED)||defined(YUNHORN_STS_R5_ENABLED) @@ -3142,7 +3146,7 @@ void STS_SENSOR_Distance_Test_Process(void) void STS_SENSOR_Function_Test_Process(void) { - uint8_t tstbuf[128] ={0x0}; uint8_t i=0, count = 1; + uint8_t tstbuf[128] ={0x0}; uint8_t i=0, count = 0; uint8_t mems_Dev_ID[2] = {0x0}; tstbuf[i++] = (uint8_t) 'S'; @@ -3164,10 +3168,10 @@ void STS_SENSOR_Function_Test_Process(void) #if defined(STS_O7)||defined(STS_O6) uint8_t self_test_result[18]={0x0}; - STS_PRESENCE_SENSOR_Function_Test_Process(self_test_result, count); + STS_PRESENCE_SENSOR_Function_Test_Process(self_test_result, &count); - for (uint8_t j=0; j < 18; j++) - tstbuf[i++] = (uint8_t) (self_test_result[j])&0xff; + for (uint8_t j=0; j < count; j++) + tstbuf[i++] = (uint8_t) (self_test_result[j]&0xff); //STS_PRESENCE_SENSOR_Distance_Measure_Process(); #if 0 @@ -3199,7 +3203,7 @@ void STS_SENSOR_Function_Test_Process(void) } //memset((void*)outbuf,0x0, sizeof(outbuf)); - UTIL_MEM_cpy_8((void*)outbuf, (void*)tstbuf, sizeof(tstbuf)); + UTIL_MEM_cpy_8((void*)outbuf, (void*)tstbuf, i); STS_SENSOR_Upload_Message(LORAWAN_USER_APP_CTRL_REPLY_PORT, i, (uint8_t*)outbuf); } diff --git a/STM32CubeIDE/Release/STS_O7.bin b/STM32CubeIDE/Release/STS_O7.bin index 26f78976b70af801c85f27e93baae94315d0eb4e..bc0c8efbc7b5f307d32f8cdc8684f93270071005 100644 GIT binary patch delta 65473 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 delta 64234 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

FTX>$m*sZcMH@iqOrJ@s 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 H3SRyXy3n0$