WLED/wled00/dmx_input.h

77 wiersze
2.2 KiB
C
Czysty Zwykły widok Historia

#pragma once
#include <cstdint>
2023-08-14 13:54:19 +00:00
#include <esp_dmx.h>
#include <atomic>
#include <mutex>
/*
* Support for DMX/RDM input via serial (e.g. max485) on ESP32
* ESP32 Library from:
2024-01-16 20:13:52 +00:00
* https://github.com/someweisguy/esp_dmx
*/
class DMXInput
{
public:
void init(uint8_t rxPin, uint8_t txPin, uint8_t enPin, uint8_t inputPortNum);
2023-08-14 13:54:19 +00:00
void update();
/**disable dmx receiver (do this before disabling the cache)*/
void disable();
void enable();
2025-02-21 20:40:16 +00:00
/// True if dmx is currently connected
bool isConnected() const { return connected; }
private:
/// @return true if rdm identify is active
bool isIdentifyOn() const;
2023-08-14 13:54:19 +00:00
/**
* Checks if the global dmx config has changed and updates the changes in rdm
*/
void checkAndUpdateConfig();
2023-08-14 13:54:19 +00:00
/// overrides everything and turns on all leds
void turnOnAllLeds();
/// installs the dmx driver
/// @return false on fail
bool installDriver();
/// is called by the dmx receive task regularly to receive new dmx data
void updateInternal();
2023-08-18 13:47:01 +00:00
2023-08-22 20:09:21 +00:00
// is invoked whenver the dmx start address is changed via rdm
2023-08-18 13:47:01 +00:00
friend void rdmAddressChangedCb(dmx_port_t dmxPort, const rdm_header_t *header,
void *context);
2023-08-22 20:09:21 +00:00
// is invoked whenever the personality is changed via rdm
friend void rdmPersonalityChangedCb(dmx_port_t dmxPort, const rdm_header_t *header,
void *context);
/// The internal dmx task.
/// This is the main loop of the dmx receiver. It never returns.
friend void dmxReceiverTask(void * context);
uint8_t inputPortNum = 255;
uint8_t rxPin = 255;
uint8_t txPin = 255;
uint8_t enPin = 255;
/// is written to by the dmx receive task.
2023-10-22 18:45:58 +00:00
byte dmxdata[DMX_PACKET_SIZE];
/// True once the dmx input has been initialized successfully
bool initialized = false; // true once init finished successfully
/// True if dmx is currently connected
std::atomic<bool> connected{false};
std::atomic<bool> identify{false};
/// Timestamp of the last time a dmx frame was received
unsigned long lastUpdate = 0;
/// Taskhandle of the dmx task that is running in the background
TaskHandle_t task;
/// Guards access to dmxData
std::mutex dmxDataLock;
};