Polytech Tours - Projet C++ embarqué sur cible mbed
Diff: HL1606Stripe.cpp
- Revision:
- 0:21e183c9ef81
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HL1606Stripe.cpp Sun Apr 24 15:43:51 2016 +0000 @@ -0,0 +1,171 @@ +#include "HL1606Stripe.h" +#include <iostream> + +/*Constructeur*/ +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) +{ + m_SPI.format(8,3); // 8 bits per frame, SPI mode 3 + m_SPI.frequency(450000); // 450kHz freq + + /*Allocation en fonction du nombre de LEDs sur le bandeau*/ + m_redPWM = new uint8_t[m_numLEDs]; + m_greenPWM = new uint8_t[m_numLEDs]; + m_bluePWM = new uint8_t[m_numLEDs]; + + /*Eteindre le bandeau de LEDs*/ + SwitchOffRGB(); + + /*Mettre à jour les LEDs du bandeau toutes les 45ms*/ + m_tickerUpdate.attach(this, &HL1606Stripe::Update, 0.0045); +} + +/*Destructeur*/ +HL1606Stripe::~HL1606Stripe() +{ + m_tickerUpdate.detach(); + + delete [] m_redPWM; + delete [] m_greenPWM; + delete [] m_bluePWM; +} + +/*Mettre à jour le bandeau de LEDs*/ +void HL1606Stripe::Update(void) +{ + uint8_t i, data; + static int m_pwmCounter; + + /*Ecrire les données sur le bus SPI*/ + for (i = 0; i < m_numLEDs; i++) { + + data = 0x80; + + /*Calculer la couleur de la LED suivante*/ + if (m_pwmCounter < m_redPWM[i]){ + data |= 0x04; + } + + if (m_pwmCounter < m_bluePWM[i]){ + data |= 0x10; + } + + if (m_pwmCounter < m_greenPWM[i]){ + data |= 0x01; + } + + m_SPI.write(data); + } + + /*Incrémenter le compteur de PWM (soft)*/ + m_pwmCounter += 1; + + if (m_pwmCounter > 3){ + m_pwmCounter = 0; + } + + /*Latch*/ + m_latchPin = 1; + wait_us(1); + m_latchPin = 0; +} + +/*Eteindre le bandeau de LEDs*/ +void HL1606Stripe::SwitchOffRGB() +{ + FillRGB(OFF,OFF,OFF); +} + +/*Set d'une LED sur le bandeau*/ +void HL1606Stripe::setLED(uint8_t Color, uint8_t LEDx) +{ + if(LEDx>m_numLEDs) + { + std::cerr << "Erreur lors du set d'une LED du bandeau : index error" << std::endl; + return; + } + if(Color>NUM_COLORS) + { + std::cerr << "Erreur lors du set d'une LED du bandeau : Num color error" << std::endl; + return; + } + switch(Color) + { + case BLUE: + m_redPWM[LEDx] = OFF; + m_greenPWM[LEDx] = OFF; + m_bluePWM[LEDx] = LOW; + break; + + case RED: + m_redPWM[LEDx] = LOW; + m_greenPWM[LEDx] = OFF; + m_bluePWM[LEDx] = OFF; + break; + + case GREEN: + m_redPWM[LEDx] = OFF; + m_greenPWM[LEDx] = LOW; + m_bluePWM[LEDx] = OFF; + break; + + case YELLOW: + m_redPWM[LEDx] = LOW; + m_greenPWM[LEDx] = LOW; + m_bluePWM[LEDx] = OFF; + break; + + case CYAN: + m_redPWM[LEDx] = OFF; + m_greenPWM[LEDx] = MEDIUM; + m_bluePWM[LEDx] = LOW; + break; + + /*OFF*/ + default: + m_redPWM[LEDx] = OFF; + m_greenPWM[LEDx] = OFF; + m_bluePWM[LEDx] = OFF; + } +} + +/*Remplir aléatoirement le bandeau de LEDs*/ +void HL1606Stripe::FillRandomlyRGB(uint8_t* randomColors) +{ + for(int LEDx = 0; LEDx < m_numLEDs; LEDx++) + { + randomColors[LEDx] = rand()%(m_numColors); + setLED(randomColors[LEDx],LEDx); + } +} + +/*Remplir le bandeau de LEDs avec une couleur définie dans Colour_t*/ +void HL1606Stripe::FillRGB(uint8_t color) +{ + if(color>NUM_COLORS) + { + std::cerr << "Erreur lors du set d'une LED du bandeau : Num color error" << std::endl; + return; + } + for (int LEDx = 0; LEDx < m_numLEDs; LEDx++) + { + setLED(color,LEDx); + } +} + +/*Remplir le bandeau de LEDs avec des composantes RGB définie par l'utilisateur*/ +void HL1606Stripe::FillRGB(uint8_t red, uint8_t green, uint8_t blue) +{ + for (int i = 0; i < m_numLEDs; i++) { + m_redPWM[i] = red; + m_greenPWM[i] = green; + m_bluePWM[i] = blue; + } +} + +/*Remplir le bandeau de LEDs avec des couleurs définies par l'utilisateur*/ +void HL1606Stripe::FillRGB(uint8_t* colors) +{ + for(int LEDx = 0; LEDx < m_numLEDs; LEDx++) { + setLED(colors[LEDx],LEDx); + } +}