111 lines
2.5 KiB
C
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));
|
|
}
|
|
|
|
|