Nick Lowyck / Mbed 2 deprecated Ledcube

Dependencies:   mbed mbed-rtos

main.cpp

Committer:
sNICKer1103
Date:
2014-04-23
Revision:
0:333c9abcd919
Child:
1:53b8c6b13010

File content as of revision 0:333c9abcd919:

#include "mbed.h"

bool printed = false;
bool sent = false;
char layer = 1;
bool first = true;
int success = 1;

char ledexample[8][8][8] = {{{6,0,0,7,7,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,7,7,0,0,7}},
                            {{7,0,0,7,7,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,7,7,0,0,7}},
                            {{7,0,0,7,7,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,7,7,0,0,7}},
                            {{4,0,0,7,7,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,7,7,0,0,3}},
                            {{4,0,0,7,7,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,7,7,0,0,3}},
                            {{7,0,0,7,7,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,7,7,0,0,7}},
                            {{7,0,0,7,7,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,7,7,0,0,7}},
                            {{7,0,0,7,7,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,0,0,0,0,7},{7,0,0,7,7,0,0,5}}};

const char rsolution[8][8] = {{153,129,129,129,129,129,129,153},
                              {153,129,129,129,129,129,129,153},
                              {153,129,129,129,129,129,129,153},
                              {153,129,129,129,129,129,129,152},
                              {153,129,129,129,129,129,129,152},
                              {153,129,129,129,129,129,129,153},
                              {153,129,129,129,129,129,129,153},
                              {153,129,129,129,129,129,129,153}};

const char gsolution[8][8] = {{153,129,129,129,129,129,129,153},
                              {153,129,129,129,129,129,129,153},
                              {153,129,129,129,129,129,129,153},
                              {25,129,129,129,129,129,129,153},
                              {25,129,129,129,129,129,129,153},
                              {153,129,129,129,129,129,129,153},
                              {153,129,129,129,129,129,129,153},
                              {153,129,129,129,129,129,129,152}};

const char bsolution[8][8] = {{25,129,129,129,129,129,129,153},
                              {153,129,129,129,129,129,129,153},
                              {153,129,129,129,129,129,129,153},
                              {25,129,129,129,129,129,129,153},
                              {25,129,129,129,129,129,129,153},
                              {153,129,129,129,129,129,129,153},
                              {153,129,129,129,129,129,129,153},
                              {153,129,129,129,129,129,129,153}};

//matrix (8*8*8): top to bottom, eerst r dan g dan b dan laag (per laag, dus 33 chars)(één char:rij voor één kleur)
const char matrix[8][3][8] = {{{18,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,16}},
                              {{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129}},
                              {{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129}},
                              {{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129}},
                              {{11,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,3}},
                              {{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129}},
                              {{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129}},
                              {{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129},{19,0,0,0,0,0,0,17}}};

char rmatrix[8][8] = {{153,129,129,129,129,129,129,153},
                      {153,129,129,129,129,129,129,153},
                      {153,129,129,129,129,129,129,153},
                      {153,129,129,129,129,129,129,152},
                      {153,129,129,129,129,129,129,152},
                      {153,129,129,129,129,129,129,153},
                      {153,129,129,129,129,129,129,153},
                      {153,129,129,129,129,129,129,153}};

char gmatrix[8][8] = {{153,129,129,129,129,129,129,153},
                      {153,129,129,129,129,129,129,153},
                      {153,129,129,129,129,129,129,153},
                      {153,129,129,129,129,129,129,152},
                      {153,129,129,129,129,129,129,152},
                      {153,129,129,129,129,129,129,153},
                      {153,129,129,129,129,129,129,153},
                      {153,129,129,129,129,129,129,153}};

char bmatrix[8][8] = {{153,129,129,129,129,129,129,153},
                      {153,129,129,129,129,129,129,153},
                      {153,129,129,129,129,129,129,153},
                      {153,129,129,129,129,129,129,152},
                      {153,129,129,129,129,129,129,152},
                      {153,129,129,129,129,129,129,153},
                      {153,129,129,129,129,129,129,153},
                      {153,129,129,129,129,129,129,153}};

SPI spi(p5, NC, p7); // mosi, miso, sclk
DigitalOut latch(p8);
//DigitalOut blank(p9);
DigitalOut cs(p10);
Serial pc(USBTX, USBRX);

