taskOpt.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #include "taskOpt.h"
  2. #include "xspDataOpt.h"
  3. #include "masterslave.h"
  4. timeout_t g_upstatusTime; // 上报状态的时间
  5. timeout_t g_upfirmTime; // 上报固件信息的时间
  6. taskRunData g_taskRunDa;
  7. /*----------------------------------------------------------------
  8. * 上电读取20次 comm端,找出comm端一个电平的最小时间
  9. * ---------------------------------------------------------------*/
  10. void power_up_read_comm_min_time(void)
  11. {
  12. #if(0)
  13. volatile int i;
  14. uint32_t minTick,maxTick,sum = 0;
  15. uint8_t flag = 0;
  16. // return;
  17. minTick=0xFFFFFFFF;
  18. maxTick=0x00;
  19. testcount.count = 0;
  20. testcount.btestStart = 1;
  21. exti_interrupt_enable(g_extimsg.extiLine);
  22. gpio_bit_reset(g_extimsg.csGroup,g_extimsg.csPin);
  23. start_delay_ms(2);
  24. while(!g_iDelayfinish);
  25. start_delay_ms(2000);
  26. while(1){
  27. if(testcount.count>21) {
  28. gpio_bit_set(g_extimsg.csGroup,g_extimsg.csPin);
  29. testcount.btestStart = 0;
  30. break;
  31. }
  32. if(1 == g_iDelayfinish){
  33. minTick = 0x00;
  34. testcount.count = 1;
  35. break;
  36. }
  37. if(testcount.count ==0){
  38. if(timer_counter_read(TIMER5)>=300) {
  39. printf("未检测到探针板插入\r\n");
  40. flag = 1;
  41. break;
  42. }
  43. }
  44. }
  45. stop_delay_ms();
  46. testcount.wCount = 0;
  47. if(flag == 0) {
  48. for(i=0;i<testcount.count-1;i++){
  49. if(testcount.exittest[i].status != testcount.exittest[i+1].status){
  50. testcount.width[testcount.wCount++] = testcount.exittest[i+1].tick - testcount.exittest[i].tick;
  51. }
  52. }
  53. printf("count = %d\n",testcount.wCount);
  54. for(i=1;i<testcount.wCount;i++){
  55. if(minTick>testcount.width[i]) minTick = testcount.width[i];
  56. if(maxTick<testcount.width[i]) maxTick = testcount.width[i];
  57. sum += testcount.width[i];
  58. printf("%d ",testcount.width[i]);
  59. }
  60. printf("\n");
  61. minTick = (sum - minTick - maxTick)/18;
  62. g_timeInfo.delay = minTick/6;
  63. }
  64. if(g_timeInfo.delay >200) g_timeInfo.delay = 150;
  65. else if(g_timeInfo.delay ==0) g_timeInfo.delay = 150;
  66. printf("maintick=%d,maxtick=%d,delay=%d\n",minTick,maxTick,g_timeInfo.delay);
  67. gpio_bit_reset(g_extimsg.csGroup,g_extimsg.csPin);
  68. #endif
  69. }
  70. void init_run_data(void)
  71. {
  72. //uint8_t i;
  73. if(g_iDentity == IDENTITY_SLAVE) return;
  74. timeout_setValue(&g_uart485.time,2000); // 发送延时
  75. timeout_setValue(&g_upstatusTime,READ_STATUS_TIME); // 读取状态的时间
  76. timeout_setValue(&g_upfirmTime,READ_FIRME_TIME); // 读取固件的时间
  77. g_taskRunDa.breadstatus = 1;
  78. g_taskRunDa.breadfirmmsg = 1;
  79. // g_runNode.slaveNum = 2;
  80. // g_runNode.nodMsg[0].devSn = 0x02;
  81. // g_runNode.nodMsg[0].devType = DEV_TYPE;
  82. // g_runNode.nodMsg[1].devSn = 0x03;
  83. // g_runNode.nodMsg[1].devType = DEV_TYPE;
  84. // for(i=0;i<g_runNode.slaveNum;i++){
  85. // g_runNode.nodMsg[i].status = 1;
  86. // g_runNode.nodMsg[i].readCount = 0;
  87. // }
  88. }
  89. /*------------------------------------------------------------------------
  90. * 主处理485的 发送fifo
  91. * 用于服务器下发指令读取从的数据
  92. * 没有数据发送时返回为1 有数据发送时,返回为0
  93. * -----------------------------------------------------------------------*/
  94. uint8_t master_deal_485_tx_fifo(void)
  95. {
  96. FIFO_T *fifo = &g_txfifo;
  97. if(fifo_is_empty(fifo) == TRUE) return 1; // fifo为空时,退出
  98. printf("发送485 tx fifo 中的数据\r\n");
  99. usart_tx_dma_send(USART1,fifo->memory[fifo->front].da,fifo->memory[fifo->front].len);
  100. fifo->memory[fifo->front].len = 0;
  101. fifo->front++;
  102. fifo->front %= MAXSIZE;
  103. if (fifo->front == fifo->rear) // 设置队列为空
  104. fifo->flag = FALSE;
  105. return 0;
  106. }
  107. /*------------------------------------------------------------
  108. * 判断配置文件是否过期
  109. * -----------------------------------------------------------*/
  110. void config_file_is_timeout(void)
  111. {
  112. if(1 == g_taskRunDa.bcfgfiletime) {
  113. if(timeout_isOut(&g_taskRunDa.cfigFileTime)){
  114. epprom_read_pin_config();
  115. g_taskRunDa.bcfgfiletime = 0;
  116. }
  117. }
  118. }
  119. /*------------------------------------------------------------------------
  120. * 主 从 解析485的接收fifo
  121. * -----------------------------------------------------------------------*/
  122. void analysis_485_rx_fifo(void)
  123. {
  124. uint8_t readBuf[256],readlen;
  125. uint16_t crc,fcrc,randDa;
  126. MasterSlave *msg = (MasterSlave*)readBuf;
  127. if(fifo_is_empty(&g_rxfifo) == TRUE) return;
  128. readlen = fifo_read(&g_rxfifo,readBuf);
  129. if(0x01 == g_updateDa.bResetUpdate){
  130. randDa = rand()%100 + 200;
  131. printf("随机时间 = %d\r\n",randDa);
  132. set_start_ota_timer(&g_otaTimer.randomTmr,randDa);
  133. }
  134. if(g_updateDa.Work_State == OTA_UPDATE_REPEAT && g_updateDa.retransmit_s == 0)//重传阶段
  135. {
  136. ota_repeat_rand_timer(1);//重传随机延时
  137. }
  138. if(msg->start != 0xfefe) {
  139. uart_pt_task(readBuf,0); // 判断是否进入产测执行
  140. return;
  141. }
  142. // printf("readlen = %d, msglne = %d\n",readlen,msg->palen);
  143. // data_dump("aaaa",readBuf,readlen);
  144. crc = _crc16_get(readBuf,msg->palen+COMM_HEAD_LEN-2);
  145. fcrc = msg->comInfo.info[msg->palen-1];
  146. fcrc = (fcrc<<8) | msg->comInfo.info[msg->palen-2];
  147. if(fcrc != crc ) return;
  148. if((0x2000 == (msg->msgType2&0x2000))) { // 要考虑离线升级和升级的指令????
  149. if(WORK_UPDATE == g_devMsg.workMode){ // 升级模式
  150. if(IDENTITY_SLAVE == g_iDentity) return; //
  151. }
  152. else {
  153. if(B4G_NOHAVE== g_devMsg.bHave4G) {
  154. return;
  155. }
  156. else {
  157. if((g_devMsg.devSn != *(uint32_t*)&msg->comInfo.info[2]) \
  158. && (g_devMsg.devType != *(uint16_t*)&msg->comInfo.info[0])){
  159. printf("收到2000指令,设备类型和SN不匹配\r\n");
  160. return;
  161. }
  162. }
  163. }
  164. }
  165. //data_dump("收到数据",readBuf,readlen);
  166. switch(msg->msgType1){
  167. case 0x01: // 系统指令
  168. analysis_cmd_system(msg->msgType2,readBuf,readlen);
  169. break;
  170. case 0x02: // 状态指令
  171. analysis_cmd_status(msg->msgType2,readBuf,readlen); // 直接透传
  172. break;
  173. case 0x03: // 数据指令
  174. analysis_cmd_data(msg->msgType2,readBuf,readlen);
  175. break;
  176. case 0x04: // 升级指令
  177. analysis_cmd_update(msg->msgType2,readBuf,readlen);
  178. break;
  179. case 0x10: // 日志指令
  180. analysis_cmd_log(msg->msgType2,readBuf,readlen);
  181. break;
  182. }
  183. }