mirror of
https://github.com/wled/WLED.git
synced 2025-07-19 08:46:34 +00:00
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:
parent
a0ca243955
commit
f06a1e8b49
111
wled00/dmx.cpp
111
wled00/dmx.cpp
@ -1,7 +1,7 @@
|
|||||||
#include "wled.h"
|
#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/ESPDMX.cpp, if needed (ESP8266)
|
||||||
* Change the output pin in src/dependencies/SparkFunDMX.cpp, if needed (ESP32)
|
* Change the output pin in src/dependencies/SparkFunDMX.cpp, if needed (ESP32)
|
||||||
* ESP8266 Library from:
|
* ESP8266 Library from:
|
||||||
@ -75,112 +75,7 @@ void initDMX() {
|
|||||||
dmx.initWrite(512); // initialize with bus length
|
dmx.initWrite(512); // initialize with bus length
|
||||||
#endif
|
#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
|
#else
|
||||||
void initDMX();
|
void initDMX(){}
|
||||||
|
void handleDMX() {}
|
||||||
#endif
|
#endif
|
||||||
|
124
wled00/dmx_input.cpp
Normal file
124
wled00/dmx_input.cpp
Normal 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
|
@ -186,6 +186,13 @@ void setRandomColor(byte* rgb);
|
|||||||
//dmx.cpp
|
//dmx.cpp
|
||||||
void initDMX();
|
void initDMX();
|
||||||
void handleDMX();
|
void handleDMX();
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
|
|
||||||
|
//dmx_input.cpp
|
||||||
|
void initDMXInput();
|
||||||
|
void handleDMXInput();
|
||||||
|
>>>>>>> b4bbf0a5 (Extract dmx_input from dmx.cpp into dmx_input.cpp.)
|
||||||
|
|
||||||
//e131.cpp
|
//e131.cpp
|
||||||
void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol);
|
void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol);
|
||||||
|
@ -534,6 +534,9 @@ void WLED::setup()
|
|||||||
#ifdef WLED_ENABLE_DMX
|
#ifdef WLED_ENABLE_DMX
|
||||||
initDMX();
|
initDMX();
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef WLED_ENABLE_DMX_INPUT
|
||||||
|
initDMXInput();
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef WLED_ENABLE_ADALIGHT
|
#ifdef WLED_ENABLE_ADALIGHT
|
||||||
if (serialCanRX && Serial.available() > 0 && Serial.peek() == 'I') handleImprovPacket();
|
if (serialCanRX && Serial.available() > 0 && Serial.peek() == 'I') handleImprovPacket();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user