LPT26x-HSF-4MB-Hilink_14.2..../application/ws63/user_main/spotlight/spotlight.h

168 lines
6.2 KiB
C

#ifndef __SPOTLIGHT_H__
#define __SPOTLIGHT_H__
#include <hsf.h>
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" // 渐变时长的控制
// 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 {
// 物模型同步需要 持久化维持
bool 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; // 上电次数计数
bool is_networked; // 是否已配网
//运行时的数据
bool read_done; // 读取数据done
uint16_t duty_cw; // 冷白LED占空比
uint16_t duty_ww; // 暖白LED占空比
} 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 {
uint32_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, \
.duty_cw = 0, \
.duty_ww = 0, \
};
#endif