Merge #1550 into sdk602patch0911 from refs/changes/1550/head 1558/target/2
author胡传军 <1224667075@qq.com>
Mon, 23 Dec 2024 09:33:23 +0000 (09:33 +0000)
committer袁清梦 <3449750381@qq.com>
Mon, 23 Dec 2024 09:33:23 +0000 (09:33 +0000)
  - 增加pud解码支持长短信解码及英文短信解码

  - 修改按键投票机制,增加GPIO按键单独投票

code/sdk/drivers/chips/brandy/porting/button/button_porting.c
code/sdk/drivers/drivers/driver/button/button.c
code/sdk/drivers/peripheral/button/button.c
code/sdk/drivers/peripheral/button/button.h
code/sdk/drivers/peripheral/utils/pdu.c
code/sdk/middleware/chips/brandy/pm/include/pm_definition.h
code/sdk/middleware/chips/brandy/pm/pm.c

index e319507..ea0e587 100755 (executable)
@@ -320,14 +320,59 @@ static errcode_t porting_button_pmu_pwr_cfg(pin_t pin)
     return ERRCODE_SUCC;
 }
 
-static void porting_button_add_veto(void)
+static void porting_button_add_veto(uint8_t id)
 {
-    uapi_pm_add_sleep_veto(PM_ID_BUTTON);
+    if(id==0)
+    {
+        uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BUTTON);
+        if(cnt==0)
+        {
+            uapi_pm_add_sleep_veto(PM_ID_BUTTON);
+            printf("PM_ID_BUTTON:%d\r\n",id);
+        }
+        else
+        {
+            printf(" porting_button_add_veto:%d\r\n",cnt);
+        }        
+    }
+    else
+    {
+        
+        uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BUTTON_GPIO);
+        if(cnt==0)
+        {
+            uapi_pm_add_sleep_veto(PM_ID_BUTTON_GPIO);
+            printf("PM_ID_BUTTON:%d\r\n",id);
+        }
+        else
+        {
+            printf(" porting_button_add_veto:%d\r\n",cnt);
+        }
+    }    
 }
 
-static void porting_button_remove_veto(void)
+static void porting_button_remove_veto(uint8_t id)
 {
-    uapi_pm_remove_sleep_veto(PM_ID_BUTTON);
+    if(id==0)
+    {
+        uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BUTTON);
+        for (int i = 0; i < cnt; i++)
+        {
+            uapi_pm_remove_sleep_veto(PM_ID_BUTTON);
+        }
+        printf("porting_button_remove_veto:%d\r\n",id);
+    }
+    else
+    {
+        uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BUTTON_GPIO);
+        for (int i = 0; i < cnt; i++)
+        {
+            uapi_pm_remove_sleep_veto(PM_ID_BUTTON_GPIO);
+        }
+        printf("porting_button_remove_veto:%d\r\n",id);
+    }
+  
+   
 }
 
 button_peripheral_api g_brandy_button_api = {
index 6e0fb2a..2a9ab71 100644 (file)
@@ -154,7 +154,7 @@ static void button_irq_callback(pin_t pin)
     button_api->button_clear_interrupt(pin);
     button_press_state_t press_state = button_get_press_state(pin);
     button_send_msg(BUTTON_PWREN_ID, press_state);
-    button_api->button_add_veto();
+    button_api->button_add_veto(0);
     button_timer_start_check_released();
 }
 
@@ -179,7 +179,7 @@ static void button_gpio_callback(pin_t pin, uintptr_t param)
     osal_irq_restore(irq_sts);
 
     button_peripheral_api *button_api = button_port_get_api();
-    button_api->button_add_veto();
+    button_api->button_add_veto(1);
     button_timer_start();
 }
 
@@ -228,7 +228,7 @@ static void button_debounced_timer_callback(uint32_t data)
         button_timer_start();
     } else {
         button_peripheral_api *button_api = button_port_get_api();
-        button_api->button_remove_veto();
+        button_api->button_remove_veto(1);
     }
 }
 
