diff --git a/Core/Inc/ev1527.h b/Core/Inc/ev1527.h
index 96088f2..8f75438 100644
--- a/Core/Inc/ev1527.h
+++ b/Core/Inc/ev1527.h
@@ -35,6 +35,16 @@
/*******************************/
+#define BUTTON_NONE 0
+#define BUTTON_ON 1
+#define BUTTON_OFF 2
+#define BUTTON_FIRST 3
+#define BUTTON_NEXT 4
+#define BUTTON_5S 5
+#define BUTTON_10S 6
+#define BUTTON_15S 7
+#define BUTTON_30S 8
+
void EV1527_Init(void);
void RF_Signal_Decode(void);
// void Delay_us(uint32_t cnt);
@@ -45,7 +55,7 @@ void STS_RF_write_send_leading(void);
void STS_RF_write_send_ending(void);
void STS_RF_Send_Multi_Times(uint8_t *rf_payload, uint8_t rf_length, uint8_t mt);
-void STS_RF_Send_Button_Multi_Times(uint8_t *rf_payload, uint8_t one_button, uint8_t rf_length, uint8_t mt);
+void STS_RF_Send_Button_Multi_Times(uint8_t *rf_payload, uint8_t button_name);
void STS_RF_Send_AddressBit_and_CmdBit(uint8_t *rf_payload, uint8_t rf_length);
void EV1527Reset(void);
diff --git a/Core/Inc/utilities_def.h b/Core/Inc/utilities_def.h
index 7d04432..de666be 100644
--- a/Core/Inc/utilities_def.h
+++ b/Core/Inc/utilities_def.h
@@ -80,6 +80,7 @@ typedef enum
CFG_SEQ_Task_LoRaStoreContextEvent,
CFG_SEQ_Task_LoRaStopJoinEvent,
/* USER CODE BEGIN CFG_SEQ_Task_Id_t */
+ CFG_SEQ_Task_STS_RemoteControlButtonEvent,
/* USER CODE END CFG_SEQ_Task_Id_t */
CFG_SEQ_Task_NBR
diff --git a/Core/Src/ev1527.c b/Core/Src/ev1527.c
index 75d7326..a7ac863 100644
--- a/Core/Src/ev1527.c
+++ b/Core/Src/ev1527.c
@@ -1,5 +1,22 @@
#include "ev1527.h"
+
+/*
+// RF433 REMOTE CONTROL
+enum rc_projector_button_name_enum1
+{ BUTTON_NONE,
+ BUTTON_ON,
+ BUTTON_OFF,
+ BUTTON_FIRST,
+ BUTTON_NEXT,
+ BUTTON_5S,
+ BUTTON_10S,
+ BUTTON_15S,
+ BUTTON_30S
+};
+*/
+uint8_t rf_button_2_cmd4bits[16]={0x00,0x08,0x0C,0x04,0x06,0x01,0x09,0x02,0x03,0x0,0x0,0x0,0x0,0x0,0x0,0x0}; // button-1/on: 0x08, button-2/off: 0x0c, button-3/first:0x04, button-4/next: 0x06
+
// 定时周期
//#define TIME_CYCLE 80
#define TIME_CYCLE PERIOD_VALUE
@@ -288,6 +305,29 @@ void STS_RF_write_send_ending(void)
HAL_Delay_Us(ENDING_LOW_US);
}
+#define STS_RF_CMD_SEND_COUNT 8
+void STS_RF_Send_Button_Multi_Times(uint8_t *rf_payload, uint8_t button_name)
+{
+ // normally, send 5-8 cycles of same address and cmd code
+ uint8_t rf_length = 2;
+ //rf_payload[2] |= ((one_button));
+
+ rf_payload[2] |= rf_button_2_cmd4bits[button_name];
+
+ for (uint8_t i=0; i< STS_RF_CMD_SEND_COUNT; i++)
+ {
+
+ printf("%d : Address=%02X:%02X:%01x CMD=%01X\r\n",i,
+ rf_payload[0], rf_payload[1], (rf_payload[2]&0xF0)>>4, rf_payload[2]&0x0f);
+
+ STS_RF_Send_AddressBit_and_CmdBit(rf_payload, rf_length);
+ }
+
+ rf_payload[2] &= 0xF0; // cmd area reset to 0
+
+}
+
+#if 0
void STS_RF_Send_Button_Multi_Times(uint8_t *rf_payload, uint8_t one_button, uint8_t rf_length, uint8_t mt)
{
// normally, send 5-8 cycles of same address and cmd code
@@ -319,7 +359,7 @@ void STS_RF_Send_Multi_Times(uint8_t *rf_payload, uint8_t rf_length, uint8_t mt)
}
}
-
+#endif
void STS_RF_Send_AddressBit_and_CmdBit(uint8_t *rf_payload, uint8_t rf_length)
{
// send the combined address code and cmd code
@@ -331,7 +371,7 @@ void STS_RF_Send_AddressBit_and_CmdBit(uint8_t *rf_payload, uint8_t rf_length)
// printf("address bits and cmd bits ...\r\n");
// send address and cmd code
- for (uint8_t i=0; i < rf_length; i++)
+ for (uint8_t i=0; i < 3; i++)
{
for (uint8_t j=0; j < 8; j++)
{
diff --git a/Core/Src/main.c b/Core/Src/main.c
index 52e99c7..b058179 100644
--- a/Core/Src/main.c
+++ b/Core/Src/main.c
@@ -34,8 +34,11 @@
/* USER CODE BEGIN PTD */
TIM_HandleTypeDef htim1, htim2;
//uint8_t rf_payload[3]={0xF8,0xCD,0x07}, rf_length=3;
-uint8_t rf_payload[3]={0x1F,0xB3,0xE0}, rf_length=3; // RF433_RC_PROJECTOR
-uint8_t sos_rf_payload[3]={0x82,0x73,0xA0}, sos_rf_length=3; // RF433_SOS_Button
+
+#define RF_PAYLOAD_LEN 3U
+
+uint8_t rf_payload[RF_PAYLOAD_LEN]={0x1F,0xB3,0xE0}; // RF433_RC_PROJECTOR
+uint8_t sos_rf_payload[RF_PAYLOAD_LEN]={0x82,0x73,0xA0}, sos_rf_length=3; // RF433_SOS_Button
enum rc_function_enum
{
RC_FUN_NONE,
@@ -52,9 +55,9 @@ enum rc_tx_rx_type_enum
RC_TXRX_TYPE_2_4G,
RC_TXRX_TYPE_BLE
};
-
+/*
// RF433 REMOTE CONTROL
-enum rc_projector_cmd_enum
+enum rc_projector_button_name_enum1
{ BUTTON_NONE,
BUTTON_ON,
BUTTON_OFF,
@@ -65,23 +68,57 @@ enum rc_projector_cmd_enum
BUTTON_15S,
BUTTON_30S
};
+*/
+enum rc_projector_button_name_enum2
+{ BUTTON_NO,
+ BUTTON_1,
+ BUTTON_2,
+ BUTTON_3,
+ BUTTON_4,
+ BUTTON_5,
+ BUTTON_6,
+ BUTTON_7,
+ BUTTON_8
+};
+
enum rc_sos_button_cmd_enum
{ BUTTON_NO_SOS=0,
BUTTON_SOS,
};
// IRDA REMOTE CONTROL GREE
-enum IRDa_rc_fan_button_cmd_enum
+enum IRDa_rc_fan_button_name_enum
{ IR_BUTTON_NONE=0,
IR_BUTTON_OFF, // SWITCH OFF
IR_BUTTON_ON, // SWITCH ON
IR_BUTTON_SWING, // SWING HEAD
IR_BUTTON_SPEED, // SPEED ROTATE +, 1, 2, 3
IR_BUTTON_TIMER, // TIMER TO STOP, 10,20,40,MIN
- IR_BUTTON_BLOW_MODE // BLOW MODE, LOW,MIDDLE,HIGH
+ IR_BUTTON_BLOW_MODE // BLOW MODE, LOW,MIDDLE,HIGH
};
-uint8_t rf_cmd[16]={0x00, 0x8,0xC,0x4,0x6,0x1,0x9,0x2,0x3}; // cmd 1 = 1, cmd2=4, cmd3=3, cmd4=2
-uint8_t sos_rf_cmd[16]={0x00, 0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0}; // cmd 1 = 1
+//uint8_t rf_button_2_cmd4bits[16]={0x00,0x08,0x0C,0x04,0x06,0x01,0x09,0x02,0x03,0x0,0x0,0x0,0x0,0x0,0x0,0x0}; // button-1/on: 0x08, button-2/off: 0x0c, button-3/first:0x04, button-4/next: 0x06
+extern uint8_t *rf_button_2_cmd4bits;
+/* keypad --- number mapping table
+ * Ground Projector
+ * |-------------------|
+ * | ON OFF | 1 4
+ * | FIRST NEXT | 3 2
+ * | 5S 10S | 3 2
+ * | 15S 30S | 3 2
+ * |-------------------|
+ *
+ *
+ * |---------------|
+ * | 1 2 |
+ * | 3 4 |
+ * | 5 6 |
+ * | 7 8 |
+ * |---------------|
+ */
+
+
+
+uint8_t sos_rf_button_2_cmd4bits[16]={0x00, 0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0}; // cmd 1 = 1
void sts_rc_key(uint8_t key);
void sts_rc_decoder(void);
uint8_t sts_rc_decodedx(void);
@@ -104,7 +141,7 @@ rc_type_cmd_typedef rc_type_cmd[6]={
{1,2,3,4,5,0,0,0} // type 3, iRDa, GREE fan
};
-
+/*
uint8_t rc_cmd[9]={
BUTTON_NONE,
BUTTON_ON,
@@ -116,6 +153,7 @@ uint8_t rc_cmd[9]={
BUTTON_15S,
BUTTON_30S
};
+*/
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
@@ -228,12 +266,13 @@ void STS_ON_BUTTON(uint8_t cmd1, uint8_t cmd2)
case RC_TXRX_TYPE_RF433:
if (rc_function == RC_FUN_PROJECTOR)
{
- single_button = rf_cmd[cmd1],
- STS_RF_Send_Button_Multi_Times(rf_payload, single_button, 3, 8);
+ //single_button = rf_cmd[cmd1],
+ rf_payload[2] |= (rf_button_2_cmd4bits[cmd1]);
+ STS_RF_Send_Button_Multi_Times(rf_payload, 3);
}else if (rc_function == RC_FUN_SOS)
{
- single_button = sos_rf_cmd[cmd1],
- STS_RF_Send_Button_Multi_Times(rf_payload, single_button, 3, 8);
+ single_button = sos_rf_button_2_cmd4bits[cmd1],
+ STS_RF_Send_Button_Multi_Times(rf_payload, 3);
}
break;
case RC_TXRX_TYPE_IRDA:
@@ -280,8 +319,9 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
printf("Button 1 pressed, sending cmd #1 \r\n");
//STS_RF_Send_AddressBit_and_CmdBit(rf_payload, rf_length);
// STS_RF_Send_Multi_Times(rf_payload, 3, 8);
- single_button = rf_cmd[BUTTON_ON];
- STS_RF_Send_Button_Multi_Times(rf_payload, single_button, 3, 8);
+ rf_payload[2] |= rf_button_2_cmd4bits[BUTTON_ON];
+ //single_button = rf_cmd[BUTTON_ON];
+ STS_RF_Send_Button_Multi_Times(rf_payload, 3);
#endif
// for SOS BUTTON
@@ -296,16 +336,18 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
case BUT2_Pin:
printf("Button 2 pressed, sending cmd #2 \r\n");
- single_button = rf_cmd[BUTTON_OFF];
+ //single_button = rf_cmd[BUTTON_OFF];
+ rf_payload[2] |= rf_button_2_cmd4bits[BUTTON_OFF];
// STS_RF_Send_Multi_Times(rf_payload, 3, 5);
- STS_RF_Send_Button_Multi_Times(rf_payload, single_button, 3, 8);
+ STS_RF_Send_Button_Multi_Times(rf_payload, 3);
break;
case BUT3_Pin:
printf("Button 3 pressed, sending cmd #3 \r\n");
- single_button = rf_cmd[BUTTON_NEXT];
+ //single_button = rf_cmd[BUTTON_NEXT];
+ rf_payload[2] |= rf_button_2_cmd4bits[BUTTON_OFF];
// STS_RF_Send_Multi_Times(rf_payload, 3, 5);
- STS_RF_Send_Button_Multi_Times(rf_payload, single_button, 3, 8);
+ STS_RF_Send_Button_Multi_Times(rf_payload, 3);
break;
diff --git a/LoRaWAN/App/lora_app.c b/LoRaWAN/App/lora_app.c
index fa0fb6b..64bd339 100644
--- a/LoRaWAN/App/lora_app.c
+++ b/LoRaWAN/App/lora_app.c
@@ -34,7 +34,16 @@
#include "CayenneLpp.h"
#include "sys_sensors.h"
#include "flash_if.h"
+#ifdef CLOCK_SYNC
+#include "LmhpClockSync.h"
+#endif
+#ifdef RC
+#include "ev1527.h"
+volatile uint8_t sts_rf_cloud_cmd=0;
+volatile uint8_t sts_prev_rf_cmd_pic, sts_rf_cmd_pic, prev_sts_rf_cmd_status;
+int sts_wet_humidity_threshold=50;
+#endif
/* USER CODE BEGIN Includes */
#ifdef STS_WS
#include "sts_weight_scale.h"
@@ -99,6 +108,9 @@ static const char *slotStrings[] = { "1", "2", "C", "C_MC", "P", "P_MC" };
/* USER CODE END PM */
/* Private function prototypes -----------------------------------------------*/
+
+static void SendRemoteControlData(void);
+
/**
* @brief LoRa End Node send request
*/
@@ -230,6 +242,9 @@ static void OnTxTimerLedEvent(void *context);
*/
static void OnRxTimerLedEvent(void *context);
+
+static void OnSelfMeasureEnvironmentEvent(void *context);
+
/**
* @brief LED Join timer callback function
* @param context ptr of LED context
@@ -335,16 +350,24 @@ static UTIL_TIMER_Object_t TxLedTimer;
*/
static UTIL_TIMER_Object_t RxLedTimer;
+
+static UTIL_TIMER_Object_t MeaureEnvionmentTimer;
+
/**
* @brief Timer to handle the application Join Led to toggle
*/
static UTIL_TIMER_Object_t JoinLedTimer;
/* USER CODE END PV */
-
+static volatile bool IsClockSynched = false;
/* Exported functions ---------------------------------------------------------*/
/* USER CODE BEGIN EF */
+uint32_t STS_MeasureEnvironmentTime_sec=120; // in seconds
+volatile uint8_t sts_rf_cmd_status = 0;
+volatile uint8_t sts_rf_cmd_value = 0;
+//volatile uint8_t sts_rc_node_cmd = 0;
+volatile bool sts_rf_projector_power_on = false;
/* USER CODE END EF */
void LoRaWAN_Init(void)
@@ -392,6 +415,8 @@ void LoRaWAN_Init(void)
UTIL_TIMER_Create(&RxLedTimer, LED_PERIOD_TIME, UTIL_TIMER_ONESHOT, OnRxTimerLedEvent, NULL);
UTIL_TIMER_Create(&JoinLedTimer, LED_PERIOD_TIME, UTIL_TIMER_PERIODIC, OnJoinTimerLedEvent, NULL);
+ UTIL_TIMER_Create(&MeaureEnvionmentTimer, 1000*STS_MeasureEnvironmentTime_sec, UTIL_TIMER_PERIODIC, OnSelfMeasureEnvironmentEvent, NULL);
+
if (FLASH_IF_Init(NULL) != FLASH_IF_OK)
{
Error_Handler();
@@ -407,6 +432,14 @@ void LoRaWAN_Init(void)
UTIL_SEQ_RegTask((1 << CFG_SEQ_Task_LoRaStoreContextEvent), UTIL_SEQ_RFU, StoreContext);
UTIL_SEQ_RegTask((1 << CFG_SEQ_Task_LoRaStopJoinEvent), UTIL_SEQ_RFU, StopJoin);
+ UTIL_SEQ_RegTask((1 << CFG_SEQ_Task_STS_RemoteControlButtonEvent), UTIL_SEQ_RFU, SendRemoteControlData);
+
+ // TODO XXX 2024-06-04
+#ifdef CLOCK_SYNC
+ LmHandlerPackageRegister( PACKAGE_ID_CLOCK_SYNC, NULL );
+ IsClockSynched = false;
+#endif
+
/* Init Info table used by LmHandler*/
LoraInfo_Init();
@@ -436,7 +469,7 @@ void LoRaWAN_Init(void)
}
/* USER CODE BEGIN LoRaWAN_Init_Last */
-
+ UTIL_TIMER_Start(&MeaureEnvionmentTimer);
/* USER CODE END LoRaWAN_Init_Last */
}
@@ -550,6 +583,139 @@ static void OnRxData(LmHandlerAppData_t *appData, LmHandlerRxParams_t *params)
}
/* USER CODE END OnRxData_1 */
}
+#define STS_RF_CMD_NONE 0
+#define STS_NODESELF_CMD_PENDING_SEND 1
+#define STS_CLOUD_CMD_PENDING_SEND 2
+#define STS_RF_CMD_SENT_OUT 3
+
+#define RF_PROECTOR_POWER_OFF 1
+#define RF_PROECTOR_POWER_ON 2
+
+
+typedef struct service_period_per_day {
+ uint8_t enable; // enable this time slot or not
+ uint8_t start_hour; // start hour 00--23 in 24hour
+ uint8_t start_minute; // start minute 00--59
+ uint8_t end_hour; // end hour 00-23 in 24 hour
+ uint8_t end_minute; // end minute 00--60
+} t_service_period_per_day;
+
+t_service_period_per_day rc_service_period[4]={
+ {1,6,30,12,00},
+ {1,13,00, 18,00},
+ {0,0,0,0,0},
+ {0,0,0,0,0}
+};
+static bool sts_rc_in_service_period=true;
+
+static void STS_Check_Service_Period(void)
+{
+ struct tm time_now={0};
+ SysTime_t UnixEpoch = SysTimeGet();
+ UnixEpoch.Seconds -= 18; /*removing leap seconds*/
+ SysTimeLocalTime(UnixEpoch.Seconds, &time_now);
+
+ bool sts_rc_in_service_period_try = false;
+
+ for (uint8_t i=0; i<4; i++)
+ {
+ if (rc_service_period[i].enable)
+ {
+ if ((time_now.tm_hour >= rc_service_period[i].start_hour) && (time_now.tm_hour < rc_service_period[i].end_hour))
+ {
+ sts_rc_in_service_period_try = true;
+ }
+ }
+ }
+
+ sts_rc_in_service_period = sts_rc_in_service_period_try;
+}
+
+extern uint8_t rf_payload[3];
+/*
+ * measure humidity --> over threshold --> caution wet floor + power on()
+ * measure humidity --> not over threshold --> welcome pic or power off
+ * button- switch 1:power off ---> power off
+ * button- switch 2/1: local control ? via internal sensor
+ * button- switch 2/2: cloud control ?
+ * key_name --> 1/2/3/4/5/6/7/8 or ON/OFF/FIRST/NEXT/5S/10S/15S/30S
+ * cmd_value---> key2cmd[key_name] 0x01,0x08,0x0c,0x
+ *
+ */
+static void SendRemoteControlData(void)
+{
+ /* sts_rf_cmd_status: global cmd process status */
+ /* */
+
+
+ switch (sts_rf_cmd_status) {
+
+ case STS_NODESELF_CMD_PENDING_SEND:
+ if (sts_rf_projector_power_on == true)
+ //rf_payload[2] |= rf_button_2_cmd4bits[sts_rc_cmd_value];
+ STS_RF_Send_Button_Multi_Times(rf_payload, sts_rf_cmd_value);
+ sts_rf_cmd_status = STS_RF_CMD_SENT_OUT;
+
+ break;
+
+ case STS_CLOUD_CMD_PENDING_SEND: // CLOUD DOWNLINK INSTRUCTION
+ if (sts_rf_cloud_cmd == BUTTON_OFF) // if ask to power off
+ {
+ sts_rf_cmd_value = BUTTON_OFF;
+ //rf_payload[2] |= rf_button_2_cmd4bits[sts_rc_cmd_value]; //rf_cmd[BUTTON_ON];//sts_rf_cloud_cmd;
+ sts_rf_projector_power_on = false;
+
+ } else { // else other show pic cmd
+ if (sts_rf_projector_power_on == false) // if it's still powered off yet, power it on
+ {
+ sts_rf_cmd_value = BUTTON_ON;
+ //rf_payload[2] |= rf_button_2_cmd4bits[sts_rc_cmd_value];
+ STS_RF_Send_Button_Multi_Times(rf_payload, sts_rf_cloud_cmd);
+ sts_rf_projector_power_on = true;
+ HAL_Delay(2000); // need to test 2 sec good enough or not... maybe 30 seconds...
+ } // delay 2 sec, then send cloud cmd...
+ //rf_payload[2] |= rf_button_2_cmd4bits[sts_rc_cloud_cmd];
+ STS_RF_Send_Button_Multi_Times(rf_payload, sts_rf_cloud_cmd);
+ }
+
+ sts_rf_cmd_status = STS_RF_CMD_SENT_OUT;
+
+ break;
+
+ case STS_RF_CMD_SENT_OUT:
+ // Do nothing
+ break;
+ case STS_RF_CMD_NONE:
+ // No cmd to send out
+ break;
+ case 4:
+ break;
+ case 5:
+ break;
+ case 6:
+ break;
+ case 7:
+ break;
+ case 8:
+ break;
+ case 9:
+ break;
+ case 10:
+ break;
+ case 11:
+ break;
+ case 12:
+ break;
+ case 13:
+ break;
+ case 14:
+ break;
+ case 15:
+ break;
+
+ }
+
+}
static void SendTxData(void)
{
@@ -643,6 +809,17 @@ static void SendTxData(void)
AppData.BufferSize = i;
#endif /* CAYENNE_LPP */
+#ifdef CLOCK_SYNC
+ if( IsClockSynched == false )
+ {
+ status = LmhpClockSyncAppTimeReq( );
+
+ if (LORAMAC_HANDLER_SUCCESS == status) {
+ OnSysTimeUpdate();
+ }
+ }
+#endif
+
if ((JoinLedTimer.IsRunning) && (LmHandlerJoinStatus() == LORAMAC_HANDLER_SET))
{
UTIL_TIMER_Stop(&JoinLedTimer);
@@ -699,6 +876,95 @@ static void OnRxTimerLedEvent(void *context)
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET); /* LED_BLUE */
}
+#define STS_RF_PROJECTOR_PENDING_SEND 1U
+#define STS_RF_PROJECTOR_POWER_OFF 2
+
+#define STS_RF_SHOW_PIC_DARK 0
+#define STS_RF_SHOW_PIC_WET_FLOOR 4U
+#define STS_RF_SHOW_PIC_WELCOME 5
+#define STS_RF_PROJECTOR_KEEP_STATE 0
+
+void static sts_rc_cmd_rf(uint8_t pic_id)
+{
+
+ switch (pic_id) {
+
+ case 1:
+ break;
+ case 2:
+ break;
+ case 3:
+ break;
+ case 4:
+ break;
+ }
+
+ if (sts_prev_rf_cmd_pic != STS_RF_SHOW_PIC_WET_FLOOR)
+ {
+
+ sts_rf_cmd_status = STS_RF_PROJECTOR_PENDING_SEND;
+ sts_rf_cmd_pic = STS_RF_SHOW_PIC_WET_FLOOR;
+ } else
+ {
+ sts_rf_cmd_status = STS_RF_PROJECTOR_KEEP_STATE;
+
+ if (prev_sts_rf_cmd_status != STS_RF_PROJECTOR_POWER_OFF)
+ {
+ sts_rf_cmd_pic = STS_RF_SHOW_PIC_WELCOME; // or other messages, rotate other pictures
+ sts_rf_cmd_status = STS_RF_PROJECTOR_KEEP_STATE;
+ }
+
+ }
+
+ sts_prev_rf_cmd_pic = STS_RF_SHOW_PIC_WET_FLOOR;
+
+
+}
+
+static void OnSelfMeasureEnvironmentEvent(void *context)
+{
+ sensor_t sensor_data;
+
+ EnvSensors_Read(&sensor_data);
+
+ STS_Check_Service_Period();
+
+ if (sts_rc_in_service_period == true)
+ {
+ if ((sensor_data.humidity >= sts_wet_humidity_threshold) ) // wet floor condition
+ {
+ APP_LOG(TS_OFF, VLEVEL_M, "\r\n*** Humidity=%2d (%), over threshold %2d (%), start WET FLOOR PICTURE \r\n", sensor_data.humidity, sts_wet_humidity_threshold);
+
+ sts_rf_cmd_pic |= STS_RF_SHOW_PIC_WET_FLOOR;
+
+ sts_rc_cmd_rf(sts_rf_cmd_pic);
+
+ } else { // non wet floor situation, so just display welcome message or other messages, instead of wet floor
+
+ APP_LOG(TS_OFF, VLEVEL_M, "\r\n*** Humidity=%2d (%), less than threshold %2d (%), Power Off projector\r\n", sensor_data.humidity, sts_wet_humidity_threshold);
+
+ sts_rf_cmd_pic &= ~STS_RF_SHOW_PIC_WET_FLOOR;
+
+ sts_rc_cmd_rf(sts_rf_cmd_pic);
+
+ }
+
+ UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_STS_RemoteControlButtonEvent), CFG_SEQ_Prio_0);
+
+ } else { // not in service period, just power off projector in case it's still on
+
+ if (sts_rf_cmd_status != STS_RF_PROJECTOR_POWER_OFF) {
+ sts_rf_cmd_status = STS_RF_PROJECTOR_POWER_OFF;
+ sts_rf_cmd_pic = STS_RF_SHOW_PIC_DARK;
+ UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_STS_RemoteControlButtonEvent), CFG_SEQ_Prio_0);
+ } else {
+ // already power off, do nothing just return
+ return;
+ }
+ }
+
+}
+
static void OnJoinTimerLedEvent(void *context)
{
HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); /* LED_RED */
@@ -803,7 +1069,7 @@ static void OnBeaconStatusChange(LmHandlerBeaconParams_t *params)
static void OnSysTimeUpdate(void)
{
/* USER CODE BEGIN OnSysTimeUpdate_1 */
-
+ IsClockSynched = true;
/* USER CODE END OnSysTimeUpdate_1 */
}
diff --git a/STM32CubeIDE/.cproject b/STM32CubeIDE/.cproject
index 8948d9b..d30e9bc 100644
--- a/STM32CubeIDE/.cproject
+++ b/STM32CubeIDE/.cproject
@@ -89,7 +89,7 @@
-
+
@@ -130,6 +130,7 @@