From 040ce4276432162c849b8d3c2c024cb687a8a170 Mon Sep 17 00:00:00 2001 From: Piotr Wilkon Date: Tue, 12 Sep 2023 11:16:22 +0200 Subject: [PATCH] new experimental KISS handling --- Core/Inc/kiss.h | 2 ++ Core/Inc/uart.h | 1 + Core/Src/kiss.c | 34 ++++++++++++++++++++++------------ Core/Src/main.c | 30 +++++++++++++++++++++++++----- USB_DEVICE/App/usbd_cdc_if.c | 4 ++-- 5 files changed, 52 insertions(+), 19 deletions(-) diff --git a/Core/Inc/kiss.h b/Core/Inc/kiss.h index 5ca424f..fae6dc3 100644 --- a/Core/Inc/kiss.h +++ b/Core/Inc/kiss.h @@ -38,4 +38,6 @@ void KissSend(Uart *port, uint8_t *buf, uint16_t size); */ void KissParse(Uart *port, uint8_t data); +void KissProcess(Uart *port); + #endif /* KISS_H_ */ diff --git a/Core/Inc/uart.h b/Core/Inc/uart.h index 1fb60bc..893ce92 100644 --- a/Core/Inc/uart.h +++ b/Core/Inc/uart.h @@ -37,6 +37,7 @@ enum UartDataType { DATA_NOTHING = 0, DATA_TERM, + DATA_KISS, DATA_USB, }; diff --git a/Core/Src/kiss.c b/Core/Src/kiss.c index 53a118c..766de9d 100644 --- a/Core/Src/kiss.c +++ b/Core/Src/kiss.c @@ -96,19 +96,9 @@ void KissParse(Uart *port, uint8_t data) __disable_irq(); port->kissProcessingOngoing = 1; + port->kissTempBufferHead = 0; __enable_irq(); - Ax25WriteTxFrame((uint8_t*)&port->kissBuffer[1], port->kissBufferHead - 1); - DigiStoreDeDupe((uint8_t*)&port->kissBuffer[1], port->kissBufferHead - 1); - port->kissBufferHead = 0; - __disable_irq(); - port->kissProcessingOngoing = 0; - if(port->kissTempBufferHead > 0) - { - memcpy((uint8_t*)port->kissBuffer, (uint8_t*)port->kissTempBuffer, port->kissTempBufferHead); - port->kissBufferHead = port->kissTempBufferHead; - port->kissTempBufferHead = 0; - } - __enable_irq(); + port->rxType = DATA_KISS; return; } else if(*index > 0) @@ -131,3 +121,23 @@ void KissParse(Uart *port, uint8_t data) else port->kissTempBufferHead %= sizeof(port->kissTempBuffer); } + +void KissProcess(Uart *port) +{ + if(port->rxType == DATA_KISS) + { + Ax25WriteTxFrame((uint8_t*)&port->kissBuffer[1], port->kissBufferHead - 1); + DigiStoreDeDupe((uint8_t*)&port->kissBuffer[1], port->kissBufferHead - 1); + port->kissBufferHead = 0; + __disable_irq(); + port->kissProcessingOngoing = 0; + if(port->kissTempBufferHead > 0) + { + memcpy((uint8_t*)port->kissBuffer, (uint8_t*)port->kissTempBuffer, port->kissTempBufferHead); + port->kissBufferHead = port->kissTempBufferHead; + port->kissTempBufferHead = 0; + } + __enable_irq(); + port->rxType = DATA_NOTHING; + } +} diff --git a/Core/Src/main.c b/Core/Src/main.c index 62e3539..1546985 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -51,6 +51,7 @@ along with VP-Digi. If not, see . #include "config.h" #include "uart.h" #include "drivers/usb.h" +#include "kiss.h" #ifdef ENABLE_FX25 #include "fx25.h" #endif @@ -260,8 +261,13 @@ int main(void) if(UartUsb.rxType != DATA_NOTHING) { TermHandleSpecial(&UartUsb); - if(UartUsb.rxType != DATA_USB) + if(UartUsb.rxType == DATA_KISS) { + KissProcess(&UartUsb); + } + else if(UartUsb.rxType != DATA_USB) + { + TermParse(&UartUsb); UartClearRx(&UartUsb); } @@ -269,13 +275,27 @@ int main(void) } if(Uart1.rxType != DATA_NOTHING) { - TermParse(&Uart1); - UartClearRx(&Uart1); + if(Uart1.rxType == DATA_KISS) + { + KissProcess(&Uart1); + } + else + { + TermParse(&Uart1); + UartClearRx(&Uart1); + } } if(Uart2.rxType != DATA_NOTHING) { - TermParse(&Uart2); - UartClearRx(&Uart2); + if(Uart2.rxType == DATA_KISS) + { + KissProcess(&Uart2); + } + else + { + TermParse(&Uart2); + UartClearRx(&Uart2); + } } BeaconCheck(); //check beacons diff --git a/USB_DEVICE/App/usbd_cdc_if.c b/USB_DEVICE/App/usbd_cdc_if.c index d93c7ef..9f35839 100644 --- a/USB_DEVICE/App/usbd_cdc_if.c +++ b/USB_DEVICE/App/usbd_cdc_if.c @@ -269,8 +269,8 @@ static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) KissParse(&UartUsb, Buf[i]); UartUsb.rxBufferHead %= UART_BUFFER_SIZE; } - - UartUsb.rxType = DATA_USB; + if(UartUsb.rxType != DATA_KISS) + UartUsb.rxType = DATA_USB; handleUsbInterrupt(&UartUsb); return (USBD_OK);