diff --git a/Core/Inc/main.h b/Core/Inc/main.h index c8bf8fc..8d33239 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -111,8 +111,9 @@ void Error_Handler(void); #define PME_OFF HAL_GPIO_WritePin(MEMS_POWER_GPIO_Port, MEMS_POWER_Pin, GPIO_PIN_RESET ) #define PME_TOGGLE HAL_GPIO_TogglePin(MEMS_POWER_GPIO_Port, MEMS_POWER_Pin) +#if (defined(TOF_1)||defined(TOF_2)||defined(STS_R1)||defined(STS_R5)||defined(STS_R1D)) #define VL53L0 -#ifndef VL53L0 +#elif defined(STS_P2) #define VL53LX 1 #endif @@ -208,8 +209,38 @@ void Error_Handler(void); #define I2C2_STANDARD_100K 0x00000E14 #define I2C2_FAST_400K 0x00000004 #define I2C2_FAST_PLUS_1M 0x00000000 +#endif + +#if defined(STS_R4) +/* IF_SOAP_IN, MEMS_IF_3, PA10 */ +#define SOAP_STATUS_Pin GPIO_PIN_10 +#define SOAP_STATUS_GPIO_Port GPIOA + +#ifdef RM2 +#define SOAP_SWITCH_Pin GPIO_PIN_3 // 2024-04-08 WAS GPIO_PIN_3 +#define SOAP_SWITCH_GPIO_Port GPIOB +#elif defined(STS_R4) +/* IF_SENSOR_ON_OFF, MEMS_IF_1, PB3 */ +#define SOAP_SWITCH_Pin GPIO_PIN_5 // 2024-04-08 WAS GPIO_PIN_3 +#define SOAP_SWITCH_GPIO_Port GPIOB +#endif + +#define SOAP_DATA HAL_GPIO_ReadPin(SOAP_STATUS_GPIO_Port,SOAP_STATUS_Pin) +#endif + +#if defined(STS_M1) +/* Water leakage MEMS_IF_3, PA10 */ +#define WATER_LEAKAGE_STATUS_Pin GPIO_PIN_10 +#define WATER_LEAKAGE_STATUS_GPIO_Port GPIOA + +/* Water leakageON_OFF, MEMS_IF_1, PB5 */ +#define WATER_LEAKAGE_SWITCH_Pin GPIO_PIN_5 +#define WATER_LEAKAGE_SWITCH_GPIO_Port GPIOB + +#define WATER_LEAKAGE_DATA HAL_GPIO_ReadPin(WATER_LEAKAGE_STATUS_GPIO_Port,WATER_LEAKAGE_STATUS_Pin) #endif + /* USER CODE END Private defines */ #ifdef __cplusplus diff --git a/Core/Inc/utilities_def.h b/Core/Inc/utilities_def.h index 3f355e1..c0fe858 100644 --- a/Core/Inc/utilities_def.h +++ b/Core/Inc/utilities_def.h @@ -82,8 +82,10 @@ typedef enum /* USER CODE BEGIN CFG_SEQ_Task_Id_t */ CFG_SEQ_Task_YunhornSTSEventRFAC, /* RFAC */ -#ifdef STS_O6 +#if defined(STS_M1)||defined(STS_O6) CFG_SEQ_Task_YunhornSTSEventP1, /* REEDSWITCH, IO */ +#endif +#if defined(STS_O6) CFG_SEQ_Task_YunhornSTSEventP2, /* MOTION */ CFG_SEQ_Task_YunhornSTSEventP3, /* LAMP BAR LED */ #endif @@ -99,7 +101,7 @@ typedef enum #ifdef STS_E2 CFG_SEQ_Task_YunhornSTSEventP7, /* IAQ */ #endif -#ifdef STS_M1 +#ifdef STS_M7 CFG_SEQ_Task_YunhornSTSEventP8, /* ETR, PULSE COUNT */ #endif #ifdef MODBUS_RS485 diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c index 7f58d4d..6b70c38 100644 --- a/Core/Src/gpio.c +++ b/Core/Src/gpio.c @@ -113,6 +113,29 @@ void MX_GPIO_Init(void) HAL_NVIC_EnableIRQ(TOF_C_INT_EXTI_IRQn); #endif + +/* ============== SOAP LEVEL DETECTION ========================= */ + +#if defined(STS_R4) + + HAL_GPIO_WritePin(SOAP_SWITCH_GPIO_Port, SOAP_SWITCH_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pins : PAPin PAPin */ + GPIO_InitStruct.Pin = SOAP_STATUS_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(SOAP_STATUS_GPIO_Port, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = SOAP_SWITCH_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_PULLDOWN; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(SOAP_SWITCH_GPIO_Port, &GPIO_InitStruct); + +#endif +/* ============== SOAP LEVEL DETECTION ========================= */ + /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); diff --git a/Core/Src/stm32_lpm_if.c b/Core/Src/stm32_lpm_if.c index 0e6a462..5523477 100644 --- a/Core/Src/stm32_lpm_if.c +++ b/Core/Src/stm32_lpm_if.c @@ -24,6 +24,7 @@ #include "stm32_lpm_if.h" #include "usart_if.h" #include "i2c.h" +#include "gpio.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ @@ -120,6 +121,7 @@ void PWR_ExitStopMode(void) SRAM ctrls, DMAx, DMAMux, AES, RNG, HSEM */ /* Resume not retained USARTx and DMA */ + MX_GPIO_Init(); MX_I2C2_Init(); MX_DMA_Init(); vcom_Resume(); diff --git a/Core/Src/stm32wlxx_it.c b/Core/Src/stm32wlxx_it.c index d10854e..64715f8 100644 --- a/Core/Src/stm32wlxx_it.c +++ b/Core/Src/stm32wlxx_it.c @@ -60,10 +60,10 @@ extern SUBGHZ_HandleTypeDef hsubghz; extern DMA_HandleTypeDef hdma_usart2_tx; extern UART_HandleTypeDef huart2; /* USER CODE BEGIN EV */ -#if defined(VL53LX)||defined(VL53L0) +//#if defined(VL53LX)||defined(VL53L0) extern DMA_HandleTypeDef hdma_i2c2_rx; extern DMA_HandleTypeDef hdma_i2c2_tx; -#endif +//#endif /* USER CODE END EV */ /******************************************************************************/ @@ -250,7 +250,7 @@ void EXTI3_IRQHandler(void) /* USER CODE BEGIN EXTI3_IRQn 0 */ /* USER CODE END EXTI3_IRQn 0 */ -#ifdef STM32WLE5xx +#if defined(VL53LX)||defined(VL53L0) HAL_GPIO_EXTI_IRQHandler(TOF_INT_EXTI_PIN); #endif /* USER CODE BEGIN EXTI3_IRQn 1 */ @@ -314,7 +314,7 @@ void EXTI9_5_IRQHandler(void) /* USER CODE END EXTI9_5_IRQn 0 */ #ifndef RM2 HAL_GPIO_EXTI_IRQHandler(BUT3_Pin); -#elif defined(RM2) +#elif defined(RM2)&&(defined(VL53L0)||defined(VL53LX)) HAL_GPIO_EXTI_IRQHandler(TOF_INT_EXTI_PIN); #endif diff --git a/LoRaWAN/App/lora_app.c b/LoRaWAN/App/lora_app.c index 96d0ddd..4c96e8b 100644 --- a/LoRaWAN/App/lora_app.c +++ b/LoRaWAN/App/lora_app.c @@ -418,8 +418,9 @@ void LoRaWAN_Init(void) /* USER CODE BEGIN LoRaWAN_Init_LV */ uint32_t feature_version = 0UL; /* USER CODE END LoRaWAN_Init_LV */ - APP_LOG(TS_OFF, VLEVEL_M, "\n\n# YUNHORN SMARTOILETS: (%s) MTM:%d.%d HWFW:%d.%d V:%d.%d.%d #\n\n", - (char*)YUNHORN_STS_PRD_STRING, (uint8_t)sts_mtmcode1, (uint8_t)sts_mtmcode2,(uint8_t)sts_hardware_ver,(uint8_t)FirmwareVersion, + + APP_LOG(TS_OFF, VLEVEL_M, "\n\n# YUNHORN SMARTOILETS: (%s) MTM:%d.%d HWFW:%d.%d V:%d.%d.%d #\n\n",(char*)YUNHORN_STS_PRD_STRING, + (uint8_t)sts_mtmcode1, (uint8_t)sts_mtmcode2,(uint8_t)sts_hardware_ver,(uint8_t)FirmwareVersion, (uint8_t)MajorVer,(uint8_t)MinorVer,(uint8_t)SubMinorVer); /* USER CODE BEGIN LoRaWAN_Init_1 */ @@ -510,12 +511,23 @@ void LoRaWAN_Init(void) UTIL_SEQ_RegTask((1 << CFG_SEQ_Task_YunhornSTSEventRFAC), UTIL_SEQ_RFU, STS_YunhornSTSEventRFAC_Process); +#ifdef STS_M1 + + UTIL_SEQ_RegTask((1 << CFG_SEQ_Task_YunhornSTSEventP1), UTIL_SEQ_RFU, STS_YunhornSTSEventP1_Process); + +#endif + + #ifdef STS_P2 UTIL_SEQ_RegTask((1 << CFG_SEQ_Task_YunhornSTSEventP5), UTIL_SEQ_RFU, STS_YunhornSTSEventP5_Process); #endif +#ifdef STS_R4 + UTIL_SEQ_RegTask((1 << CFG_SEQ_Task_YunhornSTSEventP6), UTIL_SEQ_RFU, STS_YunhornSTSEventP6_Process); +#endif + #ifdef VL53L0 UTIL_SEQ_RegTask((1 << CFG_SEQ_Task_YunhornSTSEventP4), UTIL_SEQ_RFU, STS_YunhornSTSEventP4_Process); #endif @@ -523,6 +535,7 @@ void LoRaWAN_Init(void) UTIL_TIMER_Create(&YunhornSTSWakeUpScanTimer, STS_TOFScanPeriod_msec, UTIL_TIMER_PERIODIC, (void*)OnYunhornSTSWakeUpScanTimerEvent, NULL); UTIL_TIMER_Start(&YunhornSTSWakeUpScanTimer); #endif + //UTIL_TIMER_Create(&YunhornSTSHeartBeatTimer, 1000*STS_HeartBeatTimerPeriod_sec, UTIL_TIMER_PERIODIC, OnYunhornSTSHeartBeatTimerEvent, NULL); UTIL_TIMER_Create(&YunhornSTSHeartBeatTimer, 1000*STS_HeartBeatTimerPeriod_sec, UTIL_TIMER_ONESHOT, OnYunhornSTSHeartBeatTimerEvent, NULL); UTIL_TIMER_Start(&YunhornSTSHeartBeatTimer); @@ -543,16 +556,19 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); } break; +#ifndef STS_R4 case BUT2_Pin: UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaStopJoinEvent), CFG_SEQ_Prio_0); break; +#endif case BUT3_Pin: UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaStoreContextEvent), CFG_SEQ_Prio_0); break; +#if (defined(VL53L0)||defined(VL53LX)) case TOF_INT_EXTI_PIN: ToF_EventDetected = 1; break; - +#endif default: break; } @@ -738,6 +754,10 @@ static void SendTxData(void) sts_people_count_sensor_data_t sts_p2_sensor_data={0x0}; #elif defined(STS_R1)||defined(STS_R1D)||defined(STS_R2)||defined(STS_R5) sts_tof_range_data_t sts_rr_sensor_data={0x0,0x0,0x0}; +#elif defined(STS_R4) + sts_r_sensor_data_t sts_r4_sensor_data={0}; +#elif defined(STS_M1) + sts_r_sensor_data_t sts_m1_sensor_data={0}; #endif if (LmHandlerIsBusy() == false) @@ -758,6 +778,19 @@ static void SendTxData(void) EnvSensors_Read(&sensor_data); +#ifdef STS_R4 + //UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP6), CFG_SEQ_Prio_0); + //STS_YunhornSTSEventP6_Process(); + STS_R4_sensor_read(&sts_r4_sensor_data); +#endif + +#ifdef STS_M1 + + STS_M1_sensor_read(&sts_m1_sensor_data); +#endif + + + #ifdef VL53LX STS_people_count_sensor_Read(&sts_p2_sensor_data); #endif @@ -773,11 +806,18 @@ static void SendTxData(void) AppData.Port = YUNHORN_STS_R2_LORA_APP_DATA_PORT; /* STS-R2 Data Port */ #elif defined(STS_R5) AppData.Port = YUNHORN_STS_R5_LORA_APP_DATA_PORT; /* STS-R5 Data Port */ -#endif +#endif //STS_R1 #endif //VL53L0 - AppData.Buffer[i++] = AppLedStateOn; +#ifdef STS_R4 //SOAP/SANITIZER LEVEL + AppData.Port = YUNHORN_STS_R4_LORA_APP_DATA_PORT; /* STS-R4 Data Port */ +#endif +#ifdef STS_M1 // WATER LEAKAGE SENSOR + AppData.Port = YUNHORN_STS_M1_LORA_APP_DATA_PORT; /* STS-M1 Data Port */ +#endif + + AppData.Buffer[i++] = (uint8_t) (AppLedStateOn|0x80); // for first byte, cannot be 0x0 AppData.Buffer[i++] = (uint8_t) sts_mtmcode1; AppData.Buffer[i++] = (uint8_t) sts_mtmcode2; AppData.Buffer[i++] = (uint8_t) sts_hardware_ver; @@ -899,10 +939,23 @@ static void SendTxData(void) #endif // VL53L1X #endif //STS_P2 + +/* STS-R4 SOAP LEVEL SENSOR */ +#ifdef STS_R4 + AppData.Buffer[i++] = 2; + AppData.Buffer[i++] = (uint8_t)(sts_r4_sensor_data.measure_tech & 0xFF); + AppData.Buffer[i++] = (uint8_t)(sts_r4_sensor_data.on_off_event & 0xFF); +#endif //STS_R4 + +/* STS-M1 WATER LEAKAGE SENSOR */ +#ifdef STS_M1 + AppData.Buffer[i++] = 2; + AppData.Buffer[i++] = (uint8_t)(sts_m1_sensor_data.measure_tech & 0xFF); + AppData.Buffer[i++] = (uint8_t)(sts_m1_sensor_data.on_off_event & 0xFF); +#endif //STS_M1 + AppData.BufferSize = i; - - if ((JoinLedTimer.IsRunning) && (LmHandlerJoinStatus() == LORAMAC_HANDLER_SET)) { UTIL_TIMER_Stop(&JoinLedTimer); @@ -939,6 +992,13 @@ static void OnTxTimerEvent(void *context) /* USER CODE BEGIN OnTxTimerEvent_1 */ /* USER CODE END OnTxTimerEvent_1 */ + +#ifdef STS_R4 + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP6), CFG_SEQ_Prio_0); +#elif defined(STS_M1) + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP1), CFG_SEQ_Prio_0); +#endif + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); /*Wait for next tx slot*/ @@ -1320,7 +1380,7 @@ static void OnYunhornSTSHeartBeatTimerEvent(void *context) // UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventRFAC), CFG_SEQ_Prio_0); UTIL_TIMER_Stop(&YunhornSTSHeartBeatTimer); - uint8_t appHeartBeatDataPort, appHeartBeatBufferSize, appHeartBeatDataBuffer[32]; + uint8_t appHeartBeatDataPort=2, appHeartBeatBufferSize=2, appHeartBeatDataBuffer[32]={0x0}; if ((rfac_timer <(STS_BURN_IN_RFAC+3))&&(sts_cfg_nvm.ac[0]==0x0)&&(sts_cfg_nvm.ac[19]==0x0)) { @@ -1346,12 +1406,14 @@ static void OnYunhornSTSHeartBeatTimerEvent(void *context) appHeartBeatDataPort = YUNHORN_STS_R1D_LORA_APP_HTBT_PORT; #elif defined(STS_R5) appHeartBeatDataPort = YUNHORN_STS_R5_LORA_APP_HTBT_PORT; +#elif defined(STS_R4) + appHeartBeatDataPort = YUNHORN_STS_R4_LORA_APP_HTBT_PORT; #endif appHeartBeatBufferSize = 2; appHeartBeatDataBuffer[0]=(uint8_t)(0x80|AppLedStateOn); appHeartBeatDataBuffer[1]=(uint8_t)(SYS_GetBatteryLevel()/100); //TODO XXX change to battery level in mV - + //APP_LOG(TS_OFF, VLEVEL_M, "\n\n HEART-BEAT TIMER = %d\n\n", rfac_timer); STS_SENSOR_Upload_Message(appHeartBeatDataPort, appHeartBeatBufferSize, (uint8_t*)appHeartBeatDataBuffer); #endif @@ -1385,7 +1447,7 @@ void OnYunhornSTSHeartBeatPeriodicityChanged(uint32_t periodicity) UTIL_TIMER_Start(&YunhornSTSHeartBeatTimer); /* USER CODE BEGIN OnYunhornSTSHeartBeatPeriodicityChanged_2 */ - APP_LOG(TS_OFF, VLEVEL_H,"**************** HeartBeatPeriodicity = %u (sec)\r\n", periodicity/1000 ); + APP_LOG(TS_OFF, VLEVEL_M,"* STS HeartBeatPeriodicity = %u (sec)\r\n", periodicity/1000 ); /* USER CODE END OnYunhornSTSHeartBeatPeriodicityChanged_2 */ } @@ -1400,3 +1462,24 @@ static void OnYunhornSTSWakeUpScanTimerEvent(void *context) } +/** + * @brief Yunhorn STS Tx Periodicity Change function + * @param duration of periodicty in ms (1/1000 sec) + */ +void OnYunhornSTSTxPeriodicityChanged(uint32_t periodicity) +{ + /* USER CODE BEGIN OnYunhornSTSTxPeriodicityChanged */ + + /* USER CODE END OnYunhornSTSTxPeriodicityChanged */ + + /* Update timer OnYunhornSTSTxPeriodicityChanged */ + + UTIL_TIMER_Stop(&TxTimer); + TxPeriodicity = periodicity; + UTIL_TIMER_SetPeriod(&TxTimer, TxPeriodicity); + UTIL_TIMER_Start(&TxTimer); + + /* USER CODE BEGIN OnYunhornSTSTxPeriodicityChanged */ + APP_LOG(TS_OFF, VLEVEL_M,"* STS TxPeriodicity = %u (sec)\r\n", TxPeriodicity/1000 ); + /* USER CODE END OnYunhornSTSTxPeriodicityChanged */ +} diff --git a/README.md b/README.md index e24d51a..049426a 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,4 @@ 2024 09 20 START RR 2024 09 25 START R1D + 2024 09 27 GOOD STS-R4 on single board RM2_1 diff --git a/STM32CubeIDE/.cproject b/STM32CubeIDE/.cproject index f826144..dc1d683 100644 --- a/STM32CubeIDE/.cproject +++ b/STM32CubeIDE/.cproject @@ -133,10 +133,7 @@