|
|
|
#include "p_serial_mgr.h"
|
|
|
|
#include "PCircularBuffer.h"
|
|
|
|
#include "putil.h"
|
|
|
|
#include "stm32l4xx_hal_uart.h"
|
|
|
|
|
|
|
|
#define MAX_SERIAL_BUFFER_SIZE (262) // Actually 261, add 1 for padding
|
|
|
|
|
|
|
|
// this protocol is very similar to the digi api v2 (inspired from)
|
|
|
|
// [0]{1} Start delimiter 0x7E
|
|
|
|
// [1]{1} Source Address
|
|
|
|
// [2]{1} Destination Address
|
|
|
|
// [3]{1} Length Byte
|
|
|
|
// [4-n]{n} frame data
|
|
|
|
// [n+1]{1} checksum
|
|
|
|
// Escape bytes are 0x7D, only frame data can be escaped
|
|
|
|
// Escaped bytes are followed by the byte to be escaped XOR'd with 0x20
|
|
|
|
// 0x7D and 0x7E need to be escaped (within the frame data)
|
|
|
|
|
|
|
|
typedef enum serial_state_t
|
|
|
|
{
|
|
|
|
SS_IDLE = 0, // waiting
|
|
|
|
SS_START = 1, // get start byte, interrupt after 4 more bytes
|
|
|
|
SS_FRAME = 2, // get byte
|
|
|
|
SS_ESC = 3, // get byte, dont increment number left
|
|
|
|
SS_CHECKSUM = 4 // done
|
|
|
|
} serial_state_t;
|
|
|
|
|
|
|
|
static UART_HandleTypeDef *_serial_huart_inst = NULL;
|
|
|
|
|
|
|
|
static uint8_t rxc = '\0';
|
|
|
|
static bool b_go = false;
|
|
|
|
void UART1_RxCpltCallback(UART_HandleTypeDef *huart)
|
|
|
|
{
|
|
|
|
b_go = true;
|
|
|
|
}
|
|
|
|
void p_serial_mgr_init(UART_HandleTypeDef *huart)
|
|
|
|
{
|
|
|
|
_serial_huart_inst = huart;
|
|
|
|
_serial_huart_inst->RxCpltCallback = UART1_RxCpltCallback;
|
|
|
|
b_go = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool p_serial_mgr_service(void)
|
|
|
|
{
|
|
|
|
// // this will be less garbage when i switch to a queue
|
|
|
|
// for (int ind = 0; ind < serial_pkt_cb.max_len; ind++)
|
|
|
|
// {
|
|
|
|
// if (serial_pkt_cb.buffer[ind].b_ready)
|
|
|
|
// {
|
|
|
|
// return &serial_pkt_cb.buffer[ind];
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
return b_go;
|
|
|
|
}
|
|
|
|
|
|
|
|
void p_serial_mgr_start()
|
|
|
|
{
|
|
|
|
b_go = false;
|
|
|
|
HAL_UART_Receive_IT(_serial_huart_inst, &rxc, 1);
|
|
|
|
}
|