Skip to content
Snippets Groups Projects
Commit 3355813b authored by ftomi's avatar ftomi
Browse files

OLA receive working

parent de947f1b
No related branches found
No related tags found
No related merge requests found
CC = g++ CC = g++
# -g or nothing # -g or nothing
DEBUG = -g DEBUG =
PROJECT = minimatrixrpi PROJECT = minimatrixrpi
COMPONENTS = animation mxframe spiframe spisender e131 matrix_server COMPONENTS = animation mxframe spiframe spisender matrix_server ola_receiver
COMPONENTS_O = $(addsuffix .o,$(COMPONENTS)) COMPONENTS_O = $(addsuffix .o,$(COMPONENTS))
LIBS = -lwiringPi `pkg-config --cflags --libs libola` LIBS = -lwiringPi `pkg-config --cflags --libs libola` -lpthread
all: $(PROJECT) all: $(PROJECT)
...@@ -21,5 +21,5 @@ $(PROJECT): $(PROJECT).o $(COMPONENTS_O) ...@@ -21,5 +21,5 @@ $(PROJECT): $(PROJECT).o $(COMPONENTS_O)
chmod +x $(PROJECT) chmod +x $(PROJECT)
clean: clean:
rm -f $(PROJECT) test_server test_client *.o rm -f $(PROJECT) *.o
...@@ -4,87 +4,32 @@ ...@@ -4,87 +4,32 @@
#include "spisender.h" #include "spisender.h"
#include "color.hpp" #include "color.hpp"
#include "matrix_server.h" #include "matrix_server.h"
#include "ola_receiver.h"
#include <unistd.h> #include <unistd.h>
#include <stdio.h> #include <stdio.h>
#include <ola/DmxBuffer.h>
#include <ola/Logging.h>
#include <ola/client/ClientWrapper.h>
#include <string> #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; int main()
// // 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)
{ {
MxFrame frame; printf("Started\n");
const uint8_t* arr = data.GetRaw(); SpiSender spisender;
int k = 0; MatrixServer matrixserver;
for (size_t i = 0; i < 2; i++) 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]; spisender.updateFrame(matrixserver.getFrame());
frame.pixels[i][j].g = arr[k+1];
frame.pixels[i][j].b = arr[k+2];
k += 3;
}
} }
spisender->sendFrame(SpiFrame(frame));
} }
int main()
{
printf("Started\n");
ola::InitLogging(ola::OLA_LOG_INFO, ola::OLA_LOG_STDERR); char k;
ola::client::OlaClientWrapper wrapper; scanf("%c", &k);
if (!wrapper.Setup()) printf("Ending\n");
exit(1); ola_deinit();
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;
} }
#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);
}
#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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment