| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- #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;i<testcount.count-1;i++){
- if(testcount.exittest[i].status != testcount.exittest[i+1].status){
- testcount.width[testcount.wCount++] = testcount.exittest[i+1].tick - testcount.exittest[i].tick;
- }
- }
- printf("count = %d\n",testcount.wCount);
- for(i=1;i<testcount.wCount;i++){
- if(minTick>testcount.width[i]) minTick = testcount.width[i];
- if(maxTick<testcount.width[i]) maxTick = testcount.width[i];
- sum += testcount.width[i];
- printf("%d ",testcount.width[i]);
- }
- printf("\n");
- minTick = (sum - minTick - maxTick)/18;
- g_timeInfo.delay = minTick/6;
-
- }
- if(g_timeInfo.delay >200) 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;i<g_runNode.slaveNum;i++){
- // g_runNode.nodMsg[i].status = 1;
- // g_runNode.nodMsg[i].readCount = 0;
- // }
- }
- /*------------------------------------------------------------------------
- * 主处理485的 发送fifo
- * 用于服务器下发指令读取从的数据
- * 没有数据发送时返回为1 有数据发送时,返回为0
- * -----------------------------------------------------------------------*/
- uint8_t master_deal_485_tx_fifo(void)
- {
- FIFO_T *fifo = &g_txfifo;
- if(fifo_is_empty(fifo) == TRUE) return 1; // fifo为空时,退出
- printf("发送485 tx fifo 中的数据\r\n");
- usart_tx_dma_send(USART1,fifo->memory[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;
- }
- }
|