diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 20a3a6b..111cffb 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -8,6 +8,7 @@ idf_component_register(SRCS "impl/impl_dht.c" "impl/impl_epd.c" "impl/impl_lvgl.c" + "impl/impl_sdfs.c" "interface/if_standby.c" "interface/if_wifi.c" "lib/epd-spi/src/epd_common.c" @@ -165,6 +166,7 @@ idf_component_register(SRCS "lib/lvgl/src/widgets/lv_switch.c" "lib/lvgl/src/widgets/lv_table.c" "lib/lvgl/src/widgets/lv_textarea.c" + "service/service_battery.c" "service/service_clock.c" "service/service_dht.c" "service/service_wifi.c" diff --git a/main/impl/impl_epd.c b/main/impl/impl_epd.c index 1ee6a87..c66a271 100644 --- a/main/impl/impl_epd.c +++ b/main/impl/impl_epd.c @@ -8,7 +8,7 @@ #define EPD_GPIO_RES GPIO_NUM_10 #define EPD_GPIO_DC GPIO_NUM_12 -#define EPD_SPI_HOST SPI2_HOST +#define EPD_SPI_HOST SPI3_HOST #define EPD_SPI_SPEED (16 * 1000 * 1000) /* 16MHz */ #define EPD_SPI_MAX_XFER_SIZE (1024) diff --git a/main/impl/impl_sdfs.c b/main/impl/impl_sdfs.c new file mode 100644 index 0000000..3dab56a --- /dev/null +++ b/main/impl/impl_sdfs.c @@ -0,0 +1,18 @@ +#include "impl_sdfs.h" + +#include "lvgl.h" + +lv_fs_res_t impl_sdfs_open(lv_fs_drv_t *drv, void *file_p, const char *path, lv_fs_mode_t mode) { + // + return LV_FS_RES_OK; +} + +lv_fs_res_t impl_sdfs_close(lv_fs_drv_t *drv, void *file_p) { + // + return LV_FS_RES_OK; +} + +esp_err_t impl_sdfs_init(void) { + // + return ESP_OK; +} \ No newline at end of file diff --git a/main/impl/impl_sdfs.h b/main/impl/impl_sdfs.h new file mode 100644 index 0000000..9ff4b1f --- /dev/null +++ b/main/impl/impl_sdfs.h @@ -0,0 +1,6 @@ +#ifndef IMPL_SDFS_H +#define IMPL_SDFS_H + +#include "esp_system.h" + +#endif \ No newline at end of file diff --git a/main/lib/ltc2941/ltc2941.c b/main/lib/ltc2941/ltc2941.c index e69de29..189d10d 100644 --- a/main/lib/ltc2941/ltc2941.c +++ b/main/lib/ltc2941/ltc2941.c @@ -0,0 +1,42 @@ +#include "ltc2941.h" + +#define LTC2941_REG_STATUS 0x00 +#define LTC2941_REG_CONTROL 0x01 +#define LTC2941_REG_CHARGE_MSB 0x02 +#define LTC2941_REG_CHARGE_LSB 0x03 + +ltc2941_ret_t ltc2941_init(ltc2941_t *bat) { + + uint8_t control_reg = + ((bat->config.alert_mode & 0x03U) << 0x01U) | + ((bat->config.prescaler & 0x07U) << 0x03U) | + ((bat->config.alert_level & 0x03U) << 0x06U); + + bat->cb.write_register_cb(bat->user_data, LTC2941_REG_CONTROL, control_reg); + return LTC2941_OK; +} + +ltc2941_ret_t ltc2941_read_status(ltc2941_t *bat, uint8_t *status) { + return bat->cb.read_register_cb(bat->user_data, LTC2941_REG_STATUS, status); +} + +ltc2941_ret_t ltc2941_read_charge(ltc2941_t *bat, uint16_t *charge) { + uint8_t reg = 0x00; + bat->cb.read_register_cb(bat->user_data, LTC2941_REG_CHARGE_MSB, ®); + *charge = reg << 0x08U; + + bat->cb.read_register_cb(bat->user_data, LTC2941_REG_CHARGE_LSB, ®); + *charge |= reg; + + return LTC2941_OK; +} + +ltc2941_ret_t ltc2941_write_charge(ltc2941_t *bat, uint16_t charge) { + uint8_t reg = (charge >> 0x08U); // MSB + bat->cb.write_register_cb(bat->user_data, LTC2941_REG_CHARGE_MSB, reg); + + reg = (charge & 0xFFU); // LSB + bat->cb.write_register_cb(bat->user_data, LTC2941_REG_CHARGE_LSB, reg); + + return LTC2941_OK; +} \ No newline at end of file diff --git a/main/lib/ltc2941/ltc2941.h b/main/lib/ltc2941/ltc2941.h index e69de29..b32deed 100644 --- a/main/lib/ltc2941/ltc2941.h +++ b/main/lib/ltc2941/ltc2941.h @@ -0,0 +1,64 @@ +#ifndef __LTC2941_BATTERY_H +#define __LTC2941_BATTERY_H + +#include + +typedef enum { + LTC2941_OK, + LTC2941_ERROR +} ltc2941_ret_t; + +typedef enum { + LTC2941_ALERT_3_0V = 0x03, + LTC2941_ALERT_2_9V = 0x02, + LTC2941_ALERT_2_8V = 0x01, + LTC2941_ALERT_OFF = 0x00 +} ltc2941_battery_alert_t; + +typedef enum { + LTC2941_PRE_1 = 0x00, + LTC2941_PRE_2 = 0x01, + LTC2941_PRE_4 = 0x02, + LTC2941_PRE_8 = 0x03, + LTC2941_PRE_16 = 0x04, + LTC2941_PRE_32 = 0x05, + LTC2941_PRE_64 = 0x06, + LTC2941_PRE_128 = 0x07 +} ltc2941_prescale_t; + +typedef enum { + LTC2941_ALERT_DISABLED = 0x00, + LTC2941_ALERT_CC = 0x01, + LTC2941_ALERT_AL = 0x02 +} ltc2941_alert_mode_t; + +typedef struct { + ltc2941_ret_t (*write_register_cb)(void * handle, uint8_t reg, uint8_t value); + ltc2941_ret_t (*read_register_cb)(void *handle, uint8_t reg, uint8_t *value); +} ltc2941_cb_t; + +typedef struct { + ltc2941_prescale_t prescaler; + ltc2941_alert_mode_t alert_mode; + ltc2941_battery_alert_t alert_level; +} ltc2941_config_t; + +typedef struct { + ltc2941_cb_t cb; + ltc2941_config_t config; + void *user_data; +} ltc2941_t; + +#define LTC2941_STATUS_CHIPID (1 << 7U) +#define LTC2941_STATUS_OVERFLOW (1 << 5U) +#define LTC2941_STATUS_ALRT_HIGH (1 << 3U) +#define LTC2941_STATUS_ALRT_LOW (1 << 2U) +#define LTC2941_STATUS_ALRT_VBAT (1 << 1U) +#define LTC2941_STATUS_ALRT_UVLO 1U + +ltc2941_ret_t ltc2941_init(ltc2941_t *bat); +ltc2941_ret_t ltc2941_read_status(ltc2941_t *bat, uint8_t *status); +ltc2941_ret_t ltc2941_read_charge(ltc2941_t *bat, uint16_t *charge); +ltc2941_ret_t ltc2941_write_charge(ltc2941_t *bat, uint16_t charge); + +#endif \ No newline at end of file diff --git a/main/service/service_battery.c b/main/service/service_battery.c new file mode 100644 index 0000000..e69de29 diff --git a/main/service/service_battery.h b/main/service/service_battery.h new file mode 100644 index 0000000..e69de29 diff --git a/main/service/service_clock.c b/main/service/service_clock.c index 5ff2706..33b4a7c 100644 --- a/main/service/service_clock.c +++ b/main/service/service_clock.c @@ -10,7 +10,7 @@ static TaskHandle_t s_clock_task_handle; -static const char *s_wday_array[] = {"SUN", "MON", "TUE", "WED", "THU", "FRI"}; +static const char *s_wday_array[] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"}; void clock_task(void *pvParameters) { struct tm timeinfo; diff --git a/main/service/service_wifi.c b/main/service/service_wifi.c index d6264f7..073346e 100644 --- a/main/service/service_wifi.c +++ b/main/service/service_wifi.c @@ -24,14 +24,36 @@ static QueueHandle_t s_service_wifi_event_queue; static uint8_t s_retry_count = 0; typedef enum { - SERVICE_WIFI_EVENT_CONNECTING, - SERVICE_WIFI_EVENT_DISCONNECTED, - SERVICE_WIFI_EVENT_CONNECTED, - SERVICE_WIFI_EVENT_START_DPP, + SERVICE_WIFI_EV_STATE_CHANGE, } service_wifi_event_t; +typedef enum { + SERVICE_WIFI_STATE_DISABLED, + SERVICE_WIFI_STATE_DPP, + SERVICE_WIFI_STATE_CONNECTING, + SERVICE_WIFI_STATE_CONNECTED, + SERVICE_WIFI_STATE_IP_READY, +} service_wifi_state_t; + +typedef struct { + service_wifi_event_t ev; + void *payload; +} service_wifi_request_t; + +static esp_err_t service_wifi_update_state(service_wifi_state_t new_state) { + service_wifi_request_t req = { + .ev = SERVICE_WIFI_EV_STATE_CHANGE, + .payload = (void *)new_state, + }; + + if(xQueueSend(s_service_wifi_event_queue, &req, 0) != pdPASS) { + return ESP_FAIL; + } + + return ESP_OK; +} + static void service_wifi_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { - service_wifi_event_t service_ev; if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { esp_wifi_connect(); } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) { @@ -41,8 +63,7 @@ static void service_wifi_event_handler(void *arg, esp_event_base_t event_base, i } } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { s_retry_count = 0; - service_ev = SERVICE_WIFI_EVENT_CONNECTED; - xQueueSend(s_service_wifi_event_queue, &service_ev, 0); + service_wifi_update_state(SERVICE_WIFI_STATE_IP_READY); } } @@ -89,15 +110,18 @@ void service_wifi_task(void *pvParameters) { ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config)); ESP_ERROR_CHECK(esp_wifi_start()); - service_wifi_event_t queue_event; + service_wifi_request_t request; for (;;) { - if (xQueueReceive(s_service_wifi_event_queue, &queue_event, portMAX_DELAY) == pdPASS) { - switch (queue_event) { - case SERVICE_WIFI_EVENT_CONNECTED: - if_standby_component_update(IF_STANDBY_COMPONENT_WIFI, "\U000F0928"); - break; - default: - break; + if (xQueueReceive(s_service_wifi_event_queue, &request, portMAX_DELAY) == pdPASS) { + if (request.ev == SERVICE_WIFI_EV_STATE_CHANGE) { + service_wifi_state_t state = (service_wifi_state_t)request.payload; + switch (state) { + case SERVICE_WIFI_STATE_IP_READY: + if_standby_component_update(IF_STANDBY_COMPONENT_WIFI, "\U000F0928"); + break; + default: + break; + } } } } @@ -114,7 +138,7 @@ esp_err_t service_wifi_init(void) { ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, service_wifi_event_handler, NULL)); ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, service_wifi_event_handler, NULL)); - s_service_wifi_event_queue = xQueueCreate(2, sizeof(service_wifi_event_t)); + s_service_wifi_event_queue = xQueueCreate(2, sizeof(service_wifi_request_t)); if (s_service_wifi_event_queue == NULL) { return ESP_FAIL; } @@ -126,3 +150,7 @@ esp_err_t service_wifi_init(void) { return ESP_OK; } + +esp_err_t service_wifi_notify() { + return ESP_OK; +} diff --git a/main/service/service_wifi.h b/main/service/service_wifi.h index 4eaad6c..d4b3b1b 100644 --- a/main/service/service_wifi.h +++ b/main/service/service_wifi.h @@ -3,6 +3,13 @@ #include "esp_system.h" +typedef enum { + SERVICE_WIFI_NOTIFY_STANDBY_REFRESH, + SERVICE_WIFI_NOTIFY_SETTINGS_REFRESH, +} service_wifi_notify_t; + esp_err_t service_wifi_init(void); +esp_err_t service_wifi_notify(); + #endif \ No newline at end of file