Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Cube/LedCube.cpp@3:da30c350c339, 2014-05-02 (annotated)
- Committer:
- sNICKer1103
- Date:
- Fri May 02 18:26:40 2014 +0000
- Revision:
- 3:da30c350c339
- Parent:
- 2:f2700008c9d9
- Child:
- 4:a091b8f8216d
Refactoring part 2
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| sNICKer1103 | 2:f2700008c9d9 | 1 | #include "LedCube.h" |
| sNICKer1103 | 2:f2700008c9d9 | 2 | |
| sNICKer1103 | 2:f2700008c9d9 | 3 | LedCube::LedCube(){ |
| sNICKer1103 | 2:f2700008c9d9 | 4 | //construct needed arrays to store the output values |
| sNICKer1103 | 2:f2700008c9d9 | 5 | status = address; |
| sNICKer1103 | 2:f2700008c9d9 | 6 | |
| sNICKer1103 | 2:f2700008c9d9 | 7 | layer_current=0; |
| sNICKer1103 | 2:f2700008c9d9 | 8 | rank_current=0; |
| sNICKer1103 | 2:f2700008c9d9 | 9 | layer_oneHot=1; |
| sNICKer1103 | 2:f2700008c9d9 | 10 | } |
| sNICKer1103 | 3:da30c350c339 | 11 | |
| sNICKer1103 | 3:da30c350c339 | 12 | LedCube::~LedCube(){ |
| sNICKer1103 | 3:da30c350c339 | 13 | } |
| sNICKer1103 | 3:da30c350c339 | 14 | |
| sNICKer1103 | 2:f2700008c9d9 | 15 | //return the next byte of data to send |
| sNICKer1103 | 2:f2700008c9d9 | 16 | char LedCube::getNextValue(){ |
| sNICKer1103 | 2:f2700008c9d9 | 17 | |
| sNICKer1103 | 3:da30c350c339 | 18 | char bytevalue; |
| sNICKer1103 | 2:f2700008c9d9 | 19 | switch(status){ |
| sNICKer1103 | 2:f2700008c9d9 | 20 | case address : |
| sNICKer1103 | 3:da30c350c339 | 21 | bytevalue = layer_oneHot; |
| sNICKer1103 | 2:f2700008c9d9 | 22 | status=red; // next time give red color |
| sNICKer1103 | 2:f2700008c9d9 | 23 | break; |
| sNICKer1103 | 2:f2700008c9d9 | 24 | case red : |
| sNICKer1103 | 3:da30c350c339 | 25 | bytevalue = rValues[layer_current][rank_current];//return red value |
| sNICKer1103 | 2:f2700008c9d9 | 26 | if(rank_current!=7)rank_current++; |
| sNICKer1103 | 2:f2700008c9d9 | 27 | else { |
| sNICKer1103 | 2:f2700008c9d9 | 28 | status = green; // next time give green color |
| sNICKer1103 | 2:f2700008c9d9 | 29 | rank_current =0; //put the rank back on zero |
| sNICKer1103 | 2:f2700008c9d9 | 30 | } |
| sNICKer1103 | 2:f2700008c9d9 | 31 | break; |
| sNICKer1103 | 2:f2700008c9d9 | 32 | case green : |
| sNICKer1103 | 3:da30c350c339 | 33 | bytevalue = gValues[layer_current][rank_current];//return green value |
| sNICKer1103 | 2:f2700008c9d9 | 34 | if(rank_current!=7)rank_current++; |
| sNICKer1103 | 2:f2700008c9d9 | 35 | else { |
| sNICKer1103 | 2:f2700008c9d9 | 36 | status = blue; // next time give blue color |
| sNICKer1103 | 2:f2700008c9d9 | 37 | rank_current =0; //put the rank back on zero |
| sNICKer1103 | 2:f2700008c9d9 | 38 | } |
| sNICKer1103 | 2:f2700008c9d9 | 39 | break; |
| sNICKer1103 | 2:f2700008c9d9 | 40 | case blue : |
| sNICKer1103 | 3:da30c350c339 | 41 | bytevalue = bValues[layer_current][rank_current];//return blue value |
| sNICKer1103 | 2:f2700008c9d9 | 42 | if(rank_current!=7)rank_current++; |
| sNICKer1103 | 2:f2700008c9d9 | 43 | else { |
| sNICKer1103 | 2:f2700008c9d9 | 44 | status = address; // next time give address color |
| sNICKer1103 | 2:f2700008c9d9 | 45 | rank_current =0; //put the rank back on zero |
| sNICKer1103 | 2:f2700008c9d9 | 46 | layer_oneHot = layer_oneHot << 1; |
| sNICKer1103 | 2:f2700008c9d9 | 47 | if(layer_current!=7)layer_current++; |
| sNICKer1103 | 2:f2700008c9d9 | 48 | else layer_current=0; |
| sNICKer1103 | 2:f2700008c9d9 | 49 | if(layer_oneHot == 0) layer_oneHot = 1; |
| sNICKer1103 | 2:f2700008c9d9 | 50 | } |
| sNICKer1103 | 2:f2700008c9d9 | 51 | break; |
| sNICKer1103 | 2:f2700008c9d9 | 52 | } |
| sNICKer1103 | 3:da30c350c339 | 53 | return bytevalue; |
| sNICKer1103 | 2:f2700008c9d9 | 54 | } |
| sNICKer1103 | 2:f2700008c9d9 | 55 | //setData set the arrays to the new frame |
| sNICKer1103 | 2:f2700008c9d9 | 56 | void LedCube::setData(char* data){ |
| sNICKer1103 | 3:da30c350c339 | 57 | printf("Converting following data: \n\r"); |
| sNICKer1103 | 3:da30c350c339 | 58 | for(int i = 0; i < 512; i++) printf("%d ", data[i]); |
| sNICKer1103 | 3:da30c350c339 | 59 | printf("\n\r\n\r"); |
| sNICKer1103 | 3:da30c350c339 | 60 | |
| sNICKer1103 | 2:f2700008c9d9 | 61 | //convert raw data to rgb values |
| sNICKer1103 | 2:f2700008c9d9 | 62 | for(int i = 0; i < 8; i++) { //char array (afkomstig van raspberry pi) omzetten naar rgb matrix (voor ledcube) |
| sNICKer1103 | 2:f2700008c9d9 | 63 | int z = i * 64; // a layer is 64 byte |
| sNICKer1103 | 2:f2700008c9d9 | 64 | for(int j = 0; j < 8; j++) { |
| sNICKer1103 | 2:f2700008c9d9 | 65 | int y = j * 8; //a row is 8 elements |
| sNICKer1103 | 2:f2700008c9d9 | 66 | char weight = 128; |
| sNICKer1103 | 2:f2700008c9d9 | 67 | for(int k = 0; k < 8; k++) { //iterate for each element |
| sNICKer1103 | 2:f2700008c9d9 | 68 | char digitbuffer = data[z+y+k]; //read byte consisting of color 1 led |
| sNICKer1103 | 2:f2700008c9d9 | 69 | //now select the right color |
| sNICKer1103 | 2:f2700008c9d9 | 70 | if(k == 0) { |
| sNICKer1103 | 2:f2700008c9d9 | 71 | rValues[i][j] = 0; |
| sNICKer1103 | 2:f2700008c9d9 | 72 | gValues[i][j] = 0; |
| sNICKer1103 | 2:f2700008c9d9 | 73 | bValues[i][j] = 0; |
| sNICKer1103 | 2:f2700008c9d9 | 74 | } |
| sNICKer1103 | 2:f2700008c9d9 | 75 | if(digitbuffer >= 4) { |
| sNICKer1103 | 2:f2700008c9d9 | 76 | rValues[i][j] += weight; |
| sNICKer1103 | 2:f2700008c9d9 | 77 | digitbuffer = digitbuffer - 4; |
| sNICKer1103 | 2:f2700008c9d9 | 78 | } |
| sNICKer1103 | 2:f2700008c9d9 | 79 | if(digitbuffer >= 2) { |
| sNICKer1103 | 2:f2700008c9d9 | 80 | gValues[i][j] += weight; |
| sNICKer1103 | 2:f2700008c9d9 | 81 | digitbuffer = digitbuffer - 2; |
| sNICKer1103 | 2:f2700008c9d9 | 82 | } |
| sNICKer1103 | 2:f2700008c9d9 | 83 | if(digitbuffer >= 1) { |
| sNICKer1103 | 2:f2700008c9d9 | 84 | bValues[i][j] += weight; |
| sNICKer1103 | 2:f2700008c9d9 | 85 | } |
| sNICKer1103 | 2:f2700008c9d9 | 86 | weight = weight >> 1; |
| sNICKer1103 | 2:f2700008c9d9 | 87 | } |
| sNICKer1103 | 2:f2700008c9d9 | 88 | } |
| sNICKer1103 | 2:f2700008c9d9 | 89 | } |
| sNICKer1103 | 3:da30c350c339 | 90 | printf("Result: \n\r"); |
| sNICKer1103 | 3:da30c350c339 | 91 | printAll(); |
| sNICKer1103 | 3:da30c350c339 | 92 | printf("Conversion terminated\n\r"); |
| sNICKer1103 | 3:da30c350c339 | 93 | } |
| sNICKer1103 | 3:da30c350c339 | 94 | |
| sNICKer1103 | 3:da30c350c339 | 95 | void LedCube::testMode(TestConfig testconfig){ |
| sNICKer1103 | 3:da30c350c339 | 96 | char leddata[512]; |
| sNICKer1103 | 3:da30c350c339 | 97 | switch(testconfig){ |
| sNICKer1103 | 3:da30c350c339 | 98 | case LedCube::firsthalfwhite : |
| sNICKer1103 | 3:da30c350c339 | 99 | for(int i = 0; i < 256; i++) leddata[i] = 7; |
| sNICKer1103 | 3:da30c350c339 | 100 | for(int i = 256; i < 512; i++) leddata[i] = 0; |
| sNICKer1103 | 3:da30c350c339 | 101 | break; |
| sNICKer1103 | 3:da30c350c339 | 102 | case LedCube::secondhalfwhite : |
| sNICKer1103 | 3:da30c350c339 | 103 | for(int i = 0; i < 256; i++) leddata[i] = 0; |
| sNICKer1103 | 3:da30c350c339 | 104 | for(int i = 256; i < 512; i++) leddata[i] = 7; |
| sNICKer1103 | 3:da30c350c339 | 105 | break; |
| sNICKer1103 | 3:da30c350c339 | 106 | } |
| sNICKer1103 | 3:da30c350c339 | 107 | setData(leddata); |
| sNICKer1103 | 2:f2700008c9d9 | 108 | } |
| sNICKer1103 | 2:f2700008c9d9 | 109 | |
| sNICKer1103 | 3:da30c350c339 | 110 | void LedCube::printrValues(){ |
| sNICKer1103 | 3:da30c350c339 | 111 | for(int i = 0; i < 8; i ++){ |
| sNICKer1103 | 3:da30c350c339 | 112 | for(int j = 0; j < 8; j++){ |
| sNICKer1103 | 3:da30c350c339 | 113 | printf("%d ", rValues[i][j]); |
| sNICKer1103 | 3:da30c350c339 | 114 | } |
| sNICKer1103 | 3:da30c350c339 | 115 | printf("\n\r"); |
| sNICKer1103 | 3:da30c350c339 | 116 | } |
| sNICKer1103 | 3:da30c350c339 | 117 | } |
| sNICKer1103 | 3:da30c350c339 | 118 | |
| sNICKer1103 | 3:da30c350c339 | 119 | void LedCube::printgValues(){ |
| sNICKer1103 | 3:da30c350c339 | 120 | for(int i = 0; i < 8; i ++){ |
| sNICKer1103 | 3:da30c350c339 | 121 | for(int j = 0; j < 8; j++){ |
| sNICKer1103 | 3:da30c350c339 | 122 | printf("%d ", gValues[i][j]); |
| sNICKer1103 | 3:da30c350c339 | 123 | } |
| sNICKer1103 | 3:da30c350c339 | 124 | printf("\n\r"); |
| sNICKer1103 | 3:da30c350c339 | 125 | } |
| sNICKer1103 | 2:f2700008c9d9 | 126 | } |
| sNICKer1103 | 2:f2700008c9d9 | 127 | |
| sNICKer1103 | 3:da30c350c339 | 128 | void LedCube::printbValues(){ |
| sNICKer1103 | 3:da30c350c339 | 129 | for(int i = 0; i < 8; i ++){ |
| sNICKer1103 | 3:da30c350c339 | 130 | for(int j = 0; j < 8; j++){ |
| sNICKer1103 | 3:da30c350c339 | 131 | printf("%d ", bValues[i][j]); |
| sNICKer1103 | 3:da30c350c339 | 132 | } |
| sNICKer1103 | 3:da30c350c339 | 133 | printf("\n\r"); |
| sNICKer1103 | 3:da30c350c339 | 134 | } |
| sNICKer1103 | 3:da30c350c339 | 135 | } |
| sNICKer1103 | 3:da30c350c339 | 136 | |
| sNICKer1103 | 3:da30c350c339 | 137 | void LedCube::printAll(){ |
| sNICKer1103 | 3:da30c350c339 | 138 | printf("Red Matrix: \n\r"); |
| sNICKer1103 | 3:da30c350c339 | 139 | printrValues(); |
| sNICKer1103 | 3:da30c350c339 | 140 | printf("\n\rGreen Matrix: \n\r"); |
| sNICKer1103 | 3:da30c350c339 | 141 | printgValues(); |
| sNICKer1103 | 3:da30c350c339 | 142 | printf("\n\rBlue Matrix: \n\r"); |
| sNICKer1103 | 3:da30c350c339 | 143 | printbValues(); |
| sNICKer1103 | 3:da30c350c339 | 144 | } |