diff --git a/bk_aidk/projects/beken_wss_paopao/main/iot/iot_sleep_helper.c b/bk_aidk/projects/beken_wss_paopao/main/iot/iot_sleep_helper.c index 42320fdb..68bd0b4b 100755 --- a/bk_aidk/projects/beken_wss_paopao/main/iot/iot_sleep_helper.c +++ b/bk_aidk/projects/beken_wss_paopao/main/iot/iot_sleep_helper.c @@ -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,45 +36,181 @@ 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; - LOGE("dir:%d delay:%d\n", dir, delay); - //设置方向 - switch(dir){ + 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) + { case 1: bk_gpio_set_output_high(GPIO_44); bk_gpio_set_output_low(GPIO_45); break; - case 0: + case 0: bk_gpio_set_output_low(GPIO_44); bk_gpio_set_output_low(GPIO_45); break; @@ -81,9 +218,29 @@ static void sleep_helper_thread(void *arg) bk_gpio_set_output_low(GPIO_44); bk_gpio_set_output_high(GPIO_45); break; + } + rtos_delay_milliseconds(delay); } - rtos_delay_milliseconds(delay); } + +#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 } } @@ -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_level(sleep_model_level level){ - + +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; } \ No newline at end of file diff --git a/bk_aidk/projects/beken_wss_paopao/main/iot/iot_sleep_helper.h b/bk_aidk/projects/beken_wss_paopao/main/iot/iot_sleep_helper.h index 0459c6c6..4e8c85a6 100755 --- a/bk_aidk/projects/beken_wss_paopao/main/iot/iot_sleep_helper.h +++ b/bk_aidk/projects/beken_wss_paopao/main/iot/iot_sleep_helper.h @@ -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_1 = 1, - SLEEP_MODE_2, - SLEEP_MODE_3, + SLEEP_MODE_OFF = 0, + SLEEP_MODE_1 = 1, + 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 diff --git a/bk_aidk/projects/beken_wss_paopao/main/iot/thing.c b/bk_aidk/projects/beken_wss_paopao/main/iot/thing.c index ab53f05d..707d7c76 100755 --- a/bk_aidk/projects/beken_wss_paopao/main/iot/thing.c +++ b/bk_aidk/projects/beken_wss_paopao/main/iot/thing.c @@ -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 } @@ -55,12 +55,18 @@ cJSON* thing_gen_iot_descriptors(char *session_id) cJSON_AddItemToArray(descriptorArray, lamp_desc); #endif - #ifdef IOT_SPEAKER + #ifdef IOT_SPEAKER cJSON* speaker_desc = iot_speaker_get_device_desc(); //cJSON_AddItemToArray(descriptorArray, cJSON_Duplicate(descriptor, 1)); 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);