231 lines
8.6 KiB
C
231 lines
8.6 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_LEAVE, // 离家模式
|
||
LIGHT_MODE_MAX // 模式数量
|
||
} lightMode_e;
|
||
|
||
// 位掩码定义
|
||
#define LIGHT_MODE_LEAVE_BIT (1 << 7) // 离家模式位
|
||
#define LIGHT_MODE_MASK (0x7F) // 基础模式掩码(7位)
|
||
#define LIGHT_MODE_IS_LEAVE(mode) ((mode) & LIGHT_MODE_LEAVE_BIT)
|
||
#define LIGHT_MODE_GET_BASE(mode) ((mode) & LIGHT_MODE_MASK)
|
||
#define LIGHT_MODE_SET_LEAVE(base_mode) ((base_mode) | LIGHT_MODE_LEAVE_BIT)
|
||
|
||
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_COLOUR_MODE "colourMode" // 色温模式控制
|
||
|
||
// 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" // 渐变时长字段
|
||
#define JSON_FIELD_COLOUR_MODE "mode" // 色温模式字段
|
||
|
||
typedef enum {
|
||
REPORT_SWITCH = 1 << 0,
|
||
REPORT_BRIGHTNESS = 1 << 1,
|
||
REPORT_CCT = 1 << 2,
|
||
REPORT_LIGHT_MODE = 1 << 3,
|
||
REPORT_FADE_TIME = 1 << 4,
|
||
REPORT_COLOUR_MODE = 1 << 5,
|
||
REPORT_ALL = REPORT_SWITCH | REPORT_BRIGHTNESS | REPORT_CCT | REPORT_LIGHT_MODE | REPORT_FADE_TIME | REPORT_COLOUR_MODE,
|
||
} report_mask_e;
|
||
|
||
// 色温模式定义
|
||
typedef enum {
|
||
COLOUR_MODE_SINGLE = 0, // 单色温模式
|
||
COLOUR_MODE_DUAL = 1, // 双色温模式
|
||
} colourMode_e;
|
||
|
||
// 当前亮度和色温状态
|
||
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)
|
||
uint8_t colourMode; // 色温模式 (0:单色温, 1:双色温)
|
||
// 持久化维持
|
||
int32_t power_on_cnt; // 上电次数计数
|
||
uint8_t is_networked; // 是否已配网
|
||
uint8_t is_net_configured; // 设备是否曾经配网成功过
|
||
|
||
uint32_t reserve[10]; // 保留字段
|
||
//运行时的数据
|
||
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 (10*1000) //us
|
||
#define NORMAL_FADE_TIME 3 //s
|
||
#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) //每次变化的幅度
|
||
|
||
|
||
// PWM频率和周期定义
|
||
#define PWM_FREQUENCY 3000 // PWM频率 2KHz
|
||
|
||
//渐变范围
|
||
#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 // 数据版本号
|
||
|
||
|
||
// 保存任务相关定义
|
||
#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;
|
||
|
||
|
||
typedef enum {
|
||
APP_CHANGE_LIGHT_MODE = 0,
|
||
APP_CHANGE_LIGHT_BRIGHTNESS_CCT,
|
||
APP_CLOSE_LIGHT,
|
||
APP_OPEN_LIGHT,
|
||
DEV_POWER_ON,
|
||
} light_ctrl_source_e;
|
||
|
||
// 单色温模式的固定色温值
|
||
#define SINGLE_COLOUR_CCT 6000 // 单色温模式固定色温 6000K
|
||
#define SINGLE_COLOUR_CCT_LOCAL CCT_REMOTE2LOCAL(SINGLE_COLOUR_CCT) // 转换为本地值
|
||
|
||
#define BRIGHTNESS_PIN GPIO_04 // 冷白LED (CW)
|
||
#define CCT_PIN GPIO_00 // 暖白LED (WW)
|
||
#define SWITCH_PIN GPIO_13
|
||
|
||
#define CONFIG_PWM_GROUP_ID 2
|
||
|
||
#define OPEN_LIGHT GPIO_LEVEL_HIGH
|
||
#define CLOSE_LIGHT GPIO_LEVEL_LOW
|
||
|
||
|
||
#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, \
|
||
.colourMode = COLOUR_MODE_DUAL, \
|
||
.is_networked = false, \
|
||
.is_net_configured = false, \
|
||
.duty_cw = 0, \
|
||
.duty_ww = 0, \
|
||
};
|
||
|
||
int spotlight_main(void);
|
||
int set_light(light_ctrl_source_e source,
|
||
int32_t brightness_local_target, int32_t cct_local_target);
|
||
int set_smooth_time(uint32_t smooth_time); // 设置渐变时长
|
||
void update_pwm_output(bool on_state, uint16_t duty_cw, uint16_t duty_ww);
|
||
|
||
// 模式转换函数
|
||
lightMode_e convert_mode_for_report(lightMode_e current_mode); // 将bitmask转换为上报用的枚举值
|
||
|
||
void stop_net_config(void);
|
||
extern int fast_report(const char* svc_id);
|
||
|
||
#endif
|
||
|