#include "taskOpt.h" #include "xspDataOpt.h" #include "masterslave.h" timeout_t g_upstatusTime; // 上报状态的时间 timeout_t g_upfirmTime; // 上报固件信息的时间 taskRunData g_taskRunDa; /*---------------------------------------------------------------- * 上电读取20次 comm端,找出comm端一个电平的最小时间 * ---------------------------------------------------------------*/ void power_up_read_comm_min_time(void) { #if(0) volatile int i; uint32_t minTick,maxTick,sum = 0; uint8_t flag = 0; // return; minTick=0xFFFFFFFF; maxTick=0x00; testcount.count = 0; testcount.btestStart = 1; exti_interrupt_enable(g_extimsg.extiLine); gpio_bit_reset(g_extimsg.csGroup,g_extimsg.csPin); start_delay_ms(2); while(!g_iDelayfinish); start_delay_ms(2000); while(1){ if(testcount.count>21) { gpio_bit_set(g_extimsg.csGroup,g_extimsg.csPin); testcount.btestStart = 0; break; } if(1 == g_iDelayfinish){ minTick = 0x00; testcount.count = 1; break; } if(testcount.count ==0){ if(timer_counter_read(TIMER5)>=300) { printf("未检测到探针板插入\r\n"); flag = 1; break; } } } stop_delay_ms(); testcount.wCount = 0; if(flag == 0) { for(i=0;itestcount.width[i]) minTick = testcount.width[i]; if(maxTick200) g_timeInfo.delay = 150; else if(g_timeInfo.delay ==0) g_timeInfo.delay = 150; printf("maintick=%d,maxtick=%d,delay=%d\n",minTick,maxTick,g_timeInfo.delay); gpio_bit_reset(g_extimsg.csGroup,g_extimsg.csPin); #endif } void init_run_data(void) { //uint8_t i; if(g_iDentity == IDENTITY_SLAVE) return; timeout_setValue(&g_uart485.time,2000); // 发送延时 timeout_setValue(&g_upstatusTime,READ_STATUS_TIME); // 读取状态的时间 timeout_setValue(&g_upfirmTime,READ_FIRME_TIME); // 读取固件的时间 g_taskRunDa.breadstatus = 1; g_taskRunDa.breadfirmmsg = 1; // g_runNode.slaveNum = 2; // g_runNode.nodMsg[0].devSn = 0x02; // g_runNode.nodMsg[0].devType = DEV_TYPE; // g_runNode.nodMsg[1].devSn = 0x03; // g_runNode.nodMsg[1].devType = DEV_TYPE; // for(i=0;imemory[fifo->front].da,fifo->memory[fifo->front].len); fifo->memory[fifo->front].len = 0; fifo->front++; fifo->front %= MAXSIZE; if (fifo->front == fifo->rear) // 设置队列为空 fifo->flag = FALSE; return 0; } /*------------------------------------------------------------ * 判断配置文件是否过期 * -----------------------------------------------------------*/ void config_file_is_timeout(void) { if(1 == g_taskRunDa.bcfgfiletime) { if(timeout_isOut(&g_taskRunDa.cfigFileTime)){ epprom_read_pin_config(); g_taskRunDa.bcfgfiletime = 0; } } } /*------------------------------------------------------------------------ * 主 从 解析485的接收fifo * -----------------------------------------------------------------------*/ void analysis_485_rx_fifo(void) { uint8_t readBuf[256],readlen; uint16_t crc,fcrc,randDa; MasterSlave *msg = (MasterSlave*)readBuf; if(fifo_is_empty(&g_rxfifo) == TRUE) return; readlen = fifo_read(&g_rxfifo,readBuf); if(0x01 == g_updateDa.bResetUpdate){ randDa = rand()%100 + 200; printf("随机时间 = %d\r\n",randDa); set_start_ota_timer(&g_otaTimer.randomTmr,randDa); } if(g_updateDa.Work_State == OTA_UPDATE_REPEAT && g_updateDa.retransmit_s == 0)//重传阶段 { ota_repeat_rand_timer(1);//重传随机延时 } if(msg->start != 0xfefe) { uart_pt_task(readBuf,0); // 判断是否进入产测执行 return; } // printf("readlen = %d, msglne = %d\n",readlen,msg->palen); // data_dump("aaaa",readBuf,readlen); crc = _crc16_get(readBuf,msg->palen+COMM_HEAD_LEN-2); fcrc = msg->comInfo.info[msg->palen-1]; fcrc = (fcrc<<8) | msg->comInfo.info[msg->palen-2]; if(fcrc != crc ) return; if((0x2000 == (msg->msgType2&0x2000))) { // 要考虑离线升级和升级的指令???? if(WORK_UPDATE == g_devMsg.workMode){ // 升级模式 if(IDENTITY_SLAVE == g_iDentity) return; // } else { if(B4G_NOHAVE== g_devMsg.bHave4G) { return; } else { if((g_devMsg.devSn != *(uint32_t*)&msg->comInfo.info[2]) \ && (g_devMsg.devType != *(uint16_t*)&msg->comInfo.info[0])){ printf("收到2000指令,设备类型和SN不匹配\r\n"); return; } } } } //data_dump("收到数据",readBuf,readlen); switch(msg->msgType1){ case 0x01: // 系统指令 analysis_cmd_system(msg->msgType2,readBuf,readlen); break; case 0x02: // 状态指令 analysis_cmd_status(msg->msgType2,readBuf,readlen); // 直接透传 break; case 0x03: // 数据指令 analysis_cmd_data(msg->msgType2,readBuf,readlen); break; case 0x04: // 升级指令 analysis_cmd_update(msg->msgType2,readBuf,readlen); break; case 0x10: // 日志指令 analysis_cmd_log(msg->msgType2,readBuf,readlen); break; } }