Polytech Tours - Projet C++ embarqué sur cible mbed

Dependencies:   mbed

Committer:
LecomteDelys
Date:
Sun Apr 24 15:43:51 2016 +0000
Revision:
0:21e183c9ef81
Programme final

Who changed what in which revision?

UserRevisionLine numberNew 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 }