Extract dmx_input from dmx.cpp into dmx_input.cpp.

This greatly improves readability because it gets rid of most of the
ifdefs.
This commit is contained in:
Arne 2023-08-14 14:12:08 +02:00 committed by Will Tatam
parent a0ca243955
commit f06a1e8b49
4 changed files with 137 additions and 108 deletions

View File

@ -1,7 +1,7 @@
#include "wled.h"
/*
* Support for DMX input and output via MAX485.
* Support for DMX input and output via serial (e.g. MAX485).
* Change the output pin in src/dependencies/ESPDMX.cpp, if needed (ESP8266)
* Change the output pin in src/dependencies/SparkFunDMX.cpp, if needed (ESP32)
* ESP8266 Library from:
@ -75,112 +75,7 @@ void initDMX() {
dmx.initWrite(512); // initialize with bus length
#endif
}
#endif
#ifdef WLED_ENABLE_DMX_INPUT
#include <esp_dmx.h>
static dmx_port_t dmxInputPort = 2; //TODO make this configurable
bool dmxInputInitialized = false; //true once initDmx finished successfully
void initDMX() {
if(dmxInputReceivePin > 0 && dmxInputEnablePin > 0 && dmxInputTransmitPin > 0)
{
const managed_pin_type pins[] = {
{dmxInputTransmitPin, false}, //these are not used as gpio pins, this isOutput is always false.
{dmxInputReceivePin, false},
{dmxInputEnablePin, false}
};
const bool pinsAllocated = pinManager.allocateMultiplePins(pins, 3, PinOwner::DMX_INPUT);
if(!pinsAllocated)
{
USER_PRINTF("Error: Failed to allocate pins for DMX_INPUT. Pins already in use:\n");
USER_PRINTF("rx in use by: %s\n", pinManager.getPinOwnerText(dmxInputReceivePin).c_str());
USER_PRINTF("tx in use by: %s\n", pinManager.getPinOwnerText(dmxInputTransmitPin).c_str());
USER_PRINTF("en in use by: %s\n", pinManager.getPinOwnerText(dmxInputEnablePin).c_str());
return;
}
dmx_config_t config{
255, /*alloc_size*/
0, /*model_id*/
RDM_PRODUCT_CATEGORY_FIXTURE, /*product_category*/
VERSION, /*software_version_id*/
"undefined", /*software_version_label*/
1, /*current_personality*/
{{15, "WLED Effect Mode"}}, /*personalities*/
1, /*personality_count*/
1, /*dmx_start_address*/
};
const std::string versionString = "WLED_V" + std::to_string(VERSION);
strncpy(config.software_version_label, versionString.c_str(), 32);
config.software_version_label[32] = '\0';//zero termination in case our string was longer than 32 chars
if(!dmx_driver_install(dmxInputPort, &config, DMX_INTR_FLAGS_DEFAULT))
{
USER_PRINTF("Error: Failed to install dmx driver\n");
return;
}
USER_PRINTF("Listening for DMX on pin %u\n", dmxInputReceivePin);
USER_PRINTF("Sending DMX on pin %u\n", dmxInputTransmitPin);
USER_PRINTF("DMX enable pin is: %u\n", dmxInputEnablePin);
dmx_set_pin(dmxInputPort, dmxInputTransmitPin, dmxInputReceivePin, dmxInputEnablePin);
dmxInputInitialized = true;
}
else
{
USER_PRINTLN("DMX input disabled due to dmxInputReceivePin, dmxInputEnablePin or dmxInputTransmitPin not set");
return;
}
}
bool dmxIsConnected = false;
unsigned long dmxLastUpdate = 0;
void handleDMXInput() {
if(!dmxInputInitialized) {
return;
}
byte dmxdata[DMX_PACKET_SIZE];
dmx_packet_t packet;
unsigned long now = millis();
if (dmx_receive(dmxInputPort, &packet, 0)) {
/* We should check to make sure that there weren't any DMX errors. */
if (!packet.err) {
/* If this is the first DMX data we've received, lets log it! */
if (!dmxIsConnected) {
USER_PRINTLN("DMX is connected!");
dmxIsConnected = true;
}
dmx_read(dmxInputPort, dmxdata, packet.size);
handleDMXData(1, 512, dmxdata, REALTIME_MODE_DMX, 0);
dmxLastUpdate = now;
} else {
/* Oops! A DMX error occurred! Don't worry, this can happen when you first
connect or disconnect your DMX devices. If you are consistently getting
DMX errors, then something may have gone wrong with your code or
something is seriously wrong with your DMX transmitter. */
DEBUG_PRINT("A DMX error occurred - ");
DEBUG_PRINTLN(packet.err);
}
}
else if (dmxIsConnected && (now - dmxLastUpdate > 5000)) {
dmxIsConnected = false;
USER_PRINTLN("DMX was disconnected.");
}
}
#else
void initDMX();
void initDMX(){}
void handleDMX() {}
#endif

124
wled00/dmx_input.cpp Normal file
View File

