From f7bc31a5add3c0c9b08f8ed5c9c242f99e4f7a31 Mon Sep 17 00:00:00 2001 From: YunHorn Technology Date: Mon, 16 Jun 2025 18:23:12 +0800 Subject: [PATCH] fix instable PA0 pull high issue --- Core/Inc/yunhorn_sts_prd_conf.h | 4 +- Core/Src/main_5_9.c | 224 ------- Core/Src/sts_lamp_bar_MAY26.c | 624 ------------------- Core/Src/yunhorn_sts_presence_sensor_JULY3.c | 555 ----------------- LoRaWAN/App/lora_app.c | 5 +- STM32CubeIDE/Release/STS_O7.bin | Bin 244116 -> 244132 bytes 6 files changed, 6 insertions(+), 1406 deletions(-) delete mode 100644 Core/Src/main_5_9.c delete mode 100644 Core/Src/sts_lamp_bar_MAY26.c delete mode 100644 Core/Src/yunhorn_sts_presence_sensor_JULY3.c diff --git a/Core/Inc/yunhorn_sts_prd_conf.h b/Core/Inc/yunhorn_sts_prd_conf.h index 9c38fe9..75cd22e 100644 --- a/Core/Inc/yunhorn_sts_prd_conf.h +++ b/Core/Inc/yunhorn_sts_prd_conf.h @@ -246,8 +246,8 @@ #define STS_IOC_MODE_5_MASK STS_IOC_IN_ALL|STS_IOC_OUT_ALL //UNI_MODE #define MajorVer 25U -#define MinorVer 4U -#define SubMinorVer 24U +#define MinorVer 6U +#define SubMinorVer 16U #define FirmwareVersion 3U #define YUNHORN_STS_MAX_NVM_CFG_SIZE 64U diff --git a/Core/Src/main_5_9.c b/Core/Src/main_5_9.c deleted file mode 100644 index 60e07d4..0000000 --- a/Core/Src/main_5_9.c +++ /dev/null @@ -1,224 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file: main.c * - * @author Yunhorn (r) Technology Limited Application Team * - * @brief Yunhorn (r) SmarToilets (r) Product configuration file. * - ****************************************************************************** - * @attention - * - * Copyright (c) 2023 Yunhorn Technology Limited. - * Copyright (c) 2023 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 "main.h" -#include "app_lorawan.h" -#include "gpio.h" -#include "usart.h" -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ -#include "yunhorn_sts_sensors.h" -#include "sts_cmox_hmac_sha.h" -#include "spi.h" -#include "dma.h" -#include "tim.h" -#include "sts_lamp_bar.h" -#include "sys_app.h" - -#include "acc_hal_integration.h" -#include "example_bring_up.h" -#include "example_multiple_service_usage.h" -#include "example_detector_distance.h" -#include "example_detector_presence.h" -#include "example_detector_distance_recorded.h" -#include "example_service_sparse.h" -#include "ref_app_wave_to_exit.h" -#include "ref_app_smart_presence.h" -#include "ref_app_tank_level.h" -#include "ref_app_parking.h" -#include "acc_detector_presence.h" -/* USER CODE END Includes */ - -/* 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 -----------------------------------------------*/ -void SystemClock_Config(void); -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/** - * @brief The application entry point. - * @retval int - */ -int main(void) -{ - /* USER CODE BEGIN 1 */ - - /* USER CODE END 1 */ - - /* MCU Configuration--------------------------------------------------------*/ - - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - HAL_Init(); - - /* USER CODE BEGIN Init */ - - /* USER CODE END Init */ - - /* Configure the system clock */ - SystemClock_Config(); - - /* USER CODE BEGIN SysInit */ - MX_GPIO_Init(); - MX_DMA_Init(); - MX_USART2_UART_Init(); - MX_TIM1_Init(); - MX_SPI1_Init(); - /* USER CODE END SysInit */ - - /* Initialize all configured peripherals */ - - MX_LoRaWAN_Init(); - /* USER CODE BEGIN 2 */ - - STS_Lamp_Bar_Self_Test_Simple(); - - - - - - /* USER CODE END 2 */ - - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ - - while (1) - { - /* USER CODE END WHILE */ - - MX_LoRaWAN_Process(); - - - /* USER CODE BEGIN 3 */ - } - /* USER CODE END 3 */ -} - -/** - * @brief System Clock Configuration - * @retval None - */ -void SystemClock_Config(void) -{ - RCC_OscInitTypeDef RCC_OscInitStruct = {0}; - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; - - /** Configure LSE Drive Capability - */ - HAL_PWR_EnableBkUpAccess(); - __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW); - - /** Configure the main internal regulator output voltage - */ - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - - /** Initializes the CPU, AHB and APB buses clocks - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE|RCC_OSCILLATORTYPE_MSI; - RCC_OscInitStruct.LSEState = RCC_LSE_ON; - RCC_OscInitStruct.MSIState = RCC_MSI_ON; - RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT; - RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_11; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) - { - Error_Handler(); - } - - /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK3|RCC_CLOCKTYPE_HCLK - |RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1 - |RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - RCC_ClkInitStruct.AHBCLK3Divider = RCC_SYSCLK_DIV1; - - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) - { - Error_Handler(); - } -} - -/* USER CODE BEGIN 4 */ - -/* USER CODE END 4 */ - -/** - * @brief This function is executed in case of error occurrence. - * @retval None - */ -void Error_Handler(void) -{ - /* USER CODE BEGIN Error_Handler_Debug */ - /* User can add his own implementation to report the HAL error return state */ - __disable_irq(); - while (1) - { - } - /* USER CODE END Error_Handler_Debug */ -} - -#ifdef USE_FULL_ASSERT -/** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file: pointer to the source file name - * @param line: assert_param error line source number - * @retval None - */ -void assert_failed(uint8_t *file, uint32_t line) -{ - /* USER CODE BEGIN 6 */ - /* User can add his own implementation to report the file name and line number, - ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ - while (1) - { - } - /* USER CODE END 6 */ -} -#endif /* USE_FULL_ASSERT */ diff --git a/Core/Src/sts_lamp_bar_MAY26.c b/Core/Src/sts_lamp_bar_MAY26.c deleted file mode 100644 index c3e9b58..0000000 --- a/Core/Src/sts_lamp_bar_MAY26.c +++ /dev/null @@ -1,624 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file yunhorn_sts_lamp_bar.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 */ -#include "main.h" -#include "dma.h" -#include "tim.h" -#include "string.h" -#include "sys_app.h" -#include "stm32_systime.h" -#include "sts_lamp_bar.h" -#include "ref_app_smart_presence.h" -#include "yunhorn_sts_sensors.h" - -#define ONE_PULSE (36) -#define ZERO_PULSE (20) - -#define LED_DATA_LEN (24) -#define WS2812B_DATA_LEN (LED_DATA_LEN * (STS_LAMP_BAR_LED_NUM+4)) -#define DEFAULT_LUMINANCE_LEVEL (20) -#define RESET_PULSE (10) //(80) TO FIX DARK_COLOR AND SM2 - - -typedef struct ws2812b_e { - uint16_t head[3]; - uint16_t GRB[24*STS_LAMP_BAR_LED_NUM]; - uint16_t tail; -} WS2812B_FrameTypeDef; - -volatile WS2812B_FrameTypeDef rgb_buf = { - .head[0] = 0, - .head[1] = 0, - .head[2] = 0, - .tail = 0 -}; - -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; -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; -volatile uint8_t sts_reed_hall_changed_flag = 1; -volatile uint8_t sts_reed_hall_result =0; -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; - -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; -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; -extern volatile uint8_t sensor_data_ready; -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(); - 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; - last_sts_rss_result = sts_rss_result; - } - - if (sts_reed_hall_result == last_sts_reed_hall_result) - { - sts_reed_hall_changed_flag = 0; - - } else - { - sts_reed_hall_changed_flag = 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 (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; - - } - - //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 P4 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) -{ - for (uint8_t i=0; i< STS_LAMP_BAR_LED_NUM; i++) - { - STS_WS2812B_Set_RGB(0x00,0x00,0x00,i); - } - //STS_WS2812B_Refresh(); -} - -void STS_WS2812B_Refresh(void) -{ - HAL_TIM_PWM_Start_DMA(&STS_LAMP_BAR_HTIM, STS_LAMP_BAR_TIM_CHANNEL, (uint32_t *)&rgb_buf, (RESET_PULSE+WS2812B_DATA_LEN+1)); - - //HAL_TIM_PWM_Start_IT(&STS_LAMP_BAR_HTIM, STS_LAMP_BAR_TIM_CHANNEL); -} - -void STS_Lamp_Bar_Init(void) -{ - if (sts_service_mask == STS_SERVICE_MASK_L0) - { - STS_Lamp_Bar_Set_STS_RGB_Color(STS_GREEN, luminance_level); - //STS_WS2812B_Refresh(); - HAL_Delay(200); - STS_Lamp_Bar_Set_STS_RGB_Color(STS_RED, luminance_level); - //STS_WS2812B_Refresh(); - HAL_Delay(200); - STS_Lamp_Bar_Set_STS_RGB_Color(STS_BLUE, luminance_level); - //STS_WS2812B_Refresh(); - HAL_Delay(200); - } -} - -//marquee scoller -void STS_Lamp_Bar_Scoller(uint8_t color, uint8_t luminance_level) -{ - STS_Lamp_Bar_Set_Dark(); - - for(uint8_t i = 0; i<(STS_LAMP_BAR_LED_NUM+1); i++) - { - //if (sts_service_mask < STS_SERVICE_MASK_L1) - // STS_WS2812B_Refresh(); - HAL_Delay(60); - if (i < STS_LAMP_BAR_LED_NUM) { - STS_WS2812B_Set_RGB(color_rgb[color][0]*luminance_level,color_rgb[color][1]*luminance_level, color_rgb[color][2]*luminance_level, i); - } - } - HAL_Delay(10); - - //if (sts_service_mask == STS_SERVICE_MASK_L0) { - // STS_WS2812B_Refresh(); - //} - -} - - -void STS_WS2812B_Set_RGB(uint8_t R, uint8_t G, uint8_t B, uint8_t idx) -{ - if (idx < STS_LAMP_BAR_LED_NUM) - { - for (uint8_t j = 0; j < 8; j ++) - { - rgb_buf.GRB[idx*24+j] = (G&(0X80)>>j)? ONE_PULSE : ZERO_PULSE; - rgb_buf.GRB[idx*24+8+j] = (R&(0X80)>>j)? ONE_PULSE : ZERO_PULSE; - rgb_buf.GRB[idx*24+16+j] = (B&(0X80)>>j)? ONE_PULSE : ZERO_PULSE; - } - } - // CHANGED AT 2023-05-10 - if (sts_service_mask == STS_SERVICE_MASK_L0) { - STS_WS2812B_Refresh(); - } -} - -void STS_Lamp_Bar_Set_RGB_Color(uint8_t red, uint8_t green, uint8_t blue ) -{ - HAL_Delay(1); - for(uint8_t i = 0; i < STS_LAMP_BAR_LED_NUM; i++) - { - for (uint8_t j = 0; j < 8; j ++) - { - rgb_buf.GRB[i*24+j] = (green&(0x80)>>j)? ONE_PULSE : ZERO_PULSE; - rgb_buf.GRB[i*24+8+j] = (red&(0x80)>>j)? ONE_PULSE : ZERO_PULSE; - rgb_buf.GRB[i*24+16+j] = (blue&(0x80)>>j)? ONE_PULSE : ZERO_PULSE; - } - } - if (sts_service_mask == STS_SERVICE_MASK_L0) { - STS_WS2812B_Refresh(); - } - -} - - -void STS_Lamp_Bar_Refresh(void) -{ - STS_Lamp_Bar_Set_STS_RGB_Color(sts_lamp_bar_color, luminance_level); -} -void STS_Lamp_Bar_Set_STS_RGB_Color(uint8_t sts_lamp_color, uint8_t luminance_level) -{ - uint8_t lum = luminance_level; - - STS_Lamp_Bar_Set_RGB_Color(0x0, 0x0, 0x0); - switch (sts_lamp_color) - { - case STS_DARK: - STS_Lamp_Bar_Set_RGB_Color(0x0, 0x0, 0x0); - break; - case STS_GREEN: - STS_Lamp_Bar_Set_RGB_Color(0x0, lum, 0x0); - break; - case STS_RED: - STS_Lamp_Bar_Set_RGB_Color(lum, 0x0, 0x0); - break; - case STS_BLUE: - STS_Lamp_Bar_Set_RGB_Color(0x0, 0x0, lum); - break; - case STS_YELLOW: - STS_Lamp_Bar_Set_RGB_Color(lum, lum, 0x0); - break; - case STS_PINK: - STS_Lamp_Bar_Set_RGB_Color(lum, 0x0, lum); - break; - case STS_CYAN: - STS_Lamp_Bar_Set_RGB_Color(0x0, lum, lum); - break; - case STS_WHITE: - STS_Lamp_Bar_Set_RGB_Color(lum, lum, lum); - break; - case STS_RED_BLUE: - STS_Lamp_Bar_Set_RGB_Color(lum, 0x0, 0x0); - HAL_Delay(300); - STS_Lamp_Bar_Set_RGB_Color(0x0, 0x0, lum); - HAL_Delay(300); - break; - } -} - -void STS_Reed_Hall_Working(void) -{ - -} -void STS_Combined_Status_Processing(void) -{ - mems_event_time = SysTimeGetMcuTime(); - - if ((sts_rss_result == STS_RESULT_MOTION) || (sts_reed_hall_result == STS_Status_Door_Close) || (sts_tof_result == STS_RESULT_PRESENCE)) - { - - if (event_start_time == 0) { - - event_start_time = mems_event_time.Seconds; - event_stop_time = 0; - - APP_LOG(TS_OFF, VLEVEL_L, "\r\n Event Started at %6u Seconds \r\n", event_start_time); - } - - - } else if ((sts_rss_result != STS_RESULT_MOTION) || (sts_reed_hall_result != STS_Status_Door_Close) || (sts_tof_result != STS_RESULT_PRESENCE)) - { - if (event_stop_time ==0) - { - event_stop_time = mems_event_time.Seconds; - - event_start_time = 0; - - APP_LOG(TS_OFF, VLEVEL_L, "\r\n Event Stop at %6u Seconds \r\n", event_stop_time); - } - } - - 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 )?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_REMOTE_REED_RSS_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_status_color == STS_RED_BLUE) - { - STS_Lamp_Bar_Set_STS_RGB_Color(sts_lamp_bar_color, luminance_level); - } - if ((sts_work_mode == STS_WIRED_MODE) || (sts_service_mask > STS_SERVICE_MASK_L0)) - { - sts_status_color = STS_DARK; - sts_lamp_bar_color = STS_DARK; - last_lamp_bar_color = STS_DARK; - STS_Lamp_Bar_Set_Dark(); - } - else - { - - //if ((last_lamp_bar_color != sts_status_color)) - { - sts_lamp_bar_color = ((sts_service_mask == STS_SERVICE_MASK_L0)? sts_status_color:STS_DARK); - - 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; - } - } - - 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; - sts_water_leakage_changed_flag=0; - } -} - -void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) -{ - __HAL_TIM_SetCompare(&STS_LAMP_BAR_HTIM, STS_LAMP_BAR_TIM_CHANNEL,0); - HAL_TIM_PWM_Stop_DMA(&STS_LAMP_BAR_HTIM,STS_LAMP_BAR_TIM_CHANNEL); - -} - -void STS_Lamp_Bar_Self_Test_Simple(void) -{ - uint8_t color=0, luminance_level=10; - APP_LOG(TS_OFF, VLEVEL_M, "\r\n [#1] RGB Space Lumianance Level Testing Start\r\n"); - for (color=STS_GREEN; color <= STS_RED_BLUE; color++) - { - luminance_level = 10; - do { - STS_Lamp_Bar_Set_STS_RGB_Color(color, luminance_level); - HAL_Delay(10); - luminance_level += 20; - } while (luminance_level < 99); - //STS_Lamp_Bar_Set_Dark(); - } - APP_LOG(TS_OFF, VLEVEL_M, "\r\n [#1] RGB Space Lumianance Level Testing Finished\r\n"); -} -void STS_Lamp_Bar_Self_Test(void) -{ - uint8_t color=0, luminance_level=10; - - APP_LOG(TS_OFF, VLEVEL_M, "\r\n YunHorn STS Indicative Lamp Self Test\r\n"); - - STS_Lamp_Bar_Self_Test_Simple(); - - APP_LOG(TS_OFF, VLEVEL_H, "\r\n [#2] Scoller Testing\r\n"); - for (color = STS_GREEN; color <= STS_RED_BLUE; color++) - { - STS_Lamp_Bar_Scoller(color, luminance_level); - } - STS_Lamp_Bar_Set_Dark(); - - APP_LOG(TS_OFF, VLEVEL_M, "\r\n [##] YunHorn STS Indicative Lamp Self Test Finished\r\n"); - if ((sts_work_mode == STS_WIRED_MODE) ) - { - STS_Lamp_Bar_Set_Dark(); - } else - { - STS_Lamp_Bar_Set_STS_RGB_Color(STS_GREEN, luminance_level); - } - - -} -void sts_rgb_unit_test(void) -{ - - APP_LOG(TS_OFF, VLEVEL_L, "\r\n STS Lamp Bar Init...\r\n"); - - STS_Lamp_Bar_Set_Dark(); - - STS_Lamp_Bar_Full_Color_Gradient(); - - STS_Lamp_Bar_Self_Test(); - - do { - for (uint8_t i=0; i<9; i++) - { - APP_LOG(TS_OFF, VLEVEL_L, "\r\n STS Lamp Bar color = %d...\r\n", i); - - STS_Lamp_Bar_Set_STS_RGB_Color(i, luminance_level); - STS_Combined_Status_Processing(); - HAL_Delay(6000); - STS_Lamp_Bar_Set_Dark(); - } - } while(1); - - - -} - diff --git a/Core/Src/yunhorn_sts_presence_sensor_JULY3.c b/Core/Src/yunhorn_sts_presence_sensor_JULY3.c deleted file mode 100644 index eaedba4..0000000 --- a/Core/Src/yunhorn_sts_presence_sensor_JULY3.c +++ /dev/null @@ -1,555 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file yunhorn_sts_presence_sensor.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 */ -#if (defined(YUNHORN_STS_O6_ENABLED) && defined(USE_ACCONEER_A111)) -//#include "yunhorn_sts_rss_sensor.h" -extern volatile uint8_t sts_ac_code[20]; -volatile uint32_t rfac_timer; -extern volatile uint8_t sensor_data_ready; -volatile STS_OO_SensorStatusDataTypeDef sts_o6_sensorData; -volatile STS_PRESENCE_SENSOR_Event_Status_t sts_o6_event_status; -volatile float sts_distance_rss_distance; -extern volatile float sts_presence_rss_distance, sts_presence_rss_score; -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, event_stop_time; -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_reed_hall_result, sts_rss_result, sts_rss_2nd_result,sts_tof_result, sts_status_color, sts_lamp_bar_color, sts_work_mode, 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; - -#endif - -/* 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) { - APP_LOG(TS_OFF,VLEVEL_H, "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; - } - 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) - { - if ((rfac_timer >= STS_BURN_IN_RFAC) && (rfac_timer < (STS_BURN_IN_RFAC +3))) - { - APP_LOG(TS_OFF, VLEVEL_H, "\r\n -------------------RFAC Process\r\n"); - STS_SENSOR_Upload_Message(YUNHORN_STS_O6_USER_APP_CTRL_REPLY_PORT, 4, "RFAC"); - } - if ((rfac_timer > (STS_BURN_IN_RFAC + 2))) - { - APP_LOG(TS_OFF, VLEVEL_H, "\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; - } - } - } - -} - -void STS_FallDetection_LampBarProcess(void) -{ - uint8_t buf[32]={0x0}; - uint8_t i=0; - switch (sts_fall_rising_detected_result) - { - case STS_PRESENCE_LAYDOWN: - - 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, (char*)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_o6_sensorData.lamp_bar_color = STS_GREEN; - sts_o6_sensorData.workmode = STS_DUAL_MODE; - - sts_o6_sensorData.state_sensor1_on_off = 0x0; - sts_o6_sensorData.state_sensor2_on_off = 0x0; - sts_o6_sensorData.state_sensor3_on_off = 0x0; - sts_o6_sensorData.state_sensor4_on_off = 0x0; - sts_o6_sensorData.rss_presence_distance = 0x0; - sts_o6_sensorData.rss_presence_score = 0x0; - sts_o6_sensorData.fall_state = STS_PRESENCE_NONE; - sts_o6_sensorData.fall_speed = 0x0; - sts_o6_sensorData.fall_gravity = 0x0; - sts_o6_sensorData.event_start_time = 0x0; - sts_o6_sensorData.event_stop_time = 0x0; - sts_o6_sensorData.overtime = 0x0; - - sts_o6_sensorData.battery_Pct = 99; // 99% as init value - sts_o6_sensorData.dutycycletimelevel = 1; - sensor_data_ready = 0; -} -void STS_PRESENCE_SENSOR_Prepare_Send_Data(void) -{ - sts_o6_sensorData.lamp_bar_color = sts_lamp_bar_color; - sts_o6_sensorData.workmode = sts_work_mode; - sts_o6_sensorData.state_sensor1_on_off = ((STS_Reed_Hall_State == STS_Status_Door_Open)? 0U:1U); - sts_o6_sensorData.state_sensor2_on_off = sts_rss_result; - sts_o6_sensorData.state_sensor3_on_off = sts_tof_result; - sts_o6_sensorData.state_sensor4_on_off = sts_rss_2nd_result; - if (sts_rss_result == STS_RESULT_MOTION) - { - sts_o6_sensorData.rss_presence_distance = (uint16_t)(sts_presence_rss_distance)&0xFFFF; - sts_o6_sensorData.rss_presence_score = (uint16_t)(sts_presence_rss_score)&0xFFFF; - } else { - sts_o6_sensorData.rss_presence_distance = 0x0; - sts_o6_sensorData.rss_presence_score = 0x0; - } - sts_o6_sensorData.fall_state = sts_fall_rising_detected_result; - if (sts_fall_rising_detected_result != STS_PRESENCE_NONE) - { - sts_o6_sensorData.fall_speed = (uint8_t)sts_fall_rising_pattern_factor1; - sts_o6_sensorData.fall_gravity = (uint8_t)sts_roc_acc_standard_variance; - } - - sts_o6_sensorData.overtime = (event_stop_time - event_start_time)> (sts_occupancy_overtime_threshold*60)? 1:0; - sts_o6_sensorData.event_start_time = event_start_time; - sts_o6_sensorData.event_stop_time = event_stop_time; -} - -void STS_PRESENCE_SENSOR_Read(STS_OO_SensorStatusDataTypeDef *o6_data) -{ - o6_data->lamp_bar_color = (uint8_t)sts_o6_sensorData.lamp_bar_color; - o6_data->workmode = (uint8_t)sts_o6_sensorData.workmode; - - o6_data->state_sensor1_on_off = (uint8_t)sts_o6_sensorData.state_sensor1_on_off; - o6_data->state_sensor2_on_off = (uint8_t)sts_o6_sensorData.state_sensor2_on_off; - o6_data->state_sensor3_on_off = (uint8_t)sts_o6_sensorData.state_sensor3_on_off; - o6_data->state_sensor4_on_off = (uint8_t)sts_o6_sensorData.state_sensor4_on_off; - o6_data->rss_presence_distance = (uint16_t)sts_o6_sensorData.rss_presence_distance; - o6_data->rss_presence_score = (uint16_t)sts_o6_sensorData.rss_presence_score; - o6_data->event_start_time = (uint32_t)sts_o6_sensorData.event_start_time; - o6_data->event_stop_time = (uint32_t)sts_o6_sensorData.event_stop_time; - o6_data->overtime = (uint8_t)sts_o6_sensorData.overtime; - - o6_data->battery_Pct = (uint8_t)sts_o6_sensorData.battery_Pct; - o6_data->dutycycletimelevel = (uint8_t)sts_o6_sensorData.dutycycletimelevel; - -} - -void STS_PRESENCE_SENSOR_GetValue(void) -{ - -} - -void STS_PRESENCE_SENSOR_WakeUp_Process_Sampling(void) -{ - if ((sensor_data_ready ==0)) { - STS_PRESENCE_SENSOR_GetValue(); - } -} - -void STS_PRESENCE_SENSOR_After_Wake_Up() -{ - -} - -/** - * @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_o6_sensorData.workmode = (uint8_t)STS_DUAL_MODE; - sts_o6_sensorData.lamp_bar_color = (uint8_t)STS_GREEN; - sts_o6_sensorData.battery_Pct = 99; - sts_o6_sensorData.dutycycletimelevel = 1; - sts_o6_sensorData.event_start_time = 0; - sts_o6_sensorData.event_stop_time = 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; - -} - -void STS_MOTION_SENSOR_ACT_INACT_DURATION_Init() -{ - -} - -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; - - } - - -} - - -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; -} - - -void STS_PRESENCE_SENSOR_Enable_Wake_Up_Detection() -{ - -} - -void STS_PRESENCE_SENSOR_Disable_Wake_Up_Detection(void) -{ - -} - -uint8_t STS_SENSOR_MEMS_Get_ID(uint8_t *devID) -{ - uint8_t scanned_id[2] = {0x0,0x0}; - -#ifdef YUNHORN_STS_O6_ENABLED - if (hal_test_spi_read_chipid(scanned_id)) - { - devID[0] = scanned_id[0]; - devID[1] = scanned_id[1]; - return true; - } - else - { - return false; - } -#endif - -} -/* -uint16_t STS_RSS_A111_GetDeviceIDValue(void) -{ - uint16_t devid=0; - if (STS_SENSOR_MEMS_Get_ID(&devid)) - { - return (uint16_t)devid; - } else return 0; -} -*/ -void STS_SENSOR_Power_ON(uint8_t cnt) -{ - switch (cnt) { - case 0: - case 1: - case 2: -#ifdef YUNHORN_STS_M7_ENABLED - HAL_GPIO_WritePin(MEMS_POWER_GPIO_Port, MEMS_POWER_Pin, GPIO_PIN_SET); -#endif -#ifdef YUNHORN_STS_O6_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: -#ifdef YUNHORN_STS_M7_ENABLED - HAL_GPIO_WritePin(MEMS_POWER_GPIO_Port, MEMS_POWER_Pin, GPIO_PIN_RESET); -#endif -#ifdef YUNHORN_STS_O6_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: -#ifdef YUNHORN_STS_M7_ENABLED - HAL_GPIO_WritePin(MEMS_RESET_GPIO_Port, MEMS_RESET_Pin, GPIO_PIN_SET); -#endif -#ifdef YUNHORN_STS_O6_ENABLED - HAL_GPIO_WritePin(MEMS_RESET_GPIO_Port, MEMS_RESET_Pin, GPIO_PIN_RESET); - HAL_Delay(100); - HAL_GPIO_WritePin(MEMS_RESET_GPIO_Port, MEMS_RESET_Pin, GPIO_PIN_SET); -#endif - break; - default: - break; - } - -} - - -/* 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 a099f65..9537a93 100644 --- a/LoRaWAN/App/lora_app.c +++ b/LoRaWAN/App/lora_app.c @@ -791,7 +791,10 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) // if (EventType == TX_ON_EVENT) { STS_YunhornSTSEventP1_Process(); - UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); + if (sts_work_mode != STS_REEDSWITCH_MODE) // to elimiate PA0 pull high instable issue 2025-0616 + { + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); + } //SendTxData(); sts_reed_hall_changed_flag &= !(0x01); } diff --git a/STM32CubeIDE/Release/STS_O7.bin b/STM32CubeIDE/Release/STS_O7.bin index ce0e139a5865d8a6185511920f721191c43c1713..1cacad405a5f4b79d4824b67ae306f7537cb4c44 100644 GIT binary patch delta 37185 zcmb4s3s_Xe+xVHY7nYl_A_5|^3nCyPAYMQuxvn4*;3YM+Kr=B?Au}&s0L@$JPwZra znTeI9nF*1tq===JW~OMRh!?N~k*vd(d(Ph2|2wlsz`o!2Jl~(^IcH|x+r0D6%sbb! zy!Cg#5C86`U>KyS-=;_?bzj1$$Ws#Q2p^qF`B7Hm7ud8VOvH`z7}+7A8pkW|CI1FOuKDW%X-Bo?L*( zB6OSE;Bj63qB*G0t1w>Y(UPKz(?#-2xaFSlD6jUA=Tw9aaI*fRL0av&{sX+xOfDzX z+bi3eI%H%KGMFHZR>6<5*56Sju^PmmIl?qBawfy` zu-jx5y*+hRxDmx2m%I3o8pFc-9(OU4Ms9VylZMG7V*aj$xk9mZ@^N z^zb~O#o$G(3xTCu+%n|6oZ=@~a(H`;3et~Sl<=;x zDd7F4MXr-UIIT8ocnB)JWOLQXdA6GgQtR9xcGgDTW*bSnL+qrDybX|MwH^>VY9sHv z6z>VKS{r%aqG>h64%pNhS@m2|-YMrV*E7&K6}-3TS+kUvGpc%J);o(*_@tC~3ML!O zBL@{ISl*B8iU>ycIqyd@)$>G64I4I~VJVN~XsDdO$}N4Q1a0M7A1Oe^Tx#SBpK;ck z;>HSQN0Z1zpZ(i~@lE^Wb2T5uHAY6F$(%j11l{CHMl46~aqS}l+}DZ>)C8#!1^)`C zjtVHvu%rFaIxvqT@{q`&qgnaE*R)0%K2b> z&Od2hNd{Q~P}8Xi<^|QSNAd%;BBY89|IzwJ(DAGW$Y|g;+ncf*-`WMo)}d zVp7#S|7CZ34k*e-pX-n_=Q@-O3sef;42^`~{7DU2REK5!_gr~&AWG%-MEj#!u0A^0 zePOq%#xC5lyJaZ&E!@3mEvn``VuJlwnt}@bvffE~q%r58vRIa5_d&SKgH!N_xa^o1 zpC8RE=xQ-DLBlm_ot!^q9uDchx$QBjXam<26N374_L$k|b8hxXzrek=!5PEmIR&5U zU}R;%8r`W5_L);1@-e46l+S<#IBsMls^`8Q>E)y~2Z5Yiu6d+3V7E=4g)}F{jST6O za=z<0waH9Ul1k1mHXwMD%`W@|kKIBj?7|}r1h>LQQb@~yq?fo^vHqn?f%CMI(I9|K zJx(;wJ+6Xx_Hl5_&^^9C$~1iF1$c;m4e@*@NBk(n8HhvIq;$2Ao;iTgHKmMROElI{#!~2o^I50C)Y!5_Q7K$}@%(G7s0q>qybUEyHy&G&Ynw8K12#vJDKD<%8diR@JKx59jA|+HsrE z5bnS@;>Q9K!qF0LVnRF$yLdy>ACSVuR;H^^h`#F-fGsvpPmg8sR6-HWOx_2AG_dca?K!(xDZAuyC63?(NsB2*+hAU6Q9889}N!v&>TnI z+;D!kd1PTIxSmOkY_N(`f#XREcHv-v;cSm)p#&~-LZJU5YLWNE5Y0ae$zb)-JQ;t^ z5~7juR&MQtnBW?F%TlOw7|lJC2(;rUSS5`~QXO{DAsq{L{E@pnL5m*cOcVTFU$iPS zaY{&*kz_=5fvFS{sOl%X?E#KBC&zUob1hLrorQR zSgz~O&#`LY&C&Po^gZ21AinS>+VtmbFi=Kz@Tr@smAY=B!s5ldSdwax#*6>VqUQgw zql&OPFa8A!(m0cWU~NjaU1+qUcf$*boXOTjBrN6ESi@Hnz(wmK8m8Fx)3CyNr?6Y_ zGnIc%uz9xdMI&C$bf&(k{GbXLq7~UUmI>XR*G$ zKd%&7z;YJfI(A=wKHXH?E(>Ks*h<9#Cln;x-=AN}S(208w_6n8R{HZkCNJK?Wu|16 zt}<)D$$V-`$wE5cG7>*!+V@ct%XRSLN)y3rBY!Lgj%lp0_9gUL~4OU&SYY^Xv5RW`~@sw}!bBr7D_Z>3$B1eHc4 z4H1K~eDg_cs;HG>8^tgRxnc^CAbOZqs`g72WmiBt+esLQnoiw{M*Wd}lRRlr{kd;{$0k z&}*D5Jq8tVqtj=&FY1=-!T|5z?Zr>!cBGdh8|SY}MZa=S>7vjd+*Vx-%HqD(d6(W1 zz4$vKs!-MC7k9O@!Qs03#a_HkM3r9ryJqrMn@Hn1ZfC-h`0}!TS_EJU;3ywE9D-=CZo0YYcbq@mHSyfEtlrnyB?f2Qc5t_j*%n1eO zv^8g^g0~}{=b~~?q7mHRxd~35R_0yA*K(ut5}p3EkoY!kRbIB!DH>nMoy&U)DlT%$ zEOlF*>aaQskvXGgP_YMpgTqrIUB5Sx*^wf{0|vVDQ~XgH*Ez*M^dpn&B(Iey!ZnM% z;I|TmD;f!xy4Vl+Dk%p7juI|%YG|^DRa+>B6i3}F3$ba(<}i$=(w8_vXK0YYg|2m~ ztl)eV;6#hIPzmA7lv)O{L~i@kaCDVxnCc%o+~gFTq6>%aJ-^sitmGfHGIe6HOGfNU z58e$p_+%o(i9^%8(0a~$nl|D+i;@qr=hwMRcF8~?A;9yoO|vo_7F!lG(drt^1>=%P z>@rs{%{%!>1325{-b3~tu+o#><5`_oHNL|U#)Reabp+cV>ll_ORTb@t$mCgbP* zveN3pR{E{93GsF^zj1~PTXmk7Q| zjLeFZ@T(!+2oB9A9DxOjP59Olmc_iq5XypKkkd(V*d&;lfPNYFp%7ysmTC`%n0yLE zAGK>Cs)AU&oscPcyJbk$;9|rdGzDY^!0;VmC2voQ2MEhF`DZa&-<3)}U-Zjl-tx8#ehuTz&QZ zvZa zM&g;*!&7gLSXr6!eWP6%VX+G-;s~f9mR1lc_7z)bkF0Qzp7s(GL!#IHxl3sj}je_lOg7lvB81rf|l zlz9`DTn`H70#c5&v(R!pz=xR;qk&B<4QWYS#_V^|7Vh?Jt$MsEx{j{SGL;!+K{jC= z=QAf5v0TEO0JYb@aB6PRoB-JS*)V6K`$$W4p%HI-La4Umnfu6DDMI_rw+X{)+Y9Rv>f-i3 zTZ=F^t0)0w*KRM$Vb$rT?sl@%$AFcRVE+9ycYkrP^IDr+=UZnLFsEIz6P47~FY#be z1b40&_Ni*MB>}950oE?Tg*yvpJ9YkI6*{@>Wh>Aj?%QR7Xg7CzS)<1o3E%8=8}L!w zw=dM9(ArhYLl8>gcE1>iM%FgGxI%$mOheKOGF25kBImv4HvpxHXZHc z?yX%B@RZp}_pA6;^bV(_uDxXzVTSpnzdGW66UifwD}T+~LkARgA-$UktGi$kCUARS zo8S>hVZH#{-e?hgxxZhFQZp20vN2&3{(13`MG(2zb;<6RO-{Pl!Y34ppDjWoSH3RT zqk%$ZD@yN=1F9oj?YbzBDsbVKL5p{se1UEU*R{^aV++s`&2~B|ez6GaIiK|b?kj*U zq42804X8@EIOHR~hXgH0#=lhV7I zF0@&M0Ip-b*4>Rlj7@a_QF1;T0$^Km^agEYn|RW{HpSS)0lY;dTsNDxw7Eq-c7ct6 z<#g(x!XUov`9b-yAo~Khc0+RLAyE#tskbs=YXG)SWc*#ij7`&l|9vqD;^&)kApS1b zxxo)sj*5*NVzWf0?r34N%nwSCF0S=wBZMY(ODt&ZBy&xT&9?~SL}D=+qz|MtgT+U3 z4I9Hf0)X$bsETQl5lar_gpJyM3My+SK+J;O&JEiXMyTR0EIy2)xg*LeJV!7RW|(WY4S4&VruvO5CMZ5(<%7L{?MUk`-$^w(!2FyreJ zkvC_0J%Y7&*A9C_iO@@2 z=r1mP%L;U`wtmYl7V+HdiUe1k)n!*=TI3+Jkj(9=h#)wkm zHF0MuG5WT)V27Y&?dIAiVD5@m*Ph)oTH%~k#i;b~bk#b4e2I0wzn@Vhe!{3Sx!e2G z(fHbkPad%|}(j5drcxr;%95XjZn zHh{l+<%{d+cW(CKgW!3czg&ufYgc_a6}iV8VpL7ljB3w8Mzxr0(yvu8%Sm4@II;kZ zsQvy(q&&T-o>47;XVrgs@Ue&CrG01!&x7Zw+W2~z9PQ&0zh3H``4yx3*`LvbaEHHM zp{+T}sA`TgDs+-jWkdW^z<4W>NJLz4y~3q~ z-IU0xme-EF`l|xuJGTTohflx8sGNUcRC(~kpJP-fpg6}?$yBDF7}Y^|8h>O|>mZ!V zP4Acr8ty0WT3g2fB4PhuP~u~?-iC>+J7L-f%qt@q&F$Jn|8zpBYp075GUQuZZt-zL z$M6m(G}ZZcsJBz_9Mj)-LRm=r6~sS*=W}>`t#&(eS2^~b9nMKfg7a8Piwm65O%#oj zT~NC-<%FDm$1$#`*_&iKIhxTB!gcA0Aws^=Yu%6sq6!gs2H;QW6W!4Va>cWd94?#oF%liF8;1oz92UXwHp9w_m zP`COTEjo&v{{+F0X!$j1Qu=7*MuNvgvR5e!_W@3_gJKQ4z!;J&!(YBwO_v= z6zx)l78^DG*Iua7}K z>X9%%Pk<*Kp2y&sp;wGWc?!sJ#(1;|ZPB-mN81tlM!(`wv`L0C^e6=_MT%$`IPc-* zsc0GEa7QYNK+$^dG^jq*j0@6{7gW#kbo4Pgg#&a5BM~3gK{+StcTGey5aRLu44~z4 zawc%{`o)>Rfo9_JNhp++zkolPghq~$Ll&NgWs`qfR5|g3XUSaMcOromA68~}E>h|$ zCl);`hkeq@i3gt53?h>#g2(-{&=ex$nJn}K3BSogpONtS$!H`AKbnlzK&T&{jrt+v zt&e{U#Uk}WDEbn3ICzQ=ryGvoS8~t?=m^&4qQ!wnP`cp<_JmP};9(h!Lz&{k>#L8{ z654~gXjS47fzwrD#v_nDiX~Ad; zN|2(-Q&4fe_RHq+i^wlZU>*TTjsXRyu#A9Y6Pf2ptOcdq&?;7)+SPix6 zrp9m1ga+(}_Y@#+e0L^V;@@di=rUlV`wwBb1?d>gSz}r8AHo&OApQbgHVbJVcT$fZZ(tgx6)wQLpFmkG zDD%e?NJGMYv(YHl%^Ro9Mqhe53O@Gzw3hrru$?z{nS*jiIG~a54|u2%JD}?Ko&N>J z8|R>_MDo*fkvMz0NLF~S=KdkfF*#zL!VbH<%Top2`OY2`qZ`CuG^;AY;J9HBf6nY& z5l3UE%`O#5GlBa@@r0*P zI699PK~U;YGy-~Jt=uknFxKDf1 z$dt%IWDKAOH^6pBeUh=c$8^Q@MBoNsr;-wI!#q?AvX{+AQJF+G^-7Xwtelu`(D(n}{gp$s+e59y zpLJb{fam$8uBILvG!@SDg6JEQxUk@aD3@$bUo((LjF*haq9vU2*pCr zAb(oWm00@>+WCLVcRtPc_A@9oumDTNCEreDxK?ipq6l6k_)JrJ!e5%OnxV;c1{(qP;dl4G@|3Q8b$fYI@%x{&?PEG)PL9FGf)Tl&{Y`#23!z$&p%lb-Lj@d~Pv{ zMBib{Vra+TVgDs?tgVrke&&-;F(=}lmsqiHz0mL~kB~tYfOCb-%chEb3!#Tw$$9WX>KzD^Q z{BbdgkT92vQ7}=c82OjVMODRhQBy&@DcpQ*kj;5tQ&fR>43;GZk0@DhN2L7f9#fbX2=URDs_bK+ioYA z5ynHTALa7~Uwl_^>F#_|_(RMu+XoC^bnlUf5A_g>Hj;_Gn-KqF1LrMPmAO_jo9+s` zpu4F&9l~)BeG8>;r}Wo={y6@-1jd%--SMKYr-Ev-l%6wbLEsTv9=w;q9wcNA#BYme zM7Ze7jJ=@hLat*)f95W@_IS}>;+)dMxs!4}PB}4ft`b?`^k)VECo3N-4gk&s;2hxK z94w3mvyrj$uJ9^lji+W?4Xksp{&|!fe^;>D*8s^ZAaS>M3bCR>Hxq{Bm-D{rVmy2s zn2@_dcDGh{T^w9>S4grEIulquP#?1lnGmw+BbK8~q_jcJy9eRbFQUQ#N1TkC#O=eV zF|=|bIrHVq(+xIke-V}o{&?vMlnBAW6|nO0$7fcc9T3c4iIQRNws$3(t_ako8)C41 zCG-wQbnz9VL z^f1@Uy{KLPLjBQ;a(@}cOKN1jjEbOS`j=6l1ZjR5#h`e-`zt5_DfSo8S@)}`$cIE9 z9ze+;wjbBL3e$Fq#8IWF)c=2>1MV64Oev`AkcrBAqA}%Q;%Q}QXfMhezgdQcNNI|{ z@GpG7^1k>9eOX_B2<4AYm-mS7Dt|cFv^8j+#Cl*2DwU#9YoVSUMcT9${KtO0e=Qhg zKW<)&{Ji%UkS3HaEs#i-+0=SHo)u{jZN#4Sh+HdSst>;g9(Gv}Y2ZjxpQ{O#LUrV7!KnD>rp3a#CQXWb$$=VM2)UPFyKoYz#T5b!UnX=rz-}i5wmTP zZlo>?u2}vFo5LA~JY2pJ{OdCO!A3ZWT&5+Cw{au-m_~oVuWUjcQncuGSYHu>A8_sK zXhJrP_R-(594@Zcz>=Ut=(4oHp*WdEb_n+^)in<2H4EIs;&smCEMkdCL1*S#&~zl8 z@CFK@(qF@i-hhs)!XLkZE-74N(hdH&bTe8+qbu>f%~0k^i+RWD6x_0Jfa&2+!K8X=9TQ(?LeXCyi%{33xgni9nfs=0gf} zVfA*HDW*M?Yhs^Vqi7zZ`s6x{LL#JG18J^9@zU+cKm7-qx#wZWG=LQTK=*?JdO`sm ziXP}Lu7g-E(W}PB@b0jpd!Xwb;VwSE9eI~_Skn!w)hCS;Vu;$e;B@K^lzKhb;b-U! zVF0^g%`vPgIBATAvi~5#ezHz74g%}F1F#bk?37h!99MGEcokq@O0ci28HS9!vqm*o z@ly#_ZOt;in0(SW8DQ_1O2Cgm;1bCA69869uy^6=GBJ1sOqK5l+pX2GUUDNPpw&v$ z4eu#+b$u9|(BBc(SeZxUy3h;BMh2ZUoTHV$(wbzbDmZKWQVZ1vvPpwj0{MLe>$;-h zkU_o#d>S&GkbFm&DW&H~3glX<>mRfh!ki1GdeB-@Bw8H^e9&IvB-nU~KiWc68;!Fu z%4Sv3_+5-%git@A5>>0_uY!5qbkT)Tbh@b8g=f3vW78q^^?9Ug7mDnzoi5I^MEPJA zW-4lcJkgyg%H5)2;?OS4vCoF}#RE)scNXx)!HlY1$gy96^~M8C5)R#i5+s zj01LUw-Zb@U(F?jQrna?u7$X(ZO{%y1ryHjN6MXd6{_SFcZReJU&2vk;SkS?!qj%5 z+UCu7g8>!1jPa-l;bjUU2W@YM9wFbh~`_Y#2nW<+)=x*6{vCnHr7U#o9)5|n+)W=1}P$ArFAICb7Pzr zg+Xc+&}KlW1*`&S!Rh!KM?n94x&T^(jRnR+iE)npuMg1zc4{cxpC{sfv6Sn)`C)XM zp1JDSUe$G?VF;+2XLCwxh%T`%&K95NQ0tFy(i0 zZt6hFCb)p!E_j*GfW@wejAt`g1=2u6nvD~{RTA6{;7$N1R6!Bbq#p=YNJSJ3T7K>)M1^oO}p*#m0zQ zNDQ;D@S7pZA1Rq7*LecvFbegzulAb)&{Y!DpF%zHhC?XQ2~jCVeDn|saq5IcWt-4~ z+YceF(`B0Y5qnglyqp8}m_mnxY!i0E>M%OLP1s{Ene_m+4PeE2Z34DG4vy{tbUi?I z&}Q3&H|)VXSY63X;+ETl)%Z{~3Q?EX2fxSa9v8!5WlX@(QL2$vJ@a2+9rmd~qw_|C zm7XCgm^sqFiP|af{c0x)uX_y z#_JBFK((`N*r6FcZnRA>;lqcaCH-mbOW!8kz@3ND1gB%L?>K4Bj~^k zvIRO@R5GreN~bo#)eQGp7;u`N@GTc~a96-yhQ?q8?QEu%`B$No4oo);N2I(4(-DBW zNzlImN_sO)m+H_2uk+?V{bu&mYY=XOou`PeP`Fo(nKY|@X$0wLR8@E(L2wkYz;`AL zZ4Sg5{J~e~%#09_JWF(9oI9PMkq$IvLcFA~nQG|+xGSI~)NE24?6{o<=UyY>;3hED z(||Dv{u_`-2CK>a9?hxZ{LgR>e? z;MiNRT<$UdIpf=Fe10rN0MUKw3;gr;5bo(9+={sW(HK+|211aDFixn(gQgYdgP4kmGc~E?sTDvPB3l@&r?AgK@jO5M4d%c(8l~G zad3|y{~kg8dId>xd@0vsRL<#qX2gVlmK1%tyNZnG(O$aO1+Yy=9`yYh?0VA@3HqcC?xbtTbb?& z=mSXr`pm{gP7;S!xL;7dgLEx}D^lbapMat5w(tQi_y%rEY{6T;fnBrbalp`(VVnEsO-1zI{}n{JkS!*c@HL1tm;|*QF>fJ}!pfr%ob;S_?`j zrD739eDLyZRItTlf{9{1z2?T#bfZBIcZyfiHN{4OjJv z-=TG^;tuTb}JX*f!8q@N;b&ogLXUwqP;zW9h#wkbvWJjK@KcJA9nQ*Lj%J796D%5mah_rqvrZAr5S|Qvv zRW*1%bbRGt8+#UZ)g94oKf@8(`m;Ty*xd-b?8ndcXif3Pf8j^`*n_8~p7&!9|Jonn zWXvI&qAvELsF_vg9yW8_xgJq7&cSxMgSGJ|(Bji`JyNNtTjyXaS`vK;`Qm_|ke`&M zqH}+GSajJ>J)(F2gd%%INA*ha!Gq8DaE(0=Cx?yrRF^BX*!_j7cdrkp@#ub zet67#d^>@XiK}*i-KJG7{?n=`lUy=rN8uKNOd{>OHYP01H&&p8K{4K zID>h=_MpmtMVV4z&;Qy}y|ifsUG6C?Ez!)&JsB*!jPk-Q)SKMAgZLk0$G-lKNjKOj zF|CTse^M&|il5!i^4)16}MYPZw?0gjk zNac^XD)rkqJol>P^;YBZt0mXQo4Sn2yZozjV&tw~8^5H}PLg#r{a~-V*^vBmx9eN2D+(2j1OZv#0 zXdCOkEBHIHO!k=JjP^0Za(uQGr2~cf7ShAud*&A0vGc|5zrk_n7QNH&=r06N;WoMl z!RAPs*ZKePuo{e_Y#H{g#iZN zJ$RP^j%N4ZIs-ZYzy*IpG4t{MztLy_-uxQ{sPpOZO`fQM7DBT76TANdYt8=w)+hc$ z?twm!H{AyrFXMCf(QL)@a9FnhD)`YmC-<(5#0cN>v^zrJmy)Pw98H-jwwfxoU&73yl9H&T^*jUZkyOc> zpx8UsTf(D2MOx8DQ?DI2oBeJHn_-sgS&8;D6&{u8hNS1q?;z)N!}GY#jFu+liy*3!3CF0!D2a9_wg3^G4WE9)<~fhyy#!EMD`uv_84 z90m4U!u$A;1y+T;cndaWNTY0oW+UT|cay5QXL6A4qC!qlAvIJ;i-f75LRMHFZb@h0 z;~hcxluFt`C7qV&S5is4sie(R(oupTjk1V}n({AEAA(|^LgUK?GSW)k5qpjK9vJ#P zi=$DdQL`vS#30qCXY`u+g11$bYqZ~`~83OtAHcEWTiabk8q&&1#$qXuM zG?n$Vgc(42;fG-!>Nwe;<8%vYiKO?+;Hz_Dyh##|nQEq`Meaw7oG4-L!O_4i;pYd^ zN~JD63>LY9;7l2eaCUS{2$2|mfe*g~=)I(n9X3)(UkP)XiaJC^^|nL=iaCSv4#IZ3 zM%O9`_Fm&z0A~T`@t`59cRD?2hfOw=Fr$%r#Gk}9uq|g33{ddVI;D;odP{iD?6JG* zXfB*toD(%ww}fISV86;+LcWyCC*br+)0;`t05=i0-YQhtZwYH~Q8x@rpjtju5M;ikWEq0;eLjGx!uZ zKDWwNp%6^oDwNo-i)m%2;k-drd0O;@1IAX^NY7(gue|-;&>BX8dzwZrPZ8oOsEbx1 z&wd(q9-Ki$8aOmTSOzAB76gvJ6?U&5(7sM-6X0x=@gzH9t-=cZVU~>|1K@2LdlZ5_ za&{X8u?luH1d9~xd6-VbE7=c1v~aH13Zqgh9MO_{CdG#b=-k1UM&VKLGp%rL*(%J% z$cfD?9bs7mU^RTECgZ!sa@_#X>t_oYJ;~VF3TJa=P?5>Nq=n0*t-=s%CcOQjsgTPa zt#I?qF@{F>8ADqI8DxFiRt}PXhZ4!)+hsXenMmoT<+NCcf}%yP0q}J(w~UC|N(UMk zgz2c-3Zp_R96xn9v9M~#2`VV%Ra~NCwTi1HWN^hQHgPKa5)NcCnT`zc-~*CCtcRr> z3{KRXXCW#-MaK#!X^d?ZW&l(Ha3^VuZ5952iv^AuB^hHwo!Q`VV<>AZ9obri-z-j$ zjSEyg%M0+~9vKN+;Y(j)Osz!I2(GzRIAX<~?(9H?5|r4Dd%~KvlMGx zSntvkW>WBa3AmVwo7QLeA>uwVfil)sVG2+Yv%T9hXh2H^?W?Sc3MI4#9rz}rupEX5 zmY)aNI!wEjX1iG$C>+CZtMD2fC|bu0qiB}?kflo{*tCFjJl_VD&ZWXAqzt|ZkJ zN{up9q5&reHa^%-2X`0-;a)0k z^S{L15L<;d=nJm{6|wQpJ!46$a0Rr#0*%25M&zp{Oof7s%-G+JO-D0ufg9^JA=C7r zA-_xW+Cj&c-iEvlprj!uL*8UqhTcksWx6yX4Y}5h4UR9StcxWz1Hk_pg)~~en4a=I zX(Fv}wnXDfi(o*}v`c6n z(;*Mqj&WW;HlXxF%CbjNBaf=OlB&9(N7Xke%~pwK0u?i?ud1NgO3<{-tOVQ6f(akX z>tJJ(Oz2vLWpFOsDillH8k)mIN;AqP$M^cNPNfARaiLF2B>iXx_vt4g4=mjxOtceA z52vd6^r)6bRZEsQyTEH2Vg5{NL(xMslF~#;G&kW#5n6@s`br-S`ul?Z8gq+q%I>gq zzdn}k50>r^jjd1XHiocxup2uVpYmYeq)yz7XM3_CrKvFbkcCu>@HR|8TVRiaEVNpL zu`s`G6_ViMfTo&UJIMf83@uVV9BZ(AHnhkv%C{OQTi}MdWBx^!1f=Gdf;7-jJPYG( zE~LFEZwfdEmXCtDmLtzOkI+nKQD$;m;JP@ojEHD~t4TxwMug)lxIUy}T7>cX2sP`< zqIr0%7mU91@EI>Q0L|04d$AD+mFT^^*{u-b4+gRmLQ7D(v8?CvB>6IEUVFN+gdxk4 zoPT~VF$*8qA&s4V*lYzQ*3b4~y;$I1>IY&=^jrMcC>B-WdVh8)1d)T;ItbbavkBTN z+Rek@UTcJo38|Vmr03h03*x8~>BcIY8o)Lxsz8TY>^Fp6PNTOmH-rt5qV+@Aa3XF9 zyFh~E1+t|8X$)ljA-EUF22;dR?5%;RM-@)ju;-nLNbmmX#v~k|l?ZO*bS=BE59Y9z z4VPs8re$Z)=w3V_NXokoFA8EyDAa;)2C?D6;lW@PnR83JF^$ILEkPf!E$R=L7M~BG zFpy=lJ|dWvAYKu=_~>x3+7xZNQPgjXVBr{o z#&Kjc>w}9U+0#-QaB=$OBiPzL1P6L?QP?ep{Xt4M$FRvX`Z(5(WGB$*e7s;Jn~bL5 z&XKGiJ~5IVPQjb-UjU}jop^Mt6s;yuZ(I?}t{xjcg$+MpWLe(^MYv~Us$o;|H}fHl zQVsi4QVrUva@bL1q0zCjekaH+V_CQys3LLlDApUD#4|>*PeGs`#cJ7;TKu1JYziJc znssx}%X3IsG$j=#SEEO>$^O^0WZ3TaK7y9pvM9IaAE8-{tATsu#%p-nXx0l|)9)S4 zdb4?-!{x!3^KQVL{f6)}TpKMbAUhhB$zi%1a2JgUd$N(h01`tWI{-5MLaOl&I%}An zM<6#WaOem%@SgUDZ~Uq#CbNyy_A7;6YnH-xbQ(^Qo?J1paz5 zG@(J`*jzLM7mZ`J5NsL8E_cr)H3r-Z#)Aaxk-+*On1m*3)2wf_^lE4n1 zyMR`cwnZKu-I!)@2PeRyK`n~#@J3LnfTX-26$GhQN=VABMHTK3lylW2r2yOjNbRD0 zON`*f4wQrn0NA9b-RIO|QS`uv7aEpads$3Dt&UEu9U;oNSL7{&|) zdRY&Br9^)RMkSI%g+zY^&XB{fC6Ns-T`7^ACfC-0#4$=<7mnDA^8?Lq@Hd2o5``Wp za_&YX-H?XK>%vF&XrOr=Xr@avdnwIupdr`I!gSY#x8QhM?iOg?#P92pt8T#f<0y0m zr3`li(yX>{&M8Tz3xtOx|@N!2YF)rC;@27fwnrFT5?8)dqYfCA+(ONj{Wd z|KRhDPgd%^hR%bl%@3cmC4UA7~%x&KXEc`LaYj zR3d%>pHE>!-LgLJ&99Op$R=nn$Sf2X)3F7K9`hcXiZKt?8Wt| zY_Q)Zdv)DpqY7>}+X|wgK)dZ@b%ixVfGHJ5z#8n6#wG?7#Slm2OupfO?N#K&!riXpN3XWI;%X*u<6wkqUuDN;p>+n z-7gI`30XH)c$#4wZcT^rumZd4*mU==Y46#X;&g#v=IYq7fZ0xdu(Kj2-M9xI)j@6* z`c@qolDzTliEJ!xjd2)qT%Tjnz0c1N?9`{vZRit)^W}ugYX! zK>fp`(~OBwUKXYaL>QWg|1*j8&D;o+DYE;_47)CjqL;tPteW^;a&_!F?1@|#rdaoi zX-t~YIf?KSKNPLo_b)$mk@z8REYD)o;C5PO78K(mUYZ4JTqH)jKJ_Bhql|e)D+nD{ z@|&b?x-_GSdWke+%v31ZbKv;;K?X8--2QXN#WT(5S3s0?IKC4d{rW%b`tFe|UqScq zglyJ3@E)zqA@94le6vVCa$Ab~LvHdOUY5=3;h@B^Nq=2fW+vP6y=B$vuEAN^bzz%6 z`!RMM3cN!1#$oy63_l>9u6P@MfXVPeuG4!}oz6^>u@HCVu;*Yx)sV}UJf%)fH-45v z+7di0qnWLn(Au{x5qxwXJZWwJrXbukQcH|^m>X}+V||#8PGC&zCBYr_{|5S z8tTIFK~v?#2g*;R@O0zgo>MnQlchV-gLm+y8&~7YQ`ylpr)^k0jrH<)pQ>jQw%WC; zh$gYqVE$B&-KWD0upEa^hiOzfUhGJ1n$B)joF12Md=Upc4q}ewr5h9QjK^U%b{dyH z&b~q+moS>au7F=*Sv7;rhT!`dEd1gO4xUMa(wS_YmN2%=V>F~7@UU4r`B3JqBNJts z=+?NxbmKAHHIuzfr6uF$Sui^$99wbZ6Kp1kTJZ!MNg=24{wLUYDcb%7Ou>&~ui0!U zg$%|MX0rj3z6G;k=1GKT@f#2Yx|-QAA9@jgKO1`XF>Id=j+E_jj+9%FhDDnJG?Ghav{>A6B5!uu2-~PQJd90|WpR6{+2UZM>DQ`nw z??Q}hTK!0K-U8dI&BE&-<2lno@k^#l$hFABJTCR^NVjoKKI`q}D0MPyImeaRgiE5% z@F{M}XXn#wf5OQHu=XJuWZ^{xFl+inzo~##BlVbW@@pTb45Fr47!T!}hY!qSYkjQC zQAM;)r^_^6APx&Y>XWI66Iec<9qXPqmZ?CR6r;5S(70|sdkD?Pi=JjPX$F;8|1>NF zNM7yO_B0e6e&hzs9kGDbmbSt=HX4f51WOoV>So~)8(GW{GY7)KWwS8Y+AMT;9~9$I zv+x5@&ji>vR%RHO2R783g#k7u6pS-59^y*MAp?%vz>xw!8PN=fDufEz2;OLE7Or&b z3}OgaLk?xYXBV)MtTGy#7qBl<73bmQ&#(!K_cS`g=lJk5Y&wN*!1ia@g)|z4ix#qh zG+KhUE@UI2S?UZswFo*sk>rDCEn>%pLKk>w2#5tQx%Qz61tFfQ z*Dqp!LudfrS;Uq@5bzx2H6TVu7E;f#U;8Lcla1$+Pa1#BYZj)#F%Psju~~?~ev8>0 z^etYrm<{kbCHB(vr!-DL(}8y_W)smnxOp)<+OHHQmoI~i^CDc$(lFW|4X3rQ4sI3} z;P54^)@NQH5!G-!a#h%CZx%M-f+gUWN8`Oq*m!4ONkk!TU&2PpufnI;*mo&A(&rX@ zJ5OYf>?6BbID-q8f^w(ry~+)Qt)#1hD@eYl-@X(U)gJ5V9AJ?4zHr=3`q-snHZ@d) ztv~V=_*MAPyE3>ucUAZcdec?f&UkwX zJ5ligSnx~STEfNzd=Rttb7(-w!(bgL*BqIstYqZ!iV<)NP-pl6M?KH33Xkf}F?PdG zmoyYyg^!Jzh1uX}c_GOx4|D6&VF`KT^XzOYJPgMy1OHF*nU3c!V}DVSs60g<_X7JE zqVP5Njpb0r5Af0DP*)#d*B9AZl#3f)gegibPFw*4K`oxOg593jW+OIosUX#?fkIrf zz+=lY_>`=Ln+16#1a=W%7j2UbpXQYT?BfCgI}NbYIASG?iz1%75~?Z}RpfjAs?Q7VD0LfX)YLx^6hgdJJWye!&2-dGb7Ne;9`@WZmTh1+pb7dnHo#sRnt&}Ep^hftz)i3opMb}1Vvl-HfJK1} z1xr<>YAGtx875$-*V$&jjG2IffBwL@IKSok_H{A3`iJ{WakBA4z2$YXM3{!{Z?Lh7 zX(hxhj@=9c#sxfMGt6VA5r>2~Z3d+XatS`PnT>M(5We@$m`VnS_RTQE0gUk`d<)GM zd6Q^hP_IuUzl@WH_ikYurW4eYK`uLckz`V((KW&6Q<=th;6!gnNfZ1|1c{$D`jsek zSA-3)*ZL=XB`Oa~y!4AWstoL=Z4!cDry9g6$SFeIe^~#>ML^ah6vG;%N$`TzuLfA> z_H6ey2?ZiN;3|j;OEKCCQ?Udbxs~;Eg)@L2QF&WIQ~(t<)J$^!9tL$HO5I14H;D3< zM3v$lTiMaBZ~jY0Y!kSmCZPo;WLJc>AR`*WbKMV)nySCx>I-yp;#7hB8FBBC49h`jyNj*zTej2VwXVk+t;cRHO z8YXUk!sa?NLaEDy4)_e*$6XITp-F(v_^_l#atFQ%zH+#7lzfWTB*;wFM`4ulhns`5U5?zuB?NexU*Tr@#42d#C;uyL!$L1chPg;iJD zYQ>MXVXhmMZj`k%)mE6>hNT^PN(IeiAF~B}*ul&dA0r|2i2-@BGSMh&l{i5;rl=D|MN2E-gC~q=hnS~D~z^F=$m-rgbfK4Rh|)tq2Z@TB)R%Fh_p?Z z`E3yQZ{nx5Op&n}Ym)Ka^_%$v7M#h~{W?FQjr>Ah3}*h`j)&aY;)r{l zNSBc#IrYB5mmq<8Z{pf7`rAz*UV4+S9+7)Hew+zueeugEP~;Z=@c8-y#G_xzuw#LH zOW47affXf3dqahD`dF%W(-wY>hMD57t(ae2OmOvG7N@uJv~eWvy7@{SXz__Iwz(!F zqwi~R$2Oi4UE5FlUd%=TsLwvVjmNpI=xFWc@L+UF8)l5u(b{n6$dyjghLaZB@v_X- zI17v=wBue~_EWUCd~S$tZt(07-p}?kXA)w5iB*qw^KAbJq*jd7Y;bG(NouV~t+jtR zZt^I#)%`4wx;^$*WO9*|Tw2e8hhq;$x^6&{hkGJ&+i++M{R;MDn$TwcM)u=2v*IU- zzJo;H={HJZu!(vxfu7!RVcGrBGOQhZA)3p09jfZ}a=tpM9cwXeB#0LVxASq)_Xn8G z{r$#w>CBpTJk56Nc0OxZDjcB_l~AnP&f}&RV^6o;e3?$THE)&|>NfMq%Rg3-XQtkYDvuSE>blBqOu0 zUL4)YUzNeX7t7z~E5}mIDL-7aEb(csN;xck^)@a(7e(AI+^ZuD&iqQ-#UGb3?-hr3 z@p0o`8@MtuwwYa0rjfDD{7hWh#S^k0lIzFRt!M>ey^ETVdPKPS-p6>@W*)+>S(~{6 z%gGM#-5-{d+wg!H3{oKV9u`Y0_#StroJ-mJN3v4ag1)XrZDt^tBo7X1Grz;eE8WAl znRBq;jeTC+#oLkO3~XGtnf73td5z5KRB&Z6od(oqwju^ibK1-##Golon>ijY^|qPg z5PD$nZS=DBd&}nxYks@uM5?7b+q>bfSXb6w5pDm*H^glWU$1*cKf*Eg#k=+h#dcZehJ@^jL)QB?m8cjgqJSDgAAPnP0HF{V;Q8!0k=6d(Ul z-2J0?@<%bc>W65lRk&Lqg*(NbDzrO^w}_T2;$m?bB2M&3*o$6Do)6(&Qrz8>xXZh0 zFR!!UhCkVhOPIu1vBt|s$Bo4!bgiZzKbZx6tnkAgci}A9`9Q1rjo9Jkb<=j?i*bL< zZ8hJ(3_T;20&j(9(Pac*W<^_uaN1(4xe0E+_r6-gqjhbjcgKF7#N(=PwH<$OLEo2a z4)=vt(9@_JQ(N(V7`{CxIuGy(cb^DcG^+;^5dC<-*>fr5a9{Ofvv80|3$|X#wE?RN zw9e3Keu&AyA9Gu<7)~QpD^>;RtiM*XM!CNevf%iw@ZnsocuDNOfAF#Hg~5t_^nTYZ zjg&W)!5J*v?|}Rw^ms+iFIvp!L#<{(a4x&4gF^ioKF?v7y48F}`Tqg_dH6v%(`vgt z`K{)4(7#ZwRzM9EW(C5~^CaUtDD@3UV|ie~jhLmhm`mU_3tpB1JfQ0LEGxg@VJ(=; zSp4&4A}u($p%rhtO+3i&9(6QC1#ZFpg9pV-g%%%+4F`GLXohmPnpUbM%+9JGZoynd zynm3-cYlfjuEjhK{}!_WqopUc1;=_>aR2LZmR-m|UXRE`E&hMtNrV=&dMFkDKS2I} z$K0*eT!l6$4=(6?76%+`U)F*vN&~i)_oLdzH{R9r-Lg-5Mvb&1#tzK7o)eUpjuoEe2lBPJs6&@p3I+>|TkyTFp8AEoO{tsTM5Rhu_L?G4H{XF|Fn;@Z<2K zG&6^2IA}E)u2J;*&Ma!CUtyOizQw#9W!Z-OoTwdVKj|~Qk&fbG39V)qMtp?2!Hye{ z7QDJ04mmB<$}v^F{}5l|zKo}1T5&E}i}@Dn$AM7iu{lPwycW#vNXL5ky#_xUT)x24 z0_nC1>5?AFq{rg09*sEsh4eT+M7@-{lW~v^1brH*k}gk#b(u^X_ATbVaOeoUb=7Jf z@TUF;?~Tyri(4D8YcO9t*1%7VoifQn*K>aL4|BcrRT-FRtp1oU9aVQt*mGF(iNGz+ zRR(#S`j{vE;PH0TzjvNDM-OH6Oc8O|q8TxNbjGSz_aZ?{Mo)=IKZ@Djd~x_F|J*u% zWJXV&*zpNZQ{shBaHS&Gei3&Jw@35E9e_+>@pa)8e(ha#jNfNyH+dUcxL3m(>CW1EE!qur@z>6y&G5})}j!hs`a#j(?Pl%PS(JA>=TX|eGPZV&OU z>lwUOF;CQe#p$iL*aQ2WzTs;v_(}v5o^SZiv|{nbH~dxYLovOR-|c>EXw{D9 zb1bphoEmsgN=+u6qi4rMkxk~`Lk}q5xBzzz!?=Eh4*66*I*P zUA$q^YpB&dFpT-#uYj|cpmAXs3(PL5)D7#S;*oRQ885$f3==7v*chu?2{g*kslW z-Ji`SHQ|Lx;W^JoPwpP1vLbZiRM!lYgpP}K`b(doJf^xLx>;H?7H#&O=V?)EWfIM% zDXbSTQJycdFYud^mW5`xrXquNgU8OrXuooWmHPr$q9)uyP~zm$WUdnB7xvs`nZ@Fp%)CJ=Q8OO6`1ArFyOa$XIQ2Y6W0S(M0+*>EAL3wts+0m4RM>3Bu6Hsv z9%eL5$LwT`N=@b&gpJWgZMvevi&BTxKha^FNdJ~kOd2N399A?N`YeY&F^LsYpMilZ zDmR-G#Y^AfF|VyshYvatA)V5;$WG8?elXOGO<@mmPP|O6O?bKDO2;v}?Up99VIU%) zWgA=GzHpUg=N$5z;cLR-QxrPftr!l>{V_#fD5fgbuSH+&(_hD7(Ei8)mN-KsUF3I+ zaN^^zOh#%lx8waCUd?ebdXgV2SnIua`}r14dtaE{xRtTuQ?wjS7}~x`VxVq=-#H>EPE-DW#6^?$Ok2kBpn@#-q zRp9Ob->t;*e(bZ3#tbO`y@Zu_VuS2maj73$dPl|MK|DoukBAxoMv2!4Fa~q6e*m+d z>qXokPZ+Z&aIy0tsJ|BGabi0+szvS~UpeY{aMkZmL|TvUUjMIFe!OD!kZBjk2BG0N zad{BK&h_H4%SiSM5jlipkBX!rzI5D0+}st7Z}t7ps2QSsh{ugt9s2rzW%si14dD@( zgW~KE<`|!g2_Zf$t`5EGL}P2GqdFWVEG?uxC_9~`!C2&-7jL%c=1xOtX7Bl&r# z{3=ZNBUa@De9$w8bLbqUT2aDmGyxkjLp@&0s#o{JTa z=tzC6`*u7&nIM%)9bAwVfz0k0oSy})@aVVCymjy{$TvzkdGJoi^yIkDoHm#VIbO<> zp(GV*ET)n4NURV0Hcz|g)%Y|Y-K!yBKKT|C-Guqf%fAf1*f|qlS%l+Y zO7=pWhk+Uh`ph;Q0N^v<8c3EZeUIoA=9}QpvuM-EXI{YL$6Gt!>&{s^ylJY8{~7MJ z|CsB;IVEPKKH-i!Ocf|cH?(tr2QatvneVF!gwL!F#&$my%|B-s>KCPV8r>_fu9LS6 zHfU8Pat(c~^>?W56=Joa$6@SQZ=g##1_K9}O?T;^`OGz#!1i`hWAo2_=0m~mPJBr$ zI_a|o{?b&~2Ojdra^2NF#_foidnB4&Xe>N@=~|1=yn0{+%HT79gNI^|bi3Ky^R+q5 zpAv{dg)Wj6niY)93U@hr2`%3BX(yZX8LlUvi=-%h)Tm>Zt@+f~jB0#%vYR=5=FMV3 zl%8_aQGD+%@G`UEwHoLb0sX%JK|d|%m-?kB{WMV(r6;-1^gons>5k^3oOoSjS{gp} z=fjybrB!S?^B?n2y}b}Dkm|MtA5cm)p$_9+hdWu~e|9dDwfZD#?tM%^=|u%Y9{^ zId6dO#eH~OJj>;g&02z3&%ou+!L+PX_|7=h=<~rjsKa%b^Z4*^vJ>)JDL)bX7swCw z=fZtW@b)a4V^E9TmgV-DD`b$B!C46M8!0aj?wG5&KI~mGItRfP^;>!;t(kj%n1$Vl zu6L3)rl@>5c(5LdL5*-zIkDyLGt=>u-mUw>oi#-&Ke{6}%LyMxa4bqr(hS)XZSal1 z8P-X%+!JA?62|op?+pLuaR3eM6Ht9@`t0xX{}w5e8RK0)Okb5cVel^97<9AQEJYjj z$u;=o4sIY>3}XjcxN*!oa-M$FHm3bS-Kc~46Fxrq3_hcxFVc+{z1?f|VY+)0KB+=+ z<}b-!S`HaEDI_m^7jhKj)SR4!`ypQidG4I7rS*`9L7tcP%SA1ahf6s-{S4$0VcGs2 zj0P~_ z=bG{QjhgWsKIoD>Lo*&u){JVnZ$a33;AEJSkegvz5XJ}dDdeLtYmrtt%pu70ZqbYs z@G|@-Kt2JMPt}Yhn`UgBqg`c)Imi%>$3)5#`r%m(TahjdcJ+aE&tSvR6qPh@;W^(H4Eb9#VG5qbR!8S73OZ3e3;+DT#e*7XQ+B(e19VQ*m=lbIf2LxN z^3PMuS1bT^gewFoy&`4zDF0%`5=ri6r4TF#SOH$gIIC0vYC(vpCLTo(q>C z9;5&^MTd9s^LnJ!UGRL^zYwI1iWEH{)l9Lnmw?n2NN`2go(EEf`O3Wjq?#&J?jDe8su-knN|bx4 zvX_DKw+DLQUkQ?eHDE1sLsJMgBv=pXEQ+;*lwf>uxN2=6C2R*NAqPkaIYCM&6RZVu zK&s(9Nu3pd@;3(#hkpr31u2#Os6pafI8-QyO2rzmELvx^(#}~sn8R*nUD7>{6}=c% zC})Gp&^zHJeVgXCzZ7pSBz|omHAM+XB`8z=6^b?9-k0@H4YyGe_KyK6 zqgcgwkZR5bQq9?wy91w^6`M2S>3D{ zf(IUz%A-cHR6w}X^Whq8Am`ax140Fq*CW7uwhlwpiwEJy{22hUiLkWC6G zAxNFu0a8sm!2@6pNKKj#Qp5uAHLwt*go_kCAeForBn3(oOF^oEGVp4!0;F)2Aag^g zfk0JN3(f}X!E3-q@H&Q5cR|@SuTVnhBOpT`vV+u@GNl~~N;?!(?uF8wvts363a&%C zWzw#*3eZgn)hdT}NzVKr^&R$VI3s*oQ;ttIX^&!dkV;r2?PyD7F9vBGD*>ayQc#ZY z%D)n%lGlJ#pxRgUYh*(8aEO2+jpQMgy`fJ;yWpCWAYO1|@tea1 zuz~4_Xa`AA2gsO}IYHS)KvJv_B*ltAQp^L+M8?IS#?n|RNL{T`5YZ6eRgoAq#Her! zbiiRa-4%hF*!ZSC_C6|*tu$OPJ7^%h1Ek^8Dcvz1gE>gI0E~ivk@ELQe>99FF1_Fp zpQ0cB@f z!xu^6P9C;@3uC@kY5k{Dt^3ly`19{6X1^h3@8Yr#B_ znk^rs_yr*Kw?dFckRoZ1VjksRFNpzeC#E+vl61j=H1>n(U;w24!QKwnhyhZ+iU&yn z8%PS+K~lg0&IFyH#-^}LkZRJii-=hc$YHMmhoc4>K}x?vSS$50(~zMIhzu)KhLXro z*=-<2aC%cJb?nwZDbnB5-_yo<``^=d;F#DC@hw}J`(Ub$;39>;hd*LQ1MFhi8a-At zR_m68E%nSe2JaIvR>%~L{(2#wh1>n!-fDffmQ->d>J4T$%wCvl7U@Rr3f=Hx>0v+2 qA($gDpLrX+`fM#FS<{UwMw&C0SB1;w((rOJEe-s?M%=MaU-Dn@y`}X4 delta 37146 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 N8u)*Wn7vzH_}_axiqil9