/* 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 "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; extern volatile uint8_t sensor_data_ready; volatile uint8_t sts_reed_hall_result, last_sts_reed_hall_result,sts_reed_hall_changed_flag; volatile uint32_t event_start_time, event_stop_time; volatile uint8_t sts_soap_level_state; extern volatile uint8_t sts_work_mode, sts_service_mask; volatile uint8_t sts_reed_hall_ext_int = 0; volatile uint8_t sts_occupancy_status; volatile uint8_t sts_reed_hall_changed_flag = 0; volatile uint8_t sts_reed_hall_result =0; 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_O5_ENABLED #endif #if (defined(YUNHORN_STS_O6_ENABLED) && defined(USE_ACCONEER_A111)) extern volatile STS_OO_RSS_SensorTuneDataTypeDef sts_presence_rss_config; extern volatile uint8_t sts_rss_result, sts_rss_2nd_result; 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-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) { #if (defined(YUNHORN_STS_O6_ENABLED) && defined(USE_ACCONEER_A111)) 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 (sts_rss_result == last_sts_rss_result) { sts_rss_result_changed_flag =0; } else { sts_rss_result_changed_flag =1; } 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_rss_result = sts_rss_result; last_sts_reed_hall_result = sts_reed_hall_result; } #endif } void STS_Reed_Hall_Presence_Detection(void) { #if (defined(YUNHORN_STS_O5_ENABLED) || defined(YUNHORN_STS_O6_ENABLED) || defined(USE_ACCONEER_A111)) HAL_Delay(50); // BOUNCING ELIMIATION 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; } HAL_Delay(20); // BOUNCING ELIMIATION sts_reed_hall_changed_flag = 0; sts_reed_hall_ext_int = 0; #endif } void STS_RSS_Smart_Presence_Detection(void) { #if (defined(YUNHORN_STS_O6_ENABLED) && defined(USE_ACCONEER_A111)) sts_presence_rss_presence_detection(); #endif } /* * 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-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_L, "\r\n P6 Testing Process\r\n"); STS_SENSOR_Power_ON(0); #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(5000); /* 2. Read sensor state */ sts_soap_level_state = 0; sts_soap_level_state = HAL_GPIO_ReadPin(SOAP_STATUS_GPIO_Port,SOAP_STATUS_Pin); APP_LOG(TS_OFF, VLEVEL_L, "\r\n Soap State = %d \r\n", sts_soap_level_state); HAL_GPIO_WritePin(SOAP_SWITCH_GPIO_Port, SOAP_SWITCH_Pin, GPIO_PIN_RESET); if (sts_soap_level_state == 1) { #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"); } void STS_Combined_Status_Processing(void) { #if (defined(YUNHORN_STS_O6_ENABLED) && defined(USE_ACCONEER_A111)) 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_SENSOR_Power_ON(uint8_t cnt) { switch (cnt) { case 0: case 1: case 2: #if (defined(YUNHORN_STS_M7_ENABLED) || defined(YUNHORN_STS_R0_ENABLED)) HAL_GPIO_WritePin(MEMS_POWER_GPIO_Port, MEMS_POWER_Pin, GPIO_PIN_SET); #endif break; default: break; } } void STS_SENSOR_Power_OFF(uint8_t cnt) { switch (cnt) { case 0: case 1: case 2: #if (defined(YUNHORN_STS_M7_ENABLED) || defined(YUNHORN_STS_R0_ENABLED)) HAL_GPIO_WritePin(MEMS_POWER_GPIO_Port, MEMS_POWER_Pin, GPIO_PIN_RESET); #endif break; default: break; } } void STS_SENSOR_MEMS_Reset(uint8_t cnt) { switch (cnt) { case 0: case 1: case 2: #if (defined(YUNHORN_STS_M7_ENABLED) || defined(YUNHORN_STS_R0_ENABLED)) HAL_GPIO_WritePin(MEMS_RESET_GPIO_Port, MEMS_RESET_Pin, GPIO_PIN_SET); HAL_Delay(50); HAL_GPIO_WritePin(MEMS_RESET_GPIO_Port, MEMS_RESET_Pin, GPIO_PIN_RESET); #endif HAL_GPIO_WritePin(MEMS_RESET_GPIO_Port, MEMS_RESET_Pin, GPIO_PIN_SET); HAL_Delay(50); HAL_GPIO_WritePin(MEMS_RESET_GPIO_Port, MEMS_RESET_Pin, GPIO_PIN_RESET); break; default: break; } } 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) { sts_reed_hall_result = (STS_Reed_Hall_State==0)?1:0; 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 */