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