20190816

Dependencies:   LCD_DISCO_F429ZI TS_DISCO_F429ZI BSP_DISCO_F429ZI

Committer:
VASKO
Date:
Fri Aug 16 22:22:05 2019 +0000
Revision:
0:81007dc65bac
20190816

Who changed what in which revision?

UserRevisionLine numberNew contents of line
VASKO 0:81007dc65bac 1 #include "PrjDefs.h"
VASKO 0:81007dc65bac 2
VASKO 0:81007dc65bac 3 UsedSerialClass Wcom(WorkTx,WorkRx);
VASKO 0:81007dc65bac 4
VASKO 0:81007dc65bac 5 uint8_t ArrTx[ArrTxSize] = ArrTxInitializer;
VASKO 0:81007dc65bac 6 MsgType ArrRx;
VASKO 0:81007dc65bac 7 MsgType RxBuff;
VASKO 0:81007dc65bac 8 MsgType TxBuff;
VASKO 0:81007dc65bac 9 uint8_t *pArrTx = &ArrTx[0];
VASKO 0:81007dc65bac 10 uint8_t *pArrRx = &ArrRx.cmd;
VASKO 0:81007dc65bac 11 bool RxBuffFull = 0;
VASKO 0:81007dc65bac 12 bool ArrTxBusy = 0;
VASKO 0:81007dc65bac 13 bool TxBuffFull = 0;
VASKO 0:81007dc65bac 14 bool HdrRcvd = 0;
VASKO 0:81007dc65bac 15 bool MsgEnabled = 0;
VASKO 0:81007dc65bac 16 uint8_t HBctr = 0;
VASKO 0:81007dc65bac 17
VASKO 0:81007dc65bac 18 uint8_t GetCheckSum(uint8_t *p){
VASKO 0:81007dc65bac 19 uint8_t cs = 0;
VASKO 0:81007dc65bac 20 for(int i = 0; i < (sizeof(MsgType)-1); i++){
VASKO 0:81007dc65bac 21 cs = cs + *(p++);
VASKO 0:81007dc65bac 22 cs = cs + 1;
VASKO 0:81007dc65bac 23 }
VASKO 0:81007dc65bac 24 return cs;
VASKO 0:81007dc65bac 25 }
VASKO 0:81007dc65bac 26
VASKO 0:81007dc65bac 27 void IntrTx();
VASKO 0:81007dc65bac 28
VASKO 0:81007dc65bac 29 void CopyArr_InitTx(uint8_t *parr){
VASKO 0:81007dc65bac 30 memcpy(&ArrTx[HeaderLength], parr, sizeof(TxBuff));
VASKO 0:81007dc65bac 31 pArrTx = &ArrTx[0];
VASKO 0:81007dc65bac 32 Wcom.putc(*pArrTx);
VASKO 0:81007dc65bac 33 if(!ArrTxBusy) {
VASKO 0:81007dc65bac 34 ArrTxBusy = 1;
VASKO 0:81007dc65bac 35 Wcom.attach(IntrTx, Serial::TxIrq);
VASKO 0:81007dc65bac 36 }
VASKO 0:81007dc65bac 37 TxBuffFull = 0;
VASKO 0:81007dc65bac 38 }
VASKO 0:81007dc65bac 39
VASKO 0:81007dc65bac 40 void IntrTx() {
VASKO 0:81007dc65bac 41 if ( ++pArrTx <= &ArrTx[ArrTxSize-1] ) Wcom.putc(*pArrTx);
VASKO 0:81007dc65bac 42 else {
VASKO 0:81007dc65bac 43 if(TxBuffFull) CopyArr_InitTx(&TxBuff.cmd);
VASKO 0:81007dc65bac 44 else {
VASKO 0:81007dc65bac 45 Wcom.attach(NULL, Serial::TxIrq);
VASKO 0:81007dc65bac 46 ArrTxBusy = 0;
VASKO 0:81007dc65bac 47 }
VASKO 0:81007dc65bac 48 }
VASKO 0:81007dc65bac 49 }//IntrTx
VASKO 0:81007dc65bac 50
VASKO 0:81007dc65bac 51 TxRxStates SendMsg(uint8_t *parr){
VASKO 0:81007dc65bac 52 if(TxBuffFull){ return TxBuffBusy; }
VASKO 0:81007dc65bac 53 *(parr + (sizeof(MsgType)-1)) = GetCheckSum(parr);
VASKO 0:81007dc65bac 54 if(ArrTxBusy) { //ВНИМАНИЕ!!! IntrTx последнего байта пакета!!! НЕАТОМАРНЫЙ КУСОК КОДА!!!
VASKO 0:81007dc65bac 55 memcpy(&TxBuff.cmd, parr, sizeof(TxBuff)); //ВНИМАНИЕ!!! IntrTx последнего байта пакета!!! НЕАТОМАРНЫЙ КУСОК КОДА!!!
VASKO 0:81007dc65bac 56 TxBuffFull=1; //ВНИМАНИЕ!!! IntrTx последнего байта пакета!!! НЕАТОМАРНЫЙ КУСОК КОДА!!!
VASKO 0:81007dc65bac 57 if(!ArrTxBusy) CopyArr_InitTx(&TxBuff.cmd);//ВНИМАНИЕ!!! IntrTx последнего байта пакета!!! НЕАТОМАРНЫЙ КУСОК КОДА!!!
VASKO 0:81007dc65bac 58 } else CopyArr_InitTx(parr);
VASKO 0:81007dc65bac 59 return TxOK;
VASKO 0:81007dc65bac 60 }//StartTx
VASKO 0:81007dc65bac 61
VASKO 0:81007dc65bac 62 void IntrRx() {
VASKO 0:81007dc65bac 63 uint8_t _ch = Wcom.getc();
VASKO 0:81007dc65bac 64 if(_ch == HeaderByte){
VASKO 0:81007dc65bac 65 if((++HBctr) >= HeaderLength){
VASKO 0:81007dc65bac 66 HdrRcvd = 1;
VASKO 0:81007dc65bac 67 pArrRx = &ArrRx.cmd;
VASKO 0:81007dc65bac 68 MsgEnabled = 0;
VASKO 0:81007dc65bac 69 }
VASKO 0:81007dc65bac 70 }else{
VASKO 0:81007dc65bac 71 HBctr = 0;
VASKO 0:81007dc65bac 72 if(HdrRcvd) { HdrRcvd = 0; MsgEnabled = 1; }
VASKO 0:81007dc65bac 73 }
VASKO 0:81007dc65bac 74 if(MsgEnabled){
VASKO 0:81007dc65bac 75 *pArrRx = _ch;
VASKO 0:81007dc65bac 76 if ( pArrRx++ >= &ArrRx.cs ){
VASKO 0:81007dc65bac 77 pArrRx = &ArrRx.cmd;
VASKO 0:81007dc65bac 78 memcpy(&RxBuff.cmd, &ArrRx.cmd, sizeof(RxBuff));
VASKO 0:81007dc65bac 79 RxBuffFull = 1;
VASKO 0:81007dc65bac 80 MsgEnabled = 0;
VASKO 0:81007dc65bac 81 }
VASKO 0:81007dc65bac 82 }//if(MsgEnabled)
VASKO 0:81007dc65bac 83 }//IntrRx
VASKO 0:81007dc65bac 84
VASKO 0:81007dc65bac 85 void TxRxServiceInit(){
VASKO 0:81007dc65bac 86 #ifdef BaudRate
VASKO 0:81007dc65bac 87 Wcom.baud(BaudRate);
VASKO 0:81007dc65bac 88 #endif
VASKO 0:81007dc65bac 89 Wcom.attach(IntrRx, Serial::RxIrq);
VASKO 0:81007dc65bac 90 Wcom.attach(NULL, Serial::TxIrq);//я УПЁРТЫЙ дебил
VASKO 0:81007dc65bac 91 }
VASKO 0:81007dc65bac 92
VASKO 0:81007dc65bac 93 TxRxStates GetMsg(uint8_t *parr){
VASKO 0:81007dc65bac 94 if(!RxBuffFull) return RxBuffEmpty;
VASKO 0:81007dc65bac 95 else{
VASKO 0:81007dc65bac 96 memcpy(parr, &RxBuff.cmd, sizeof(RxBuff));
VASKO 0:81007dc65bac 97 RxBuffFull = 0;
VASKO 0:81007dc65bac 98 if(GetCheckSum(&RxBuff.cmd) == RxBuff.cs) return RxRcvd;
VASKO 0:81007dc65bac 99 else return RxCS_Err;
VASKO 0:81007dc65bac 100 }
VASKO 0:81007dc65bac 101 }//GetMsg