C-Libs/CBus.c
2021-07-01 11:55:32 +00:00

111 lines
2.5 KiB
C

/*
* CBus.c
*
* Created on: Jun 14, 2021
* Author: angoosh
*/
#include "CBus.h"
void ReadRxBuffer();
void SendPacket();
uint8_t ptr = 0;
uint8_t RX[1];
uint8_t WholeRxBuffer[RX_BUFFER_SIZE];
CBusPacket RxPacket;
CBusPacket TxPacket;
uint8_t CBusBufTx[64];
uint8_t CBusBufTxSize;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
WholeRxBuffer[ptr] = RX[0];
ptr++;
//CLEAR_BIT(huart->Instance->ISR,USART_ISR_RXNE);
HAL_UART_Receive_IT(&huart3, RX, 1);
}
void CBusBA(uint8_t byte){
#ifdef PREFIXINPACKETACTION
if(byte == PREFIX){
CBusBufTx[CBusBufTxSize++] = 0xBB;
CBusBufTx[CBusBufTxSize++] = 0xBC;
}
else if(byte == 0xBB){
CBusBufTx[CBusBufTxSize++] = 0xBB;
CBusBufTx[CBusBufTxSize++] = 0xBB;
}
else{
CBusBufTx[CBusBufTxSize++] = byte;
}
#else
CBusBufTx[CBusBufTxSize++] = byte;
#endif
}
void ReadRxBuffer(){
uint8_t packtStart = 0;
for(int l = 0; l<sizeof(WholeRxBuffer); l++){
if(packtStart){
packtStart = 0;
uint8_t PCrc = 0;
PCrc ^= RxPacket.RxAddr;
PCrc ^= RxPacket.Length = WholeRxBuffer[l+1];
PCrc ^= RxPacket.Sender = WholeRxBuffer[l+2];
PCrc ^= RxPacket.Command = WholeRxBuffer[l+3];
for(int i = 0; i < RxPacket.Length-5; i++){
PCrc ^= RxPacket.Data[i] = WholeRxBuffer[l+4+i];
}
RxPacket.Crc = WholeRxBuffer[l+RxPacket.Length-1];
if(PCrc == RxPacket.Crc){
if(RxPacket.Command == TEST_CMD){
HAL_GPIO_WritePin(GPIOD,LED_ERROR_Pin,RxPacket.Data[0]);
TxPacket.RxAddr = RxPacket.Sender;
TxPacket.Length = 6;
TxPacket.Sender = ADDRESS;
TxPacket.Command = ACK;
TxPacket.Data[0] = RxPacket.Command;
SendPacket();
}
l += RxPacket.Length;
}
}
if(WholeRxBuffer[l] == PREFIX){
RxPacket.RxAddr = WholeRxBuffer[l+1];
if(RxPacket.RxAddr == ADDRESS){
packtStart = 1;
}
}
}
for(int k = 0; k<sizeof(WholeRxBuffer); k++){
WholeRxBuffer[k] = 0;
}
ptr = 0;
}
void SendPacket(){
CBusBufTx[CBusBufTxSize++] = PREFIX;
CBusBA(TxPacket.RxAddr);TxPacket.Crc ^= TxPacket.RxAddr;
CBusBA(TxPacket.Length);TxPacket.Crc ^= TxPacket.Length;
CBusBA(TxPacket.Sender);TxPacket.Crc ^= TxPacket.Sender;
CBusBA(TxPacket.Command);TxPacket.Crc ^= TxPacket.Command;
for(int i = 0; i<TxPacket.Length-5; i++){
CBusBA(TxPacket.Data[i]);TxPacket.Crc ^= TxPacket.Data[i];
}
CBusBA(TxPacket.Crc);
HAL_UART_Transmit(&huart3, CBusBufTx, CBusBufTxSize, 0xFFFF);
CBusBufTxSize = 0;
for(int i = 0; i < sizeof(CBusBufTx); i++){
CBusBufTx[i] = 0;
}
memset(&TxPacket, 0, sizeof(TxPacket));
memset(&RxPacket, 0, sizeof(RxPacket));
}