20190816

Dependencies:   LCD_DISCO_F429ZI TS_DISCO_F429ZI BSP_DISCO_F429ZI

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