@@ -243,7 +243,7 @@ static void button_check_released_timer_callback(uint32_t data)
     press_state = button_get_press_state(PIN_NONE);
     if (press_state == 1) {
         button_send_msg(1, RELEASED);
-        button_api->button_remove_veto();
+        button_api->button_remove_veto(0);
     } else {
         button_timer_start_check_released();
     }
index e038cd5..88e8a4f 100644 (file)
@@ -154,7 +154,8 @@ static void button_irq_callback(pin_t pin)
     button_api->button_clear_interrupt(pin);
     button_press_state_t press_state = button_get_press_state(pin);
     button_send_msg(BUTTON_PWREN_ID, press_state);
-    button_api->button_add_veto();
+     printf("button_irq_callback pin\r\n");
+    button_api->button_add_veto(0);
     button_timer_start_check_released();
 }
 
@@ -179,7 +180,7 @@ static void button_gpio_callback(pin_t pin, uintptr_t param)
     osal_irq_restore(irq_sts);
 
     button_peripheral_api *button_api = button_port_get_api();
-    button_api->button_add_veto();
+    button_api->button_add_veto(1);
     button_timer_start();
 }
 
@@ -228,7 +229,7 @@ static void button_debounced_timer_callback(uint32_t data)
         button_timer_start();
     } else {
         button_peripheral_api *button_api = button_port_get_api();
-        button_api->button_remove_veto();
+        button_api->button_remove_veto(1);
     }
 }
 
@@ -243,7 +244,7 @@ static void button_check_released_timer_callback(uint32_t data)
     press_state = button_get_press_state(PIN_NONE);
     if (press_state == 1) {
         button_send_msg(1, RELEASED);
-        button_api->button_remove_veto();
+        button_api->button_remove_veto(0);
     } else {
         button_timer_start_check_released();
     }
