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@5:e4ed6c5baf89, 2014-05-08 (annotated)
- Committer:
- sNICKer1103
- Date:
- Thu May 08 18:59:52 2014 +0000
- Revision:
- 5:e4ed6c5baf89
- Parent:
- 4:a091b8f8216d
ter
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 | 5:e4ed6c5baf89 | 6 | x_current=0; |
| sNICKer1103 | 5:e4ed6c5baf89 | 7 | y_current=0; |
| sNICKer1103 | 5:e4ed6c5baf89 | 8 | z_current=0; |
| sNICKer1103 | 2:f2700008c9d9 | 9 | |
| sNICKer1103 | 2:f2700008c9d9 | 10 | layer_current=0; |
| sNICKer1103 | 5:e4ed6c5baf89 | 11 | layer_oneHot= 1; |
| sNICKer1103 | 5:e4ed6c5baf89 | 12 | rank_current = 0; |
| sNICKer1103 | 3:da30c350c339 | 13 | } |
| sNICKer1103 | 2:f2700008c9d9 | 14 | //return the next byte of data to send |
| sNICKer1103 | 5:e4ed6c5baf89 | 15 | unsigned char LedCube::getNextValue(){ |
| sNICKer1103 | 5:e4ed6c5baf89 | 16 | unsigned char output; |
| sNICKer1103 | 2:f2700008c9d9 | 17 | switch(status){ |
| sNICKer1103 | 2:f2700008c9d9 | 18 | case address : |
| sNICKer1103 | 5:e4ed6c5baf89 | 19 | status=red; |
| sNICKer1103 | 5:e4ed6c5baf89 | 20 | output = layer_oneHot; |
| sNICKer1103 | 2:f2700008c9d9 | 21 | break; |
| sNICKer1103 | 2:f2700008c9d9 | 22 | case red : |
| sNICKer1103 | 5:e4ed6c5baf89 | 23 | output = rValues[layer_current][rank_current];//return red value |
| sNICKer1103 | 2:f2700008c9d9 | 24 | if(rank_current!=7)rank_current++; |
| sNICKer1103 | 2:f2700008c9d9 | 25 | else { |
| sNICKer1103 | 5:e4ed6c5baf89 | 26 | status = green; // next time give red color |
| sNICKer1103 | 2:f2700008c9d9 | 27 | rank_current =0; //put the rank back on zero |
| sNICKer1103 | 2:f2700008c9d9 | 28 | } |
| sNICKer1103 | 2:f2700008c9d9 | 29 | break; |
| sNICKer1103 | 2:f2700008c9d9 | 30 | case green : |
| sNICKer1103 | 5:e4ed6c5baf89 | 31 | output = gValues[layer_current][rank_current];//return green value |
| sNICKer1103 | 2:f2700008c9d9 | 32 | if(rank_current!=7)rank_current++; |
| sNICKer1103 | 2:f2700008c9d9 | 33 | else { |
| sNICKer1103 | 5:e4ed6c5baf89 | 34 | status = blue; // next time give green color |
| sNICKer1103 | 2:f2700008c9d9 | 35 | rank_current =0; //put the rank back on zero |
| sNICKer1103 | 2:f2700008c9d9 | 36 | } |
| sNICKer1103 | 2:f2700008c9d9 | 37 | break; |
| sNICKer1103 | 2:f2700008c9d9 | 38 | case blue : |
| sNICKer1103 | 5:e4ed6c5baf89 | 39 | output = bValues[layer_current][rank_current];//return blue value |
| sNICKer1103 | 5:e4ed6c5baf89 | 40 | if (rank_current != 7){ |
| sNICKer1103 | 5:e4ed6c5baf89 | 41 | rank_current++; //increase the rank |
| sNICKer1103 | 5:e4ed6c5baf89 | 42 | } |
| sNICKer1103 | 2:f2700008c9d9 | 43 | else { |
| sNICKer1103 | 2:f2700008c9d9 | 44 | layer_oneHot = layer_oneHot << 1; |
| sNICKer1103 | 5:e4ed6c5baf89 | 45 | if(layer_oneHot == 0) layer_oneHot = 1; //get the new address |
| sNICKer1103 | 5:e4ed6c5baf89 | 46 | status = address; // next time give blue color |
| sNICKer1103 | 5:e4ed6c5baf89 | 47 | rank_current =0; //put the rank back on zero for the next layer |
| sNICKer1103 | 5:e4ed6c5baf89 | 48 | if(layer_current!=7) layer_current++; else layer_current = 0; //if its not the last layer increase it |
| sNICKer1103 | 2:f2700008c9d9 | 49 | } |
| sNICKer1103 | 2:f2700008c9d9 | 50 | break; |
| sNICKer1103 | 2:f2700008c9d9 | 51 | } |
| sNICKer1103 | 5:e4ed6c5baf89 | 52 | return output; |
| sNICKer1103 | 2:f2700008c9d9 | 53 | } |
| sNICKer1103 | 2:f2700008c9d9 | 54 | //setData set the arrays to the new frame |
| sNICKer1103 | 5:e4ed6c5baf89 | 55 | void LedCube::setData(unsigned char* data){ |
| sNICKer1103 | 5:e4ed6c5baf89 | 56 | //convert raw data too rgb values |
| sNICKer1103 | 5:e4ed6c5baf89 | 57 | for(int i = 0; i < 8; i++) { |
| sNICKer1103 | 2:f2700008c9d9 | 58 | int z = i * 64; // a layer is 64 byte |
| sNICKer1103 | 2:f2700008c9d9 | 59 | for(int j = 0; j < 8; j++) { |
| sNICKer1103 | 5:e4ed6c5baf89 | 60 | int y = j * 8; //a collum is 8 rows |
| sNICKer1103 | 5:e4ed6c5baf89 | 61 | unsigned char weight = 128; |
| sNICKer1103 | 5:e4ed6c5baf89 | 62 | for(int k = 0; k < 8; k++) { //iterate for each row |
| sNICKer1103 | 5:e4ed6c5baf89 | 63 | unsigned char digitbuffer = data[z+y+k]; //read byte consisting of color 1 led |
| sNICKer1103 | 2:f2700008c9d9 | 64 | //now select the right color |
| sNICKer1103 | 2:f2700008c9d9 | 65 | if(k == 0) { |
| sNICKer1103 | 2:f2700008c9d9 | 66 | rValues[i][j] = 0; |
| sNICKer1103 | 2:f2700008c9d9 | 67 | gValues[i][j] = 0; |
| sNICKer1103 | 2:f2700008c9d9 | 68 | bValues[i][j] = 0; |
| sNICKer1103 | 2:f2700008c9d9 | 69 | } |
| sNICKer1103 | 2:f2700008c9d9 | 70 | if(digitbuffer >= 4) { |
| sNICKer1103 | 2:f2700008c9d9 | 71 | rValues[i][j] += weight; |
| sNICKer1103 | 2:f2700008c9d9 | 72 | digitbuffer = digitbuffer - 4; |
| sNICKer1103 | 2:f2700008c9d9 | 73 | } |
| sNICKer1103 | 2:f2700008c9d9 | 74 | if(digitbuffer >= 2) { |
| sNICKer1103 | 2:f2700008c9d9 | 75 | gValues[i][j] += weight; |
| sNICKer1103 | 2:f2700008c9d9 | 76 | digitbuffer = digitbuffer - 2; |
| sNICKer1103 | 2:f2700008c9d9 | 77 | } |
| sNICKer1103 | 2:f2700008c9d9 | 78 | if(digitbuffer >= 1) { |
| sNICKer1103 | 2:f2700008c9d9 | 79 | bValues[i][j] += weight; |
| sNICKer1103 | 2:f2700008c9d9 | 80 | } |
| sNICKer1103 | 2:f2700008c9d9 | 81 | weight = weight >> 1; |
| sNICKer1103 | 2:f2700008c9d9 | 82 | } |
| sNICKer1103 | 2:f2700008c9d9 | 83 | } |
| sNICKer1103 | 2:f2700008c9d9 | 84 | } |
| sNICKer1103 | 3:da30c350c339 | 85 | } |
| sNICKer1103 | 5:e4ed6c5baf89 | 86 | void LedCube::printValues(Color_led color){ |
| sNICKer1103 | 5:e4ed6c5baf89 | 87 | unsigned char(*toprint)[8][8]; |
| sNICKer1103 | 5:e4ed6c5baf89 | 88 | switch (color) |
| sNICKer1103 | 5:e4ed6c5baf89 | 89 | { |
| sNICKer1103 | 5:e4ed6c5baf89 | 90 | case l_red: |
| sNICKer1103 | 5:e4ed6c5baf89 | 91 | toprint = &rValues; |
| sNICKer1103 | 3:da30c350c339 | 92 | break; |
| sNICKer1103 | 5:e4ed6c5baf89 | 93 | case l_green: |
| sNICKer1103 | 5:e4ed6c5baf89 | 94 | toprint = &gValues; |
| sNICKer1103 | 5:e4ed6c5baf89 | 95 | break; |
| sNICKer1103 | 5:e4ed6c5baf89 | 96 | case l_blue: |
| sNICKer1103 | 5:e4ed6c5baf89 | 97 | toprint = &bValues; |
| sNICKer1103 | 5:e4ed6c5baf89 | 98 | break; |
| sNICKer1103 | 5:e4ed6c5baf89 | 99 | default: |
| sNICKer1103 | 5:e4ed6c5baf89 | 100 | toprint = &rValues; //set the default to red should not happen anyway |
| sNICKer1103 | 3:da30c350c339 | 101 | break; |
| sNICKer1103 | 3:da30c350c339 | 102 | } |
| sNICKer1103 | 5:e4ed6c5baf89 | 103 | for (int i = 0; i < 8; i++){ |
| sNICKer1103 | 5:e4ed6c5baf89 | 104 | for (int j = 0; j < 8; j++){ |
| sNICKer1103 | 5:e4ed6c5baf89 | 105 | printf("%03d ", (*toprint)[i][j]); |
| sNICKer1103 | 5:e4ed6c5baf89 | 106 | } |
| sNICKer1103 | 5:e4ed6c5baf89 | 107 | printf("\n\r"); |
| sNICKer1103 | 3:da30c350c339 | 108 | } |
| sNICKer1103 | 3:da30c350c339 | 109 | } |
| sNICKer1103 | 3:da30c350c339 | 110 | void LedCube::printAll(){ |
| sNICKer1103 | 3:da30c350c339 | 111 | printf("Red Matrix: \n\r"); |
| sNICKer1103 | 5:e4ed6c5baf89 | 112 | printValues(l_red); |
| sNICKer1103 | 3:da30c350c339 | 113 | printf("\n\rGreen Matrix: \n\r"); |
| sNICKer1103 | 5:e4ed6c5baf89 | 114 | printValues(l_green); |
| sNICKer1103 | 3:da30c350c339 | 115 | printf("\n\rBlue Matrix: \n\r"); |
| sNICKer1103 | 5:e4ed6c5baf89 | 116 | printValues(l_blue); |
| sNICKer1103 | 5:e4ed6c5baf89 | 117 | } |