Skip to content

Commit e8c95f9

Browse files
committed
Refine DMX constants and RX UART init guards
Replaced several DMX magic numbers with named constants (`kSlotsMax`, `kSlotTime`, `kBaudRate`) and cleaned up local variable names/initializers for better readability and safer maintenance. Added `[[nodiscard]]` to key getters, renamed the RDM timeout parameter for clarity, and updated UART setup guards so IRQ/UART initialization also occurs for `*_RX`-only build configurations.
1 parent 5c1353c commit e8c95f9

3 files changed

Lines changed: 54 additions & 58 deletions

File tree

lib-dmx/.cproject

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,13 @@
4141
<tool id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.225915332" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler">
4242
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.include.paths.462497665" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
4343
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/firmware-template-gd32/include}&quot;"/>
44-
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lib-hal/include}&quot;"/>
4544
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lib-gd32/include}&quot;"/>
4645
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lib-gd32/gd32f10x/CMSIS}&quot;"/>
4746
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lib-gd32/gd32f10x/CMSIS/GD/GD32F10x/Include}&quot;"/>
4847
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lib-gd32/gd32f10x/GD32F10x_standard_peripheral/Include}&quot;"/>
4948
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/include}&quot;"/>
5049
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lib-dmx/include}&quot;"/>
5150
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lib-rdm/include}&quot;"/>
52-
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lib-properties/include}&quot;"/>
5351
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lib-network/include}&quot;"/>
5452
</option>
5553
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.preprocessor.def.33440151" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">

