taskOpt.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  1. #include "taskOpt.h"
  2. #include "xspDataOpt.h"
  3. #include "masterslave.h"
  4. #include "up_4g.h"
  5. timeout_t g_upstatusTime; // 上报状态的时间
  6. timeout_t g_upfirmTime; // 上报固件信息的时间
  7. taskRunData g_taskRunDa;
  8. /*----------------------------------------------------------------
  9. * 上电读取20次 comm端,找出comm端一个电平的最小时间
  10. * ---------------------------------------------------------------*/
  11. void power_up_read_comm_min_time(void)
  12. {
  13. volatile int i;
  14. uint32_t minTick,maxTick;
  15. // return;
  16. minTick=0xFFFFFFFF;
  17. maxTick=0x00;
  18. testcount.count = 0;
  19. //gpio_bit_reset(g_extimsg.csGroup,g_extimsg.csPin);
  20. testcount.btestStart = 1;
  21. start_delay_ms(2000);
  22. while(1){
  23. if(testcount.count>20) {
  24. //gpio_bit_set(g_extimsg.csGroup,g_extimsg.csPin);
  25. testcount.btestStart = 0;
  26. break;
  27. }
  28. if(1 == g_iDelayfinish){
  29. minTick = 0x00;
  30. testcount.count = 1;
  31. break;
  32. }
  33. }
  34. stop_delay_ms();
  35. testcount.wCount = 0;
  36. for(i=0;i<testcount.count-1;i++){
  37. if(testcount.exittest[i].status != testcount.exittest[i+1].status){
  38. testcount.width[testcount.wCount++] = testcount.exittest[i+1].tick - testcount.exittest[i].tick;
  39. }
  40. }
  41. for(i=1;i<testcount.wCount;i++){
  42. if(minTick>testcount.width[i]) minTick = testcount.width[i];
  43. if(maxTick<testcount.width[i]) maxTick = testcount.width[i];
  44. }
  45. g_timeInfo.delay = minTick/3;
  46. g_timeInfo.delay = 200;
  47. printf("maintick=%d,maxtick=%d,delay=%d\r\n",minTick,maxTick,g_timeInfo.delay);
  48. //gpio_bit_reset(g_extimsg.csGroup,g_extimsg.csPin);
  49. }
  50. void init_run_data(void)
  51. {
  52. //uint8_t i;
  53. if(g_iDentity == IDENTITY_SLAVE) return;
  54. timeout_setValue(&g_uart485.time,2000); // 发送延时
  55. timeout_setValue(&g_upstatusTime,READ_STATUS_TIME); // 读取状态的时间
  56. timeout_setValue(&g_upfirmTime,READ_FIRME_TIME); // 读取固件的时间
  57. timeout_setValue(&g_logMsg.singTime,TIME_SING_N); // 读取信号采样率 10 分钟读取一次
  58. timeout_setValue(&g_taskRunDa.delayRead,300);
  59. g_taskRunDa.breadstatus = 1;
  60. g_taskRunDa.breadfirmmsg = 1;
  61. }
  62. /*------------------------------------------------------------------------------
  63. * 有4G模块的设备,且连接网络的状态下,上电要询问自己的身份
  64. * -----------------------------------------------------------------------------*/
  65. void ask_oneself_for_identity(void)
  66. {
  67. uint8_t sendbuff[128],len,ret;
  68. if((0x01 == g_devMsg.baskIdentity)&&(B4G_HAVE == g_devMsg.bHave4G) && (1 == g_4gMsg.bconnect)){
  69. memset(sendbuff,0,sizeof(sendbuff));
  70. up_system_cmd_0x2041(sendbuff,&len);
  71. ret = add_data_to_4G_txfifo(sendbuff,len,0x01,0x2041);
  72. if(1 == ret) g_devMsg.baskIdentity = 0x00;
  73. printf("4g mode ask own identity\r\n");
  74. }
  75. return;
  76. }
  77. /*-----------------------------------------------------------------------
  78. * 主读取自己的加油数据,存入到4G的发送fifo中
  79. * -----------------------------------------------------------------------*/
  80. //void master_deal_flash_data_to_4Grxfifo(void)
  81. //{
  82. // uint8_t ret;
  83. // XspDataInfo xspda;
  84. // ret = read_flash(xspda.data,1);
  85. // if(ret==1){
  86. // printf("发送数据到服务器:recordId=%d,amount=%d,oil=%d,tamout=%lld,toil=%lld\r\n",\
  87. // xspda.reDa.recordId,xspda.reDa.amount,xspda.reDa.oil,\
  88. // xspda.reDa.tamount,xspda.reDa.toil);
  89. // }
  90. //}
  91. /*------------------------------------------------------------------------
  92. * 读取从的数据
  93. * -----------------------------------------------------------------------*/
  94. void master_read_slave_data(void)
  95. {
  96. }
  97. timeout_t status2002time;
  98. /*-------------------------------------------------------------------------
  99. * 读取从的状态
  100. * -------------------------------------------------------------------------*/
  101. uint8_t master_read_slave_status(void)
  102. {
  103. static uint8_t index = 0,bsendMaster = 0;
  104. nodeMsg_t *nodeMsg = NULL;
  105. if(0 == bsendMaster){
  106. if(timeout_isOut(&status2002time)){
  107. master_add_status_to_4g_txfifo(0x02,0x2002,g_devMsg.devType,g_devMsg.devSn, SELF_STATUS);
  108. timeout_setValue(&status2002time,UP_STATUS_2002);
  109. timeout_start(&status2002time);
  110. }
  111. bsendMaster = 1;
  112. }
  113. if(1 == g_runNode.nodMsg[index].bSelf) {
  114. index++;
  115. }
  116. if(((index != 0) && ((index%g_runNode.slaveNum)==0))||(g_runNode.slaveNum==0)){ // 一圈的状态读取完成
  117. g_taskRunDa.breadstatus = 0;
  118. timeout_start(&g_upstatusTime);
  119. printf("读取状态信息 0x1002 完成\r\n");
  120. index = 0;
  121. bsendMaster = 0;
  122. return 1;
  123. }
  124. if((0 == g_runNode.nodMsg[index].status) ){//||(3 == g_uart485.time.endMode)
  125. g_devMsg.devTypeS = g_runNode.nodMsg[index].devType;
  126. g_devMsg.devSnS = g_runNode.nodMsg[index].devSn;
  127. if(g_runNode.nodMsg[index].bSelf !=1)master_add_status_to_4g_txfifo(0x02,0x2002,g_devMsg.devTypeS,g_devMsg.devSnS, SLAVE_OFFLINE);
  128. index++;
  129. }
  130. else {
  131. printf("读取状态信息 0x1002\r\n");
  132. nodeMsg = &g_runNode.nodMsg[index];
  133. g_devMsg.devTypeS = nodeMsg->devType;
  134. g_devMsg.devSnS = nodeMsg->devSn;
  135. master_read_status(0x1002,&g_devMsg);
  136. timeout_start(&g_uart485.time);
  137. index++;
  138. }
  139. return 0;
  140. }
  141. timeout_t mastertime;
  142. /*--------------------------------------------------------------------------
  143. * 读取从的固件信息
  144. * -------------------------------------------------------------------------*/
  145. void master_read_slave_firmmsg(void)
  146. {
  147. static uint8_t index = 0,bsendMaster=0;
  148. nodeMsg_t *nodeMsg = NULL;
  149. if(0 == bsendMaster){
  150. if(timeout_isOut(&mastertime)){
  151. master_add_status_to_4g_txfifo(0x02,0x2001,g_devMsg.devType,g_devMsg.devSn,SELF_STATUS);
  152. timeout_setValue(&mastertime,UP_STATUS_2001);
  153. timeout_start(&mastertime);
  154. }
  155. bsendMaster = 1;
  156. }
  157. if(1 == g_runNode.nodMsg[index].bSelf) {
  158. index++;
  159. }
  160. if((index != 0 && index%g_runNode.slaveNum==0)||(g_runNode.slaveNum==0)){ // 一圈的状态读取完成
  161. g_taskRunDa.breadfirmmsg = 0;
  162. timeout_start(&g_upfirmTime);
  163. printf("读取状态信息 0x1001 完成\r\n");
  164. index = 0;
  165. bsendMaster = 0;
  166. return ;
  167. }
  168. printf("读取状态信息 0x1001\r\n");
  169. nodeMsg = &g_runNode.nodMsg[index];
  170. g_devMsg.devTypeS = nodeMsg->devType;
  171. g_devMsg.devSnS = nodeMsg->devSn;
  172. master_read_status(0x1001,&g_devMsg);
  173. timeout_start(&g_uart485.time);
  174. index++;
  175. return ;
  176. }
  177. /*------------------------------------------------------------------------
  178. * 读取信号采样率
  179. *-------------------------------------------------------------------------*/
  180. void read_sing_ratio(void)
  181. {
  182. static uint8_t index = 0;
  183. nodeMsg_t *nodeMsg = NULL;
  184. if(1 == g_runNode.nodMsg[index].bSelf) {
  185. index++;
  186. }
  187. if(g_logMsg.singOpen == 0x00) {
  188. if((index != 0 && index%g_runNode.slaveNum==0)||(g_runNode.slaveNum==0)){ // 一圈的状态读取完成
  189. timeout_start(&g_logMsg.singTime);
  190. printf("自动读取 读取信号采样率 1063 完成\n");
  191. index = 0;
  192. return ;
  193. }
  194. printf("自动 读取信号采样率 1063 index = %d\n",index);
  195. nodeMsg = &g_runNode.nodMsg[index];
  196. g_devMsg.devTypeS = nodeMsg->devType;
  197. g_devMsg.devSnS = nodeMsg->devSn;
  198. master_read_log_0x1063(&g_devMsg);
  199. timeout_start(&g_uart485.time);
  200. index++;
  201. }
  202. else if(g_logMsg.singOpen == 1 ){
  203. if(!timeout_isOut(&g_logMsg.tsingTime)) {
  204. if(timeout_isOut(&g_logMsg.singTime)){
  205. printf("指令读取 1063 指令\n");
  206. g_devMsg.devTypeS =g_logMsg.devType;
  207. g_devMsg.devSnS = g_logMsg.devSn;
  208. master_read_log_0x1063(&g_devMsg);
  209. timeout_start(&g_uart485.time);
  210. timeout_start(&g_logMsg.singTime);
  211. }
  212. }
  213. else {
  214. g_logMsg.singOpen = 0;
  215. timeout_setValue(&g_logMsg.singTime,TIME_SING_N);
  216. timeout_start(&g_logMsg.singTime);
  217. }
  218. }
  219. }
  220. /*-----------------------------------------------------------------------------------
  221. * 主处理4G的接收数据
  222. * 先解析 计算校验,再根据type1的类型处理数据
  223. * ----------------------------------------------------------------------------------*/
  224. void master_deal_4g_rx_data(void)
  225. {
  226. uint8_t buff[256], bufflen;
  227. uint16_t crc,fcrc;
  228. netMsgFormat * msg = (netMsgFormat*)buff;
  229. read_mqtt_work_msg(); // 读取4G下发的数据,放入到4G rx fifo中
  230. if(fifo_is_empty(&g_4Grxfifo)== TRUE) return; // 4G fifo为空
  231. bufflen = fifo_read(&g_4Grxfifo,buff);
  232. if(msg->palen > 256) return;
  233. if(msg->start != 0xFEFE) return;
  234. crc = _crc16_get(buff,msg->palen+NET_HEAD_LEN-2);
  235. fcrc = msg->info[msg->palen-1];
  236. fcrc = (fcrc<<8) | msg->info[msg->palen-2];
  237. if(crc != fcrc) {printf("dn_4g crc error\r\n"); return;}
  238. printf("收到 4G 类型:0x%x, 指令: 0x%x\r\n",msg->msgType1,msg->msgType2);
  239. switch (msg->msgType1) {
  240. case 0x01: // 系统类
  241. dn_4g_system_cmd(msg->msgType2,buff,bufflen);
  242. break;
  243. case 0x02: // 状态类
  244. break;
  245. case 0x03: // 数据类
  246. dn_4g_data_cmd(msg->msgType2,buff,bufflen);
  247. break;
  248. case 0x04: // 升级类
  249. dn_4g_update_cmd(msg->msgType2,buff,bufflen);
  250. break;
  251. case 0x10: // 异常类
  252. dn_4g_log_cmd(msg->msgType2,buff,bufflen);
  253. break;
  254. default:
  255. break;
  256. }
  257. }
  258. /*-----------------------------------------------------------------------------------
  259. * 主处理4G的发送fifo
  260. * ----------------------------------------------------------------------------------*/
  261. void master_deal_4g_tx_data(void)
  262. {
  263. uint8_t buff[256],len;
  264. if(B4G_NOHAVE == g_devMsg.bHave4G) return;
  265. if(g_uart1Info.bSdFinish == 0) return; // 上次发送未完成
  266. if(fifo_is_empty(&g_4Gtxfifo) == TRUE) return ;// 发送fifo为空
  267. printf("发送4G数据到服务器\r\n");
  268. len = fifo_read(&g_4Gtxfifo,buff);
  269. data_dump("4g-data-to-server",buff,len);
  270. send_data_to_mqtt(0x00,buff,len);
  271. }
  272. /*------------------------------------------------------------------------
  273. * 主处理485的 发送fifo
  274. * 用于服务器下发指令读取从的数据
  275. * 没有数据发送时返回为1 有数据发送时,返回为0
  276. * -----------------------------------------------------------------------*/
  277. uint8_t master_deal_485_tx_fifo(void)
  278. {
  279. FIFO_T *fifo = &g_txfifo;
  280. if(fifo_is_empty(fifo) == TRUE) return 1; // fifo为空时,退出
  281. printf("发送485 tx fifo 中的数据\r\n");
  282. usart_tx_dma_send(UART3,fifo->memory[fifo->front].da,fifo->memory[fifo->front].len);
  283. fifo->memory[fifo->front].len = 0;
  284. fifo->front++;
  285. fifo->front %= MAXSIZE;
  286. if (fifo->front == fifo->rear) // 设置队列为空
  287. fifo->flag = FALSE;
  288. return 0;
  289. }
  290. /*-------------------------------------------------------------------------
  291. * 设备有4G模块,不管主设备或从设备都要上报自己的状态信息
  292. * ------------------------------------------------------------------------*/
  293. void dev_4g_up_status_to_server(void)
  294. {
  295. if(IDENTITY_MASTER == g_iDentity) return;
  296. if((B4G_HAVE == g_devMsg.bHave4G)&& timeout_isOut(&g_upstatusTime)){
  297. master_add_status_to_4g_txfifo(0x02,0x2002,g_devMsg.devType,g_devMsg.devSn, SELF_STATUS);
  298. //bsendMsg &= (~0x01);
  299. //if(IDENTITY_SLAVE == g_iDentity)
  300. timeout_start(&g_upstatusTime);
  301. }
  302. if((B4G_HAVE == g_devMsg.bHave4G) && timeout_isOut(&g_upfirmTime)){ // 有4G模块,不管是主从,都需要上报自己的状态
  303. master_add_status_to_4g_txfifo(0x02,0x2001,g_devMsg.devType,g_devMsg.devSn,SELF_STATUS);
  304. //bsendMsg &= (~0x02);
  305. //if(IDENTITY_SLAVE == g_iDentity)
  306. timeout_start(&g_upfirmTime);
  307. }
  308. }
  309. /*------------------------------------------------------------
  310. * 判断配置文件是否过期
  311. * -----------------------------------------------------------*/
  312. void config_file_is_timeout(void)
  313. {
  314. if(1 == g_taskRunDa.bcfgfiletime) {
  315. if(timeout_isOut(&g_taskRunDa.cfigFileTime)){
  316. epprom_read_pin_config();
  317. g_taskRunDa.bcfgfiletime = 0;
  318. }
  319. }
  320. }
  321. /*-----------------------------------------------------------
  322. * 8段码测试模式
  323. * ----------------------------------------------------------*/
  324. void open_8seg_test_mode(void)
  325. {
  326. uint8_t ret = 0,index;
  327. if(!timeout_isOut(&g_uart485.time)) return;
  328. ret = master_deal_485_tx_fifo();
  329. if(ret == 0) { // 485发送fifo有发送数据
  330. timeout_start(&g_uart485.time);
  331. return;
  332. }
  333. if(!timeout_isOut(&g_up7segData.upTime)){
  334. if(g_up7segData.bAppointDev == 2){
  335. g_devMsg.devTypeS = *((uint16_t*)&g_up7segData.devMsg[6]);
  336. g_devMsg.devSnS = *((uint32_t*)&g_up7segData.devMsg[8]);
  337. master_read_data_0x1030(&g_devMsg);
  338. }
  339. else { // 主从都有
  340. index = g_runNode.nIndex;
  341. if(1 == g_runNode.nodMsg[index].bSelf){
  342. g_runNode.nIndex = (++g_runNode.nIndex)%g_runNode.slaveNum;
  343. return;
  344. }
  345. }
  346. timeout_start(&g_uart485.time);
  347. }
  348. else {
  349. g_up7segData.bOpen = 0;
  350. g_up7segData.bAppointDev = 0;
  351. }
  352. }
  353. /*-----------------------------------------------------------------------
  354. * 如果为主,则循环读取从的数据
  355. * -----------------------------------------------------------------------*/
  356. void master_work_loop(void)
  357. {
  358. uint8_t index;
  359. uint8_t ret = 0;
  360. if(!timeout_isOut(&g_uart485.time)) return;
  361. if(!timeout_isOut(&g_taskRunDa.delayRead)) return;
  362. ret = master_deal_485_tx_fifo();
  363. if(ret == 0) { // 485发送fifo有发送数据
  364. timeout_start(&g_uart485.time);
  365. return;
  366. }
  367. if(IDENTITY_MASTER != g_iDentity) return;
  368. if(g_taskRunDa.breadstatus == 1 || timeout_isOut(&g_upstatusTime)){ // 读取状态
  369. master_read_slave_status();
  370. }
  371. else if(g_taskRunDa.breadfirmmsg == 1 || timeout_isOut(&g_upfirmTime)){ // 读取固件
  372. master_read_slave_firmmsg();
  373. }
  374. else if(timeout_isOut(&g_logMsg.singTime)){
  375. read_sing_ratio();
  376. }
  377. else { // 读取交易数据
  378. if(1 == g_up7segData.bOpen) return;
  379. if(g_4gMsg.bconnect == 0) return; // 4G 没有连接上网络则不读取交易数据
  380. if(g_runNode.slaveNum == 0 ) return;
  381. index = g_runNode.nIndex;
  382. if(1 == g_runNode.nodMsg[index].bSelf){
  383. g_runNode.nIndex = (++g_runNode.nIndex)%g_runNode.slaveNum;
  384. return;
  385. }
  386. g_devMsg.devTypeS = g_runNode.nodMsg[index].devType;
  387. g_devMsg.devSnS = g_runNode.nodMsg[index].devSn;
  388. g_runNode.nodMsg[index].readCount++;
  389. if(g_runNode.nodMsg[index].readCount>5){
  390. g_runNode.nodMsg[index].status = 0;
  391. g_runNode.nodMsg[index].readCount = 0;
  392. }
  393. printf("读取 0x03-1061,index = %d\r\n",index);
  394. /*if(1 == g_taskRunDa.keyReadcurData) master_read_data_0x1061(&g_devMsg,0xFFFFFFFF);
  395. else */
  396. master_read_data_0x1061(&g_devMsg,0);
  397. timeout_start(&g_uart485.time);
  398. g_runNode.nIndex = (++g_runNode.nIndex)%g_runNode.slaveNum;
  399. if(g_runNode.nIndex == 0) {
  400. g_taskRunDa.keyReadcurData = 0;
  401. }
  402. }
  403. }
  404. /*------------------------------------------------------------------------
  405. * 主 从 解析485的接收fifo
  406. * -----------------------------------------------------------------------*/
  407. void analysis_485_rx_fifo(void)
  408. {
  409. uint8_t readBuf[256],readlen;
  410. uint16_t crc,fcrc,randDa;
  411. MasterSlave *msg = (MasterSlave*)readBuf;
  412. if(fifo_is_empty(&g_rxfifo) == TRUE) return;
  413. readlen = fifo_read(&g_rxfifo,readBuf);
  414. if(0x01 == g_updateDa.bResetUpdate){
  415. randDa = rand()%100 + 200;
  416. printf("随机时间 = %d\r\n",randDa);
  417. set_start_ota_timer(&g_otaTimer.randomTmr,randDa);
  418. }
  419. if(g_updateDa.Work_State == OTA_UPDATE_REPEAT && g_updateDa.retransmit_s == 0)//重传阶段
  420. {
  421. ota_repeat_rand_timer(1);//重传随机延时
  422. }
  423. if(msg->start != 0xfefe) {
  424. uart_pt_task(readBuf,0); // 判断是否进入产测执行
  425. return;
  426. }
  427. crc = _crc16_get(readBuf,msg->palen+COMM_HEAD_LEN-2);
  428. fcrc = msg->comInfo.info[msg->palen-1];
  429. fcrc = (fcrc<<8) | msg->comInfo.info[msg->palen-2];
  430. if(fcrc != crc ) return;
  431. if((0x2000 == (msg->msgType2&0x2000))) { // 要考虑离线升级和升级的指令????
  432. if(WORK_UPDATE == g_devMsg.workMode){ // 升级模式
  433. if(IDENTITY_SLAVE == g_iDentity) return; //
  434. }
  435. else {
  436. if(B4G_NOHAVE== g_devMsg.bHave4G) {
  437. return;
  438. }
  439. else {
  440. if((g_devMsg.devSn != *(uint32_t*)&msg->comInfo.info[2]) \
  441. && (g_devMsg.devType != *(uint16_t*)&msg->comInfo.info[0])){
  442. printf("收到2000指令,设备类型和SN不匹配\r\n");
  443. return;
  444. }
  445. }
  446. }
  447. }
  448. //data_dump("收到数据",readBuf,readlen);
  449. printf("收到指令 %0d-%0x\r\n",msg->msgType1,msg->msgType2);
  450. switch(msg->msgType1){
  451. case 0x01: // 系统指令
  452. analysis_cmd_system(msg->msgType2,readBuf,readlen);
  453. break;
  454. case 0x02: // 状态指令
  455. analysis_cmd_status(msg->msgType2,readBuf,readlen); // 直接透传
  456. break;
  457. case 0x03: // 数据指令
  458. analysis_cmd_data(msg->msgType2,readBuf,readlen);
  459. break;
  460. case 0x04: // 升级指令
  461. analysis_cmd_update(msg->msgType2,readBuf,readlen);
  462. break;
  463. case 0x10: // 日志指令
  464. analysis_cmd_log(msg->msgType2,readBuf,readlen);
  465. break;
  466. }
  467. if(msg->msgType1 != 0x04){
  468. timeout_start(&g_taskRunDa.delayRead);
  469. }
  470. }