#ifndef __SPOTLIGHT_H__ #define __SPOTLIGHT_H__ #include typedef enum elightMode { LIGHT_MODE_CUSTOMER = 0, // 非情景模式 LIGHT_MODE_RELAX, // 休闲模式 LIGHT_MODE_MOVIE, // 观影模式 LIGHT_MODE_DINING, // 用餐模式 LIGHT_MODE_HOME, // 回家模式 LIGHT_MODE_WINTER, // 冬天模式 LIGHT_MODE_SUMMER, // 夏天模式 LIGHT_MODE_MAX // 模式数量 } lightMode_e; typedef enum { INIT_POWER_ON, NET_CONFIGING, BIND_OK, }eDeviceBindStatus; // 服务ID定义 #define SVC_ID_SWITCH "switch" // 开关控制 #define SVC_ID_BRIGHTNESS "brightness" // 亮度控制 #define SVC_ID_CCT "cct" // 色温控制 #define SVC_ID_LIGHT_MODE "lightMode" // 场景模式控制 #define SVC_ID_FADE_TIME "progressSwitch" // 渐变时长的控制 #define SVC_ID_NET_INFO "netInfo" // 配网信息 // JSON字段名定义 #define JSON_FIELD_ON "on" // 开关状态字段 #define JSON_FIELD_BRIGHTNESS "brightness" // 亮度字段 #define JSON_FIELD_CCT "colorTemperature" // 色温字段 #define JSON_FIELD_MODE "mode" // 场景模式字段 #define JSON_FIELD_FADE_TIME "fadeTime" // 渐变时长字段 // 当前亮度和色温状态 typedef struct __attribute__((packed, aligned(1))) { // 物模型同步需要 持久化维持 uint8_t on; // 开关状态 lightMode_e elightMode; uint16_t brightness_local; // 当前亮度 (0-1000) uint16_t fade_time; // s uint16_t cct_local; // 当前色温 (2700-6500) // 持久化维持 int32_t power_on_cnt; // 上电次数计数 uint8_t is_networked; // 是否已配网 uint8_t is_net_configured; // 设备是否曾经配网成功过 //运行时的数据 uint16_t duty_cw; // 冷白LED占空比 uint16_t duty_ww; // 暖白LED占空比 uint8_t read_done; // 读取数据done } device_control_t; // 色温范围定义 #define CCT_MIN 2700 // 最小色温 2700K (暖白) #define CCT_MAX 6000 // 最大色温 6000K (冷白) #define CCT_RANGE (CCT_MAX - CCT_MIN) #define CCT_LOCAL_MIN 0 // 最小色温 0K (暖白) #define CCT_LOCAL_MAX (CCT_LOCAL_MIN + CCT_RANGE) // 最大色温 6000K (冷白) #define CCT_LOCAL2REMOTE(x) (x + (CCT_MIN - CCT_LOCAL_MIN)) #define CCT_REMOTE2LOCAL(x) (x - (CCT_MIN - CCT_LOCAL_MIN)) #define CCT_LITME_RANGE(x) do { \ if (x > CCT_LOCAL_MAX) x = CCT_LOCAL_MAX; \ if (x < CCT_LOCAL_MIN) x = CCT_LOCAL_MIN; \ } while (0) // 亮度范围定义 #define BRIGHTNESS_MIN 0 // 最小亮度 #define BRIGHTNESS_MAX 100 // 最大亮度 #define BRIGHTNESS_LOCAL_MIN 0 // 最小亮度 #define BRIGHTNESS_LOCAL_MAX 1000 // 最大亮度 #define BRIGHTNESS_REMOTE2LOCAL(x) (x * 10) //变化范围0 -1000 #define BRIGHTNESS_LOCAL2REMOTE(x) (x / 10) #define BRIGHTNESS_LITME_RANGE(x) do { \ if (x > BRIGHTNESS_LOCAL_MAX) x = BRIGHTNESS_LOCAL_MAX; \ if (x < BRIGHTNESS_LOCAL_MIN) x = BRIGHTNESS_LOCAL_MIN; \ } while (0) // 设备上电并未进入配网的状态 #define INIT_STA__LIGHT_MODE LIGHT_MODE_CUSTOMER #define INIT_STA__BRIGHTNESS 50 #define INIT_STA__CCT 4000 #define INIT_NET_CFG_PWOER_ON_KEEP_TIME (5 * 1000) // 统计进入配网每次打开状态的保持时间 #define NET_CFG_ENTRY_CNT 6 // 配网进入的上电次数 #define NET_CFG_BREATH_DURATION 1*60*1000 // 配网呼吸灯持续时间(ms) #define NET_CFG_TOTAL_TIMEOUT 10*60*1000 // 配网总超时时间(ms) // 配网成功后的默认值 #define NET_CFG_DEFAULT_BRIGHTNESS 80 // 默认亮度 #define NET_CFG_DEFAULT_CCT 6000 // 默认色温 #define NET_CFG_DEFAULT_FADE_TIME 1 // 默认渐变时长(s) #define NET_CFG_DEFAULT_LIGHTMODE LIGHT_MODE_CUSTOMER // 默认模式 // 配网超时后的默认值 #define NET_CFG_TIMEOUT_BRIGHTNESS 50 // 呼吸灯超时后的亮度 #define NET_CFG_TIMEOUT_CCT 4000 // 呼吸灯超时后的色温 #define FADE_INTERVAL_MIN (1*1000) //us #define PWM_DUTY_RATIO_MAX 1000 //呼吸灯定义 #define BREARTH_PERIOD (3*1000*1000) //呼吸灯周期(Us) #define BREARTH_INTERVAL (3*1000) //更新pwm的间隔 us #define BREARTH_STEP ((PWM_DUTY_RATIO_MAX) * 2) / (BREARTH_PERIOD / BREARTH_INTERVAL) //每次变化的幅度 //渐变范围 #define SMOOTH_TIME_MAX 30 #define SMOOTH_TIME_MIN 0 #define SUPPORT_SAVE_TO_FLASH 1 // 定义Flash存储地址和大小 #define DEVICE_DATA_FLASH_ADDR 0x000000 // 主数据区地址 #define DEVICE_DATA_BACKUP_ADDR 0x001000 // 备份数据区地址 #define DEVICE_DATA_FLASH_SIZE 0x001000 // 使用一个页的大小 // 设备数据结构 typedef struct __attribute__((packed, aligned(1))) { uint8_t checksum; // 校验和 uint32_t magic; // 魔数,用于验证数据有效性 uint32_t version; // 数据版本号 device_control_t control; // 设备控制状态 } device_data_t; #define DEVICE_DATA_MAGIC 0x4C505426 // "LPT&"的ASCII码 #define DEVICE_DATA_VERSION 1 // 数据版本号 int spotlight_main(void); int set_light(int32_t brightness, int32_t cct); // 新的统一控制函数 int set_switch(bool open); int set_smooth_time(uint32_t smooth_time); // 设置渐变时长 extern int fast_report(const char* svc_id); // 保存任务相关定义 #define SAVE_TASK_PRIO 25 #define SAVE_TASK_STACK_SIZE 0x1000 #define SAVE_TASK_SLEEP_TIME 100 // 100ms // 保存任务状态 typedef enum { SAVE_STATE_IDLE = 0, // 空闲状态 SAVE_STATE_SAVING, // 正在保存 SAVE_STATE_WAITING // 等待保存 } save_state_e; #define DEFAULT_DEVICE_DATA { \ .read_done = false, \ .on = true, \ .elightMode = INIT_STA__LIGHT_MODE, \ .cct_local = CCT_REMOTE2LOCAL(INIT_STA__CCT), \ .brightness_local = BRIGHTNESS_REMOTE2LOCAL(INIT_STA__BRIGHTNESS), \ .fade_time = NET_CFG_DEFAULT_FADE_TIME, \ .is_networked = false, \ .is_net_configured = false, \ .duty_cw = 0, \ .duty_ww = 0, \ }; #endif