Open FFBoard
Open source force feedback firmware
UART.h
Go to the documentation of this file.
1/*
2 * UART.h
3 *
4 * Created on: May 4, 2021
5 * Author: Yannick
6 */
7
8#ifndef SRC_UART_H_
9#define SRC_UART_H_
10
11#include "semaphore.hpp"
12#include "UartHandler.h"
13#include "target_constants.h"
14
15/*
16 * Example to use the port:
17 * port->reservePort(this);
18 * //Enables receive interrupt. After its enabled once it will auto reenable after every byte
19 * //uartRcv will fire now after every received byte in an interrupt (Don't use usb directly here. just store the byte)
20 * port->registerInterrupt();
21 * const char x[] = "ABC";
22 * port->transmit(x, sizeof(x), 1000); // Transmits a string blocking
23 * port->transmit_IT(x, sizeof(x)); // Transmit non blocking
24 */
25class UARTDevice;
26class UARTPort : public UartHandler {
27public:
28 UARTPort(UART_HandleTypeDef& huart);
29 //UARTPort(USART_TypeDef * port);
30 virtual ~UARTPort();
31
32 void uartRxComplete(UART_HandleTypeDef *huart);
33 void uartTxComplete(UART_HandleTypeDef *huart);
34
35 bool transmit(const char* txbuf,uint16_t size,uint32_t timeout = 10000);
36 bool transmit_IT(const char* txbuf,uint16_t size);
37 bool receive(char* rxbuf,uint16_t size,uint32_t timeout = 10000); // Receive in blocking mode
38 bool transmit_DMA(const char* txbuf,uint16_t size);
39 bool receive_DMA(char* rxbuf,uint16_t size);
40 bool receive_IT(char* rxbuf,uint16_t size);
41 bool abortReceive();
42 bool abortTransmit();
43
44 bool takeSemaphore(bool txsem = true,uint32_t blocktime = portMAX_DELAY); // Call before accessing this port
45 bool giveSemaphore(bool txsem = true); // Call when finished using this port
46 bool isTaken(); // Returns true if semaphore was taken by another task
47
48 bool reconfigurePort(UART_InitTypeDef& config);
49 UART_InitTypeDef& getConfig();
50
51 bool isReserved(){return this->device != nullptr;}
54
55 uint32_t getErrors();
56
57 bool registerInterrupt();
58
59 UART_HandleTypeDef* getHuart();
60
61private:
63 cpp_freertos::BinarySemaphore rxsemaphore = cpp_freertos::BinarySemaphore(true); // second semaphore for accessing transmit functions if full duplex
64 bool isTakenFlag = false;
65 UART_HandleTypeDef& huart;
66 UARTDevice* device = nullptr;
67 volatile char uart_buf[UART_BUF_SIZE] = {0};
69 uint16_t lastPos = 0;
70 char* rxbuf_t = nullptr;
71};
72
73
75public:
76 UARTDevice();
77 UARTDevice(UARTPort& port);
78 virtual ~UARTDevice();
79 virtual void uartRcv(char& buf){}; //Warning: called by interrupts!
80
81 virtual void startUartTransfer(UARTPort* port,bool transmit);
82 virtual void endUartTransfer(UARTPort* port,bool transmit);
83
84protected:
85 UARTPort* uartport = nullptr;
86};
87
88
89#endif /* SRC_UART_H_ */
UARTPort * uartport
Definition: UART.h:85
virtual ~UARTDevice()
Definition: UART.cpp:220
virtual void endUartTransfer(UARTPort *port, bool transmit)
Definition: UART.cpp:229
virtual void uartRcv(char &buf)
Definition: UART.h:79
UARTDevice()
Definition: UART.cpp:212
virtual void startUartTransfer(UARTPort *port, bool transmit)
Definition: UART.cpp:225
Definition: UART.h:26
UART_InitTypeDef & getConfig()
Definition: UART.cpp:49
cpp_freertos::BinarySemaphore rxsemaphore
Definition: UART.h:63
bool receive(char *rxbuf, uint16_t size, uint32_t timeout=10000)
Definition: UART.cpp:85
uint32_t getErrors()
Definition: UART.cpp:177
UART_HandleTypeDef * getHuart()
Definition: UART.cpp:125
bool giveSemaphore(bool txsem=true)
Definition: UART.cpp:159
bool waitingForSingleBytes
Definition: UART.h:68
bool takeSemaphore(bool txsem=true, uint32_t blocktime=portMAX_DELAY)
Definition: UART.cpp:145
UART_HandleTypeDef & huart
Definition: UART.h:65
volatile char uart_buf[UART_BUF_SIZE]
Definition: UART.h:67
uint16_t lastPos
Definition: UART.h:69
UARTDevice * device
Definition: UART.h:66
bool freePort(UARTDevice *device)
Definition: UART.cpp:137
bool reservePort(UARTDevice *device)
Definition: UART.cpp:108
char * rxbuf_t
Definition: UART.h:70
bool receive_IT(char *rxbuf, uint16_t size)
Definition: UART.cpp:101
bool transmit_IT(const char *txbuf, uint16_t size)
Definition: UART.cpp:78
bool reconfigurePort(UART_InitTypeDef &config)
Definition: UART.cpp:35
bool isReserved()
Definition: UART.h:51
bool registerInterrupt()
Definition: UART.cpp:56
bool transmit(const char *txbuf, uint16_t size, uint32_t timeout=10000)
Definition: UART.cpp:69
bool transmit_DMA(const char *txbuf, uint16_t size)
Definition: UART.cpp:62
bool isTaken()
Definition: UART.cpp:173
bool receive_DMA(char *rxbuf, uint16_t size)
Definition: UART.cpp:94
bool isTakenFlag
Definition: UART.h:64
bool abortTransmit()
Definition: UART.cpp:129
UARTPort(UART_HandleTypeDef &huart)
Definition: UART.cpp:27
bool abortReceive()
Definition: UART.cpp:116
virtual ~UARTPort()
Definition: UART.cpp:31
cpp_freertos::BinarySemaphore semaphore
Definition: UART.h:62
void uartTxComplete(UART_HandleTypeDef *huart)
Definition: UART.cpp:200
void uartRxComplete(UART_HandleTypeDef *huart)
Definition: UART.cpp:182