Nick Lowyck / Mbed 2 deprecated Ledcube

Dependencies:   mbed mbed-rtos

Committer:
sNICKer1103
Date:
Thu May 01 20:58:59 2014 +0000
Revision:
2:f2700008c9d9
Parent:
1:53b8c6b13010
Child:
3:da30c350c339
Refactoring part 1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sNICKer1103 0:333c9abcd919 1 #include "mbed.h"
sNICKer1103 2:f2700008c9d9 2 #include "I2CDriver.h"
sNICKer1103 2:f2700008c9d9 3 #include "SPIDriver.h"
sNICKer1103 2:f2700008c9d9 4 #include "LedCube.h"
sNICKer1103 0:333c9abcd919 5
sNICKer1103 0:333c9abcd919 6 bool printed = false;
sNICKer1103 1:53b8c6b13010 7 bool testprinted = false;
sNICKer1103 0:333c9abcd919 8 char layer = 1;
sNICKer1103 0:333c9abcd919 9 bool first = true;
sNICKer1103 0:333c9abcd919 10 int success = 1;
sNICKer1103 2:f2700008c9d9 11 char databuffer[512];
sNICKer1103 2:f2700008c9d9 12 const int spifreq = 10000000; //frequency of SPI interface
sNICKer1103 2:f2700008c9d9 13 const char address = 0xA0; //address van I2C interface
sNICKer1103 2:f2700008c9d9 14 LedCube *ledcube = new LedCube();
sNICKer1103 0:333c9abcd919 15
sNICKer1103 1:53b8c6b13010 16 int counter1 = 0;
sNICKer1103 1:53b8c6b13010 17 int counter2 = 0;
sNICKer1103 1:53b8c6b13010 18 int counter3 = 0;
sNICKer1103 0:333c9abcd919 19
sNICKer1103 1:53b8c6b13010 20 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}},
sNICKer1103 1:53b8c6b13010 21 {{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}},
sNICKer1103 1:53b8c6b13010 22 {{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}},
sNICKer1103 1:53b8c6b13010 23 {{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}},
sNICKer1103 1:53b8c6b13010 24 {{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}},
sNICKer1103 1:53b8c6b13010 25 {{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}},
sNICKer1103 1:53b8c6b13010 26 {{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}},
sNICKer1103 1:53b8c6b13010 27 {{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}}
sNICKer1103 1:53b8c6b13010 28 };
sNICKer1103 0:333c9abcd919 29
sNICKer1103 1:53b8c6b13010 30 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}},
sNICKer1103 1:53b8c6b13010 31 {{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}},
sNICKer1103 1:53b8c6b13010 32 {{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}},
sNICKer1103 1:53b8c6b13010 33 {{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}},
sNICKer1103 1:53b8c6b13010 34 {{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}},
sNICKer1103 1:53b8c6b13010 35 {{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}},
sNICKer1103 1:53b8c6b13010 36 {{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}},
sNICKer1103 1:53b8c6b13010 37 {{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}}
sNICKer1103 1:53b8c6b13010 38 };
sNICKer1103 0:333c9abcd919 39
sNICKer1103 0:333c9abcd919 40 //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)
sNICKer1103 0:333c9abcd919 41 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}},
sNICKer1103 1:53b8c6b13010 42 {{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129}},
sNICKer1103 1:53b8c6b13010 43 {{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129}},
sNICKer1103 1:53b8c6b13010 44 {{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129}},
sNICKer1103 1:53b8c6b13010 45 {{11,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,3}},
sNICKer1103 1:53b8c6b13010 46 {{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129}},
sNICKer1103 1:53b8c6b13010 47 {{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129}},
sNICKer1103 1:53b8c6b13010 48 {{129,0,0,0,0,0,0,129},{129,0,0,0,0,0,0,129},{19,0,0,0,0,0,0,17}}
sNICKer1103 1:53b8c6b13010 49 };
sNICKer1103 1:53b8c6b13010 50
sNICKer1103 1:53b8c6b13010 51 char rmatrix[8][8] = {{3,129,129,129,129,129,129,153},
sNICKer1103 1:53b8c6b13010 52 {3,129,129,129,129,129,129,153},
sNICKer1103 1:53b8c6b13010 53 {153,129,129,129,129,129,129,153},
sNICKer1103 1:53b8c6b13010 54 {153,129,129,129,129,129,129,152},
sNICKer1103 1:53b8c6b13010 55 {153,129,129,129,129,129,129,152},
sNICKer1103 1:53b8c6b13010 56 {153,129,129,129,129,129,129,153},
sNICKer1103 1:53b8c6b13010 57 {153,129,129,129,129,129,129,153},
sNICKer1103 1:53b8c6b13010 58 {153,129,129,129,129,129,129,3}
sNICKer1103 1:53b8c6b13010 59 };
sNICKer1103 1:53b8c6b13010 60
sNICKer1103 1:53b8c6b13010 61 char gmatrix[8][8] = {{25,129,129,129,129,129,129,153},
sNICKer1103 1:53b8c6b13010 62 {153,129,129,129,129,129,129,153},
sNICKer1103 1:53b8c6b13010 63 {153,129,129,129,129,129,129,153},
sNICKer1103 1:53b8c6b13010 64 {25,129,129,129,129,129,129,153},
sNICKer1103 1:53b8c6b13010 65 {25,129,129,129,3,129,129,153},
sNICKer1103 1:53b8c6b13010 66 {153,129,129,129,129,129,129,153},
sNICKer1103 1:53b8c6b13010 67 {153,129,129,129,129,129,129,153},
sNICKer1103 1:53b8c6b13010 68 {2,129,129,129,129,129,129,153}
sNICKer1103 1:53b8c6b13010 69 };
sNICKer1103 0:333c9abcd919 70
sNICKer1103 0:333c9abcd919 71 char bmatrix[8][8] = {{153,129,129,129,129,129,129,153},
sNICKer1103 1:53b8c6b13010 72 {153,129,129,129,129,129,129,153},
sNICKer1103 1:53b8c6b13010 73 {153,129,129,129,129,129,129,153},
sNICKer1103 1:53b8c6b13010 74 {153,129,129,129,129,129,129,152},
sNICKer1103 1:53b8c6b13010 75 {153,129,129,129,129,129,129,152},
sNICKer1103 1:53b8c6b13010 76 {153,129,129,129,129,129,129,153},
sNICKer1103 1:53b8c6b13010 77 {153,129,129,129,129,129,129,153},
sNICKer1103 1:53b8c6b13010 78 {153,129,129,129,129,129,129,3}
sNICKer1103 1:53b8c6b13010 79 };
sNICKer1103 0:333c9abcd919 80
sNICKer1103 2:f2700008c9d9 81 SPIDriver *spidriver = new SPIDriver(p5, NC, p7, p8, p10, spifreq);
sNICKer1103 2:f2700008c9d9 82 I2CDriver *i2cdriver = new I2CDriver(p28, p27, address);
sNICKer1103 0:333c9abcd919 83 //DigitalOut blank(p9);
sNICKer1103 0:333c9abcd919 84 Serial pc(USBTX, USBRX);
sNICKer1103 0:333c9abcd919 85
sNICKer1103 0:333c9abcd919 86 uint8_t reverse_byte(uint8_t byte);
sNICKer1103 1:53b8c6b13010 87 void initialtest();
sNICKer1103 1:53b8c6b13010 88 void sendbuffer();
sNICKer1103 1:53b8c6b13010 89 void modifybuffer();
sNICKer1103 1:53b8c6b13010 90 void torgbmatrix(const char ledm[8][8][8], char rmat[8][8], char gmat[8][8], char bmat[8][8]);
sNICKer1103 0:333c9abcd919 91
sNICKer1103 0:333c9abcd919 92 int main()
sNICKer1103 0:333c9abcd919 93 {
sNICKer1103 1:53b8c6b13010 94 for(int i = 0; i < 400; i++) {
sNICKer1103 1:53b8c6b13010 95 initialtest();
sNICKer1103 1:53b8c6b13010 96 }
sNICKer1103 0:333c9abcd919 97
sNICKer1103 0:333c9abcd919 98 while(true) {
sNICKer1103 2:f2700008c9d9 99 if (i2cdriver->receive() == I2CDriver::WriteAddressed) {
sNICKer1103 1:53b8c6b13010 100 pc.printf("Waarde ontvangen!\n\r");
sNICKer1103 1:53b8c6b13010 101 modifybuffer();
sNICKer1103 1:53b8c6b13010 102 printed = false;
sNICKer1103 0:333c9abcd919 103 }
sNICKer1103 1:53b8c6b13010 104 sendbuffer();
sNICKer1103 1:53b8c6b13010 105 }//while loop
sNICKer1103 0:333c9abcd919 106 }//end main
sNICKer1103 0:333c9abcd919 107
sNICKer1103 0:333c9abcd919 108 uint8_t reverse_byte(uint8_t byte)
sNICKer1103 0:333c9abcd919 109 {
sNICKer1103 0:333c9abcd919 110 return (__rbit(byte) >> 24) & 0xFF; // reverse a byte in a 32-bit value, and extract the byte
sNICKer1103 0:333c9abcd919 111 }
sNICKer1103 0:333c9abcd919 112
sNICKer1103 2:f2700008c9d9 113 void initialtest(){
sNICKer1103 2:f2700008c9d9 114 for(int i = 0; i < 8; i++) { //eerst laag selecteren, SPI zendt normaalgezien MSB first
sNICKer1103 2:f2700008c9d9 115 spidriver->write(ledcube->getNextValue());
sNICKer1103 2:f2700008c9d9 116 for(int j = 0; j < 24; j++) {
sNICKer1103 2:f2700008c9d9 117 spidriver->write(ledcube->getNextValue()); //ledwaarden zelf nog altijd apart, omdat ze mogelijk gespiegeld moeten doorgestuurd worden
sNICKer1103 2:f2700008c9d9 118 } //(LSB first)
sNICKer1103 2:f2700008c9d9 119 wait(0.00125); //voor 100 Hz
sNICKer1103 1:53b8c6b13010 120 //blank = 1;
sNICKer1103 2:f2700008c9d9 121 spidriver->pulseLatch();
sNICKer1103 1:53b8c6b13010 122 //blank = 0;
sNICKer1103 1:53b8c6b13010 123 }//end outer for loop
sNICKer1103 1:53b8c6b13010 124 // latch = 1;
sNICKer1103 1:53b8c6b13010 125 }
sNICKer1103 1:53b8c6b13010 126
sNICKer1103 1:53b8c6b13010 127 void sendbuffer()
sNICKer1103 1:53b8c6b13010 128 {
sNICKer1103 2:f2700008c9d9 129 for(int i = 0; i < 8; i++) { //eerst laag selecteren, SPI zendt normaalgezien MSB first
sNICKer1103 2:f2700008c9d9 130 spidriver->write(ledcube->getNextValue());
sNICKer1103 2:f2700008c9d9 131 for(int j = 0; j < 24; j++) {
sNICKer1103 2:f2700008c9d9 132 spidriver->write(ledcube->getNextValue()); //ledwaarden zelf nog altijd apart, omdat ze mogelijk gespiegeld moeten doorgestuurd worden
sNICKer1103 2:f2700008c9d9 133 } //(LSB first)
sNICKer1103 2:f2700008c9d9 134 wait(0.00125);
sNICKer1103 1:53b8c6b13010 135
sNICKer1103 1:53b8c6b13010 136 //blank = 1;
sNICKer1103 2:f2700008c9d9 137 spidriver->pulseLatch();
sNICKer1103 1:53b8c6b13010 138 //blank = 0;
sNICKer1103 1:53b8c6b13010 139
sNICKer1103 1:53b8c6b13010 140 }//end outer for loop
sNICKer1103 1:53b8c6b13010 141 // latch = 1;
sNICKer1103 1:53b8c6b13010 142 }
sNICKer1103 1:53b8c6b13010 143
sNICKer1103 1:53b8c6b13010 144 void modifybuffer()
sNICKer1103 1:53b8c6b13010 145 {
sNICKer1103 2:f2700008c9d9 146 unsigned char ledcolor;
sNICKer1103 1:53b8c6b13010 147 while(!((counter1 == 8) && (counter2 == 0) && (counter3 == 1))) {
sNICKer1103 2:f2700008c9d9 148 ledcolor = i2cdriver->read();
sNICKer1103 1:53b8c6b13010 149 if (ledcolor == 8) {
sNICKer1103 1:53b8c6b13010 150 counter1 = 0;
sNICKer1103 1:53b8c6b13010 151 counter2 = 0;
sNICKer1103 1:53b8c6b13010 152 counter3 = 0;
sNICKer1103 1:53b8c6b13010 153 } else {
sNICKer1103 1:53b8c6b13010 154 if (ledcolor == 9) {
sNICKer1103 2:f2700008c9d9 155 ledcube->setData(databuffer);
sNICKer1103 1:53b8c6b13010 156 break;
sNICKer1103 1:53b8c6b13010 157 } else {
sNICKer1103 1:53b8c6b13010 158 ledbuffer[counter1][counter2][counter3] = ledcolor;
sNICKer1103 1:53b8c6b13010 159
sNICKer1103 1:53b8c6b13010 160 if (counter3 < 7) {
sNICKer1103 1:53b8c6b13010 161 counter3++;
sNICKer1103 1:53b8c6b13010 162 } else {
sNICKer1103 1:53b8c6b13010 163 if (counter2 < 7) {
sNICKer1103 1:53b8c6b13010 164 counter2++;
sNICKer1103 1:53b8c6b13010 165 counter3 = 0;
sNICKer1103 1:53b8c6b13010 166 } else {
sNICKer1103 1:53b8c6b13010 167 if (counter1 < 7) {
sNICKer1103 1:53b8c6b13010 168 counter1++;
sNICKer1103 1:53b8c6b13010 169 counter2 = 0;
sNICKer1103 1:53b8c6b13010 170 counter3 = 0;
sNICKer1103 1:53b8c6b13010 171 }
sNICKer1103 1:53b8c6b13010 172 }
sNICKer1103 1:53b8c6b13010 173 }
sNICKer1103 1:53b8c6b13010 174 }
sNICKer1103 1:53b8c6b13010 175 }
sNICKer1103 1:53b8c6b13010 176 }
sNICKer1103 1:53b8c6b13010 177 }
sNICKer1103 1:53b8c6b13010 178
sNICKer1103 1:53b8c6b13010 179 void torgbmatrix(const char ledm[8][8][8], char rmat[8][8], char gmat[8][8], char bmat[8][8])
sNICKer1103 0:333c9abcd919 180 {
sNICKer1103 0:333c9abcd919 181 for(int i = 0; i < 8; i++) { //ledmatrix (afkomstig van raspberry pi) omzetten naar rgb matrix (voor ledcube)
sNICKer1103 0:333c9abcd919 182 for(int j = 0; j < 8; j++) {
sNICKer1103 0:333c9abcd919 183 char weight = 128;
sNICKer1103 0:333c9abcd919 184 for(int k = 0; k < 8; k++) { //bij de rmatrix, gmatrix en bmatrix op de juiste plaatsen de juiste gewichten optellen indien nodig
sNICKer1103 0:333c9abcd919 185 char digitbuffer = ledm[i][j][k]; //bv voor rmatrix alleen gewicht bij optellen indien er een 1 op de derde positie is (binair)
sNICKer1103 1:53b8c6b13010 186 if(k == 0) { //anders gezegd: als het getal in de ledmatrix groter of gelijk aan 4 is.
sNICKer1103 0:333c9abcd919 187 rmat[i][j] = 0; //initialisatie
sNICKer1103 0:333c9abcd919 188 gmat[i][j] = 0;
sNICKer1103 0:333c9abcd919 189 bmat[i][j] = 0;
sNICKer1103 0:333c9abcd919 190 }
sNICKer1103 0:333c9abcd919 191 if(digitbuffer >= 4) {
sNICKer1103 0:333c9abcd919 192 rmat[i][j] += weight;
sNICKer1103 0:333c9abcd919 193 digitbuffer = digitbuffer - 4;
sNICKer1103 0:333c9abcd919 194 }
sNICKer1103 0:333c9abcd919 195
sNICKer1103 0:333c9abcd919 196 if(digitbuffer >= 2) {
sNICKer1103 0:333c9abcd919 197 gmat[i][j] += weight;
sNICKer1103 0:333c9abcd919 198 digitbuffer = digitbuffer - 2;
sNICKer1103 0:333c9abcd919 199 }
sNICKer1103 0:333c9abcd919 200
sNICKer1103 0:333c9abcd919 201 if(digitbuffer >= 1) {
sNICKer1103 0:333c9abcd919 202 bmat[i][j] += weight;
sNICKer1103 0:333c9abcd919 203 }
sNICKer1103 0:333c9abcd919 204
sNICKer1103 0:333c9abcd919 205 weight = weight >> 1;
sNICKer1103 0:333c9abcd919 206 }
sNICKer1103 0:333c9abcd919 207 }
sNICKer1103 0:333c9abcd919 208 }
sNICKer1103 0:333c9abcd919 209 }