You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
1.8 KiB
C

#include "p_serial_mgr.h"
#include "putil.h"
#include "stm32l4xx_hal_def.h"
#include "stm32l4xx_hal_dma.h"
#include "stm32l4xx_hal_uart.h"
#define NUM_BUFFERS (10)
#define MAX_DMA_BUFFER_LEN (512)
uint8_t sbuffer[NUM_BUFFERS][MAX_DMA_BUFFER_LEN];
uint8_t active_buffer = 0;
uint8_t rxb[MAX_MESSAGE_LEN];
// 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 (of non-delimited framebuffer)
// [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_ERR = 2
} serial_state_t;
static UART_HandleTypeDef *_serial_huart_inst = NULL;
static DMA_HandleTypeDef *_serial_dma_inst = NULL;
static uint8_t rxc = '\0';
static serial_state_t sstate = SS_IDLE;
static void p_serial_mgr_flush()
{
HAL_UART_Receive(_serial_huart_inst, sbuffer[active_buffer], MAX_MESSAGE_LEN, 10);
}
void UART1_RxCpltCallback(UART_HandleTypeDef *huart)
{
PDEBUG("%s\n", sbuffer[active_buffer]);
active_buffer = (active_buffer + 1) % NUM_BUFFERS;
p_serial_mgr_start();
}
void p_serial_mgr_init(UART_HandleTypeDef *huart, DMA_HandleTypeDef *hdma)
{
_serial_huart_inst = huart;
_serial_dma_inst = hdma;
_serial_huart_inst->RxCpltCallback = UART1_RxCpltCallback;
}
void p_serial_mgr_service(void)
{
// HAL_Delay(100);
// PDEBUG("%d\n", __HAL_DMA_GET_COUNTER(_serial_dma_inst));
}
void p_serial_mgr_start()
{
HAL_UART_Receive_DMA(_serial_huart_inst, sbuffer[active_buffer], MAX_DMA_BUFFER_LEN);
}