Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -385,3 +385,52 @@ jobs:
- name: FastLED
- source-url: https://github.com/JAndrassy/EthernetENC.git
verbose: true

build-multi:
name: "Build Test (Multiple): ${{matrix.board.arch}}:${{matrix.board.name}}"
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
board:
- vendor: esp8266
arch: esp8266
name: generic
- vendor: esp32
arch: esp32
name: esp32
- vendor: esp32
arch: esp32
name: esp32s3
- vendor: esp32
arch: esp32
name: esp32c3
include:
- index: https://arduino.esp8266.com/stable/package_esp8266com_index.json
board:
vendor: esp8266
- index: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
board:
vendor: esp32
steps:
- uses: actions/checkout@v4
- uses: arduino/arduino-lint-action@v1
with:
library-manager: update
- name: compile example sketchs
uses: arduino/compile-sketches@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
fqbn: ${{matrix.board.vendor}}:${{matrix.board.arch}}:${{matrix.board.name}}
platforms: |
- name: ${{matrix.board.vendor}}:${{matrix.board.arch}}
source-url: ${{matrix.index}}
sketch-paths: |
- examples/Multiple
libraries: |
- source-path: ./
- name: ArxContainer
- name: ArxTypeTraits
- name: WiFi
- name: Ethernet
verbose: true
14 changes: 5 additions & 9 deletions Artnet/Manager.h
Original file line number Diff line number Diff line change
@@ -1,32 +1,28 @@
#pragma once
#ifndef ARTNET_MANAGER_H
#define ARTNET_MANAGER_H

#include "Common.h"
#include "Receiver.h"
#include "Sender.h"
#include "ManagerTraits.h"

namespace art_net {

template <typename S>
class Manager : public Sender_<S>, public Receiver_<S>
class Manager : public IManager, public Sender_<S>, public Receiver_<S>
{
S stream;

public:
void begin(uint16_t recv_port = DEFAULT_PORT)
void begin(uint16_t port = DEFAULT_PORT) override
{
this->stream.begin(recv_port);
this->stream.begin(port);
this->Sender_<S>::attach(this->stream);
this->Receiver_<S>::attach(this->stream);
}

void parse()
{
this->Receiver_<S>::parse();
}
};


} // namespace art_net

#endif // ARTNET_MANAGER_H
20 changes: 20 additions & 0 deletions Artnet/ManagerTraits.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#pragma once
#ifndef ARTNET_MANAGER_TRAITS_H
#define ARTNET_MANAGER_TRAITS_H

#include "ReceiverTraits.h"
#include "SenderTraits.h"

namespace art_net {

struct IManager : virtual ISender_, virtual IReceiver_
{
virtual ~IManager() = default;
virtual void begin(uint16_t port = DEFAULT_PORT) = 0;
};

} // namespace art_net

using ArtnetInterface = art_net::IManager;

#endif // ARTNET_MANAGER_TRAITS_H
44 changes: 21 additions & 23 deletions Artnet/Receiver.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "ArtPollReply.h"
#include "ArtTrigger.h"
#include "ArtSync.h"
#include "ReceiverTraits.h"

namespace art_net {

Expand All @@ -22,7 +23,11 @@ static NoPrint no_log;
} // namespace

template <typename S>
#ifndef ARDUINO_ARCH_AVR
class Receiver_ : virtual IReceiver_
#else
class Receiver_
#endif
{
S *stream;
Array<PACKET_SIZE> packet;
Expand Down Expand Up @@ -140,9 +145,7 @@ class Receiver_
}

// subscribe artdmx packet for specified net, subnet, and universe
template <typename Fn>
auto subscribeArtDmxUniverse(uint8_t net, uint8_t subnet, uint8_t universe, const Fn &func)
-> std::enable_if_t<arx::is_callable<Fn>::value>
void subscribeArtDmxUniverse(uint8_t net, uint8_t subnet, uint8_t universe, const ArtDmxCallback& func)
{
if (net > 0x7F) {
this->logger->println(F("net should be less than 0x7F"));
Expand All @@ -161,42 +164,33 @@ class Receiver_
}

// subscribe artdmx packet for specified universe (15 bit)
template <typename Fn>
auto subscribeArtDmxUniverse(uint16_t universe, const Fn &func)
-> std::enable_if_t<arx::is_callable<Fn>::value>
void subscribeArtDmxUniverse(uint16_t universe, const ArtDmxCallback& func)
{
this->callback_art_dmx_universes.insert(std::make_pair(universe, arx::function_traits<Fn>::cast(func)));
this->callback_art_dmx_universes.insert(std::make_pair(universe, func));
}

// subscribe artnzs packet for specified universe (15 bit)
template <typename Fn>
auto subscribeArtNzsUniverse(uint16_t universe, const Fn &func)
-> std::enable_if_t<arx::is_callable<Fn>::value>
void subscribeArtNzsUniverse(uint16_t universe, const ArtNzsCallback& func)
{
this->callback_art_nzs_universes.insert(std::make_pair(universe, arx::function_traits<Fn>::cast(func)));
this->callback_art_nzs_universes.insert(std::make_pair(universe, func));
}

// subscribe artdmx packet for all universes
template <typename Fn>
auto subscribeArtDmx(const Fn &func)
-> std::enable_if_t<arx::is_callable<Fn>::value>
void subscribeArtDmx(const ArtDmxCallback& func)
{
this->callback_art_dmx = arx::function_traits<Fn>::cast(func);
this->callback_art_dmx = func;
}

// subscribe other packets
template <typename Fn>
auto subscribeArtSync(const Fn &func)
-> std::enable_if_t<arx::is_callable<Fn>::value>
void subscribeArtSync(const ArtSyncCallback& func)
{
this->callback_art_sync = arx::function_traits<Fn>::cast(func);
this->callback_art_sync = func;
}

template <typename Fn>
auto subscribeArtTrigger(const Fn &func)
-> std::enable_if_t<arx::is_callable<Fn>::value>
// subscribe art_trigger packet
void subscribeArtTrigger(const ArtTriggerCallback& func)
{
this->callback_art_trigger = arx::function_traits<Fn>::cast(func);
this->callback_art_trigger = func;
}

void unsubscribeArtDmxUniverse(uint8_t net, uint8_t subnet, uint8_t universe)
Expand Down Expand Up @@ -424,7 +418,11 @@ class Receiver_
};

