From 3355813b97281721fba243f4b6d74c22a6f7ea49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frakn=C3=B3i=20Tam=C3=A1s?= <fraknoitamas@gmail.com> Date: Sat, 12 Jun 2021 21:03:30 +0200 Subject: [PATCH] OLA receive working --- test_anim/Makefile | 8 ++-- test_anim/minimatrixrpi.cpp | 87 +++++++------------------------------ test_anim/ola_receiver.cpp | 84 +++++++++++++++++++++++++++++++++++ test_anim/ola_receiver.h | 10 +++++ 4 files changed, 114 insertions(+), 75 deletions(-) create mode 100644 test_anim/ola_receiver.cpp create mode 100644 test_anim/ola_receiver.h diff --git a/test_anim/Makefile b/test_anim/Makefile index 61acf87..e58b6db 100644 --- a/test_anim/Makefile +++ b/test_anim/Makefile @@ -1,12 +1,12 @@ CC = g++ # -g or nothing -DEBUG = -g +DEBUG = PROJECT = minimatrixrpi -COMPONENTS = animation mxframe spiframe spisender e131 matrix_server +COMPONENTS = animation mxframe spiframe spisender matrix_server ola_receiver COMPONENTS_O = $(addsuffix .o,$(COMPONENTS)) -LIBS = -lwiringPi `pkg-config --cflags --libs libola` +LIBS = -lwiringPi `pkg-config --cflags --libs libola` -lpthread all: $(PROJECT) @@ -21,5 +21,5 @@ $(PROJECT): $(PROJECT).o $(COMPONENTS_O) chmod +x $(PROJECT) clean: - rm -f $(PROJECT) test_server test_client *.o + rm -f $(PROJECT) *.o diff --git a/test_anim/minimatrixrpi.cpp b/test_anim/minimatrixrpi.cpp index 5a51fad..005c7e3 100644 --- a/test_anim/minimatrixrpi.cpp +++ b/test_anim/minimatrixrpi.cpp @@ -4,87 +4,32 @@ #include "spisender.h" #include "color.hpp" #include "matrix_server.h" +#include "ola_receiver.h" #include <unistd.h> #include <stdio.h> -#include <ola/DmxBuffer.h> -#include <ola/Logging.h> -#include <ola/client/ClientWrapper.h> #include <string> -// int main(int argc, char *argv[]) -// { -// MatrixServer server; -// SpiSender spisender; -// printf("Started\n"); -// while (1) -// { -// if (server.receive()) -// { -// spisender.sendFrame(SpiFrame(server.getFrame())); -// } -// } - -// // Animation anim; -// // anim.openFile("bss.qp4"); -// // MxFrame frame; -// // SpiSender spisender; -// // while (!anim.eof()) -// // { -// // frame = anim.nextFrame(); -// // spisender.sendFrame(SpiFrame(frame)); -// // usleep(1000*frame.length); -// // } -// // spisender.sendFrame(SpiFrame(MxFrame())); -// return 0; -// } - -//MatrixServer server; -SpiSender* spisender = new SpiSender(); -static const unsigned int UNIVERSE = 0; -// Called when universe registration completes. -void RegisterComplete(const ola::client::Result &result) -{ - if (!result.Success()) - { - OLA_WARN << "Failed to register universe: " << result.Error(); - } -} -// Called when new DMX data arrives. -void NewDmx(const ola::client::DMXMetadata &metadata, - const ola::DmxBuffer &data) +int main() { - MxFrame frame; - const uint8_t* arr = data.GetRaw(); - int k = 0; - for (size_t i = 0; i < 2; i++) + printf("Started\n"); + SpiSender spisender; + MatrixServer matrixserver; + ola_init(&spisender); + printf("Going idle\n"); + while (1) { - for (size_t j = 0; j < 32; j++) + ola_run_once(); + if (matrixserver.receive()) { - frame.pixels[i][j].r = arr[k]; - frame.pixels[i][j].g = arr[k+1]; - frame.pixels[i][j].b = arr[k+2]; - k += 3; + spisender.updateFrame(matrixserver.getFrame()); } } - spisender->sendFrame(SpiFrame(frame)); -} - -int main() -{ + - printf("Started\n"); - ola::InitLogging(ola::OLA_LOG_INFO, ola::OLA_LOG_STDERR); - ola::client::OlaClientWrapper wrapper; - if (!wrapper.Setup()) - exit(1); - ola::client::OlaClient *client = wrapper.GetClient(); - // Set the callback and register our interest in this universe - client->SetDMXCallback(ola::NewCallback(&NewDmx)); - client->RegisterUniverse( - UNIVERSE, ola::client::REGISTER, - ola::NewSingleCallback(&RegisterComplete)); - wrapper.GetSelectServer()->Run(); - delete spisender; + char k; + scanf("%c", &k); + printf("Ending\n"); + ola_deinit(); } diff --git a/test_anim/ola_receiver.cpp b/test_anim/ola_receiver.cpp new file mode 100644 index 0000000..9c88eb2 --- /dev/null +++ b/test_anim/ola_receiver.cpp @@ -0,0 +1,84 @@ +#include "ola_receiver.h" +#include <ola/DmxBuffer.h> +#include <ola/Logging.h> +#include <ola/client/ClientWrapper.h> +#include "spisender.h" + +// Important to go from zero. +// Else modify the NewDmx callback +static unsigned int universes[6] = {0, 1, 2, 3, 4, 5}; +// The 'n'th universe goes from (rows[n]) to (rows[n+1]-1) inclusive +static int universe_rows[7] = {0, 5, 10, 15, 20, 25, 26}; + +static void RegisterComplete(const ola::client::Result &result); +static void NewDmx(const ola::client::DMXMetadata &metadata, + const ola::DmxBuffer &data); + +static SpiSender* spisender = NULL; + +static ola::client::OlaClientWrapper* wrapper = NULL; + + +void ola_init(SpiSender* sender) +{ + if (wrapper != NULL) return; + spisender = sender; + ola::InitLogging(ola::OLA_LOG_INFO, ola::OLA_LOG_STDERR); + wrapper = new ola::client::OlaClientWrapper(); + if (!wrapper->Setup()) + exit(1); + ola::client::OlaClient *client = wrapper->GetClient(); + // Set the callback and register our interest in this universe + client->SetDMXCallback(ola::NewCallback(&NewDmx)); + for (size_t i = 0; i < 6; i++) + { + client->RegisterUniverse(universes[i], ola::client::REGISTER, + ola::NewSingleCallback(&RegisterComplete)); + } + + //wrapper.GetSelectServer()->Run(); +} + +void ola_run_once() +{ + wrapper->GetSelectServer()->RunOnce(); +} + +void ola_deinit() +{ + delete wrapper; + wrapper = NULL; +} + +// Called when universe registration completes. +static void RegisterComplete(const ola::client::Result &result) +{ + if (!result.Success()) + { + OLA_WARN << "Failed to register universe: " << result.Error(); + } + printf("RegisterComplete\n"); +} +// Called when new DMX data arrives. +static void NewDmx(const ola::client::DMXMetadata &metadata, + const ola::DmxBuffer &data) +{ + MxFrame frame; + if (metadata.universe > 5) return; + //printf("New Frame on universe %d\n", metadata.universe); + int startY = universe_rows[metadata.universe]; + int endY = universe_rows[metadata.universe+1]-1; + const uint8_t* arr = data.GetRaw(); + int k = 0; + for (size_t y = startY; y <= endY; y++) + { + for (size_t x = 0; x < 32; x++) + { + frame.pixels[y][x].r = arr[k]; + frame.pixels[y][x].g = arr[k+1]; + frame.pixels[y][x].b = arr[k+2]; + k += 3; + } + } + spisender->updateFrame(frame, startY, endY); +} diff --git a/test_anim/ola_receiver.h b/test_anim/ola_receiver.h new file mode 100644 index 0000000..b26d7b8 --- /dev/null +++ b/test_anim/ola_receiver.h @@ -0,0 +1,10 @@ +#ifndef OLA_RECEIVER_H +#define OLA_RECEIVER_H + +#include "spisender.h" + +void ola_init(SpiSender* sender); +void ola_run_once(); +void ola_deinit(); + +#endif // OLA_RECEIVER_H -- GitLab