lib-dmx/include/gd32/dmx.h

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -47,29 +47,27 @@ class Dmx {
4747

4848
void SetPortDirection(uint32_t port_index, dmx::Direction port_direction, bool enable_data = false);
4949

50-
template <uint32_t port_index, dmx::Direction port_direction, bool enable_data>
50+
template <uint32_t port_index, dmx::Direction port_direction, bool enable_data>
5151
void SetPortDirection();
5252

53-
dmx::Direction PortDirection(uint32_t port_index) const {
54-
return port_direction_[port_index];
55-
}
53+
[[nodiscard]] dmx::Direction PortDirection(uint32_t port_index) const { return port_direction_[port_index]; }
5654

5755
void ClearData(uint32_t port_index);
5856

5957
volatile dmx::TotalStatistics& GetTotalStatistics(uint32_t port_index);
6058

6159
// DMX Transmit
6260
void SetTransmitBreakTime(uint32_t break_time);
63-
uint32_t TransmitBreakTime() const;
61+
[[nodiscard]] uint32_t TransmitBreakTime() const;
6462

6563
void SetTransmitMabTime(uint32_t mab_time);
66-
uint32_t TransmitMabTime() const;
64+
[[nodiscard]] uint32_t TransmitMabTime() const;
6765

6866
void SetTransmitPeriodTime(uint32_t period_time);
69-
uint32_t TransmitPeriodTime() const { return transmit_period_; }
67+
[[nodiscard]] uint32_t TransmitPeriodTime() const { return transmit_period_; }
7068

7169
void SetTransmitSlots(uint16_t slots = dmx::kChannelsMax);
72-
uint16_t TransmitSlots() const { return transmit_slots_; }
70+
[[nodiscard]] uint16_t TransmitSlots() const { return transmit_slots_; }
7371

7472
template <dmx::SendStyle dmxSendStyle>
7573
void SetTransmitDataWithSC(uint32_t port_index, const uint8_t* data, uint32_t length);
@@ -80,7 +78,7 @@ class Dmx {
8078
void Sync();
8179

8280
void SetOutputStyle(uint32_t port_index, dmx::OutputStyle output_style);
83-
dmx::OutputStyle GetOutputStyle(uint32_t port_index) const;
81+
[[nodiscard]] dmx::OutputStyle GetOutputStyle(uint32_t port_index) const;
8482

8583
void Blackout();
8684
void FullOn();
@@ -98,7 +96,7 @@ class Dmx {
9896

9997
// RDM Receive
10098
const uint8_t* RdmReceive(uint32_t port_index);
101-
const uint8_t* RdmReceiveTimeOut(uint32_t port_index, uint16_t time_out);
99+
const uint8_t* RdmReceiveTimeOut(uint32_t port_index, uint16_t timeout_ms);
102100

103101
static Dmx* Get() { return s_this; }
104102

@@ -117,7 +115,6 @@ class Dmx {
117115

118116
void StartRdmOutput(uint32_t port_index);
119117

120-
private:
121118
uint32_t transmit_period_{dmx::transmit::kPeriodDefault};
122119
uint32_t transmit_period_requested_{dmx::transmit::kPeriodDefault};
123120
uint32_t transmit_length_[dmx::config::max::kPorts];
@@ -132,8 +129,7 @@ class Dmx {
132129
case i: \
133130
return SetSendDataInternal<i, SC, STYLE>(pData, length)
134131

135-
template <dmx::SendStyle dmxSendStyle>
136-
void Dmx::SetTransmitDataWithSC(uint32_t port_index, const uint8_t* pData, uint32_t length) {
132+
template <dmx::SendStyle dmxSendStyle> void Dmx::SetTransmitDataWithSC(uint32_t port_index, const uint8_t* pData, uint32_t length) {
137133
switch (port_index) {
138134
DMX_HANDLE_SEND_CASE(0, true, dmxSendStyle);
139135
#if DMX_MAX_PORTS >= 2

lib-dmx/src/gd32/dmx.cpp

Lines changed: 45 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -157,27 +157,27 @@ struct DirGpio {
157157
} // namespace dmx
158158

159159
static constexpr dmx::DirGpio kDirGpio[DMX_MAX_PORTS] = {
160-
{dmx::config::kDirPort0GpioPort, dmx::config::kDirPort0GpioPin},
160+
{.port = dmx::config::kDirPort0GpioPort, .pin = dmx::config::kDirPort0GpioPin},
161161
#if DMX_MAX_PORTS >= 2
162-
{dmx::config::kDirPort1GpioPort, dmx::config::kDirPort1GpioPin},
162+
{.port = dmx::config::kDirPort1GpioPort, .pin = dmx::config::kDirPort1GpioPin},
163163
#endif
164164
#if DMX_MAX_PORTS >= 3
165-
{dmx::config::kDirPort2GpioPort, dmx::config::kDirPort2GpioPin},
165+
{.port = dmx::config::kDirPort2GpioPort, .pin = dmx::config::kDirPort2GpioPin},
166166
#endif
167167
#if DMX_MAX_PORTS >= 4
168-
{dmx::config::kDirPort3GpioPort, dmx::config::kDirPort3GpioPin},
168+
{.port = dmx::config::kDirPort3GpioPort, .pin = dmx::config::kDirPort3GpioPin},
169169
#endif
170170
#if DMX_MAX_PORTS >= 5
171-
{dmx::config::kDirPort4GpioPort, dmx::config::kDirPort4GpioPin},
171+
{.port = dmx::config::kDirPort4GpioPort, .pin = dmx::config::kDirPort4GpioPin},
172172
#endif
173173
#if DMX_MAX_PORTS >= 6
174-
{dmx::config::kDirPort5GpioPort, dmx::config::kDirPort5GpioPin},
174+
{.port = dmx::config::kDirPort5GpioPort, .pin = dmx::config::kDirPort5GpioPin},
175175
#endif
176176
#if DMX_MAX_PORTS >= 7
177-
{dmx::config::kDirPort6GpioPort, dmx::config::kDirPort6GpioPin},
177+
{.port = dmx::config::kDirPort6GpioPort, .pin = dmx::config::kDirPort6GpioPin},
178178
#endif
179179
#if DMX_MAX_PORTS == 8
180-
{dmx::config::kDirPort7GpioPort, dmx::config::kDirPort7GpioPin},
180+
{.port = dmx::config::kDirPort7GpioPort, .pin = dmx::config::kDirPort7GpioPin},
181181
#endif
182182
};
183183

@@ -291,9 +291,9 @@ void IrqHandlerDmxRdmInput() {
291291
index++;
292292
rx_buffer.rdm.index = index;
293293

294-
const auto* p = reinterpret_cast<volatile struct TRdmMessage*>(&rx_buffer.rdm.data[0]);
294+
const auto* data = reinterpret_cast<volatile struct TRdmMessage*>(&rx_buffer.rdm.data[0]);
295295

296-
if ((index >= 24) && (index <= sizeof(struct TRdmMessage)) && (index == p->message_length)) {
296+
if ((index >= 24) && (index <= sizeof(struct TRdmMessage)) && (index == data->message_length)) {
297297
rx_buffer.state = dmx::TxRxState::kRdmChecksumh;
298298
} else if (index > sizeof(struct TRdmMessage)) {
299299
rx_buffer.state = dmx::TxRxState::kIdle;
@@ -1483,7 +1483,7 @@ void Dmx::ClearData(uint32_t port_index) {
14831483
assert(port_index < dmx::config::max::kPorts);
14841484

14851485
auto* data = &s_DmxTxBuffer[port_index].dmx.data[0];
1486-
data->length = 513; // Including START Code
1486+
data->length = dmx::kSlotsMax; // Including START Code
14871487
__builtin_memset(data->data, 0, dmx::buffer::kSize);
14881488
}
14891489

@@ -1523,7 +1523,7 @@ void Dmx::FullOn() {
15231523
}
15241524

15251525
data->data[0] = dmx::kStartCode;
1526-
data->length = 513;
1526+
data->length = dmx::kSlotsMax;
15271527

15281528
DataEnable(port_index);
15291529
}
@@ -1952,9 +1952,9 @@ void Dmx::Sync() {
19521952
// DMX Receive
19531953
const uint8_t* Dmx::GetDmxChanged([[maybe_unused]] uint32_t port_index) {
19541954
#if !defined(CONFIG_DMX_TRANSMIT_ONLY)
1955-
const auto* __restrict__ p = GetDmxAvailable(port_index);
1955+
const auto* __restrict__ available = GetDmxAvailable(port_index);
19561956

1957-
if (p == nullptr) {
1957+
if (available == nullptr) {
19581958
return nullptr;
19591959
}
19601960

@@ -1968,7 +1968,7 @@ const uint8_t* Dmx::GetDmxChanged([[maybe_unused]] uint32_t port_index) {
19681968
dst32[i] = src32[i];
19691969
}
19701970

1971-
return p;
1971+
return available;
19721972
}
19731973

19741974
bool is_changed = false;
@@ -1983,7 +1983,7 @@ const uint8_t* Dmx::GetDmxChanged([[maybe_unused]] uint32_t port_index) {
19831983
}
19841984
}
19851985

1986-
return (is_changed ? p : nullptr);
1986+
return (is_changed ? available : nullptr);
19871987
#else
19881988
return nullptr;
19891989
#endif
@@ -2073,19 +2073,19 @@ const uint8_t* Dmx::RdmReceive(uint32_t port_index) {
20732073
if (data[0] == E120_SC_RDM) {
20742074
const auto* rdm_command = reinterpret_cast<const struct TRdmMessage*>(data);
20752075

2076-
uint32_t i;
2076+
uint32_t index;
20772077
uint16_t checksum = 0;
20782078

2079-
for (i = 0; i < 24; i++) {
2080-
checksum = static_cast<uint16_t>(checksum + data[i]);
2079+
for (index = 0; index < 24; index++) {
2080+
checksum = static_cast<uint16_t>(checksum + data[index]);
20812081
}
20822082

2083-
for (; i < rdm_command->message_length; i++) {
2084-
checksum = static_cast<uint16_t>(checksum + data[i]);
2083+
for (; index < rdm_command->message_length; index++) {
2084+
checksum = static_cast<uint16_t>(checksum + data[index]);
20852085
}
20862086

2087-
if (data[i++] == static_cast<uint8_t>(checksum >> 8)) {
2088-
if (data[i] == static_cast<uint8_t>(checksum)) {
2087+
if (data[index++] == static_cast<uint8_t>(checksum >> 8)) {
2088+
if (data[index] == static_cast<uint8_t>(checksum)) {
20892089
#if !defined(CONFIG_DMX_DISABLE_STATISTICS)
20902090
sv_total_statistics[port_index].rdm.received.good = sv_total_statistics[port_index].rdm.received.good + 1;
20912091
#endif
@@ -2106,17 +2106,19 @@ const uint8_t* Dmx::RdmReceive(uint32_t port_index) {
21062106
}
21072107

21082108
// RDM Receive with timeout
2109-
const uint8_t* Dmx::RdmReceiveTimeOut(uint32_t port_index, uint16_t time_out) {
2109+
// NOLINTNEXTLINE(bugprone-easily-swappable-parameters)
2110+
const uint8_t* Dmx::RdmReceiveTimeOut(uint32_t port_index, uint16_t timeout_ms) {
21102111
DMX_CHECK_PORT_INDEX_PTR(port_index);
21112112

2112-
uint8_t* p = nullptr;
2113+
uint8_t* data_available = nullptr;
21132114
TIMER_CNT(TIMER5) = 0;
21142115

21152116
do {
2116-
if ((p = const_cast<uint8_t*>(RdmReceive(port_index))) != nullptr) {
2117-
return p;
2117+
data_available = const_cast<uint8_t*>(RdmReceive(port_index));
2118+
if (data_available != nullptr) {
2119+
return data_available;
21182120
}
2119-
} while (TIMER_CNT(TIMER5) < time_out);
2121+
} while (TIMER_CNT(TIMER5) < timeout_ms);
21202122

21212123
return nullptr;
21222124
}
@@ -2223,26 +2225,26 @@ void Dmx::SetTransmitPeriodTime(uint32_t period) {
22232225
}
22242226
}
22252227

2226-
auto package_length_micro_seconds = s_dmx_transmit.break_time + s_dmx_transmit.mab_time + (length_max * 44U);
2228+
auto package_length_micro_seconds = s_dmx_transmit.break_time + s_dmx_transmit.mab_time + (length_max * dmx::kSlotTime);
22272229

22282230
// The GD32F4xx/GD32H7XX Timer 1 has a 32-bit counter
22292231
#if defined(GD32F4XX) || defined(GD32H7XX)
22302232
#else
2231-
if (package_length_micro_seconds > (static_cast<uint16_t>(~0) - 44U)) {
2233+
if (package_length_micro_seconds > (UINT16_MAX - dmx::kSlotTime)) {
22322234
s_dmx_transmit.break_time = std::min(dmx::transmit::kBreakTimeTypical, s_dmx_transmit.break_time);
22332235
s_dmx_transmit.mab_time = dmx::transmit::kMabTimeMin;
2234-
package_length_micro_seconds = s_dmx_transmit.break_time + s_dmx_transmit.mab_time + (length_max * 44U);
2236+
package_length_micro_seconds = s_dmx_transmit.break_time + s_dmx_transmit.mab_time + (length_max * dmx::kSlotTime);
22352237
}
22362238
#endif
22372239

22382240
if (period != 0) {
22392241
if (period < package_length_micro_seconds) {
2240-
transmit_period_ = std::max(dmx::transmit::kBreakToBreakTimeMin, package_length_micro_seconds + 44U);
2242+
transmit_period_ = std::max(dmx::transmit::kBreakToBreakTimeMin, package_length_micro_seconds + dmx::kSlotTime);
22412243
} else {
22422244
transmit_period_ = period;
22432245
}
22442246
} else {
2245-
transmit_period_ = std::max(dmx::transmit::kBreakToBreakTimeMin, package_length_micro_seconds + 44U);
2247+
transmit_period_ = std::max(dmx::transmit::kBreakToBreakTimeMin, package_length_micro_seconds + dmx::kSlotTime);
22462248
}
22472249

22482250
s_dmx_transmit.inter_time = transmit_period_ - package_length_micro_seconds;
@@ -2308,7 +2310,7 @@ dmx::OutputStyle Dmx::GetOutputStyle(uint32_t port_index) const {
23082310

23092311
// Setup
23102312
static void UartDmxConfig(uint32_t usart_periph) {
2311-
Gd32UartBegin(usart_periph, 250000U, gd32::kUartBits8, gd32::kUartParityNone, gd32::kUartStop2Bits);
2313+
Gd32UartBegin(usart_periph, dmx::kBaudRate, gd32::kUartBits8, gd32::kUartParityNone, gd32::kUartStop2Bits);
23122314
}
23132315

23142316
static void UsartDmaConfig() {
@@ -2710,7 +2712,7 @@ Dmx::Dmx() {
27102712

27112713
s_dmx_transmit.break_time = dmx::transmit::kBreakTimeTypical;
27122714
s_dmx_transmit.mab_time = dmx::transmit::kMabTimeMin;
2713-
s_dmx_transmit.inter_time = dmx::transmit::kPeriodDefault - s_dmx_transmit.break_time - s_dmx_transmit.mab_time - (dmx::kChannelsMax * 44) - 44;
2715+
s_dmx_transmit.inter_time = dmx::transmit::kPeriodDefault - s_dmx_transmit.break_time - s_dmx_transmit.mab_time - (dmx::kChannelsMax * dmx::kSlotTime) - dmx::kSlotTime;
27142716

27152717
for (uint32_t port_index = 0; port_index < DMX_MAX_PORTS; port_index++) {
27162718
Gd32GpioFsel(kDirGpio[port_index].port, kDirGpio[port_index].pin, GPIO_FSEL_OUTPUT);
@@ -2735,42 +2737,42 @@ Dmx::Dmx() {
27352737
Timer4Config(); // DMX Transmit -> UART4, USART5, UART6, UART7
27362738
#endif
27372739

2738-
#if defined(DMX_USE_USART0)
2740+
#if defined(DMX_USE_USART0) || defined(DMX_USE_USART0_RX)
27392741
UartDmxConfig(USART0);
27402742
NVIC_SetPriority(USART0_IRQn, 0);
27412743
NVIC_EnableIRQ(USART0_IRQn);
27422744
#endif
2743-
#if defined(DMX_USE_USART1)
2745+
#if defined(DMX_USE_USART1) || defined(DMX_USE_USART1_RX)
27442746
UartDmxConfig(USART1);
27452747
NVIC_SetPriority(USART1_IRQn, 0);
27462748
NVIC_EnableIRQ(USART1_IRQn);
27472749
#endif
2748-
#if defined(DMX_USE_USART2)
2750+
#if defined(DMX_USE_USART2) || defined(DMX_USE_USART2_RX)
27492751
UartDmxConfig(USART2);
27502752
NVIC_SetPriority(USART2_IRQn, 0);
27512753
NVIC_EnableIRQ(USART2_IRQn);
27522754
#endif
2753-
#if defined(DMX_USE_UART3)
2755+
#if defined(DMX_USE_UART3) || defined(DMX_USE_UART3_RX)
27542756
UartDmxConfig(UART3);
27552757
NVIC_SetPriority(UART3_IRQn, 0);
27562758
NVIC_EnableIRQ(UART3_IRQn);
27572759
#endif
2758-
#if defined(DMX_USE_UART4)
2760+
#if defined(DMX_USE_UART4) || defined(DMX_USE_UART4_RX)
27592761
UartDmxConfig(UART4);
27602762
NVIC_SetPriority(UART4_IRQn, 0);
27612763
NVIC_EnableIRQ(UART4_IRQn);
27622764
#endif
2763-
#if defined(DMX_USE_USART5)
2765+
#if defined(DMX_USE_USART5) || defined(DMX_USE_USART5_RX)
27642766
UartDmxConfig(USART5);
27652767
NVIC_SetPriority(USART5_IRQn, 0);
27662768
NVIC_EnableIRQ(USART5_IRQn);
27672769
#endif
2768-
#if defined(DMX_USE_UART6)
2770+
#if defined(DMX_USE_UART6) || defined(DMX_USE_UART6_RX)
27692771
UartDmxConfig(UART6);
27702772
NVIC_SetPriority(UART6_IRQn, 0);
27712773
NVIC_EnableIRQ(UART6_IRQn);
27722774
#endif
2773-
#if defined(DMX_USE_UART7)
2775+
#if defined(DMX_USE_UART7) || defined(DMX_USE_UART7_RX)
27742776
UartDmxConfig(UART7);
27752777
NVIC_SetPriority(UART7_IRQn, 0);
27762778
NVIC_EnableIRQ(UART7_IRQn);

0 commit comments

Comments
 (0)