Nick Lowyck / Mbed 2 deprecated Ledcube

Dependencies:   mbed mbed-rtos

main.cpp

Committer:
sNICKer1103
Date:
2014-05-01
Revision:
2:f2700008c9d9
Parent:
1:53b8c6b13010
Child:
3:da30c350c339

File content as of revision 2:f2700008c9d9:

#include "mbed.h"
#include "I2CDriver.h"
#include "SPIDriver.h"
#include "LedCube.h"

bool printed = false;
bool testprinted = false;
char layer = 1;
bool first = true;
int success = 1;
char databuffer[512];
const int spifreq = 10000000; //frequency of SPI interface
const char address = 0xA0; //address van I2C interface
LedCube *ledcube = new LedCube();

int counter1 = 0;
int counter2 = 0;
int counter3 = 0;

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}}
};

char ledbuffer[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}}
};

//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] = {{3,129,129,129,129,129,129,153},
    {3,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,3}
};

char gmatrix[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,3,129,129,153},
    {153,129,129,129,129,129,129,153},
    {153,129,129,129,129,129,129,153},
    {2,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,3}
};

SPIDriver *spidriver = new SPIDriver(p5, NC, p7, p8, p10, spifreq);
I2CDriver *i2cdriver = new I2CDriver(p28, p27, address);
//DigitalOut blank(p9);
Serial pc(USBTX, USBRX);

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

int main()
{
    for(int i = 0; i < 400; i++) {
        initialtest();
    }

    while(true) {
        if (i2cdriver->receive() == I2CDriver::WriteAddressed) {
            pc.printf("Waarde ontvangen!\n\r");
            modifybuffer();
            printed = false;
        }
        sendbuffer();
    }//while loop
}//end main

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 initialtest(){
    for(int i = 0; i < 8; i++) {   //eerst laag selecteren, SPI zendt normaalgezien MSB first
        spidriver->write(ledcube->getNextValue());
        for(int j = 0; j < 24; j++) {
            spidriver->write(ledcube->getNextValue());  //ledwaarden zelf nog altijd apart, omdat ze mogelijk gespiegeld moeten doorgestuurd worden
        }                                               //(LSB first)
        wait(0.00125);    //voor 100 Hz
        //blank = 1;
        spidriver->pulseLatch();
        //blank = 0;
    }//end outer for loop
    //  latch = 1;
}

void sendbuffer()
{
    for(int i = 0; i < 8; i++) {   //eerst laag selecteren, SPI zendt normaalgezien MSB first
        spidriver->write(ledcube->getNextValue());
        for(int j = 0; j < 24; j++) {
            spidriver->write(ledcube->getNextValue());  //ledwaarden zelf nog altijd apart, omdat ze mogelijk gespiegeld moeten doorgestuurd worden
        }                                               //(LSB first)
        wait(0.00125);    

        //blank = 1;
        spidriver->pulseLatch();
        //blank = 0;

    }//end outer for loop
    //  latch = 1;
}

void modifybuffer()
{
    unsigned char ledcolor;
    while(!((counter1 == 8) && (counter2 == 0) && (counter3 == 1))) {
        ledcolor = i2cdriver->read();
        if (ledcolor == 8) {
            counter1 = 0;
            counter2 = 0;
            counter3 = 0;
        } else {
            if (ledcolor == 9) {
                ledcube->setData(databuffer);
                break;
            } else {
                ledbuffer[counter1][counter2][counter3] = ledcolor;

                if (counter3 < 7) {
                    counter3++;
                } else {
                    if (counter2 < 7) {
                        counter2++;
                        counter3 = 0;
                    } else {
                        if (counter1 < 7) {
                            counter1++;
                            counter2 = 0;
                            counter3 = 0;
                        }
                    }
                }
            }
        }
    }
}

void torgbmatrix(const 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;
            }
        }
    }
}