index a32acab..4e64404 100644 (file)
@@ -72,8 +72,8 @@ typedef struct {
     button_press_state_t (*button_get_state)(pin_t pin);
     errcode_t (*button_register_callback)(pin_t pin, osal_irq_handler thread_handler);
     errcode_t (*button_unregister_callback)(pin_t pin);
-    void (*button_add_veto)(void);
-    void (*button_remove_veto)(void);
+    void (*button_add_veto)(uint8_t);
+    void (*button_remove_veto)(uint8_t);
 } button_peripheral_api;
 
 /**
index cff60cb..f793b1a 100644 (file)
@@ -161,6 +161,42 @@ int strHex2bytearray(char *inputHexstr, char *output_bytes, int *max_output_byte
        
 }
 
+void GetASCIICode7Bit(uint8_t*pTempInt, int nlen,char *out_char)
+{
+    int i=0, j=0;
+    int Point=0;//每7次就转换出8个ASCII码
+    for(i=0; j<nlen; i++, j++/*, pTempInt++*/)
+    {
+        uint8_t nRet = 0;
+
+               
+
+               if(Point==0)
+               nRet = (pTempInt[i]<<Point) & (0x7F);
+        else
+               {
+                       printf("GetASCIICode7Bit:%02X %02X\r\n",pTempInt[i],pTempInt[i-1]);
+
+                       nRet = (((pTempInt[i]<<Point)) | (pTempInt[i-1])>>(8-Point))  & 0x7F;
+               }
+        
+
+        out_char[j]=nRet;
+               printf("GetASCIICode7Bit:%c %02X\r\n",nRet,nRet);
+        if(Point==6)//每7位可以多转换一个ASCII码
+        {
+            j++;
+            nRet = (pTempInt[i]>>1)&(0x7F);
+            out_char[j]=nRet;
+        }
+
+        Point=(Point+1)%7;
+    }
+
+    return ;
+}
+
+
 int pdu_decode(unsigned char* buffer, int buffer_length,
               struct tm* output_sms_time, int* output_sms_zone,time_t *output_sms_timestamp,
               char* output_sender_phone_number, int sender_phone_number_size,
@@ -178,12 +214,24 @@ int pdu_decode(unsigned char* buffer, int buffer_length,
                printf("delive_start +1 > buffer_len\n");
                return -2;
        }
+       //0000 00100
+       //
+       uint8_t have_sms_head=0;
+
        if ((buffer[sms_deliver_start] & SMS_DELIVER_ONE_MESSAGE) != SMS_DELIVER_ONE_MESSAGE) 
        {
-               printf("buffer[%d]=%02X",sms_deliver_start,buffer[sms_deliver_start]);
-               return -3;
+               printf("buffer[%d]=%02X\r\n",sms_deliver_start,buffer[sms_deliver_start]);
+               //return -3;
+       }
+       //如果bit6为1则表示后面有消息头
+       if((buffer[sms_deliver_start] & 0b01000000)) 
+       {
+               have_sms_head++;
+               printf("have have_sms_head\r\n");
        }
 
+
+
        const int sender_number_length = buffer[sms_deliver_start + 1];
        if (sender_number_length + 1 > sender_phone_number_size) 
        {
@@ -194,6 +242,13 @@ int pdu_decode(unsigned char* buffer, int buffer_length,
        DecodePhoneNumber(buffer + sms_deliver_start + 3, sender_number_length,  output_sender_phone_number);
   
        const int sms_pid_start = sms_deliver_start + 3 + (buffer[sms_deliver_start + 1] + 1) / 2;
+
+       uint8_t is_uint8_bit=0;
+
+       if(buffer[sms_pid_start+1]==0)
+       {
+               is_uint8_bit++;
+       }
 #if 0
        // Decode timestamp.
        struct tm sms_broken_time;
@@ -220,22 +275,41 @@ int pdu_decode(unsigned char* buffer, int buffer_length,
        (*output_sms_timestamp) = mktime(output_sms_time) ;
        
 #endif
-       const int sms_start = sms_pid_start + 2 + 7;
+       int sms_start = sms_pid_start + 2 + 7;
        if (sms_start + 1 > buffer_length) return -5;  // Invalid input buffer.
 
        const int output_sms_text_length = buffer[sms_start];
        if (sms_text_size < output_sms_text_length) return -6;  // Cannot hold decoded buffer.
        // printf("output_sms_text_length %d, index %d\n",output_sms_text_length,sms_start + 1);
-
+       
+       if(have_sms_head)
+       {
+               //有消息头
+               sms_start=sms_start+buffer[sms_pid_start+2+7+1]+1;
+               
+       }
 
        unsigned char * unicodebuf=buffer+sms_start+1;
        int unicodebuflen=buffer_length-(sms_start+1);
        char * utf8p=output_sms_text;
-       int jj;
-       for(jj=0; jj < unicodebuflen/2;jj++){
-               uni2utf8((const uint8_t *)(unicodebuf+jj*2),&utf8p);
+
+       //if()
+       int decoded_sms_text_size;
+       if(is_uint8_bit==0)
+       {
+               int jj;
+               for(jj=0; jj < unicodebuflen/2;jj++){
+                       uni2utf8((const uint8_t *)(unicodebuf+jj*2),&utf8p);
+               }
+               decoded_sms_text_size = (utf8p - output_sms_text);
        }
-       int decoded_sms_text_size = (utf8p - output_sms_text);
+       else
+       {
+               printf("GetASCIICode7Bit %d\r\n",output_sms_text_length);
+               GetASCIICode7Bit((uint8_t *)unicodebuf,output_sms_text_length,utf8p);
+               decoded_sms_text_size=output_sms_text_length;
+       }
+       
        // const int decoded_sms_text_size = DecodePDUMessage(buffer + sms_start + 1, buffer_length - (sms_start + 1),
                                                        //    output_sms_text, output_sms_text_length);
 
@@ -247,6 +321,17 @@ int pdu_decode(unsigned char* buffer, int buffer_length,
        else
                output_sms_text[sms_text_size-1] = 0;
 
+       // if()
+       // {
+       //      printf("长短信\r\n");
+       //      // output_sms_text[0]=output_sms_text[0]<<1;
+       //      // if (decoded_sms_text_size < sms_text_size)
+       //      // memmove(&output_sms_text[0],&output_sms_text[9],decoded_sms_text_size-6);
+       //      // else
+       //      // memmove(&output_sms_text[0],&output_sms_text[9],decoded_sms_text_size-7);
+               
+       // }
+                                                                                                                                                                        
        return decoded_sms_text_size;
 }
 
@@ -299,15 +384,19 @@ pdustr len 45,phonenumb:8615521469561 ,text:计划的好好的基金 ,txtlen:24,
 
 static uint32_t ancs_msg_index =0;
 
-// typedef struct 
-// {
-//     uint32_t ref;
-//     uint16_t num;
-//     char *phone_number;
-//     char *text;
-// }pdu_data;
-
-// static pdu_data[20]={0};
+typedef struct 
+{
+       uint32_t ref;
+       uint16_t total_num;
+       uint16_t num;
+       uint16_t seq;
+       char *phone_number;
+       char *text;
+}pdu_data;
+
+#define PDU_DATA_MAX 20
+static uint8_t pdu_flag=0;
+static pdu_data pdu_data_t[PDU_DATA_MAX]={0};
 
 int pdu_decode_example(const char *inpdustr,  uint32_t ref,uint16_t num, uint16_t seq)
 {
@@ -320,24 +409,113 @@ int pdu_decode_example(const char *inpdustr,  uint32_t ref,uint16_t num, uint16_
     int text_size=256;
 
     ret = pdu_decode_hexstr(inpdustr,&sms_broken_timestamp,phone_number,phone_number_size,text,text_size);
-   
+
        if (ret <= 0)
        {
                printf("pdu_decode_hexstr Error %d",ret);
-       }else{
-               printf(" recv sms phonenumber %s len %d, timestamp %d , smstxt %s len %d , pdu_decode_hexstr ret %d\n",phone_number,strlen(phone_number),sms_broken_timestamp,text,strlen(text),ret);
-               struct tm * timenow =localtime(&sms_broken_timestamp);
-               printf("receive timenow %04d-%02d-%02d %02d:%02d:%02d  \n",
-                       timenow->tm_year+1900,
-                       timenow->tm_mon+1,
-                       timenow->tm_mday,
-                       timenow->tm_hour,
-                       timenow->tm_min,
-                       timenow->tm_sec);
+               return -1;
+       }
+
+       pdu_data_t[pdu_flag].ref=ref;
+       pdu_data_t[pdu_flag].total_num=num;
+       if(pdu_data_t[pdu_flag].phone_number)
+       {
+               free(pdu_data_t[pdu_flag].phone_number);
+               pdu_data_t[pdu_flag].phone_number=NULL;
+       }
+       pdu_data_t[pdu_flag].phone_number=malloc(strlen(phone_number)+1);
+       memset(pdu_data_t[pdu_flag].phone_number,0,strlen(phone_number)+1);
+       memcpy(pdu_data_t[pdu_flag].phone_number,phone_number,strlen(phone_number));
+
+       if(pdu_data_t[pdu_flag].text)
+       {
+               free(pdu_data_t[pdu_flag].text);
+               pdu_data_t[pdu_flag].text=NULL;
+       }
+
+       pdu_data_t[pdu_flag].text=malloc(strlen(text)+1);
+       memset(pdu_data_t[pdu_flag].text,0,strlen(text)+1);
+       memcpy(pdu_data_t[pdu_flag].text,text,strlen(text));
+
 
+       pdu_data_t[pdu_flag].seq=seq;
+
+       if(pdu_data_t[pdu_flag].total_num==1)
+       {
                message_data(0,0,phone_number,text,0);
+
+               free(pdu_data_t[pdu_flag].phone_number);
+               free(pdu_data_t[pdu_flag].text);
+               pdu_data_t[pdu_flag].ref=0;
+
+       }
+       else
+       {
+               for(int i=0;i<PDU_DATA_MAX;i++)
+               {
+                       //ref对上证明
+                       if(ref==pdu_data_t[i].ref)
+                       {
+                               pdu_data_t[i].num++;
+
+                               if(pdu_data_t[i].num==pdu_data_t[i].total_num)
+                               {
+                                       int8_t find_fist_seq=-1;
+                                       //数量足够开始拼装完整数据,再进行发送,给应用层
+                                       for(int x=0;x<pdu_data_t[i].total_num;x++)
+                                       {       
+                                               
+                                               for(int y=0;y<PDU_DATA_MAX;y++)
+                                               {
+                                                       if(x+1==pdu_data_t[y].seq && ref==pdu_data_t[y].ref)
+                                                       {
+                                                               if(find_fist_seq==-1)
+                                                               {
+                                                                       find_fist_seq=y;
+                                                                       break;
+                                                               }
+                                                               else
+                                                               {
+                                                                       //realloc()
+                                                                       char * new_txt=malloc(strlen(pdu_data_t[find_fist_seq].text)+strlen(pdu_data_t[y].text)+1);
+                                                                       memset(new_txt,0,strlen(pdu_data_t[find_fist_seq].text)+strlen(pdu_data_t[y].text)+1);
+                                                                       memcpy(new_txt,pdu_data_t[find_fist_seq].text,strlen(pdu_data_t[find_fist_seq].text));
+                                                                       memcpy(new_txt+strlen(pdu_data_t[find_fist_seq].text),pdu_data_t[y].text,strlen(pdu_data_t[y].text));
+
+                                                                       pdu_data_t[y].num=0;
+                                                                       pdu_data_t[y].seq=0;
+                                                                       pdu_data_t[y].total_num=0;
+                                                                       free(pdu_data_t[y].phone_number);
+                                                                       pdu_data_t[y].phone_number=NULL;
+                                                                       free(pdu_data_t[y].text);
+                                                                       pdu_data_t[y].text=NULL;
+
+                                                               
+                                                                       free(pdu_data_t[find_fist_seq].text);
+                                                                       pdu_data_t[find_fist_seq].text=new_txt;
+                                                       
+                                                               }
+                                                       }
+                                               }
+                                       }
+                                       printf("pdu_data_t[%d].text %s\r\n",find_fist_seq,pdu_data_t[find_fist_seq].text);
+
+                                       message_data(0,0,pdu_data_t[find_fist_seq].phone_number,pdu_data_t[find_fist_seq].text,0);
+                                       free(pdu_data_t[find_fist_seq].phone_number);
+                                       pdu_data_t[find_fist_seq].phone_number=NULL;
+                                       free(pdu_data_t[find_fist_seq].text);
+                                       pdu_data_t[find_fist_seq].text=NULL;
+                                       pdu_data_t[find_fist_seq].ref=0;
+
+                                       
+                               }       
+                       }
+               }
                
        }
+
+       pdu_flag++;
+
        return ret;
 }
 /**  分条短信例子,暂时解码有瑕疵,但并没丢失数据
index 5517b07..9b49850 100755 (executable)
@@ -49,6 +49,7 @@ typedef enum {
     PM_ID_GSENSOR,//新增,加速计
     PM_ID_CAT1,//Cat1 communication
     PM_ID_P_TEST,//产测
+    PM_ID_BUTTON_GPIO,//gpio按键
     PM_ID_MAX,
 } pm_id_t;
 
index c07591e..c72ad38 100755 (executable)
@@ -238,6 +238,7 @@ const char* pm_id_name_arr[] ={
     "PM_ID_GSENSOR",//新增,加速计
     "PM_ID_CAT1",//Cat1 communication
     "PM_ID_P_TEST",
+    "PM_ID_BUTTON_GPIO",//GPIO按键
     "PM_ID_MAX"
 };