|
@@ -89,11 +89,18 @@ static void MX_USART1_UART_Init(void);
|
|
|
/* Private user code ---------------------------------------------------------*/
|
|
/* Private user code ---------------------------------------------------------*/
|
|
|
/* USER CODE BEGIN 0 */
|
|
/* USER CODE BEGIN 0 */
|
|
|
#define MAX_SYSTICK 0xFFFFFFFF
|
|
#define MAX_SYSTICK 0xFFFFFFFF
|
|
|
-uint8_t data[BUFF_SIZE]; // tmp read buffer
|
|
|
|
|
|
|
+
|
|
|
|
|
+uint8_t rx_ring_buffer[BUFF_SIZE];
|
|
|
uint8_t *dataUART; // pointee for rx_buffer
|
|
uint8_t *dataUART; // pointee for rx_buffer
|
|
|
-volatile uint8_t dataL;
|
|
|
|
|
-volatile uint8_t dataI;
|
|
|
|
|
|
|
+
|
|
|
|
|
+// UART DMA related variables
|
|
|
volatile uint32_t uart_timeout = MAX_SYSTICK;
|
|
volatile uint32_t uart_timeout = MAX_SYSTICK;
|
|
|
|
|
+volatile uint16_t rx_read_pos = 0; // DAM UART CIRCULAR - tail
|
|
|
|
|
+volatile uint8_t msg_len = 0;
|
|
|
|
|
+volatile uint8_t msg_idx = 0;
|
|
|
|
|
+
|
|
|
|
|
+ProtocolState state = STATE_WAIT_LEN;
|
|
|
|
|
+
|
|
|
|
|
|
|
|
#if MODULE == MODULE_IMU || MODULE == MODULE_DMP
|
|
#if MODULE == MODULE_IMU || MODULE == MODULE_DMP
|
|
|
volatile uint8_t icm_data_ready = 0;
|
|
volatile uint8_t icm_data_ready = 0;
|
|
@@ -111,13 +118,12 @@ inline void uart_send(uint8_t *data, int n)
|
|
|
inline void uart_receive(uint8_t *dataNBUS, int n)
|
|
inline void uart_receive(uint8_t *dataNBUS, int n)
|
|
|
{
|
|
{
|
|
|
dataUART = dataNBUS;
|
|
dataUART = dataNBUS;
|
|
|
- dataL = 0;
|
|
|
|
|
- dataI = 0;
|
|
|
|
|
- data[0] = 0;
|
|
|
|
|
|
|
+ rx_ring_buffer[0] = 0;
|
|
|
uart_timeout = HAL_GetTick();
|
|
uart_timeout = HAL_GetTick();
|
|
|
- HAL_UARTEx_ReceiveToIdle_DMA(&huart1, data, n);
|
|
|
|
|
|
|
+ HAL_UART_Receive_DMA(&huart1, rx_ring_buffer, n);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
inline void led_on(){
|
|
inline void led_on(){
|
|
|
HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_SET);
|
|
HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_SET);
|
|
|
}
|
|
}
|
|
@@ -134,13 +140,73 @@ inline void app_delay(uint8_t ms){
|
|
|
HAL_Delay(ms);
|
|
HAL_Delay(ms);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+static uint8_t Parse_Protocol_Byte(uint8_t b) {
|
|
|
|
|
+
|
|
|
|
|
+ uint8_t packet_finished = 0;
|
|
|
|
|
+ // Timeout reset logic
|
|
|
|
|
+ if (state != STATE_WAIT_LEN) {
|
|
|
|
|
+ if ((HAL_GetTick() - uart_timeout) > NBUS_UART_FRAME_TIMEOUT){
|
|
|
|
|
+ state = STATE_WAIT_LEN;
|
|
|
|
|
+ msg_len = 0;
|
|
|
|
|
+ msg_idx = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ switch (state) {
|
|
|
|
|
+ case STATE_WAIT_LEN:
|
|
|
|
|
+ // Validácia dĺžky (max 128 bajtov, min 4 bajty)
|
|
|
|
|
+ if (b > 3 && b < PAYLOAD_SIZE) {
|
|
|
|
|
+ msg_len = b;
|
|
|
|
|
+ msg_idx = 0;
|
|
|
|
|
+ state = STATE_PAYLOAD;
|
|
|
|
|
+ uart_timeout = HAL_GetTick(); // Reset timeoutu
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ case STATE_PAYLOAD:
|
|
|
|
|
+ dataUART[msg_idx++] = b;
|
|
|
|
|
+ uart_timeout = HAL_GetTick(); // Aktualizácia timeoutu pri každom bajte
|
|
|
|
|
+
|
|
|
|
|
+ if (msg_idx >= msg_len) { // Koniec paketu (podľa definície dĺžky)
|
|
|
|
|
+ nbus_cb_UART_RX(msg_idx); // callback to nBus, notify message length
|
|
|
|
|
+ state = STATE_WAIT_LEN;
|
|
|
|
|
+ packet_finished = 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return packet_finished;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+static void Process_UART_RingBuffer(void) {
|
|
|
|
|
+ // Zistíme, kde sa aktuálne nachádza DMA (Head)
|
|
|
|
|
+ // CNDTR register obsahuje počet ZOSTÁVAJÚCICH bajtov do konca buffra
|
|
|
|
|
+ uint16_t rx_dma_pos = BUFF_SIZE - __HAL_DMA_GET_COUNTER(huart1.hdmarx);
|
|
|
|
|
+
|
|
|
|
|
+ while (rx_read_pos != rx_dma_pos) {
|
|
|
|
|
+ uint8_t byte = rx_ring_buffer[rx_read_pos];
|
|
|
|
|
+ rx_read_pos++;
|
|
|
|
|
+ if (rx_read_pos >= BUFF_SIZE) {
|
|
|
|
|
+ rx_read_pos = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if( Parse_Protocol_Byte(byte) != 0){
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
static inline uint8_t loop_callback(nBusStateCallbackType_t state_check) {
|
|
static inline uint8_t loop_callback(nBusStateCallbackType_t state_check) {
|
|
|
// treba kontrolovat kazdy stav (state_check) zvlast. Moznost doplnit dalsie kontroly
|
|
// treba kontrolovat kazdy stav (state_check) zvlast. Moznost doplnit dalsie kontroly
|
|
|
if (state_check == CallbackType_SENSOR) {
|
|
if (state_check == CallbackType_SENSOR) {
|
|
|
#if MODULE == MODULE_IMU || MODULE == MODULE_DMP
|
|
#if MODULE == MODULE_IMU || MODULE == MODULE_DMP
|
|
|
if(icm_data_ready == 1){
|
|
if(icm_data_ready == 1){
|
|
|
icm_data_ready = 0;
|
|
icm_data_ready = 0;
|
|
|
- return 0; // TEMPORARY DISABLED STATE. interrupt from external sensor: data ready
|
|
|
|
|
|
|
+ return 0; // TODO!!!!!! TEMPORARY DISABLED STATE. interrupt from external sensor: data ready
|
|
|
}
|
|
}
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
@@ -148,55 +214,16 @@ static inline uint8_t loop_callback(nBusStateCallbackType_t state_check) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (state_check == CallbackType_UART) {
|
|
if (state_check == CallbackType_UART) {
|
|
|
- // timeout: 1 - 2 ms
|
|
|
|
|
- if(HAL_GetTick() - 1 > uart_timeout) {
|
|
|
|
|
- dataL = 0;
|
|
|
|
|
- dataI = 0;
|
|
|
|
|
- data[0] = 0;
|
|
|
|
|
- uart_timeout = MAX_SYSTICK;
|
|
|
|
|
- HAL_UARTEx_ReceiveToIdle_DMA(&huart1, data, BUFF_SIZE);
|
|
|
|
|
- return 1; // UART receive timeout
|
|
|
|
|
- }
|
|
|
|
|
- return 0;
|
|
|
|
|
|
|
+ Process_UART_RingBuffer();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Application callbacks
|
|
// Application callbacks
|
|
|
-void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
|
|
|
|
|
- HAL_UARTEx_ReceiveToIdle_DMA(huart, data, BUFF_SIZE);
|
|
|
|
|
- uint8_t copy_offset = 0;
|
|
|
|
|
- if (dataL == 0) {
|
|
|
|
|
- uart_timeout = HAL_GetTick();
|
|
|
|
|
- dataL = data[0];
|
|
|
|
|
- dataI = 0;
|
|
|
|
|
- if (Size == 1) {
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- Size--;
|
|
|
|
|
- copy_offset = 1;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- memcpy(&dataUART[dataI], &data[copy_offset], Size);
|
|
|
|
|
-
|
|
|
|
|
- dataI += Size;
|
|
|
|
|
- if(dataI >= dataL){
|
|
|
|
|
- nbus_cb_UART_RX(dataI);
|
|
|
|
|
- dataL=0;
|
|
|
|
|
- dataI=0;
|
|
|
|
|
- data[0]=0;
|
|
|
|
|
- uart_timeout = MAX_SYSTICK;
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart){
|
|
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart){
|
|
|
- dataL=0;
|
|
|
|
|
- dataI=0;
|
|
|
|
|
- data[0]=0;
|
|
|
|
|
uart_timeout = MAX_SYSTICK;
|
|
uart_timeout = MAX_SYSTICK;
|
|
|
- HAL_UARTEx_ReceiveToIdle_DMA(huart, data, BUFF_SIZE);
|
|
|
|
|
|
|
+ HAL_UART_Receive_DMA(huart, rx_ring_buffer, BUFF_SIZE);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
|
|
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
|
|
@@ -244,8 +271,6 @@ int main(void)
|
|
|
MX_SPI1_Init();
|
|
MX_SPI1_Init();
|
|
|
MX_USART1_UART_Init();
|
|
MX_USART1_UART_Init();
|
|
|
/* USER CODE BEGIN 2 */
|
|
/* USER CODE BEGIN 2 */
|
|
|
- dataI=0;
|
|
|
|
|
- dataL=0;
|
|
|
|
|
|
|
|
|
|
#ifdef MODULE_INIT_IP_ADC
|
|
#ifdef MODULE_INIT_IP_ADC
|
|
|
MX_ADC_Init();
|
|
MX_ADC_Init();
|