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 @@