template <typename S>
#ifndef ARDUINO_ARCH_AVR
class Receiver : public IReceiver, public Receiver_<S>
#else
class Receiver : public Receiver_<S>
#endif
{
S stream;

Expand Down
75 changes: 75 additions & 0 deletions Artnet/ReceiverTraits.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@
#ifndef ARTNET_RECEIVER_TRAITS_H
#define ARTNET_RECEIVER_TRAITS_H

#include "Common.h"
#include "ArtDmx.h"
#include "ArtNzs.h"
#include "ArtPollReply.h"
#include "ArtTrigger.h"
#include "ArtSync.h"

namespace art_net {

template <typename T> struct LocalIP;
Expand All @@ -25,6 +32,10 @@ template <typename T>
bool isNetworkReady(T&& x) {
return IsNetworkReady<std::decay_t<T>>::get(std::forward<T>(x));
}
template <typename T>
bool isNetworkReady(T&& x) {
return IsNetworkReady<std::decay_t<T>>::isNetworkReady(std::forward<T>(x));
}

template <typename T>
IPAddress getLocalIP();
Expand All @@ -35,6 +46,70 @@ void getMacAddress(uint8_t mac[6]);
template <typename T>
bool isNetworkReady();

struct IReceiver_
{
virtual ~IReceiver_() = default;

virtual OpCode parse() = 0;
// subscribe artdmx packet for specified net, subnet, and universe
virtual void subscribeArtDmxUniverse(uint8_t net, uint8_t subnet, uint8_t universe, const ArtDmxCallback& func) = 0;
// subscribe artdmx packet for specified universe (15 bit)
virtual void subscribeArtDmxUniverse(uint16_t universe, const ArtDmxCallback& func) = 0;
// subscribe artnzs packet for specified universe (15 bit)
virtual void subscribeArtNzsUniverse(uint16_t universe, const ArtNzsCallback& func) = 0;
// subscribe artdmx packet for all universes
virtual void subscribeArtDmx(const ArtDmxCallback& func) = 0;
// subscribe other packets
virtual void subscribeArtSync(const ArtSyncCallback& func) = 0;
// subscribe art_trigger packet
virtual void subscribeArtTrigger(const ArtTriggerCallback& func) = 0;

virtual void unsubscribeArtDmxUniverse(uint8_t net, uint8_t subnet, uint8_t universe) = 0;
virtual void unsubscribeArtDmxUniverse(uint16_t universe) = 0;
virtual void unsubscribeArtDmxUniverses() = 0;
virtual void unsubscribeArtDmx() = 0;
virtual void unsubscribeArtNzsUniverse(uint16_t universe) = 0;
virtual void unsubscribeArtSync() = 0;
virtual void unsubscribeArtTrigger() = 0;

#ifdef FASTLED_VERSION
virtual void forwardArtDmxDataToFastLED(uint8_t net, uint8_t subnet, uint8_t universe, CRGB* leds, uint16_t num) = 0;
virtual void forwardArtDmxDataToFastLED(uint16_t universe, CRGB* leds, uint16_t num) = 0;
#endif

// https://art-net.org.uk/how-it-works/discovery-packets/artpollreply/
virtual void setArtPollReplyConfigOem(uint16_t oem) = 0;
virtual void setArtPollReplyConfigEstaMan(uint16_t esta_man) = 0;
virtual void setArtPollReplyConfigStatus1(uint8_t status1) = 0;
virtual void setArtPollReplyConfigStatus2(uint8_t status2) = 0;
virtual void setArtPollReplyConfigShortName(const String &short_name) = 0;
virtual void setArtPollReplyConfigLongName(const String &long_name) = 0;
virtual void setArtPollReplyConfigNodeReport(const String &node_report) = 0;
virtual void setArtPollReplyConfigSwIn(size_t index, uint8_t sw_in) = 0;
virtual void setArtPollReplyConfigSwIn(uint8_t sw_in[4]) = 0;
virtual void setArtPollReplyConfigSwIn(uint8_t sw_in_0, uint8_t sw_in_1, uint8_t sw_in_2, uint8_t sw_in_3) = 0;
virtual void setArtPollReplyConfig(
uint16_t oem,
uint16_t esta_man,
uint8_t status1,
uint8_t status2,
const String &short_name,
const String &long_name,
const String &node_report,
uint8_t sw_in[4]
) = 0;
virtual void setArtPollReplyConfig(const ArtPollReplyConfig &cfg) = 0;
virtual void setLogger(Print* logger) = 0;
};

struct IReceiver : virtual IReceiver_
{
virtual ~IReceiver() = default;
virtual void begin(uint16_t recv_port = DEFAULT_PORT) = 0;
};

} // namespace art_net

using ArtnetReceiverInterface = art_net::IReceiver;

#endif // ARTNET_RECEIVER_TRAITS_H
13 changes: 11 additions & 2 deletions Artnet/Sender.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,16 @@
#include "ArtNzs.h"
#include "ArtTrigger.h"
#include "ArtSync.h"
#include "SenderTraits.h"

namespace art_net {

template <typename S>
#ifndef ARDUINO_ARCH_AVR
class Sender_ : virtual ISender_
#else
class Sender_
#endif
{
S* stream;
Array<PACKET_SIZE> packet;
Expand Down Expand Up @@ -189,14 +194,18 @@ class Sender_
};

template <typename S>
#ifndef ARDUINO_ARCH_AVR
class Sender : public ISender, public Sender_<S>
#else
class Sender : public Sender_<S>
#endif
{
S stream;

public:
void begin()
void begin(uint16_t send_port = DEFAULT_PORT)
{
this->stream.begin(DEFAULT_PORT);
this->stream.begin(send_port);
this->Sender_<S>::attach(this->stream);
}
};
Expand Down
52 changes: 52 additions & 0 deletions Artnet/SenderTraits.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#pragma once
#ifndef ARTNET_SENDER_TRAITS_H
#define ARTNET_SENDER_TRAITS_H

namespace art_net {

struct ISender_
{
virtual ~ISender_() = default;

// streaming artdmx packet
virtual void setArtDmxData(const uint8_t* const data, uint16_t size) = 0;
virtual void setArtDmxData(uint16_t ch, uint8_t data) = 0;

virtual void streamArtDmxTo(const String& ip, uint16_t universe15bit) = 0;
virtual void streamArtDmxTo(const String& ip, uint8_t net, uint8_t subnet, uint8_t universe) = 0;
virtual void streamArtDmxTo(const String& ip, uint8_t net, uint8_t subnet, uint8_t universe, uint8_t physical) = 0;

// streaming artnzs packet
virtual void setArtNzsData(const uint8_t* const data, uint16_t size) = 0;
virtual void setArtNzsData(uint16_t ch, uint8_t data) = 0;

virtual void streamArtNzsTo(const String& ip, uint16_t universe15bit) = 0;
virtual void streamArtNzsTo(const String& ip, uint8_t net, uint8_t subnet, uint8_t universe) = 0;
virtual void streamArtNzsTo(const String& ip, uint8_t net, uint8_t subnet, uint8_t universe, uint8_t start_code) = 0;

// one-line artdmx sender
virtual void sendArtDmx(const String& ip, uint16_t universe15bit, const uint8_t* const data, uint16_t size) = 0;
virtual void sendArtDmx(const String& ip, uint8_t net, uint8_t subnet, uint8_t universe, const uint8_t* const data, uint16_t size) = 0;
virtual void sendArtDmx(const String& ip, uint8_t net, uint8_t subnet, uint8_t universe, uint8_t physical, const uint8_t *data, uint16_t size) = 0;

// one-line artnzs sender
virtual void sendArtNzs(const String& ip, uint16_t universe15bit, const uint8_t* const data, uint16_t size) = 0;
virtual void sendArtNzs(const String& ip, uint8_t net, uint8_t subnet, uint8_t universe, const uint8_t* const data, uint16_t size) = 0;
virtual void sendArtNzs(const String& ip, uint8_t net, uint8_t subnet, uint8_t universe, uint8_t start_code, const uint8_t *data, uint16_t size) = 0;

virtual void sendArtTrigger(const String& ip, uint16_t oem = 0, uint8_t key = 0, uint8_t subkey = 0, const uint8_t *payload = nullptr, uint16_t size = 512) = 0;

virtual void sendArtSync(const String& ip) = 0;
};

struct ISender : virtual ISender_
{
virtual ~ISender() = default;
virtual void begin(uint16_t send_port = DEFAULT_PORT) = 0;
};

} // namespace art_net

using ArtnetSenderInterface = art_net::ISender;

#endif // ARTNET_SENDER_TRAITS_H
Loading