@ -0,0 +1,124 @@
#include "wled.h"
#ifdef WLED_ENABLE_DMX_INPUT
#include <esp_dmx.h>
/*
* Support for DMX/RDM input via serial (e.g. max485) on ESP32
* ESP32 Library from:
* https://github.com/sparkfun/SparkFunDMX
*/
static dmx_port_t dmxInputPort = 2; //TODO make this configurable
bool dmxInputInitialized = false; //true once initDmx finished successfully
void initDMXInput() {
/**
* TODOS:
* - add personalities for all supported dmx input modes
* - select the personality that is stored in flash on startup
* - attach callback for personality change and store in flash if changed
* - attach callback for address change and store in flash
* - load dmx address from flash and set in config on startup
* - attach callback to rdm identify and flash leds when on
*/
if(dmxInputReceivePin > 0 && dmxInputEnablePin > 0 && dmxInputTransmitPin > 0)
{
const managed_pin_type pins[] = {
{(int8_t)dmxInputTransmitPin, false}, //these are not used as gpio pins, this isOutput is always false.
{(int8_t)dmxInputReceivePin, false},
{(int8_t)dmxInputEnablePin, false}
};
const bool pinsAllocated = pinManager.allocateMultiplePins(pins, 3, PinOwner::DMX_INPUT);
if(!pinsAllocated)
{
USER_PRINTF("Error: Failed to allocate pins for DMX_INPUT. Pins already in use:\n");
USER_PRINTF("rx in use by: %s\n", pinManager.getPinOwnerText(dmxInputReceivePin).c_str());
USER_PRINTF("tx in use by: %s\n", pinManager.getPinOwnerText(dmxInputTransmitPin).c_str());
USER_PRINTF("en in use by: %s\n", pinManager.getPinOwnerText(dmxInputEnablePin).c_str());
return;
}
dmx_config_t config{
255, /*alloc_size*/
0, /*model_id*/
RDM_PRODUCT_CATEGORY_FIXTURE, /*product_category*/
VERSION, /*software_version_id*/
"undefined", /*software_version_label*/
1, /*current_personality*/
{{15, "WLED Effect Mode"}}, /*personalities*/
1, /*personality_count*/
1, /*dmx_start_address*/
};
const std::string versionString = "WLED_V" + std::to_string(VERSION);
strncpy(config.software_version_label, versionString.c_str(), 32);
config.software_version_label[32] = '\0';//zero termination in case our string was longer than 32 chars
if(!dmx_driver_install(dmxInputPort, &config, DMX_INTR_FLAGS_DEFAULT))
{
USER_PRINTF("Error: Failed to install dmx driver\n");
return;
}
USER_PRINTF("Listening for DMX on pin %u\n", dmxInputReceivePin);
USER_PRINTF("Sending DMX on pin %u\n", dmxInputTransmitPin);
USER_PRINTF("DMX enable pin is: %u\n", dmxInputEnablePin);
dmx_set_pin(dmxInputPort, dmxInputTransmitPin, dmxInputReceivePin, dmxInputEnablePin);
dmxInputInitialized = true;
}
else
{
USER_PRINTLN("DMX input disabled due to dmxInputReceivePin, dmxInputEnablePin or dmxInputTransmitPin not set");
return;
}
}
static bool dmxIsConnected = false;
static unsigned long dmxLastUpdate = 0;
void handleDMXInput() {
if(!dmxInputInitialized) {
return;
}
byte dmxdata[DMX_PACKET_SIZE];
dmx_packet_t packet;
unsigned long now = millis();
if (dmx_receive(dmxInputPort, &packet, 0)) {
/* We should check to make sure that there weren't any DMX errors. */
if (!packet.err) {
/* If this is the first DMX data we've received, lets log it! */
if (!dmxIsConnected) {
USER_PRINTLN("DMX is connected!");
dmxIsConnected = true;
}
dmx_read(dmxInputPort, dmxdata, packet.size);
handleDMXData(1, 512, dmxdata, REALTIME_MODE_DMX, 0);
dmxLastUpdate = now;
} else {
/* Oops! A DMX error occurred! Don't worry, this can happen when you first
connect or disconnect your DMX devices. If you are consistently getting
DMX errors, then something may have gone wrong with your code or
something is seriously wrong with your DMX transmitter. */
DEBUG_PRINT("A DMX error occurred - ");
DEBUG_PRINTLN(packet.err);
}
}
else if (dmxIsConnected && (now - dmxLastUpdate > 5000)) {
dmxIsConnected = false;
USER_PRINTLN("DMX was disconnected.");
}
}
#else
void initDMXInput(){}
void handleDMXInput(){}
#endif

View File

@ -186,6 +186,13 @@ void setRandomColor(byte* rgb);
//dmx.cpp
void initDMX();
void handleDMX();
<<<<<<< HEAD
=======
//dmx_input.cpp
void initDMXInput();
void handleDMXInput();
>>>>>>> b4bbf0a5 (Extract dmx_input from dmx.cpp into dmx_input.cpp.)
//e131.cpp
void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol);

View File

@ -534,6 +534,9 @@ void WLED::setup()
#ifdef WLED_ENABLE_DMX
initDMX();
#endif
#ifdef WLED_ENABLE_DMX_INPUT
initDMXInput();
#endif
#ifdef WLED_ENABLE_ADALIGHT
if (serialCanRX && Serial.available() > 0 && Serial.peek() == 'I') handleImprovPacket();