Files
LPT26x-HSF-4MB-Hilink_14.2.…/application/ws63/user_main/spotlight/spotlight.h
ekko.bao 3dc430b62b 1. 解决ble 冷启动不能局域网控制的问题
之前的版本只能应对中途断网的情况。现在的应该可以应对无网启动的情况
2025-07-09 21:49:09 +08:00

231 lines
8.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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_bound; // 是否已配网
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_bound = 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