mirror of
https://github.com/wled/WLED.git
synced 2025-04-24 06:47:18 +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"
|
||||
|
||||
/*
|
||||
* 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
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
|
||||
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);
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user