#include "app_task_485.h" #include "../msp/uart0.h" #include "../msp/uart2.h" #include "../app/app_common.h" #define MODBUS_SLAVER_RETRY_MAX_TIME 3 TS_485 ts_485; void L3_task_485_init(void) { L1_task_init(&ts_485.task); L3_task_s_go(ts_485,D_task_init); ts_485.slaverIndex = 0; ts_485.pkglen = 0; ts_485.retryTimes = 0; } #define D_task_485_constructor_modbus_pkg 0x51 #define D_task_485_send_modbus_pkg 0x52 #define D_task_485_wait_modbus_ack 0x53 #define D_task_485_switch_next_slaver 0x54 void L3_task_485_handle(TS_485 *s) { TTSS_Task_init(); L2_task_go(D_task_485_constructor_modbus_pkg); TTSS_Task_step(D_task_485_constructor_modbus_pkg) if(G.md_slaver_info[s->slaverIndex].mask > 0) { s->pkglen = L3_pack_modbus(&s->loopPkg,G.md_slaver_info + s->slaverIndex); s->retryTimes = 0; L2_task_go(D_task_485_send_modbus_pkg); } else { L2_task_go(D_task_485_switch_next_slaver); } TTSS_Task_step(D_task_485_send_modbus_pkg) L0_uart2_sendArray((U8*)&s->loopPkg,s->pkglen); s->sendStamp = s_nos_tick.jiffies; s->slaver = G.md_slaver_info[s->slaverIndex].slaver; L2_task_go(D_task_485_wait_modbus_ack); TTSS_Task_step(D_task_485_wait_modbus_ack) if(s_uart2_rec.ok == 1) //接收到ack { s_uart2_rec.ok = 0; s->pAckPkg = (TS_PH4_modbus*)(s_uart2_rec.buf); if(s->pAckPkg->salver == s->slaver) { if(G.md_slaver_info[s->slaverIndex].mask == 1) { G.md_slaver_info[s->slaverIndex].mask = 0; } if(s->slaver == SLAVER_ASGA03_01 || s->slaver == SLAVER_ASGA03_02) //0和1是 倾角 { s->pAngle = (TS_Angle*)(s->pAckPkg->buf + 1); G.currentSensorVal[s->slaver - U485_BASE] = (U16)s->pAngle->xaxis[0] << 8 | s->pAngle->xaxis[1]; G.papers[s->slaver - U485_BASE].version = APP_VERSION_HEX; G.papers[s->slaver - U485_BASE].LowPower = 0x00; //1bit G.papers[s->slaver - U485_BASE].cameraNotWorking = 0x00; //1bit G.papers[s->slaver - U485_BASE].cameraIndex = s->slaver - U485_BASE; //4bit G.papers[s->slaver - U485_BASE].paperNum = L2_paper_count(s->slaver - U485_BASE, (U16)s->pAngle->xaxis[0] << 8 | s->pAngle->xaxis[1]); //10bit //L0_uart0_uc(s->pAngle->xaxis[0]); //L0_uart0_uc(s->pAngle->xaxis[1]); } L2_task_go(D_task_485_switch_next_slaver); } //else继续等待 } else if(s_nos_tick.jiffies - s->sendStamp >= 20) //超时 { if(++s->retryTimes >= MODBUS_SLAVER_RETRY_MAX_TIME) { if(s->slaver == SLAVER_ASGA03_01 || s->slaver == SLAVER_ASGA03_02) //0和1是 倾角 { G.papers[s->slaver - U485_BASE].version = APP_VERSION_HEX; G.papers[s->slaver - U485_BASE].LowPower = 0x00; //1bit G.papers[s->slaver - U485_BASE].cameraNotWorking = 0x01; //1bit G.papers[s->slaver - U485_BASE].cameraIndex = s->slaver - U485_BASE; //4bit G.papers[s->slaver - U485_BASE].paperNum = 0x00; //10bit } L2_task_go(D_task_485_switch_next_slaver); } else { L2_task_go(D_task_485_send_modbus_pkg); } } //else继续等待 //未接受到数据,但未超时 TTSS_Task_step(D_task_485_switch_next_slaver) if(++ s->slaverIndex >= MD_SLAVER_INFO_MAX) { s->slaverIndex = 0; } L2_task_go_Tdelay(D_task_485_constructor_modbus_pkg,D_Tdelay_400ms); TTSS_Task_end(); }