A few classes to interface one or more ShiftBrite module to the FRDM KL25Z.

Dependencies:   mbed

Committer:
JoKer
Date:
Thu Aug 21 04:04:49 2014 +0000
Revision:
5:aa0424f31fa1
Parent:
4:d2f8ddb423e2
Improved shift method functions for shiftBrightDisplay class. Allows shifting in a colour.

Who changed what in which revision?

UserRevisionLine numberNew 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 5:aa0424f31fa1 269 void shiftBriteDisplay::shiftLeft(unsigned short int inR,unsigned short int inG,unsigned short int inB){;//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 5:aa0424f31fa1 274 if(inR==0 && inG==0 && inB==0)
JoKer 5:aa0424f31fa1 275 setLed(moduleCount-1,0,0,0);
JoKer 5:aa0424f31fa1 276 else
JoKer 5:aa0424f31fa1 277 setLed(moduleCount-1,inR,inG,inB);
JoKer 3:9376bf1f1bbd 278 }
JoKer 0:f76850de7b57 279
JoKer 3:9376bf1f1bbd 280 void shiftBriteDisplay::rotateRight(){;
JoKer 3:9376bf1f1bbd 281 rgbLed temp; //temporary object to hold data
JoKer 3:9376bf1f1bbd 282 unsigned int i;
JoKer 3:9376bf1f1bbd 283 temp.setRgbLed(module_p[moduleCount-1].getRed(),module_p[moduleCount-1].getGreen(),module_p[moduleCount-1].getBlue());
JoKer 3:9376bf1f1bbd 284 for(i=moduleCount; i != 0; i--){
JoKer 3:9376bf1f1bbd 285 setLed(i-1,module_p[i-2].getRed(),module_p[i-2].getGreen(),module_p[i-2].getBlue());
JoKer 3:9376bf1f1bbd 286 }
JoKer 3:9376bf1f1bbd 287 setLed(0,temp.getRed(),temp.getGreen(),temp.getBlue());
JoKer 3:9376bf1f1bbd 288 }
JoKer 5:aa0424f31fa1 289 void shiftBriteDisplay::shiftRight(unsigned short int inR,unsigned short int inG,unsigned short int inB){;//info shifted out is lost
JoKer 3:9376bf1f1bbd 290 unsigned int i;
JoKer 3:9376bf1f1bbd 291 for(i=moduleCount; i != 0; i--){
JoKer 3:9376bf1f1bbd 292 setLed(i-1,module_p[i-2].getRed(),module_p[i-2].getGreen(),module_p[i-2].getBlue());
JoKer 3:9376bf1f1bbd 293 }
JoKer 5:aa0424f31fa1 294 if(inR==0 && inG==0 && inB==0)
JoKer 5:aa0424f31fa1 295 setLed(0,0,0,0);
JoKer 5:aa0424f31fa1 296 else
JoKer 5:aa0424f31fa1 297 setLed(0,inR,inG,inB);
JoKer 3:9376bf1f1bbd 298 }
JoKer 3:9376bf1f1bbd 299 void shiftBriteDisplay::turnOn(){;
JoKer 3:9376bf1f1bbd 300 priv_SBEnable();
JoKer 3:9376bf1f1bbd 301 }
JoKer 3:9376bf1f1bbd 302 void shiftBriteDisplay::turnOff(){;
JoKer 3:9376bf1f1bbd 303 priv_SBDisable();
JoKer 3:9376bf1f1bbd 304 }
JoKer 3:9376bf1f1bbd 305
JoKer 3:9376bf1f1bbd 306 void shiftBriteDisplay::flip(){; //swop positions
JoKer 3:9376bf1f1bbd 307 rgbLed temp; //temporary object to hold data
JoKer 3:9376bf1f1bbd 308 unsigned int i;
JoKer 3:9376bf1f1bbd 309 for(i=0; i != moduleCount/2; i++){
JoKer 3:9376bf1f1bbd 310 temp.setRgbLed(module_p[i].getRed(),module_p[i].getGreen(),module_p[i].getBlue());
JoKer 3:9376bf1f1bbd 311 setLed(i,module_p[moduleCount-1-i].getRed(),module_p[moduleCount-1-i].getGreen(),module_p[moduleCount-1-i].getBlue());
JoKer 3:9376bf1f1bbd 312 setLed(moduleCount-i-1,temp.getRed(),temp.getGreen(),temp.getBlue());
JoKer 3:9376bf1f1bbd 313 }
JoKer 3:9376bf1f1bbd 314 }
JoKer 3:9376bf1f1bbd 315
JoKer 3:9376bf1f1bbd 316 void shiftBriteDisplay::invert(){; //invert colours
JoKer 3:9376bf1f1bbd 317 unsigned int i;
JoKer 3:9376bf1f1bbd 318 for(i=0; i != moduleCount; i++){
JoKer 3:9376bf1f1bbd 319 //module_p[i].getRed();
JoKer 3:9376bf1f1bbd 320 setLed(i,1023-module_p[i].getRed(),1023-module_p[i].getGreen(),1023-module_p[i].getBlue());
JoKer 3:9376bf1f1bbd 321 }
JoKer 3:9376bf1f1bbd 322 }
JoKer 0:f76850de7b57 323
JoKer 0:f76850de7b57 324 //=============================================================================================