完善助眠仪功能 支持大模型控制
This commit is contained in:
parent
5d9bec2139
commit
ce728f5362
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user