ESP32S2_Cal/main/service/service_clock.c

65 lines
1.9 KiB
C

#include "service_clock.h"
#include <time.h>
#include "esp_log.h"
#include "if_standby.h"
#define LOG_TAG "SERVICE_CLOCK"
static TaskHandle_t s_clock_task_handle;
static char *s_wday_array[] = {"SUN", "MON", "TUE", "WED", "THU", "FRI"};
void clock_task(void *pvParameters) {
struct tm timeinfo;
time_t now;
uint8_t prev_min = 0xFF;
uint8_t prev_mday = 0xFF;
uint8_t prev_wday = 0xFF;
if_standby_queue_t queue_item;
setenv("TZ", "CST-8", 1);
tzset();
for (;;) {
time(&now);
localtime_r(&now, &timeinfo);
if ((timeinfo.tm_min != prev_min) || (prev_min == 0xFF)) {
queue_item.item = IF_STANDBY_ITEM_TIME;
snprintf(queue_item.payload, IF_STANDBY_PAYLOAD_LENGTH, "%02u:%02u", timeinfo.tm_hour, timeinfo.tm_min);
xQueueSendToBack(g_standby_screen_queue, &queue_item, 0);
prev_min = timeinfo.tm_min;
}
if ((timeinfo.tm_mday != prev_mday) || (prev_mday == 0xFF)) {
queue_item.item = IF_STANDBY_ITEM_DATE;
snprintf(queue_item.payload, IF_STANDBY_PAYLOAD_LENGTH, "%04u/%02d/%02d",
(uint16_t)(timeinfo.tm_year + 1900), (uint8_t)(timeinfo.tm_mon + 1), (uint8_t)timeinfo.tm_mday);
xQueueSendToBack(g_standby_screen_queue, &queue_item, 0);
prev_mday = timeinfo.tm_mday;
}
if ((timeinfo.tm_wday != prev_wday) || (prev_wday == 0xFF)) {
queue_item.item = IF_STANDBY_ITEM_WEEKDAY;
memcpy(queue_item.payload, s_wday_array[timeinfo.tm_wday], 4);
xQueueSendToBack(g_standby_screen_queue, &queue_item, 0);
prev_wday = timeinfo.tm_wday;
}
// TODO: Set an alarm at 0sec every 1 minute.
vTaskDelay(pdMS_TO_TICKS(200));
}
}
esp_err_t service_clock_init(void) {
if (xTaskCreate(clock_task, "CLOCK", 2048, NULL, 6, &s_clock_task_handle) != pdTRUE) {
return ESP_FAIL;
}
return ESP_OK;
}