Polytech Tours - Projet C++ embarqué sur cible mbed
HL1606Stripe.cpp@0:21e183c9ef81, 2016-04-24 (annotated)
- Committer:
- LecomteDelys
- Date:
- Sun Apr 24 15:43:51 2016 +0000
- Revision:
- 0:21e183c9ef81
Programme final
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
LecomteDelys | 0:21e183c9ef81 | 1 | #include "HL1606Stripe.h" |
LecomteDelys | 0:21e183c9ef81 | 2 | #include <iostream> |
LecomteDelys | 0:21e183c9ef81 | 3 | |
LecomteDelys | 0:21e183c9ef81 | 4 | /*Constructeur*/ |
LecomteDelys | 0:21e183c9ef81 | 5 | 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) |
LecomteDelys | 0:21e183c9ef81 | 6 | { |
LecomteDelys | 0:21e183c9ef81 | 7 | m_SPI.format(8,3); // 8 bits per frame, SPI mode 3 |
LecomteDelys | 0:21e183c9ef81 | 8 | m_SPI.frequency(450000); // 450kHz freq |
LecomteDelys | 0:21e183c9ef81 | 9 | |
LecomteDelys | 0:21e183c9ef81 | 10 | /*Allocation en fonction du nombre de LEDs sur le bandeau*/ |
LecomteDelys | 0:21e183c9ef81 | 11 | m_redPWM = new uint8_t[m_numLEDs]; |
LecomteDelys | 0:21e183c9ef81 | 12 | m_greenPWM = new uint8_t[m_numLEDs]; |
LecomteDelys | 0:21e183c9ef81 | 13 | m_bluePWM = new uint8_t[m_numLEDs]; |
LecomteDelys | 0:21e183c9ef81 | 14 | |
LecomteDelys | 0:21e183c9ef81 | 15 | /*Eteindre le bandeau de LEDs*/ |
LecomteDelys | 0:21e183c9ef81 | 16 | SwitchOffRGB(); |
LecomteDelys | 0:21e183c9ef81 | 17 | |
LecomteDelys | 0:21e183c9ef81 | 18 | /*Mettre à jour les LEDs du bandeau toutes les 45ms*/ |
LecomteDelys | 0:21e183c9ef81 | 19 | m_tickerUpdate.attach(this, &HL1606Stripe::Update, 0.0045); |
LecomteDelys | 0:21e183c9ef81 | 20 | } |
LecomteDelys | 0:21e183c9ef81 | 21 | |
LecomteDelys | 0:21e183c9ef81 | 22 | /*Destructeur*/ |
LecomteDelys | 0:21e183c9ef81 | 23 | HL1606Stripe::~HL1606Stripe() |
LecomteDelys | 0:21e183c9ef81 | 24 | { |
LecomteDelys | 0:21e183c9ef81 | 25 | m_tickerUpdate.detach(); |
LecomteDelys | 0:21e183c9ef81 | 26 | |
LecomteDelys | 0:21e183c9ef81 | 27 | delete [] m_redPWM; |
LecomteDelys | 0:21e183c9ef81 | 28 | delete [] m_greenPWM; |
LecomteDelys | 0:21e183c9ef81 | 29 | delete [] m_bluePWM; |
LecomteDelys | 0:21e183c9ef81 | 30 | } |
LecomteDelys | 0:21e183c9ef81 | 31 | |
LecomteDelys | 0:21e183c9ef81 | 32 | /*Mettre à jour le bandeau de LEDs*/ |
LecomteDelys | 0:21e183c9ef81 | 33 | void HL1606Stripe::Update(void) |
LecomteDelys | 0:21e183c9ef81 | 34 | { |
LecomteDelys | 0:21e183c9ef81 | 35 | uint8_t i, data; |
LecomteDelys | 0:21e183c9ef81 | 36 | static int m_pwmCounter; |
LecomteDelys | 0:21e183c9ef81 | 37 | |
LecomteDelys | 0:21e183c9ef81 | 38 | /*Ecrire les données sur le bus SPI*/ |
LecomteDelys | 0:21e183c9ef81 | 39 | for (i = 0; i < m_numLEDs; i++) { |
LecomteDelys | 0:21e183c9ef81 | 40 | |
LecomteDelys | 0:21e183c9ef81 | 41 | data = 0x80; |
LecomteDelys | 0:21e183c9ef81 | 42 | |
LecomteDelys | 0:21e183c9ef81 | 43 | /*Calculer la couleur de la LED suivante*/ |
LecomteDelys | 0:21e183c9ef81 | 44 | if (m_pwmCounter < m_redPWM[i]){ |
LecomteDelys | 0:21e183c9ef81 | 45 | data |= 0x04; |
LecomteDelys | 0:21e183c9ef81 | 46 | } |
LecomteDelys | 0:21e183c9ef81 | 47 | |
LecomteDelys | 0:21e183c9ef81 | 48 | if (m_pwmCounter < m_bluePWM[i]){ |
LecomteDelys | 0:21e183c9ef81 | 49 | data |= 0x10; |
LecomteDelys | 0:21e183c9ef81 | 50 | } |
LecomteDelys | 0:21e183c9ef81 | 51 | |
LecomteDelys | 0:21e183c9ef81 | 52 | if (m_pwmCounter < m_greenPWM[i]){ |
LecomteDelys | 0:21e183c9ef81 | 53 | data |= 0x01; |
LecomteDelys | 0:21e183c9ef81 | 54 | } |
LecomteDelys | 0:21e183c9ef81 | 55 | |
LecomteDelys | 0:21e183c9ef81 | 56 | m_SPI.write(data); |
LecomteDelys | 0:21e183c9ef81 | 57 | } |
LecomteDelys | 0:21e183c9ef81 | 58 | |
LecomteDelys | 0:21e183c9ef81 | 59 | /*Incrémenter le compteur de PWM (soft)*/ |
LecomteDelys | 0:21e183c9ef81 | 60 | m_pwmCounter += 1; |
LecomteDelys | 0:21e183c9ef81 | 61 | |
LecomteDelys | 0:21e183c9ef81 | 62 | if (m_pwmCounter > 3){ |
LecomteDelys | 0:21e183c9ef81 | 63 | m_pwmCounter = 0; |
LecomteDelys | 0:21e183c9ef81 | 64 | } |
LecomteDelys | 0:21e183c9ef81 | 65 | |
LecomteDelys | 0:21e183c9ef81 | 66 | /*Latch*/ |
LecomteDelys | 0:21e183c9ef81 | 67 | m_latchPin = 1; |
LecomteDelys | 0:21e183c9ef81 | 68 | wait_us(1); |
LecomteDelys | 0:21e183c9ef81 | 69 | m_latchPin = 0; |
LecomteDelys | 0:21e183c9ef81 | 70 | } |
LecomteDelys | 0:21e183c9ef81 | 71 | |
LecomteDelys | 0:21e183c9ef81 | 72 | /*Eteindre le bandeau de LEDs*/ |
LecomteDelys | 0:21e183c9ef81 | 73 | void HL1606Stripe::SwitchOffRGB() |
LecomteDelys | 0:21e183c9ef81 | 74 | { |
LecomteDelys | 0:21e183c9ef81 | 75 | FillRGB(OFF,OFF,OFF); |
LecomteDelys | 0:21e183c9ef81 | 76 | } |
LecomteDelys | 0:21e183c9ef81 | 77 | |
LecomteDelys | 0:21e183c9ef81 | 78 | /*Set d'une LED sur le bandeau*/ |
LecomteDelys | 0:21e183c9ef81 | 79 | void HL1606Stripe::setLED(uint8_t Color, uint8_t LEDx) |
LecomteDelys | 0:21e183c9ef81 | 80 | { |
LecomteDelys | 0:21e183c9ef81 | 81 | if(LEDx>m_numLEDs) |
LecomteDelys | 0:21e183c9ef81 | 82 | { |
LecomteDelys | 0:21e183c9ef81 | 83 | std::cerr << "Erreur lors du set d'une LED du bandeau : index error" << std::endl; |
LecomteDelys | 0:21e183c9ef81 | 84 | return; |
LecomteDelys | 0:21e183c9ef81 | 85 | } |
LecomteDelys | 0:21e183c9ef81 | 86 | if(Color>NUM_COLORS) |
LecomteDelys | 0:21e183c9ef81 | 87 | { |
LecomteDelys | 0:21e183c9ef81 | 88 | std::cerr << "Erreur lors du set d'une LED du bandeau : Num color error" << std::endl; |
LecomteDelys | 0:21e183c9ef81 | 89 | return; |
LecomteDelys | 0:21e183c9ef81 | 90 | } |
LecomteDelys | 0:21e183c9ef81 | 91 | switch(Color) |
LecomteDelys | 0:21e183c9ef81 | 92 | { |
LecomteDelys | 0:21e183c9ef81 | 93 | case BLUE: |
LecomteDelys | 0:21e183c9ef81 | 94 | m_redPWM[LEDx] = OFF; |
LecomteDelys | 0:21e183c9ef81 | 95 | m_greenPWM[LEDx] = OFF; |
LecomteDelys | 0:21e183c9ef81 | 96 | m_bluePWM[LEDx] = LOW; |
LecomteDelys | 0:21e183c9ef81 | 97 | break; |
LecomteDelys | 0:21e183c9ef81 | 98 | |
LecomteDelys | 0:21e183c9ef81 | 99 | case RED: |
LecomteDelys | 0:21e183c9ef81 | 100 | m_redPWM[LEDx] = LOW; |
LecomteDelys | 0:21e183c9ef81 | 101 | m_greenPWM[LEDx] = OFF; |
LecomteDelys | 0:21e183c9ef81 | 102 | m_bluePWM[LEDx] = OFF; |
LecomteDelys | 0:21e183c9ef81 | 103 | break; |
LecomteDelys | 0:21e183c9ef81 | 104 | |
LecomteDelys | 0:21e183c9ef81 | 105 | case GREEN: |
LecomteDelys | 0:21e183c9ef81 | 106 | m_redPWM[LEDx] = OFF; |
LecomteDelys | 0:21e183c9ef81 | 107 | m_greenPWM[LEDx] = LOW; |
LecomteDelys | 0:21e183c9ef81 | 108 | m_bluePWM[LEDx] = OFF; |
LecomteDelys | 0:21e183c9ef81 | 109 | break; |
LecomteDelys | 0:21e183c9ef81 | 110 | |
LecomteDelys | 0:21e183c9ef81 | 111 | case YELLOW: |
LecomteDelys | 0:21e183c9ef81 | 112 | m_redPWM[LEDx] = LOW; |
LecomteDelys | 0:21e183c9ef81 | 113 | m_greenPWM[LEDx] = LOW; |
LecomteDelys | 0:21e183c9ef81 | 114 | m_bluePWM[LEDx] = OFF; |
LecomteDelys | 0:21e183c9ef81 | 115 | break; |
LecomteDelys | 0:21e183c9ef81 | 116 | |
LecomteDelys | 0:21e183c9ef81 | 117 | case CYAN: |
LecomteDelys | 0:21e183c9ef81 | 118 | m_redPWM[LEDx] = OFF; |
LecomteDelys | 0:21e183c9ef81 | 119 | m_greenPWM[LEDx] = MEDIUM; |
LecomteDelys | 0:21e183c9ef81 | 120 | m_bluePWM[LEDx] = LOW; |
LecomteDelys | 0:21e183c9ef81 | 121 | break; |
LecomteDelys | 0:21e183c9ef81 | 122 | |
LecomteDelys | 0:21e183c9ef81 | 123 | /*OFF*/ |
LecomteDelys | 0:21e183c9ef81 | 124 | default: |
LecomteDelys | 0:21e183c9ef81 | 125 | m_redPWM[LEDx] = OFF; |
LecomteDelys | 0:21e183c9ef81 | 126 | m_greenPWM[LEDx] = OFF; |
LecomteDelys | 0:21e183c9ef81 | 127 | m_bluePWM[LEDx] = OFF; |
LecomteDelys | 0:21e183c9ef81 | 128 | } |
LecomteDelys | 0:21e183c9ef81 | 129 | } |
LecomteDelys | 0:21e183c9ef81 | 130 | |
LecomteDelys | 0:21e183c9ef81 | 131 | /*Remplir aléatoirement le bandeau de LEDs*/ |
LecomteDelys | 0:21e183c9ef81 | 132 | void HL1606Stripe::FillRandomlyRGB(uint8_t* randomColors) |
LecomteDelys | 0:21e183c9ef81 | 133 | { |
LecomteDelys | 0:21e183c9ef81 | 134 | for(int LEDx = 0; LEDx < m_numLEDs; LEDx++) |
LecomteDelys | 0:21e183c9ef81 | 135 | { |
LecomteDelys | 0:21e183c9ef81 | 136 | randomColors[LEDx] = rand()%(m_numColors); |
LecomteDelys | 0:21e183c9ef81 | 137 | setLED(randomColors[LEDx],LEDx); |
LecomteDelys | 0:21e183c9ef81 | 138 | } |
LecomteDelys | 0:21e183c9ef81 | 139 | } |
LecomteDelys | 0:21e183c9ef81 | 140 | |
LecomteDelys | 0:21e183c9ef81 | 141 | /*Remplir le bandeau de LEDs avec une couleur définie dans Colour_t*/ |
LecomteDelys | 0:21e183c9ef81 | 142 | void HL1606Stripe::FillRGB(uint8_t color) |
LecomteDelys | 0:21e183c9ef81 | 143 | { |
LecomteDelys | 0:21e183c9ef81 | 144 | if(color>NUM_COLORS) |
LecomteDelys | 0:21e183c9ef81 | 145 | { |
LecomteDelys | 0:21e183c9ef81 | 146 | std::cerr << "Erreur lors du set d'une LED du bandeau : Num color error" << std::endl; |
LecomteDelys | 0:21e183c9ef81 | 147 | return; |
LecomteDelys | 0:21e183c9ef81 | 148 | } |
LecomteDelys | 0:21e183c9ef81 | 149 | for (int LEDx = 0; LEDx < m_numLEDs; LEDx++) |
LecomteDelys | 0:21e183c9ef81 | 150 | { |
LecomteDelys | 0:21e183c9ef81 | 151 | setLED(color,LEDx); |
LecomteDelys | 0:21e183c9ef81 | 152 | } |
LecomteDelys | 0:21e183c9ef81 | 153 | } |
LecomteDelys | 0:21e183c9ef81 | 154 | |
LecomteDelys | 0:21e183c9ef81 | 155 | /*Remplir le bandeau de LEDs avec des composantes RGB définie par l'utilisateur*/ |
LecomteDelys | 0:21e183c9ef81 | 156 | void HL1606Stripe::FillRGB(uint8_t red, uint8_t green, uint8_t blue) |
LecomteDelys | 0:21e183c9ef81 | 157 | { |
LecomteDelys | 0:21e183c9ef81 | 158 | for (int i = 0; i < m_numLEDs; i++) { |
LecomteDelys | 0:21e183c9ef81 | 159 | m_redPWM[i] = red; |
LecomteDelys | 0:21e183c9ef81 | 160 | m_greenPWM[i] = green; |
LecomteDelys | 0:21e183c9ef81 | 161 | m_bluePWM[i] = blue; |
LecomteDelys | 0:21e183c9ef81 | 162 | } |
LecomteDelys | 0:21e183c9ef81 | 163 | } |
LecomteDelys | 0:21e183c9ef81 | 164 | |
LecomteDelys | 0:21e183c9ef81 | 165 | /*Remplir le bandeau de LEDs avec des couleurs définies par l'utilisateur*/ |
LecomteDelys | 0:21e183c9ef81 | 166 | void HL1606Stripe::FillRGB(uint8_t* colors) |
LecomteDelys | 0:21e183c9ef81 | 167 | { |
LecomteDelys | 0:21e183c9ef81 | 168 | for(int LEDx = 0; LEDx < m_numLEDs; LEDx++) { |
LecomteDelys | 0:21e183c9ef81 | 169 | setLED(colors[LEDx],LEDx); |
LecomteDelys | 0:21e183c9ef81 | 170 | } |
LecomteDelys | 0:21e183c9ef81 | 171 | } |