#include "WS_RTC.h" Timing_RTC CHx_State[Timing_events_Number_MAX]; // Set a maximum of Timing_events_Number_MAX timers char Event_str[Timing_events_Number_MAX][1000]; static Timing_RTC CHx_State_Default; // Event initial state const unsigned char Event_cycle[4][13] = {"Aperiodicity","everyday","Weekly","monthly"}; void RTC_Init(void){ PCF85063_Init(); xTaskCreatePinnedToCore( RTCTask, "RTCTask", 4096, NULL, 3, NULL, 0 ); } uint8_t Timing_events_Num = 0; void RTCTask(void *parameter) { static uint8_t Time_Old = 0; while(1){ if(Timing_events_Num){ for (int i = 0; i < Timing_events_Number_MAX; i++){ if(CHx_State[i].Enable_Flag){ if(CHx_State[i].Time.hour == datetime.hour && CHx_State[i].Time.minute == datetime.minute && CHx_State[i].Time.second == datetime.second && datetime.second != Time_Old){ // The event time is consistent with the current time switch(CHx_State[i].repetition_State){ case Repetition_NONE: if(CHx_State[i].Time.year == datetime.year && CHx_State[i].Time.month == datetime.month && CHx_State[i].Time.day == datetime.day){ // Executes at the defined date and time TimerEvent_handling(CHx_State[i]); TimerEvent_Del(CHx_State[i]); } break; case Repetition_everyday: TimerEvent_handling(CHx_State[i]); break; case Repetition_Weekly: if(CHx_State[i].Time.dotw == datetime.dotw){ TimerEvent_handling(CHx_State[i]); } break; case Repetition_monthly: if(CHx_State[i].Time.day == datetime.day){ TimerEvent_handling(CHx_State[i]); } break; default: printf("Event error!!!!\n"); break; } } } } } Time_Old = datetime.second; vTaskDelay(pdMS_TO_TICKS(100)); } vTaskDelete(NULL); } void TimerEvent_handling(Timing_RTC event){ uint8_t Retain_channels = 0; printf("Event %d : \r\n", event.Event_Number); char datetime_str[50]; datetime_to_str(datetime_str,event.Time); for (int i = 0; i < Relay_Number_MAX; i++) { if(*(&(event.Relay_CH1)+i) == STATE_Retain) // Find the modified channel Retain_channels ++; // Number of unmodified channels } if(Retain_channels < Relay_Number_MAX - 1){ printf("%s\r\n", datetime_str); printf("CHx Open : "); int j = 0; for (j = 0; j < Relay_Number_MAX; j++) { if(*(&(event.Relay_CH1)+j) == STATE_Open) printf("CH%d ", j+1); } printf("\r\nCHx Closs : "); for (j = 0; j < Relay_Number_MAX; j++) { if(*(&(event.Relay_CH1)+j) == STATE_Closs) printf("CH%d ", j+1); } if(Retain_channels){ printf("\r\nCHx Retain : "); for (j = 0; j < Relay_Number_MAX; j++) { if(*(&(event.Relay_CH1)+j) == STATE_Retain) printf("CH%d ", j+1); } } printf("\r\n"); Relay_Immediate_CHxn(&(event.Relay_CH1), RTC_Mode); printf("\r\n"); } else if(Retain_channels == Relay_Number_MAX - 1){ // Modified a channel (use TimerEvent_CHx_Set()) printf("%s\r\n", datetime_str); for (int x = 0; x < Relay_Number_MAX; x++) { if(*(&(event.Relay_CH1)+x) != STATE_Retain){ // Find the modified channel if(*(&(event.Relay_CH1)+x)){ printf("CH%d Open\r\n", x); Relay_Immediate(x, true, RTC_Mode); printf("\r\n"); } else{ printf("CH%d Closs\r\n", x); Relay_Immediate(x, false, RTC_Mode); printf("\r\n"); } break; } } } else{ printf("Event error or no relay control!!!\r\n"); } } void TimerEvent_CHx_Set(datetime_t time,uint8_t CHx, bool State, Repetition_event Repetition) { char datetime_str[50]; datetime_to_str(datetime_str,datetime); printf("Now Time: %s!!!!\r\n", datetime_str); if(CHx > Relay_Number_MAX){ printf("Timing_CHx_Set(function): Error passing parameter CHx!!!!\r\n"); return; } if(Timing_events_Num + 1 >= Timing_events_Number_MAX) { printf("Note : The number of scheduled events is full.\r\n"); } else{ RGB_Open_Time(50, 36, 0, 1000, 0); CHx_State[Timing_events_Num].Enable_Flag = true; CHx_State[Timing_events_Num].Event_Number = Timing_events_Num + 1; *(&(CHx_State[Timing_events_Num].Relay_CH1)+CHx) = (Status_adjustment)State; CHx_State[Timing_events_Num].Time = time; CHx_State[Timing_events_Num].repetition_State = Repetition; Timing_events_Num ++; datetime_to_str(datetime_str,time); if(State){ printf("New timing event%d :\r\n %s set CH%d Open ----- %s\r\n\r\n", Timing_events_Num, datetime_str, CHx, Event_cycle[Repetition]); sprintf(Event_str[Timing_events_Num-1], "Event %d : %s set CH%d Open ----- %s\\n\\n", Timing_events_Num, datetime_str, CHx, Event_cycle[Repetition]); } else{ printf("New timing event%d :\r\n %s set CH%d Closs ----- %s\r\n\r\n", Timing_events_Num, datetime_str, CHx, Event_cycle[Repetition]); sprintf(Event_str[Timing_events_Num-1], "Event %d : %s set CH%d Closs ----- %s\\n\\n", Timing_events_Num, datetime_str, CHx, Event_cycle[Repetition]); } Buzzer_Open_Time(700, 0); } } void TimerEvent_CHxs_Set(datetime_t time,uint8_t PinState, Repetition_event Repetition) { char datetime_str[50]; datetime_to_str(datetime_str,datetime); printf("Now Time: %s!!!!\r\n", datetime_str); if(Timing_events_Num + 1 >= Timing_events_Number_MAX) { printf("Note : The number of scheduled events is full.\r\n"); } else{ RGB_Open_Time(50, 36, 0, 1000, 0); CHx_State[Timing_events_Num].Enable_Flag = true; CHx_State[Timing_events_Num].Event_Number = Timing_events_Num + 1; for (int i = 0; i < Relay_Number_MAX; i++) { *(&(CHx_State[Timing_events_Num].Relay_CH1)+i) = (Status_adjustment)((PinState >> i) & 0x01); } CHx_State[Timing_events_Num].Time = time; CHx_State[Timing_events_Num].repetition_State = Repetition; Timing_events_Num ++; datetime_to_str(datetime_str,time); printf("New timing event%d :\r\n %s \r\n",Timing_events_Num, datetime_str); printf(" CHx :"); for (int i = 0; i < Relay_Number_MAX; i++) printf("CH%d ", i+1); printf("\r\n State :"); for (int i = 0; i < Relay_Number_MAX; i++) { if((PinState >> i) & 0x01) printf("Open "); else printf("Closs "); } printf("\r\n"); printf(" ----- %s\r\n\r\n", Event_cycle[Repetition]); printf("\r\n"); Buzzer_Open_Time(700, 0); int len = 0; char Event_content[1000]; len += snprintf(Event_content + len, sizeof(Event_content) - len, "    CHx  :"); for (int i = 0; i < Relay_Number_MAX; i++) { len += snprintf(Event_content + len, sizeof(Event_content) - len, "CH%d       ", i + 1); } len += snprintf(Event_content + len, sizeof(Event_content) - len, "\\n     State :"); for (int i = 0; i < Relay_Number_MAX; i++) { if ((PinState >> i) & 0x01) len += snprintf(Event_content + len, sizeof(Event_content) - len, "Open     "); else len += snprintf(Event_content + len, sizeof(Event_content) - len, "Closs     "); } len += snprintf(Event_content + len, sizeof(Event_content) - len, "\\n    ----- %s\\n\\n", Event_cycle[Repetition]); // printf("%s\r\n", Event_content); sprintf(Event_str[Timing_events_Num-1], "Event %d : %s \\n%s", Timing_events_Num, datetime_str,Event_content); } } void TimerEvent_CHxn_Set(datetime_t time,Status_adjustment *Relay_n, Repetition_event Repetition) { char datetime_str[50]; datetime_to_str(datetime_str,datetime); printf("Now Time: %s!!!!\r\n", datetime_str); if(Timing_events_Num + 1 >= Timing_events_Number_MAX) { printf("Note : The number of scheduled events is full.\r\n"); } else{ RGB_Open_Time(50, 36, 0, 1000, 0); CHx_State[Timing_events_Num].Enable_Flag = true; CHx_State[Timing_events_Num].Event_Number = Timing_events_Num + 1; for (int i = 0; i < Relay_Number_MAX; i++) { *(&(CHx_State[Timing_events_Num].Relay_CH1)+i) = Relay_n[i]; } CHx_State[Timing_events_Num].Time = time; CHx_State[Timing_events_Num].repetition_State = Repetition; Timing_events_Num ++; datetime_to_str(datetime_str,time); printf("New timing event%d :\r\n %s \r\n",Timing_events_Num, datetime_str); printf(" CHx :"); for (int i = 0; i < Relay_Number_MAX; i++) printf("CH%d ", i+1); printf("\r\n State :"); for (int i = 0; i < Relay_Number_MAX; i++) { if(Relay_n[i] == STATE_Open) printf("Open "); else if(Relay_n[i] == STATE_Closs) printf("Closs "); else if(Relay_n[i] == STATE_Retain) printf("Retain "); } printf("\r\n"); printf(" ----- %s\r\n\r\n", Event_cycle[Repetition]); printf("\r\n"); Buzzer_Open_Time(700, 0); int len = 0; char Event_content[1000]; len += snprintf(Event_content + len, sizeof(Event_content) - len, "    CHx  :"); for (int i = 0; i < Relay_Number_MAX; i++) { len += snprintf(Event_content + len, sizeof(Event_content) - len, "CH%d       ", i + 1); } len += snprintf(Event_content + len, sizeof(Event_content) - len, "\\n    State :"); for (int i = 0; i < Relay_Number_MAX; i++) { if (Relay_n[i] == STATE_Open) len += snprintf(Event_content + len, sizeof(Event_content) - len, "Open     "); else if(Relay_n[i] == STATE_Closs) len += snprintf(Event_content + len, sizeof(Event_content) - len, "Closs     "); else if(Relay_n[i] == STATE_Retain) len += snprintf(Event_content + len, sizeof(Event_content) - len, "Retain   "); } len += snprintf(Event_content + len, sizeof(Event_content) - len, "\\n    ----- %s\\n\\n", Event_cycle[Repetition]); // printf("%s\r\n", Event_content); sprintf(Event_str[Timing_events_Num-1], "Event %d : %s \\n%s", Timing_events_Num, datetime_str,Event_content); } } void TimerEvent_printf(Timing_RTC event){ uint8_t Retain_channels = 0; uint8_t open[8]={0}; printf("Event %d : \r\n", event.Event_Number); char datetime_str[50]; datetime_to_str(datetime_str,event.Time); for (int i = 0; i < Relay_Number_MAX; i++) { if(*(&(event.Relay_CH1)+i) == STATE_Retain) // Find the modified channel Retain_channels ++; // Number of unmodified channels else open[i] = *(&(event.Relay_CH1)+i); } if(Retain_channels == 0){ // All channels have been modified (use TimerEvent_CHxs_Set()) printf("%s\r\n", datetime_str); printf(" CHx Open : "); for (int j = 0; j < Relay_Number_MAX; j++) { if(open[j]) printf("CH%d ", j); } printf("\r\n CHx Closs : "); for (int k = 0; k < Relay_Number_MAX; k++) { if(!open[k]) printf("CH%d ", k); } printf("\r\n"); } else if(Retain_channels == Relay_Number_MAX - 1){ // Modified a channel (use TimerEvent_CHx_Set()) printf("%s ,", datetime_str); for (int x = 0; x < Relay_Number_MAX; x++) { if(*(&(event.Relay_CH1)+x) != STATE_Retain){ // Find the modified channel if(*(&(event.Relay_CH1)+x)) printf("CH%d Open\r\n", x); else printf("CH%d Closs\r\n", x); break; } } } else{ printf("%s\r\n", datetime_str); printf("CHx Open : "); int j = 0; for (j = 0; j < Relay_Number_MAX; j++) { if(open[j] == STATE_Open) printf("CH%d ", j+1); } printf("\r\nCHx Closs : "); for (j = 0; j < Relay_Number_MAX; j++) { if(open[j] == STATE_Closs) printf("CH%d ", j+1); } printf("\r\nCHx Retain : "); for (j = 0; j < Relay_Number_MAX; j++) { if(open[j] == STATE_Retain) printf("CH%d ", j+1); } printf("\r\n"); } } void TimerEvent_printf_ALL(void) { printf("/******************* Current RTC event *******************/ \r\n"); for (int i = 0; i < Timing_events_Number_MAX; i++) { if(CHx_State[i].Enable_Flag) TimerEvent_printf(CHx_State[i]); } printf("/******************* Current RTC event *******************/\r\n\r\n "); } void TimerEvent_Del(Timing_RTC event){ RGB_Open_Time(20, 0, 50, 1000, 0); printf("Example Delete an RTC event%d\r\n\r\n",event.Event_Number); for (int i = event.Event_Number; i < Timing_events_Number_MAX; i++) { CHx_State[i].Event_Number = CHx_State[i].Event_Number -1; CHx_State[i-1] = CHx_State[i]; } CHx_State[Timing_events_Number_MAX - 1] = CHx_State_Default; memset(Event_str[Timing_events_Number_MAX - 1], 0, sizeof(Event_str[Timing_events_Number_MAX - 1])); Timing_events_Num --; } void TimerEvent_Del_Number(uint8_t Event_Number){ TimerEvent_Del(CHx_State[Event_Number - 1]); Buzzer_Open_Time(700, 300); }