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