Nick Lowyck / Mbed 2 deprecated Ledcube

Dependencies:   mbed mbed-rtos

Revision:
2:f2700008c9d9
Parent:
1:53b8c6b13010
Child:
3:da30c350c339
--- a/main.cpp	Wed Apr 30 11:49:26 2014 +0000
+++ b/main.cpp	Thu May 01 20:58:59 2014 +0000
@@ -1,10 +1,17 @@
 #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;
@@ -41,36 +48,6 @@
     {{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 testrmatrix[8][8] = {{255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255}
-};
-
-char testgmatrix[8][8] = {{255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255}
-};
-
-char testbmatrix[8][8] = {{255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255},
-    {255,255,255,255,255,255,255,255}
-};
-
 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},
@@ -101,11 +78,9 @@
     {153,129,129,129,129,129,129,3}
 };
 
-SPI spi(p5, NC, p7); // mosi, miso, sclk
-I2CSlave slave(p28, p27); //sda, scl
-DigitalOut latch(p8);
+SPIDriver *spidriver = new SPIDriver(p5, NC, p7, p8, p10, spifreq);
+I2CDriver *i2cdriver = new I2CDriver(p28, p27, address);
 //DigitalOut blank(p9);
-DigitalOut cs(p10);
 Serial pc(USBTX, USBRX);
 
 uint8_t reverse_byte(uint8_t byte);
@@ -116,19 +91,12 @@
 
 int main()
 {
-    spi.format(8,3);
-    spi.frequency(10000000);
-    slave.address(0xA0);        //bevestigen!
-    //  blank = 0;
-    latch = 0;
-    cs = 1;
-
     for(int i = 0; i < 400; i++) {
         initialtest();
     }
 
     while(true) {
-        if (slave.receive() == I2CSlave::WriteAddressed) {
+        if (i2cdriver->receive() == I2CDriver::WriteAddressed) {
             pc.printf("Waarde ontvangen!\n\r");
             modifybuffer();
             printed = false;
@@ -137,131 +105,54 @@
     }//while loop
 }//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 initialtest()
-{
-    for(int i = 7; i >= 0; i--) {   //eerst laag selecteren, SPI zendt normaalgezien MSB first
-        cs = 0;
-        spi.write(layer);
-        cs = 1;
-        if(!testprinted) pc.printf("%d  ", layer);
-        for(int j = 2; j >= 0; j--) {
-            for(int k = 7; k >= 0; k--) {
-                if (j == 2) {
-                    if(!testprinted) pc.printf("%d ", testbmatrix[i][k]);
-                    cs = 0;
-                    spi.write(reverse_byte(testbmatrix[i][k]));
-                    cs = 1;
-                }
-
-                if (j == 1) {
-                    if(!testprinted) pc.printf("%d ", testgmatrix[i][k]);
-                    cs = 0;
-                    spi.write(reverse_byte(gmatrix[i][k]));
-                    cs = 1;
-                }
-
-                if (j == 0) {
-                    if(!testprinted) pc.printf("%d ", testrmatrix[i][k]);
-                    cs = 0;
-                    spi.write(reverse_byte(testrmatrix[i][k]));
-                    cs = 1;
-                }
-            }
-            if(!testprinted) pc.printf("  ");
-            if(!testprinted) pc.printf("\n\r");
-
-        }
-        if(!testprinted) pc.printf("\n\r");
-        wait(0.00125);    //vragen aan tommy, buffer per laag?
-
+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;
-        latch = 1;
-        latch = 0;
+        spidriver->pulseLatch();
         //blank = 0;
-
-        layer = layer << 1;
-        if(layer == 0) layer = 1;
-
     }//end outer for loop
     //  latch = 1;
-    if(!testprinted) pc.printf("\n\r");
-    testprinted = true;
-
 }
 
 void sendbuffer()
 {
-    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");
-
-        }
-        if(!printed) pc.printf("\n\r");
-        wait(0.00125);    //vragen aan tommy, buffer per laag?
+    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;
-        latch = 1;
-        latch = 0;
+        spidriver->pulseLatch();
         //blank = 0;
 
-        layer = layer << 1;
-        if(layer == 0) layer = 1;
-
     }//end outer for loop
     //  latch = 1;
-    if(!printed) pc.printf("\n\r");
-    printed = true;
 }
 
 void modifybuffer()
 {
-    char ledcolor;
+    unsigned char ledcolor;
     while(!((counter1 == 8) && (counter2 == 0) && (counter3 == 1))) {
-        ledcolor = slave.read();
+        ledcolor = i2cdriver->read();
         if (ledcolor == 8) {
             counter1 = 0;
             counter2 = 0;
             counter3 = 0;
         } else {
             if (ledcolor == 9) {
-                torgbmatrix(ledbuffer, rmatrix, gmatrix, bmatrix);
+                ledcube->setData(databuffer);
                 break;
             } else {
                 ledbuffer[counter1][counter2][counter3] = ledcolor;