完善助眠仪功能 支持大模型控制

This commit is contained in:
helloyifa 2025-05-20 18:41:48 +08:00
parent 5d9bec2139
commit ce728f5362
3 changed files with 337 additions and 34 deletions

View File

@ -27,6 +27,7 @@
#define LOGE(...) BK_LOGE(TAG, ##__VA_ARGS__)
#define LOGD(...) BK_LOGD(TAG, ##__VA_ARGS__)
#define SLEEP_MODE_LEVEL_NUM 9
/*
*PWM
*/
@ -35,40 +36,176 @@ static uint32_t pwm_chan = 1;
/**
* 1
*/
static mode_info_t model_1[7] = {
{0, 2000},
{1, 2000},
{0, 2000},
{-1, 2000},
{1, 2000},
{0, 2000},
{-1, 2000},
static mode_info_t model_1[16] = {
{0, 300},
{1, 300},
{0, 800},
{-1, 550},
{0, 550},
{1, 820},
{0, 300},
{-1, 1000},
{0, 15},
{1, 1000},
{0, 300},
{-1, 800},
{0, 550},
{1, 550},
{0, 800},
{-1, 300},
};
/**
* 2
*/
static mode_info_t mode_2[34] = {
{0, 100},
{-1, 20},
{0, 130},
{1, 68},
{0, 170},
{-1, 88},
{0, 145},
{1, 110},
{0, 120},
{-1, 127},
{0, 100},
{1, 150},
{0, 68},
{-1, 165},
{0, 20},
{1, 200},
{0, 20},
{-1, 250},
{0, 20},
{1, 180},
{0, 20},
{-1, 180},
{0, 70},
{1, 150},
{0, 98},
{-1, 131},
{0, 117},
{1, 107},
{0, 150},
{-1, 88},
{0, 165},
{1, 68},
{0, 140},
{-1, 20},
};
/**
* 3
*/
static mode_info_t mode_3[49] = {
{-1, 19},
{0, 92},
{1, 19},
{0, 186},
{-1, 19},
{0, 229},
{1, 29},
{0, 206},
{-1, 39},
{0, 181},
{1, 49},
{0, 157},
{-1, 63},
{0, 138},
{1, 69},
{0, 69},
{-1, 83},
{0, 98},
{1, 89},
{0, 69},
{-1, 99},
{0, 53},
{1, 109},
{0, 29},
{-1, 119},
{0, 10},
{1, 133},
{0, 10},
{-1, 119},
{0, 29},
{1, 108},
{0, 49},
{-1, 103},
{0, 69},
{1, 88},
{0, 98},
{-1, 78},
{0, 73},
{1, 68},
{0, 137},
{-1, 58},
{0, 160},
{1, 49},
{0, 176},
{-1, 40},
{0, 209},
{1, 29},
{0, 228},
{-1, 20},
};
static uint32_t g_mode_level[SLEEP_MODE_LEVEL_NUM] = {50, 55, 60, 65, 70, 75, 80, 85, 90};
static int helper_start = 0;
//static beken_queue_t sleep_helper_msg_que = NULL;
static beken_queue_t sleep_helper_msg_que = NULL;
static beken_thread_t sleep_helper_thread_hdl = NULL;
static sleep_mode current_mode = SLEEP_MODE_OFF;
static sleep_model_level current_level = SLEEP_MODEL_LEVEL_1;
typedef struct
{
sleep_mode model;
sleep_mode mode;
sleep_model_level level;
} sleep_msg_t;
static void sleep_helper_thread(void *arg)
{
int mode_info_size = 0;
mode_info_t *set_mode = NULL;
while (helper_start)
{
LOGE("doing...\n");
for (int i = 0; i < 7; i++)
if(current_mode == SLEEP_MODE_1){
set_mode = model_1;
mode_info_size = sizeof(model_1)/sizeof(mode_info_t);
}
else if(current_mode == SLEEP_MODE_2){
set_mode = mode_2;
mode_info_size = sizeof(mode_2)/sizeof(mode_info_t);
}
else if(current_mode == SLEEP_MODE_3){
set_mode = mode_3;
mode_info_size = sizeof(mode_3)/sizeof(mode_info_t);
}
if (current_mode != SLEEP_MODE_OFF)
{
int dir = model_1[i].dir;
int delay = model_1[i].delay_ms;
sleep_mode do_mode = current_mode;
for (int i = 0; i < mode_info_size; i++)
{
if(!helper_start){
LOGE("exit!! \n");
break;
}
if(current_mode !=do_mode){
LOGE("change mode \n");
break;
}
int dir = set_mode[i].dir;
int delay = set_mode[i].delay_ms;
LOGE("dir:%d delay:%d\n", dir, delay);
// 设置方向
switch(dir){
switch (dir)
{
case 1:
bk_gpio_set_output_high(GPIO_44);
bk_gpio_set_output_low(GPIO_45);
@ -86,6 +223,26 @@ static void sleep_helper_thread(void *arg)
}
}
#if 0
sleep_msg_t msg;
bk_err_t ret = BK_OK;
ret = rtos_pop_from_queue(&sleep_helper_msg_que, &msg, BEKEN_WAIT_FOREVER);
if (kNoErr == ret)
{
LOGE("sleep_helper_thread: pop_from_queue \n");
if(msg.mode != current_mode){
current_mode = msg.mode;
sleep_helper_run_mode(msg.mode);
}
//if(msg.level != current_level){
// current_level = msg.level;
// sleep_helper_set_level(msg.level);
//}
}
//LOGE("doing...\n");
#endif
}
}
void sleep_helper_init(){
@ -98,17 +255,20 @@ void sleep_helper_init(){
bk_gpio_enable_output(45);
pwm_init_config_t config = {0};
config.period_cycle = 200;
config.duty_cycle = 100;
config.period_cycle = 100;
//默认初始化不输出波形
config.duty_cycle = 0;
//config.duty_cycle = g_mode_level[SLEEP_MODEL_LEVEL_1-1];
bk_pwm_init(pwm_chan, &config);
bk_pwm_start(pwm_chan);
}
void sleep_helper_set_mode(sleep_mode mode){
//model 1
helper_start = 1;
bk_err_t ret = BK_OK;
ret = rtos_init_queue(&sleep_helper_msg_que, "sleep_helper_msg_que", sizeof(sleep_msg_t), 2);
if (ret != kNoErr)
{
LOGE("create take_photo_msg queue fail\n");
}
ret = rtos_create_thread(&sleep_helper_thread_hdl,
9,
"sleep_helper",
@ -120,9 +280,129 @@ void sleep_helper_set_mode(sleep_mode mode){
sleep_helper_thread_hdl = NULL;
}
}
void sleep_helper_set_mode(sleep_mode mode){
current_mode = mode;
if (mode == SLEEP_MODE_OFF)
{
// 关闭睡眠仪
// 关闭PWM
bk_pwm_stop(pwm_chan);
// 关闭电源输出
bk_gpio_set_output_low(GPIO_44);
bk_gpio_set_output_low(GPIO_45);
}
/*
if (sleep_helper_msg_que)
{
sleep_msg_t msg;
msg.mode = mode;
rtos_push_to_queue(&sleep_helper_msg_que, &msg, BEKEN_NO_WAIT);
}*/
}
void sleep_helper_set_level(sleep_model_level level){
if(level>0 && level< 10){
current_level = level;
pwm_period_duty_config_t config = {0};
config.period_cycle = 100;
config.duty_cycle = g_mode_level[level-1];
LOGE("sleep_helper_set_level %d \n",g_mode_level[level-1]);
bk_pwm_set_period_duty(pwm_chan,&config);
}
void sleep_helper_deinit(){
}
cJSON* iot_sleep_helper_get_device_desc()
{
cJSON *sleep_helper_desc = cJSON_CreateObject();
cJSON_AddStringToObject(sleep_helper_desc, "name", IOT_SLEEP_HELPER_DEVICE_NAME);
cJSON_AddStringToObject(sleep_helper_desc, "description", "这是助眠仪(睡眠辅助仪器)");
cJSON *properties = cJSON_CreateObject();
//volume 属性
cJSON *mode = cJSON_CreateObject();
cJSON_AddStringToObject(mode, "description", "当前设备的模式");
cJSON_AddStringToObject(mode, "type", "number");
//添加brightness属性到properties
cJSON_AddItemToObjectCS(properties,"mode",mode);
//添加properties speaker_desc 描述
cJSON_AddItemToObjectCS(sleep_helper_desc,"properties",properties);
//定义方法methods
cJSON *methods = cJSON_CreateObject();
//设置模式的方法
cJSON *setMode = cJSON_CreateObject();
cJSON_AddStringToObject(setMode, "description", "设置助眠仪的工作模式");
cJSON *parameters = cJSON_CreateObject();
cJSON *p_mode = cJSON_CreateObject();
cJSON_AddStringToObject(p_mode, "type", "number");
cJSON_AddStringToObject(p_mode, "description", "0到3之间的整数 0代表关闭");
cJSON_AddItemToObjectCS(parameters,"mode",p_mode);
cJSON_AddItemToObjectCS(setMode,"parameters",parameters);
cJSON_AddItemToObjectCS(methods,IOT_SLEEP_HELPER_DEVICE_FUNS_SET_MODE,setMode);
//设置工作等级的方法
cJSON *setLevel = cJSON_CreateObject();
cJSON_AddStringToObject(setLevel, "description", "设置助眠仪的工作等级强度");
cJSON *parameters_set_level = cJSON_CreateObject();
cJSON *p_level = cJSON_CreateObject();
cJSON_AddStringToObject(p_level, "type", "number");
cJSON_AddStringToObject(p_level, "description", "1到9之间的整数");
cJSON_AddItemToObjectCS(parameters_set_level,"level",p_level);
cJSON_AddItemToObjectCS(setLevel,"parameters",parameters_set_level);
cJSON_AddItemToObjectCS(methods,IOT_SLEEP_HELPER_DEVICE_FUNS_SET_LEVEL,setLevel);
cJSON_AddItemToObjectCS(sleep_helper_desc,"methods",methods);
//打印一下描述
//char *json_desc = cJSON_Print(speaker_desc);
//LOGE("speaker_desc-->%s\n",json_desc);
//cJSON_Delete(speaker_desc);
return sleep_helper_desc;
}
void iot_sleep_helper_parser_invoke(char* cmd,char * paramters_json){
LOGE("iot_sleep_helper_parser_invoke :%s\n",paramters_json);
cJSON* params = cJSON_Parse(paramters_json);
if(params == NULL){
LOGE("params == NULL\n");
return;
}
//设置模式
if (strcmp(cmd, IOT_SLEEP_HELPER_DEVICE_FUNS_SET_MODE) == 0)
{
// {"mode": 60}
int mode = cJSON_GetObjectItem(params, "mode")->valueint;
LOGE("mode :%d\n",mode);
sleep_helper_set_mode(mode);
}
if (strcmp(cmd, IOT_SLEEP_HELPER_DEVICE_FUNS_SET_LEVEL) == 0)
{
// {"level": 60}
int level = cJSON_GetObjectItem(params, "level")->valueint;
LOGE("level :%d\n",level);
sleep_helper_set_level(level);
}
cJSON_Delete(params);
}
void sleep_helper_deinit(){
helper_start = 0;
bk_pwm_stop(pwm_chan);
bk_pwm_deinit(pwm_chan);
/* delete msg queue */
rtos_deinit_queue(&sleep_helper_msg_que);
sleep_helper_msg_que = NULL;
}

View File

@ -13,14 +13,19 @@ extern "C" {
#include "cJSON.h"
#define IOT_SLEEP_HELPER_DEVICE_NAME "sleep_helper"
#define IOT_SLEEP_HELPER_DEVICE_FUNS_SET_MODE "setMode"
#define IOT_SLEEP_HELPER_DEVICE_FUNS_SET_LEVEL "setLevel"
/**
* 3
*/
typedef enum sleep_mode
{
SLEEP_MODE_OFF = 0,
SLEEP_MODE_1 = 1,
SLEEP_MODE_2,
SLEEP_MODE_3,
SLEEP_MODE_2 = 2,
SLEEP_MODE_3 = 3,
} sleep_mode;
/**
@ -31,6 +36,12 @@ typedef enum sleep_level
SLEEP_MODEL_LEVEL_1 = 1,
SLEEP_MODEL_LEVEL_2,
SLEEP_MODEL_LEVEL_3,
SLEEP_MODEL_LEVEL_4,
SLEEP_MODEL_LEVEL_5,
SLEEP_MODEL_LEVEL_6,
SLEEP_MODEL_LEVEL_7,
SLEEP_MODEL_LEVEL_8,
SLEEP_MODEL_LEVEL_9,
} sleep_model_level;
typedef struct
@ -52,7 +63,7 @@ void sleep_helper_set_level(sleep_model_level level);
void sleep_helper_deinit();
cJSON * iot_sleep_helper_get_device_desc();
void iot_lamp_parser_invoke(char* cmd,char * paramters_json);
void iot_sleep_helper_parser_invoke(char* cmd,char * paramters_json);
#ifdef __cplusplus
}
#endif

View File

@ -34,7 +34,7 @@ void thing_init()
#ifdef IOT_SLEEP_HELPER
sleep_helper_init();
sleep_helper_set_mode(SLEEP_MODE_1);
//sleep_helper_set_mode(SLEEP_MODE_1);
#endif
}
@ -61,6 +61,12 @@ cJSON* thing_gen_iot_descriptors(char *session_id)
cJSON_AddItemToArray(descriptorArray, speaker_desc);
#endif
#ifdef IOT_SLEEP_HELPER
cJSON* sleep_helper_desc = iot_sleep_helper_get_device_desc();
cJSON_AddItemToArray(descriptorArray, sleep_helper_desc);
#endif
cJSON_AddItemToObject(messageRoot, "descriptors", descriptorArray);
return messageRoot;
}
@ -112,6 +118,12 @@ void thing_iot_invoke(char *iot_json){
{
iot_speaker_parser_invoke(method,str_parameters);
}
//睡眠仪指令
if (strcmp(name, IOT_SLEEP_HELPER_DEVICE_NAME) == 0)
{
iot_sleep_helper_parser_invoke(method,str_parameters);
}
}
// 释放内存
cJSON_Delete(iot_invoke);