新增k18hsensor驱动
authorp15692025051 <846603105@qq.com>
Fri, 22 Dec 2023 03:14:41 +0000 (11:14 +0800)
committerp15692025051 <846603105@qq.com>
Fri, 22 Dec 2023 03:14:41 +0000 (11:14 +0800)
增加跌倒报警接口
合并更新dm库
Z12摄像头优化

24 files changed:
2.sdk/project/Z5_HA_K18/product/craneg_modem/config/watch/lv_drv_conf_CUSTOM.h
2.sdk/sdk/gui/lv_drivers/CMakeLists.txt
2.sdk/sdk/gui/lv_drivers/indev/FR8012HAQ/fr8012haq.c [new file with mode: 0644]
2.sdk/sdk/gui/lv_drivers/indev/FR8012HAQ/fr8012haq.h [new file with mode: 0644]
2.sdk/sdk/gui/lv_drivers/indev/my_xMotion.c
2.sdk/sdk/gui/lv_watch/app_adaptor/app_adaptor_sensor_interface.c
2.sdk/sdk/gui/lv_watch/app_adaptor/app_adaptor_sensor_interface.h
2.sdk/sdk/gui/lv_watch/app_adaptor/app_sensor_task.h
2.sdk/sdk/product/craneg_modem/framework/hal/device/camera/cam_sensor_spi_gc032a.c
2.sdk/sdk/product/craneg_modem/hal/gps_device/inc/gps_uart_api.h
2.sdk/sdk/product/craneg_modem/hal/gps_device/src/gps_uart.c
2.sdk/sdk/product/craneg_modem/lv_gui_main.c
2.sdk/sdk/product/craneg_modem/pcac/lwm2m/build/lwm2m.mak
2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/core/dm_internals.h
2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/core/dm_objects.c
2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/core/dm_packet.c
2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_lwm2mclient.h
2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_lwm2msdk.c
2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_lwm2msdk.h
2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_object_dm.c
2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_object_dmpRead.c [new file with mode: 0644]
2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/sdk/dm_object_dmpWrite.c [new file with mode: 0644]
2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/testsdk/dm_main.c
2.sdk/sdk/product/craneg_modem/pcac/lwm2m/src/lwm2m_dm/sdksrc/testsdk/sdk_cmcc_register_info_def.h [new file with mode: 0644]

index 41841ec..73933f1 100644 (file)
 #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
index cc5bb17..7e64cbb 100644 (file)
@@ -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 (file)
index 0000000..be40eb9
--- /dev/null
@@ -0,0 +1,841 @@
+
+
+
+#include "lv_drv_conf_CUSTOM.h"
+#if USE_FR8012HAQ
+
+#include <stdio.h> 
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <math.h>
+#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<s_FR8012HAQ_heart_rate_buff_count;i++)//算总和,取平均值
+   {
+      tmp+=s_FR8012HAQ_heart_rate_buff[i];
+   }
+   s_FR8012HAQ_heart_rate = tmp/s_FR8012HAQ_heart_rate_buff_count;//取平均值
+   //s_FR8012HAQ_heart_rate = heart_rate; 
+   if(s_FR8012HAQ_heart_rate_buff_count >=  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 (file)
index 0000000..60672fd
--- /dev/null
@@ -0,0 +1,50 @@
+#ifndef _fr8012haq_H_
+#define _fr8012haq_H_
+#include <stdint.h>
+#include <stdbool.h>
+
+#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
index 6dda143..7d7e322 100644 (file)
@@ -7,7 +7,7 @@
 *      INCLUDES
 *********************/
 #include "my_xMotion.h"
-
+#include "lv_drv_conf_CUSTOM.h"
 #if USE_MY_XMOTION
 
 #include <stdio.h>
@@ -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;
     }
index 7beb733..4562867 100644 (file)
@@ -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
index 1dac209..d8c7a7d 100644 (file)
@@ -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);
index 09e44c1..f61f30d 100644 (file)
@@ -42,6 +42,9 @@ enum {
 #if USE_HX3918
     HX3918_ID,
 #endif
+#if USE_FR8012HAQ
+    FR8012HAQ_ID,
+#endif
 #if USE_WMM300
     WMM300_ID,
 #endif
index 52f3784..a1fb1dc 100644 (file)
@@ -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},
index bc3df8a..0f278f4 100644 (file)
@@ -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
index b9305bf..c3524c2 100644 (file)
@@ -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)
 {
 
index 9be86b5..51136cc 100644 (file)
@@ -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
index 54ac3a4..76686ae 100644 (file)
@@ -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
 
 
 
index 2993a25..fc7bd7d 100644 (file)
 
 #define REG_OBJECT_MIN_LEN  5   // "</n>,"
 #define REG_PATH_END        ">,"
+#define REG_VERSION_START   ">;ver="
 #define REG_PATH_SEPARATOR  "/"
 
 #define REG_OBJECT_PATH             "<%s/%hu>,"
index ade572c..e5dec6c 100644 (file)
@@ -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--;
index 99bf24f..e990100 100644 (file)
@@ -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)
             {
index 7a4847f..7c682b0 100644 (file)
@@ -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);
 
index bdac01e..770ddbd 100644 (file)
 //#include <sys/stat.h>
 //#include <errno.h>
 //#include <signal.h>
-
+#define KEY_MODEL "Z12"
 #include "dm_j_aes.h"
 #include "dm_j_base64.h"
 //#include <pthread.h>
 #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;//é\80?å\87?
+            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
+
index 91182b2..9073a1b 100644 (file)
@@ -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);
index 9851f96..71f1da8 100644 (file)
 #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 (file)
index 0000000..0d8d931
--- /dev/null
@@ -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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+// 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 (file)
index 0000000..107e878
--- /dev/null
@@ -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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+// 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);
+}
+
index fc3f751..2792c5f 100644 (file)
@@ -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("<dm>[%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 (file)
index 0000000..e5f8307
--- /dev/null
@@ -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
+