vasko ozo
/
TxRxService
20190816
TxRxService.cpp
- Committer:
- VASKO
- Date:
- 2019-08-11
- Revision:
- 29:3cb748dd766d
- Parent:
- 28:55cd0598543b
File content as of revision 29:3cb748dd766d:
#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