22#if defined(SUPPORT_UART)
24#if defined(ARDUINO_ARCH_ESP32)
25# include <soc/uart_reg.h>
26# include <driver/uart.h>
27# include <driver/gpio.h>
50#define DEFAULT_UART_FIFO_TRIGGER_LEVEL (17)
52 enum TranslateIntensityData_t
59 enum UartDataBitTranslationId_t
61 Uart_DATA_BIT_00_ID = 0,
67 Uart_NUM_BIT_TYPES = Uart_LIST_END,
70 struct ConvertIntensityToUartDataStreamEntry_t
73 c_OutputUart::UartDataBitTranslationId_t Id;
75 typedef ConvertIntensityToUartDataStreamEntry_t CitudsArray_t;
77 struct OutputUartConfig_t
80 gpio_num_t DataPin = gpio_num_t(-1);
81 uart_port_t UartId = uart_port_t(-1);
82 uint32_t IntensityDataWidth = 8;
83 UartDatauint32_t UartDataSize = UartDatauint32_t::OUTPUT_UART_8N2;
84 uint32_t FrameStartBreakUS = 0;
85 uint32_t FrameStartMarkAfterBreakUS = 0;
86 TranslateIntensityData_t TranslateIntensityData = TranslateIntensityData_t::NoTranslation;
87 bool InvertOutputPolarity =
false;
88 uint32_t Baudrate = 57600;
90 uint32_t FiFoTriggerLevel = DEFAULT_UART_FIFO_TRIGGER_LEVEL;
91 uint16_t NumInterIntensityBreakBits = 0;
92 uint16_t NumInterIntensityMABbits = 0;
93 bool TriggerIsrExternally =
false;
94 const CitudsArray_t *CitudsArray =
nullptr;
96 #if defined(SUPPORT_OutputProtocol_FireGod) || defined(SUPPORT_OutputProtocol_DMX) || defined(SUPPORT_OutputProtocol_Serial) || defined(SUPPORT_OutputProtocol_Renard)
97 c_OutputSerial *pSerialDataSource =
nullptr;
102 virtual ~c_OutputUart ();
103 void Begin (c_OutputUart::OutputUartConfig_t &
config);
104 bool SetConfig (ArduinoJson::JsonObject &jsonConfig);
105 void GetConfig (ArduinoJson::JsonObject &jsonConfig);
107 void GetStatus (ArduinoJson::JsonObject &jsonStatus);
108 void PauseOutput (
bool State);
109 void StartNewFrame ();
111 void ISR_UART_Handler();
112 void ISR_Handler_SendIntensityData();
116 bool RegisterUartIsrHandler ();
117 void InitializeUart ();
119 void TerminateSerialPortOperation ();
120 void RestoreSerialPortOperation ();
121 void ISR_ReportNewFrame ();
124 void GenerateBreak (uint32_t DurationInUs, uint32_t MarkDurationInUs);
125 void SetIntensityDataWidth ();
126 void SetIntensity2Uart (uint8_t value, UartDataBitTranslationId_t ID);
128 OutputUartConfig_t OutputUartConfig;
130 uint8_t Intensity2Uart[UartDataBitTranslationId_t::Uart_LIST_END];
131 bool OutputIsPaused =
false;
132 uint32_t TxIntensityDataStartingMask = 0x80;
133 bool HasBeenInitialized =
false;
134 uint32_t NumUartSlotsPerIntensityValue = 1;
135 uint32_t MarkAfterInterintensityBreakBitCCOUNT = 0;
136 uint32_t ActiveIsrMask = 0;
137#if defined(ARDUINO_ARCH_ESP32)
138 intr_handle_t IsrHandle =
nullptr;
139 SemaphoreHandle_t WaitFrameDone;
142 void ISR_StartNewDataFrame();
143 void CalculateEnableUartInterruptFlags();
144 uint32_t ISR_getUartFifoLength();
145 bool ISR_MoreDataToSend();
146 bool ISR_GetNextIntensityToSend(uint32_t &DataToSend);
147 void ISR_enqueueUartData(uint8_t value);
148 void EnableUartInterrupts();
149 void ISR_ClearUartInterrupts();
150 void ISR_DisableUartInterrupts();
153#ifdef USE_UART_DEBUG_COUNTERS
155 uint32_t DataCallbackCounter = 0;
156 uint32_t DataTaskcounter = 0;
158 uint32_t ErrorIsr = 0;
159 uint32_t FiFoISRcounter = 0;
160 uint32_t BreakIsrCounter = 0;
161 uint32_t IdleIsrCounter = 0;
162 uint32_t IsrIsNotForUs = 0;
163 uint32_t UnknownIsr = 0;
164 uint32_t TimerIsrCounter = 0;
165 uint32_t TimerIsrNoDataToSend = 0;
166 uint32_t TimerIsrSendData = 0;
167 uint32_t FrameThresholdCounter = 0;
168 uint32_t FrameEndISRcounter = 0;
169 uint32_t FrameStartCounter = 0;
170 uint32_t IntensityValuesSent = 0;
171 uint32_t IntensityBitsSent = 0;
172 uint32_t IntensityValuesSentLastFrame = 0;
173 uint32_t IntensityBitsSentLastFrame = 0;
174 uint32_t IncompleteFrame = 0;
175 uint32_t EnqueueCounter = 0;
176 uint32_t FiFoNotEmpty = 0;
177 uint32_t FiFoEmpty = 0;
178 uint32_t TxStopped = 0;
182#ifndef UART_TX_BRK_DONE_INT_ENA
183# define UART_TX_BRK_DONE_INT_ENA 0
186#ifndef UART_TX_BRK_IDLE_DONE_INT_ENA
187# define UART_TX_BRK_IDLE_DONE_INT_ENA 0
190#ifndef UART_INTR_MASK
191# if defined(ARDUINO_ARCH_ESP32)
192# define UART_INTR_MASK uint32_t((1 << 18) - 1)
193# elif defined(ARDUINO_ARCH_ESP8266)
194# define UART_INTR_MASK uint32_t((1 << 8) - 1)
198#ifndef ESP_INTR_FLAG_IRAM
199# define ESP_INTR_FLAG_IRAM 0
203#if defined(ARDUINO_ARCH_ESP8266)
207 void IRAM_ATTR ISR_Timer_Handler();
210 void CalculateInterIntensityMabTime();
211 inline bool IsUartTimerInUse()
__attribute__((gnu_inline, const))
213 return (OutputUartConfig.NumInterIntensityBreakBits || OutputUartConfig.NumInterIntensityMABbits);
218 static inline uint32_t _getCycleCount(
void)
221 __asm__ __volatile__(
"rsr %0,ccount" :
"=a"(ccount));
const CN_PROGMEM char CN_OutputUart[]
Definition ConstNames.cpp:168
uint8_t OM_PortId_t
Definition OutputMgrPortDefs.hpp:71
Definition OutputPixel.hpp:28
struct FSEQParsedRangeEntry __attribute__
config_t config
Definition main.cpp:98
void GetDriverName(String &Name)
Definition main.cpp:121
void GetConfig(JsonObject &json)
Definition main.cpp:507
void SetConfig(const char *DataString)
Definition main.cpp:329