优化cat1功耗,目前cat1可以自动休眠,cat1和bt已经实现互相唤醒功能
authorSnickerSun <snickersun@163.com>
Mon, 18 Mar 2024 07:43:56 +0000 (15:43 +0800)
committerSnickerSun <snickersun@163.com>
Mon, 18 Mar 2024 07:43:56 +0000 (15:43 +0800)
code/sdk/application/brandy/brandy_standard/thread_init.c
code/sdk/drivers/peripheral/slip/cat1Service/cat1_at_cmd.cpp
code/sdk/drivers/peripheral/slip/cat1Service/cat1_ctl.cpp
code/sdk/drivers/peripheral/slip/cat1Service/cat1_server.cpp
code/sdk/drivers/peripheral/slip/cat1Service/pyscript/cat1Service.py
code/sdk/drivers/peripheral/slip/cat1Service/pyscript/current_img/EG810MCNLAR06A01M08_VOLTE_OCPU_QPY_BETA0312/EG810MCNLAR06A01M08_VOLTE_OCPU_QPY_BETA0312_20240318-1541.zip [new file with mode: 0644]
code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c

index d46b989..e4f2691 100755 (executable)
@@ -132,7 +132,7 @@ app_task_definition_t g_app_tasks[] = {
     { { "bt_sdk", 0, NULL, 0, NULL, BTH_SDK_STACK_SIZE, TASK_PRIORITY_SDK, 0, 0 },
       (osThreadFunc_t)bt_acore_task_main, NULL, NULL, USE_DTCM_MEM },
 #ifdef SUPPORT_AT_CMD
-    { { "at_cmd", 0, NULL, 0, NULL, 0xC00, TASK_PRIORITY_APP, 0, 0 },
+    { { "at_cmd", 0, NULL, 0, NULL, 0x1C00, TASK_PRIORITY_APP, 0, 0 },
       (osThreadFunc_t)at_cmd_task_process_handler, NULL,
       (CreateQueueFunction_t)at_cmd_task_queue_init, USE_DTCM_MEM },
 #endif
index 5dc8529..8fd0cea 100644 (file)
@@ -170,7 +170,31 @@ static uint32_t cat1_nettest(uint8_t *para, uint32_t paraLen, char *strCommonCmd
 
     return ERRCODE_SUCC;
 }
+static uint32_t cat1_wakeup(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
+{
+    UNUSED(strCommonCmd);
+    uint8_t argv[PPG_MAX_ARGC][PPG_MAX_ARGV_LEN] = { 0 };
+    uint32_t argc = 0;
+
+    int ret = ConvertCmdToParam(para, paraLen, argv, &argc);
+    if (ret != PPG_SUCCESS) {
+        printf("CAT1TEST ATCMD Convert Command Failed\n");
+        return ERRCODE_FAIL;
+    }
+    if (argc != 1) {
+        printf("CAT1TEST ATCMD Set Parameter Failed\n");
+        return ERRCODE_FAIL;
+    }
+    // char *mode = (char*)argv[0];
+    int enabled = atoi((char*)argv[0]);
+    if(enabled == 0)
+        uapi_cat1_wakeup_cat1(0);
+    else 
+        uapi_cat1_wakeup_cat1(1);
+    printf("CAT1TEST ATCMD  wakeup cat1   enabled = %d\n",enabled);
 
+    return ERRCODE_SUCC;
+}
 #include "lwip/api_shell.h"
 static uint32_t cat1_ping(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
 {
@@ -183,10 +207,10 @@ static uint32_t cat1_ping(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
         printf("CAT1TEST ATCMD Convert Command Failed\n");
         return ERRCODE_FAIL;
     }
-
+    uapi_cat1_wakeup_cat1(1);
     u32_t sret= OsShellPing( argc, (const char *)argv[0]);
     printf("CAT1TEST ATCMD  ping   ret = 0x%X\n",sret);
-
+    uapi_cat1_wakeup_cat1(0);
     return ERRCODE_SUCC;
 }
 static uint32_t cat1_ifconfig(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
@@ -250,6 +274,7 @@ static const at_cmd_table_t g_cat1_cmd[] = {
     { (char *)"AT^CAT1GETTIME",      at_cat1_gettime, (char *)"1" },
     { (char *)"AT^CAT1NETTEST",      cat1_nettest, (char *)"1" },
     { (char *)"AT^PING",      cat1_ping, (char *)"1" },
+    { (char *)"AT^CAT1WAKECAT1",      cat1_wakeup, (char *)"1" },
     { (char *)"AT^IFCONFIG",      cat1_ifconfig, (char *)"1" },
     { (char *)"AT^CAT1GETVER",      at_cat1_getver, (char *)"1" },
     { (char *)"AT^CAT1RESETNETWORK",      AT_cat1_reset_network, (char *)"1" },
index ccf20b4..838d0d8 100644 (file)
@@ -6,7 +6,7 @@
 #include "cat1_ctl.h"
 #include "gpio.h"
 #include "gpio_porting.h"
-
+#include "tcxo.h"
 #include "voice_call_volte_sample_wrapper.h"
 
 #include "wearable_log.h"
@@ -92,24 +92,39 @@ void uapi_cat1_add_audio_vote(void)
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_MAIN_SERVICE,"\r\nCAT1 SERVICE MCU WAKEUP SUCCESS\r\n");
 }
 
+extern void restart_sleep_cat1_timer(void);
 void cat1_ring_isr_callback(pin_t pin, uintptr_t param)
 {
-    // WEARABLE_LOGW(WEARABLE_LOG_MODULE_MAIN_SERVICE,"cat1_ring_isr_callback %d 0x%X\n",pin,param);
+    WEARABLE_LOGW(WEARABLE_LOG_MODULE_MAIN_SERVICE,"cat1_ring_isr_callback %d 0x%X\n",pin,param);
     uapi_cat1_add_audio_vote();
+    restart_sleep_cat1_timer();
 }
 
 void uapi_cat1_wakeup_cat1(uint8_t wakeup)
 {
-    if( wakeup == 0)
+
+
+    if( wakeup == 1)
     {
+        WEARABLE_LOGW(WEARABLE_LOG_MODULE_MAIN_SERVICE,"wakeup cat1\n");
         uapi_gpio_set_dir(S_AGPIO_L30, GPIO_DIRECTION_OUTPUT);
-        uapi_gpio_set_val(S_AGPIO_L30, GPIO_LEVEL_HIGH);
+        if(GPIO_LEVEL_HIGH != uapi_gpio_get_output_val(S_AGPIO_L30))
+        {
+            uapi_gpio_set_val(S_AGPIO_L30, GPIO_LEVEL_HIGH);
+            uapi_tcxo_delay_ms(100); //第一次唤醒 Cat1 需要延时等其正常运行
+        }
+       
         // wstp_print("wakeup Cat1! L30 high \r\n");
     }else{
+        WEARABLE_LOGW(WEARABLE_LOG_MODULE_MAIN_SERVICE,"sleep cat1\n");
         uapi_gpio_set_dir(S_AGPIO_L30, GPIO_DIRECTION_OUTPUT);
-        uapi_gpio_set_val(S_AGPIO_L30, GPIO_LEVEL_LOW); 
+        if(GPIO_LEVEL_LOW != uapi_gpio_get_output_val(S_AGPIO_L30))
+        {
+            uapi_gpio_set_val(S_AGPIO_L30, GPIO_LEVEL_LOW);
+        }
         // wstp_print("sleep Cat1! L30 low\r\n");
     }
+    
 }
 
 void uapi_cat1_pre_init(void)
index b19b182..c7c232f 100644 (file)
@@ -102,6 +102,7 @@ struct tcp_msg_t {
 static int g_listen_sock = 0;
 struct sockaddr_in sourceAddr = {0};
 osTimerId_t g_timer_time_sync = NULL;
+osTimerId_t g_timer_cat1_sleep = NULL;
 static uint8_t g_time_synced = 0;
 
 static struct tcp_msg_t *unpack_tlv_format(char *rx_buffer, int length)
@@ -151,8 +152,8 @@ void udp_send_msg_toCat1(char cmd,char *content)
 {
     uapi_cat1_wakeup_cat1(1);
     
-    uart_port_register_irq(UART_BUS_0);
-
+    // uart_port_register_irq(UART_BUS_0);
+    osal_irq_enable(UART_1_IRQN);
     char station_tx_buffer[256] = {0};
     char station_head[2] = {0};
     if( sourceAddr.sin_port != 0 ) {
@@ -296,6 +297,33 @@ int cat1_handle_timesync(struct tcp_msg_t *msg)
 
     return 1;
 }
+
+static void timeout_handler_sleep_cat1(void)
+{
+    printf("sleep cat1\n");
+    uapi_cat1_remove_audio_vote(); //接收到指令,让自己可以睡
+    // uapi_cat1_wakeup_cat1(0);// 反馈给cat1,它也可以自己睡
+    if(osTimerIsRunning(g_timer_cat1_sleep)==1  )
+    {
+        osTimerStop(g_timer_cat1_sleep);
+    }
+}
+//目前只在 被cat1唤醒的中断函数里执行,
+void restart_sleep_cat1_timer(void)
+{
+    if (g_timer_cat1_sleep == NULL) return ;
+    if(osTimerIsRunning(g_timer_cat1_sleep)==1  )
+    {
+        osTimerStop(g_timer_cat1_sleep);
+    }
+    if(osTimerIsRunning(g_timer_cat1_sleep)==0  )
+    {
+        // WEARABLE_LOGI(WEARABLE_LOG_MODULE_MAIN_SERVICE,"restart_sleep_cat1_timer \n");
+        osTimerStart(g_timer_cat1_sleep,5000); //20秒后重试同步时间
+    }
+}
+
+
 static void time_sync_func(void)
 {
     
@@ -306,7 +334,6 @@ static void time_sync_func(void)
     {
         osTimerStop(g_timer_time_sync);
         WEARABLE_LOGI(WEARABLE_LOG_MODULE_MAIN_SERVICE,"cat1 g_time_synced == 1 stop timer \n");
-
     }
     
 }
@@ -511,10 +538,14 @@ errcode_t cat1_server_init(void)
     
     g_timer_time_sync = osTimerNew((osTimerFunc_t)time_sync_func, osTimerPeriodic, NULL, NULL);
 
-    if (g_timer_time_sync != NULL)
-        restart_time_sync();
-    else
-        printf("g_timer_time_sync create failed\n");
+    // if (g_timer_time_sync != NULL)
+    //     restart_time_sync();
+    // else
+    //     printf("g_timer_time_sync create failed\n");
+
+    g_timer_cat1_sleep = osTimerNew((osTimerFunc_t)timeout_handler_sleep_cat1, osTimerPeriodic, NULL, NULL);
+
+        
     return ERRCODE_SUCC;
 }
 
index c514dba..11c9ec0 100644 (file)
@@ -48,9 +48,9 @@ import atcmd
 import fota
 import request
 import ql_fs
-
+import pm
 PROJECT_NAME = "Cat1SlipUDPService"
-PROJECT_VERSION = "PY_SRV_V3"
+PROJECT_VERSION = "PY_SRV_V4"
 CONFIG_JSON="/usr/system_config.json"
 CURRENT_APP_TYPE="pysrv"
 
@@ -59,8 +59,10 @@ CURRENT_APP_TYPE="pysrv"
 log.basicConfig(level=log.INFO)
 cat1service_log = log.getLogger("cat1service")
 
-
-
+lpm_fd = pm.create_wakelock("system_lock", len("system_lock"))
+pm.autosleep(1)
+pm.wakelock_lock(lpm_fd)
+cat1service_log.info("create_wakelock {}".format(pm.get_wakelock_num()))
 
 def get_versionkeyname_by_py(app_type):
     return str("{}version".format(app_type))
@@ -94,15 +96,36 @@ def get_version_from_json_config(app_type):
 set_version_to_json_config(CURRENT_APP_TYPE,PROJECT_VERSION)
     
 
-
-timer = osTimer()
 audio.set_qdai_cfg(1,0,0,1,0,0,1,1)
 
-# GPIO21 - 86   KP_MKOUT1   唤醒主控
-# GPIO22 - 87   KP_MKIN     被主控唤醒
+# GPIO21 - 引脚 86   KP_MKOUT1   唤醒主控
+# GPIO22 - 引脚 87   KP_MKIN     被主控唤醒
+
+# GPIOn - GPIO号,int类型,点此查看GPIO引脚编号与物理引脚的映射关系。
+
+# direction - 输入输出模式,int类型,IN - 输入模式,OUT - 输出模式。
+
+# pullMode - 上下拉模式,int类型,说明如下:
+# PULL_DISABLE - 浮空模式
+# PULL_PU - 上拉模式
+# PULL_PD - 下拉模式
+
+# level - 引脚电平,int类型,0 - 设置引脚为低电平, 1- 设置引脚为高电平。
+# recvDataPin = Pin(Pin.GPIO22, Pin.IN, Pin.PULL_PU, 0)
 def ExtIntfun(args):
-        print('### interrupt  {} ###'.format(args)) # args[0]:gpio号 args[1]:上升沿或下降沿
-extint = ExtInt(ExtInt.GPIO22, ExtInt.IRQ_FALLING, ExtInt.PULL_PU, ExtIntfun)
+        # cat1service_log.info('### interrupt  {} ###'.format(args)) # args[0]:gpio号 args[1]:上升沿或下降沿
+        if args[1] == 0:
+            cat1service_log.info("disable autosleep")
+            # pm.autosleep(0)
+            pm.wakelock_lock(lpm_fd)
+        elif args[1] == 1:
+            cat1service_log.info("enable autosleep")
+            pm.wakelock_unlock(lpm_fd)
+            # pm.autosleep(1)
+        # cat1service_log.info("recvDataPin={}".format(recvDataPin.read()))
+extint = ExtInt(ExtInt.GPIO22, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, ExtIntfun)
+extint.enable()
+
 
 # 创建gpio对象
 gpioWakeBT = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_DISABLE, 1)
@@ -110,7 +133,7 @@ gpioWakeBT = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_DISABLE, 1)
 gpioWakeBT.set_dir(Pin.OUT)
 
 # 设置引脚电平
-# gpioWakeBT.write(1)
+gpioWakeBT.write(0)
 
 UDP_CMD_GET_CAT1VER = '0'  #获取 Cat1 版本号
 UDP_CMD_DIAL_NUMB = '1'              #拨打电话
@@ -170,6 +193,7 @@ class Cat1Service:
         self.__net_connected = 0
         self.__value = None
         self.__wait_resp = 0
+        self.__waiting_netstat = 0
         slip.destroy()
         print('slip uart={0}'.format (self.__uart))
 
@@ -196,7 +220,10 @@ class Cat1Service:
     def __socket_reinit(self):
         return self.__socket_init()
     
-    
+    def bootup_msg_to_bt(self):
+        modem_ver = modem.getDevFwVersion() 
+        self.reply_cmd('FF',"BOOTUP,pyVer,{},modemVer,{}".format(PROJECT_VERSION,modem_ver))
+
     def btmcu_cmd_handler(self,cmd,parm):
         print("btmcu_cmd_handler cmd {0} , args {1}".format(cmd,parm))
         if cmd == "F0":
@@ -286,16 +313,22 @@ class Cat1Service:
         return 0
     
     def wait_network_ready(self):
-        stage, state = checkNet.waitNetworkReady(1)
+        if(self.__waiting_netstat == 1):
+            return 0
+        self.__waiting_netstat = 1
+        stage, state = checkNet.waitNetworkReady(30)
+        pm.wakelock_unlock(lpm_fd)
         if stage == 3 and state == 1:
             print('Network connection successful.')
             self.set_network_config()
             self.__net_connected = 1
+            self.__waiting_netstat = 0
             return 0
         else:
             print('Network connection failed, stage={}, state={}'.format(stage, state))
             self.reset_network_config()
             self.__net_connected = 0
+            self.__waiting_netstat = 0
             return -1
 
     # 查询网卡状态
@@ -430,7 +463,10 @@ class Cat1Service:
         try:
             self.head = head
             self.content = content
-
+            gpioWakeBT.write(1)
+            utime.sleep_ms(2)
+            gpioWakeBT.write(0)
+            utime.sleep_ms(20)
             # 消息处理
             msg = self.__pack_tlv_format(self.head, self.content)
 
@@ -451,6 +487,10 @@ class Cat1Service:
     def __Socket_UDP_noreply(self, head, content):
         self.head = head
         self.content = content
+        gpioWakeBT.write(1)
+        utime.sleep_ms(2)
+        gpioWakeBT.write(0)
+        utime.sleep_ms(20)
         # 消息处理
         msg = self.__pack_tlv_format(self.head, self.content)
         # 向服务端发送消息
@@ -512,22 +552,15 @@ cat1service = Cat1Service()
 #voice call callback function
 def voice_callback(args):
     if args[0] == 10:
-        gpioWakeBT.write(0)
-        gpioWakeBT.write(1)
         print('voicecall incoming call, PhoneNO: ', args[6])
         # gpioWakeBT.write(1)
         cat1service.notifyIncomingcall(args[6])
     elif args[0] == 11:
-        gpioWakeBT.write(0)
-        gpioWakeBT.write(1)
         print('voicecall connected, PhoneNO: ', args[6])
         cat1service.notifyConnecteCall()
     elif args[0] == 12:
-        gpioWakeBT.write(0)
-        gpioWakeBT.write(1)
         print('voicecall disconnect')
         cat1service.notifyDisconnectCall()
-        # gpioWakeBT.write(0)
     elif args[0] == 13:
         print('voicecall is waiting, PhoneNO: ', args[6])
     elif args[0] == 14:
@@ -543,13 +576,28 @@ voiceCall.setCallback(voice_callback)
 
 def checknet_cb(arg):
     print("start checktime!!")
-    cat1service.wait_network_ready()
+    _thread.start_new_thread(cat1service.wait_network_ready, ())
     # time=utime.localtime()
     # zone=utime.getTimeZone()
     #(2024, 3, 2, 18, 31, 32, 5, 62),8
     # cat1service.timesync("{0},{1}".format(time,zone))
 
-timer.start(10000,1,checknet_cb)  
+timer = osTimer()
+# checknet_cb(())
+timer.start(30000,1,checknet_cb)  
+
+def bootupmsg_cb(arg):
+    cat1service.bootup_msg_to_bt()
+    
+
+delaybootupmsg_timer = osTimer()
+delaybootupmsg_timer.start(1000,0,bootupmsg_cb)
+
+# def checkpin_cb(arg):
+#     cat1service_log.info("recvDataPin={}".format(recvDataPin.read()))
+
+# timerCheckRevPin = osTimer()
+# timerCheckRevPin.start(1000,1,checkpin_cb)  
 
 
 # while True:
diff --git a/code/sdk/drivers/peripheral/slip/cat1Service/pyscript/current_img/EG810MCNLAR06A01M08_VOLTE_OCPU_QPY_BETA0312/EG810MCNLAR06A01M08_VOLTE_OCPU_QPY_BETA0312_20240318-1541.zip b/code/sdk/drivers/peripheral/slip/cat1Service/pyscript/current_img/EG810MCNLAR06A01M08_VOLTE_OCPU_QPY_BETA0312/EG810MCNLAR06A01M08_VOLTE_OCPU_QPY_BETA0312_20240318-1541.zip
new file mode 100644 (file)
index 0000000..ebc517c
Binary files /dev/null and b/code/sdk/drivers/peripheral/slip/cat1Service/pyscript/current_img/EG810MCNLAR06A01M08_VOLTE_OCPU_QPY_BETA0312/EG810MCNLAR06A01M08_VOLTE_OCPU_QPY_BETA0312_20240318-1541.zip differ
index cbc6aee..185ea95 100644 (file)
@@ -9,7 +9,7 @@
 
 #define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0]))
 #define CUSTOM_UTILS_MAX_ARGC            8
-#define CUSTOM_UTILS_MAX_ARGV_LEN        64
+#define CUSTOM_UTILS_MAX_ARGV_LEN        256
 
 #define CUSTOM_UTILS_SUCCESS             0
 #define CUSTOM_UTILS_FAILED              (-1)
@@ -94,6 +94,8 @@ void httpc_download_result(void *arg, httpc_result_t httpc_result, u32_t rx_cont
 {
     PRINT("httpc_download_result , httpc_result_t %d, rx_content_len %d , srv_res %d, err %d\n",
         httpc_result,rx_content_len,srv_res,err);
+    //通讯结束,休眠cat1
+    uapi_cat1_wakeup_cat1(0);
     return ;
 }
 
@@ -121,7 +123,8 @@ static uint32_t custom_start_ota_download(uint8_t *para, uint32_t paraLen, char
         return ERRCODE_FAIL;
     }
 
-   
+    //通讯开始,唤醒cat1
+    uapi_cat1_wakeup_cat1(1);
     uint8_t *uri = (uint8_t*)argv[0];
     uint8_t *otadatapath = (uint8_t*)argv[1];
     PRINT("custom_start_ota_download %s to %s\r\n",uri,otadatapath);