taskOpt.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  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. /*-------------------------------------------------------------------------
  98. * 读取从的状态
  99. * -------------------------------------------------------------------------*/
  100. uint8_t master_read_slave_status(void)
  101. {
  102. static uint8_t index = 0,bsendMaster = 0;
  103. nodeMsg_t *nodeMsg = NULL;
  104. if(0 == bsendMaster){
  105. master_add_status_to_4g_txfifo(0x02,0x2002,g_devMsg.devType,g_devMsg.devSn, SELF_STATUS);
  106. bsendMaster = 1;
  107. }
  108. if(1 == g_runNode.nodMsg[index].bSelf) {
  109. index++;
  110. }
  111. if(((index != 0) && ((index%g_runNode.slaveNum)==0))||(g_runNode.slaveNum==0)){ // 一圈的状态读取完成
  112. g_taskRunDa.breadstatus = 0;
  113. timeout_start(&g_upstatusTime);
  114. printf("读取状态信息 0x1002 完成\r\n");
  115. index = 0;
  116. bsendMaster = 0;
  117. return 1;
  118. }
  119. if((0 == g_runNode.nodMsg[index].status) ){//||(3 == g_uart485.time.endMode)
  120. g_devMsg.devTypeS = g_runNode.nodMsg[index].devType;
  121. g_devMsg.devSnS = g_runNode.nodMsg[index].devSn;
  122. if(g_runNode.nodMsg[index].bSelf !=1)master_add_status_to_4g_txfifo(0x02,0x2002,g_devMsg.devTypeS,g_devMsg.devSnS, SLAVE_OFFLINE);
  123. index++;
  124. }
  125. else {
  126. printf("读取状态信息 0x1002\r\n");
  127. nodeMsg = &g_runNode.nodMsg[index];
  128. g_devMsg.devTypeS = nodeMsg->devType;
  129. g_devMsg.devSnS = nodeMsg->devSn;
  130. master_read_status(0x1002,&g_devMsg);
  131. timeout_start(&g_uart485.time);
  132. index++;
  133. }
  134. return 0;
  135. }
  136. /*--------------------------------------------------------------------------
  137. * 读取从的固件信息
  138. * -------------------------------------------------------------------------*/
  139. void master_read_slave_firmmsg(void)
  140. {
  141. static uint8_t index = 0,bsendMaster=0;
  142. nodeMsg_t *nodeMsg = NULL;
  143. if(0 == bsendMaster){
  144. master_add_status_to_4g_txfifo(0x02,0x2001,g_devMsg.devType,g_devMsg.devSn,SELF_STATUS);
  145. bsendMaster = 1;
  146. }
  147. if(1 == g_runNode.nodMsg[index].bSelf) {
  148. index++;
  149. }
  150. if((index != 0 && index%g_runNode.slaveNum==0)||(g_runNode.slaveNum==0)){ // 一圈的状态读取完成
  151. g_taskRunDa.breadfirmmsg = 0;
  152. timeout_start(&g_upfirmTime);
  153. printf("读取状态信息 0x1001 完成\r\n");
  154. index = 0;
  155. bsendMaster = 0;
  156. return ;
  157. }
  158. printf("读取状态信息 0x1001\r\n");
  159. nodeMsg = &g_runNode.nodMsg[index];
  160. g_devMsg.devTypeS = nodeMsg->devType;
  161. g_devMsg.devSnS = nodeMsg->devSn;
  162. master_read_status(0x1001,&g_devMsg);
  163. timeout_start(&g_uart485.time);
  164. index++;
  165. return ;
  166. }
  167. /*------------------------------------------------------------------------
  168. * 读取信号采样率
  169. *-------------------------------------------------------------------------*/
  170. void read_sing_ratio(void)
  171. {
  172. static uint8_t index = 0;
  173. nodeMsg_t *nodeMsg = NULL;
  174. if(1 == g_runNode.nodMsg[index].bSelf) {
  175. index++;
  176. }
  177. if(g_logMsg.singOpen == 0x00) {
  178. if((index != 0 && index%g_runNode.slaveNum==0)||(g_runNode.slaveNum==0)){ // 一圈的状态读取完成
  179. timeout_start(&g_logMsg.singTime);
  180. printf("自动读取 读取信号采样率 1063 完成\n");
  181. index = 0;
  182. return ;
  183. }
  184. printf("自动 读取信号采样率 1063 index = %d\n",index);
  185. nodeMsg = &g_runNode.nodMsg[index];
  186. g_devMsg.devTypeS = nodeMsg->devType;
  187. g_devMsg.devSnS = nodeMsg->devSn;
  188. master_read_log_0x1063(&g_devMsg);
  189. timeout_start(&g_uart485.time);
  190. index++;
  191. }
  192. else if(g_logMsg.singOpen == 1 ){
  193. if(!timeout_isOut(&g_logMsg.tsingTime)) {
  194. if(timeout_isOut(&g_logMsg.singTime)){
  195. printf("指令读取 1063 指令\n");
  196. g_devMsg.devTypeS =g_logMsg.devType;
  197. g_devMsg.devSnS = g_logMsg.devSn;
  198. master_read_log_0x1063(&g_devMsg);
  199. timeout_start(&g_uart485.time);
  200. timeout_start(&g_logMsg.singTime);
  201. }
  202. }
  203. else {
  204. g_logMsg.singOpen = 0;
  205. timeout_setValue(&g_logMsg.singTime,TIME_SING_N);
  206. timeout_start(&g_logMsg.singTime);
  207. }
  208. }
  209. }
  210. /*-----------------------------------------------------------------------------------
  211. * 主处理4G的接收数据
  212. * 先解析 计算校验,再根据type1的类型处理数据
  213. * ----------------------------------------------------------------------------------*/
  214. void master_deal_4g_rx_data(void)
  215. {
  216. uint8_t buff[256], bufflen;
  217. uint16_t crc,fcrc;
  218. netMsgFormat * msg = (netMsgFormat*)buff;
  219. read_mqtt_work_msg(); // 读取4G下发的数据,放入到4G rx fifo中
  220. if(fifo_is_empty(&g_4Grxfifo)== TRUE) return; // 4G fifo为空
  221. bufflen = fifo_read(&g_4Grxfifo,buff);
  222. if(msg->palen > 256) return;
  223. if(msg->start != 0xFEFE) return;
  224. crc = _crc16_get(buff,msg->palen+NET_HEAD_LEN-2);
  225. fcrc = msg->info[msg->palen-1];
  226. fcrc = (fcrc<<8) | msg->info[msg->palen-2];
  227. if(crc != fcrc) {printf("dn_4g crc error\r\n"); return;}
  228. printf("收到 4G 类型:0x%x, 指令: 0x%x\r\n",msg->msgType1,msg->msgType2);
  229. switch (msg->msgType1) {
  230. case 0x01: // 系统类
  231. dn_4g_system_cmd(msg->msgType2,buff,bufflen);
  232. break;
  233. case 0x02: // 状态类
  234. break;
  235. case 0x03: // 数据类
  236. dn_4g_data_cmd(msg->msgType2,buff,bufflen);
  237. break;
  238. case 0x04: // 升级类
  239. dn_4g_update_cmd(msg->msgType2,buff,bufflen);
  240. break;
  241. case 0x10: // 异常类
  242. dn_4g_log_cmd(msg->msgType2,buff,bufflen);
  243. break;
  244. default:
  245. break;
  246. }
  247. }
  248. /*-----------------------------------------------------------------------------------
  249. * 主处理4G的发送fifo
  250. * ----------------------------------------------------------------------------------*/
  251. void master_deal_4g_tx_data(void)
  252. {
  253. uint8_t buff[256],len;
  254. if(B4G_NOHAVE == g_devMsg.bHave4G) return;
  255. if(g_uart1Info.bSdFinish == 0) return; // 上次发送未完成
  256. if(fifo_is_empty(&g_4Gtxfifo) == TRUE) return ;// 发送fifo为空
  257. printf("发送4G数据到服务器\r\n");
  258. len = fifo_read(&g_4Gtxfifo,buff);
  259. data_dump("4g-data-to-server",buff,len);
  260. send_data_to_mqtt(0x00,buff,len);
  261. }
  262. /*------------------------------------------------------------------------
  263. * 主处理485的 发送fifo
  264. * 用于服务器下发指令读取从的数据
  265. * 没有数据发送时返回为1 有数据发送时,返回为0
  266. * -----------------------------------------------------------------------*/
  267. uint8_t master_deal_485_tx_fifo(void)
  268. {
  269. FIFO_T *fifo = &g_txfifo;
  270. if(fifo_is_empty(fifo) == TRUE) return 1; // fifo为空时,退出
  271. printf("发送485 tx fifo 中的数据\r\n");
  272. usart_tx_dma_send(UART3,fifo->memory[fifo->front].da,fifo->memory[fifo->front].len);
  273. fifo->memory[fifo->front].len = 0;
  274. fifo->front++;
  275. fifo->front %= MAXSIZE;
  276. if (fifo->front == fifo->rear) // 设置队列为空
  277. fifo->flag = FALSE;
  278. return 0;
  279. }
  280. /*-------------------------------------------------------------------------
  281. * 设备有4G模块,不管主设备或从设备都要上报自己的状态信息
  282. * ------------------------------------------------------------------------*/
  283. void dev_4g_up_status_to_server(void)
  284. {
  285. if(IDENTITY_MASTER == g_iDentity) return;
  286. if((B4G_HAVE == g_devMsg.bHave4G)&& timeout_isOut(&g_upstatusTime)){
  287. master_add_status_to_4g_txfifo(0x02,0x2002,g_devMsg.devType,g_devMsg.devSn, SELF_STATUS);
  288. //bsendMsg &= (~0x01);
  289. //if(IDENTITY_SLAVE == g_iDentity)
  290. timeout_start(&g_upstatusTime);
  291. }
  292. if((B4G_HAVE == g_devMsg.bHave4G) && timeout_isOut(&g_upfirmTime)){ // 有4G模块,不管是主从,都需要上报自己的状态
  293. master_add_status_to_4g_txfifo(0x02,0x2001,g_devMsg.devType,g_devMsg.devSn,SELF_STATUS);
  294. //bsendMsg &= (~0x02);
  295. //if(IDENTITY_SLAVE == g_iDentity)
  296. timeout_start(&g_upfirmTime);
  297. }
  298. }
  299. /*------------------------------------------------------------
  300. * 判断配置文件是否过期
  301. * -----------------------------------------------------------*/
  302. void config_file_is_timeout(void)
  303. {
  304. if(1 == g_taskRunDa.bcfgfiletime) {
  305. if(timeout_isOut(&g_taskRunDa.cfigFileTime)){
  306. epprom_read_pin_config();
  307. g_taskRunDa.bcfgfiletime = 0;
  308. }
  309. }
  310. }
  311. /*-----------------------------------------------------------
  312. * 8段码测试模式
  313. * ----------------------------------------------------------*/
  314. void open_8seg_test_mode(void)
  315. {
  316. uint8_t ret = 0,index;
  317. if(!timeout_isOut(&g_uart485.time)) return;
  318. ret = master_deal_485_tx_fifo();
  319. if(ret == 0) { // 485发送fifo有发送数据
  320. timeout_start(&g_uart485.time);
  321. return;
  322. }
  323. if(!timeout_isOut(&g_up7segData.upTime)){
  324. if(g_up7segData.bAppointDev == 2){
  325. g_devMsg.devTypeS = *((uint16_t*)&g_up7segData.devMsg[6]);
  326. g_devMsg.devSnS = *((uint32_t*)&g_up7segData.devMsg[8]);
  327. master_read_data_0x1030(&g_devMsg);
  328. }
  329. else { // 主从都有
  330. index = g_runNode.nIndex;
  331. if(1 == g_runNode.nodMsg[index].bSelf){
  332. g_runNode.nIndex = (++g_runNode.nIndex)%g_runNode.slaveNum;
  333. return;
  334. }
  335. }
  336. timeout_start(&g_uart485.time);
  337. }
  338. else {
  339. g_up7segData.bOpen = 0;
  340. g_up7segData.bAppointDev = 0;
  341. }
  342. }
  343. /*-----------------------------------------------------------------------
  344. * 如果为主,则循环读取从的数据
  345. * -----------------------------------------------------------------------*/
  346. void master_work_loop(void)
  347. {
  348. uint8_t index;
  349. uint8_t ret = 0;
  350. if(!timeout_isOut(&g_uart485.time)) return;
  351. if(!timeout_isOut(&g_taskRunDa.delayRead)) return;
  352. ret = master_deal_485_tx_fifo();
  353. if(ret == 0) { // 485发送fifo有发送数据
  354. timeout_start(&g_uart485.time);
  355. return;
  356. }
  357. if(IDENTITY_MASTER != g_iDentity) return;
  358. if(g_taskRunDa.breadstatus == 1 || timeout_isOut(&g_upstatusTime)){ // 读取状态
  359. master_read_slave_status();
  360. }
  361. else if(g_taskRunDa.breadfirmmsg == 1 || timeout_isOut(&g_upfirmTime)){ // 读取固件
  362. master_read_slave_firmmsg();
  363. }
  364. else if(timeout_isOut(&g_logMsg.singTime)){
  365. read_sing_ratio();
  366. }
  367. else { // 读取交易数据
  368. if(1 == g_up7segData.bOpen) return;
  369. if(g_4gMsg.bconnect == 0) return; // 4G 没有连接上网络则不读取交易数据
  370. if(g_runNode.slaveNum == 0 ) return;
  371. index = g_runNode.nIndex;
  372. if(1 == g_runNode.nodMsg[index].bSelf){
  373. g_runNode.nIndex = (++g_runNode.nIndex)%g_runNode.slaveNum;
  374. return;
  375. }
  376. g_devMsg.devTypeS = g_runNode.nodMsg[index].devType;
  377. g_devMsg.devSnS = g_runNode.nodMsg[index].devSn;
  378. g_runNode.nodMsg[index].readCount++;
  379. if(g_runNode.nodMsg[index].readCount>5){
  380. g_runNode.nodMsg[index].status = 0;
  381. g_runNode.nodMsg[index].readCount = 0;
  382. }
  383. printf("读取 0x03-1061,index = %d\r\n",index);
  384. /*if(1 == g_taskRunDa.keyReadcurData) master_read_data_0x1061(&g_devMsg,0xFFFFFFFF);
  385. else */
  386. master_read_data_0x1061(&g_devMsg,0);
  387. timeout_start(&g_uart485.time);
  388. g_runNode.nIndex = (++g_runNode.nIndex)%g_runNode.slaveNum;
  389. if(g_runNode.nIndex == 0) {
  390. g_taskRunDa.keyReadcurData = 0;
  391. }
  392. }
  393. }
  394. /*------------------------------------------------------------------------
  395. * 主 从 解析485的接收fifo
  396. * -----------------------------------------------------------------------*/
  397. void analysis_485_rx_fifo(void)
  398. {
  399. uint8_t readBuf[256],readlen;
  400. uint16_t crc,fcrc,randDa;
  401. MasterSlave *msg = (MasterSlave*)readBuf;
  402. if(fifo_is_empty(&g_rxfifo) == TRUE) return;
  403. readlen = fifo_read(&g_rxfifo,readBuf);
  404. if(0x01 == g_updateDa.bResetUpdate){
  405. randDa = rand()%100 + 200;
  406. printf("随机时间 = %d\r\n",randDa);
  407. set_start_ota_timer(&g_otaTimer.randomTmr,randDa);
  408. }
  409. if(g_updateDa.Work_State == OTA_UPDATE_REPEAT && g_updateDa.retransmit_s == 0)//重传阶段
  410. {
  411. ota_repeat_rand_timer(1);//重传随机延时
  412. }
  413. if(msg->start != 0xfefe) {
  414. uart_pt_task(readBuf,0); // 判断是否进入产测执行
  415. return;
  416. }
  417. crc = _crc16_get(readBuf,msg->palen+COMM_HEAD_LEN-2);
  418. fcrc = msg->comInfo.info[msg->palen-1];
  419. fcrc = (fcrc<<8) | msg->comInfo.info[msg->palen-2];
  420. if(fcrc != crc ) return;
  421. if((0x2000 == (msg->msgType2&0x2000))) { // 要考虑离线升级和升级的指令????
  422. if(WORK_UPDATE == g_devMsg.workMode){ // 升级模式
  423. if(IDENTITY_SLAVE == g_iDentity) return; //
  424. }
  425. else {
  426. if(B4G_NOHAVE== g_devMsg.bHave4G) {
  427. return;
  428. }
  429. else {
  430. if((g_devMsg.devSn != *(uint32_t*)&msg->comInfo.info[2]) \
  431. && (g_devMsg.devType != *(uint16_t*)&msg->comInfo.info[0])){
  432. printf("收到2000指令,设备类型和SN不匹配\r\n");
  433. return;
  434. }
  435. }
  436. }
  437. }
  438. //data_dump("收到数据",readBuf,readlen);
  439. printf("收到指令 %0d-%0x\r\n",msg->msgType1,msg->msgType2);
  440. switch(msg->msgType1){
  441. case 0x01: // 系统指令
  442. analysis_cmd_system(msg->msgType2,readBuf,readlen);
  443. break;
  444. case 0x02: // 状态指令
  445. analysis_cmd_status(msg->msgType2,readBuf,readlen); // 直接透传
  446. break;
  447. case 0x03: // 数据指令
  448. analysis_cmd_data(msg->msgType2,readBuf,readlen);
  449. break;
  450. case 0x04: // 升级指令
  451. analysis_cmd_update(msg->msgType2,readBuf,readlen);
  452. break;
  453. case 0x10: // 日志指令
  454. analysis_cmd_log(msg->msgType2,readBuf,readlen);
  455. break;
  456. }
  457. if(msg->msgType1 != 0x04){
  458. timeout_start(&g_taskRunDa.delayRead);
  459. }
  460. }