From 1ef10a7acc7cda4e901140e043ae03c7cb910425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frakn=C3=B3i=20Tam=C3=A1s?= <fraknoitamas@gmail.com> Date: Sun, 14 Apr 2019 22:57:00 +0200 Subject: [PATCH] SpiFrame convert done --- MiniMatrixRPi/animhandler.cpp | 25 ++++++++++++------- MiniMatrixRPi/animhandler.h | 6 ++++- MiniMatrixRPi/spiframe.cpp | 46 ++++++++++++++++++++++++++++++++++- MiniMatrixRPi/spiframe.h | 5 ++++ 4 files changed, 71 insertions(+), 11 deletions(-) diff --git a/MiniMatrixRPi/animhandler.cpp b/MiniMatrixRPi/animhandler.cpp index f651258..785fb54 100644 --- a/MiniMatrixRPi/animhandler.cpp +++ b/MiniMatrixRPi/animhandler.cpp @@ -1,10 +1,8 @@ #include "animhandler.h" - - void AnimHandler::start() { - mode = START; + mode = RUN; } void AnimHandler::pause() { @@ -26,21 +24,26 @@ void AnimHandler::run() { { switch (mode) { case STOP: emit onStoped(); break; - case START: emit onStarted(); break; + case RUN: emit onStarted(); break; case PAUSE: emit onPaused(); break; } } lastmode = mode; switch (mode) { case STOP: break; - case START: - if (true) //TODO spiSender.isAvailable + case PAUSE: break; + case RUN: + if (anim.eof()) + { + mode = STOP; + break; + } + if (spisender.canSend()) { - QString faszom = anim.nextFrame(); - qDebug() << faszom; + SpiFrame spiframe(anim.nextFrame()); + spisender.sendFrame(spiframe); } break; - case PAUSE: break; } progress++; emit progressUpdate(progress); @@ -50,6 +53,10 @@ void AnimHandler::run() { emit resultReady("ALMA"); } +AnimHandler::AnimHandler() : QThread(), spisender(26) +{ +} + void AnimHandler::openFile(const QString filepath) { anim.openFile(filepath); } diff --git a/MiniMatrixRPi/animhandler.h b/MiniMatrixRPi/animhandler.h index 6034934..72fe2a8 100644 --- a/MiniMatrixRPi/animhandler.h +++ b/MiniMatrixRPi/animhandler.h @@ -5,6 +5,7 @@ #include <QDebug> #include <QFile> #include "animation.h" +#include "spisender.h" class AnimHandler: public QThread { @@ -13,11 +14,14 @@ class AnimHandler: public QThread private: uint32_t progress = 0; bool exitThread = false; - enum Mode {STOP=0, START, PAUSE} mode = STOP; + enum Mode {STOP=0, RUN, PAUSE}; + enum Mode mode = STOP; enum Mode lastmode = mode; Animation anim; + SpiSender spisender; public: + AnimHandler(); void openFile(const QString filepath); public slots: diff --git a/MiniMatrixRPi/spiframe.cpp b/MiniMatrixRPi/spiframe.cpp index 7af88b9..b108ddf 100644 --- a/MiniMatrixRPi/spiframe.cpp +++ b/MiniMatrixRPi/spiframe.cpp @@ -1,5 +1,32 @@ #include "spiframe.h" +bool SpiFrame::LedCoordToPixel(const MxFrame &mxframe, int bitpos, + int colorbit, enum Color color, int column) +{ + int y = 2*bitpos; + int x = column; + if (column >= 32) + { + x = 63 - column; + y = bitpos + 1; + } + + + if (color == RED) + { + return mxframe.pixels[x][y].red() & (1 << colorbit); + } + else if (color == GREEN) + { + return mxframe.pixels[x][y].green() & (1 << colorbit); + } + else if (color == BLUE) + { + return mxframe.pixels[x][y].blue() & (1 << colorbit); + } + return false; +} + SpiFrame::SpiFrame() { @@ -8,5 +35,22 @@ SpiFrame::SpiFrame() SpiFrame::SpiFrame(const MxFrame& mxframe) { this->length = mxframe.length; - //TODO Convert + for (int i = 0; i < 64*24; i++) { + data[i] = 0; + } + for (int column = 0; column < 64; column++) { + for (int bitpos = 0; bitpos < 13; bitpos++) { + for (int colorbit = 0; colorbit < 8; colorbit++) { + data[column * 24 + colorbit] |= + (LedCoordToPixel(mxframe, bitpos, colorbit, RED, column) ? 1 : 0) << bitpos; + data[column * 24 + colorbit + 8] |= + (LedCoordToPixel(mxframe, bitpos, colorbit, GREEN, column) ? 1 : 0) << bitpos; + data[column * 24 + colorbit + 16] |= + (LedCoordToPixel(mxframe, bitpos, colorbit, BLUE, column) ? 1 : 0) << bitpos; + } + } + } + } + + diff --git a/MiniMatrixRPi/spiframe.h b/MiniMatrixRPi/spiframe.h index 82026ae..475fd2f 100644 --- a/MiniMatrixRPi/spiframe.h +++ b/MiniMatrixRPi/spiframe.h @@ -6,6 +6,11 @@ class SpiFrame { +private: + enum Color {RED, GREEN, BLUE}; + bool LedCoordToPixel(const MxFrame &mxframe, int bitpos, int colorbit, enum Color color, int column); + bool PixelToLedCoord(int x, int y, enum Color color); + public: SpiFrame(); SpiFrame(const MxFrame& mxframe); -- GitLab