| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562 |
- #include "led.h"
- #include "app.h"
- #include "device.h"
- #include "ch455g.h"
- #include "net_proc.h"
- #include "bsp.h"
- #include "at_module.h"
- #include "net_ctrl.h"
- #include "me3616.h"
- #include "./gateway_collect/gateway_collect.h"
- #include "downlink.h"
- #include "uart_conf.h"
- #include "../APP/network/nettimer.h"
- #include "../APP/network_mgr/net_proc.h"
- extern ME3616 air;
- /*
- *********************************************************************************************************
- * LOCAL VARIABLES
- *********************************************************************************************************
- */
- extern float Temp_test(void);
- OS_TCB LED_TASK_HandleTCB;
- CPU_STK LED_TASK_HandleStk[APP_TASK_START_STK_SIZE];
- void LED_TASK_Handle(void * p_arg);
- OS_TCB UART_TASK_HandleTCB;
- CPU_STK UART_TASK_HandleStk[UART_TASK_START_STK_SIZE];
- void UART_TASK_Handle(void * p_arg);
- OS_TCB PROG_TASK_HandleTCB;
- CPU_STK PROG_TASK_HandleStk[PROG_TASK_START_STK_SIZE];
- void PROG_TASK_Handle(void * p_arg);
- OS_TCB SVC_TASK_HandleTCB;
- CPU_STK SVC_TASK_HandleStk[SVC_TASK_START_STK_SIZE];
- void SVC_TASK_Handle(void * p_arg);
- OS_TCB LORA_TASK_HandleTCB;
- CPU_STK LORA_TASK_HandleStk[LORA_TASK_START_STK_SIZE];
- void LORA_TASK_Handle(void * p_arg);
- OS_TCB INFO_TASK_HandleTCB;
- CPU_STK INFO_TASK_HandleStk[INFO_TASK_START_STK_SIZE];
- void INFO_TASK_Handle(void * p_arg);
- /*
- *********************************************************************************************************
- * STARTUP TASK
- *
- * Description : This is an example of a startup task. As mentioned in the book's text, you MUST
- * initialize the ticker only once multitasking has started.
- *
- * Arguments : p_arg is the argument passed to 'AppTaskStart()' by 'OSTaskCreate()'.
- *
- * Returns : none
- *
- * Notes : 1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
- * used. The compiler should not generate any code for this statement.
- *********************************************************************************************************
- */
- extern u8 USART3_RX_BUF[128]; //接收缓冲,最大USART_REC_LEN个字节.
- //接收状态
- //bit15, 接收完成标志
- //bit14, 接收到0x0d
- //bit13~0, 接收到的有效字节数目
- extern u16 USART3_RX_STA;
- extern int rcv_flag;
- int len;
- void init_powerup_ledstatus(void)
- {
- uint16_t ledstatus = 0;
- volatile uint32_t i = 0;
- ledstatus = (~ledstatus&0xFFFF);
- set_led_no_init_sn(ledstatus);
- for(i=0;i<500000;i++);
- //ledstatus = (~ledstatus&0x0FFF);
- // set_led_no_init_sn(ledstatus);
- }
- void AppTaskStart (void *p_arg)
- {
- OS_ERR err;
- uint16_t flash_size, ram_size;
- uint8_t chip_id[12];
- uint16_t data = 0;
- uint8_t usmflag = 0;
- g_ptTest.bTestStart = 0;
- BSP_Init(); // Initialize BSP functions
- CPU_Init(); // Initialize the uC/CPU services
- CH455_Init();
- // cmd_init(UART_DEBUG);
- init_powerup_ledstatus();
- cpuidGetId(); //读取芯片ID
- getcpuTypeIdcode();
- printf("\r\ App Start \r\n");
- data = BKP_ReadBackupRegister(BKP_DR2); // 升级标志
- if(data != 0){
- if(updata_state_cmp(data)){
- if((data&0x00ff) == 0x82){ // 升级成功
- data = set_updata_state(UPDATE_SUCCESS);
- BKP_WriteBackupRegister(BKP_DR3, data);
- printf("\r\n send to net update sucess\r\n");
- }
- else if((data&0x00ff) == 0x83) { // 回退成功
- data = set_updata_state(UPDATE_RETURN_SUCESS);
- BKP_WriteBackupRegister(BKP_DR3, data);
- printf("\r\n send to net return sucess\r\n");
- }
- printf("\r\n update status1 = %x\r\n",data);
- data = BKP_ReadBackupRegister(BKP_DR3);
- BKP_WriteBackupRegister(BKP_DR2, 0);
- g_runData.bsendUpdateStatus = data&0xFF;
- data = BKP_ReadBackupRegister(BKP_DR5);
- if(data == UP_PROG_FROM_NET) g_runData.bResetUpdate = 1;
- else g_runData.bResetUpdate = 2;
- BKP_WriteBackupRegister(BKP_DR5, 0);
- }
- }
- else{
- g_runData.bResetUpdate = 0;
- printf("\r\n no update program, data = %x\r\n",data);
- }
- // printf("coll_msg size = %d\r\n",sizeof(collect_conf_t));
- check_usim_status(0);
-
- #if OS_CFG_STAT_TASK_EN > 0u //如果使能(默认使能)了统计任务
- OSStatTaskCPUUsageInit(&err); //计算没有应用任务(只有空闲任务)运行时 CPU 的(最大)
- #endif //容量(决定 OS_Stat_IdleCtrMax 的值,为后面计算 CPU
- //使用率使用)。
- board_info_get(&flash_size, &ram_size, chip_id);
- #if 0//for test
- adc_test();
- SPI_FLASH_Test();
- SPI_E2PROM_Test();
- I2C_Test();
- can_test();
- #endif
- OSTaskCreate((OS_TCB *)&LED_TASK_HandleTCB,
- (CPU_CHAR *)"LED TASK Handle",
- (OS_TASK_PTR )LED_TASK_Handle,
- (void *)0,
- (OS_PRIO )LED_TASK_PRIO,
- (CPU_STK *)&LED_TASK_HandleStk[0],
- (CPU_STK_SIZE)APP_TASK_START_STK_SIZE / 10,
- (CPU_STK_SIZE)APP_TASK_START_STK_SIZE,
- (OS_MSG_QTY )0,
- (OS_TICK )0,
- (void *)0,
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
- (OS_ERR *)&err);
- OSTaskCreate((OS_TCB *)&UART_TASK_HandleTCB,
- (CPU_CHAR *)"UART TASK Handle",
- (OS_TASK_PTR )UART_TASK_Handle, //串口数据查询
- (void *)0,
- (OS_PRIO )UART_TASK_PRIO,
- (CPU_STK *)&UART_TASK_HandleStk[0],
- (CPU_STK_SIZE)UART_TASK_START_STK_SIZE / 10,
- (CPU_STK_SIZE)UART_TASK_START_STK_SIZE,
- (OS_MSG_QTY )0,
- (OS_TICK )0,
- (void *)0,
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
- (OS_ERR *)&err);
- OSTaskCreate((OS_TCB *)&LORA_TASK_HandleTCB,
- (CPU_CHAR *)"LORA TASK Handle",
- (OS_TASK_PTR )LORA_TASK_Handle, // lora数据处理
- (void *)0,
- (OS_PRIO )LORA_TASK_PRIO,
- (CPU_STK *)&LORA_TASK_HandleStk[0],
- (CPU_STK_SIZE)LORA_TASK_START_STK_SIZE / 10,
- (CPU_STK_SIZE)LORA_TASK_START_STK_SIZE,
- (OS_MSG_QTY )0,
- (OS_TICK )0,
- (void *)0,
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
- (OS_ERR *)&err);
- OSTaskCreate((OS_TCB *)&PROG_TASK_HandleTCB,
- (CPU_CHAR *)"PROG TASK Handle",
- (OS_TASK_PTR )PROG_TASK_Handle, // 4G模块收发处理
- (void *)0,
- (OS_PRIO )PROG_TASK_PRIO,
- (CPU_STK *)&PROG_TASK_HandleStk[0],
- (CPU_STK_SIZE)PROG_TASK_START_STK_SIZE / 10,
- (CPU_STK_SIZE)PROG_TASK_START_STK_SIZE,
- (OS_MSG_QTY )0,
- (OS_TICK )0,
- (void *)0,
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
- (OS_ERR *)&err);
- OSTaskCreate((OS_TCB *)&SVC_TASK_HandleTCB,
- (CPU_CHAR *)"SVC TASK Handle",
- (OS_TASK_PTR )SVC_TASK_Handle, // 设备初始化
- (void *)0,
- (OS_PRIO )SVC_TASK_PRIO,
- (CPU_STK *)&SVC_TASK_HandleStk[0],
- (CPU_STK_SIZE)SVC_TASK_START_STK_SIZE / 10,
- (CPU_STK_SIZE)SVC_TASK_START_STK_SIZE,
- (OS_MSG_QTY )0,
- (OS_TICK )0,
- (void *)0,
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
- (OS_ERR *)&err);
-
- OSTaskCreate((OS_TCB *)&INFO_TASK_HandleTCB,
- (CPU_CHAR *)"INFO TASK Handle",
- (OS_TASK_PTR )INFO_TASK_Handle, //网关查询采集器的信息 0x86 0x83 0x89这组协议是明文
- (void *)0,
- (OS_PRIO )INFO_TASK_PRIO,
- (CPU_STK *)&INFO_TASK_HandleStk[0],
- (CPU_STK_SIZE)INFO_TASK_START_STK_SIZE / 10,
- (CPU_STK_SIZE)INFO_TASK_START_STK_SIZE,
- (OS_MSG_QTY )0,
- (OS_TICK )0,
- (void *)0,
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
- (OS_ERR *)&err);
- OSTaskDel(&AppTaskStartTCB, &err);
-
- }
- uint8_t rcv_buf_pt[128], rcv_size = 0;
- uint8_t lora_buf[13] = "this is gw";
- void LED_TASK_Handle(void * p_arg)//信息传输装置
- {
- uint8_t i = 0;
- uint8_t key = 0;
- char val = 0;
- OS_ERR err;
- float vol=0.0,sumVol = 0.0,temperature = 0.0, sumTemperature = 0.0;
- uint16_t temp=0,updata_state_save= 0;
- static uint16_t times = 0,ledstatus = 0;
- static uint8_t flag = 0;
- (void)p_arg;
- SysTick_init();
- g_ledStatus.ledM = LED_M_LOW;
- while (1)
- {
- if(flag>=g_ledStatus.ledM){
- LED_RUN = !LED_RUN;
- flag = 0;
- if(downlink_config.gateway_id==0x00000000 || downlink_config.gateway_id==0xFFFFFFFF) {
- ledstatus = (~ledstatus&0x0FFF);
- ledstatus = ((g_firmwareExpl.dd<<4)&0xF000) | ledstatus;
- set_led_no_init_sn(ledstatus);
- }
- }
- flag++;
- key=KEY_Scan(0); //
- if(key == KEY0_PRES){
- printf("\n this is key \n");
- printf("Alarm Time:%d-%d-%d %d:%d:%d\n",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);//输出闹铃时间
- }
- else if(key == KEY1_PRES){ //
- if(key_info.state == 0){
- key_info.state = 1;
- key_info.num = 0;
- timeout_setValue(&key_info.tt_key_state,5*1000);//
- timeout_start(&key_info.tt_key_state);
- }
- key_info.num++;
- key_info.keyvalue = key;
- printf("key num:%d\n",key_info.num);
- }
- else if(key == KEY2_PRES){
- printf("按键k2 \n");
- updata_state = UPDATA_DATA_SUCCESS;
- updata_state_save = set_updata_state(updata_state);
- BKP_WriteBackupRegister(BKP_DR3, updata_state_save);
- //置升级标志
- updata_state_info.updata_flag = set_updata_state(UPDATA_FLAG);
- BKP_WriteBackupRegister(BKP_DR2, updata_state_info.updata_flag);
- }
- if(key_info.keyvalue == KEY1_PRES) {
- if(timeout_isOut(&key_info.tt_key_state))//按键计时
- {
- key_info.state = 0;
- if(key_info.num == 3) { // 5S内按三次,进行升级任务
- printf("key = 3\r\n");
- gateway_update_gateway_proc();
- }
- key_info.num = 0;
- }
- //lora组号灯计时
- if(timeout_isOut(&key_info.tt_key_state))//灯亮超时
- {
- if(key_info.optcmd == 3){
- key_info.optcmd = 0;
- }
- key_info.keyvalue = 0;
- }
- }
- if(times<5) {
- temp = get_adc(ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);
- vol = (float)temp*3300/4096;
- sumVol += vol;//
- temp = get_adc(ADC_Channel_16, 1, ADC_SampleTime_239Cycles5);
- temperature = (1.42 - temp*3.3/4096)*1000/4.35;// + 25;
- sumTemperature += temperature;//
- if(times>=4){
- vol = sumVol/5.0;
- sumVol = 0.0;
- g_firmwareMsg.gatewayMsg.fVol.fvoltage = vol/1000.0;
- temperature = sumTemperature/5.0;
- sumTemperature = 0.0;
- g_firmwareMsg.gatewayMsg.fTemper.ftemperature = temperature;
- // printf("ADC_Channel_0 Voltage measurement is : %f mV\r\n",vol); //
- // printf("ADC_Channel_16 Temper measurement is : %f C\r\n",temperature); //
- times= 0;
- }
- else
- times++;
- }
- OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_DLY, &err);
- /******************************/
- /*
- //屏蔽// uart_rs232_init(Console_UID, cmd_rcv);
- */
- rcv_size = uart_blocking_read((char *)rcv_buf_pt, UART_DEBUG, 10);
- if(rcv_size)
- {
- uart_cmd_task(rcv_buf_pt,rcv_size);
- }
- /******************************/
-
-
- }
- }
- extern u8 uart_redirect_cfg[UART_MAX];
- static int uart_rcv(u8 uartid, void *arg, u8 *pbuf, u16 buflen,u8 version)
- {
- int i;
- #if 0
- if(uart_redirect_cfg[uartid]) {
- uart_msg_send(uart_redirect_cfg[uartid] - 1, pbuf, buflen);
- } else {
- uart_msg_send(uartid, pbuf, buflen);
- }
- #endif
- printf("uart%d receive %d %s:\r\n", uartid+1, buflen, pbuf);
- for(i = 0;i < buflen;i++) {
- printf("%c", *(pbuf + i));
- }
- printf("\r\n");
- return 0;
- }
- u8 gps_buff[100];
- u8 gps_index = 0;
- static int gps_data_rcv(u8 uartid, void *arg, u8 *pbuf, u16 buflen,u8 version)
- {
- int i;
- for(i = 0;i < buflen;i++) {
- gps_buff[gps_index] = *(pbuf+i);
- if(gps_buff[gps_index] == '$') {
- gps_index = 0;
- gps_buff[gps_index] = *(pbuf+i);
- } else if((gps_buff[gps_index] == 0x0a)&&
- (gps_buff[gps_index-1] == 0x0d)) {
- if(strstr(gps_buff, "RMC")) {
- //printf("%s", gps_buff);
- }
- memset(gps_buff, 0 , gps_index);
- gps_index = 0;
- continue;
- }
- gps_index++;
- }
-
- return 0;
- }
- void UART_TASK_Handle(void * p_arg)//信息传输装置
- {
- u8 i;
- OS_ERR err;
- (void)p_arg;
- //char hello[32] = "hello world!!\n"
- SysTick_init();
- for(i = 0;i < UART_MAX;i++) {
- if(i == UART_DEBUG) {
- uart_rs232_init(i, NULL);
- continue;
- }
- else if(i == UART2_ID) {
- uart_rs232_init(i, gps_data_rcv);
- continue;
- } else {
- uart_rs232_init(i, NULL);
- continue;
- }
- }
- while (1)
- {
- for(i = 0;i < UART_MAX;i++) { //5个串口数据接收
- uart_rcv_process(i);
- //uart_msg_send(i, hello, sizeof(hello));
- OSTimeDlyHMSM(0, 0, 0, 10, OS_OPT_TIME_DLY, &err);
- }
- }
- }
- void PROG_TASK_Handle(void * p_arg)//信息传输装置
- {
- (void)p_arg;
- //char hello[32] = "hello world!!\n"
-
- SysTick_init();
- net_proc();
- }
- void SVC_TASK_Handle(void * p_arg)//信息传输装置
- {
- sys_eeprom_info_t info;
- (void)p_arg;
- SysTick_init();
- system_info_get(&info);
- gateway_power_info_get();
- info.DevId = g_firmwareMsg.gatewayMsg.hardwareMsg.gateway_sn;
- svc_proc(info.DevType, info.DevId);
- }
- void LORA_TASK_Handle(void * p_arg)//信息传输装置
- {
- OS_ERR err;
- (void)p_arg;
- SysTick_init();
- lora_init("golden_beans");
- while(1) {
- if(g_ptTest.bTestStart == PT_OFF ){
- lora_task();
- ota_process_handle();
- }
- OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_DLY, &err);
- }
- }
- extern void lora_send(char *tx_data, uint32_t tx_len);
- float tmper = 0.0;
- void INFO_TASK_Handle(void * p_arg)//
- {
- static uint8_t flag = 0;
- uint8_t ret = 0;
- OS_ERR err;
- (void)p_arg;
- SysTick_init();
- nettimer_init();
- timeout_setValue(&g_usmTimeOut,60*1000);
- // tax_init1();
- while(1) {
- if(g_ptTest.bTestStart == PT_ON ){
- OSTimeDlyHMSM(0, 0, 17, 0, OS_OPT_TIME_DLY, &err);
- continue;
- }
- if(sys_net.net_hdl && (downlink_config.config_flag == CONFIG_WRITE) && (g_runData.bInitNetProc==1))
- {
- gateway_net_send_gatewayMsg();
- gateway_reset_send_update_status();// 上报服务器网关自己的升级状态
- }
- if(((g_runData.cregStatus!=1) || (g_data4G.errorTime>=2) || (air.State.MQTT_State==0)) \
- && (sys_net.net_hdl!=NULL) && (g_runData.bUpdate==0)) { // 网络注册失败
- ret = check_usim_status(1);
- if((ret!=0) && (timeout_isOut(&g_usmTimeOut) ||(g_data4G.errorTime>=2) )){
- timeout_stop(&g_usmTimeOut);
- sys_net.net_hdl = NULL;
- sys_net.net_hdl = uplink_net_init((char*)g_upLinkTopic);
- sys_net.uplink_send = uplink_net_send; //上传数据的函数指针 4G
- sys_net.downlink_send = lora_send; // 下发数据的函数指针 lora
- device_init(0x0101, downlink_config.gateway_id);
- flag++;
- if(flag==1) timeout_setValue(&g_usmTimeOut,3*60*1000);
- else if(flag==2) timeout_setValue(&g_usmTimeOut,5*60*1000);
- else {
- flag = 3;
- timeout_setValue(&g_usmTimeOut,10*60*1000);
- }
- timeout_start(&g_usmTimeOut);
- if(g_data4G.errorTime>=2){
- printf("mqtt can not connect\r\n");
- }
- g_data4G.errorTime = 0;
- g_mqttRunDa.connectNum++;
- if(g_mqttRunDa.connectNum>=3) {
- g_mqttRunDa.bChangeSuc = 2; // 切换连接失败
- }
- }
- }
- else if(g_runData.cregStatus==1 && flag!=0){
- flag = 0;
- timeout_setValue(&g_usmTimeOut,60*1000);
- timeout_stop(&g_usmTimeOut);
- }
- if(g_mqttRunDa.bChangeMqtt == 1){ // 切换mqtt
- if(air.State.MQTT_State==1) { // 切换成功// 保存mqtt地址
- memset(&(g_firmwareMsg.mqttidport),0,sizeof(MqttIdPort));
- memcpy(g_firmwareMsg.mqttidport.ip,g_mqttRunDa.mqttMsg.ip,g_mqttRunDa.mqttIdlen);
- memcpy(g_firmwareMsg.mqttidport.port,g_mqttRunDa.mqttMsg.port,g_mqttRunDa.mqttPortlen);
- memcpy(g_firmwareMsg.mqttidport.admin,g_mqttRunDa.mqttMsg.admin,g_mqttRunDa.mqttUserlen);
- memcpy(g_firmwareMsg.mqttidport.password,g_mqttRunDa.mqttMsg.password,g_mqttRunDa.mqttPwdlen);
- g_firmwareMsg.mqttidport.flag = 1;
- fram_write_mqtt_msg();
- printf("mqtt 切换成功,并保存mqtt的地址\r\n");
- g_mqttRunDa.bChangeMqtt = 0;
- g_mqttRunDa.connectNum = 0;
- }
- else if((air.State.MQTT_State==0) && (g_mqttRunDa.bChangeSuc==2)){ // 切换失败
- // 恢复mqtt地址,进行重新连接
- g_mqttRunDa.bChangeMqtt = 0;
- g_mqttRunDa.connectNum = 0;
- timeout_stop(&g_usmTimeOut);
- printf("mqtt 切换失败,切换到原来的地址上\r\n");
- }
- }
- OSTimeDlyHMSM(0, 0, 17, 0, OS_OPT_TIME_DLY, &err);
- }
- }
|