{ { "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
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)
{
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)
{ (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" },
#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"
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)
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)
{
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 ) {
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)
{
{
osTimerStop(g_timer_time_sync);
WEARABLE_LOGI(WEARABLE_LOG_MODULE_MAIN_SERVICE,"cat1 g_time_synced == 1 stop timer \n");
-
}
}
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;
}
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"
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))
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)
gpioWakeBT.set_dir(Pin.OUT)
# 设置引脚电平
-# gpioWakeBT.write(1)
+gpioWakeBT.write(0)
UDP_CMD_GET_CAT1VER = '0' #获取 Cat1 版本号
UDP_CMD_DIAL_NUMB = '1' #拨打电话
self.__net_connected = 0
self.__value = None
self.__wait_resp = 0
+ self.__waiting_netstat = 0
slip.destroy()
print('slip uart={0}'.format (self.__uart))
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":
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
# 查询网卡状态
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)
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)
# 向服务端发送消息
#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:
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:
#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)
{
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 ;
}
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);