This repository has been archived on 2024-04-12. You can view files and clone it, but cannot push or open issues or pull requests.
O5/Core/Src/yunhorn_sts_process.c

595 lines
15 KiB
C

/* 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:
//HAL_GPIO_WritePin(MEMS_POWER_GPIO_Port, MEMS_POWER_Pin, GPIO_PIN_SET);
PME_ON;
break;
default:
break;
}
}
void STS_SENSOR_Power_OFF(uint8_t cnt)
{
switch (cnt) {
case 0:
case 1:
case 2:
// HAL_GPIO_WritePin(MEMS_POWER_GPIO_Port, MEMS_POWER_Pin, GPIO_PIN_RESET);
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_RESET_GPIO_Port, MEMS_RESET_Pin);
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 = HALL1_STATE;
oo_data->state_sensor2_on_off = HALL2_STATE;
sensor_data_ready = 1;
}
#endif
/* USER CODE BEGIN EF */
/* USER CODE END EF */
/* Private Functions Definition -----------------------------------------------*/
/* USER CODE BEGIN PrFD */
/* USER CODE END PrFD */