Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions Code/PhoneBed_code/components/esp_wifi_bsp/esp_wifi_bsp.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,20 +51,21 @@ void espwifi_Init(void)

static void event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data)
{
if (event_id == WIFI_EVENT_STA_START)
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START)
{
esp_wifi_connect(); // 连接到 Wi-Fi
// esp_wifi_scan_u();
}
else if (event_id == IP_EVENT_STA_GOT_IP)
else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP)
{
ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data;
char ip[25];
uint32_t pxip = event->ip_info.ip.addr;
wifi_retry_num = 0;
sprintf(ip, "%d.%d.%d.%d", (uint8_t)(pxip), (uint8_t)(pxip >> 8), (uint8_t)(pxip >> 16), (uint8_t)(pxip >> 24));
printf("IP: %s\n", ip);
}
else if (event_id == WIFI_EVENT_STA_DISCONNECTED)
else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED)
{
wifi_retry_num++;
if (wifi_retry_num > MAXIMUM_RETRY_NUM)
Expand Down
53 changes: 42 additions & 11 deletions Code/PhoneBed_code/components/i2c_bsp/i2c_bsp.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,19 @@ static uint32_t i2c_done_pdMS_TICKS = 0;

esp_io_expander_handle_t io_expander = NULL;

static i2c_master_bus_handle_t get_bus_handle_by_device(i2c_master_dev_handle_t dev_handle)
{
if (dev_handle == rtc_dev_handle || dev_handle == imu_dev_handle)
{
return user_i2c_port0_handle;
}
if (dev_handle == disp_touch_dev_handle)
{
return user_i2c_port1_handle;
}
return NULL;
}

static void tca9554_init(void)
{
i2c_master_bus_handle_t tca9554_i2c_bus_ = NULL;
Expand Down Expand Up @@ -86,11 +99,17 @@ void i2c_master_init(void)
tca9554_init();
}

uint8_t i2c_writr_buff(i2c_master_dev_handle_t dev_handle, int reg, uint8_t *buf, uint8_t len)
esp_err_t i2c_writr_buff(i2c_master_dev_handle_t dev_handle, int reg, uint8_t *buf, uint8_t len)
{
uint8_t ret;
esp_err_t ret;
uint8_t *pbuf = NULL;
ret = i2c_master_bus_wait_all_done(user_i2c_port1_handle, i2c_done_pdMS_TICKS);
i2c_master_bus_handle_t bus_handle = get_bus_handle_by_device(dev_handle);
if (bus_handle == NULL)
{
ESP_LOGE("i2c.master", "Unknown device handle in write path");
return ESP_ERR_INVALID_ARG;
}
ret = i2c_master_bus_wait_all_done(bus_handle, i2c_done_pdMS_TICKS);
if (ret != ESP_OK)
return ret;
if (reg == -1)
Expand All @@ -111,10 +130,16 @@ uint8_t i2c_writr_buff(i2c_master_dev_handle_t dev_handle, int reg, uint8_t *buf
}
return ret;
}
uint8_t i2c_master_write_read_dev(i2c_master_dev_handle_t dev_handle, uint8_t *writeBuf, uint8_t writeLen, uint8_t *readBuf, uint8_t readLen)
esp_err_t i2c_master_write_read_dev(i2c_master_dev_handle_t dev_handle, uint8_t *writeBuf, uint8_t writeLen, uint8_t *readBuf, uint8_t readLen)
{
uint8_t ret;
ret = i2c_master_bus_wait_all_done(user_i2c_port1_handle, i2c_done_pdMS_TICKS);
esp_err_t ret;
i2c_master_bus_handle_t bus_handle = get_bus_handle_by_device(dev_handle);
if (bus_handle == NULL)
{
ESP_LOGE("i2c.master", "Unknown device handle in write-read path");
return ESP_ERR_INVALID_ARG;
}
ret = i2c_master_bus_wait_all_done(bus_handle, i2c_done_pdMS_TICKS);
if (ret != ESP_OK)
{
ESP_LOGE("i2c.master", "wait_all_done failed: %s", esp_err_to_name(ret));
Expand All @@ -123,15 +148,21 @@ uint8_t i2c_master_write_read_dev(i2c_master_dev_handle_t dev_handle, uint8_t *w
ret = i2c_master_transmit_receive(dev_handle, writeBuf, writeLen, readBuf, readLen, i2c_data_pdMS_TICKS);
if (ret != ESP_OK) {
ESP_LOGE("i2c.master", "transmit_receive failed: %s", esp_err_to_name(ret));
(void)i2c_master_bus_reset(user_i2c_port1_handle);
(void)i2c_master_bus_reset(bus_handle);
}
return ret;
}
uint8_t i2c_read_buff(i2c_master_dev_handle_t dev_handle, int reg, uint8_t *buf, uint8_t len)
esp_err_t i2c_read_buff(i2c_master_dev_handle_t dev_handle, int reg, uint8_t *buf, uint8_t len)
{
uint8_t ret;
esp_err_t ret;
uint8_t addr = 0;
ret = i2c_master_bus_wait_all_done(user_i2c_port1_handle, i2c_done_pdMS_TICKS);
i2c_master_bus_handle_t bus_handle = get_bus_handle_by_device(dev_handle);
if (bus_handle == NULL)
{
ESP_LOGE("i2c.master", "Unknown device handle in read path");
return ESP_ERR_INVALID_ARG;
}
ret = i2c_master_bus_wait_all_done(bus_handle, i2c_done_pdMS_TICKS);
if (ret != ESP_OK)
return ret;
if (reg == -1)
Expand All @@ -145,7 +176,7 @@ uint8_t i2c_read_buff(i2c_master_dev_handle_t dev_handle, int reg, uint8_t *buf,
}
if (ret != ESP_OK) {
ESP_LOGE("i2c.master", "read failed: %s", esp_err_to_name(ret));
(void)i2c_master_bus_reset(user_i2c_port1_handle);
(void)i2c_master_bus_reset(bus_handle);
}
return ret;
}
9 changes: 5 additions & 4 deletions Code/PhoneBed_code/components/i2c_bsp/i2c_bsp.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#ifndef I2C_BSP_H
#define I2C_BSP_H
#include "driver/i2c_master.h"
#include "esp_err.h"

extern i2c_master_dev_handle_t rtc_dev_handle;
extern i2c_master_dev_handle_t imu_dev_handle;
Expand All @@ -22,12 +23,12 @@ extern "C" {

void i2c_master_init(void);
void touch_i2c_master_Init(void);
uint8_t i2c_writr_buff(i2c_master_dev_handle_t dev_handle,int reg,uint8_t *buf,uint8_t len);
uint8_t i2c_master_write_read_dev(i2c_master_dev_handle_t dev_handle,uint8_t *writeBuf,uint8_t writeLen,uint8_t *readBuf,uint8_t readLen);
uint8_t i2c_read_buff(i2c_master_dev_handle_t dev_handle,int reg,uint8_t *buf,uint8_t len);
esp_err_t i2c_writr_buff(i2c_master_dev_handle_t dev_handle,int reg,uint8_t *buf,uint8_t len);
esp_err_t i2c_master_write_read_dev(i2c_master_dev_handle_t dev_handle,uint8_t *writeBuf,uint8_t writeLen,uint8_t *readBuf,uint8_t readLen);
esp_err_t i2c_read_buff(i2c_master_dev_handle_t dev_handle,int reg,uint8_t *buf,uint8_t len);

#ifdef __cplusplus
}
#endif

#endif
#endif
24 changes: 22 additions & 2 deletions Code/PhoneBed_code/main/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ static const char *TAG = "PhoneBed_main";

TaskHandle_t audio_task_handle = NULL; // 音频任务句柄
TaskHandle_t onboard_button_task_handle = NULL; // 板载按钮任务句柄
static TaskHandle_t charge_action_task_handle = NULL; // 充电事件处理任务句柄

static SemaphoreHandle_t lvgl_mux = NULL; // LVGL 互斥体
static SemaphoreHandle_t flush_done_semaphore = NULL; // 刷新完成信号量
Expand Down Expand Up @@ -219,11 +220,29 @@ static void example_lvgl_port_task(void *arg)
}
}

// 充电GPIO中断的后处理任务,在任务态执行非ISR安全的逻辑
static void charge_action_task(void *arg)
{
for (;;)
{
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
quilt_close(); // 先把被子盖上
fan_set_speed(FAN_SPEED_GRADE3); // 拉高风扇转速,防止温度过高
}
}

// 手机放上去充上电后,会进这个中断服务程序
static void IRAM_ATTR charge_isr_handler(void *arg)
{
quilt_close(); // 先把被子盖上
fan_set_speed(FAN_SPEED_GRADE3); // 拉高风扇转速,防止温度过高
BaseType_t high_task_awoken = pdFALSE;
if (charge_action_task_handle != NULL)
{
vTaskNotifyGiveFromISR(charge_action_task_handle, &high_task_awoken);
}
if (high_task_awoken == pdTRUE)
{
portYIELD_FROM_ISR();
}
}

extern "C" void app_main(void)
Expand Down Expand Up @@ -368,6 +387,7 @@ extern "C" void app_main(void)

// =============================== 按键相关初始化 ===============================
xTaskCreatePinnedToCore(onboard_button_task, "onboard_button_task", 8 * 1024, NULL, 2, &onboard_button_task_handle, 1); // 按钮事件
xTaskCreate(charge_action_task, "charge_action_task", 2048, NULL, 3, &charge_action_task_handle); // 充电事件后处理

// =============================== 风扇相关初始化 ===============================
fan_init(); // 初始化风扇控制
Expand Down
12 changes: 9 additions & 3 deletions Code/PhoneBed_code/main/page.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ static bool alarm_clock_flag = false; // 闹钟是否开启标志
static int alarm_clock_index = 0; // 闹钟当前修改索引 0表示未修改 1表示修改小时 2表示修改分钟
static lv_obj_t *alarm_page = NULL; // 闹钟页面对象
static uint8_t alarm_clock[2] = {0, 0}; // 闹钟时间结构体
static uint32_t last_alarm_trigger_slot = 0; // 记录最近一次触发的分钟槽位,避免同一秒重复触发
static lv_obj_t *alarm_switch_default; // 闹钟默认开关对象
static lv_obj_t *alarm_switch; // 闹钟开关对象
static lv_obj_t *alarm_roller_hour; // 闹钟设置小时滚轮
Expand Down Expand Up @@ -153,16 +154,21 @@ void page_time_refresh(lv_timer_t *timer)
datetime = i2c_rtc_get(); // 获取当前时间
char time_str[32]; // 时间字符串缓冲区
sprintf(time_str, "%02d:%02d:%02d", datetime.hour, datetime.minute, datetime.second); // 格式化时间字符串
uint32_t current_alarm_slot = (((((uint32_t)datetime.year * 12U) + datetime.month) * 32U + datetime.day) * 24U + datetime.hour) * 60U + datetime.minute;

if (label_time != NULL)
{
lv_label_set_text(label_time, time_str); // 更新标签文本
}
if (alarm_clock_flag && (datetime.hour == alarm_clock[0]) && (datetime.minute == alarm_clock[1]) && (datetime.second == 0)) // 如果闹钟开启且时间到了
{
// 触发闹钟事件
ESP_LOGI("ALARM", "Alarm Triggered at %02d:%02d:%02d", datetime.hour, datetime.minute, datetime.second);
alarm_start(); // 启动闹钟,开始吵,吵,吵
if (last_alarm_trigger_slot != current_alarm_slot)
{
// 触发闹钟事件
ESP_LOGI("ALARM", "Alarm Triggered at %02d:%02d:%02d", datetime.hour, datetime.minute, datetime.second);
last_alarm_trigger_slot = current_alarm_slot;
alarm_start(); // 启动闹钟,开始吵,吵,吵
}
}
}

Expand Down