Johan Kritzinger
/
FRDMKL25Z-ShiftBrite
A few classes to interface one or more ShiftBrite module to the FRDM KL25Z.
sbDriver.cpp@4:d2f8ddb423e2, 2014-08-20 (annotated)
- Committer:
- JoKer
- Date:
- Wed Aug 20 09:26:42 2014 +0000
- Revision:
- 4:d2f8ddb423e2
- Parent:
- 3:9376bf1f1bbd
- Child:
- 5:aa0424f31fa1
Cleaned docs and code some more.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JoKer | 0:f76850de7b57 | 1 | //Low level driver for shiftbrite modules |
JoKer | 0:f76850de7b57 | 2 | #include <iostream> |
JoKer | 0:f76850de7b57 | 3 | #include "mbed.h" |
JoKer | 0:f76850de7b57 | 4 | #include "sbDriver.h" |
JoKer | 0:f76850de7b57 | 5 | |
JoKer | 4:d2f8ddb423e2 | 6 | //#define ERRORPRINT //Comment out to not see any error message on STD:: |
JoKer | 0:f76850de7b57 | 7 | |
JoKer | 0:f76850de7b57 | 8 | |
JoKer | 0:f76850de7b57 | 9 | //NOTES ON THE SHIFTBRITE MODULES |
JoKer | 0:f76850de7b57 | 10 | /* |
JoKer | 0:f76850de7b57 | 11 | The modules are daisy chained and they buffer data, clock, latch and enable signals from in to out. |
JoKer | 0:f76850de7b57 | 12 | Imagine the chain of leds as a VERY long shift register, growing by 32 bits (4 bytes) for each LED. |
JoKer | 0:f76850de7b57 | 13 | Each LED is 10 bits and the complete RGB set is |
JoKer | 0:f76850de7b57 | 14 | Bit #31 #0 |
JoKer | 0:f76850de7b57 | 15 | 00010101 01010101 01010101 01010101 |
JoKer | 0:f76850de7b57 | 16 | (msb)xC\--LED1----/\--LED2---/\--LED3---/(lsb) |
JoKer | 0:f76850de7b57 | 17 | BLUE GREEN RED |
JoKer | 0:f76850de7b57 | 18 | Two most msb bits are not used except to enter COMMAND mode by setting bit 30 |
JoKer | 0:f76850de7b57 | 19 | In COMMAND mode set a value of 0 to 127 for each led that adjust the max current from 30% to 100% |
JoKer | 0:f76850de7b57 | 20 | Manual recommends red120, green100 and blue100. |
JoKer | 0:f76850de7b57 | 21 | |
JoKer | 0:f76850de7b57 | 22 | Data is moved out startgin with MSB. |
JoKer | 0:f76850de7b57 | 23 | Data is latched into the *WHOLE* chain with a *SINGLE* latch pulse. |
JoKer | 0:f76850de7b57 | 24 | I.E, if you have 2 leds you clock in 64 bits followed by *one* latch pulse |
JoKer | 0:f76850de7b57 | 25 | The first 32 bits will be latched into the LED on the very end of the chain. |
JoKer | 0:f76850de7b57 | 26 | Thus the last 32 bit will be latched into the LED closest to the MCU. |
JoKer | 0:f76850de7b57 | 27 | |
JoKer | 0:f76850de7b57 | 28 | There is no RESET command for the A6281's. They are only reset at power up. |
JoKer | 0:f76850de7b57 | 29 | Thus, if they loose synchronization with the clock/data you have to cycle the power. |
JoKer | 0:f76850de7b57 | 30 | I have a FET/Transisor circuit that allows me to do this using the reset() member function |
JoKer | 0:f76850de7b57 | 31 | |
JoKer | 0:f76850de7b57 | 32 | There needs to be a delay from the last bit to the positive edge of the latch pulse (see datasheet). |
JoKer | 0:f76850de7b57 | 33 | |
JoKer | 0:f76850de7b57 | 34 | */ |
JoKer | 0:f76850de7b57 | 35 | |
JoKer | 0:f76850de7b57 | 36 | |
JoKer | 0:f76850de7b57 | 37 | //============================================================================================= |
JoKer | 0:f76850de7b57 | 38 | // colour class to hold a led colour value |
JoKer | 0:f76850de7b57 | 39 | colour colour::operator=(unsigned short int v){ |
JoKer | 0:f76850de7b57 | 40 | setColour(v); // this will also range check |
JoKer | 0:f76850de7b57 | 41 | return *this; |
JoKer | 0:f76850de7b57 | 42 | } |
JoKer | 0:f76850de7b57 | 43 | //-------------------- |
JoKer | 0:f76850de7b57 | 44 | |
JoKer | 0:f76850de7b57 | 45 | colour colour::operator=(colour c){ |
JoKer | 0:f76850de7b57 | 46 | value = c.value; |
JoKer | 0:f76850de7b57 | 47 | return *this; |
JoKer | 0:f76850de7b57 | 48 | } |
JoKer | 0:f76850de7b57 | 49 | |
JoKer | 0:f76850de7b57 | 50 | |
JoKer | 0:f76850de7b57 | 51 | //============================================================================================= |
JoKer | 0:f76850de7b57 | 52 | //rgbLed class to manupilate RGB colours as one object |
JoKer | 0:f76850de7b57 | 53 | |
JoKer | 0:f76850de7b57 | 54 | rgbLed::rgbLed(unsigned long int rgbValue){ // constructor for RGB value e.g. 0xFFFFFF. Will expand 0XFF to 0x3FF as per colour range. Remember to update packet |
JoKer | 0:f76850de7b57 | 55 | setRgbLed(rgbValue); // this way all the other house keeping chores will be done |
JoKer | 0:f76850de7b57 | 56 | } |
JoKer | 0:f76850de7b57 | 57 | //-------------------- |
JoKer | 0:f76850de7b57 | 58 | rgbLed::rgbLed(unsigned short int red, unsigned short int green, unsigned short int blue){ //overload for seperate r,g,b arguments. Remember to updatepacket |
JoKer | 0:f76850de7b57 | 59 | this->red=red; |
JoKer | 0:f76850de7b57 | 60 | this->green = green; |
JoKer | 0:f76850de7b57 | 61 | this->blue = blue; |
JoKer | 0:f76850de7b57 | 62 | } |
JoKer | 0:f76850de7b57 | 63 | //-------------------- |
JoKer | 0:f76850de7b57 | 64 | |
JoKer | 0:f76850de7b57 | 65 | rgbLed::rgbLed(){//no arguments given so default to 0 |
JoKer | 0:f76850de7b57 | 66 | //red.setColour(0); //red is an colour object, not just a value |
JoKer | 0:f76850de7b57 | 67 | red=0;//use overloaded operator |
JoKer | 0:f76850de7b57 | 68 | //green.setColour(0); |
JoKer | 0:f76850de7b57 | 69 | green = 0; |
JoKer | 0:f76850de7b57 | 70 | //blue.setColour(0); |
JoKer | 0:f76850de7b57 | 71 | blue = 0; |
JoKer | 0:f76850de7b57 | 72 | //packet = 0; |
JoKer | 0:f76850de7b57 | 73 | |
JoKer | 0:f76850de7b57 | 74 | } |
JoKer | 0:f76850de7b57 | 75 | //-------------------- |
JoKer | 0:f76850de7b57 | 76 | unsigned long int rgbLed::getPacket(){ |
JoKer | 0:f76850de7b57 | 77 | //Convert R, G and B values into one 4 byte packet ready for trnsmittion to SB |
JoKer | 0:f76850de7b57 | 78 | //TO DO : Confirm that unsigned long int is 4 bytes long....... |
JoKer | 0:f76850de7b57 | 79 | //NOTE, This compensates for SB being GRB and nor RGB |
JoKer | 0:f76850de7b57 | 80 | unsigned long int temp; |
JoKer | 0:f76850de7b57 | 81 | temp = 0; // initialize - DATA MODE |
JoKer | 0:f76850de7b57 | 82 | //temp = 0x01; //init - COMMAND MODE |
JoKer | 0:f76850de7b57 | 83 | temp <<=2; //shift in mode |
JoKer | 0:f76850de7b57 | 84 | temp |= (blue.getColour()& 0X3FF); |
JoKer | 0:f76850de7b57 | 85 | //ser_p->printf("BLUE: 0x%lx",temp); |
JoKer | 0:f76850de7b57 | 86 | temp <<= 10; |
JoKer | 0:f76850de7b57 | 87 | temp |= (red.getColour() & 0X3FF); |
JoKer | 0:f76850de7b57 | 88 | temp <<=10; |
JoKer | 0:f76850de7b57 | 89 | temp |= (green.getColour() & 0X3FF); |
JoKer | 0:f76850de7b57 | 90 | return temp; |
JoKer | 0:f76850de7b57 | 91 | } |
JoKer | 0:f76850de7b57 | 92 | //-------------------- |
JoKer | 0:f76850de7b57 | 93 | |
JoKer | 0:f76850de7b57 | 94 | void rgbLed::setRgbLed(unsigned long int rgbValue){ // RGB value e.g. 0xFFFFFF. Will expand 0XFF to 0x3FF as per colour range |
JoKer | 0:f76850de7b57 | 95 | // THIS IS NOT THE BEST AS IT WILL EXPAND |
JoKer | 0:f76850de7b57 | 96 | // First, pull each colour out and set accordingly in rgbLed |
JoKer | 0:f76850de7b57 | 97 | blue.setColour(4*((unsigned short int)(rgbValue & 0X0000FF)));//blue |
JoKer | 0:f76850de7b57 | 98 | //But, remember, the range is 0-0x3FF, not 0-0xFF |
JoKer | 0:f76850de7b57 | 99 | green = 4*((unsigned short int)((rgbValue >> 8) & 0X0000FF));//This uses the overloaded = operator |
JoKer | 0:f76850de7b57 | 100 | red = 4*((unsigned short int)((rgbValue >> 16) & 0X0000FF)); |
JoKer | 0:f76850de7b57 | 101 | } |
JoKer | 0:f76850de7b57 | 102 | //-------------------- |
JoKer | 0:f76850de7b57 | 103 | |
JoKer | 0:f76850de7b57 | 104 | void rgbLed::setRgbLed(unsigned short int red, unsigned short int green, unsigned short int blue){ //overload for seperate r,g,b arguments |
JoKer | 0:f76850de7b57 | 105 | //THIS IS THE BEST WAY AS YOU CAN SPECIFY THE FULL 0-0X3FF RANGE |
JoKer | 0:f76850de7b57 | 106 | this->red=red;//This should kick in the operator overloaded f() and do a range check |
JoKer | 0:f76850de7b57 | 107 | this->green = green; |
JoKer | 0:f76850de7b57 | 108 | this->blue = blue; |
JoKer | 0:f76850de7b57 | 109 | } |
JoKer | 0:f76850de7b57 | 110 | |
JoKer | 0:f76850de7b57 | 111 | |
JoKer | 0:f76850de7b57 | 112 | |
JoKer | 0:f76850de7b57 | 113 | //============================================================================================= |
JoKer | 0:f76850de7b57 | 114 | // Display object tracking/controlling multiple rgbLed objects |
JoKer | 4:d2f8ddb423e2 | 115 | //shiftBriteDisplay::shiftBriteDisplay (Serial *port,DigitalOut &latch, DigitalOut &enable, DigitalOut &reset, SPI &spiPort, unsigned int moduleCount):/*PC(port),*/sb_latch(latch), sb_enable(enable), sb_reset(reset), spi(spiPort){ //constructor |
JoKer | 4:d2f8ddb423e2 | 116 | shiftBriteDisplay::shiftBriteDisplay (DigitalOut &latch, DigitalOut &enable, DigitalOut &reset, SPI &spiPort, unsigned int moduleCount):/*PC(port),*/sb_latch(latch), sb_enable(enable), sb_reset(reset), spi(spiPort){ //constructor |
JoKer | 0:f76850de7b57 | 117 | // OK, so the sb control/data lines have been setup via references |
JoKer | 0:f76850de7b57 | 118 | //Allocate memory for moduleCount* sb modules |
JoKer | 4:d2f8ddb423e2 | 119 | //serial_p = port; |
JoKer | 0:f76850de7b57 | 120 | spi.format(8,0);//8 bit, mode 0 |
JoKer | 0:f76850de7b57 | 121 | spi.frequency(100000);//100kHz clk |
JoKer | 0:f76850de7b57 | 122 | |
JoKer | 0:f76850de7b57 | 123 | |
JoKer | 0:f76850de7b57 | 124 | this->moduleCount = moduleCount; |
JoKer | 0:f76850de7b57 | 125 | module_p = new rgbLed[moduleCount];// |
JoKer | 0:f76850de7b57 | 126 | if(!module_p){ |
JoKer | 0:f76850de7b57 | 127 | //to do : WHAT TO DO WITH ERRORS? |
JoKer | 0:f76850de7b57 | 128 | #ifdef ERRORPRINT |
JoKer | 0:f76850de7b57 | 129 | serial_p->printf("Unable to allocate memory for RGB led array\r\n"); |
JoKer | 0:f76850de7b57 | 130 | #endif |
JoKer | 0:f76850de7b57 | 131 | while(1);// for now just get stuck here |
JoKer | 0:f76850de7b57 | 132 | } |
JoKer | 0:f76850de7b57 | 133 | |
JoKer | 0:f76850de7b57 | 134 | priv_reset(); //assuming cct connected, remove power for a short time to reset the chips |
JoKer | 0:f76850de7b57 | 135 | priv_SBEnable(); |
JoKer | 0:f76850de7b57 | 136 | |
JoKer | 0:f76850de7b57 | 137 | setCurrentCorr(0x78,0x64,0x64);//setup default rgb values |
JoKer | 0:f76850de7b57 | 138 | f_update = 0; |
JoKer | 0:f76850de7b57 | 139 | } |
JoKer | 0:f76850de7b57 | 140 | //-------------------- |
JoKer | 0:f76850de7b57 | 141 | |
JoKer | 0:f76850de7b57 | 142 | void shiftBriteDisplay::setCurrentCorr(unsigned short int red, unsigned short int green, unsigned short int blue){ |
JoKer | 0:f76850de7b57 | 143 | //Now, for each module, set a command packet with |
JoKer | 0:f76850de7b57 | 144 | //appropriately loaded current control values |
JoKer | 0:f76850de7b57 | 145 | //and send |
JoKer | 0:f76850de7b57 | 146 | //Uses same module_p as normal operations |
JoKer | 0:f76850de7b57 | 147 | //This saves and restores the current colour values |
JoKer | 0:f76850de7b57 | 148 | unsigned short int i, r,g,b;//storage for temporary colour memory |
JoKer | 0:f76850de7b57 | 149 | |
JoKer | 0:f76850de7b57 | 150 | //save user selected value for current correction reg values with some range checking |
JoKer | 0:f76850de7b57 | 151 | rCorr = red & 0X7F; // ensure that it is no larger than 0x7F |
JoKer | 0:f76850de7b57 | 152 | gCorr = green & 0x7F; |
JoKer | 0:f76850de7b57 | 153 | bCorr= blue & 0x7F; |
JoKer | 0:f76850de7b57 | 154 | |
JoKer | 0:f76850de7b57 | 155 | if(f_update == 0){ |
JoKer | 0:f76850de7b57 | 156 | f_update=1; //prevent the ISR from messing this up |
JoKer | 0:f76850de7b57 | 157 | //Backup the colours |
JoKer | 0:f76850de7b57 | 158 | |
JoKer | 0:f76850de7b57 | 159 | //do it |
JoKer | 0:f76850de7b57 | 160 | //As per recommenation, set red=120, green and blue = 100 |
JoKer | 0:f76850de7b57 | 161 | for(i=0; i != moduleCount; i++){ |
JoKer | 0:f76850de7b57 | 162 | r=module_p[i].getRed(); |
JoKer | 0:f76850de7b57 | 163 | g=module_p[i].getGreen(); |
JoKer | 0:f76850de7b57 | 164 | b=module_p[i].getBlue(); |
JoKer | 0:f76850de7b57 | 165 | setLed(i,red,green,blue); |
JoKer | 0:f76850de7b57 | 166 | send(module_p[i],1); |
JoKer | 0:f76850de7b57 | 167 | setLed(i,r,g,b); //restore colours |
JoKer | 0:f76850de7b57 | 168 | } |
JoKer | 0:f76850de7b57 | 169 | /* for(i=0; i != moduleCount; i++){ |
JoKer | 0:f76850de7b57 | 170 | send(module_p[i],1); |
JoKer | 0:f76850de7b57 | 171 | }*/ |
JoKer | 0:f76850de7b57 | 172 | priv_SBLatch(); |
JoKer | 0:f76850de7b57 | 173 | f_update=0; |
JoKer | 0:f76850de7b57 | 174 | #ifdef ERRORPRINT |
JoKer | 0:f76850de7b57 | 175 | } |
JoKer | 0:f76850de7b57 | 176 | else { |
JoKer | 0:f76850de7b57 | 177 | serial_p->printf("Current adj packet lost\r\n"); |
JoKer | 0:f76850de7b57 | 178 | #endif |
JoKer | 0:f76850de7b57 | 179 | } |
JoKer | 0:f76850de7b57 | 180 | |
JoKer | 0:f76850de7b57 | 181 | } |
JoKer | 0:f76850de7b57 | 182 | |
JoKer | 0:f76850de7b57 | 183 | //Overloaded member f() |
JoKer | 0:f76850de7b57 | 184 | void shiftBriteDisplay::setCurrentCorr(){ |
JoKer | 0:f76850de7b57 | 185 | setCurrentCorr(rCorr,gCorr,bCorr); // call the setter with the correct values |
JoKer | 0:f76850de7b57 | 186 | } |
JoKer | 0:f76850de7b57 | 187 | //-------------------- |
JoKer | 0:f76850de7b57 | 188 | |
JoKer | 0:f76850de7b57 | 189 | shiftBriteDisplay::~shiftBriteDisplay(){//Destructor |
JoKer | 0:f76850de7b57 | 190 | delete [] module_p;//Be nice, clean the house. Not strictly required as this should never be called as we never reach the end of the program |
JoKer | 0:f76850de7b57 | 191 | } |
JoKer | 0:f76850de7b57 | 192 | //-------------------- |
JoKer | 0:f76850de7b57 | 193 | |
JoKer | 0:f76850de7b57 | 194 | void shiftBriteDisplay::setLed(unsigned int moduleNum, unsigned long int rgbValue){ |
JoKer | 0:f76850de7b57 | 195 | //Set the colour of a specific LED in the array |
JoKer | 0:f76850de7b57 | 196 | moduleCount >= moduleNum ? module_p[moduleNum].setRgbLed(rgbValue): /*TO DO - set some sort of error? For now, mess up the LAST moodule setting*/ module_p[moduleCount-1].setRgbLed(rgbValue); |
JoKer | 0:f76850de7b57 | 197 | } |
JoKer | 0:f76850de7b57 | 198 | //-------------------- |
JoKer | 0:f76850de7b57 | 199 | void shiftBriteDisplay::setLed(unsigned int moduleNum, unsigned short int red, unsigned short int green, unsigned short int blue){ |
JoKer | 0:f76850de7b57 | 200 | module_p[moduleNum].setRgbLed(red,green,blue); |
JoKer | 0:f76850de7b57 | 201 | } |
JoKer | 0:f76850de7b57 | 202 | //-------------------- |
JoKer | 0:f76850de7b57 | 203 | |
JoKer | 0:f76850de7b57 | 204 | void shiftBriteDisplay::send(rgbLed M, unsigned short int commandStatus){ |
JoKer | 0:f76850de7b57 | 205 | unsigned long int temp; |
JoKer | 0:f76850de7b57 | 206 | unsigned char byt; |
JoKer | 0:f76850de7b57 | 207 | temp = M.getPacket();//Will pull in the 4 bytes of RGB data |
JoKer | 0:f76850de7b57 | 208 | //Now, massage the hardware to send the data bits for this particular led module |
JoKer | 0:f76850de7b57 | 209 | //Remember, spi writes 8 bits at a time so I need to access the packet a byte at a time |
JoKer | 0:f76850de7b57 | 210 | //but I also need to start at the MSB |
JoKer | 0:f76850de7b57 | 211 | byt = (unsigned char)( 0X000000FF & (temp >> 24));//msb |
JoKer | 0:f76850de7b57 | 212 | if(commandStatus == 1){//i.e. adjust current control registers |
JoKer | 0:f76850de7b57 | 213 | byt |= 0x40;//Add in the control flag to tell the shift Brite LED module that we are talking to the control registers |
JoKer | 0:f76850de7b57 | 214 | } |
JoKer | 0:f76850de7b57 | 215 | spi.write(byt); |
JoKer | 0:f76850de7b57 | 216 | byt = (unsigned char)( 0X000000FF & (temp >> 16)); |
JoKer | 0:f76850de7b57 | 217 | spi.write(byt); |
JoKer | 0:f76850de7b57 | 218 | byt = (unsigned char)( 0X000000FF & (temp >> 8)); |
JoKer | 0:f76850de7b57 | 219 | spi.write(byt); |
JoKer | 0:f76850de7b57 | 220 | byt = (unsigned char)( 0X000000FF & temp); |
JoKer | 0:f76850de7b57 | 221 | spi.write(byt); |
JoKer | 0:f76850de7b57 | 222 | } |
JoKer | 0:f76850de7b57 | 223 | |
JoKer | 0:f76850de7b57 | 224 | //-------------------- |
JoKer | 0:f76850de7b57 | 225 | |
JoKer | 0:f76850de7b57 | 226 | void shiftBriteDisplay::priv_reset(){ |
JoKer | 0:f76850de7b57 | 227 | sb_reset=0; |
JoKer | 0:f76850de7b57 | 228 | wait(0.1); |
JoKer | 0:f76850de7b57 | 229 | sb_reset=1; |
JoKer | 0:f76850de7b57 | 230 | /*TO DO - init SB current control registers ? */ |
JoKer | 0:f76850de7b57 | 231 | wait(0.1); //allow power to settle |
JoKer | 0:f76850de7b57 | 232 | } |
JoKer | 0:f76850de7b57 | 233 | |
JoKer | 0:f76850de7b57 | 234 | //-------------------- |
JoKer | 0:f76850de7b57 | 235 | |
JoKer | 0:f76850de7b57 | 236 | void shiftBriteDisplay::displayFrame(){ |
JoKer | 0:f76850de7b57 | 237 | unsigned int i; |
JoKer | 0:f76850de7b57 | 238 | if(f_update == 0){//Prevents doing this if an update is already in progress. This is b/c this member f() is called by an ISR etup in main |
JoKer | 0:f76850de7b57 | 239 | f_update = 1; |
JoKer | 0:f76850de7b57 | 240 | //TO DO - do any harware init e.g., reset the whole chain or enable the display or whatever |
JoKer | 0:f76850de7b57 | 241 | for(i=0; i != moduleCount; i++){ |
JoKer | 0:f76850de7b57 | 242 | //do something with module_p[i] |
JoKer | 0:f76850de7b57 | 243 | send(module_p[i]); // transmit the rgb info of this led to the chain |
JoKer | 0:f76850de7b57 | 244 | } |
JoKer | 0:f76850de7b57 | 245 | //Complete the hardware handshaking etc |
JoKer | 0:f76850de7b57 | 246 | priv_SBLatch(); // Latch the complete string of LED data, i.e. the frame |
JoKer | 0:f76850de7b57 | 247 | f_update = 0; |
JoKer | 0:f76850de7b57 | 248 | |
JoKer | 0:f76850de7b57 | 249 | setCurrentCorr();//force a reload of the current correction register values |
JoKer | 0:f76850de7b57 | 250 | |
JoKer | 0:f76850de7b57 | 251 | }else { |
JoKer | 0:f76850de7b57 | 252 | //Do nothing if we are alreay in an update cycle. In fact, for now, destructively chuck the update away. |
JoKer | 0:f76850de7b57 | 253 | #ifdef ERRORPRINT |
JoKer | 0:f76850de7b57 | 254 | serial_p->printf("Data Packet Lost\r\n"); |
JoKer | 0:f76850de7b57 | 255 | #endif |
JoKer | 0:f76850de7b57 | 256 | } |
JoKer | 0:f76850de7b57 | 257 | } |
JoKer | 0:f76850de7b57 | 258 | |
JoKer | 3:9376bf1f1bbd | 259 | void shiftBriteDisplay::rotateLeft(){ |
JoKer | 3:9376bf1f1bbd | 260 | rgbLed temp; //temporary object to hold data |
JoKer | 3:9376bf1f1bbd | 261 | unsigned int i; |
JoKer | 3:9376bf1f1bbd | 262 | temp.setRgbLed(module_p[0].getRed(),module_p[0].getGreen(),module_p[0].getBlue()); |
JoKer | 3:9376bf1f1bbd | 263 | for(i=0; i != moduleCount-1; i++){ |
JoKer | 3:9376bf1f1bbd | 264 | setLed(i,module_p[i+1].getRed(),module_p[i+1].getGreen(),module_p[i+1].getBlue()); |
JoKer | 3:9376bf1f1bbd | 265 | } |
JoKer | 3:9376bf1f1bbd | 266 | setLed(moduleCount-1,temp.getRed(),temp.getGreen(),temp.getBlue()); |
JoKer | 3:9376bf1f1bbd | 267 | } |
JoKer | 3:9376bf1f1bbd | 268 | |
JoKer | 3:9376bf1f1bbd | 269 | void shiftBriteDisplay::shiftLeft(){;//info shifted out is lost, |
JoKer | 3:9376bf1f1bbd | 270 | unsigned int i; |
JoKer | 3:9376bf1f1bbd | 271 | for(i=0; i != moduleCount-1; i++){ |
JoKer | 3:9376bf1f1bbd | 272 | setLed(i,module_p[i+1].getRed(),module_p[i+1].getGreen(),module_p[i+1].getBlue()); |
JoKer | 3:9376bf1f1bbd | 273 | } |
JoKer | 3:9376bf1f1bbd | 274 | setLed(moduleCount-1,0,0,0); |
JoKer | 3:9376bf1f1bbd | 275 | } |
JoKer | 0:f76850de7b57 | 276 | |
JoKer | 3:9376bf1f1bbd | 277 | void shiftBriteDisplay::rotateRight(){; |
JoKer | 3:9376bf1f1bbd | 278 | rgbLed temp; //temporary object to hold data |
JoKer | 3:9376bf1f1bbd | 279 | unsigned int i; |
JoKer | 3:9376bf1f1bbd | 280 | temp.setRgbLed(module_p[moduleCount-1].getRed(),module_p[moduleCount-1].getGreen(),module_p[moduleCount-1].getBlue()); |
JoKer | 3:9376bf1f1bbd | 281 | for(i=moduleCount; i != 0; i--){ |
JoKer | 3:9376bf1f1bbd | 282 | setLed(i-1,module_p[i-2].getRed(),module_p[i-2].getGreen(),module_p[i-2].getBlue()); |
JoKer | 3:9376bf1f1bbd | 283 | } |
JoKer | 3:9376bf1f1bbd | 284 | setLed(0,temp.getRed(),temp.getGreen(),temp.getBlue()); |
JoKer | 3:9376bf1f1bbd | 285 | } |
JoKer | 3:9376bf1f1bbd | 286 | void shiftBriteDisplay::shiftRight(){;//info shifted out is lost |
JoKer | 3:9376bf1f1bbd | 287 | unsigned int i; |
JoKer | 3:9376bf1f1bbd | 288 | for(i=moduleCount; i != 0; i--){ |
JoKer | 3:9376bf1f1bbd | 289 | setLed(i-1,module_p[i-2].getRed(),module_p[i-2].getGreen(),module_p[i-2].getBlue()); |
JoKer | 3:9376bf1f1bbd | 290 | } |
JoKer | 3:9376bf1f1bbd | 291 | setLed(0,0,0,0); |
JoKer | 3:9376bf1f1bbd | 292 | } |
JoKer | 3:9376bf1f1bbd | 293 | void shiftBriteDisplay::turnOn(){; |
JoKer | 3:9376bf1f1bbd | 294 | priv_SBEnable(); |
JoKer | 3:9376bf1f1bbd | 295 | } |
JoKer | 3:9376bf1f1bbd | 296 | void shiftBriteDisplay::turnOff(){; |
JoKer | 3:9376bf1f1bbd | 297 | priv_SBDisable(); |
JoKer | 3:9376bf1f1bbd | 298 | } |
JoKer | 3:9376bf1f1bbd | 299 | |
JoKer | 3:9376bf1f1bbd | 300 | void shiftBriteDisplay::flip(){; //swop positions |
JoKer | 3:9376bf1f1bbd | 301 | rgbLed temp; //temporary object to hold data |
JoKer | 3:9376bf1f1bbd | 302 | unsigned int i; |
JoKer | 3:9376bf1f1bbd | 303 | for(i=0; i != moduleCount/2; i++){ |
JoKer | 3:9376bf1f1bbd | 304 | temp.setRgbLed(module_p[i].getRed(),module_p[i].getGreen(),module_p[i].getBlue()); |
JoKer | 3:9376bf1f1bbd | 305 | setLed(i,module_p[moduleCount-1-i].getRed(),module_p[moduleCount-1-i].getGreen(),module_p[moduleCount-1-i].getBlue()); |
JoKer | 3:9376bf1f1bbd | 306 | setLed(moduleCount-i-1,temp.getRed(),temp.getGreen(),temp.getBlue()); |
JoKer | 3:9376bf1f1bbd | 307 | } |
JoKer | 3:9376bf1f1bbd | 308 | } |
JoKer | 3:9376bf1f1bbd | 309 | |
JoKer | 3:9376bf1f1bbd | 310 | void shiftBriteDisplay::invert(){; //invert colours |
JoKer | 3:9376bf1f1bbd | 311 | unsigned int i; |
JoKer | 3:9376bf1f1bbd | 312 | for(i=0; i != moduleCount; i++){ |
JoKer | 3:9376bf1f1bbd | 313 | //module_p[i].getRed(); |
JoKer | 3:9376bf1f1bbd | 314 | setLed(i,1023-module_p[i].getRed(),1023-module_p[i].getGreen(),1023-module_p[i].getBlue()); |
JoKer | 3:9376bf1f1bbd | 315 | } |
JoKer | 3:9376bf1f1bbd | 316 | } |
JoKer | 0:f76850de7b57 | 317 | |
JoKer | 0:f76850de7b57 | 318 | //============================================================================================= |