Lecomte Delys / MatchColors

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers HL1606Stripe.cpp Source File

HL1606Stripe.cpp

00001 #include "HL1606Stripe.h"
00002 #include <iostream>
00003 
00004 /*Constructeur*/
00005 HL1606Stripe::HL1606Stripe(PinName mosi, PinName miso, PinName sclk, PinName latch, uint8_t numLEDs, uint8_t numColors) : m_numLEDs(numLEDs), m_numColors(numColors), m_SPI(mosi, miso, sclk), m_latchPin(latch)
00006 {   
00007     m_SPI.format(8,3);          // 8 bits per frame, SPI mode 3
00008     m_SPI.frequency(450000);    // 450kHz freq
00009          
00010     /*Allocation en fonction du nombre de LEDs sur le bandeau*/
00011     m_redPWM = new uint8_t[m_numLEDs];
00012     m_greenPWM = new uint8_t[m_numLEDs];
00013     m_bluePWM = new uint8_t[m_numLEDs];
00014                 
00015     /*Eteindre le bandeau de LEDs*/
00016     SwitchOffRGB();
00017     
00018     /*Mettre à jour les LEDs du bandeau toutes les 45ms*/
00019     m_tickerUpdate.attach(this, &HL1606Stripe::Update, 0.0045);
00020 }
00021 
00022 /*Destructeur*/
00023 HL1606Stripe::~HL1606Stripe()
00024 {
00025     m_tickerUpdate.detach();
00026     
00027     delete [] m_redPWM;
00028     delete [] m_greenPWM;
00029     delete [] m_bluePWM;
00030 }
00031 
00032 /*Mettre à jour le bandeau de LEDs*/
00033 void HL1606Stripe::Update(void)
00034 {    
00035     uint8_t i, data; 
00036     static int m_pwmCounter;
00037 
00038     /*Ecrire les données sur le bus SPI*/
00039     for (i = 0; i < m_numLEDs; i++) {
00040         
00041         data = 0x80;
00042 
00043         /*Calculer la couleur de la LED suivante*/
00044         if (m_pwmCounter < m_redPWM[i]){
00045             data |= 0x04;
00046         }
00047 
00048         if (m_pwmCounter < m_bluePWM[i]){
00049             data |= 0x10;
00050         }
00051 
00052         if (m_pwmCounter < m_greenPWM[i]){
00053             data |= 0x01;
00054         }
00055 
00056         m_SPI.write(data);
00057     }
00058 
00059     /*Incrémenter le compteur de PWM (soft)*/
00060     m_pwmCounter += 1;
00061 
00062     if (m_pwmCounter > 3){
00063         m_pwmCounter = 0;
00064     }
00065 
00066     /*Latch*/
00067     m_latchPin = 1;
00068     wait_us(1);
00069     m_latchPin = 0;   
00070 }
00071 
00072 /*Eteindre le bandeau de LEDs*/
00073 void HL1606Stripe::SwitchOffRGB()
00074 {
00075     FillRGB(OFF,OFF,OFF);
00076 }
00077 
00078 /*Set d'une LED sur le bandeau*/
00079 void HL1606Stripe::setLED(uint8_t Color, uint8_t LEDx)
00080 {  
00081     if(LEDx>m_numLEDs)
00082     {
00083         std::cerr << "Erreur lors du set d'une LED du bandeau : index error" << std::endl;   
00084         return;
00085     }
00086     if(Color>NUM_COLORS)
00087     {
00088         std::cerr << "Erreur lors du set d'une LED du bandeau : Num color error" << std::endl;   
00089         return;
00090     }
00091     switch(Color)
00092         {
00093             case BLUE:
00094                 m_redPWM[LEDx] = OFF;
00095                 m_greenPWM[LEDx] = OFF;
00096                 m_bluePWM[LEDx] = LOW;
00097             break;
00098             
00099             case RED:
00100                 m_redPWM[LEDx] = LOW;
00101                 m_greenPWM[LEDx] = OFF;
00102                 m_bluePWM[LEDx] = OFF;
00103             break;
00104             
00105             case GREEN:
00106                 m_redPWM[LEDx] = OFF;
00107                 m_greenPWM[LEDx] = LOW;
00108                 m_bluePWM[LEDx] = OFF;
00109             break;
00110             
00111              case YELLOW:
00112                 m_redPWM[LEDx] = LOW;
00113                 m_greenPWM[LEDx] = LOW;
00114                 m_bluePWM[LEDx] = OFF;
00115             break;
00116                         
00117              case CYAN:
00118                 m_redPWM[LEDx] = OFF;
00119                 m_greenPWM[LEDx] = MEDIUM;
00120                 m_bluePWM[LEDx] = LOW;
00121             break;
00122                          
00123             /*OFF*/
00124             default:
00125                 m_redPWM[LEDx] = OFF;
00126                 m_greenPWM[LEDx] = OFF;
00127                 m_bluePWM[LEDx] = OFF;
00128         }
00129 }
00130 
00131 /*Remplir aléatoirement le bandeau de LEDs*/
00132 void HL1606Stripe::FillRandomlyRGB(uint8_t* randomColors)
00133 {              
00134     for(int LEDx = 0; LEDx < m_numLEDs; LEDx++)
00135     {
00136         randomColors[LEDx] = rand()%(m_numColors);                
00137         setLED(randomColors[LEDx],LEDx);
00138     }
00139 }
00140 
00141 /*Remplir le bandeau de LEDs avec une couleur définie dans Colour_t*/
00142 void HL1606Stripe::FillRGB(uint8_t color)
00143 {
00144     if(color>NUM_COLORS)
00145     {
00146         std::cerr << "Erreur lors du set d'une LED du bandeau : Num color error" << std::endl;   
00147         return;
00148     }
00149     for (int LEDx = 0; LEDx < m_numLEDs; LEDx++) 
00150     {
00151         setLED(color,LEDx);
00152     }
00153 }
00154 
00155 /*Remplir le bandeau de LEDs avec des composantes RGB définie par l'utilisateur*/
00156 void HL1606Stripe::FillRGB(uint8_t red, uint8_t green, uint8_t blue)
00157 {
00158     for (int i = 0; i < m_numLEDs; i++) {
00159         m_redPWM[i] = red;
00160         m_greenPWM[i] = green;
00161         m_bluePWM[i] = blue;
00162     }
00163 }
00164 
00165 /*Remplir le bandeau de LEDs avec des couleurs définies par l'utilisateur*/
00166 void HL1606Stripe::FillRGB(uint8_t* colors)
00167 {
00168     for(int LEDx = 0; LEDx < m_numLEDs; LEDx++) {
00169         setLED(colors[LEDx],LEDx);
00170     }
00171 }