From 6af9e82016174b2a05aa446b48080fe4ce809d58 Mon Sep 17 00:00:00 2001 From: YunHorn Technology Date: Wed, 8 May 2024 15:00:50 +0800 Subject: [PATCH] combined sts_process --- Core/Inc/sts_lamp_bar.h | 9 +- Core/Inc/yunhorn_sts_sensors.h | 8 + Core/Src/sts_lamp_bar.c | 210 +----- Core/Src/yunhorn_sts_presence_rss.c | 6 +- Core/Src/yunhorn_sts_process.c | 1069 +++++++++++++++++++++++++++ LoRaWAN/App/lora_app.c | 7 + STM32CubeIDE/.project | 4 +- STM32CubeIDE/Release/STS_O7.bin | Bin 253848 -> 253616 bytes 8 files changed, 1108 insertions(+), 205 deletions(-) create mode 100644 Core/Src/yunhorn_sts_process.c diff --git a/Core/Inc/sts_lamp_bar.h b/Core/Inc/sts_lamp_bar.h index f368f60..25555b3 100644 --- a/Core/Inc/sts_lamp_bar.h +++ b/Core/Inc/sts_lamp_bar.h @@ -94,14 +94,7 @@ void STS_Lamp_Bar_Scoller(uint8_t color, uint8_t luminance_level); void STS_Lamp_Bar_Set_STS_RGB_Color(uint8_t sts_lamp_color, uint8_t luminance_level); void STS_Lamp_Bar_Refresh(void); -void STS_YunhornSTSEventP1_Process(void); -void STS_YunhornSTSEventP2_Process(void); -void STS_YunhornSTSEventP3_Process(void); -void STS_YunhornSTSEventP4_Process(void); -void STS_YunhornSTSEventP5_Process(void); -void STS_YunhornSTSEventP6_Process(void); -void STS_YunhornSTSEventP7_Process(void); -void STS_YunhornSTSEventP8_Process(void); + #ifdef __cplusplus } diff --git a/Core/Inc/yunhorn_sts_sensors.h b/Core/Inc/yunhorn_sts_sensors.h index 89ffce9..45a921d 100644 --- a/Core/Inc/yunhorn_sts_sensors.h +++ b/Core/Inc/yunhorn_sts_sensors.h @@ -580,6 +580,14 @@ void OnRestoreSTSCFGContextProcess(void); * @brief Read duty cycle level count from flash */ //uint8_t * read_duty_cycle_level_from_flash(uint8_t *flash_code_duty_cycle_level, uint32_t Save_Config_Flash_Addr); +void STS_YunhornSTSEventP1_Process(void); +void STS_YunhornSTSEventP2_Process(void); +void STS_YunhornSTSEventP3_Process(void); +void STS_YunhornSTSEventP4_Process(void); +void STS_YunhornSTSEventP5_Process(void); +void STS_YunhornSTSEventP6_Process(void); +void STS_YunhornSTSEventP7_Process(void); +void STS_YunhornSTSEventP8_Process(void); void STS_SENSOR_Power_ON(uint8_t cnt); void STS_SENSOR_Power_OFF(uint8_t cnt); diff --git a/Core/Src/sts_lamp_bar.c b/Core/Src/sts_lamp_bar.c index 38506a4..135b8c7 100644 --- a/Core/Src/sts_lamp_bar.c +++ b/Core/Src/sts_lamp_bar.c @@ -53,26 +53,26 @@ volatile WS2812B_FrameTypeDef rgb_buf = { uint8_t color_rgb[8][3] = { //STS_COLOR R G B MAPPING TABLE {0,0,0},{0,1,0},{1,0,0},{0,0,1},{1,1,0},{1,0,1},{0,1,1},{1,1,1} }; -volatile uint8_t sts_service_mask; -volatile uint8_t sts_work_mode = STS_DUAL_MODE; +extern volatile uint8_t sts_service_mask; +extern volatile uint8_t sts_work_mode; volatile uint8_t sts_reed_hall_ext_int = 0; volatile uint8_t sts_status_color = STS_DARK; volatile uint8_t sts_lamp_bar_color = STS_GREEN; //puColor volatile uint8_t sts_cloud_netcolor = STS_GREEN; //netColor -volatile uint8_t sts_occupancy_status; +extern volatile uint8_t sts_occupancy_status; -volatile uint8_t sts_reed_hall_result =0, sts_emergency_button_pushed=0; // inital 0 = close +extern volatile uint8_t sts_reed_hall_result, sts_emergency_button_pushed; // inital 0 = close volatile uint8_t sts_hall1_read=0,sts_hall2_read=0; // Above hall1_read == reed_hall_result, hall2_read == emergency_button -volatile uint8_t sts_tof_result_changed_flag = 0; -volatile uint8_t sts_water_leakage_result=0; -volatile uint8_t sts_water_leakage_changed_flag=0; +extern volatile uint8_t sts_tof_result_changed_flag; -volatile uint8_t sts_rss_result_changed_flag = 0, sts_hall1_changed_flag=0, sts_hall2_changed_flag=0, sts_reed_hall_changed_flag = 0; -volatile uint8_t sts_rss_result = STS_RESULT_NO_MOTION; -volatile uint8_t sts_rss_2nd_result = STS_RESULT_NO_MOTION; //2nd RSS sensor status -volatile uint8_t sts_tof_result = STS_RESULT_NO_MOTION; -volatile uint8_t last_sts_rss_result, last_sts_hall1_result, last_sts_hall2_result; -volatile uint8_t last_sts_reed_hall_result = 2; //Initial state, not 0, not 1 + + +extern volatile uint8_t sts_rss_result_changed_flag, sts_hall1_changed_flag, sts_hall2_changed_flag, sts_reed_hall_changed_flag; +extern volatile uint8_t sts_rss_result; +extern volatile uint8_t sts_rss_2nd_result; //2nd RSS sensor status +extern volatile uint8_t sts_tof_result; + +//extern volatile uint8_t last_sts_reed_hall_result = 2; //Initial state, not 0, not 1 volatile uint8_t last_lamp_bar_color; extern volatile uint8_t sts_presence_fall_detection; extern volatile float sts_presence_rss_distance; @@ -81,187 +81,9 @@ extern SysTime_t mems_event_time; extern volatile uint32_t event_start_time, event_stop_time; uint8_t luminance_level = DEFAULT_LUMINANCE_LEVEL; -void STS_YunhornSTSEventP1_Process(void) -{ - STS_Lamp_Bar_Refresh(); - if ((sts_work_mode == STS_WIRED_MODE) || (sts_work_mode == STS_REEDSWITCH_MODE) || (sts_work_mode == STS_DUAL_MODE)) - { - STS_Reed_Hall_Presence_Detection(); - - if (sts_reed_hall_result == last_sts_reed_hall_result) { - sts_reed_hall_changed_flag = 0; - } else { - sts_reed_hall_changed_flag = 1; - STS_Combined_Status_Processing(); - } - - last_sts_reed_hall_result = sts_reed_hall_result; - } - -} - -void STS_YunhornSTSEventP2_Process(void) -{ - STS_Lamp_Bar_Refresh(); //TODO XXX eliminate refresh every second.... try - if ((sts_work_mode >= STS_RSS_MODE) && (sts_work_mode <= STS_TOF_RSS_MODE)) - { - STS_RSS_Smart_Presence_Detection(); - STS_Reed_Hall_Presence_Detection(); -#if 0 - if (sts_rss_result == last_sts_rss_result) { - sts_rss_result_changed_flag =0; - } else { - sts_rss_result_changed_flag =1; - last_sts_rss_result = sts_rss_result; - } -#endif - sts_rss_result_changed_flag = (sts_rss_result == last_sts_rss_result)? 0:1; - last_sts_rss_result = sts_rss_result; -#if 0 - if (sts_reed_hall_result == last_sts_reed_hall_result) - { - sts_reed_hall_changed_flag = 0; - - } else - { - sts_reed_hall_changed_flag = 1; - } -#endif - sts_hall1_changed_flag = (sts_hall1_read == last_sts_hall1_result)? 0:1; - last_sts_hall1_result = sts_hall1_read; - sts_hall2_changed_flag = (sts_hall2_read == last_sts_hall2_result)? 0:1; - last_sts_hall2_result = sts_hall2_read; - sts_reed_hall_changed_flag = sts_hall1_changed_flag|sts_hall2_changed_flag; - sts_reed_hall_result = last_sts_hall2_result|last_sts_hall1_result; - sts_reed_hall_changed_flag = (sts_reed_hall_result == last_sts_reed_hall_result)? 0:1; - - if (sts_service_mask > 0 ) { - sts_rss_result_changed_flag =0; - sts_reed_hall_changed_flag = 0; - } - - STS_Combined_Status_Processing(); - - last_sts_rss_result = sts_rss_result; - last_sts_reed_hall_result = sts_reed_hall_result; - } - -} - -void STS_Reed_Hall_Presence_Detection(void) -{ -// HAL_Delay(50); // BOUNCING ELIMIATION -#if 0 - if (STS_Reed_Hall_State == STS_Status_Door_Open) - { - sts_reed_hall_result = STS_Status_Door_Open; - - } else if (STS_Reed_Hall_State == STS_Status_Door_Close) - { - sts_reed_hall_result = STS_Status_Door_Close; - - } -#endif - sts_reed_hall_result = (sts_hall1_read==0)?STS_Status_Door_Close:STS_Status_Door_Open; - - sts_emergency_button_pushed = (sts_hall2_read==0)?STS_Status_Door_Close:STS_Status_Door_Open; //(STS_Emergency_Button_State==STS_Status_Door_Open)? 0:1; - - //sts_reed_hall_result = ((STS_Reed_Hall_State)&STS_Status_Door_Open); - -// HAL_Delay(20); // BOUNCING ELIMIATION - - sts_reed_hall_changed_flag = 0; - - sts_reed_hall_ext_int = 0; - -} - -void STS_RSS_Smart_Presence_Detection(void) -{ - STS_Lamp_Bar_Refresh(); - - //sts_presence_rss_presence_detection(); - - sts_presence_rss_fall_rise_detection(); - -// if (sts_presence_fall_detection) { -// STS_YunhornSTSFallDetection(); -// } - -} - -/* - * STS P3 process, Lamp Bar Scoller - */ -void STS_YunhornSTSEventP3_Process(void) -{ - STS_Lamp_Bar_Refresh(); - if (STS_Reed_Hall_State == STS_Status_Door_Open) - { - sts_lamp_bar_color =STS_GREEN; - } - else - { - sts_lamp_bar_color =STS_RED; - } - STS_Lamp_Bar_Scoller(sts_lamp_bar_color, luminance_level); -} - -/* - * STS SOAP Level detection Process, STS_CAP_Sensor_Detection Process - * STS_CAP_SWITCH(ON) Boost Voltage to 5V, then hold for 1000 ms - * HAL_Delay(1000) (ms) - * STS_CAP_Read_Data() Read STS_CAP_DATA state - * STS_CAP_SWITCH(OFF) Switch Off Boosted Voltage - */ -void STS_YunhornSTSEventP4_Process(void) -{ - - APP_LOG(TS_OFF, VLEVEL_L, "\r\n P4 Testing Process\r\n"); - -} - -/* - * STS P5 Process, Detection ToF distance (VL53L0X) - * - */ - -void STS_YunhornSTSEventP5_Process(void) -{ - APP_LOG(TS_OFF, VLEVEL_L, "\r\n P5 Testing Process\r\n"); -} - -/* - * STS P6 Process, Detection ToF IN-OUT PEOPLE COUNT (VL53L3X) - * - */ - -void STS_YunhornSTSEventP6_Process(void) -{ - APP_LOG(TS_OFF, VLEVEL_L, "\r\n P6 Testing Process\r\n"); -} -/* - * STS P7 Process, Detection IAQ Sensors - * air quality and odor level sensors - */ -void STS_YunhornSTSEventP7_Process(void) -{ - APP_LOG(TS_OFF, VLEVEL_L, "\r\n P7 Testing Process\r\n"); -} - - -/* - * STS P8 Process, Detection xxx Sensors - * xxx sensors - */ - -void STS_YunhornSTSEventP8_Process(void) -{ - APP_LOG(TS_OFF, VLEVEL_L, "\r\n P8 Testing Process\r\n"); -} void STS_Lamp_Bar_Set_Dark(void) @@ -438,8 +260,10 @@ void STS_Combined_Status_Processing(void) break; case STS_WIRED_MODE: // NO LAMP BAR FOR THOSE WATER LEAKAGE SENSOR OR SOAP CAPACITY SENSORS sts_status_color = STS_DARK; +#ifdef STS_M1 sts_water_leakage_result = (sts_reed_hall_result == STS_Status_Door_Open )?STS_RESULT_WATER_LEAKAGE_YES:STS_RESULT_WATER_LEAKAGE_NO; sts_water_leakage_changed_flag = 1; +#endif break; case STS_REEDSWITCH_MODE: @@ -560,14 +384,16 @@ void STS_Combined_Status_Processing(void) } } #if 1 - if ((sts_rss_result_changed_flag)|| (sts_reed_hall_changed_flag) || (sts_tof_result_changed_flag) || (sts_water_leakage_changed_flag)) + //if ((sts_rss_result_changed_flag)|| (sts_reed_hall_changed_flag) || (sts_tof_result_changed_flag) || (sts_water_leakage_changed_flag)) { sensor_data_ready = 1; STS_PRESENCE_SENSOR_Prepare_Send_Data(); sts_rss_result_changed_flag =0; sts_reed_hall_changed_flag =0; sts_tof_result_changed_flag =0; +#ifdef STS_M1 sts_water_leakage_changed_flag=0; +#endif } #endif } diff --git a/Core/Src/yunhorn_sts_presence_rss.c b/Core/Src/yunhorn_sts_presence_rss.c index 7c24082..d1c5058 100644 --- a/Core/Src/yunhorn_sts_presence_rss.c +++ b/Core/Src/yunhorn_sts_presence_rss.c @@ -399,7 +399,7 @@ int sts_presence_rss_fall_rise_detection(void) } acc_detector_presence_deactivate(handle); - APP_LOG(TS_OFF, VLEVEL_L,"First Half Presence Detection, Motion Count = %u \r\n", (int)motion_count); + APP_LOG(TS_OFF, VLEVEL_H,"First Half Presence Detection, Motion Count = %u \r\n", (int)motion_count); // ******** Second Half detection of fall down and rise up @@ -457,7 +457,7 @@ int sts_presence_rss_fall_rise_detection(void) acc_integration_sleep_ms(1000 / DEFAULT_UPDATE_RATE_PRESENCE); // DEFAULT_UPDATE_RATE); } - APP_LOG(TS_OFF, VLEVEL_L,"Second Half, Fall Rise Detection, Motion Count = %u \r\n", (int)motion_count); + APP_LOG(TS_OFF, VLEVEL_H,"Second Half, Fall Rise Detection, Motion Count = %u \r\n", (int)motion_count); sts_rss_result = (average_result > 3)? 1: 0; average_distance = (1000.0f*average_distance)/average_result; // in meters @@ -466,7 +466,7 @@ int sts_presence_rss_fall_rise_detection(void) sts_presence_rss_score = average_score; if (sts_rss_result) //if (average_score !=0) //if (sts_rss_result) { - APP_LOG(TS_OFF, VLEVEL_L,"\r\n######## Motion: %u Distance=%u mm, Score=%u Average_result=%u out of %u \r\n", + APP_LOG(TS_OFF, VLEVEL_H,"\r\n######## Motion: %u Distance=%u mm, Score=%u Average_result=%u out of %u \r\n", (uint8_t)sts_rss_result,(int) average_distance, (int)(average_score), (int)average_result, (int)iterations); } diff --git a/Core/Src/yunhorn_sts_process.c b/Core/Src/yunhorn_sts_process.c new file mode 100644 index 0000000..00ca5d5 --- /dev/null +++ b/Core/Src/yunhorn_sts_process.c @@ -0,0 +1,1069 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file yunhorn_sts_process.c * + * @author Yunhorn (r) Technology Limited Application Team * + * @brief Yunhorn (r) SmarToilets (r) Product configuration file. * + ****************************************************************************** + * @attention + * + * Copyright (c) 2022 Yunhorn Technology Limited. + * Copyright (c) 2022 Shenzhen Yunhorn Technology Co., Ltd. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "stdint.h" +#include "platform.h" +#include "sys_conf.h" +#include "sys_app.h" +#include "stdio.h" +#include "stm32_systime.h" +#include "adc_if.h" +#include "gpio.h" +#include "LmHandler.h" +//#include "app_tof.h" +#include "lora_app.h" +#include "yunhorn_sts_prd_conf.h" +#include "yunhorn_sts_sensors.h" +#include "sts_cmox_hmac_sha.h" + +/* USER CODE BEGIN Includes */ +extern volatile sts_cfg_nvm_t sts_cfg_nvm; +extern volatile uint8_t sts_ac_code[20]; +volatile uint8_t sts_service_mask; +volatile uint32_t rfac_timer; +volatile uint8_t sensor_data_ready; + +extern volatile uint8_t sts_reed_hall_result; +volatile uint8_t last_sts_reed_hall_result; +volatile uint32_t event_start_time, event_stop_time; +volatile uint8_t sts_soap_level_state; +volatile STS_OO_SensorStatusDataTypeDef sts_o7_sensorData; +volatile STS_PRESENCE_SENSOR_Event_Status_t sts_o7_event_status; +volatile float sts_distance_rss_distance; +extern volatile float sts_presence_rss_distance, sts_presence_rss_score; +extern volatile uint8_t sts_hall1_read,sts_hall2_read; +volatile uint8_t sts_rss_config_updated_flag = 0; +extern volatile uint8_t mems_int1_detected, link_wakeup, link_sleep; +volatile uint32_t event_start_time=0, event_stop_time=0; +extern volatile uint8_t sts_occupancy_overtime_state; +extern volatile STS_OO_RSS_SensorTuneDataTypeDef sts_presence_rss_config; +extern volatile sts_cfg_nvm_t sts_cfg_nvm; +extern volatile uint8_t sts_fall_detection_acc_threshold, sts_fall_detection_depth_threshold, sts_occupancy_overtime_threshold; +extern volatile uint8_t sts_unconcious_state; +extern volatile uint16_t sts_unconcious_threshold, sts_unconcious_duration; +extern volatile uint8_t sts_emergency_button_pushed, sts_rss_2nd_result,sts_tof_result, sts_status_color, sts_lamp_bar_color, sts_service_mask; +extern volatile distance_measure_cfg_t distance_cfg; +extern uint8_t sts_fall_rising_detected_result; +extern volatile uint16_t sts_fall_rising_pattern_factor1; +extern volatile uint16_t sts_roc_acc_standard_variance; +extern uint8_t luminance_level; +SysTime_t mems_event_time; + +extern volatile uint8_t sts_reed_hall_ext_int; +volatile uint8_t sts_occupancy_status; +volatile uint8_t sts_hall1_changed_flag=0, sts_hall2_changed_flag=0, last_sts_hall1_result=0, last_sts_hall2_result=0; +volatile uint8_t sts_reed_hall_changed_flag = 0; +extern volatile uint8_t sts_reed_hall_result; +volatile uint8_t sts_water_leakage_result=0; +volatile uint8_t sts_water_leakage_changed_flag=0; +extern volatile uint8_t sensor_data_ready; +#ifdef YUNHORN_STS_R4_ENABLED +volatile STS_R0_SensorDataTypeDef r4_data; +#endif + +#ifdef YUNHORN_STS_O5_ENABLED + +#endif +#ifdef STS_O7 +extern volatile STS_OO_RSS_SensorTuneDataTypeDef sts_presence_rss_config; + +extern volatile distance_measure_cfg_t distance_cfg; +volatile uint8_t sts_work_mode = STS_DUAL_MODE; +extern uint8_t luminance_level; +extern volatile uint8_t sts_status_color; +extern volatile uint8_t sts_lamp_bar_color; //puColor +extern volatile uint8_t sts_cloud_netcolor; //netColor + +volatile uint8_t sts_tof_result_changed_flag = 0; + +volatile uint8_t sts_rss_result_changed_flag = 0; +volatile uint8_t sts_rss_result = STS_RESULT_NO_MOTION; +volatile uint8_t sts_rss_2nd_result = STS_RESULT_NO_MOTION; //2nd RSS sensor status +volatile uint8_t sts_tof_result = STS_RESULT_NO_MOTION; +volatile uint8_t last_sts_rss_result; +extern volatile uint8_t last_sts_rss_result; +//extern volatile uint8_t last_sts_reed_hall_result; +extern volatile uint8_t last_lamp_bar_color; +extern volatile float sts_presence_rss_distance; + +#endif + + +/* + // UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP4), CFG_SEQ_Prio_0); + // P1 --- REEDSWITCH, HALL ELEMENT, WATER LEAKAGE + // P2 --- SEE ABOVE, RSS PRESENCE + // P3 ----LAMP BAR SCOLLER PROCESS + // P4 --- TOF DISTANCE VL53L0X simple distance + // P5 --- TOF IN OUT COUNT VL53L3X in out or duration + // P6 --- SOAP Level, capacitive measurement + // P7 --- UltraSonic, 2nd wave UltraSonic range measure + // P8 --- AIR QUALITY AND ODOR LEVEL, SMOKING DETECTION +*/ + + +/* USER CODE END Includes */ + +/* External variables ---------------------------------------------------------*/ +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ + +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ +#if (defined(YUNHORN_STS_O6_ENABLED) && defined(USE_ACCONEER_A111)) + +#endif + +/* USER CODE END PFP */ + +/* Exported functions --------------------------------------------------------*/ + +void STS_YunhornAuthenticationCode_Process(void) +{ + if ((sts_ac_code[0] == 0x00) && (sts_ac_code[19]== 0x0)) { + APP_LOG(TS_OFF,VLEVEL_M, "Initial AC CODE blank... \r\n"); + return; + } + + sts_service_mask = (sts_hmac_verify()!= 0)? STS_SERVICE_MASK_L2:STS_SERVICE_MASK_L0; + if (sts_service_mask == STS_SERVICE_MASK_L2) { + sts_ac_code[0] = 0x0; + sts_ac_code[19]= 0x0; + } + APP_LOG(TS_OFF, VLEVEL_H, "STS_SERVICE_MASK:%d \r\n",sts_service_mask); +} + +void STS_YunhornSTSEventRFAC_Process(void) +{ + if ((sts_ac_code[0] ==0x0)&& (sts_ac_code[19]== 0x0)) + { + if ((rfac_timer >= STS_BURN_IN_RFAC) && (rfac_timer < (STS_BURN_IN_RFAC +3))) + { + APP_LOG(TS_OFF, VLEVEL_M, "\r\n -------------------RFAC Process\r\n"); + STS_SENSOR_Upload_Message(LORAWAN_USER_APP_CTRL_REPLY_PORT, 4, "RFAC"); + } + if ((rfac_timer > (STS_BURN_IN_RFAC + 2))) + { + APP_LOG(TS_OFF, VLEVEL_M, "\r\n -------------------Verify RFAC Success or Not\r\n"); + sts_service_mask = (sts_hmac_verify()!= 0)? STS_SERVICE_MASK_L2:STS_SERVICE_MASK_L0; + if (sts_service_mask == STS_SERVICE_MASK_L2) { + sts_ac_code[0] = 0x0; + sts_ac_code[19] = 0x0; + } + } + } + +} + +/* + * STS-P1 --- REEDSWITCH, HALL ELEMENT, WATER LEAKAGE + */ + +void STS_YunhornSTSEventP1_Process(void) +{ + +#if defined(YUNHORN_STS_O5_ENABLED) + + if ((sts_work_mode == STS_WIRED_MODE) || (sts_work_mode == STS_REEDSWITCH_MODE) || (sts_work_mode == STS_DUAL_MODE)) + { + STS_Reed_Hall_Presence_Detection(); + + if (sts_reed_hall_result == last_sts_reed_hall_result) { + sts_reed_hall_changed_flag = 0; + } else { + sts_reed_hall_changed_flag = 1; +#ifdef LED_ONBOARD + STS_Combined_Status_Processing(); +#endif + } + + last_sts_reed_hall_result = sts_reed_hall_result; + } + +#endif +#if (defined(YUNHORN_STS_O6_ENABLED) && defined(USE_ACCONEER_A111)) + if ((sts_work_mode == STS_WIRED_MODE) || (sts_work_mode == STS_REEDSWITCH_MODE) || (sts_work_mode == STS_DUAL_MODE)) + { + STS_Reed_Hall_Presence_Detection(); + + if (sts_reed_hall_result == last_sts_reed_hall_result) { + sts_reed_hall_changed_flag = 0; + } else { + sts_reed_hall_changed_flag = 1; + STS_Combined_Status_Processing(); + } + + last_sts_reed_hall_result = sts_reed_hall_result; + } +#endif + +} + + +/* + * STS-P2 --- SEE ABOVE, RSS PRESENCE + */ +void STS_YunhornSTSEventP2_Process(void) +{ + STS_Lamp_Bar_Refresh(); //TODO XXX eliminate refresh every second.... try + if ((sts_work_mode >= STS_RSS_MODE) && (sts_work_mode <= STS_TOF_RSS_MODE)) + { + STS_RSS_Smart_Presence_Detection(); + STS_Reed_Hall_Presence_Detection(); +#if 0 + if (sts_rss_result == last_sts_rss_result) { + sts_rss_result_changed_flag =0; + } else { + sts_rss_result_changed_flag =1; + last_sts_rss_result = sts_rss_result; + } +#endif + sts_rss_result_changed_flag = (sts_rss_result == last_sts_rss_result)? 0:1; + last_sts_rss_result = sts_rss_result; +#if 0 + if (sts_reed_hall_result == last_sts_reed_hall_result) + { + sts_reed_hall_changed_flag = 0; + + } else + { + sts_reed_hall_changed_flag = 1; + } +#endif + sts_hall1_changed_flag = (sts_hall1_read == last_sts_hall1_result)? 0:1; + last_sts_hall1_result = sts_hall1_read; + sts_hall2_changed_flag = (sts_hall2_read == last_sts_hall2_result)? 0:1; + last_sts_hall2_result = sts_hall2_read; + sts_reed_hall_changed_flag = sts_hall1_changed_flag|sts_hall2_changed_flag; + sts_reed_hall_result = last_sts_hall2_result|last_sts_hall1_result; + sts_reed_hall_changed_flag = (sts_reed_hall_result == last_sts_reed_hall_result)? 0:1; + + if (sts_service_mask > 0 ) { + sts_rss_result_changed_flag =0; + sts_reed_hall_changed_flag = 0; + } + + STS_Combined_Status_Processing(); + + last_sts_rss_result = sts_rss_result; + last_sts_reed_hall_result = sts_reed_hall_result; + } + +} + +void STS_Reed_Hall_Presence_Detection(void) +{ +// HAL_Delay(50); // BOUNCING ELIMIATION +#if 0 + if (STS_Reed_Hall_State == STS_Status_Door_Open) + { + sts_reed_hall_result = STS_Status_Door_Open; + + } else if (STS_Reed_Hall_State == STS_Status_Door_Close) + { + sts_reed_hall_result = STS_Status_Door_Close; + + } +#endif + sts_reed_hall_result = (sts_hall1_read==0)?STS_Status_Door_Close:STS_Status_Door_Open; + + sts_emergency_button_pushed = (sts_hall2_read==0)?STS_Status_Door_Close:STS_Status_Door_Open; //(STS_Emergency_Button_State==STS_Status_Door_Open)? 0:1; + + //sts_reed_hall_result = ((STS_Reed_Hall_State)&STS_Status_Door_Open); + +// HAL_Delay(20); // BOUNCING ELIMIATION + + sts_reed_hall_changed_flag = 0; + + sts_reed_hall_ext_int = 0; + +} + +void STS_RSS_Smart_Presence_Detection(void) +{ + STS_Lamp_Bar_Refresh(); + + //sts_presence_rss_presence_detection(); + + sts_presence_rss_fall_rise_detection(); + +// if (sts_presence_fall_detection) { +// STS_YunhornSTSFallDetection(); +// } + +} + +/* + * STS P3 process, Lamp Bar Scoller + */ +void STS_YunhornSTSEventP3_Process(void) +{ +#if (defined(YUNHORN_STS_O6_ENABLED) && defined(USE_ACCONEER_A111)) + if (STS_Reed_Hall_State == STS_Status_Door_Open) + { + sts_lamp_bar_color =STS_GREEN; + } + else + { + sts_lamp_bar_color =STS_RED; + } + STS_Lamp_Bar_Scoller(sts_lamp_bar_color, luminance_level); +#endif +} + + +/* + * STS SOAP Level detection Process, STS_CAP_Sensor_Detection Process + * STS_CAP_SWITCH(ON) Boost Voltage to 5V, then hold for 1000 ms + * HAL_Delay(1000) (ms) + * STS_CAP_Read_Data() Read STS_CAP_DATA state + * STS_CAP_SWITCH(OFF) Switch Off Boosted Voltage + */ +/* + * STS-P4 Detection ToF distance (VL53L0X) + * + */ +void STS_YunhornSTSEventP4_Process(void) +{ + STS_SENSOR_Power_ON(0); +#ifdef LED_ONBOARD + LED_ON; + HAL_Delay(10); + LED_OFF; +#endif +#if defined(TOF_1)||defined(TOF_2) + APP_LOG(TS_OFF, VLEVEL_H, "\r\n TOF_1, TOF_2 RANGING Process\r\n"); + STS_TOF_VL53L0X_Range_Process(); +#endif + +#ifdef TOF_3 + APP_LOG(TS_OFF, VLEVEL_H, "\r\n TOF 3 RANGING Process ---- TOF250 Ranging \r\n"); + STS_TOF250_Range_Process(); +#endif + + STS_SENSOR_Power_OFF(0); + +} + + +/* + * STS P5 Process, Detection ToF IN-OUT PEOPLE COUNT (VL53L3X) + * + */ +void STS_YunhornSTSEventP5_Process(void) +{ + APP_LOG(TS_OFF, VLEVEL_L, "\r\n P5 Testing Process\r\n"); +} + +/* + * STS-P6 --- SOAP Level, capacitive measurement + * STS Soap Level Detection Process, STS_CAP_Sensor_Detection Process + * STS_CAP_SWITCH(ON) Boost Voltage to 5V, then hold for 1000 ms + * HAL_Delay(1000) (ms) + * STS_CAP_Read_Data() Read STS_CAP_DATA state + * STS_CAP_SWITCH(OFF) Switch Off Boosted Voltage + */ +void STS_YunhornSTSEventP6_Process(void) +{ + APP_LOG(TS_OFF, VLEVEL_H, "\r\n P6 Testing Process\r\n"); + STS_SENSOR_Power_ON(0); + HAL_Delay(50); +#ifdef LED_ONBOARD + LED_ON; + HAL_Delay(20); + LED_OFF; +#endif +/* 1. Sensor Power On */ +#if defined(SOAP_LEVEL_SENSOR) + HAL_GPIO_WritePin(SOAP_SWITCH_GPIO_Port, SOAP_SWITCH_Pin, GPIO_PIN_SET); + + HAL_Delay(1000); + /* 2. Read sensor state */ + + sts_soap_level_state = HAL_GPIO_ReadPin(SOAP_STATUS_GPIO_Port,SOAP_STATUS_Pin); + APP_LOG(TS_OFF, VLEVEL_L, "\r\n Soap State = %s \r\n", (sts_soap_level_state==0x0)?" +++ Liquid Detected":" --- No Liquid"); + + HAL_GPIO_WritePin(SOAP_SWITCH_GPIO_Port, SOAP_SWITCH_Pin, GPIO_PIN_RESET); + + if (sts_soap_level_state == 0x0) + { +#ifdef LED_ONBOARD + LED_ON; + HAL_Delay(20); + LED_OFF; +#endif + } + +#endif +/* 3. Sensor Power Off */ + STS_SENSOR_Power_OFF(0); +} + + +/* + * STS P7 Process, Detection IAQ Sensors + * air quality and odor level sensors + */ +void STS_YunhornSTSEventP7_Process(void) +{ + APP_LOG(TS_OFF, VLEVEL_L, "\r\n P7 Testing Process\r\n"); + STS_SENSOR_Power_ON(0); + + STS_SENSOR_Power_OFF(0); +} + + +/* + * STS P8 Process, Detection ETR Sensors, Water flow sensors, pulse counting + * PA5 sensors , TIM2_ETR, STS-M4 + */ +void STS_YunhornSTSEventP8_Process(void) +{ + APP_LOG(TS_OFF, VLEVEL_L, "\r\n P8 Testing Process\r\n"); + +} + +/* + * STS P_IO_RS485 Process, Send Out Sensor Data Via RS485 interface + * sensors + */ + +void STS_YunhornSTSEventPIORS485_Process(void) +{ + APP_LOG(TS_OFF, VLEVEL_L, "\r\n P_IO_RS485 Process\r\n"); +} + +#if 0 +void STS_Combined_Status_Processing(void) +{ + + switch (sts_work_mode) + { + case STS_NETWORK_MODE: + sts_status_color = sts_cloud_netcolor; + break; + case STS_WIRED_MODE: // NO LAMP BAR FOR THOSE WATER LEAKAGE SENSOR OR SOAP CAPACITY SENSORS + sts_status_color = STS_DARK; + sts_water_leakage_result = sts_reed_hall_result; // == STS_Status_Door_Open )?1U:0U; //STS_RESULT_WATER_LEAKAGE_YES:STS_RESULT_WATER_LEAKAGE_NO; + sts_water_leakage_changed_flag = 1; + break; + case STS_REEDSWITCH_MODE: + + sts_status_color = (sts_reed_hall_result == STS_Status_Door_Open )? STS_GREEN: STS_RED; + + break; + case STS_RSS_MODE: + if (sts_rss_result == STS_RESULT_NO_MOTION){ + sts_status_color = STS_GREEN; + } else if ((sts_rss_result == STS_RESULT_MOTION)) + { + sts_status_color = STS_RED; + } + break; + case STS_DUAL_MODE: + if ((sts_rss_result == STS_RESULT_NO_MOTION) && (sts_reed_hall_result == STS_Status_Door_Open )) + { + sts_status_color = STS_GREEN; + + } else if ((sts_rss_result == STS_RESULT_MOTION) || (sts_reed_hall_result == STS_Status_Door_Close )) + { + sts_status_color = STS_RED; + } + break; + case STS_DUAL_RSS_MODE: + if ((sts_rss_result == STS_RESULT_NO_MOTION) && (sts_rss_2nd_result == STS_RESULT_NO_MOTION)) + { + sts_status_color = STS_GREEN; + } else if ((sts_rss_result == STS_RESULT_MOTION) || (sts_rss_2nd_result == STS_RESULT_MOTION)) + { + sts_status_color = STS_RED; + } + + break; + case STS_TOF_RSS_MODE: + if ((sts_rss_result == STS_RESULT_NO_MOTION) && (sts_tof_result == STS_RESULT_NO_PRESENCE)){ + sts_status_color = STS_GREEN; + + } else if ((sts_rss_result == STS_RESULT_MOTION) || (sts_tof_result == STS_RESULT_PRESENCE)) + { + sts_status_color = STS_RED; + } + + break; +// TO-DO LIST *********************************************************** + case STS_TOF_DISTANCE_MODE: + if ((sts_tof_result == STS_RESULT_NO_PRESENCE)) { + sts_status_color = STS_GREEN; + } else if ((sts_tof_result == STS_RESULT_PRESENCE)) { + sts_status_color = STS_RED; + } + break; + case STS_TOF_PRESENCE_MODE: + if ((sts_tof_result == STS_RESULT_NO_PRESENCE)) { + sts_status_color = STS_GREEN; + } else if ((sts_tof_result == STS_RESULT_PRESENCE)) { + sts_status_color = STS_RED; + } + break; + case STS_TOF_IN_OUT_MODE: + if ((sts_tof_result == STS_RESULT_NO_PRESENCE)) { + sts_status_color = STS_GREEN; + } else if ((sts_tof_result == STS_RESULT_PRESENCE)) { + sts_status_color = STS_RED; + } + break; +// TO-DO LIST *********************************************************** + default: + break; + } + if (sts_work_mode != STS_WIRED_MODE) + { + if ((last_lamp_bar_color != sts_status_color)) + { + sts_lamp_bar_color = ((sts_service_mask == STS_SERVICE_MASK_L0)? STS_DARK: sts_status_color); + + STS_Lamp_Bar_Set_STS_RGB_Color(sts_lamp_bar_color, luminance_level); + if ((sts_service_mask == STS_SERVICE_MASK_L0) || (sts_lamp_bar_color == STS_DARK)) + { + STS_WS2812B_Refresh(); + } + + last_lamp_bar_color = sts_lamp_bar_color; + } + } else STS_Lamp_Bar_Set_Dark(); + + if ((sts_rss_result_changed_flag + sts_reed_hall_changed_flag + sts_tof_result_changed_flag +sts_water_leakage_changed_flag)) + sensor_data_ready = 1U; + STS_PRESENCE_SENSOR_Prepare_Send_Data(); + +} + +#endif + +void STS_PRESENCE_SENSOR_WakeUp_Process_Sampling(void) +{ +#if 0 + if ((sensor_data_ready ==0)) { + STS_PRESENCE_SENSOR_GetValue(); + } +#endif +} + +void STS_PRESENCE_SENSOR_After_Wake_Up() +{ + +} + + +void STS_FallDetection_LampBarProcess(void) +{ + char buf[32]={0x0}; + uint8_t i=0; + switch (sts_fall_rising_detected_result) + { + case STS_PRESENCE_LAYDOWN: + sts_lamp_bar_color = STS_YELLOW; + sts_status_color = STS_YELLOW; + sts_rss_result = STS_RESULT_MOTION; + STS_Lamp_Bar_Set_STS_RGB_Color(sts_lamp_bar_color, luminance_level); + + buf[i++] = (uint8_t)sts_lamp_bar_color; + buf[i++] = (uint8_t)sts_work_mode; + buf[i++] = (uint8_t)sts_fall_rising_detected_result; + + break; + case STS_PRESENCE_FALL: + sts_lamp_bar_color = STS_BLUE; //STS_RED_BLUE; + sts_status_color = STS_BLUE; //STS_RED_BLUE; + sts_rss_result = STS_RESULT_MOTION; + STS_Lamp_Bar_Set_STS_RGB_Color(sts_lamp_bar_color, luminance_level); + + buf[i++] = (uint8_t)sts_lamp_bar_color; + buf[i++] = (uint8_t)sts_work_mode; + buf[i++] = (uint8_t)sts_fall_rising_detected_result; + + buf[i++] = (uint8_t)(sts_fall_rising_pattern_factor1/10 + 0x30)&0xFF; + buf[i++] = (uint8_t)(sts_fall_rising_pattern_factor1%10 + 0x30)&0xFF; + buf[i++] = (uint8_t)(sts_roc_acc_standard_variance/10 + 0x30)&0xFF; + buf[i++] = (uint8_t)(sts_roc_acc_standard_variance%10 + 0x30)&0xFF; + break; + + case STS_PRESENCE_RISING: + sts_lamp_bar_color = STS_RED; // normal occupancy status + sts_status_color = STS_RED; // normal occupancy status + sts_rss_result = STS_RESULT_MOTION; + STS_Lamp_Bar_Set_STS_RGB_Color(sts_lamp_bar_color, luminance_level); + buf[i++] = (uint8_t)sts_lamp_bar_color; + buf[i++] = (uint8_t)sts_work_mode; + buf[i++] = (uint8_t)sts_fall_rising_detected_result; + + // TESTING ONLY TO BE REMOVED + buf[i++] = (uint8_t)(sts_fall_rising_pattern_factor1/10 + 0x30)&0xFF; + buf[i++] = (uint8_t)(sts_fall_rising_pattern_factor1%10 + 0x30)&0xFF; + buf[i++] = (uint8_t)(sts_roc_acc_standard_variance/10 + 0x30)&0xFF; + buf[i++] = (uint8_t)(sts_roc_acc_standard_variance%10 + 0x30)&0xFF; + break; + + default: + break; + } + + APP_LOG(TS_OFF, VLEVEL_L, "\r\n <<<<<<<<<<<<<< Fall Rise state=%d, send buf size = %d \r\n", + sts_fall_rising_detected_result, i ) + + STS_SENSOR_Upload_Message((LORAWAN_USER_APP_PORT+2), i, buf); + + sts_fall_rising_detected_result = STS_PRESENCE_NONE; + +} + +void STS_YunhornSTSFallDetection(void) +{ + //APP_LOG(TS_OFF, VLEVEL_M, "\r\n YUNHORN STS FALL DETECTION \r\n"); + + //STS_YunhornCheckStandardDeviation(); + +} + +void STS_PRESENCE_SENSOR_NVM_CFG(void) +{ + sts_presence_rss_config.default_start_m = (float)((float)sts_cfg_nvm.p[RSS_CFG_START_M]*0.1f); + sts_presence_rss_config.default_length_m = (float)((float)sts_cfg_nvm.p[RSS_CFG_LENGTH_M]*0.1f); + sts_presence_rss_config.default_threshold = (float)((float)sts_cfg_nvm.p[RSS_CFG_THRESHOLD]*0.1f); + sts_presence_rss_config.default_receiver_gain = (float)((float)sts_cfg_nvm.p[RSS_CFG_RECEIVER_GAIN]*0.01f); + + sts_presence_rss_config.default_zone_length_m = DEFAULT_ZONE_LENGTH; + sts_presence_rss_config.default_profile = (float)(sts_cfg_nvm.p[RSS_CFG_PROFILE]); + sts_presence_rss_config.default_update_rate_tracking = (float)(sts_cfg_nvm.p[RSS_CFG_RATE_TRACKING]); + sts_presence_rss_config.default_update_rate_presence = (float)(sts_cfg_nvm.p[RSS_CFG_RATE_PRESENCE]); + sts_presence_rss_config.default_hwaas = (float)(sts_cfg_nvm.p[RSS_CFG_HWAAS]); + + sts_presence_rss_config.default_nbr_removed_pc = (float)(sts_cfg_nvm.p[RSS_CFG_NBR_REMOVED_PC]); + +//filter parameter + sts_presence_rss_config.default_inter_frame_deviation_time_const = (float)(sts_cfg_nvm.p[RSS_CFG_ITE_DEVIATION]*0.1f); + sts_presence_rss_config.default_inter_frame_fast_cutoff = (float)(sts_cfg_nvm.p[RSS_CFG_ITE_FAST_CUTOFF]); + sts_presence_rss_config.default_inter_frame_slow_cutoff = (float)(sts_cfg_nvm.p[RSS_CFG_ITE_SLOW_CUTOFF]*0.01f); + sts_presence_rss_config.default_intra_frame_time_const = (float)(sts_cfg_nvm.p[RSS_CFG_ITR_TIME]); + sts_presence_rss_config.default_intra_frame_weight = (float)(sts_cfg_nvm.p[RSS_CFG_ITR_WEIGHT]*0.1f); + sts_presence_rss_config.default_output_time_const = (float)(sts_cfg_nvm.p[RSS_CFG_OUTPUT_TIME]*0.1f); +//filter parameter + + sts_presence_rss_config.default_downsampling_factor = (float)(sts_cfg_nvm.p[RSS_CFG_DOWNSAMPLING_FACTOR]); + sts_presence_rss_config.default_power_save_mode = (float)(sts_cfg_nvm.p[RSS_CFG_POWER_MODE]); + + sts_rss_config_updated_flag = STS_RSS_CONFIG_FULL; //set to 2 for FULL config effect in next detection +} + +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); + sts_presence_rss_config.default_length_m = (float)(sts_cfg_nvm.p[RSS_CFG_LENGTH_M]*0.1f); + sts_presence_rss_config.default_threshold = (float)(sts_cfg_nvm.p[RSS_CFG_THRESHOLD]*0.1f); + sts_presence_rss_config.default_receiver_gain = (float)(sts_cfg_nvm.p[RSS_CFG_RECEIVER_GAIN]*0.01f); + + sts_rss_config_updated_flag = STS_RSS_CONFIG_SIMPLE; //set to 1 for simple config effect in next detection +} + +void STS_PRESENCE_SENSOR_Init_Send_Data(void) +{ + sts_o7_sensorData.lamp_bar_color = STS_GREEN; + sts_o7_sensorData.workmode = STS_DUAL_MODE; + + sts_o7_sensorData.state_sensor1_on_off = 0x0; + sts_o7_sensorData.state_sensor2_on_off = 0x0; + sts_o7_sensorData.state_sensor3_on_off = 0x0; + sts_o7_sensorData.state_sensor4_on_off = 0x0; + sts_o7_sensorData.rss_presence_distance = 0x0; + sts_o7_sensorData.rss_presence_score = 0x0; + sts_o7_sensorData.fall_state = STS_PRESENCE_NONE; + sts_o7_sensorData.fall_speed = 0x0; + sts_o7_sensorData.fall_gravity = 0x0; + sts_o7_sensorData.event_start_time = 0x0; + sts_o7_sensorData.event_stop_time = 0x0; + sts_o7_sensorData.overtime = 0x0; + sts_o7_sensorData.over_stay_duration = 0x0; + sts_o7_sensorData.unconcious_state = 0x0; + sts_o7_sensorData.unconcious_duration = 0x0; + + sts_o7_sensorData.battery_Pct = 99; // 99% as init value + sts_o7_sensorData.dutycycletimelevel = 1; + sensor_data_ready = 0; +} +void STS_PRESENCE_SENSOR_Prepare_Send_Data(void) +{ + sts_o7_sensorData.lamp_bar_color = sts_lamp_bar_color; + sts_o7_sensorData.workmode = sts_work_mode; + sts_o7_sensorData.state_sensor1_on_off = sts_reed_hall_result; // sts_hall1_read + sts_o7_sensorData.state_sensor2_on_off = sts_rss_result; + sts_o7_sensorData.state_sensor3_on_off = sts_emergency_button_pushed; //sts_hall2_read + sts_o7_sensorData.state_sensor4_on_off = sts_rss_2nd_result; + if (sts_rss_result == STS_RESULT_MOTION) + { + sts_o7_sensorData.rss_presence_distance = (uint16_t)(sts_presence_rss_distance)&0xFFFF; + sts_o7_sensorData.rss_presence_score = (uint16_t)(sts_presence_rss_score)&0xFFFF; + // uint8_t sts_unconcious_state; + // uint16_t sts_unconcious_threshold, sts_unconcious_threshold_duration; + if (sts_presence_rss_score < sts_unconcious_threshold) + { + sts_o7_sensorData.unconcious_state = sts_presence_rss_score; + } else + { + sts_o7_sensorData.unconcious_state = 0; + } + } else { + sts_o7_sensorData.rss_presence_distance = 0x0; + sts_o7_sensorData.rss_presence_score = 0x0; + } + sts_o7_sensorData.fall_state = sts_fall_rising_detected_result; + if (sts_fall_rising_detected_result != STS_PRESENCE_NONE) + { + sts_o7_sensorData.fall_speed = (uint8_t)sts_fall_rising_pattern_factor1; + sts_o7_sensorData.fall_gravity = (uint8_t)sts_roc_acc_standard_variance; + } + + // For occupancy over time process + SysTime_t occupy_check_time = SysTimeGetMcuTime(); + if ((sts_occupancy_overtime_threshold != 0) && (event_start_time !=0)) + { + uint32_t check_time_tmp = occupy_check_time.Seconds - event_start_time; + + //APP_LOG(TS_OFF, VLEVEL_L, "\r\n Check time at %6u Seconds, time lag =%6u, Started at %6u \r\n", occupy_check_time.Seconds, check_time_tmp, event_start_time); + + if (check_time_tmp > sts_occupancy_overtime_threshold*60) + { + sts_occupancy_overtime_state = 1U; + sts_o7_sensorData.overtime = sts_occupancy_overtime_state; + sts_o7_sensorData.over_stay_duration = check_time_tmp; + + sts_status_color = STS_RED_BLUE; + sts_lamp_bar_color = STS_RED_BLUE; + + STS_Lamp_Bar_Refresh(); + } + } else + { + sts_occupancy_overtime_state = 0U; + } + +} +#if 0 +void STS_PRESENCE_SENSOR_Read(STS_OO_SensorStatusDataTypeDef *oo_data) +{ + oo_data->lamp_bar_color = (uint8_t)sts_o7_sensorData.lamp_bar_color; + oo_data->workmode = (uint8_t)sts_o7_sensorData.workmode; + + oo_data->state_sensor1_on_off = (uint8_t)sts_o7_sensorData.state_sensor1_on_off; + oo_data->state_sensor2_on_off = (uint8_t)sts_o7_sensorData.state_sensor2_on_off; + oo_data->state_sensor3_on_off = (uint8_t)sts_o7_sensorData.state_sensor3_on_off; + oo_data->state_sensor4_on_off = (uint8_t)sts_o7_sensorData.state_sensor4_on_off; + oo_data->rss_presence_distance = (uint16_t)sts_o7_sensorData.rss_presence_distance; + oo_data->rss_presence_score = (uint16_t)sts_o7_sensorData.rss_presence_score; + oo_data->fall_state = (uint8_t)sts_o7_sensorData.fall_state; + oo_data->event_start_time = (uint32_t)sts_o7_sensorData.event_start_time; + oo_data->event_stop_time = (uint32_t)sts_o7_sensorData.event_stop_time; + oo_data->overtime = (uint8_t)sts_o7_sensorData.overtime; + oo_data->over_stay_duration = (uint16_t)sts_o7_sensorData.over_stay_duration; + + oo_data->battery_Pct = (uint8_t)sts_o7_sensorData.battery_Pct; + oo_data->dutycycletimelevel = (uint8_t)sts_o7_sensorData.dutycycletimelevel; + +} +#endif + +/** + * @brief Initializes the motion sensors + * @param Instance Motion sensor instance + * @param Functions Motion sensor functions. Could be : + * - MOTION_ACCELERO for instance + * @retval BSP status + */ +void STS_PRESENCE_SENSOR_Init(void) +{ + APP_LOG(TS_ON, VLEVEL_M, "##### YunHorn SmarToilets(r) Presence Sensor Started\r\n"); + + sts_o7_sensorData.workmode = (uint8_t)STS_DUAL_MODE; + sts_o7_sensorData.lamp_bar_color = (uint8_t)STS_GREEN; + sts_o7_sensorData.battery_Pct = 99; + sts_o7_sensorData.dutycycletimelevel = 1; + sts_o7_sensorData.event_start_time = 0; + sts_o7_sensorData.event_stop_time = 0; + sts_o7_sensorData.overtime = 0; + sts_o7_sensorData.over_stay_duration = 0; + + STS_SENSOR_Power_ON(0); + STS_PRESENCE_SENSOR_REEDSWITCH_HALL_Init(); + STS_PRESENCE_SENSOR_TOF_Init(); + STS_PRESENCE_SENSOR_RSS_Init(); + + mems_int1_detected=0; +} + +void STS_PRESENCE_SENSOR_TOF_Init(void) +{ + APP_LOG(TS_ON, VLEVEL_H, "##### YunHorn SmarToilets(r) MEMS TOF Initializing \r\n"); + +} +void STS_PRESENCE_SENSOR_REEDSWITCH_HALL_Init(void) +{ + + APP_LOG(TS_ON, VLEVEL_H, "##### YunHorn SmarToilets(r) REED SWITCH HALL ELEMENT Initializing \r\n"); + +} +void STS_PRESENCE_SENSOR_RSS_Init(void) +{ + APP_LOG(TS_ON, VLEVEL_H, "##### YunHorn SmarToilets(r) MEMS RSS Initializing \r\n"); + + STS_SENSOR_Power_ON(0); + + STS_PRESENCE_SENSOR_NVM_CFG(); + + sts_rss_config_updated_flag = STS_RSS_CONFIG_DEFAULT; + + mems_int1_detected=0; + +} + + + +#ifdef STS_M7 +void STS_PRESENCE_SENSOR_Get_Event_Status(STS_PRESENCE_SENSOR_Event_Status_t *Status) +{ + uint8_t int_source=0; + SysTime_t mems_event_time; + //int_source = ADXL345_GetRegisterValue(ADXL345_REG_INT_SOURCE); + + if (int_source & 0x10) { + mems_event_time = SysTimeGetMcuTime(); + Status->WakeUpStatus = 1U; + event_start_time = mems_event_time.Seconds; + } + else { + Status->WakeUpStatus =0U; + } + + if (int_source & 0x08) { + mems_event_time = SysTimeGetMcuTime(); + Status->SleepStatus = 1U; + event_stop_time = mems_event_time.Seconds; + } + else { + Status->SleepStatus = 0U; + + } + + +} +#endif + +void STS_PRESENCE_SENSOR_Distance_Measure_Process(void) +{ + uint8_t exit_status = EXIT_SUCCESS, i=0; + + APP_LOG(TS_OFF, VLEVEL_H, "\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), + (unsigned int)(distance_cfg.acc_profile),(unsigned int)(distance_cfg.hwaas)); + do + { + exit_status = sts_distance_rss_detector_distance(); + HAL_Delay(100); + i++; + } while ((exit_status == EXIT_FAILURE) && (i < 1)); + +} + + + +void STS_PRESENCE_SENSOR_Function_Test_Process(uint8_t *self_test_result, uint8_t count) +{ + uint8_t bring_up_result[20]; + STS_SENSOR_Power_ON(0); + HAL_Init(); + MX_GPIO_Init(); + HAL_Delay(150); //wait for sensor ready + + for (uint8_t i=0;i < count; i++) //while(1) + { + STS_Lamp_Bar_Self_Test_Simple(); + + sts_presence_rss_bring_up_test(bring_up_result); + + HAL_Delay(5000); + + STS_PRESENCE_SENSOR_Distance_Measure_Process(); + + } + + memcpy(self_test_result,bring_up_result, 10); + mems_int1_detected=0; +} + +uint8_t STS_SENSOR_MEMS_Get_ID(uint8_t *devID) +{ + uint8_t scanned_id[2] = {0x0,0x0}; + +#ifdef YUNHORN_STS_O7_ENABLED + if (hal_test_spi_read_chipid(scanned_id)) + { + 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]); + return true; + } + else + { + return false; + } +#endif + +} + +void STS_SENSOR_Power_ON(uint8_t cnt) +{ + switch (cnt) { + case 0: + case 1: + case 2: + PME_ON; + break; + default: + break; + } + +} +void STS_SENSOR_Power_OFF(uint8_t cnt) +{ + switch (cnt) { + case 0: + case 1: + case 2: + PME_OFF; + break; + default: + break; + } +} + +void STS_SENSOR_MEMS_Reset(uint8_t cnt) +{ + switch (cnt) { + case 0: + case 1: + case 2: + HAL_GPIO_TogglePin(MEMS_POWER_GPIO_Port, MEMS_POWER_Pin); + break; + default: + break; + } + +} + +#ifdef STS_R4 +void YUNHORN_STS_R4_SENSOR_Read(STS_R0_SensorDataTypeDef *r4_data) +{ +#ifdef SOAP_LEVEL_SENSOR + r4_data->on_off_event = (sts_soap_level_state==0x0)? 1:0; + r4_data->measure_tech = 0x0; // capacity measure +#endif + + sensor_data_ready = 0x1; +} + +void YUNHORN_STS_R4_SENSOR_Init(void) +{ + r4_data.on_off_event = 0x0; + r4_data.measure_tech = 0x0; + sensor_data_ready = 0x0; +} +#endif + +#if defined(YUNHORN_STS_R4_ENABLED) +void STS_R0_SENSOR_Read(STS_R0_SensorDataTypeDef *r0_data) +{ +#ifdef SOAP_LEVEL_SENSOR + r0_data->on_off_event = sts_soap_level_state; + r0_data->measure_tech = 0; /* 0: capacit, 1:dTof, 2: ultrasonic */ +#elif defined(TOF_1)||defined(TOF_2)||defined(TOF_3) + r0_data->measure_tech = 1; /* 0: capacit, 1:dTof, 2: ultrasonic */ + r0_data->distance_mm = sts_tof_distance_data[0]; + r0_data->distance1_mm = sts_tof_distance_data[1]; + r0_data->distance2_mm = sts_tof_distance_data[2]; +#elif defined(ROCTEC_R5) + r0_data->distance1_mm = sts_tof_distance_data[0]+sts_tof_distance_data[1]+sts_tof_distance_data[2]; +#endif + + sensor_data_ready = 1; +} +#endif + +void STS_SENSOR_NVM_CFG(void) +{ + +} + +void STS_SENSOR_NVM_CFG_SIMPLE(void) +{ + +} + +#if defined(YUNHORN_STS_O5_ENABLED) +void STS_O5_SENSOR_Read(STS_OO_SensorDataTypeDef *oo_data) +{ + + oo_data->state_sensor1_on_off = sts_reed_hall_result; + + + sensor_data_ready = 1; +} +#endif + +/* USER CODE BEGIN EF */ + +/* USER CODE END EF */ + +/* Private Functions Definition -----------------------------------------------*/ +/* USER CODE BEGIN PrFD */ + +/* USER CODE END PrFD */ diff --git a/LoRaWAN/App/lora_app.c b/LoRaWAN/App/lora_app.c index 1a1cb11..18d3b98 100644 --- a/LoRaWAN/App/lora_app.c +++ b/LoRaWAN/App/lora_app.c @@ -51,7 +51,9 @@ volatile uint8_t sts_ac_code[YUNHORN_STS_AC_CODE_SIZE]={0x0}; extern hmac_result_t hmac_result; extern volatile uint8_t sts_reed_hall_ext_int; extern volatile uint8_t sts_hall1_read, sts_hall2_read; +volatile uint8_t sts_reed_hall_result =0, sts_emergency_button_pushed=0; // inital 0 = close extern volatile uint8_t sts_work_mode, sts_cloud_netcolor, sts_lamp_bar_color, sts_status_color; +extern volatile uint8_t sts_rss_result_changed_flag, sts_hall1_changed_flag, sts_hall2_changed_flag, sts_reed_hall_changed_flag; volatile uint8_t sts_fall_detection_acc_threshold = 10, sts_fall_detection_depth_threshold=30, sts_occupancy_overtime_threshold=20; extern volatile uint32_t event_start_time, event_stop_time; extern volatile uint16_t sts_unconcious_threshold; @@ -631,25 +633,30 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) #ifdef STS_O7 case HALL1_Pin: //sts_reed_hall_ext_int = 1; + HAL_Delay(50); //de-bouncing sts_hall1_read = HALL1_STATE; APP_LOG(TS_OFF, VLEVEL_M, "\n\n Door Contact Read = %02X \r\n", HALL1_STATE); //UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP1), CFG_SEQ_Prio_0); /* Note: when "EventType == TX_ON_TIMER" this GPIO is not initialized */ // if (EventType == TX_ON_EVENT) { + sensor_data_ready =1; UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); } break; case HALL2_Pin: + HAL_Delay(50); //de-bouncing sts_hall2_read = HALL2_STATE; APP_LOG(TS_OFF, VLEVEL_M, "\n\n SOS Button Read = %02X \r\n", HALL2_STATE); + sensor_data_ready =1; // UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP1), CFG_SEQ_Prio_0); UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); break; #else case BUT1_Pin: + HAL_Delay(20); //de-bouncing //sts_reed_hall_ext_int = 1; UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP1), CFG_SEQ_Prio_0); //sts_reed_hall_ext_int = 0; diff --git a/STM32CubeIDE/.project b/STM32CubeIDE/.project index d68803d..d85a821 100644 --- a/STM32CubeIDE/.project +++ b/STM32CubeIDE/.project @@ -528,9 +528,9 @@ copy_PARENT/Core/Src/yunhorn_sts_presence_rss_bring_up_test.c - Application/User/Core/yunhorn_sts_presence_sensor.c + Application/User/Core/yunhorn_sts_process.c 1 - copy_PARENT/Core/Src/yunhorn_sts_presence_sensor.c + copy_PARENT/Core/Src/yunhorn_sts_process.c Drivers/BSP/STM32WLxx_Nucleo/stm32wlxx_nucleo.c diff --git a/STM32CubeIDE/Release/STS_O7.bin b/STM32CubeIDE/Release/STS_O7.bin index 2cc80838a11af4b58400985deca1741bf3333700..0a5b71079bc2cdd8aad7007d0a8c60f6e9c7112e 100644 GIT binary patch delta 56755 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 IznUTc5A4&}Jpcdz delta 56508 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