20190816
Dependencies: LCD_DISCO_F429ZI TS_DISCO_F429ZI BSP_DISCO_F429ZI
Diff: TxRxService.cpp
- Revision:
- 0:81007dc65bac
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TxRxService.cpp Fri Aug 16 22:22:05 2019 +0000 @@ -0,0 +1,101 @@ +#include "PrjDefs.h" + +UsedSerialClass Wcom(WorkTx,WorkRx); + +uint8_t ArrTx[ArrTxSize] = ArrTxInitializer; +MsgType ArrRx; +MsgType RxBuff; +MsgType TxBuff; +uint8_t *pArrTx = &ArrTx[0]; +uint8_t *pArrRx = &ArrRx.cmd; +bool RxBuffFull = 0; +bool ArrTxBusy = 0; +bool TxBuffFull = 0; +bool HdrRcvd = 0; +bool MsgEnabled = 0; +uint8_t HBctr = 0; + +uint8_t GetCheckSum(uint8_t *p){ + uint8_t cs = 0; + for(int i = 0; i < (sizeof(MsgType)-1); i++){ + cs = cs + *(p++); + cs = cs + 1; + } + return cs; + } + +void IntrTx(); + +void CopyArr_InitTx(uint8_t *parr){ + memcpy(&ArrTx[HeaderLength], parr, sizeof(TxBuff)); + pArrTx = &ArrTx[0]; + Wcom.putc(*pArrTx); + if(!ArrTxBusy) { + ArrTxBusy = 1; + Wcom.attach(IntrTx, Serial::TxIrq); + } + TxBuffFull = 0; + } + +void IntrTx() { + if ( ++pArrTx <= &ArrTx[ArrTxSize-1] ) Wcom.putc(*pArrTx); + else { + if(TxBuffFull) CopyArr_InitTx(&TxBuff.cmd); + else { + Wcom.attach(NULL, Serial::TxIrq); + ArrTxBusy = 0; + } + } + }//IntrTx + +TxRxStates SendMsg(uint8_t *parr){ + if(TxBuffFull){ return TxBuffBusy; } + *(parr + (sizeof(MsgType)-1)) = GetCheckSum(parr); + if(ArrTxBusy) { //ВНИМАНИЕ!!! IntrTx последнего байта пакета!!! НЕАТОМАРНЫЙ КУСОК КОДА!!! + memcpy(&TxBuff.cmd, parr, sizeof(TxBuff)); //ВНИМАНИЕ!!! IntrTx последнего байта пакета!!! НЕАТОМАРНЫЙ КУСОК КОДА!!! + TxBuffFull=1; //ВНИМАНИЕ!!! IntrTx последнего байта пакета!!! НЕАТОМАРНЫЙ КУСОК КОДА!!! + if(!ArrTxBusy) CopyArr_InitTx(&TxBuff.cmd);//ВНИМАНИЕ!!! IntrTx последнего байта пакета!!! НЕАТОМАРНЫЙ КУСОК КОДА!!! + } else CopyArr_InitTx(parr); + return TxOK; + }//StartTx + +void IntrRx() { + uint8_t _ch = Wcom.getc(); + if(_ch == HeaderByte){ + if((++HBctr) >= HeaderLength){ + HdrRcvd = 1; + pArrRx = &ArrRx.cmd; + MsgEnabled = 0; + } + }else{ + HBctr = 0; + if(HdrRcvd) { HdrRcvd = 0; MsgEnabled = 1; } + } + if(MsgEnabled){ + *pArrRx = _ch; + if ( pArrRx++ >= &ArrRx.cs ){ + pArrRx = &ArrRx.cmd; + memcpy(&RxBuff.cmd, &ArrRx.cmd, sizeof(RxBuff)); + RxBuffFull = 1; + MsgEnabled = 0; + } + }//if(MsgEnabled) + }//IntrRx + +void TxRxServiceInit(){ +#ifdef BaudRate + Wcom.baud(BaudRate); +#endif + Wcom.attach(IntrRx, Serial::RxIrq); + Wcom.attach(NULL, Serial::TxIrq);//я УПЁРТЫЙ дебил + } + +TxRxStates GetMsg(uint8_t *parr){ + if(!RxBuffFull) return RxBuffEmpty; + else{ + memcpy(parr, &RxBuff.cmd, sizeof(RxBuff)); + RxBuffFull = 0; + if(GetCheckSum(&RxBuff.cmd) == RxBuff.cs) return RxRcvd; + else return RxCS_Err; + } + }//GetMsg \ No newline at end of file