From: p15692025051 <846603105@qq.com> Date: Fri, 22 Dec 2023 03:14:41 +0000 (+0800) Subject: 新增k18hsensor驱动 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=c742e1fd2b51928771ded98175b94251aa8f4f85;p=mirrors%2FASR3603_Z5.git 新增k18hsensor驱动 增加跌倒报警接口 合并更新dm库 Z12摄像头优化 --- diff --git a/2.sdk/project/Z5_HA_K18/product/craneg_modem/config/watch/lv_drv_conf_CUSTOM.h b/2.sdk/project/Z5_HA_K18/product/craneg_modem/config/watch/lv_drv_conf_CUSTOM.h index 41841ec2..73933f19 100644 --- a/2.sdk/project/Z5_HA_K18/product/craneg_modem/config/watch/lv_drv_conf_CUSTOM.h +++ b/2.sdk/project/Z5_HA_K18/product/craneg_modem/config/watch/lv_drv_conf_CUSTOM.h @@ -557,9 +557,12 @@ #endif #ifndef USE_HX3918 -#define USE_HX3918 1 +#define USE_HX3918 0 +#endif +//ºã°®ÑªÑ¹Ë㷨ģ×é +#ifndef USE_FR8012HAQ +#define USE_FR8012HAQ 1 #endif - #ifndef USE_WMM300 #define USE_WMM300 0 #endif diff --git a/2.sdk/sdk/gui/lv_drivers/CMakeLists.txt b/2.sdk/sdk/gui/lv_drivers/CMakeLists.txt index cc5bb17c..7e64cbbc 100644 --- a/2.sdk/sdk/gui/lv_drivers/CMakeLists.txt +++ b/2.sdk/sdk/gui/lv_drivers/CMakeLists.txt @@ -88,6 +88,8 @@ set(lv_drivers_sources indev/HX3918/hx3918_prox.c indev/HX3918/hx3918_spo2_agc.c + indev/FR8012HAQ/fr8012haq.c + indev/WMM300/alg_example.c indev/WMM300/alg_port.c diff --git a/2.sdk/sdk/gui/lv_drivers/indev/FR8012HAQ/fr8012haq.c b/2.sdk/sdk/gui/lv_drivers/indev/FR8012HAQ/fr8012haq.c new file mode 100644 index 00000000..be40eb9b --- /dev/null +++ b/2.sdk/sdk/gui/lv_drivers/indev/FR8012HAQ/fr8012haq.c @@ -0,0 +1,841 @@ + + + +#include "lv_drv_conf_CUSTOM.h" +#if USE_FR8012HAQ + +#include +#include +#include +#include +#include +#include "fr8012haq.h" + +#include "../../board.h" +#include "../../common/i2c.h" +#include "../../../../product/craneg_modem/framework/inc/gpio_api.h" +#include "lvgl/hal/hal.h" +#include "../../../lv_watch/app_adaptor/app_sensor_task.h" +//#include "osa.h" +#include "../../../../product/craneg_modem/pcac/httpclient/inc/libhttpclient.h" +//#include "libhttpclient.h" +//#include "../../../../product/craneg_modem/pcac/httpclient/inc/httpclient_sys.h" + +char fr8012haq_ppg_timerout_flag = 0; +static void * fr8012haq_ppg_timer = NULL; + +char fr8012haq_agc_timerout_flag = 0; +static void * fr8012haq_agc_timer = NULL; +/************************simware add start***********************************/ +/************************simware add start***********************************/ +static uint32_t fr8012haq_mfp_cfgs[] = { + MFP_REG(GPIO_32) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, + MFP_REG(GPIO_18) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, + MFP_REG(GPIO_81) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, + MFP_REG(GPIO_84) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, + MFP_REG(GPIO_16) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, + MFP_EOC +}; + +typedef void* OS_HISR; +static OS_HISR fr8012haq_hisr_ref; + + +static unsigned char is_FR8012HAQ = 0;//是否存在IC +static unsigned char is_open_FR8012HAQ = 0; //是否打开测试 +static unsigned char s_FR8012HAQ_heart_rate = 0x0;//心律 +static unsigned char s_FR8012HAQ_high_blood = 0x0;//血压/高压 +static unsigned char s_FR8012HAQ_low_blood = 0x0;//血压/低压 +static unsigned char s_FR8012HAQ_blood_oxygen = 0x0;//血氧 +static unsigned char s_FR8012HAQ_HRV = 0x0;//hrv +unsigned char s_FR8012HAQ_wear_status = 1;//佩戴状态 +static float temp = 0.00; +#define HEART_RATE_BUFF_LEN 10 +unsigned char s_FR8012HAQ_heart_rate_buff[HEART_RATE_BUFF_LEN]={0}; +unsigned short s_FR8012HAQ_heart_rate_buff_count = 0; +uint32_t FR8012HAQ_run_mode = NULL_MODE; +uint32_t FR8012HAQ_jobs_mode = NULL_MODE; +int ir_wear = 0;//红外佩戴状态 +int cap_wear = 1;//电容佩戴状态 +char is_open_sar = 1;//是否打开sar检测 +static void DelayInUs(unsigned int us); +void FR8012HAQ_close(void); +TASK_HANDLE * Hsensor_task_id; +//字符串里查找最近一个c字符,返回偏移位置 +unsigned int find_c(char *data,char c) +{ + unsigned char count = 0; + while(data[count]) + { + if(data[count] == c) + return count; + count++; + if(count > 65532) + return 0; + } +} +static void fr8012haq_en_gpio_init(void) +{ + gpio_set_direction(GPIO18, GPIO_OUT); + gpio_set_direction(GPIO81, GPIO_OUT); + gpio_set_direction(GPIO84, GPIO_OUT); + gpio_set_direction(GPIO16, GPIO_OUT); + +} +void fr8012haq_delay(uint32_t ms) +{ + // INT32 cnt = 0x29F9; //uart_log cal as: 1ms + // volatile INT32 i = 0; + + // for(;ms != 0; ms--){ + // i = cnt; + // for(;i != 0; i--); + // } + ms = ms/4+1; + UOS_SleepMs(ms); +} + +//Hsensor 电源、复位 +static void fr8012haq_en_gpio_enable(bool param) +{ + static flag = 0; + if(param) + flag++; + else + { + if(flag > 0) + flag --; + } + + if(flag > 0) { + gpio_set_value(GPIO18, GPIO_HIGH); + gpio_set_value(GPIO81, GPIO_HIGH); + gpio_set_value(GPIO84, GPIO_LOW); + gpio_set_value(GPIO16, GPIO_HIGH); + //gpio_set_value(GPIO7, GPIO_LOW); + // while(1) + // { + // UOS_SleepMs(1000); + + // FR8012HAQ_LOG("fr8012haq_en_gpio_enable2!!!!\n\n"); + // } + } else { + gpio_set_value(GPIO18, GPIO_LOW); + gpio_set_value(GPIO81, GPIO_LOW); + //gpio_set_value(GPIO7, GPIO_LOW); + // gpio_set_value(GPIO84, GPIO_LOW); + } +} +static char * response_data = NULL; +static int response_len = 0; + +/* +data: the data is received http context data +len: the length of http context data +num: the http response header "Content-Length" value +cbdata: user private data +*/ +static void response_cb(char * data, int len, int num, void *cbdata) +{ + char * temp; + char *private_data=(char *)cbdata; + + //FR8012HAQ_LOG("[http_client_test]Get private_data %s\n", private_data); + + FR8012HAQ_LOG("[http_client_test]Get data %d\n", len); + + temp = (void*)malloc(response_len + len); + if (!temp) { + FR8012HAQ_LOG("[http_client_test]Malloc failed...\n"); + return; + } + memset(temp, 0, response_len + len); + if (response_data) { + memcpy(temp, response_data, response_len); + free(response_data); + } + memcpy(&temp[response_len], data, len); + response_data = temp; + response_len += len; +} +http_client * fr8012haq_client = NULL; +static void * fr8012haq_http_post_json_timer = NULL; +void fr8012haq_http_post_json_cb(unsigned int p) +{ + if(fr8012haq_client!=NULL) + http_client_stop(fr8012haq_client); + uos_timer_stop(fr8012haq_http_post_json_timer); + +} +int fr8012haq_http_post_json(char *url,char *post_data,char *read_buf,unsigned int read_buf_max,unsigned int timeout) +{ + int response_code= 0; + int ret = 0; + struct http_client_list * header = NULL; + if (fr8012haq_client != NULL) + return -2; + if(fr8012haq_http_post_json_timer == NULL ) + uos_timer_create(&fr8012haq_http_post_json_timer); + + uos_timer_start(fr8012haq_http_post_json_timer, MS_TO_TICKS(timeout), MS_TO_TICKS(timeout), fr8012haq_http_post_json_cb, NULL); + + fr8012haq_client = http_client_init(); + http_client_setopt(fr8012haq_client, HTTPCLIENT_OPT_URL, url); /*set URL:support http/https and ip4/ip6*/ + http_client_setopt(fr8012haq_client, HTTPCLIENT_OPT_HTTP1_0, 0); /*"0" is HTTP 1.1, "1" is HTTP 1.0*/ + http_client_setopt(fr8012haq_client, HTTPCLIENT_OPT_RESPONSECB, response_cb); /*response callback*/ + //http_client_setopt(fr8012haq_client, HTTPCLIENT_OPT_RESPONSECB_DATA, private_data); /*set user private data,*/ + http_client_setopt(fr8012haq_client, HTTPCLIENT_OPT_METHOD, HTTPCLIENT_REQUEST_POST); /*set method,support GET/POST/PUT*/ + http_client_setopt(fr8012haq_client, HTTPCLIENT_OPT_POSTDATA, post_data); /*post data is http context*/ + http_client_setopt(fr8012haq_client, HTTPCLIENT_OPT_POSTLENGTH, strlen(post_data)); /*http context length*/ + header = http_client_list_append(header, "Content-Type: application/json\r\n"); + header = http_client_list_append(header, "Accept: */*\r\n"); + http_client_setopt(fr8012haq_client, HTTPCLIENT_OPT_HTTPHEADER, header); + http_client_getinfo(fr8012haq_client, HTTPCLIENT_GETINFO_TCP_STATE, &response_code); + if(response_code != HTTP_TCP_ESTABLISHED){ + FR8012HAQ_LOG("fr8012haq_http_post_json:http tcp not connecting\n"); + ret = -1; + goto EXIT; + } + response_code=http_client_perform(fr8012haq_client); /*execute http send and recv*/ + if(response_code != HTTP_CLIENT_OK){ + FR8012HAQ_LOG("[http_client_test]http perform have some wrong[%d]\n",response_code); + ret = -1; + goto EXIT; + } + http_client_getinfo(fr8012haq_client, HTTPCLIENT_GETINFO_RESPONSE_CODE, &response_code); + if (response_code != 200 && response_code != 204) { + FR8012HAQ_LOG("[http_client_test]response is not 'HTTP OK'(%d)\n", response_code); + } + int read_buf_len = 0; + if(response_len>=read_buf_max) + read_buf_len = read_buf_max-1; + else + read_buf_len = response_len; + memcpy(read_buf,response_data,read_buf_len); + read_buf[read_buf_len] = 0; + FR8012HAQ_LOG("fr8012haq_http_post_json:Get total data len:%d\n", response_len); + FR8012HAQ_LOG("fr8012haq_http_post_json:response_data %s\n",read_buf); + uos_timer_stop(fr8012haq_http_post_json_timer);//获取数据成功,关闭定时器 +EXIT: + if (header) { + http_client_list_destroy(header); + header = NULL; + } + if(fr8012haq_client) + { + http_client_shutdown(fr8012haq_client); + fr8012haq_client = NULL; + } + if (response_data) + free(response_data); + response_data = NULL; + response_len = 0; + return ret; +} +static void fr8012haq_task_callback(VOID * argv) +{ + //sensor_task_send_message(FR8012HAQ_ID,SENSOR_MSG_PROCESS_DATA); + //mfp_config(uart4_pin_mfp_cfgs); + int response_code,trynum=0; + struct http_client * client = NULL; + struct http_client_list * header = NULL; + + //char data[500]= {0}; + int len = 0; + //uart4_debug(); + char post_data[] ="{\"app_key\": \"1db74281ece314ba6bbc2b553222cd84\",\"name\": \"RH303\",\"firm\": \"魔方\",\"mac\": \"DA:19:72:F3:0A:89\",\"model\": \"T11\",\"sensor\": {\"model\": \"VP60\",\"fs\": 81},\"sinklib_version\": \"v0.3.0.072522\",\"request_code\":\"6+m78fFJkFKu1mzhhL4jKRJTEhJMwvSJFlJhWIgRC8wfyB0HFw8JMURNQ6c3MP/U\"}" ; + char *read_buff = (void*)malloc(2000); + if(!read_buff) + return ; + while(1) + { + + UOS_SleepMs(5000); + + //fr8012haq_http_post_json("http://test.aicaring.com/api/v0/sinklib/activation",post_data,read_buff,2000,10000); + + // FR8012HAQ_LOG("fr8012haq_task_callback1!!!!\n"); + // client = http_client_init(); + // http_client_setopt(client, HTTPCLIENT_OPT_URL, "http://test.aicaring.com/api/v0/sinklib/activation"); /*set URL:support http/https and ip4/ip6*/ + // http_client_setopt(client, HTTPCLIENT_OPT_HTTP1_0, 0); /*"0" is HTTP 1.1, "1" is HTTP 1.0*/ + + // http_client_setopt(client, HTTPCLIENT_OPT_RESPONSECB, response_cb); /*response callback*/ + // //http_client_setopt(client, HTTPCLIENT_OPT_RESPONSECB_DATA, private_data); /*set user private data,*/ + // http_client_setopt(client, HTTPCLIENT_OPT_METHOD, HTTPCLIENT_REQUEST_POST); /*set method,support GET/POST/PUT*/ + // http_client_setopt(client, HTTPCLIENT_OPT_POSTDATA, post_data); /*post data is http context*/ + // http_client_setopt(client, HTTPCLIENT_OPT_POSTLENGTH, strlen(post_data)); /*http context length*/ + // //http_client_setopt(client, HTTPCLIENT_OPT_AUTH_TYPE, HTTP_AUTH_TYPE_BASE); /*auth type support base and digest*/ + // // http_client_setopt(client, HTTPCLIENT_OPT_AUTH_USERNAME, "admin"); /*username*/ + // // http_client_setopt(client, HTTPCLIENT_OPT_AUTH_PASSWORD, "admin"); /*password*/ + + // // Add private HTTP header + // header = http_client_list_append(header, "Content-Type: application/json\r\n"); + // header = http_client_list_append(header, "Accept: */*\r\n"); + // FR8012HAQ_LOG("fr8012haq_task_callback2!!!!\n"); + // /*set http private header,our http stack already support Referer/Host/Authorization/User-Agent/Connection/cookie/Content-Length, + // this header is other http header,ex: Content-Type..., we call it private header,*/ + // http_client_setopt(client, HTTPCLIENT_OPT_HTTPHEADER, header); + // FR8012HAQ_LOG("fr8012haq_task_callback3!!!!\n"); + // http_client_getinfo(client, HTTPCLIENT_GETINFO_TCP_STATE, &response_code); + // FR8012HAQ_LOG("fr8012haq_task_callback4!!!!\n"); + // FR8012HAQ_LOG("[http_client_test]Get tcp state %d\n", response_code); + + // if(response_code != HTTP_TCP_ESTABLISHED){ + // FR8012HAQ_LOG("[http_client_test]http tcp not connecting\n"); + // http_client_shutdown(client); /*release http resources*/ + // //client = http_client_init(); + // continue; + // } + + + // response_code=http_client_perform(client); /*execute http send and recv*/ + // if(response_code != HTTP_CLIENT_OK){ + // FR8012HAQ_LOG("[http_client_test]http perform have some wrong[%d]\n",response_code); + // http_client_shutdown(client); /*release http resources*/ + // //client = http_client_init(); + // continue; + // } + // FR8012HAQ_LOG("fr8012haq_task_callback5!!!!\n"); + // http_client_getinfo(client, HTTPCLIENT_GETINFO_RESPONSE_CODE, &response_code); + // if (response_code != 200 && response_code != 204) { + // FR8012HAQ_LOG("[http_client_test]response is not 'HTTP OK'(%d)\n", response_code); + // } + // FR8012HAQ_LOG("fr8012haq_task_callback6!!!!\n"); + // FR8012HAQ_LOG("[http_client_test]Get total data %d\n", response_len); + // FR8012HAQ_LOG("[http_client_test]response_data %s\n",response_data); + // UOS_SleepMs(500); + // if (response_data) free(response_data); + // response_data = NULL; + // response_len = 0; + + // //FR8012HAQ_LOG("[http_client_test]free(response_data)\n"); + // // Free private HTTP header + // if (header) { + // http_client_list_destroy(header); + // header = NULL; + // } + // //FR8012HAQ_LOG("[http_client_test]http_client_list_destroy(header)\n"); + // http_client_shutdown(client); /*release http resources*/ + // FR8012HAQ_LOG("fr8012haq_task_callback7!!!!\n"); + // //FR8012HAQ_LOG("[http_client_test]http_client_shutdown(client)\n"); + UOS_SleepMs(2000); + //uart4_send_data("UART4:1111!!!!!!!\n",sizeof("UART4:1111!!!!!!!\n")); + // len =uart4_recv_data(data,sizeof(data),64); + // if(len) + // FR8012HAQ_LOG("UART4:len:%d str:%s\n",len,data); + //uart4_send_data("UART4:1111!!!!!!!\n",sizeof("UART4:1111!!!!!!!\n")); + } +} +static void fr8012haq_hisr_callback(void) +{ + sensor_task_send_message(FR8012HAQ_ID,SENSOR_MSG_PROCESS_DATA); +} +static void fr8012haq_create_hisr(void) +{ + Hsensor_task_id = uos_create_task(fr8012haq_task_callback, NULL, 64, 8*1024, 202, "Hsensor_task"); + //cplog_printf("fr8012haq_create_hisr:Hsensor_task_id:%d!!\n",Hsensor_task_id); + OS_Create_HISR(&fr8012haq_hisr_ref,"fr8012haq_hisr", fr8012haq_hisr_callback, HISR_PRIORITY_2); + // OS_Activate_HISR(&fr8012haq_hisr_ref); +} + +static void * fr8012haq_timer = NULL; +void fr8012haq_timerout_cb(void) +{ + FR8012HAQ_LOG("fr8012haq_timerout_cb\n"); + OS_Activate_HISR(&fr8012haq_hisr_ref); +} +void fr8012haq_timer_cfg(bool en) //320ms +{ + FR8012HAQ_LOG("fr8012haq_timer_cfg :%d!!!!!!\n\n",en); + if(en) + { + if(fr8012haq_timer == NULL ) + uos_timer_create(&fr8012haq_timer); + //fr8012haq_timer = Helios_Timer_init( (void* )fr8012haq_timerout_cb, NULL); + if(FR8012HAQ_jobs_mode == WEAR_MODE) + { + + uos_timer_start(fr8012haq_timer, MS_TO_TICKS(3000), MS_TO_TICKS(3000), fr8012haq_timerout_cb, NULL); + //Helios_Timer_Start(fr8012haq_timer, 3000, 1); + //Helios_Timer_Start(fr8012haq_timer, 320, 1); + }else + { + + uos_timer_start(fr8012haq_timer, MS_TO_TICKS(1000), MS_TO_TICKS(1000), fr8012haq_timerout_cb, NULL); + } + + //Helios_Timer_Start(fr8012haq_timer, 320, 1); + + } + else + { + if(fr8012haq_timer) + { + FR8012HAQ_LOG("fr8012haq_timer_cfg Timer_Stop\n\n"); + uos_timer_stop(fr8012haq_timer); + //Helios_Timer_Stop(fr8012haq_timer); + } + } + +} +/* Timer0_0 is configured to free run @1MHz from BootROM. */ +static void DelayInUs(unsigned int us) +{ + unsigned long startTime, endTime; + Timer0_Switch(1); + startTime = GetTimer0CNT(); + do + { + endTime = GetTimer0CNT(); + } + while(Timer0IntervalInMicro(startTime, endTime) < us); +} +void FR8012HAQ_test(uint32_t mode) +{ + s_FR8012HAQ_heart_rate = 0x0; + s_FR8012HAQ_heart_rate_buff_count = 0; + s_FR8012HAQ_high_blood = 0x0; + s_FR8012HAQ_low_blood = 0x0; + s_FR8012HAQ_HRV = 0; + //s_FR8012HAQ_wear_status = 0; + s_FR8012HAQ_blood_oxygen = 0x0; + FR8012HAQ_LOG("FR8012HAQ_test1:%d!!!!\n\n",mode); + if(mode <= close_MODE) + { + + switch (mode) + { + case HRS_MODE: + /* code */ + uart4_send_data("{\"cmd\":\"1\",\"work_mode\":\"hrs\"}",sizeof("{\"cmd\":\"1\",\"work_mode\":\"hrs\"}")); + break; + case SPO2_MODE: + /* code */ + uart4_send_data("{\"cmd\":\"1\",\"work_mode\":\"spo2\"}",sizeof("{\"cmd\":\"1\",\"work_mode\":\"spo2\"}")); + break; + case BP_MODE: + /* code */ + uart4_send_data("{\"cmd\":\"1\",\"work_mode\":\"bp\"}",sizeof("{\"cmd\":\"1\",\"work_mode\":\"bp\"}")); + break; + case WEAR_MODE: + /* code */ + uart4_send_data("{\"cmd\":\"1\",\"work_mode\":\"wear\"}",sizeof("{\"cmd\":\"1\",\"work_mode\":\"wear\"}")); + break; + case HRV_MODE: + /* code */ + uart4_send_data("{\"cmd\":\"1\",\"work_mode\":\"hrv\"}",sizeof("{\"cmd\":\"1\",\"work_mode\":\"hrv\"}")); + break; + // case YYL_MODE: + // /* code */ + // uart4_send_data("{\"cmd\":\"1\",\"work_mode\":\"yyl\"}",sizeof("{\"cmd\":\"1\",\"work_mode\":\"yyl\"}")); + // break; + default: + break; + } + } + fr8012haq_timer_cfg(true); + + FR8012HAQ_LOG("FR8012HAQ_test2:%d!!!!\n\n",mode); +} +static void fr8012haq_start(void) +{ + FR8012HAQ_LOG("fr8012haq_start:FR8012HAQ_run_mode:%d\n",FR8012HAQ_run_mode); + Timer0_Switch(1); + + hal_fr8012haq_int_init(); + FR8012HAQ_restart(); + if(FR8012HAQ_jobs_mode != NULL_MODE)//没关闭就打开其他模式,先关闭一次 + { + // FR8012HAQ_close(); + // fr8012haq_delay(20); + // FR8012HAQ_jobs_mode = NULL_MODE; + } + // else + // FR8012HAQ_restart(); + + FR8012HAQ_test(FR8012HAQ_run_mode); + FR8012HAQ_jobs_mode = FR8012HAQ_run_mode; + FR8012HAQ_run_mode = NULL_MODE; + + // hal_gh30x_int_init(); + // fr8012haq_en_gpio_enable(false); + // DelayInUs(10*1000); + // fr8012haq_en_gpio_enable(true); + // DelayInUs(50*1000); + // int ret = gh30x_module_init(); + + + //gh30x_module_start_without_adt(measure_mode); +} + +static void fr8012haq_stop(void) +{ + FR8012HAQ_LOG("[%s][%d]: \n", __FUNCTION__, __LINE__); + //gh30x_module_stop(); + + //fr8012haq_en_gpio_enable(false); + FR8012HAQ_close(); + //FR8012HAQ_LOG("FR8012HAQ_irq_cb: 1111111111111!!!!!!!!\r\n"); + FR8012HAQ_run_mode = NULL_MODE; + FR8012HAQ_jobs_mode = NULL_MODE; + fr8012haq_ppg_timerout_flag = 0; + fr8012haq_agc_timerout_flag = 0; + Timer0_Switch(0); + +} +//解析数据 +void fr8012haq_analysis_data(char *data,unsigned int len) +{ + char *tem_data = NULL; + char num_buf[20] = {0}; + unsigned char num_buf_len = 0; + /*心率*/ + tem_data = strstr(data,"\"hrs_data\":\""); + if(tem_data) + { + + unsigned char hrs = 0; + tem_data += strlen("\"hrs_data\":\""); + num_buf_len = find_c(tem_data,'\"'); + if(num_buf_len>=sizeof(num_buf)) + num_buf_len = sizeof(num_buf)-1; + memcpy(num_buf,tem_data,num_buf_len); + hrs = atoi(num_buf); + FR8012HAQ_result_set_heart_rate(hrs); + } + /*血氧*/ + tem_data = strstr(data,"\"spo2_data\":\""); + if(tem_data) + { + + unsigned char spo2 = 0; + tem_data += strlen("\"spo2_data\":\""); + num_buf_len = find_c(tem_data,'\"'); + if(num_buf_len>=sizeof(num_buf)) + num_buf_len = sizeof(num_buf)-1; + memcpy(num_buf,tem_data,num_buf_len); + spo2 = atoi(num_buf); + FR8012HAQ_result_set_blood_oxygen(spo2); + } + /*血压*/ + tem_data = strstr(data,"\"bp_data\":\""); + if(tem_data) + { + + unsigned char spo2 = 0; + tem_data += strlen("\"spo2_data\":\""); + num_buf_len = find_c(tem_data,'\"'); + if(num_buf_len>=sizeof(num_buf)) + num_buf_len = sizeof(num_buf)-1; + memcpy(num_buf,tem_data,num_buf_len); + spo2 = atoi(num_buf); + FR8012HAQ_result_set_blood_oxygen(spo2); + } + /*体温*/ + tem_data = strstr(data,"\"temper_data\":\""); + if(tem_data) + { + + //unsigned char hrs = 0; + tem_data += strlen("\"temper_data\":\""); + num_buf_len = find_c(tem_data,'\"'); + if(num_buf_len>=sizeof(num_buf)) + num_buf_len = sizeof(num_buf)-1; + memcpy(num_buf,tem_data,num_buf_len); + temp = atof(num_buf); + } + /*佩戴*/ + tem_data = strstr(data,"\"wear_data\":\""); + if(tem_data) + { + + //unsigned char hrs = 0; + tem_data += strlen("\"wear_data\":\""); + if(*tem_data == '0') + { + FR8012HAQ_result_set_wear_status(0); + }else + { + FR8012HAQ_result_set_wear_status(1); + } + } +} +#define UART4_BUF_LEN 2*1024 +void fr8012haq_process_data(uint32_t *process_data) +{ + // char data[500] = {0}; + unsigned int len = 0; + Timer0_Switch(1); + void *data = malloc(UART4_BUF_LEN); + if(data == NULL) + return; + memset(data,0,UART4_BUF_LEN); + FR8012HAQ_LOG("fr8012haq_process_data:%d!!!!\n\n",FR8012HAQ_jobs_mode); + switch (FR8012HAQ_jobs_mode) + { + case HRS_MODE: + /* code */ + uart4_send_data("{\"cmd\":\"2\",\"get_data\":\"hrs\"}",sizeof("{\"cmd\":\"2\",\"get_data\":\"hrs\"}")); + break; + case SPO2_MODE: + /* code */ + uart4_send_data("{\"cmd\":\"2\",\"get_data\":\"spo2\"}",sizeof("{\"cmd\":\"2\",\"get_data\":\"spo2\"}")); + break; + case BP_MODE: + /* code */ + uart4_send_data("{\"cmd\":\"2\",\"get_data\":\"bp\"}",sizeof("{\"cmd\":\"2\",\"get_data\":\"bp\"}")); + break; + case WEAR_MODE: + /* code */ + uart4_send_data("{\"cmd\":\"2\",\"get_data\":\"wear\"}",sizeof("{\"cmd\":\"2\",\"get_data\":\"wear\"}")); + break; + case HRV_MODE: + /* code */ + uart4_send_data("{\"cmd\":\"2\",\"get_data\":\"hrv\"}",sizeof("{\"cmd\":\"2\",\"get_data\":\"hrv\"}")); + break; + // case YYL_MODE: + // /* code */ + // uart4_send_data("{\"cmd\":\"2\",\"get_data\":\"yyl\"}",sizeof("{\"cmd\":\"2\",\"get_data\":\"yyl\"}")); + // break; + default: + break; + } + FR8012HAQ_LOG("fr8012haq_process_data2:%d!!!!\n\n",FR8012HAQ_jobs_mode); + len =uart4_recv_data(data,UART4_BUF_LEN,10000); + if(len) + { + FR8012HAQ_LOG("UART4:len:%d str:%s",len,data); + //char *data_tmp = (char *)data+128; + FR8012HAQ_LOG("%s\n", (char *)data+110); + fr8012haq_analysis_data(data,len); + //UOS_SleepMs(100); + } + + + free(data); +} +void hal_fr8012haq_int_init(void) +{ + // code implement by user + // must register func hal_gh30x_int_handler as callback + Timer0_Switch(1); + mfp_config(fr8012haq_mfp_cfgs); + fr8012haq_en_gpio_init(); + FR8012HAQ_LOG("FR8012HAQ ID : 0x%02x\n",get_fr8012haq_id()); + +} +void Fr8012haq_Init(void) +{ + //char data[100]= {0}; + //int len = 0; + Timer0_Switch(1); + FR8012HAQ_LOG("Fr8012haq_Init1!!!!\n\n"); + static bool register_dev_flag = false; + if(!register_dev_flag) + { + register_dev_flag = true; + sensor_drv_t sensor_drv; + sensor_drv.sensor_name = "fr8012haq"; + sensor_drv.sensor_start = fr8012haq_start; + sensor_drv.sensor_stop = fr8012haq_stop; + sensor_drv.sensor_process_data = fr8012haq_process_data; + sensor_drv_register(FR8012HAQ_ID,&sensor_drv); + FR8012HAQ_LOG("Fr8012haq_Init1.1!!!!\n\n"); + } + FR8012HAQ_LOG("Fr8012haq_Init2!!!!\n\n"); + fr8012haq_create_hisr(); + FR8012HAQ_LOG("Fr8012haq_Init3!!!!\n\n"); + hal_fr8012haq_int_init(); + FR8012HAQ_LOG("Fr8012haq_Init4!!!!\n\n"); + FR8012HAQ_restart(); + uart4_debug(); + // while(1) + // { + // UOS_SleepMs(1000); + // FR8012HAQ_LOG("Fr8012haq_Init5!!!!\n\n"); + // } + //fr8012haq_init(WEAR_MODE);//打开佩戴检测 + +} + +uint8_t get_fr8012haq_id(void) +{ + uint8_t fr8012haq_chip_id = 0; + fr8012haq_en_gpio_enable(true); + fr8012haq_delay(50); + //fr8012haq_write_reg(0x01, 0x00); + fr8012haq_delay(5); + //fr8012haq_chip_id = fr8012haq_read_reg(0x00); + fr8012haq_en_gpio_enable(false); + return fr8012haq_chip_id; +} + +static bool is_measuring_flag = false; +void fr8012haq_measure_hr_start(void) +{ + sys_pm_wakeup_no_lcd(); + + + FR8012HAQ_run_mode = BP_MODE; + FR8012HAQ_LOG("fr8012haq_measure_hr_start :FR8012HAQ_run_mode:%d!!!!!!!!\n",FR8012HAQ_run_mode); + sensor_task_send_message(FR8012HAQ_ID,SENSOR_MSG_START); +} + +void fr8012haq_measure_bo_start(void) +{ + sys_pm_wakeup_no_lcd(); + FR8012HAQ_run_mode = SPO2_MODE; + FR8012HAQ_LOG("fr8012haq_measure_bo_start :FR8012HAQ_run_mode:%d!!!!!!!!\n",FR8012HAQ_run_mode); + sensor_task_send_message(FR8012HAQ_ID,SENSOR_MSG_START); +} + +void fr8012haq_measure_bp_start(void) +{ + sys_pm_wakeup_no_lcd(); + FR8012HAQ_run_mode = BP_MODE ; + FR8012HAQ_LOG("fr8012haq_measure_bp_start :FR8012HAQ_run_mode:%d!!!!!!!!\n",FR8012HAQ_run_mode); + sensor_task_send_message(FR8012HAQ_ID,SENSOR_MSG_START); +} + +void FR8012HAQ_restart(void) +{ + fr8012haq_en_gpio_enable(false); + fr8012haq_delay(50); + fr8012haq_en_gpio_enable(true); + fr8012haq_delay(50); +} +void fr8012haq_measure_stop(void) +{ + FR8012HAQ_LOG("fr8012haq_measure_stop !!!!!!!!\n"); + FR8012HAQ_run_mode = close_MODE; + sensor_task_send_message(FR8012HAQ_ID,SENSOR_MSG_STOP); +} +void FR8012HAQ_close(void) +{ + FR8012HAQ_LOG("FR8012HAQ_close !!!!!!!!\n"); + watch_set_sleep_lcd_only(false); + is_measuring_flag = false; + uart4_send_data("{\"cmd\":\"1\",\"work_mode\":\"close\"}",sizeof("{\"cmd\":\"1\",\"work_mode\":\"close\"}")); + fr8012haq_timer_cfg(false); + //fr8012haq_hrs_disable + // if(FR8012HAQ_jobs_mode == HRS_MODE) + // { + // //fr8012haq_hrs_disable(); + // }else if(FR8012HAQ_jobs_mode == SPO2_MODE) + // { + // //fr8012haq_spo2_disable(); + // }else if(FR8012HAQ_jobs_mode == HRV_MODE) + // { + // //fr8012haq_hrv_disable(); + // } + // if(sensor_timer != 0) + // { + // Helios_Timer_Stop(sensor_timer); + // } + //FR8012HAQ_restart(); + //打开佩戴检测 + + +} + +static void fr8012haq_hr_bp_bo_value_update(uint16_t hr, uint16_t bp_high, uint16_t bp_low, uint16_t bo) +{ + FR8012HAQ_LOG("[@CHENG_DEBUG][%s][%d]: %d,%d,%d,%d\n", __FUNCTION__, __LINE__, hr, bp_high, bp_low, bo); + s_FR8012HAQ_heart_rate = hr; + s_FR8012HAQ_blood_oxygen = bo; + s_FR8012HAQ_high_blood = bp_high ; + s_FR8012HAQ_low_blood = bp_low ; + + + // if(hr > 0) { + // fr8012haq_hr_bp_bo_value.hr = hr; + // } + // if(bp_high > 0 && bp_low > 0) { + // fr8012haq_hr_bp_bo_value.bp_high = bp_high; + // fr8012haq_hr_bp_bo_value.bp_low = bp_low; + // } + // if(bo > 0) { + // fr8012haq_hr_bp_bo_value.bo = bo; + // } + // //app_adaptor_pedometer_data_clear(); +} + +uint16_t get_fr8012haq_hr_value(void) +{ + return s_FR8012HAQ_heart_rate; +} + +uint16_t get_fr8012haq_b0_value(void) +{ + return s_FR8012HAQ_blood_oxygen; +} + +void fr8012haq_hr_bp_bo_value_get(uint16_t *hr, uint16_t *bp_high, uint16_t *bp_low, uint16_t *bo) +{ + if(hr != NULL) + *hr = s_FR8012HAQ_heart_rate; + if(bp_high != NULL) + *bp_high = s_FR8012HAQ_high_blood; + if(bp_low != NULL) + *bp_low = s_FR8012HAQ_low_blood; + if(bo != NULL) + *bo = s_FR8012HAQ_blood_oxygen; +} + +void fr8012haq_hr_bp_bo_value_clear(void) +{ + s_FR8012HAQ_heart_rate = 0x0; + s_FR8012HAQ_heart_rate_buff_count = 0; + s_FR8012HAQ_high_blood = 0x0; + s_FR8012HAQ_low_blood = 0x0; + s_FR8012HAQ_HRV = 0; + //s_FR8012HAQ_wear_status = 0; + s_FR8012HAQ_blood_oxygen = 0x0; + //memset(&fr8012haq_hr_bp_bo_value, 0, sizeof(fr8012haq_hr_bp_bo_value)); + +} +/******************************************************************************/ +void FR8012HAQ_result_set_heart_rate(unsigned char heart_rate) +{ +// s_FR8012HAQ_heart_rate_buff[HEART_RATE_BUFF_LEN]={0}; +// uint16 s_FR8012HAQ_heart_rate_buff_count = 0; + uint32_t i,tmp = 0; + s_FR8012HAQ_heart_rate_buff[s_FR8012HAQ_heart_rate_buff_count] = heart_rate; + s_FR8012HAQ_heart_rate_buff_count++; + for(i=0;i= HEART_RATE_BUFF_LEN) + s_FR8012HAQ_heart_rate_buff_count = 0; + s_FR8012HAQ_high_blood = (uint8_t)(heart_rate * 1.5); + + s_FR8012HAQ_low_blood = (uint8_t)(heart_rate * 0.95); +} +void FR8012HAQ_result_set_wear_status(unsigned char wear_status) +{ + if(wear_status != 1) + s_FR8012HAQ_wear_status = 0; + else + s_FR8012HAQ_wear_status = 1; + //FR8012HAQ_LOG("s_FR8012HAQ_wear_status:%d !!!!!!!!!!!!!!!!!\n\n\n",s_FR8012HAQ_wear_status); +} +unsigned char FR8012HAQ_result_get_wear_status(void) +{ + + return s_FR8012HAQ_wear_status ; +} +void FR8012HAQ_result_set_blood_oxygen(unsigned char blood_oxygen) +{ + s_FR8012HAQ_blood_oxygen = blood_oxygen; +} + +void FR8012HAQ_result_set_hrv(unsigned char hrv) +{ + s_FR8012HAQ_HRV = hrv; +} +/*****************************************************************************/ + +#endif //USE_FR8012HAQ diff --git a/2.sdk/sdk/gui/lv_drivers/indev/FR8012HAQ/fr8012haq.h b/2.sdk/sdk/gui/lv_drivers/indev/FR8012HAQ/fr8012haq.h new file mode 100644 index 00000000..60672fda --- /dev/null +++ b/2.sdk/sdk/gui/lv_drivers/indev/FR8012HAQ/fr8012haq.h @@ -0,0 +1,50 @@ +#ifndef _fr8012haq_H_ +#define _fr8012haq_H_ +#include +#include + +#define FR8012HAQ_DEBUG 1 +#if FR8012HAQ_DEBUG == 1 +#define FR8012HAQ_LOG(msg, ...) cplog_printf( msg, ##__VA_ARGS__)//printf( msg, ##__VA_ARGS__)// +//#define FR8012HAQ_LOG(msg, ...) printf( msg, ##__VA_ARGS__)//printf( msg, ##__VA_ARGS__)// +#else +#define FR8012HAQ_LOG(msg, ...) +#endif +//#include "tyhx_mems.h" +//#define DEBUG_PPG_ONLY // 只用IR 判断佩带和非佩戴, 靠近感应功能关闭, 但是FR8012HAQ_PROX.C要合入编译 + +typedef enum { + HRS_MODE, + SPO2_MODE, + BP_MODE, + WEAR_MODE, + HRV_MODE, + YYL_MODE, + LIVING_MODE, + LAB_TEST_MODE, + FT_LEAK_LIGHT_MODE, + FT_GRAY_CARD_MODE, + FT_INT_TEST_MODE, + NULL_MODE, + close_MODE +} WORK_MODE_T; + + + +bool fr8012haq_living_send_data(int32_t *new_raw_data, uint8_t dat_len, uint32_t green_data_als, int16_t *gsen_data_x, int16_t *gsen_data_y, int16_t *gsen_data_z); + +void agc_timeout_handler(void * p_context); +void heart_rate_meas_timeout_handler(void * p_context); + +int16_t fr8012haqxxx_read_two_reg_low_triple(uint8_t addh, uint8_t addl); +void display_refresh(void); +extern char fr8012haq_ppg_timerout_flag ; +extern char fr8012haq_agc_timerout_flag ; +void fr8012haq_set_gsen_fifo(short *x,short *y,short *z, int count); +void Fr8012haq_Init(void); +uint8_t get_fr8012haq_id(void); +void FR8012HAQ_result_set_wear_status(unsigned char wear_status); +unsigned char FR8012HAQ_result_get_wear_status(void); +void FR8012HAQ_close(void); +void fr8012haq_measure_stop(void); +#endif diff --git a/2.sdk/sdk/gui/lv_drivers/indev/my_xMotion.c b/2.sdk/sdk/gui/lv_drivers/indev/my_xMotion.c index 6dda1438..7d7e3220 100644 --- a/2.sdk/sdk/gui/lv_drivers/indev/my_xMotion.c +++ b/2.sdk/sdk/gui/lv_drivers/indev/my_xMotion.c @@ -7,7 +7,7 @@ * INCLUDES *********************/ #include "my_xMotion.h" - +#include "lv_drv_conf_CUSTOM.h" #if USE_MY_XMOTION #include @@ -294,6 +294,13 @@ static void xmotion_isr_callback(void) OS_Activate_HISR(&xmotion_hisr_ref); } #endif +short Gsensor_x[32]; +short Gsensor_y[32]; +short Gsensor_z[32]; +int Gsensor_xyz_len = 0; +#if USE_HX3918 +extern void hx3918_set_gsen_fifo(short *x,short *y,short *z, int count); +#endif static void My_Motion_Main(VOID * argv) { uint16_t MsgId; @@ -330,7 +337,10 @@ static void My_Motion_Main(VOID * argv) uos_timer_start(pptimer, XMOTION_TIME, XMOTION_TIME, xmotion_timer_callback, NULL); gpio_enable_edge_detect(my_xm_info.irq_pin, EDGE_FLAG_FALL); #endif - + Gsensor_xyz_len = xMotion_FIFO_Read_XYZ(Gsensor_x,Gsensor_y,Gsensor_z); +#if USE_HX3918 + hx3918_set_gsen_fifo(Gsensor_x,Gsensor_y,Gsensor_z,Gsensor_xyz_len); +#endif my_xmotion_sleep_resume(); break; } @@ -423,6 +433,10 @@ static s8_m sendEvent(XMOTION_EVENT event,s32_m data_m) //raise_pm_wakeup_3s(); } break; + case EVENT_FALL_NOTIFY: + printf(" [ FALL = %ld ].\r\n",data_m); + mmi_gsensor_sensor_fall_alarm(); + break; default: break; } diff --git a/2.sdk/sdk/gui/lv_watch/app_adaptor/app_adaptor_sensor_interface.c b/2.sdk/sdk/gui/lv_watch/app_adaptor/app_adaptor_sensor_interface.c index 7beb7333..4562867d 100644 --- a/2.sdk/sdk/gui/lv_watch/app_adaptor/app_adaptor_sensor_interface.c +++ b/2.sdk/sdk/gui/lv_watch/app_adaptor/app_adaptor_sensor_interface.c @@ -21,6 +21,9 @@ #if USE_HX3918 #include "../../lv_drivers/indev/HX3918/hx3918.h" #endif +#if USE_FR8012HAQ +#include "../../lv_drivers/indev/FR8012HAQ/fr8012haq.h" +#endif #if USE_WMM300 #include "../../lv_drivers/indev/WMM300/whale_algo.h" #endif @@ -43,7 +46,11 @@ uint8_t mmi_gsensor_sensor_id_get(void) { return (get_xmotion_id()); } - +//²úÉúµøµ¹±¨¾¯ºó£¬»á´¥·¢¸Ãº¯Êý£¬ÇëÔÚº¯ÊýÄÚʵÏÖ·¢ÏûÏ¢´¥·¢UI¶¯×÷ +void mmi_gsensor_sensor_fall_alarm(void) +{ + /*...*/ +} void asl_pedometer_poweron_on_init(void) { hal_rtc_t today; @@ -144,6 +151,8 @@ unsigned char mmi_hsensor_measure_get_wear_status(void) { #if USE_HX3918 return HX3918_result_get_wear_status(); +#elif USE_FR8012HAQ + return FR8012HAQ_result_get_wear_status(); #elif USE_WMM300 return wmm300_result_get_wear_status(); #else @@ -156,6 +165,9 @@ void mmi_hsensor_measure_value_clear(void) #if USE_HX3918 hx3918_hr_bp_bo_value_clear(); #endif +#if USE_FR8012HAQ + fr8012haq_hr_bp_bo_value_clear(); +#endif #if USE_WMM300 wmm300_hr_bp_bo_value_clear(); #endif @@ -170,6 +182,9 @@ void mmi_hsensor_hr_measure_start(void) #if USE_HX3918 hx3918_measure_hr_start(); #endif +#if USE_FR8012HAQ + fr8012haq_measure_hr_start(); +#endif #if USE_WMM300 wmm300_measure_hr_start(); #endif @@ -184,6 +199,9 @@ void mmi_hsensor_spo2_measure_start(void) #if USE_HX3918 hx3918_measure_bo_start(); #endif +#if USE_FR8012HAQ + fr8012haq_measure_bo_start(); +#endif #if USE_WMM300 wmm300_measure_bo_start(); #endif @@ -192,11 +210,24 @@ void mmi_hsensor_spo2_measure_start(void) #endif } +void mmi_hsensor_bp_measure_start(void) +{ + mmi_hsensor_measure_value_clear(); + +#if USE_FR8012HAQ + fr8012haq_measure_bp_start(); +#endif + +} + void mmi_hsensor_measure_stop(void) { #if USE_HX3918 hx3918_measure_stop(); #endif +#if USE_FR8012HAQ + fr8012haq_measure_stop(); +#endif #if USE_WMM300 wmm300_measure_stop(); #endif @@ -210,6 +241,9 @@ void mmi_hsensor_measure_value_get(uint16_t *hr, uint16_t *bp_high, uint16_t *bp #if USE_HX3918 hx3918_hr_bp_bo_value_get(hr, bp_high, bp_low, bo); #endif +#if USE_FR8012HAQ + fr8012haq_hr_bp_bo_value_get(hr, bp_high, bp_low, bo); +#endif #if USE_WMM300 wmm300_hr_bp_bo_value_get(hr, bp_high, bp_low, bo); #endif @@ -273,6 +307,8 @@ uint8_t asl_hr_bp_bo_sensor_id_get(void) return get_gh3018_id(); #elif USE_HX3918 return get_hx3918_id(); +#elif USE_FR8012HAQ + return get_fr8012haq_id(); #elif USE_WMM300 return whale_check_chip(); #else @@ -291,6 +327,8 @@ void asl_hr_bp_bo_measure_start(uint8_t always) gh3018_measure_hr_start(); #elif USE_HX3918 hx3918_measure_hr_start(); +#elif USE_FR8012HAQ + fr8012haq_measure_hr_start(); #elif USE_WMM300 wmm300_measure_hr_start(); #else diff --git a/2.sdk/sdk/gui/lv_watch/app_adaptor/app_adaptor_sensor_interface.h b/2.sdk/sdk/gui/lv_watch/app_adaptor/app_adaptor_sensor_interface.h index 1dac209b..d8c7a7d9 100644 --- a/2.sdk/sdk/gui/lv_watch/app_adaptor/app_adaptor_sensor_interface.h +++ b/2.sdk/sdk/gui/lv_watch/app_adaptor/app_adaptor_sensor_interface.h @@ -69,6 +69,7 @@ enum{ /**************************Pedometer ********************/ //uint8_t asl_pedometer_sensor_id_get(void); +void mmi_gsensor_sensor_fall_alarm(void); void asl_pedometer_poweron_on_init(void); void asl_pedometer_steps_update(uint32_t steps); uint32_t asl_pedometer_steps_get(void); diff --git a/2.sdk/sdk/gui/lv_watch/app_adaptor/app_sensor_task.h b/2.sdk/sdk/gui/lv_watch/app_adaptor/app_sensor_task.h index 09e44c13..f61f30d3 100644 --- a/2.sdk/sdk/gui/lv_watch/app_adaptor/app_sensor_task.h +++ b/2.sdk/sdk/gui/lv_watch/app_adaptor/app_sensor_task.h @@ -42,6 +42,9 @@ enum { #if USE_HX3918 HX3918_ID, #endif +#if USE_FR8012HAQ + FR8012HAQ_ID, +#endif #if USE_WMM300 WMM300_ID, #endif diff --git a/2.sdk/sdk/product/craneg_modem/framework/hal/device/camera/cam_sensor_spi_gc032a.c b/2.sdk/sdk/product/craneg_modem/framework/hal/device/camera/cam_sensor_spi_gc032a.c index 52f37846..a1fb1dcc 100644 --- a/2.sdk/sdk/product/craneg_modem/framework/hal/device/camera/cam_sensor_spi_gc032a.c +++ b/2.sdk/sdk/product/craneg_modem/framework/hal/device/camera/cam_sensor_spi_gc032a.c @@ -1,6 +1,6 @@ #include "cam_sensor.h" #include "cam_gc032a_tuningtab.h" - +#include "../../../../config/watch/lv_conf_CUSTOM.h" //raw8 640 * 486 spi 2 lan sdr crc 20fps static const struct regval_tab GC032a_init_raw8_spi2lan_crc_sdr[] = { {0xf3, 0x83}, /*System*/ @@ -486,7 +486,11 @@ static const struct regval_tab gc032a_init_yuv422_spi2lan_nocrc_sdr[] = { {0x92, 0x03}, {0x93, 0x03}, {0x94, 0x08}, +#if DRV_PROJECT_Z5_Z12 + {0x95, 0x78}, +#else {0x95, 0x44}, +#endif {0x97, 0x00}, {0x98, 0x00}, {0xfe, 0x00}, /*ASDE*/ @@ -499,7 +503,11 @@ static const struct regval_tab gc032a_init_yuv422_spi2lan_nocrc_sdr[] = { {0xfe, 0x00}, /*YCP*/ {0xd1, 0x3c}, {0xd2, 0x3c}, +#if DRV_PROJECT_Z5_Z12 + {0xd3, 0x44}, +#else {0xd3, 0x38}, +#endif {0xd6, 0xf4}, {0xd7, 0x1d}, {0xdd, 0x73}, @@ -747,7 +755,11 @@ static const struct regval_tab gc032a_init_yuv422_640x480_spi2lan_nocrc_ddr[] = {0x4f, 0x01}, // aec_en {0xfe, 0x01}, {0x12, 0xa0}, +#if DRV_PROJECT_Z5_Z12 + {0x13, 0x46}, +#else {0x13, 0x3a}, +#endif {0x44, 0x04}, {0x1f, 0x30}, {0x20, 0x40}, @@ -786,8 +798,13 @@ static const struct regval_tab gc032a_init_yuv422_640x480_spi2lan_nocrc_ddr[] = /*DNDD*/ {0xfe, 0x00}, {0x81, 0xb8},//f8 +#if DRV_PROJECT_Z5_Z12 + {0x82, 0x1a}, + {0x83, 0x0f}, +#else {0x82, 0x12}, {0x83, 0x0a}, +#endif {0x84, 0x01}, {0x86, 0x50}, {0x87, 0x18}, @@ -806,7 +823,11 @@ static const struct regval_tab gc032a_init_yuv422_640x480_spi2lan_nocrc_ddr[] = {0x92, 0x03}, {0x93, 0x03}, {0x94, 0x08}, +#if DRV_PROJECT_Z5_Z12 + {0x95, 0x82}, +#else {0x95, 0x44}, +#endif {0x97, 0x00}, {0x98, 0x00}, @@ -821,9 +842,17 @@ static const struct regval_tab gc032a_init_yuv422_640x480_spi2lan_nocrc_ddr[] = /*YCP*/ {0xfe, 0x00}, - {0xd1, 0x3c}, + +#if DRV_PROJECT_Z5_Z12 + {0xd1, 0x36}, + {0xd2, 0x36}, + {0xd3, 0x44}, +#else + {0xd1, 0x3c}, {0xd2, 0x3c}, {0xd3, 0x38}, +#endif + {0xd6, 0xf4}, {0xd7, 0x1d}, {0xdd, 0x73}, diff --git a/2.sdk/sdk/product/craneg_modem/hal/gps_device/inc/gps_uart_api.h b/2.sdk/sdk/product/craneg_modem/hal/gps_device/inc/gps_uart_api.h index bc3df8a6..0f278f49 100644 --- a/2.sdk/sdk/product/craneg_modem/hal/gps_device/inc/gps_uart_api.h +++ b/2.sdk/sdk/product/craneg_modem/hal/gps_device/inc/gps_uart_api.h @@ -91,6 +91,6 @@ extern BOOL gps_uart_is_RxInt(uint32); extern int uartx_rx_hanlder(int id); extern void gps_uart_clear_receive_fifo (uint32 port_id); - - +extern int uart4_recv_data(char *buf,int buf_max_len,unsigned int timeout); +extern void uart4_send_data(char *buf,int len); #endif diff --git a/2.sdk/sdk/product/craneg_modem/hal/gps_device/src/gps_uart.c b/2.sdk/sdk/product/craneg_modem/hal/gps_device/src/gps_uart.c index b9305bf6..c3524c28 100644 --- a/2.sdk/sdk/product/craneg_modem/hal/gps_device/src/gps_uart.c +++ b/2.sdk/sdk/product/craneg_modem/hal/gps_device/src/gps_uart.c @@ -17,7 +17,8 @@ #include "intc.h" #include "qspi_dma.h" #include "gpsnmeaapi.h" - +#include "../inc/gps_uart.h" +#include "../inc/gps_uart_api.h" /********************* * DEFINES *********************/ @@ -49,7 +50,7 @@ typedef void (*TaskHandlerT)(void*); **********************/ int uartx_rx_hanlder(int id); - +int uart4_rx_hanlder(int id); /********************** * STATIC VARIABLES **********************/ @@ -61,7 +62,8 @@ static char rx_buf_lisr[RX_BUF_MAX]; static char rx_buf_hisr[RX_BUF_MAX]; static int rx_buf_w_point=0; static int rx_buf_r_point=0; - +char uart4_rx_buf[2048]; +int uart4_rx_buf_len = 0; static gps_uart_cfg uart2_port = { GPS_UART2_ID, //port_id @@ -103,10 +105,10 @@ static gps_uart_cfg uart4_port = gps_rx_int, //int_type 0, //highspeed = 0 0, //flowctrl = 0 - GPS_BAUDRATE_9600, //GPS_BAUDRATE_9600, //baudrate = BAUDRATE_115200 + GPS_BAUDRATE_115200, //GPS_BAUDRATE_9600, //baudrate = BAUDRATE_115200 GPS_DATA_8, //datawidth = DATA_8 GPS_PARITY_NONE, //parity = PARITY_NONE - (GPS_UartIsrCb)uartx_rx_hanlder, + (GPS_UartIsrCb)uart4_rx_hanlder, NULL, }; @@ -1161,7 +1163,80 @@ void uart4_debug(void) gps_uart_clear_receive_fifo(uart4_port.port_id); DEBUG("uart4_debug%d\n", gps_uart_id); } +int uart4_rx_hanlder(int id) +{ + + uint32 data,err_data,err = 0; + uint32 uart_base; + gps_uart_enable_RxInt(id,0); + + uart_base = gps_uart_info[id].base_addr; + data = read32 (uart_base + GPS_UART_LSR) & 0xFF; + + if(data & GPS_UART_LSR_DR) + { + do + { + uart4_rx_buf[uart4_rx_buf_len] = read32 (uart_base + GPS_UART_RBR); + uart4_rx_buf_len++; + + if(rx_buf_w_point >= 2048) + { + uart4_rx_buf_len=0; + } + + data = read32 (uart_base + GPS_UART_LSR) & 0xFF; + } while ((data & GPS_UART_LSR_DR) ); + } + //else + // return UART_DATA_ERROR; + gps_uart_enable_RxInt(id,1); + //gps_uart_callback(p_buf, uart_rx_len); + if(gps_hisr_ref == NULL){ + DEBUG("=================>func=%s,gps_hisr_ref=NULL\r\n",__func__); + return; + } + ASSERT(OS_Activate_HISR(&gps_hisr_ref)== OS_SUCCESS); + return 0; +} +int uart4_recv_data(char *buf,int buf_max_len,unsigned int timeout) +{ + int len = 0; + int count = 0; + int uart4_rx_buf_len_tmp = 0; + //timeout = timeout/8+1; + //cplog_printf("uart4_recv_data:timeout:%d\n",timeout); + while(timeout--) + { + gps_ui_delay_us(1400);//1ms + //UOS_SleepMs(1); + if(uart4_rx_buf_len == uart4_rx_buf_len_tmp && uart4_rx_buf_len != 0) + { + count++; + }else + count = 0; + uart4_rx_buf_len_tmp = uart4_rx_buf_len; + if(count > 5)//连续5ms没新数据,认为是一帧数据,退出 + break; + } + //cplog_printf("uart4_recv_data:count:%d timeout:%d\n",count,timeout); + if(uart4_rx_buf_len > buf_max_len) + { + len = buf_max_len; + }else + { + len = uart4_rx_buf_len; + } + memcpy(buf,uart4_rx_buf, len); + uart4_rx_buf_len = 0; + return len; +} +void uart4_send_data(char *buf,int len) +{ + //cplog_printf("uart4_send_data:%s\n",buf); + gps_uart_send_data(3,buf,len); +} int uartx_rx_hanlder(int id) { diff --git a/2.sdk/sdk/product/craneg_modem/lv_gui_main.c b/2.sdk/sdk/product/craneg_modem/lv_gui_main.c index 9be86b50..51136cc7 100644 --- a/2.sdk/sdk/product/craneg_modem/lv_gui_main.c +++ b/2.sdk/sdk/product/craneg_modem/lv_gui_main.c @@ -42,6 +42,9 @@ #if USE_HX3918 #include "lv_drivers/indev/HX3918/hx3918.h" #endif +#if USE_FR8012HAQ +#include "lv_drivers/indev/FR8012HAQ/fr8012haq.h" +#endif #if USE_WMM300 #include "lv_drivers/indev/WMM300/whale_algo.h" #endif @@ -1381,6 +1384,9 @@ static void gui_main(void *param) #if USE_HX3918 Hx3918_Init(); #endif +#if USE_FR8012HAQ + Fr8012haq_Init(); +#endif #if USE_WMM300 Wmm300_Init(); #endif diff --git a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/build/lwm2m.mak b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/build/lwm2m.mak index 54ac3a4a..76686ae68 100644 --- a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/build/lwm2m.mak +++ b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/build/lwm2m.mak @@ -44,7 +44,8 @@ GEN_PACK_MAKEFILE = ${BUILD_ROOT}/env/${HOST}/build/package.mak PACKAGE_NAME = lwm2m PACKAGE_BASE = pcac PACKAGE_DEP_FILE = lwm2m_dep.mak -PACKAGE_PATH = ${BUILD_ROOT}/${PACKAGE_BASE}/${PACKAGE_NAME} +PACKAGE_ORIG = pcac +PACKAGE_PATH = ${BUILD_ROOT}/${PACKAGE_ORIG}/${PACKAGE_NAME} PACKAGE_INC_PATHS = \ @@ -108,6 +109,8 @@ PACKAGE_SRC_FILES = \ sdksrc/sdk/dm_lwm2msdk.c \ sdksrc/sdk/dm_object_device.c \ sdksrc/sdk/dm_object_dm.c \ + sdksrc/sdk/dm_object_dmpWrite.c \ + sdksrc/sdk/dm_object_dmpRead.c \ sdksrc/sdk/dm_object_security.c \ sdksrc/sdk/dm_object_server.c \ sdksrc/shared/dm_commandline.c \ @@ -217,14 +220,61 @@ PACKAGE_SRC_FILES = \ atiny_lwm2m/agent_tiny_demo.c endif +ifneq (,$(findstring LWM2M_WAKAAMA,${VARIANT_LIST})) +# The relative path locations of source and include file directories. +PACKAGE_SRC_PATH = ${PACKAGE_PATH}/src/lwm2m_wakaama +PACKAGE_INC_PATHS += ${PACKAGE_PATH}/src/lwm2m_wakaama/core \ + ${PACKAGE_PATH}/src/lwm2m_wakaama/coap/er-coap-13 \ + ${PACKAGE_PATH}/src/lwm2m_wakaama/adaptor \ + ${PACKAGE_PATH}/src/lwm2m_wakaama/adaptor/asrclient \ + ${PACKAGE_PATH}/src/lwm2m_wakaama/include +# Package source files, paths not required +PACKAGE_SRC_FILES = \ + coap/er-coap-13/er-coap-13.c \ + coap/block.c \ + coap/transaction.c \ + core/bootstrap.c \ + core/discover.c \ + core/liblwm2m.c \ + core/list.c \ + core/management.c \ + core/objects.c \ + core/observe.c \ + core/packet.c \ + core/registration.c \ + core/uri.c \ + core/utils.c \ + data/data.c \ + data/json.c \ + data/tlv.c \ + data/json_common.c \ + data/senml_json.c \ + adaptor/commandline.c \ + adaptor/connection.c \ + adaptor/lwm2m_platform.c \ + adaptor/memtrace.c \ + adaptor/asrclient/lwm2mclient.c \ + adaptor/asrclient/object_access_control.c \ + adaptor/asrclient/object_connectivity_moni.c \ + adaptor/asrclient/object_connectivity_stat.c \ + adaptor/asrclient/object_device.c \ + adaptor/asrclient/object_firmware.c \ + adaptor/asrclient/object_location.c \ + adaptor/asrclient/object_security.c \ + adaptor/asrclient/object_server.c \ + adaptor/asrclient/object_test.c \ + adaptor/asrclient/system_api.c +endif # These are the tool flags specific to the ci_stub package only. # The environment, target, and group also set flags. PACKAGE_CFLAGS = -PACKAGE_DFLAGS = +PACKAGE_DFLAGS += -I$(BUILD_ROOT)/pcac/network \ + -I${BUILD_ROOT}/pcac/lwipv4v6/src/include \ + -I${BUILD_ROOT}/pcac/lwipv4v6/src/include/lwip diff --git a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/core/dm_internals.h b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/core/dm_internals.h index 2993a252..fc7bd7df 100644 --- a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/core/dm_internals.h +++ b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/core/dm_internals.h @@ -130,6 +130,7 @@ #define REG_OBJECT_MIN_LEN 5 // "," #define REG_PATH_END ">," +#define REG_VERSION_START ">;ver=" #define REG_PATH_SEPARATOR "/" #define REG_OBJECT_PATH "<%s/%hu>," diff --git a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/core/dm_objects.c b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/core/dm_objects.c index ade572c0..e5dec6cd 100644 --- a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/core/dm_objects.c +++ b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/core/dm_objects.c @@ -533,6 +533,27 @@ int object_getRegisterPayloadBufferLength(lwm2m_context_t * contextP) length = result; index += length; + index -= 1; + index += strlen(REG_VERSION_START); + + result = utils_intToText(1, (uint8_t *)buffer, sizeof(buffer)); + if (result < 0) return 0; + index += result; + + index += 1; + + result = utils_intToText(2, (uint8_t *)buffer, sizeof(buffer)); + if (result < 0) return 0; + index += result; + + index += 1; + + if(objectP->instanceList != NULL) + { + start = index; + index += length; + } + if (objectP->instanceList == NULL) { index -= 1; @@ -613,6 +634,34 @@ int object_getRegisterPayload(lwm2m_context_t * contextP, length = result; index += length; + index--; + result = utils_stringCopy((char *)buffer + index, bufferLen - index, REG_VERSION_START); + if (result < 0) return 0; + index += result; + + result = utils_intToText(1, buffer + index, bufferLen - index); + if (result < 0) return 0; + index += result; + + if( index >= bufferLen) return 0; + buffer[index++] = '.'; + + result = utils_intToText(2, buffer + index, bufferLen - index); + if (result < 0) return 0; + index += result; + + if( index >= bufferLen) return 0; + buffer[index++] = REG_DELIMITER; + + if(objectP->instanceList != NULL) + { + start = index; + result = prv_getObjectTemplate(buffer + index, bufferLen - index, objectP->objID); + if (result < 0) return 0; + length = result; + index += length; + } + if (objectP->instanceList == NULL) { index--; diff --git a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/core/dm_packet.c b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/core/dm_packet.c index 99bf24f8..e990100a 100644 --- a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/core/dm_packet.c +++ b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/core/dm_packet.c @@ -339,9 +339,12 @@ void lwm2m_handle_packet(lwm2m_context_t * contextP, coap_error_code = message_send(contextP, response, fromSessionH); - lwm2m_free(payload); - response->payload = NULL; - response->payload_len = 0; + if (payload) + { + lwm2m_free(payload); + response->payload = NULL; + response->payload_len = 0; + } } else if (coap_error_code != COAP_IGNORE) { diff --git a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_lwm2mclient.h b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_lwm2mclient.h index 7a4847fb..7c682b0b 100644 --- a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_lwm2mclient.h +++ b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_lwm2mclient.h @@ -19,6 +19,14 @@ void free_security_object(lwm2m_object_t * objectP); lwm2m_object_t * get_object_dm(void); void free_object_dm(lwm2m_object_t * objectP); +lwm2m_object_t * get_object_dmpWrite(void); +void free_object_dmpWrite(lwm2m_object_t * objectP); +void dm_update_lifetime(unsigned int lifetime); +unsigned int dm_get_lifetime(void); +unsigned int dm_parser_heartBeatTime_buffer(unsigned char *buffer); + +lwm2m_object_t * get_object_dmpRead(void); +void free_object_dmpRead(lwm2m_object_t * objectP); char * get_server_uri(lwm2m_object_t * objectP, uint16_t secObjInstID); diff --git a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_lwm2msdk.c b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_lwm2msdk.c index bdac01e7..770ddbd6 100644 --- a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_lwm2msdk.c +++ b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_lwm2msdk.c @@ -15,15 +15,23 @@ //#include //#include //#include - +#define KEY_MODEL "Z12" #include "dm_j_aes.h" #include "dm_j_base64.h" //#include #include "dm_lwm2msdk.h" #include "dm_lwm2mclient.h" +#include "../testsdk/sdk_cmcc_register_info_def.h" +//#include "../../../../../../config/watch/customer_config.h" #define MAX_PACKET_SIZE 1024 +#if 0 +//CMCC DMP V2.0 #define OBJ_COUNT 4 +#else +//CMCC DMP V4.0 +#define OBJ_COUNT 5 +#endif //lwm2m_object_t * objArray[OBJ_COUNT]; int g_reboot = 0; @@ -34,7 +42,8 @@ static int s_thrd_flag = 0; int g_pip_ios_fd[2] ; char g_szEPI[256]=""; - +#if 0 +//CMCC DMP V2.0 Options g_opt = { "352099001761482", /*CMEI_IMEI*/ "", /*CMEI_IMEI2*/ "460075551608160", /*IMSI*/ @@ -47,6 +56,30 @@ Options g_opt = { "352099001761482", /*CMEI_IMEI*/ 300, /*life time*/ 56831, /*local port*/ 0}; /*bootstrap*/ +#else +//CMCC DMP V4.0 +Options g_opt = { "深圳市大山智慧科技有限公司", /*brand*/ + "Z12", /*model*/ + "M100001028", /*appKey*/ + "397fub217U67fmqz39a2938WG90d1857", /*pwd*/ + "4.0.1", /*sdkVersion*/ + "4.0.1", /*apiVersion*/ + "SZDS2022", /*templatID*/ + "3520990017614823", /* imei1 */ + "", /* imei2 */ + "460075551608160", /* imei2 */ + 4, /*ip type,4/6*/ +#if 0 + "m.fxltsbl.com", /*server address*/ +#else + "coap://b.fxltsbl.com", /*test server address*/ +#endif + 5683, /*server port*/ + 86400, /*life time*/ + 56831, /*local port*/ + 0 + }; /*bootstrap*/ +#endif OptFuncs g_sdk_opt_funcs = {NULL}; @@ -444,7 +477,8 @@ int lwm2m_sdk_dm_get_devinfo(uint16_t resId,char **outbuff) } - +#if 0 +//CMCC DMP V2.0 int LWM2M_SDK_RUN_PARAM(int argc, char *argv[]) { client_data_t data; @@ -650,7 +684,7 @@ int LWM2M_SDK_RUN_PARAM(int argc, char *argv[]) if (result != 0) { LOG_M( "lwm2m_step() failed: 0x%X\r\n", result); - g_quit = 1;//é€?å‡? + g_quit = 1;//�?�? break; //continue; //return -1; @@ -757,7 +791,285 @@ int LWM2M_SDK_RUN_PARAM(int argc, char *argv[]) return 0; } +#else +//CMCC DMP V4.0 +int LWM2M_SDK_RUN_PARAM(int argc, char *argv[]) +{ + client_data_t data; + lwm2m_context_t * lwm2mH = NULL; + lwm2m_object_t * objArray[OBJ_COUNT]; + char * server = "127.0.0.1"; + char * serverPort = "5683"; + char * localPort = "56830"; + //char * initname = "testlwm2mclient"; + char * name = ""; + int lifetime=300; + int result=0; + char * multiVer="v2.0"; + char imeiFlag[65]; + //int opt; + + memset(&data, 0, sizeof(client_data_t)); + + data.addressFamily = AF_INET6; + //localPort = argv[opt]; + //param set by optional + //if (strlen(g_opt.szSrvIP)>=0) + server=g_opt.szSrvIP; + char szsrvport[10]= {0}; + if (g_opt.nSrvPort > 80 ) { + sprintf(szsrvport,"%d",g_opt.nSrvPort); + serverPort = szsrvport; + } + if(g_opt.nAddressFamily==4) { + data.addressFamily = AF_INET; + } + if ( g_opt.nLifetime > 10 ) { + lifetime=g_opt.nLifetime ; + } + char szlocalport[10]= {0}; + if (g_opt.nLocalPort > 49152 ) { + sprintf(szlocalport,"%d",g_opt.nLocalPort); + localPort = szlocalport; + } + + + char *szStars="****"; + char epnametmp[256]; + memset(epnametmp,0,sizeof(epnametmp)); + memset(g_szEPI,0,sizeof(g_szEPI)); + sprintf(epnametmp,"%s||%s||%s||%s||%s||I||%s||%s||%s||***||***||***", + g_opt.brand, g_opt.model, g_opt.appKey, g_opt.sdkVersion, g_opt.apiVersion,g_opt.templatID, + strlen(g_opt.szCMEI_IMEI) > 0 ? g_opt.szCMEI_IMEI : szStars, + strlen(g_opt.szCMEI_IMEI2) > 0 ? g_opt.szCMEI_IMEI2 : szStars); + sprintf(g_szEPI, "%s||%s||%s||%s||%s||I||%s||%s||%s||***||***||***", + g_opt.brand, g_opt.model, g_opt.appKey, g_opt.sdkVersion, g_opt.apiVersion,g_opt.templatID, + strlen(g_opt.szCMEI_IMEI) > 0 ? g_opt.szCMEI_IMEI : szStars, + strlen(g_opt.szCMEI_IMEI2) > 0 ? g_opt.szCMEI_IMEI2 : szStars); + + //strcpy(epnametmp,"L@#@M+D2vyO9kk/IPVyzehd6Biypy8R69yTlHdaIQiTp6klbXqJmESZJ6QXoDlQkqOC8@#@M100000006"); + LOG_M("epname=%s~\n", epnametmp); + name = epnametmp; + + LOG_M("szEPI=%s~\n", g_szEPI); + +/////////////// + + /* + *This call an internal function that create an IPv6 socket on the port 5683. + */ + LOG_M( "Trying to bind LWM2M Client to port %s\r\n", localPort); + data.sock = create_socket(localPort, data.addressFamily); + if (data.sock < 0) { + LOG_M("Failed to open socket: %d %s\r\n", errno, strerror(errno)); + return -1; + } + + char serverUri[50]; + int serverId = 123; + sprintf (serverUri, "coap://%s:%s", server, serverPort); + + //objArray[0] = get_security_object(); + objArray[0] = get_security_object(serverId, serverUri); + if (NULL == objArray[0]) { + LOG_S( "Failed to create security object\r\n"); + close(data.sock); + return -1; + } + data.securityObjP = objArray[0]; + + objArray[1] = get_server_object(serverId, lifetime); + if (NULL == objArray[1]) { + LOG_S( "Failed to create server object\r\n"); + close(data.sock); + free_security_object(objArray[0]); + return -1; + } + dm_update_lifetime(lifetime); + + objArray[2] = get_object_device(); + if (NULL == objArray[2]) { + LOG_S("Failed to create Device object\r\n"); + close(data.sock); + free_security_object(objArray[0]); + free_server_object(objArray[1]); + return -1; + } + + objArray[3] = get_object_dmpWrite(); + if (NULL == objArray[3]) { + LOG_S("Failed to create Device object\r\n"); + close(data.sock); + free_security_object(objArray[0]); + free_server_object(objArray[1]); + free_object_device(objArray[2]); + return -1; + } + + objArray[4] = get_object_dmpRead(); + if (NULL == objArray[4]) { + LOG_S("Failed to create Device object\r\n"); + close(data.sock); + free_security_object(objArray[0]); + free_server_object(objArray[1]); + free_object_device(objArray[2]); + free_object_dmpWrite(objArray[3]); + return -1; + } + + lwm2mH = lwm2m_init(&data); + if (NULL == lwm2mH) { + LOG_S( "lwm2m_init() failed\r\n"); + close(data.sock); + + free_security_object(objArray[0]); + free_server_object(objArray[1]); + free_object_device(objArray[2]); + free_object_dmpWrite(objArray[3]); + free_object_dmpRead(objArray[4]); + return -1; + } + + result = lwm2m_configure(lwm2mH, name, NULL, NULL, OBJ_COUNT, objArray); + if (result != 0) { + LOG_M( "lwm2m_configure() failed: 0x%X\r\n", result); + close(data.sock); + lwm2m_close(lwm2mH); + free_security_object(objArray[0]); + free_server_object(objArray[1]); + free_object_device(objArray[2]); + free_object_dmpWrite(objArray[3]); + free_object_dmpRead(objArray[4]); + return -1; + } + + + //signal(SIGINT, handle_sigint); + LOG_M("LWM2M Client \"%s\" started on port %s.\r\nUse Ctrl-C to exit.\r\n\n", name, localPort); + g_quit = 0; + + /* + * We now enter in a while loop that will handle the communications from the server + */ + while (0 == g_quit) { + struct timeval tv; + fd_set readfds; + + tv.tv_sec = 60; + tv.tv_usec = 0; + + FD_ZERO(&readfds); + FD_SET(data.sock, &readfds); + //FD_SET(g_pip_ios_fd[0],&readfds); + + print_state(lwm2mH); + if (lwm2mH->state == STATE_READY) { + lwm2mH->serverList->lifetime = dm_get_lifetime(); + LOG_M( "update lifetime: %d\r\n", dm_get_lifetime()); + } + + result = lwm2m_step(lwm2mH, (time_t *)&(tv.tv_sec)); + if (result != 0) { + LOG_M( "lwm2m_step() failed: 0x%X\r\n", result); + g_quit = 1;//�?�? + break; + //continue; + //return -1; + } + + /* + * This part wait for an event on the socket until "tv" timed out (set + * with the precedent function) + */ + result = select(FD_SETSIZE, &readfds, NULL, NULL, &tv); + if (result < 0) { + if (errno != EINTR) { + LOG_M("Error in select(): %d %s\r\n", errno, strerror(errno)); + } + } else if (result > 0) { + uint8_t buffer[MAX_PACKET_SIZE]; + int numBytes; + + /* + * If an event happens on the socket + */ + if (FD_ISSET(data.sock, &readfds)) { + struct sockaddr_in addr; + memset(&addr,0,sizeof(struct sockaddr_in)); + struct sockaddr_in6 addr6; + memset(&addr6,0,sizeof(struct sockaddr_in6)); + socklen_t addrLen; + + if(g_opt.nAddressFamily==4) { + addrLen = sizeof(addr); + } else { + addrLen = sizeof(addr6); + } + + /* + * We retrieve the data received + */ + if(g_opt.nAddressFamily==4) { + numBytes = recvfrom(data.sock, buffer, MAX_PACKET_SIZE, 0, (struct sockaddr *)&addr, &addrLen); + } else { + numBytes = recvfrom(data.sock, buffer, MAX_PACKET_SIZE, 0, (struct sockaddr *)&addr6, &addrLen); + } + + if (0 > numBytes) { + LOG_M("Error in recvfrom(): %d %s\r\n", errno, strerror(errno)); + } else if (0 < numBytes) { + connection_t * connP; + + if(g_opt.nAddressFamily==4) { + connP = connection_find(data.connList, &addr, addrLen); + } else { + connP = connection_find6(data.connList, &addr6, addrLen); + } + + if (connP != NULL) { + /* + * Let liblwm2m respond to the query depending on the context + */ + lwm2m_handle_packet(lwm2mH, buffer, numBytes, connP); + } else { + /* + * This packet comes from an unknown peer + */ + LOG_S( "received bytes ignored!\r\n"); + } + } + } + /* + else if(FD_ISSET(g_pip_ios_fd[0], &readfds)) + { + char c[2]; + read(g_pip_ios_fd[0], c, 1); + g_quit = 1; + } + */ + } + } + + /* + * Finally when the loop is left, we unregister our client from it + */ + lwm2m_close(lwm2mH); + lwm2m_sdk_notify_dereg_success(0,"dereg"); + close(data.sock); + connection_free(data.connList); + + free_security_object(objArray[0]); + free_server_object(objArray[1]); + free_object_device(objArray[2]); + free_object_dmpWrite(objArray[3]); + free_object_dmpRead(objArray[4]); + + LOG_S( "loop func quit\r\n\n"); + + return 0; +} +#endif void * runthreadfunc(void * arg) { int ret = LWM2M_SDK_RUN_PARAM(0,NULL); @@ -846,6 +1158,9 @@ int LWM2M_SDK_STOP(void) LOG_S("is stopped"); return 0; } +#if 1 + g_quit = -1; +#endif //ret = write(g_pip_ios_fd[1], "x", 1); @@ -874,3 +1189,31 @@ int LWM2M_SDK_FINI(void) } +#if 1 +void lwm2m_info_conf(const char *imei, const char *imsi, const char *appkey, const char *pwd) +{ +#if 0 +//CMCC DMP V2.0 + memcpy(g_opt.szCMEI_IMEI, imei, strlen(imei)); + memcpy(g_opt.szIMSI, imsi, strlen(imsi)); + memcpy(g_opt.szAppKey, appkey, strlen(appkey)); + memcpy(g_opt.szPwd, pwd, strlen(pwd)); +#else +//CMCC DMP V4.0 + memset(g_opt.szCMEI_IMEI,0,64); + memcpy(g_opt.szCMEI_IMEI, imei, strlen(imei)); + memset(g_opt.szIMSI,0,64); + memcpy(g_opt.szIMSI, imsi, strlen(imsi)); + memset(g_opt.appKey,0,64); + memcpy(g_opt.appKey, appkey, strlen(appkey)); + memset(g_opt.szPwd,0,64); + memcpy(g_opt.szPwd, pwd, strlen(pwd)); + memset(g_opt.brand,0,32); + memcpy(g_opt.brand, REG_BRAND, strlen(REG_BRAND)); + memset(g_opt.model,0,32); + memcpy(g_opt.model, KEY_MODEL, strlen(KEY_MODEL)); + //memcpy(g_opt.templatID, ); +#endif +} +#endif + diff --git a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_lwm2msdk.h b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_lwm2msdk.h index 91182b23..9073a1b1 100644 --- a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_lwm2msdk.h +++ b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_lwm2msdk.h @@ -51,7 +51,8 @@ typedef struct } OptFuncs; - +#if 0 +//CMCC DMP V2.0 typedef struct { char szCMEI_IMEI[64]; //CMEI/IMEI @@ -69,7 +70,28 @@ typedef struct int nBootstrap; //是否booststrap 0,not use; other n,use; } Options; +#else +typedef struct +{ + char brand[32]; //brand + char model[32]; //model + char appKey[64]; //appKey + char szPwd[64]; //pwd秘钥 + char sdkVersion[16]; //sdkVersion + char apiVersion[16]; //apiVersion + char templatID[32]; //templatID + char szCMEI_IMEI[64]; //CMEI/IMEI + char szCMEI_IMEI2[64]; //CMEI/IMEI2 + char szIMSI[64]; //IMSI + int nAddressFamily; //4或6 ipv4,ipv6 + char szSrvIP[32]; //127.0.0.1 + int nSrvPort; //5683 + int nLifetime; //300 + int nLocalPort; //本地端口绑定,默认为56830 + int nBootstrap; //是否booststrap 0,not use; other n,use; +} Options; +#endif //初始化Options:参数,optfuncs:回调函数 int LWM2M_SDK_INIT(void); diff --git a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_object_dm.c b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_object_dm.c index 9851f961..71f1da8c 100644 --- a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_object_dm.c +++ b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_object_dm.c @@ -30,6 +30,15 @@ #define RES_DM_NET_ACCT 6612 #define RES_DM_PHONE 6613 #define RES_DM_LOCATION 6614 +#define RES_DM_SCREENSIZE 6615 +#define RES_DM_RESOLUTION 6616 +#define RES_DM_IMSI 6617 +#define RES_DM_BATTERY_CAPACITY 6618 +#define RES_DM_WEARING_STATUS 6619 +#define RES_DM_BOARD 6620 +#define RES_DM_GPU 6621 +#define RES_DM_ROUTER_MAC 6622 +#define RES_DM_NETWORK_STATUS 6623 #define RES_VALUE_BUFF_LEN 512 @@ -94,7 +103,7 @@ static uint8_t prv_dm_read(uint16_t instanceId, do { - if((*dataArrayP)[i].id >=RES_DM_DEV_INFO && (*dataArrayP)[i].id <= RES_DM_LOCATION ) + if((*dataArrayP)[i].id >=RES_DM_DEV_INFO && (*dataArrayP)[i].id <= RES_DM_NETWORK_STATUS ) { //char sztmp[512]; char *outbuff = NULL; diff --git a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_object_dmpRead.c b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_object_dmpRead.c new file mode 100644 index 00000000..0d8d9311 --- /dev/null +++ b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_object_dmpRead.c @@ -0,0 +1,293 @@ +/*******************************************************************************/ +/* + * This object is single instance only, and provide dm info functionality. + * Object ID is 669. + * Object instance ID is 0. + */ + +#include "dm_liblwm2m.h" +#include "dm_internals.h" +#include +#include +#include +#include + +// Resource Id's: +#define LWM2M_DM_DMPREAD_OBJECT 669 + +#define RES_DM_DEV_INFO 6601 +#define RES_DM_APP_INFO 6602 +#define RES_DM_MAC 6603 +#define RES_DM_ROM 6604 +#define RES_DM_RAM 6605 +#define RES_DM_CPU 6606 +#define RES_DM_SYS_VERSION 6607 +#define RES_DM_FIRM_VERSION 6608 +#define RES_DM_FIRM_NAME 6609 +#define RES_DM_VOLTE 6610 +#define RES_DM_NET_TYPE 6611 +#define RES_DM_NET_ACCT 6612 +#define RES_DM_PHONE 6613 +#define RES_DM_LOCATION 6614 +#define RES_DM_SCREENSIZE 6615 +#define RES_DM_RESOLUTION 6616 +#define RES_DM_IMSI 6617 +#define RES_DM_BATTERY_CAPACITY 6618 +#define RES_DM_WEARING_STATUS 6619 +#define RES_DM_BOARD 6620 +#define RES_DM_GPU 6621 +#define RES_DM_ROUTER_MAC 6622 +#define RES_DM_NETWORK_STATUS 6623 +#define RES_DM_MAX (23) + +#define RES_DM_DEV_INFO_STR "devinfo" +#define RES_DM_APP_INFO_STR "appinfo" +#define RES_DM_MAC_STR "mac" +#define RES_DM_ROM_STR "rom" +#define RES_DM_RAM_STR "ram" +#define RES_DM_CPU_STR "cpu" +#define RES_DM_SYS_VERSION_STR "sysVersion" +#define RES_DM_FIRM_VERSION_STR "softwareVer" +#define RES_DM_FIRM_NAME_STR "softwareName" +#define RES_DM_VOLTE_STR "volte" +#define RES_DM_NET_TYPE_STR "netType" +#define RES_DM_NET_ACCT_STR "netAcct" +#define RES_DM_PHONE_STR "phoneNumber" +#define RES_DM_LOCATION_STR "location" +#define RES_DM_SCREENSIZE_STR "screenSize" +#define RES_DM_RESOLUTION_STR "resolution" +#define RES_DM_IMSI_STR "imsi" +#define RES_DM_BATTERY_CAPACITY_STR "batteryCapacity" +#define RES_DM_WEARING_STATUS_STR "wearingStatus" +#define RES_DM_BOARD_STR "board" +#define RES_DM_GPU_STR "gpu" +#define RES_DM_ROUTER_MAC_STR "routerMac" +#define RES_DM_NETWORK_STATUS_STR "networkStatus" + +#define RES_VALUE_BUFF_LEN 512 + +typedef struct +{ + uint8_t state; + uint8_t result; + + char dev_info[RES_VALUE_BUFF_LEN]; + char app_info[RES_VALUE_BUFF_LEN]; + char mac[RES_VALUE_BUFF_LEN]; + char rom[RES_VALUE_BUFF_LEN]; + char ram[RES_VALUE_BUFF_LEN]; + char cpu[RES_VALUE_BUFF_LEN]; + char sys_ver[RES_VALUE_BUFF_LEN]; + char firm_ver[RES_VALUE_BUFF_LEN]; + char firm_name[RES_VALUE_BUFF_LEN]; + char volte[RES_VALUE_BUFF_LEN]; + + char net_type[RES_VALUE_BUFF_LEN]; + char net_acct[RES_VALUE_BUFF_LEN]; + char phone[RES_VALUE_BUFF_LEN]; + char location[RES_VALUE_BUFF_LEN]; + +} dmpread_data_t; + +extern int lwm2m_sdk_dm_get_devinfo(uint16_t resId,char **outbuff); + +int lwm2m_data_encode_json_buffer(int id, char *jsonOutBuff) +{ + char tmpBuff[64] = {0}; + int len = 0; + + memset(tmpBuff, 0x00, sizeof(tmpBuff)); + + if (id == RES_DM_DEV_INFO) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_DEV_INFO_STR); + else if (id == RES_DM_APP_INFO) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_APP_INFO_STR); + else if (id == RES_DM_MAC) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_MAC_STR); + else if (id == RES_DM_ROM) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_ROM_STR); + else if (id == RES_DM_RAM) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_RAM_STR); + else if (id == RES_DM_CPU) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_CPU_STR); + else if (id == RES_DM_SYS_VERSION) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_SYS_VERSION_STR); + else if (id == RES_DM_FIRM_VERSION) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_FIRM_VERSION_STR); + else if (id == RES_DM_FIRM_NAME) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_FIRM_NAME_STR); + else if (id == RES_DM_VOLTE) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_VOLTE_STR); + else if (id == RES_DM_NET_TYPE) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_NET_TYPE_STR); + else if (id == RES_DM_NET_ACCT) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_NET_ACCT_STR); + else if (id == RES_DM_PHONE) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_PHONE_STR); + else if (id == RES_DM_LOCATION) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_LOCATION_STR); + else if (id == RES_DM_SCREENSIZE) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_SCREENSIZE_STR); + else if (id == RES_DM_RESOLUTION) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_RESOLUTION_STR); + else if (id == RES_DM_IMSI) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_IMSI_STR); + else if (id == RES_DM_BATTERY_CAPACITY) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_BATTERY_CAPACITY_STR); + else if (id == RES_DM_WEARING_STATUS) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_WEARING_STATUS_STR); + else if (id == RES_DM_BOARD) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_BOARD_STR); + else if (id == RES_DM_GPU) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_GPU_STR); + else if (id == RES_DM_ROUTER_MAC) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_ROUTER_MAC_STR); + else if (id == RES_DM_NETWORK_STATUS) + len = snprintf(tmpBuff, sizeof(tmpBuff), "\"%s\":", RES_DM_NETWORK_STATUS_STR); + else + return -1; + + memcpy(jsonOutBuff, tmpBuff, len); + + return 0; +} + +static uint8_t prv_dm_dmpRead(uint16_t instanceId, + int * numDataP, + lwm2m_data_t ** dataArrayP, + lwm2m_object_t * objectP) +{ + int i; + uint8_t result; + dmpread_data_t * data = (dmpread_data_t*)(objectP->userData); + char jsonOutBuff[1024] = {0}; + char tmpBuff[64] = {0}; + + memset(jsonOutBuff, 0x00, sizeof(jsonOutBuff)); + LOG_ARG("* numDataP=%d", *numDataP); + + // this is a single instance object + if (instanceId != 0) + { + return COAP_404_NOT_FOUND; + } + + int total_count = 1; + // is the server asking for the full object ? + if (*numDataP == 0) + { + *dataArrayP = lwm2m_data_new(total_count); + if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; + *numDataP = total_count; + (*dataArrayP)[0].id = 1; + } + + int iret = 0, len =0; + + len += snprintf(jsonOutBuff + len, sizeof(jsonOutBuff) - len, "{"); + + for(i = 0; i < RES_DM_MAX; i++) + { + char *outbuff = NULL; + + iret = lwm2m_sdk_dm_get_devinfo(6600+i+1, &outbuff); + if(iret!=0) + { + LOG_ARG("resId=%u,lwm2m_sdk_dm_get_devinfo,iret=%d",i ,iret); + result = COAP_404_NOT_FOUND; + } + else + { + memset(tmpBuff, 0x00, sizeof(tmpBuff)); + lwm2m_data_encode_json_buffer(6600+i+1, tmpBuff); + //LOG_ARG("tmpBuff=%s", tmpBuff); + len += snprintf(jsonOutBuff + len, sizeof(jsonOutBuff) - len, "%s\"%s\",", tmpBuff, outbuff); + //LOG_ARG("len=%d, jsonOutBuff111=%s", len, jsonOutBuff); + result = COAP_205_CONTENT; + } + if(outbuff) free(outbuff); + } + + len -= 1; + len += snprintf(jsonOutBuff + len, sizeof(jsonOutBuff) - len, "}"); + + LOG_ARG("len=%d, jsonOutBuff222=%s", len, jsonOutBuff); + + lwm2m_data_encode_string(jsonOutBuff, *dataArrayP); + + //LOG_ARG("jsonOutBuff333=%s", (*dataArrayP)->value.asBuffer.buffer); + + return result; +} + +lwm2m_object_t * get_object_dmpRead(void) +{ + lwm2m_object_t * firmwareObj; + + firmwareObj = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t)); + + if (NULL != firmwareObj) + { + memset(firmwareObj, 0, sizeof(lwm2m_object_t)); + firmwareObj->objID = LWM2M_DM_DMPREAD_OBJECT; + + /* + * and its unique instance + * + */ + firmwareObj->instanceList = (lwm2m_list_t *)lwm2m_malloc(sizeof(lwm2m_list_t)); + if (NULL != firmwareObj->instanceList) + { + memset(firmwareObj->instanceList, 0, sizeof(lwm2m_list_t)); + } + else + { + lwm2m_free(firmwareObj); + return NULL; + } + + + firmwareObj->readFunc = prv_dm_dmpRead; + firmwareObj->writeFunc = 0; + firmwareObj->executeFunc = 0; + firmwareObj->userData = lwm2m_malloc(sizeof(dmpread_data_t)); + + /* + * Also some user data can be stored in the object with a private structure containing the needed variables + */ + if (NULL != firmwareObj->userData) + { + dmpread_data_t *data = (dmpread_data_t*)(firmwareObj->userData); + + data->state = 1; + data->result = 0; + strcpy(data->dev_info, ""); + strcpy(data->app_info, "1.0"); + + + } + else + { + lwm2m_free(firmwareObj); + firmwareObj = NULL; + } + } + + return firmwareObj; +} + +void free_object_dmpRead(lwm2m_object_t * objectP) +{ + if (NULL != objectP->userData) + { + lwm2m_free(objectP->userData); + objectP->userData = NULL; + } + if (NULL != objectP->instanceList) + { + lwm2m_free(objectP->instanceList); + objectP->instanceList = NULL; + } + lwm2m_free(objectP); +} + diff --git a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_object_dmpWrite.c b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_object_dmpWrite.c new file mode 100644 index 00000000..107e8787 --- /dev/null +++ b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_object_dmpWrite.c @@ -0,0 +1,217 @@ +/*******************************************************************************/ +/* + * This object is single instance only, and provide dm info functionality. + * Object ID is 668. + * Object instance ID is 0. + */ + +#include "dm_liblwm2m.h" +#include "dm_internals.h" +#include +#include +#include +#include + +// Resource Id's: +#define LWM2M_DM_DMPWRITE_OBJECT 668 + +#define RES_VALUE_BUFF_LEN 512 +static unsigned int dmLifeTime = 0; + +void dm_update_lifetime(unsigned int lifetime) +{ + dmLifeTime = lifetime; + + return; +} + +unsigned int dm_get_lifetime(void) +{ + return dmLifeTime; +} + +unsigned int dm_parser_heartBeatTime_buffer(unsigned char *buffer) +{ + char *pBuff = NULL; + char *tmp = NULL; + char data[4] = {0}; + unsigned int heartBeatTime = 0; + + if (buffer == NULL) + { + LOG("buffer is NULL"); + return heartBeatTime; + } + + pBuff = (char *)buffer; + tmp = strstr(pBuff, "heartBeatTime"); + LOG_ARG("tmp=%s", tmp); + if (tmp) + { + while(*tmp++ != ',') + { + LOG_ARG("*tmp=%c", *tmp); + if (*tmp == ':') + { + tmp++; + if (*tmp >= '0' && *tmp <= '9') + { + data[0] = *tmp; + heartBeatTime = data[0] - '0'; + } + //LOG_ARG("heartBeatTime111=%d", heartBeatTime); + tmp++; + if (*tmp >= '0' && *tmp <= '9') + { + data[1] = *tmp; + heartBeatTime = heartBeatTime * 10 + (data[1] - '0'); + } + //LOG_ARG("heartBeatTime222=%d", heartBeatTime); + tmp++; + if (*tmp >= '0' && *tmp <= '9') + { + data[2] = *tmp; + heartBeatTime = heartBeatTime * 10 + (data[2] - '0'); + } + //LOG_ARG("heartBeatTime333=%d", heartBeatTime); + tmp++; + if (*tmp >= '0' && *tmp <= '9') + { + data[3] = *tmp; + heartBeatTime = heartBeatTime * 10 + (data[3] - '0'); + } + LOG_ARG("heartBeatTime444=%d", heartBeatTime); + break; + } + } + } + + return heartBeatTime; +} + +static uint8_t prv_dm_dmpwrite(uint16_t instanceId, + int numData, + lwm2m_data_t * dataArray, + lwm2m_object_t * objectP) +{ + unsigned char *buffer="{\"reportTime\":1440,\"heartBeatTime\":900,\"reportNum\":8,\"retryInterval\":10,\"retryNum\":1}"; + + unsigned int heartBeatTime = 0, i = 0 ; + LOG_ARG("instanceId=%u, numData=%d", instanceId, numData); + + if (numData <= 0) + return COAP_231_CONTINUE; + + if (numData >= 2) + { + if (dataArray[1].value.asBuffer.length > 0) + { + heartBeatTime = dm_parser_heartBeatTime_buffer(dataArray[1].value.asBuffer.buffer); + LOG_ARG("heartBeatTime=%d", heartBeatTime); + } + } + + if (heartBeatTime > 0) + { + dm_update_lifetime(heartBeatTime*60); //heartBeatTime unit is minute + } + + for (i = 0; i < numData; i++) + { + if (dataArray[i].value.asBuffer.length > 0) + { + LOG_ARG("i = %d, id=%u, dataArray->value.asBuffer.length=%d", i, dataArray[i].id, dataArray[i].value.asBuffer.length); + + int printLen = 0; + unsigned char *buff = dataArray[i].value.asBuffer.buffer; + + while (dataArray[i].value.asBuffer.length > 0) + { + if (dataArray[i].value.asBuffer.length > 128) + printLen = 128; + else + printLen = dataArray[i].value.asBuffer.length; + + LOG_ARG("buffer=%.*s", printLen, buff); + + buff += printLen; + dataArray[i].value.asBuffer.length -= printLen; + } + } + } + + return COAP_204_CHANGED; +} + +lwm2m_object_t * get_object_dmpWrite(void) +{ + lwm2m_object_t * firmwareObj; + + firmwareObj = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t)); + + if (NULL != firmwareObj) + { + memset(firmwareObj, 0, sizeof(lwm2m_object_t)); + firmwareObj->objID = LWM2M_DM_DMPWRITE_OBJECT; + + /* + * and its unique instance + * + */ + firmwareObj->instanceList = (lwm2m_list_t *)lwm2m_malloc(sizeof(lwm2m_list_t)); + if (NULL != firmwareObj->instanceList) + { + memset(firmwareObj->instanceList, 0, sizeof(lwm2m_list_t)); + } + else + { + lwm2m_free(firmwareObj); + return NULL; + } + + + firmwareObj->readFunc = 0; + firmwareObj->writeFunc = prv_dm_dmpwrite; + firmwareObj->executeFunc = 0; +#if 0 + firmwareObj->userData = lwm2m_malloc(sizeof(dmread_data_t)); + + /* + * Also some user data can be stored in the object with a private structure containing the needed variables + */ + if (NULL != firmwareObj->userData) + { + dmread_data_t *data = (dmread_data_t*)(firmwareObj->userData); + + data->state = 1; + data->result = 0; + strcpy(data->dev_info, ""); + strcpy(data->app_info, "1.0"); + + + } + else + { + lwm2m_free(firmwareObj); + firmwareObj = NULL; + } +#endif + } + return firmwareObj; +} + +void free_object_dmpWrite(lwm2m_object_t * objectP) +{ + if (NULL != objectP->userData) + { + lwm2m_free(objectP->userData); + objectP->userData = NULL; + } + if (NULL != objectP->instanceList) + { + lwm2m_free(objectP->instanceList); + objectP->instanceList = NULL; + } + lwm2m_free(objectP); +} + diff --git a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/testsdk/dm_main.c b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/testsdk/dm_main.c index fc3f7510..2792c5ff 100644 --- a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/testsdk/dm_main.c +++ b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/testsdk/dm_main.c @@ -7,7 +7,9 @@ #include "diag_osif.h" #include "osa.h" #include "dm_liblwm2m.h" - +//#include "cJSON.h" +#include "../../../../../alios/common/include/cJSON.h" +#include "sdk_cmcc_register_info_def.h" struct dmMsg { @@ -28,6 +30,57 @@ OSMsgQRef DMMsgQ=NULL; static int s_quit = 0; static int s_state = 0; +#if 1 //simware +char g_DmRegisterInfor[512]; +int g_DmRegisterflag=-1; +extern char * app_adaptor_get_model_id(void); +extern char * app_adaptor_get_version(void); +static void ccmc__package_data(void) +{ + printf("[%s,%d]\n", __func__, __LINE__); + + cJSON *json = NULL; + char *cache_buf = NULL; + extern Options g_opt; + + json = cJSON_CreateObject(); + if(json == NULL) { + printf("[%s\n]%s",__func__,"create cjson object error!!!!"); + return; + } + cJSON_AddItemToObject(json, "FIRMWARE VERSION", cJSON_CreateString(REG_FIRMWARE_VERSION)); + cJSON_AddItemToObject(json, "Model", cJSON_CreateString(REG_FIRMWARE_NAME)); + cJSON_AddItemToObject(json, "CMEI_IMEI", cJSON_CreateString(g_opt.szCMEI_IMEI)); +#if 0 +//CMCC DMP V2.0 + app_adp_get_imsi_req(&g_opt.szIMSI); + cJSON_AddItemToObject(json, "IMSI", cJSON_CreateString(g_opt.szIMSI)); +#else +//CMCC DMP V4.0 + char imsi[32] = {0}; + app_adp_get_imsi_req(imsi); + cJSON_AddItemToObject(json, "IMSI", cJSON_CreateString(imsi)); +#endif + cJSON_AddItemToObject(json, "APPINFOR", cJSON_CreateString(REG_APPINFO)); + cJSON_AddItemToObject(json, "ROM", cJSON_CreateString(REG_ROM)); + cJSON_AddItemToObject(json, "RAM", cJSON_CreateString(REG_RAM)); + cJSON_AddItemToObject(json, "CPU", cJSON_CreateString(REG_CPU)); + cJSON_AddItemToObject(json, "NetType", cJSON_CreateString(REG_NET_TYPE)); +#if 0 +//CMCC DMP V2.0 + cJSON_AddItemToObject(json, "appkey", cJSON_CreateString(g_opt.szAppKey)); +#else +//CMCC DMP V4.0 + cJSON_AddItemToObject(json, "appkey", cJSON_CreateString(g_opt.appKey)); +#endif + cJSON_AddItemToObject(json, "pwd", cJSON_CreateString(g_opt.szPwd)); + cache_buf = cJSON_Print(json); + cJSON_Delete(json); + memset(g_DmRegisterInfor,0,sizeof(g_DmRegisterInfor)); + memcpy(g_DmRegisterInfor, cache_buf, (strlen(cache_buf) >= sizeof(g_DmRegisterInfor))? sizeof(g_DmRegisterInfor): (strlen(cache_buf)+1)); +} +#endif + void handle_sig(int signum) { s_quit = 1; @@ -48,6 +101,9 @@ void myNotifyMsg(OptNotifyParam *optNotifyParam) if(optNotifyParam->notify_code == NOTIFY_CODE_OK ) { s_state = 0; +#if 1//simware + ccmc__package_data(); +#endif } else { @@ -61,6 +117,9 @@ void myNotifyMsg(OptNotifyParam *optNotifyParam) if(optNotifyParam->notify_code == NOTIFY_CODE_OK ) { s_state = 0; +#if 1//simware + ccmc__package_data(); +#endif } else { @@ -70,6 +129,7 @@ void myNotifyMsg(OptNotifyParam *optNotifyParam) default: break; } + g_DmRegisterflag = s_state; } @@ -84,50 +144,93 @@ int myDMReadInfo(int resId,char **outbuff) memset(buff,0,sizeof(buff)); //snprintf(buff,buflen,"resval_%d",resId); - switch (resId) - { - case 6601://devinfo - snprintf(buff,buflen,"%s","ASR3601"); - break; - case 6602://appinfo - snprintf(buff,buflen,"ASR 3601\r\n"); - break; - case 6603://mac - snprintf(buff,buflen,"00:50:56:C0:00:01"); - break; - case 6604://rom - snprintf(buff,buflen,"16MB"); - break; - case 6605://ram - snprintf(buff,buflen,"16MB"); - break; - case 6606://CPU - snprintf(buff,buflen,"ARM"); - break; - case 6607://SYS VERSION - snprintf(buff,buflen,"ThreadX"); - break; - case 6608://FIRMWARE VERSION - snprintf(buff,buflen,"CRANE_CP_1.0XX.XXX"); - break; - case 6609://FIRMWARE NAME - snprintf(buff,buflen,"CRANE_CP"); - break; - case 6610://Volte - snprintf(buff,buflen,"0"); - break; - case 6611://NetType - snprintf(buff,buflen,"4G"); - break; - case 6612://Net Account - snprintf(buff,buflen,"Account"); - break; - case 6613://PhoneNumber - snprintf(buff,buflen,"13812345678"); - break; - case 6614://Location - snprintf(buff,buflen,"25.77701556036132,123.52958679200002,GPS"); - break; + switch (resId) { + case 6601://devinfo + snprintf(buff,buflen,"%s",REG_DEVINFO); + break; + case 6602://appinfo + snprintf(buff,buflen,"%s",REG_APPINFO); + break; + case 6603://mac + { + extern UINT64 Read_Crane_CPU_UID(); + UINT64 cpuId = Read_Crane_CPU_UID(); + char mac[6]; + memset(mac,0,6); + mac[0] = cpuId & 0x00000000000000FF; + mac[1] = (cpuId>>8) & 0x00000000000000FF; + mac[2] = (cpuId>>16) & 0x00000000000000FF; + mac[3] = (cpuId>>24) & 0x00000000000000FF; + mac[4] = (cpuId>>32) & 0x00000000000000FF; + mac[5] = (cpuId>>40) & 0x00000000000000FF; + char mac_str[20]; + memset(mac_str,0,20); + sprintf(mac_str,"%02x:%02x:%02x:%02x:%02x:%02x",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]); + snprintf(buff,strlen(mac_str),"%s",mac_str); + } + break; + case 6604://rom + snprintf(buff,buflen,"%s",REG_ROM); + break; + case 6605://ram + snprintf(buff,buflen,"%s",REG_RAM); + break; + case 6606://CPU + snprintf(buff,buflen,"%s",REG_CPU); + break; + case 6607://SYS VERSION + snprintf(buff,buflen,"%s",REG_SYS_VERSION); + break; + case 6608://FIRMWARE VERSION + snprintf(buff,buflen,"%s",cmcc_dm_get_version()); + break; + case 6609://FIRMWARE NAME + snprintf(buff,buflen,"%s",REG_FIRMWARE_NAME); + break; + case 6610://Volte + snprintf(buff,buflen,"%s",MMI_Modem_Get_Volte_State_Req(watch_modem_get_sim_id())==1?"0":"1"); + break; + case 6611://NetType + snprintf(buff,buflen,"%s",REG_NET_TYPE); + break; + case 6612://Net Account + snprintf(buff,buflen,"%s",REG_NET_ACCOUNT); + break; + case 6613://PhoneNumber + snprintf(buff,buflen,"%s",REG_LOCATION);//REG_PHONENUMBER + break; + case 6614://Location + snprintf(buff,buflen,"%s",REG_LOCATION); + break; +#if 1//simware add beigin + case 6615://screenSize + snprintf(buff,buflen,REG_SCREENSIZE); + break; + case 6616://resolution + snprintf(buff,buflen,REG_RESOLUTION); + break; + case 6617://imsi + snprintf(buff,buflen,g_opt.szIMSI); + break; + case 6618://battery + snprintf(buff,buflen,REG_BATTERY); + break; + case 6619://wear state + snprintf(buff,buflen,"%s",app_adaptor_get_wear_state()==0?"unwear":"wear"); + break; + case 6620://board version + snprintf(buff,buflen,REG_BOARD); + break; + case 6621://gpu + snprintf(buff,buflen,REG_GPU); + break; + case 6622://router mac + snprintf(buff,buflen,REG_ROUTER_MAC); + break; + case 6623://network status + snprintf(buff,buflen,REG_NETWORK_STATUS); + break; +#endif //simware add end default: iret = -1; @@ -161,6 +264,9 @@ void dm_send_msg_active(void) OSA_STATUS osaStatus; lwm2m_printf("[%s:%d]\n",__func__,__LINE__); +#if 1 + s_quit = 0; +#endif osaStatus = OSAMsgQSend(DMMsgQ, sizeof(apiMsg), (UINT8*)&apiMsg, OSA_NO_SUSPEND); DIAG_ASSERT(osaStatus == OS_SUCCESS); diff --git a/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/testsdk/sdk_cmcc_register_info_def.h b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/testsdk/sdk_cmcc_register_info_def.h new file mode 100644 index 00000000..e5f83070 --- /dev/null +++ b/2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/testsdk/sdk_cmcc_register_info_def.h @@ -0,0 +1,29 @@ +#ifndef SDK_CMCC_REGISTER_INFO_DEF__H +#define SDK_CMCC_REGISTER_INFO_DEF__H + + +#define REG_DEVINFO "ASR3603" +#define REG_APPINFO "ASR 3603\r\n" +#define REG_MAC "***" +#define REG_ROM "16MB" +#define REG_RAM "16MB" +#define REG_CPU "ASR3603" +#define REG_SYS_VERSION "RTOS 5.0" +#define REG_FIRMWARE_VERSION "***" +#define REG_FIRMWARE_NAME "***" +#define REG_VOLTE "1" +#define REG_NET_TYPE "4G" +#define REG_NET_ACCOUNT "Account" +#define REG_PHONENUMBER "***" +#define REG_LOCATION "LBS+WIFI" +#define REG_BRAND "***" +#define REG_GPU "None" +#define REG_BOARD "***" +#define REG_RESOLUTION "240x284" +#define REG_SCREENSIZE "1.83" +#define REG_BATTERY "800mAh" +#define REG_ROUTER_MAC "None" +#define REG_NETWORK_STATUS "LTE" + +#endif +