From dd9a18eee9b939df73e096775bab8bbae7e8fd03 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E8=83=A1=E4=BC=A0=E5=86=9B?= <1224667075@qq.com> Date: Mon, 23 Dec 2024 09:33:23 +0000 Subject: [PATCH] Merge #1550 into sdk602patch0911 from refs/changes/1550/head MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit - 增加pud解码支持长短信解码及英文短信解码 - 修改按键投票机制,增加GPIO按键单独投票 --- .../brandy/porting/button/button_porting.c | 53 +++- .../drivers/drivers/driver/button/button.c | 8 +- code/sdk/drivers/peripheral/button/button.c | 9 +- code/sdk/drivers/peripheral/button/button.h | 4 +- code/sdk/drivers/peripheral/utils/pdu.c | 234 +++++++++++++++--- .../chips/brandy/pm/include/pm_definition.h | 1 + code/sdk/middleware/chips/brandy/pm/pm.c | 1 + 7 files changed, 268 insertions(+), 42 deletions(-) diff --git a/code/sdk/drivers/chips/brandy/porting/button/button_porting.c b/code/sdk/drivers/chips/brandy/porting/button/button_porting.c index e319507e7..ea0e58763 100755 --- a/code/sdk/drivers/chips/brandy/porting/button/button_porting.c +++ b/code/sdk/drivers/chips/brandy/porting/button/button_porting.c @@ -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 = { diff --git a/code/sdk/drivers/drivers/driver/button/button.c b/code/sdk/drivers/drivers/driver/button/button.c index 6e0fb2a0c..2a9ab717c 100644 --- a/code/sdk/drivers/drivers/driver/button/button.c +++ b/code/sdk/drivers/drivers/driver/button/button.c @@ -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(); } diff --git a/code/sdk/drivers/peripheral/button/button.c b/code/sdk/drivers/peripheral/button/button.c index e038cd5c6..88e8a4f8b 100644 --- a/code/sdk/drivers/peripheral/button/button.c +++ b/code/sdk/drivers/peripheral/button/button.c @@ -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(); } diff --git a/code/sdk/drivers/peripheral/button/button.h b/code/sdk/drivers/peripheral/button/button.h index a32acabc0..4e644042f 100644 --- a/code/sdk/drivers/peripheral/button/button.h +++ b/code/sdk/drivers/peripheral/button/button.h @@ -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; /** diff --git a/code/sdk/drivers/peripheral/utils/pdu.c b/code/sdk/drivers/peripheral/utils/pdu.c index cff60cbb9..f793b1a0f 100644 --- a/code/sdk/drivers/peripheral/utils/pdu.c +++ b/code/sdk/drivers/peripheral/utils/pdu.c @@ -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>(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