Releases: vanvught/GD32F107RC-DMX512-RDM
V2.6
Release Notes
Highlights
- Embedded pixel metadata in HTTP content (auto-generated from pixeltype.h)
- Refactored pixel API with centralized TypeInfo
- Improved HTTP server configurability (index-only mode, feature guards, optimization flags)
- Safer formatting utilities (UTC offset handling, snprintf fixes)
- Config + RDM improvements (factory reset support, safer defaults)
- General cleanup, correctness fixes, and modernization
Core Improvements
Safer Formatting & Utilities
- Use full buffer size in snprintf (removed unnecessary truncation)
- Reworked UTC offset formatting:
- Correct handling of zero/negative offsets
- Always emits + for positive offsets
- Introduced:
- format::UtcOffset
- Append2Digits
- Renamed FormatFloat → Float
- Added and improved helper structure
Console & Logging
- Ensured consistent line endings:
- Added trailing \n to console::Error across multiple modules
- Replaced:
- console::Puts(": ") → console::Write(": ", 2)
- Added console::Write declaration
HTTP Server & Content
Content Pipeline Overhaul
- Major rewrite of generate_content.cpp:
- Modular helpers
- Safer file/string handling
- Feature-aware content generation
- Introduced embedded pixel metadata JSON:
- pixeltype.json generated via parse_pixeltype.py
- Compiled into firmware (pixeltype.json.h)
- Added:
- FilesContent::hash (FNV-1a)
- Runtime hash lookup for faster file matching
Feature Guards & Build Flexibility
- Conditional content inclusion:
- Pixel content only when relevant output is enabled
- New build modes:
- CONFIG_HTTP_HTML_INDEX_ONLY → minimal HTTP footprint
- Simplified build flags:
- Removed ENABLE_CONTENT, now driven by ENABLE_HTTPD
HTTPD Optimizations
- Configurable optimization levels:
- CONFIG_HTTPD_OPTIMIZE_O2
- CONFIG_HTTPD_OPTIMIZE_O3
- CONFIG_HTTPD_OPTIMIZE_NONE
- Cleaner handler logic and conditional compilation
Pixel Library Refactor
API Changes
- Renamed:
- pixel::Type → pixel::LedType
- pixel::Map → pixel::LedMap
New TypeInfo
- Centralized per-type metadata:
- Protocol
- LED count
- SPI speeds (default/max)
- RTZ timings
- Default mapping
Benefits
- Automatic defaults in PixelConfiguration
- Validation + cleaner API usage
- Compile-time helpers (constexpr, static_assert)
- Removed legacy code (pixeltype.cpp, unused helpers)
Configuration & System
Config Store
- Added:
- ConfigStore::Reset()
- Remote factory reset now:
- Clears config
- Triggers reboot
RDM Support
- Added:
- SetFactoryDefaults() declaration + weak default implementation
- Integrated into responder logic
Memory & Allocator
- Increased default network blocks:
- kBlocks: 8 → 12
- Improved error messages:
- "Full!" → "Allocate:Full!\n"
Networking & Compliance
Hostname Compliance
- Updated to meet RFC 1123
- Replaced _ with - in prefixes
- Added documentation for valid hostname rules
Misc Networking
- Switched include to network_udp
- Cleaned up TCP diagnostics and formatting
Cleanup & Maintenance
- Removed unused RDM-related includes and code
- Eliminated duplicate function calls
- Improved formatting and readability across modules
- Expanded static initializers for clarity
- Added compile-time guards for STORE backends (file/I2C/SPI)
V2.5
Release Notes
This release focuses on cleanup, consistency, and a few important correctness fixes across RDM, DMX, Art-Net, console, and network interface code.
Highlights
The most important behavioral fix in this release is a correction to RDM UID construction. The device serial number bytes are now mapped in the correct order when composing the UID, fixing an endianness issue so uid_[2]..uid_[5] now receive serial_number_[3]..serial_number_[0].
Another notable functional improvement is in Art-Net poll replies. DHCP/manual IP status bits are now set when the poll reply is built, instead of being cached at startup. That makes the reported network state accurate at the time the reply is sent.
The rest of the changes are mostly refactors and cleanup aimed at improving readability, consistency, and maintainability.
Added / Improved
RDM
- Fixed UID serial number byte order when composing the RDM UID.
DMX configuration
- Simplified DMX node configuration storage:
- renamed inline static storage from store_dmxnode_ to store_dmxnode
- removed the unused personality field from configuration handling
- removed the related JSON key, parsing, serialization, and dump output
- updated stored struct layout by replacing the personality byte with a 2-byte reserved field
- Adjusted config copy/store/apply code to match the new layout
Art-Net
- Moved DHCP/manual flag handling into SendPollReply()
- Removed redundant DHCP flag updates from:
- ArtNetNode::Start()
- IP programming handling
- Existing DHCP capability reporting remains unchanged
Console / serial / network utilities
- Replaced local TO_HEX / ToHex implementations with common::hex::ToCharUppercase
- Added shared hex utility includes where needed
- Removed redundant macro/function definitions from console and network code
Network interface / hostname handling
- Improved hostname generation and sanitization:
- copy only printable characters
- zero-fill remaining buffer
- avoid embedding non-printable bytes
- Updated default hostname build logic and debug tracing
- Modernized interface code:
- switched from legacy network.h include to core/netif.h
- adjusted includes in JSON/network parameter handling
- treated hwaddr as a pointer for cleaner handling
Cleanup
- Removed an unused include in artnetparams.cpp
- Removed a stale inline comment in the RTL8201F PHY driver
- Updated related JSON/configuration code to reflect DMX parameter changes
- Minor IDE metadata update in language settings
Behavior Changes
- RDM UID generation: serial number byte order has changed to the correct mapping
- Art-Net poll replies: DHCP/manual IP flags now reflect the current interface state at reply time
- DMX JSON/config: the unused personality field is no longer accepted, stored, or exported
Upgrade Notes
If you consume exported JSON or stored config structures directly:
- remove any dependency on the DMX personality key
- expect the DMX config struct layout to have changed slightly
- expect Art-Net DHCP/manual reporting to be dynamic rather than startup-fixed
V2.4
Highlights
- Added device management tools for downloading configuration files and remotely rebooting nodes.
- Introduced RDMnet LLRP-only build mode for GD32 targets.
- Major internal Art-Net and RDM interface refactor for clearer naming and maintainability.
- Improved build system with timestamp support and cleaner version handling.
Tools
- fetch_configs.py
HTTP utility that resolves the device once (avoids repeated mDNS delays) and downloads:
- /json/version
- /json/list
- all configuration files listed in /json/config/directory Files are saved locally as formatted JSON.
- reboot.py
UDP reboot tool that:
- sends list and reboot commands
- waits for the device to return online with a spinner
- supports a --forever mode for continuous reboot cycles.
Art-Net
- Refactored artnet.h with clearer snake_case naming.
- Added support for:
- ArtCommand
- ArtDataRequest
- ArtDataReply
- Improved comments, flags, and port address bounds.
- Internal cleanup while keeping packet layouts compatible.
RDM / RDMnet
- Added LLRP-only mode (NODE_RDMNET_LLRP_ONLY).
- Integrated LLRPDevice with the E1.31 bridge.
- Refactored RDM discovery and state machine implementation.
- Simplified RDM controller inheritance in Art-Net.
- Product category/detail now supplied via build defines.
Build System
- Added Timestamp.mk to provide a compile-time timestamp (TIME_STAMP).
- Removed automatic generation of software_version_id.h.
- Added conditional support for RTL8201F_LED1_LINK_ALL.
- Minor makefile cleanups and conditional source inclusion improvements.
Refactoring and Cleanup
- Moved dmxnode_utils.h to common/utils/utils_port.h.
- Renamed namespace json → common.
- Removed obsolete -fprefetch-loop-arrays pragma.
- Normalized formatting and include order across modules.
- Added detailed documentation for PHY RMII timing adjustments.
Developer note: Some internal identifiers were renamed (particularly in Art-Net structures and utility headers). Code referencing older names may require minor updates.
V2.3
Release Notes
General Maintenance & Cleanup
- Replaced all bare assert(0) usages with assert(false) or assert(false && "") to clearly mark unreachable code paths and improve diagnostics in debug builds.
- Updated copyright headers across GD32, HAL, pixel DMX, and related files to include 2026.
- Applied widespread formatting, whitespace, include ordering, and indentation cleanups across the codebase.
- Minor API tidy-ups and small refactors where behavior is unchanged.
- Adjusted NDEBUG handling in pixel DMX JSON-related code.
- Restored or added missing license headers in several JSON parameter files.
These changes are cosmetic, licensing, or diagnostic-only and do not affect runtime behavior.
Art-Net Improvements
- Refactored Art-Net poll reply handling to simplify flow and improve correctness:
- ArtNetNode::ProcessPollReply signature simplified by removing explicit input/output port count parameters.
- Port determination is now fully centralized in SendPollReply.
- Improved SendPollReply behavior:
- Early return for disabled ports.
- Correct handling of NumPortsLo and PortTypes, respecting ARTNET_HAVE_DMXIN.
- Fixed poll reply counter increment/reset logic.
- Node report is always created and the UDP packet is always sent when appropriate.
- state_.is_changed is now cleared consistently after sending.
- Updated node type naming from “Artnet” to “Art-Net” for consistency.
- Reformatted DMX node output type name arrays.
- Minor comment, formatting, and whitespace cleanups across Art-Net sources.
These changes reduce complexity in poll reply handling and make the behavior more predictable and easier to maintain.
GD32 DMA memcpy Improvements
- Updated copyright headers.
- Added stricter alignment assertions for the GD32F4 DMA memcpy path.
- IRQ setup is now conditionally compiled via DMA_MEMCPY32_DISABLE_IRQ.
- Removed unused includes to reduce noise and potential confusion.
This improves portability, robustness, and configurability of the DMA memcpy implementation.
Pixel DMX & Display Code
- Added missing debug include in pixeldmxparams.
- Fixed small formatting and indentation issues.
- Minor cleanups across display, UDF, global, and pixel DMX sources.
No functional changes intended.
New Utility Scripts
Added several new Python utilities under common/scripts:
- udp_send.py
- Reusable UDP send/receive module.
- Includes a simple CLI for quick testing and scripting.
- Gd32/do-tftp.py
- Python-based helper to drive TFTP transfers.
- Uses udp_send.py alongside the system tftp client.
- gd32/flash.py
- GD32 ROM bootloader flasher.
- Includes a UART monitor for basic interaction/debugging.
- Updated .gitignore to exclude the GD32 script virtual environment directory.
These scripts are intended as developer utilities and do not affect firmware builds.
Summary
This release focuses on codebase hygiene and maintainability:
- Clearer assertions and diagnostics
- Cleaner and simpler Art-Net poll reply logic
- Improved DMA memcpy robustness on GD32
- Licensing consistency
- New developer utility scripts
No behavioral changes are expected outside the Art-Net poll reply refactor and DMA memcpy internal safeguards.
V2.2
Release Notes – Codebase Refactor & Modularization
- Major project restructuring
- Reorganized libraries and source files into a clearer, more modular directory structure.
- Moved, renamed, or removed numerous files to reduce duplication and improve maintainability.
- Legacy code cleanup
- Removed deprecated and unused code from lib-lightset, lib-network, lib-properties, and older display components.
- Eliminated redundant parameter and platform-specific files no longer in use.
- Centralized common functionality
- Migrated shared network, properties, and parameter code into a unified common directory.
- Added new utility headers and source files for reusable functionality.
- JSON-based configuration support
- Added new JSON configuration and parameter files.
- Introduced JSON helper utilities and parameter classes to standardize configuration handling and prepare for future extensibility.
- DMX, RDM, and pixel refactor
- Refactored DMX, RDM device handling, and pixel-related libraries for clearer structure and better separation of responsibilities.
- Unified RDM device information handling.
- Build system updates
- Updated Makefiles, build scripts, and compile_commands.json to reflect the new project structure.
- Improved GD32 platform support and hardware abstraction organization.
- Network stack reorganization
- Flattened lib-network source layout by moving files from subdirectories into a simpler structure.
- Improved clarity of EMAC and Linux network interface implementations (no functional changes).
- Debug macro consistency
- Replaced DEBUG_ENTRY / DEBUG_EXIT macros with function-style DEBUG_ENTRY() / DEBUG_EXIT() across the codebase for consistency and readability.
- Overall impact
- Significantly improved modularity, readability, and long-term maintainability.
- Laid groundwork for future feature expansion and more robust JSON-based configuration across modules.
V2.1
- Improved startup_gd32fxxx.S
- CMSIS has its own project now
- Upgraded to CMSIS V5.0.5
- Removed lib-debug. Now part of lib-hal
- Updated to latest GD32 Firmware
- Introduced debug software UART0
- Major cleanup lib-configstore
- In order to support Newlib; removed lib-c, lib-c++ and added lib-clib
- In order to support FreeRTOS; Added Software timers in H.A.L. framework.
- Major update network stack. Added support for RFC 5227 and RFC 3927
- Get/Set pixel type by RDM (introduced by @PharosMarcusB)
- Updated Art-Net with latest specifications
- Improved support for RDMNet LLRP only
- Moved parameter utc_offset to "env.txt"
- Improved HTTP Server
- Added support for remote UART shell
- Removed lib-rdmdiscovery, lib-rdmnet and lib-rdmresponder
- Removed lib-oscclient and lib-oscserver
V2.0
- Improved build system
- Added stack debug framework
- Removed not used source files
- Added support DMX delta output
- Added Manufacturer PIDs (https://www.gd32-dmx.org/rdm.html)
- Added support for void __libc_init_array(void)
- Changed the layout of the config store.
- Before upgrading the firmware it is advised to make a backup of the configuration.
- After the upgrade, then restore the saved configuration.
- lib-artnet : V1.58
- lib-e131 : V1.27
- Removed lib-artnet4
- Improved Network abstraction layer
- Improved PHY initialization process
- Improved embedded HTTP server
- Added support for secondary (permanent) IP address
- The node is always available on the secondary IP address (2.x.x.x) for ping and http requests.