20190816

Dependencies:   mbed

TxRxService.cpp

Committer:
VASKO
Date:
2019-08-10
Revision:
27:21b821ead49c
Parent:
24:fba9a58e6fbd
Child:
28:55cd0598543b

File content as of revision 27:21b821ead49c:

#include "PrjDefs.h"

UsedSerialClass pc(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];
    pc.putc(*pArrTx);
    if(!ArrTxBusy) {
        ArrTxBusy = 1;
        pc.attach(IntrTx, Serial::TxIrq);
        }
    TxBuffFull = 0;
    }

void IntrTx() {
    if ( ++pArrTx <= &ArrTx[ArrTxSize-1] ) pc.putc(*pArrTx);
    else {
        if(TxBuffFull) CopyArr_InitTx(&TxBuff.cmd);
            else {
                pc.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 = pc.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
    pc.baud(BaudRate);
#endif
    pc.attach(IntrRx, Serial::RxIrq);
    pc.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