Prg du capteur de couleur avec liaison série et CAN Programme non testé

Dependencies:   mbed APDS_9960

Committer:
loicmnt
Date:
Fri Jan 14 23:22:09 2022 +0000
Revision:
5:b91bf2db2ea8
Parent:
4:6212d7723c16
Il manque la partie Enable/Disable output de la liaison serie

Who changed what in which revision?

UserRevisionLine numberNew contents of line
guilhemMBED 0:37ba45bb0099 1 #include "mbed.h"
guilhemMBED 0:37ba45bb0099 2 #include "glibr.h"
guilhemMBED 0:37ba45bb0099 3
guilhemMBED 3:96e8e5affaad 4 #define SR 1 // 0 = CAN | 1 = serie
loicmnt 4:6212d7723c16 5 #define DEBUG_COM 0 // 0 = pas de debug | 1 = print de toutes les tramme serie recue et envoyées
loicmnt 4:6212d7723c16 6 #define DEBUG_SENS 0 // 0 = pas de debug | 1 = print de la couleur (fait pour tester le capteur en lui même)
guilhemMBED 3:96e8e5affaad 7
guilhemMBED 3:96e8e5affaad 8 #if ((DEBUG_COM==1)||(DEBUG_SENS==1))
guilhemMBED 3:96e8e5affaad 9 #define DEBUG_GENERAL 1
guilhemMBED 3:96e8e5affaad 10 #else
guilhemMBED 3:96e8e5affaad 11 #define DEBUG_GENERAL 0
guilhemMBED 3:96e8e5affaad 12 #endif
guilhemMBED 3:96e8e5affaad 13
guilhemMBED 3:96e8e5affaad 14 #if (SR==0)
guilhemMBED 3:96e8e5affaad 15 #define OFFSET_DATA 2 // format CAN
guilhemMBED 3:96e8e5affaad 16 #else
guilhemMBED 3:96e8e5affaad 17 #define OFFSET_DATA 7 // format SR
guilhemMBED 3:96e8e5affaad 18 #endif
guilhemMBED 0:37ba45bb0099 19
guilhemMBED 0:37ba45bb0099 20 // Adress
loicmnt 5:b91bf2db2ea8 21 #define data_adress_sensor 0x01 // pID specifique a chaque capteur (between 0x00 and 0xFD)
guilhemMBED 3:96e8e5affaad 22 #define data_adress_general 0xFF // pID génerale pour communiquer avec tout les capteurs
guilhemMBED 3:96e8e5affaad 23 #define adress_color_sensor 0x4B0 // CAN ID pareil pour tout les capteur (seulement pour le CAN)
guilhemMBED 0:37ba45bb0099 24
guilhemMBED 0:37ba45bb0099 25 // Request commands
guilhemMBED 0:37ba45bb0099 26 #define send_RGB 0x00
guilhemMBED 0:37ba45bb0099 27 #define send_RED 0x01
guilhemMBED 0:37ba45bb0099 28 #define send_GREEN 0x02
guilhemMBED 0:37ba45bb0099 29 #define send_BLUE 0x03
guilhemMBED 0:37ba45bb0099 30 #define send_PROXIMITY 0x04
guilhemMBED 0:37ba45bb0099 31 #define send_COLOR 0x05
guilhemMBED 0:37ba45bb0099 32
guilhemMBED 0:37ba45bb0099 33 // Setup commands
guilhemMBED 0:37ba45bb0099 34 #define setup_LED 0x08
guilhemMBED 0:37ba45bb0099 35 #define setup_PROXIMITY_THRESHOLD 0x09
guilhemMBED 0:37ba45bb0099 36
guilhemMBED 0:37ba45bb0099 37 // Masks
guilhemMBED 0:37ba45bb0099 38 #define HIGH 0xFF00
guilhemMBED 0:37ba45bb0099 39 #define LOW 0x00FF
guilhemMBED 0:37ba45bb0099 40
guilhemMBED 0:37ba45bb0099 41 // Buffer
guilhemMBED 0:37ba45bb0099 42 #define CAN_MAX 256
guilhemMBED 0:37ba45bb0099 43 #define SR_MAX 1024
guilhemMBED 0:37ba45bb0099 44
guilhemMBED 0:37ba45bb0099 45 Serial USB_link(USBTX, USBRX); // USB initialization
guilhemMBED 3:96e8e5affaad 46 RawSerial sr(PA_9,PA_10); // SR: PA_9 = TX ; PA_10 = RX
guilhemMBED 3:96e8e5affaad 47 glibr capt1(PB_7,PB_6); // I²C initialization : PB_7 = SDA ; PB_6 = SCL
guilhemMBED 0:37ba45bb0099 48 CAN can(PA_11, PA_12);
guilhemMBED 3:96e8e5affaad 49 PwmOut LED(D9);
loicmnt 4:6212d7723c16 50 DigitalIn srTx(PA_9, PullUp);
guilhemMBED 0:37ba45bb0099 51
guilhemMBED 0:37ba45bb0099 52 // Buffer CAN
guilhemMBED 0:37ba45bb0099 53 CANMessage canBuffer[CAN_MAX];
guilhemMBED 0:37ba45bb0099 54 int canRempli = 0;
guilhemMBED 0:37ba45bb0099 55 int canVide = 0;
guilhemMBED 0:37ba45bb0099 56 int canPerdu = 0;
guilhemMBED 0:37ba45bb0099 57
guilhemMBED 0:37ba45bb0099 58 //Buffer SR
guilhemMBED 0:37ba45bb0099 59 uint8_t srBuffer[SR_MAX];
guilhemMBED 0:37ba45bb0099 60 int srRempli = 0;
guilhemMBED 0:37ba45bb0099 61 int srVide = 0;
guilhemMBED 0:37ba45bb0099 62 int srPerdu = 0;
guilhemMBED 0:37ba45bb0099 63
guilhemMBED 0:37ba45bb0099 64 // traitement tramme SR
guilhemMBED 0:37ba45bb0099 65 int etatSR = 0;
guilhemMBED 0:37ba45bb0099 66 uint8_t checksumSR1 = 0,checksumSR2 = 0,calc_checksumSR1=0,calc_checksumSR2=0;
guilhemMBED 0:37ba45bb0099 67 uint8_t lenSR = 0, idSR,cmdSR, dataSR=0;
guilhemMBED 0:37ba45bb0099 68
guilhemMBED 0:37ba45bb0099 69 // tramme retour
guilhemMBED 3:96e8e5affaad 70 char message[15], Len;
guilhemMBED 3:96e8e5affaad 71 int DataLen = 0;
guilhemMBED 0:37ba45bb0099 72
guilhemMBED 0:37ba45bb0099 73 // capteur et traitement
guilhemMBED 0:37ba45bb0099 74 uint16_t r,g,b ; // RGB values in 2 bytes
guilhemMBED 0:37ba45bb0099 75 uint8_t a ; // proximity value in 1 byte
guilhemMBED 0:37ba45bb0099 76 char proximity_tresh = 250, color;
guilhemMBED 0:37ba45bb0099 77 char state;
guilhemMBED 0:37ba45bb0099 78
guilhemMBED 3:96e8e5affaad 79 // PROTOTYPE DE FONCTIONS //
guilhemMBED 3:96e8e5affaad 80 /** Fonction initialisant les fréquence et le capteur APDS9960
guilhemMBED 3:96e8e5affaad 81 * @return true si pas d'erreur, false sinon
guilhemMBED 3:96e8e5affaad 82 */
guilhemMBED 1:93f012c817ba 83 bool initialization(void);
guilhemMBED 1:93f012c817ba 84
guilhemMBED 3:96e8e5affaad 85 /** Fonction récéptionnant la tramme serie
guilhemMBED 3:96e8e5affaad 86 * et la stockant dans un buffer en attendant traitement
guilhemMBED 3:96e8e5affaad 87 */
guilhemMBED 0:37ba45bb0099 88 void srRead();
guilhemMBED 0:37ba45bb0099 89
guilhemMBED 3:96e8e5affaad 90 /** Fonction decryptant la tramme serie recue dans le buffer
guilhemMBED 3:96e8e5affaad 91 */
guilhemMBED 0:37ba45bb0099 92 void srTraitement();
guilhemMBED 0:37ba45bb0099 93
guilhemMBED 3:96e8e5affaad 94 /** Fonction receptionnant les messaages CAN dans un Buffer
guilhemMBED 3:96e8e5affaad 95 */
guilhemMBED 3:96e8e5affaad 96 void canRead();
guilhemMBED 0:37ba45bb0099 97
guilhemMBED 3:96e8e5affaad 98 /** Fonction traitant le message et envoyant la reponse au format herkulex ou en simple message can
guilhemMBED 3:96e8e5affaad 99 * @param commande : la commande du message recu (voir table com)
guilhemMBED 3:96e8e5affaad 100 * @param data : la data du message recu si il y en a
guilhemMBED 3:96e8e5affaad 101 */
guilhemMBED 3:96e8e5affaad 102 void envoi(char commande, char data);
guilhemMBED 0:37ba45bb0099 103
guilhemMBED 3:96e8e5affaad 104
guilhemMBED 0:37ba45bb0099 105
loicmnt 4:6212d7723c16 106
loicmnt 4:6212d7723c16 107
loicmnt 4:6212d7723c16 108
guilhemMBED 1:93f012c817ba 109 bool initialization(void)
guilhemMBED 1:93f012c817ba 110 {
guilhemMBED 3:96e8e5affaad 111 #if DEBUG_GENERAL
guilhemMBED 1:93f012c817ba 112 // baud init
guilhemMBED 1:93f012c817ba 113 USB_link.baud(115200);
guilhemMBED 3:96e8e5affaad 114 #endif
guilhemMBED 3:96e8e5affaad 115
guilhemMBED 1:93f012c817ba 116 can.frequency(1000000);
guilhemMBED 3:96e8e5affaad 117 sr.baud(115200);
guilhemMBED 1:93f012c817ba 118
guilhemMBED 1:93f012c817ba 119 // LED init
guilhemMBED 1:93f012c817ba 120 LED.period_ms(10);
guilhemMBED 3:96e8e5affaad 121 LED.write(0.5);
guilhemMBED 1:93f012c817ba 122
guilhemMBED 1:93f012c817ba 123 // Sensor init
guilhemMBED 1:93f012c817ba 124 if( (capt1.ginit()) && (capt1.enableLightSensor(true)) && (capt1.enableProximitySensor(true)) ) {
guilhemMBED 1:93f012c817ba 125 return true;
guilhemMBED 1:93f012c817ba 126 } else {
guilhemMBED 1:93f012c817ba 127 return false;
guilhemMBED 1:93f012c817ba 128 }
guilhemMBED 1:93f012c817ba 129 }
guilhemMBED 0:37ba45bb0099 130
loicmnt 4:6212d7723c16 131
loicmnt 4:6212d7723c16 132 int main()
loicmnt 4:6212d7723c16 133 {
loicmnt 4:6212d7723c16 134 #if DEBUG_GENERAL
loicmnt 4:6212d7723c16 135 if (initialization()) USB_link.printf("Init finie\r\n");
loicmnt 4:6212d7723c16 136 else USB_link.printf("Erreur pendant l'init\r\n");
loicmnt 4:6212d7723c16 137 #else
loicmnt 4:6212d7723c16 138 initialization();
loicmnt 4:6212d7723c16 139 #endif
loicmnt 4:6212d7723c16 140
loicmnt 4:6212d7723c16 141 if(SR==0) { // liaison CAN selectionné
loicmnt 4:6212d7723c16 142 #if DEBUG_COM
loicmnt 4:6212d7723c16 143 int adColor = adress_color_sensor;
loicmnt 4:6212d7723c16 144 int adSensor = data_adress_sensor;
loicmnt 4:6212d7723c16 145 USB_link.printf("type de com : CAN\r\n");
loicmnt 4:6212d7723c16 146 USB_link.printf("ID can : %03X\r\ndata ID : %02X\r\n", adColor, adSensor);
loicmnt 4:6212d7723c16 147 #endif
loicmnt 4:6212d7723c16 148 can.attach(canRead);
loicmnt 4:6212d7723c16 149 // le premier octet est toujours pareil
loicmnt 4:6212d7723c16 150 message[0] = data_adress_sensor;
loicmnt 4:6212d7723c16 151
loicmnt 4:6212d7723c16 152 }
loicmnt 4:6212d7723c16 153 else if (SR==1) { // liaison Serie selectionnée
loicmnt 4:6212d7723c16 154 #if DEBUG_COM
loicmnt 4:6212d7723c16 155 USB_link.printf("type de com : Serie\r\n");
loicmnt 4:6212d7723c16 156 USB_link.printf("Id : %x\r\n",data_adress_sensor);
loicmnt 4:6212d7723c16 157 #endif
loicmnt 4:6212d7723c16 158 sr.attach(&srRead);
loicmnt 4:6212d7723c16 159 // octets toujours pareil :
loicmnt 4:6212d7723c16 160 message[0]=0xff; // Start of packet
loicmnt 4:6212d7723c16 161 message[1]=0xff;
loicmnt 4:6212d7723c16 162 message[3]= data_adress_sensor; // pID
loicmnt 4:6212d7723c16 163 }
loicmnt 4:6212d7723c16 164
loicmnt 4:6212d7723c16 165 while(1) {
loicmnt 4:6212d7723c16 166
loicmnt 4:6212d7723c16 167 // acquisition capteurs //
loicmnt 4:6212d7723c16 168 capt1.readRedLight(r);
loicmnt 4:6212d7723c16 169 capt1.readGreenLight(g);
loicmnt 4:6212d7723c16 170 capt1.readBlueLight(b);
loicmnt 4:6212d7723c16 171 capt1.readProximity(a);
loicmnt 4:6212d7723c16 172
loicmnt 4:6212d7723c16 173 // calcul couleur //
loicmnt 4:6212d7723c16 174 if (a<proximity_tresh) {
loicmnt 4:6212d7723c16 175 color = 0 ; // 0 Rien
loicmnt 4:6212d7723c16 176 }
loicmnt 4:6212d7723c16 177 else if ((r > g )&&(r > b )) {
loicmnt 4:6212d7723c16 178 color = 1 ; // 1 rouge
loicmnt 4:6212d7723c16 179 }
loicmnt 4:6212d7723c16 180 else if ((g > r )&&(g > b )) {
loicmnt 4:6212d7723c16 181 color = 2 ; // 2 vert
loicmnt 4:6212d7723c16 182 }
loicmnt 4:6212d7723c16 183 else if ((b > r )&&(b > g )) {
loicmnt 4:6212d7723c16 184 color = 3 ; // 3 bleu
loicmnt 4:6212d7723c16 185 }
loicmnt 4:6212d7723c16 186 else {
loicmnt 4:6212d7723c16 187 color = 4 ; // 4 noir ou blanc
loicmnt 4:6212d7723c16 188 }
loicmnt 4:6212d7723c16 189 #if DEBUG_SENS
loicmnt 4:6212d7723c16 190 USB_link.printf("rouge : %x, vert : %x, bleu : %x ",r, g, b);
loicmnt 4:6212d7723c16 191 USB_link.printf("color : %x \r\n", color);
loicmnt 4:6212d7723c16 192 USB_link.printf("color : %hu \r\n", color);
loicmnt 4:6212d7723c16 193 wait(0.5);
loicmnt 4:6212d7723c16 194 #endif
loicmnt 4:6212d7723c16 195
loicmnt 4:6212d7723c16 196
loicmnt 4:6212d7723c16 197 // liaison CAN //
loicmnt 4:6212d7723c16 198 if (canRempli != canVide) { // si le buffer CAN n'est pas vide
loicmnt 4:6212d7723c16 199 canVide++;
loicmnt 4:6212d7723c16 200 if (canVide == CAN_MAX) canVide = 0;
loicmnt 4:6212d7723c16 201 if ((canBuffer[canRempli-1].id==adress_color_sensor)&((canBuffer[canRempli-1].data[0]==data_adress_general)|(canBuffer[canRempli-1].data[0]==data_adress_sensor))) {
loicmnt 4:6212d7723c16 202 if (canBuffer[canRempli-1].len==3){
loicmnt 4:6212d7723c16 203 envoi(canBuffer[canRempli-1].data[1],canBuffer[canRempli-1].data[2]);
loicmnt 4:6212d7723c16 204 } else {
loicmnt 4:6212d7723c16 205 envoi(canBuffer[canRempli-1].data[1],0);
loicmnt 4:6212d7723c16 206 }
loicmnt 4:6212d7723c16 207 }
loicmnt 4:6212d7723c16 208 }
loicmnt 4:6212d7723c16 209
loicmnt 4:6212d7723c16 210 // liaison serie //
loicmnt 4:6212d7723c16 211 if (srRempli != srVide) { // si le buffer serie n'est pas vide
loicmnt 4:6212d7723c16 212 srTraitement(); // traitement de la tramme sr
loicmnt 4:6212d7723c16 213 }
loicmnt 4:6212d7723c16 214 }
loicmnt 4:6212d7723c16 215 }
loicmnt 4:6212d7723c16 216
loicmnt 4:6212d7723c16 217
guilhemMBED 0:37ba45bb0099 218 void srRead()
guilhemMBED 0:37ba45bb0099 219 {
guilhemMBED 3:96e8e5affaad 220 srBuffer[srRempli++] = sr.getc(); //stockage nouvel octet dans le buffer
guilhemMBED 0:37ba45bb0099 221 if (srRempli==SR_MAX) srRempli = 0; // on recommence au debut du tableau si le max est atteint
guilhemMBED 0:37ba45bb0099 222
guilhemMBED 0:37ba45bb0099 223
guilhemMBED 0:37ba45bb0099 224 if (srRempli == srVide) { // buffer plein on perd un caractère (le premier recu)
guilhemMBED 0:37ba45bb0099 225 srVide++; // le message commence donc un octet plus tard
guilhemMBED 0:37ba45bb0099 226 if (srVide == SR_MAX) srVide = 0; // on recommence au debut du tableau si le max est atteint
guilhemMBED 0:37ba45bb0099 227
guilhemMBED 0:37ba45bb0099 228 srPerdu++; // mise en memoire : un message perdu
guilhemMBED 0:37ba45bb0099 229 }
guilhemMBED 0:37ba45bb0099 230 }
guilhemMBED 0:37ba45bb0099 231
guilhemMBED 0:37ba45bb0099 232 void srTraitement()
guilhemMBED 0:37ba45bb0099 233 {
guilhemMBED 0:37ba45bb0099 234 uint8_t c = srBuffer[srVide++]; // c prends la valeur d'un octet de la tramme
guilhemMBED 0:37ba45bb0099 235 if (srVide == SR_MAX) srVide = 0; // on recommence au debut du tableau si le max est atteint
guilhemMBED 3:96e8e5affaad 236 #if DEBUG_COM
guilhemMBED 3:96e8e5affaad 237 USB_link.printf("etat : %d recu : %x\r\n",etatSR,c);
guilhemMBED 3:96e8e5affaad 238 #endif
guilhemMBED 0:37ba45bb0099 239 switch (etatSR) {
guilhemMBED 0:37ba45bb0099 240 case 0: // Verification premier octet header (FF)
guilhemMBED 0:37ba45bb0099 241 if (c==0xFF) {
guilhemMBED 0:37ba45bb0099 242 etatSR = 1;
guilhemMBED 0:37ba45bb0099 243 }
guilhemMBED 0:37ba45bb0099 244 break;
guilhemMBED 0:37ba45bb0099 245 case 1: // Verification dexième octet header (FF)
loicmnt 4:6212d7723c16 246 calc_checksumSR1 = 0;
guilhemMBED 0:37ba45bb0099 247 if (c==0xFF) {
guilhemMBED 0:37ba45bb0099 248 etatSR = 2;
guilhemMBED 0:37ba45bb0099 249 } else {
guilhemMBED 0:37ba45bb0099 250 etatSR = 0;
guilhemMBED 0:37ba45bb0099 251 }
guilhemMBED 0:37ba45bb0099 252 break;
guilhemMBED 0:37ba45bb0099 253 case 2: // traitement octet Packet Size
guilhemMBED 3:96e8e5affaad 254 calc_checksumSR1 ^= c;
guilhemMBED 0:37ba45bb0099 255 lenSR=c;
guilhemMBED 0:37ba45bb0099 256 if (lenSR<7) etatSR =0; //impossible
guilhemMBED 0:37ba45bb0099 257 else etatSR = 3;
guilhemMBED 0:37ba45bb0099 258 break;
guilhemMBED 0:37ba45bb0099 259 case 3: // traitement octet ID
guilhemMBED 3:96e8e5affaad 260 calc_checksumSR1 ^= c;
guilhemMBED 0:37ba45bb0099 261 idSR = c;
guilhemMBED 0:37ba45bb0099 262 if (idSR!= data_adress_sensor) etatSR =0; //le capteur n'est pas concerné
guilhemMBED 0:37ba45bb0099 263 else etatSR = 4;
guilhemMBED 0:37ba45bb0099 264 break;
guilhemMBED 0:37ba45bb0099 265 case 4: // traitement octet CMD
guilhemMBED 3:96e8e5affaad 266 calc_checksumSR1 ^= c;
guilhemMBED 0:37ba45bb0099 267 cmdSR = c;
guilhemMBED 0:37ba45bb0099 268 etatSR = 5;
guilhemMBED 0:37ba45bb0099 269 break;
guilhemMBED 0:37ba45bb0099 270 case 5: // traitement octet checkSum1
guilhemMBED 0:37ba45bb0099 271 checksumSR1 = c;
guilhemMBED 0:37ba45bb0099 272 etatSR = 6;
guilhemMBED 0:37ba45bb0099 273 break;
guilhemMBED 0:37ba45bb0099 274 case 6: // traitement octet checkSum2
guilhemMBED 0:37ba45bb0099 275 checksumSR2 = c;
guilhemMBED 0:37ba45bb0099 276 if (lenSR>7) {
guilhemMBED 0:37ba45bb0099 277 etatSR =7;// si le message comporte des datas
guilhemMBED 0:37ba45bb0099 278 } else {
guilhemMBED 0:37ba45bb0099 279 dataSR = 0x00;
guilhemMBED 0:37ba45bb0099 280 etatSR=8;
guilhemMBED 0:37ba45bb0099 281 }
guilhemMBED 0:37ba45bb0099 282 break;
guilhemMBED 0:37ba45bb0099 283 case 7: // octet data (un seul octet dans notre cas)
guilhemMBED 3:96e8e5affaad 284 calc_checksumSR1 ^= c;
guilhemMBED 0:37ba45bb0099 285 dataSR=c;
guilhemMBED 0:37ba45bb0099 286 etatSR =8;
guilhemMBED 0:37ba45bb0099 287 break;
guilhemMBED 0:37ba45bb0099 288 }
guilhemMBED 3:96e8e5affaad 289 if (etatSR==8){// verification des checksum et envoi
guilhemMBED 3:96e8e5affaad 290 calc_checksumSR1 &=0xFE ;
loicmnt 4:6212d7723c16 291 calc_checksumSR2 = (~calc_checksumSR1) & 0xFE;
guilhemMBED 3:96e8e5affaad 292 etatSR = 0;
guilhemMBED 3:96e8e5affaad 293 if ((checksumSR1 == calc_checksumSR1) && (checksumSR2 == calc_checksumSR2)) { // Verification validité de la tramme
guilhemMBED 3:96e8e5affaad 294 envoi(cmdSR,dataSR);// dataSR ne sera utilise que dans les cas de setup
guilhemMBED 3:96e8e5affaad 295 }
guilhemMBED 0:37ba45bb0099 296 }
guilhemMBED 0:37ba45bb0099 297 }
guilhemMBED 0:37ba45bb0099 298
guilhemMBED 0:37ba45bb0099 299 void canRead()
guilhemMBED 0:37ba45bb0099 300 {
guilhemMBED 0:37ba45bb0099 301 can.read(canBuffer[canRempli++]);
guilhemMBED 0:37ba45bb0099 302 if (canRempli==CAN_MAX) {
guilhemMBED 0:37ba45bb0099 303 canRempli = 0;
guilhemMBED 0:37ba45bb0099 304 }
guilhemMBED 0:37ba45bb0099 305 if (canRempli == canVide) { // buffer plein on perd un message
guilhemMBED 0:37ba45bb0099 306 canVide++;
guilhemMBED 0:37ba45bb0099 307 if (canVide == CAN_MAX) canVide = 0;
guilhemMBED 0:37ba45bb0099 308 canPerdu++;
guilhemMBED 0:37ba45bb0099 309 }
guilhemMBED 0:37ba45bb0099 310 }
guilhemMBED 0:37ba45bb0099 311
guilhemMBED 3:96e8e5affaad 312 void envoi(char commande, char data)
guilhemMBED 0:37ba45bb0099 313 {
loicmnt 4:6212d7723c16 314 #if SR==0 // mode CAN
loicmnt 4:6212d7723c16 315 message[1]=commande+0x40; // CMD (doc)
loicmnt 4:6212d7723c16 316 #endif
loicmnt 4:6212d7723c16 317
guilhemMBED 3:96e8e5affaad 318 // Preparation des datas //
guilhemMBED 3:96e8e5affaad 319 switch (commande) {
guilhemMBED 0:37ba45bb0099 320 case send_RGB:
guilhemMBED 3:96e8e5affaad 321 message[OFFSET_DATA+0] = (char)((r & HIGH)>>8); // data
guilhemMBED 3:96e8e5affaad 322 message[OFFSET_DATA+1] = (char) (r & LOW);
guilhemMBED 3:96e8e5affaad 323 message[OFFSET_DATA+2] = (char)((g & HIGH)>>8);
guilhemMBED 3:96e8e5affaad 324 message[OFFSET_DATA+3] = (char) (g & LOW);
loicmnt 4:6212d7723c16 325 message[OFFSET_DATA+4] = (char)((b & HIGH)>>8);
loicmnt 4:6212d7723c16 326 message[OFFSET_DATA+5] = (char) (b & LOW);
loicmnt 4:6212d7723c16 327 DataLen=6;
guilhemMBED 0:37ba45bb0099 328 break;
guilhemMBED 0:37ba45bb0099 329
guilhemMBED 0:37ba45bb0099 330 case send_RED:
guilhemMBED 3:96e8e5affaad 331 message[OFFSET_DATA+0]= (char)((r & HIGH)>>8);
guilhemMBED 3:96e8e5affaad 332 message[OFFSET_DATA+1]= (char) (r & LOW);
guilhemMBED 3:96e8e5affaad 333 DataLen=2;
guilhemMBED 0:37ba45bb0099 334 break;
guilhemMBED 0:37ba45bb0099 335
guilhemMBED 0:37ba45bb0099 336 case send_GREEN:
guilhemMBED 3:96e8e5affaad 337 message[OFFSET_DATA+0]= (char)((g & HIGH)>>8);
guilhemMBED 3:96e8e5affaad 338 message[OFFSET_DATA+1]= (char) (g & LOW);
guilhemMBED 3:96e8e5affaad 339 DataLen=2;
guilhemMBED 0:37ba45bb0099 340 break;
guilhemMBED 0:37ba45bb0099 341
guilhemMBED 0:37ba45bb0099 342 case send_BLUE:
guilhemMBED 3:96e8e5affaad 343 message[OFFSET_DATA+0]= (char)((b & HIGH)>>8);
guilhemMBED 3:96e8e5affaad 344 message[OFFSET_DATA+1]= (char) (b & LOW);
guilhemMBED 3:96e8e5affaad 345 DataLen=2;
guilhemMBED 0:37ba45bb0099 346 break;
guilhemMBED 0:37ba45bb0099 347
guilhemMBED 0:37ba45bb0099 348 case send_PROXIMITY:
guilhemMBED 3:96e8e5affaad 349 message[OFFSET_DATA+0] = (char) a ;
guilhemMBED 3:96e8e5affaad 350 DataLen=1;
guilhemMBED 0:37ba45bb0099 351 break;
guilhemMBED 0:37ba45bb0099 352
guilhemMBED 0:37ba45bb0099 353 case send_COLOR:
loicmnt 4:6212d7723c16 354 message[OFFSET_DATA+0] = color;
guilhemMBED 3:96e8e5affaad 355 DataLen=1;
guilhemMBED 0:37ba45bb0099 356 break;
guilhemMBED 0:37ba45bb0099 357
guilhemMBED 0:37ba45bb0099 358 case setup_LED:
loicmnt 4:6212d7723c16 359 LED.write(data/255.0); // a modifier : ON/OFF seulement
guilhemMBED 3:96e8e5affaad 360 DataLen=0;
guilhemMBED 0:37ba45bb0099 361 break;
guilhemMBED 0:37ba45bb0099 362
guilhemMBED 0:37ba45bb0099 363 case setup_PROXIMITY_THRESHOLD :
guilhemMBED 3:96e8e5affaad 364 proximity_tresh = data;
guilhemMBED 3:96e8e5affaad 365 DataLen=0;
guilhemMBED 0:37ba45bb0099 366 break;
guilhemMBED 0:37ba45bb0099 367 }
guilhemMBED 0:37ba45bb0099 368
guilhemMBED 3:96e8e5affaad 369 Len = DataLen+OFFSET_DATA;//calcul longueur msg
guilhemMBED 3:96e8e5affaad 370
guilhemMBED 3:96e8e5affaad 371
guilhemMBED 3:96e8e5affaad 372 #if SR==1 // format SR //
guilhemMBED 3:96e8e5affaad 373 message[2]= Len;
loicmnt 4:6212d7723c16 374 message[4]=commande+0x40; // CMD (doc)
loicmnt 4:6212d7723c16 375 int j;
guilhemMBED 3:96e8e5affaad 376 // calcul des checksums //
loicmnt 4:6212d7723c16 377 message[5]=0; // checksum1
loicmnt 4:6212d7723c16 378 for(j=2; j<message[2]; j++) {
guilhemMBED 3:96e8e5affaad 379 if ((j!=5)&&(j!=6)) message[5] ^= message[j];
guilhemMBED 0:37ba45bb0099 380 }
guilhemMBED 3:96e8e5affaad 381 message[5] &= 0xFE; // checksum1
loicmnt 4:6212d7723c16 382 message[6] = (~message[5]) & 0xFE;//checksum2
guilhemMBED 3:96e8e5affaad 383
guilhemMBED 3:96e8e5affaad 384 // envoi //
guilhemMBED 3:96e8e5affaad 385 //sr.enable_output(true);
guilhemMBED 3:96e8e5affaad 386 for (j=0; j<message[2]; j++) {
guilhemMBED 3:96e8e5affaad 387 while (!sr.writeable()); // attente liaison libre
guilhemMBED 3:96e8e5affaad 388 sr.putc(message[j]); // ecriture octet par octet
guilhemMBED 3:96e8e5affaad 389 wait_us(100);
guilhemMBED 3:96e8e5affaad 390 #if DEBUG_COM
guilhemMBED 3:96e8e5affaad 391 USB_link.printf("envoi : %x\r\n",message[j]);
guilhemMBED 3:96e8e5affaad 392 #endif
guilhemMBED 3:96e8e5affaad 393 }
loicmnt 4:6212d7723c16 394 // sr.disable_output(true)
guilhemMBED 3:96e8e5affaad 395
guilhemMBED 3:96e8e5affaad 396 #else // format CAN //
guilhemMBED 3:96e8e5affaad 397 can.write(CANMessage(adress_color_sensor,message,Len));
guilhemMBED 3:96e8e5affaad 398 #endif
loicmnt 5:b91bf2db2ea8 399 }