uint8_t reverse_byte(uint8_t byte);
void torgbmatrix(char ledm[8][8][8], char rmat[8][8], char gmat[8][8], char bmat[8][8]);

int main()
{
    /*
    torgbmatrix(ledexample, rmatrix, gmatrix, bmatrix);

    for(int i = 0; i < 8; i++){
        for(int j = 0; j < 8; j++){
            if((rmatrix[i][j] != rsolution[i][j]) || (gmatrix[i][j] != gsolution[i][j]) || (bmatrix[i][j] != bsolution[i][j])){
                success = 0;
            }
        }
    }
    while(true){}*/

    spi.format(8,3);
    spi.frequency(10000000);
    //  blank = 0;
    latch = 0;
    cs = 1;

    /* for(int i = 7; i >= 0; i--){
         for(int j = 2; j >= 0; j--){
             pc.printf("%d", matrix[i][j][k]
         }
     }*/

    while(true) {
        if(!sent) {                 //eerst laag selecteren, SPI zendt normaal gezien MSB first
            for(int i = 7; i >= 0; i--) {
                cs = 0;
                spi.write(layer);
                cs = 1;
                if(!printed) pc.printf("%d  ", layer);
                for(int j = 2; j >= 0; j--) {
                    for(int k = 7; k >= 0; k--) {
                        if (j == 2) {
                            if(!printed) pc.printf("%d ", bmatrix[i][k]);
                            cs = 0;
                            spi.write(reverse_byte(bmatrix[i][k]));
                            cs = 1;
                        }

                        if (j == 1) {
                            if(!printed) pc.printf("%d ", gmatrix[i][k]);
                            cs = 0;
                            spi.write(reverse_byte(gmatrix[i][k]));
                            cs = 1;
                        }

                        if (j == 0) {
                            if(!printed) pc.printf("%d ", rmatrix[i][k]);
                            cs = 0;
                            spi.write(reverse_byte(rmatrix[i][k]));
                            cs = 1;
                        }
                    }
                    if(!printed) pc.printf("  ");
                    if(!printed) pc.printf("\n\r");

                    wait(0.00125);    //vragen aan tommy, buffer per laag?

                    //blank = 1;
                    latch = 1;
                    latch = 0;
                    //blank = 0;

                    layer = layer << 1;
                    if(layer == 0) layer = 1;
                }
                if(!printed) pc.printf("\n\r");
                printed = true;
                sent = true;
                latch = 1;
            }//end outer for loop
        }
    }//end if send

}//end main

unsigned char reverse_bits(unsigned char b)
{
    return ((b * 0x0802LU & 0x22110LU) | (b * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16;
}

uint8_t reverse_byte(uint8_t byte)
{
    return (__rbit(byte) >> 24) & 0xFF; // reverse a byte in a 32-bit value, and extract the byte
}

void torgbmatrix(char ledm[8][8][8], char rmat[8][8], char gmat[8][8], char bmat[8][8])
{
    for(int i = 0; i < 8; i++) {                //ledmatrix (afkomstig van raspberry pi) omzetten naar rgb matrix (voor ledcube)
        for(int j = 0; j < 8; j++) {
            char weight = 128;
            for(int k = 0; k < 8; k++) {        //bij de rmatrix, gmatrix en bmatrix op de juiste plaatsen de juiste gewichten optellen indien nodig
                char digitbuffer = ledm[i][j][k];       //bv voor rmatrix alleen gewicht bij optellen indien er een 1 op de derde positie is (binair)
                if(k == 0) {                                                            //anders gezegd: als het getal in de ledmatrix groter of gelijk aan 4 is.
                    rmat[i][j] = 0; //initialisatie
                    gmat[i][j] = 0;
                    bmat[i][j] = 0;
                }
                if(digitbuffer >= 4) {
                    rmat[i][j] += weight;
                    digitbuffer = digitbuffer - 4;
                }

                if(digitbuffer >= 2) {
                    gmat[i][j] += weight;
                    digitbuffer = digitbuffer - 2;
                }

                if(digitbuffer >= 1) {
                    bmat[i][j] += weight;
                }

                weight = weight >> 1;
            }
        }
    }
}