Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: main.cpp
- Revision:
- 4:6212d7723c16
- Parent:
- 3:96e8e5affaad
- Child:
- 5:b91bf2db2ea8
--- a/main.cpp Mon Jul 20 07:14:12 2020 +0000
+++ b/main.cpp Fri Jan 14 17:26:21 2022 +0000
@@ -1,10 +1,9 @@
#include "mbed.h"
#include "glibr.h"
-#include <RawSerial.h>
#define SR 1 // 0 = CAN | 1 = serie
-#define DEBUG_COM 1 // 0 = pas de debug | 1 = print de toutes les tramme serie recue et envoyées
-#define DEBUG_SENS 0 // 0 = pas de debug | 1 = print de la couleur (fait pour tester le capteur en lui même)
+#define DEBUG_COM 0 // 0 = pas de debug | 1 = print de toutes les tramme serie recue et envoyées
+#define DEBUG_SENS 0 // 0 = pas de debug | 1 = print de la couleur (fait pour tester le capteur en lui même)
#if ((DEBUG_COM==1)||(DEBUG_SENS==1))
#define DEBUG_GENERAL 1
@@ -19,7 +18,7 @@
#endif
// Adress
-#define data_adress_sensor 0x00 // pID specifique a chaque capteur (between 0x00 and 0xFD)
+#define data_adress_sensor 0x20 // pID specifique a chaque capteur (between 0x00 and 0xFD)
#define data_adress_general 0xFF // pID génerale pour communiquer avec tout les capteurs
#define adress_color_sensor 0x4B0 // CAN ID pareil pour tout les capteur (seulement pour le CAN)
@@ -48,6 +47,7 @@
glibr capt1(PB_7,PB_6); // I²C initialization : PB_7 = SDA ; PB_6 = SCL
CAN can(PA_11, PA_12);
PwmOut LED(D9);
+DigitalIn srTx(PA_9, PullUp);
// Buffer CAN
CANMessage canBuffer[CAN_MAX];
@@ -103,6 +103,9 @@
+
+
+
bool initialization(void)
{
#if DEBUG_GENERAL
@@ -125,6 +128,93 @@
}
}
+
+int main()
+{
+#if DEBUG_GENERAL
+ if (initialization()) USB_link.printf("Init finie\r\n");
+ else USB_link.printf("Erreur pendant l'init\r\n");
+#else
+ initialization();
+#endif
+
+ if(SR==0) { // liaison CAN selectionné
+#if DEBUG_COM
+ int adColor = adress_color_sensor;
+ int adSensor = data_adress_sensor;
+ USB_link.printf("type de com : CAN\r\n");
+ USB_link.printf("ID can : %03X\r\ndata ID : %02X\r\n", adColor, adSensor);
+#endif
+ can.attach(canRead);
+ // le premier octet est toujours pareil
+ message[0] = data_adress_sensor;
+
+ }
+ else if (SR==1) { // liaison Serie selectionnée
+#if DEBUG_COM
+ USB_link.printf("type de com : Serie\r\n");
+ USB_link.printf("Id : %x\r\n",data_adress_sensor);
+#endif
+ sr.attach(&srRead);
+ // octets toujours pareil :
+ message[0]=0xff; // Start of packet
+ message[1]=0xff;
+ message[3]= data_adress_sensor; // pID
+ }
+
+ while(1) {
+
+ // acquisition capteurs //
+ capt1.readRedLight(r);
+ capt1.readGreenLight(g);
+ capt1.readBlueLight(b);
+ capt1.readProximity(a);
+
+ // calcul couleur //
+ if (a<proximity_tresh) {
+ color = 0 ; // 0 Rien
+ }
+ else if ((r > g )&&(r > b )) {
+ color = 1 ; // 1 rouge
+ }
+ else if ((g > r )&&(g > b )) {
+ color = 2 ; // 2 vert
+ }
+ else if ((b > r )&&(b > g )) {
+ color = 3 ; // 3 bleu
+ }
+ else {
+ color = 4 ; // 4 noir ou blanc
+ }
+#if DEBUG_SENS
+ USB_link.printf("rouge : %x, vert : %x, bleu : %x ",r, g, b);
+ USB_link.printf("color : %x \r\n", color);
+ USB_link.printf("color : %hu \r\n", color);
+ wait(0.5);
+#endif
+
+
+ // liaison CAN //
+ if (canRempli != canVide) { // si le buffer CAN n'est pas vide
+ canVide++;
+ if (canVide == CAN_MAX) canVide = 0;
+ if ((canBuffer[canRempli-1].id==adress_color_sensor)&((canBuffer[canRempli-1].data[0]==data_adress_general)|(canBuffer[canRempli-1].data[0]==data_adress_sensor))) {
+ if (canBuffer[canRempli-1].len==3){
+ envoi(canBuffer[canRempli-1].data[1],canBuffer[canRempli-1].data[2]);
+ } else {
+ envoi(canBuffer[canRempli-1].data[1],0);
+ }
+ }
+ }
+
+ // liaison serie //
+ if (srRempli != srVide) { // si le buffer serie n'est pas vide
+ srTraitement(); // traitement de la tramme sr
+ }
+ }
+}
+
+
void srRead()
{
srBuffer[srRempli++] = sr.getc(); //stockage nouvel octet dans le buffer
@@ -148,13 +238,12 @@
#endif
switch (etatSR) {
case 0: // Verification premier octet header (FF)
- calc_checksumSR1 = c;
if (c==0xFF) {
etatSR = 1;
}
break;
case 1: // Verification dexième octet header (FF)
- calc_checksumSR1 ^= c; //update checksum
+ calc_checksumSR1 = 0;
if (c==0xFF) {
etatSR = 2;
} else {
@@ -199,7 +288,7 @@
}
if (etatSR==8){// verification des checksum et envoi
calc_checksumSR1 &=0xFE ;
- calc_checksumSR2 = (~calc_checksumSR1 & 0xFE);
+ calc_checksumSR2 = (~calc_checksumSR1) & 0xFE;
etatSR = 0;
if ((checksumSR1 == calc_checksumSR1) && (checksumSR2 == calc_checksumSR2)) { // Verification validité de la tramme
envoi(cmdSR,dataSR);// dataSR ne sera utilise que dans les cas de setup
@@ -222,9 +311,10 @@
void envoi(char commande, char data)
{
- int j;
- message[4]=commande+0x40; // CMD (doc)
-
+#if SR==0 // mode CAN
+ message[1]=commande+0x40; // CMD (doc)
+#endif
+
// Preparation des datas //
switch (commande) {
case send_RGB:
@@ -232,8 +322,9 @@
message[OFFSET_DATA+1] = (char) (r & LOW);
message[OFFSET_DATA+2] = (char)((g & HIGH)>>8);
message[OFFSET_DATA+3] = (char) (g & LOW);
- message[OFFSET_DATA+4] = (char) a ;
- DataLen=5;
+ message[OFFSET_DATA+4] = (char)((b & HIGH)>>8);
+ message[OFFSET_DATA+5] = (char) (b & LOW);
+ DataLen=6;
break;
case send_RED:
@@ -260,12 +351,12 @@
break;
case send_COLOR:
- message[OFFSET_DATA+0]=color;
+ message[OFFSET_DATA+0] = color;
DataLen=1;
break;
case setup_LED:
- LED.write(data/258.0); // a modifier : ON/OFF seulement
+ LED.write(data/255.0); // a modifier : ON/OFF seulement
DataLen=0;
break;
@@ -280,14 +371,15 @@
#if SR==1 // format SR //
message[2]= Len;
-
+ message[4]=commande+0x40; // CMD (doc)
+ int j;
// calcul des checksums //
- message[5]=0xFF; // checksum1
- for(j=1; j<message[2]; j++) {
+ message[5]=0; // checksum1
+ for(j=2; j<message[2]; j++) {
if ((j!=5)&&(j!=6)) message[5] ^= message[j];
}
message[5] &= 0xFE; // checksum1
- message[6] = (~message[5] & 0xFE);//checksum2
+ message[6] = (~message[5]) & 0xFE;//checksum2
// envoi //
//sr.enable_output(true);
@@ -299,81 +391,9 @@
USB_link.printf("envoi : %x\r\n",message[j]);
#endif
}
- // sr.diasable_output(true)
+ // sr.disable_output(true)
#else // format CAN //
can.write(CANMessage(adress_color_sensor,message,Len));
#endif
}
-
-int main()
-{
-#if DEBUG_GENERAL
- if (initialization()) USB_link.printf("Init finie\r\n");
- else USB_link.printf("Erreur pendant l'init\r\n");
-#else
- initialization();
-#endif
-
- if(SR==0) { // liaison CAN selectionné
-#if DEBUG_COM
- USB_link.printf("type de com : CAN\r\n");
- USB_link.printf("ID can : %h\r\ndata ID : %h\r\n",adress_color_sensor,data_adress_sensor);
-#endif
- can.attach(canRead);
- // le premier octet est toujours pareil
- message[0] = data_adress_sensor;
-
- } else if (SR==1) { // liaison Serie selectionnée
-#if DEBUG_COM
- USB_link.printf("type de com : Serie\r\n");
- USB_link.printf("Id : %x\r\n",data_adress_sensor);
-#endif
- sr.attach(&srRead);
- // octets toujours pareil :
- message[0]=0xff; // Start of packet
- message[1]=0xff;
- message[3]= data_adress_sensor; // pID
- }
-
- while(1) {
-
- // acquisition capteurs //
- capt1.readRedLight(r);
- capt1.readGreenLight(g);
- capt1.readBlueLight(b);
- capt1.readProximity(a);
-
- // calcul couleur //
- if (a<proximity_tresh) {
- color = 0 ; // 0 Rien
- } else if (r > g ) {
- color = 1 ; // 1 rouge
- } else {
- color = 2 ; // 2 vert
- }
-#if DEBUG_SENS
- USB_link.printf("color : %hu \r\n", color);
- wait(0.5);
-#endif
-
-
- // liaison CAN //
- if (canRempli != canVide) { // si le buffer CAN n'est pas vide
- canVide++;
- if (canVide == CAN_MAX) canVide = 0;
- if ((canBuffer[canRempli-1].id==adress_color_sensor)&((canBuffer[canRempli-1].data[0]==data_adress_general)|(canBuffer[canRempli-1].data[0]==data_adress_sensor))) {
- if (canBuffer[canRempli-1].len==3){
- envoi(canBuffer[canRempli-1].data[1],canBuffer[canRempli-1].data[2]);
- } else {
- envoi(canBuffer[canRempli-1].data[1],0);
- }
- }
- }
-
- // liaison serie //
- if (srRempli != srVide) { // si le buffer serie n'est pas vide
- srTraitement(); // traitement de la tramme sr
- }
- }
-}