Automate écran capacitif
Dependencies: BSP_DISCO_F469NI LCD_DISCO_F469NI SeeedStudioTFTv2 TFT_fonts mbed
Fork of DISCO-F469NI_LCD_demo by
Diff: demo_1.cpp
- Revision:
- 2:2182df2d7810
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/demo_1.cpp Fri Mar 31 15:36:26 2017 +0000 @@ -0,0 +1,701 @@ +#include "mbed.h" +#include "TS_DISCO_F469NI.h" +#include "LCD_DISCO_F469NI.h" +#include "F469_GUI.hpp" +#include "ident_crac.h" +#include <CAN.h> +#include "fonts.h" + +#define BLEU 0xFF0000FF +#define ROUGE 0xFFFF0000 +#define VERT 0xFF7FFF00 +#define JAUNE 0xFF8F8F25 +#define BLANC 0xFF000000 +#define SIZE_FIFO 16 + +CAN can1(PB_8, PB_9); //laisser le 1er CAN car probleme sinon +CAN can2(PB_5, PB_13); + +CANMessage msgRxBuffer[SIZE_FIFO]; + +Ticker ticker; +TS_DISCO_F469NI ts; +LCD_DISCO_F469NI lcd; +DigitalOut led1(LED1); +DigitalOut led2(LED2); +Timeout timeout; +Timeout AffTime; +Timer timerAck; +Timer timer; + +unsigned char test[32] = {32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32}; + +char counter = 0; +char check; +char Jack = 1; +int check_cartes = 0, demo_fin = 0; +char Ack_strat = 0; +signed char Strat = 0; + +void SendRawId (unsigned short id); +void SelectionStrat (unsigned char numeroStrat); +void Setflag(void); +void canProcessRx(void); +void canRx_ISR(void); +signed char Bouton_Strat (void); +void GoStraight (signed short distance,unsigned char recalage, unsigned short newValue, unsigned char isEnchainement); + +typedef enum {ATT, CHOIX, DEMO, DEMO_EN_COURS, SELECT_SIDE, TACTIQUE, DETAILS, LAUNCH, WAIT_JACK, FIN} T_etat; +T_etat etat = ATT; +unsigned char FIFO_ecriture=0; //Position du fifo pour la reception CAN +signed char FIFO_lecture=0;//Position du fifo de lecture des messages CAN +int flagSendCan=1; +unsigned char Cote = 0; //0 -> bleu | 1 -> jaune + +int main() +{ + ts.Init(lcd.GetXSize(), lcd.GetYSize()); + TS_StateTypeDef TS_State; + CANMessage trame_Tx = CANMessage(); + can2.frequency(1000000); // fréquence de travail 1Mbit/s + can2.attach(&canRx_ISR); //interrutpion can en reception + int cpt_dizaine,cpt_unite; + + //Initialisation CAN + trame_Tx.len = 1; + trame_Tx.format = CANStandard; + trame_Tx.type = CANData; + + /////////////////DEFINITION DES BOUTONS//////////////////// + Button COTE_BLEU(20, 25, 755, 200, "Bleu"); + Button COTE_JAUNE(20, 255, 500, 200, "Jaune"); + Button RETOUR (530, 255, 245, 200, "--Precedent--"); + Button LANCER (20, 255, 230, 200, "--LANCER--"); + Button CHECK (275, 255, 230, 200, "Valider"); + Button MATCH (10, 25, 780, 200, "Match"); + Button DEMONSTRATION (10, 255, 780, 200, "Demo"); + Button TEST_MOTEUR(20, 25, 200, 200, "Moteur"); + Button TEST_BRAS(240, 25, 200, 200, "Bras"); + Button FORCE_LAUNCH(530, 255, 245, 200, "Force Launch"); + //////////////////////////////////////////////////////////// + + signed char Strategie = 0; //N° de la strategie (1-10) + + lcd.SetBackColor(LCD_COLOR_WHITE); + lcd.SetTextColor(LCD_COLOR_BLACK); + lcd.Clear (LCD_COLOR_WHITE); + lcd.SetFont(&Font24); + lcd.DisplayStringAt(0, 200, (uint8_t *)"Verification des cartes ...", CENTER_MODE); + FORCE_LAUNCH.Draw(0xFFFF0000, 0); + + while(1) + { + canProcessRx(); + ts.GetState(&TS_State); + wait(0.1); + switch (etat) + { + case ATT : + if(check_cartes == 1) + { + etat = CHOIX; + check_cartes = 0; + + lcd.Clear (LCD_COLOR_WHITE); + lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"Match ou demonstration ?", CENTER_MODE); + DEMONSTRATION.Draw(LCD_COLOR_LIGHTGREEN, 0); + MATCH.Draw(0xFFF01010, 0); + //canProcessRx(); + } + if (FORCE_LAUNCH.Touched()) + { + //etat = CHOIX; + SendRawId(ECRAN_ALL_CHECK); + etat = CHOIX; + while(FORCE_LAUNCH.Touched()) + canProcessRx(); + + lcd.Clear (LCD_COLOR_WHITE); + lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"Match ou demonstration ?", CENTER_MODE); + DEMONSTRATION.Draw(LCD_COLOR_LIGHTGREEN, 0); + MATCH.Draw(0xFFF01010, 0); + } + break; + + case CHOIX : + //canProcessRx(); + if(DEMONSTRATION.Touched()) + { + etat = DEMO; + while(DEMONSTRATION.Touched()) + canProcessRx(); + + lcd.Clear(LCD_COLOR_WHITE); + TEST_MOTEUR.Draw(0xFFF0F0F0, 0); + TEST_BRAS.Draw(0xFFF0F0F0, 0); + RETOUR.Draw(0xFFFF0000, 0); + trame_Tx.id = 0x602; + trame_Tx.data[0] = 0; + can2.write(trame_Tx); + } + + if(MATCH.Touched()) + { + etat = SELECT_SIDE; + while(MATCH.Touched()) + canProcessRx(); + + lcd.Clear(LCD_COLOR_WHITE); + lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"Choisis un cote gros", CENTER_MODE); + COTE_BLEU.Draw(0xFF0070FF, 0); + COTE_JAUNE.Draw(0xFFFFF000, 0); + RETOUR.Draw(0xFFFF0000, 0); + trame_Tx.id = 0x602; + } + break; + + case DEMO : + + trame_Tx.id=0x601; + //canProcessRx(); + if(TEST_MOTEUR.Touched()) + { + Strat = 0x10; + trame_Tx.data[0] = Strat; + while(TEST_MOTEUR.Touched()) + canProcessRx(); + can2.write(trame_Tx); + TEST_MOTEUR.Draw(0xFFF0F0F0, 0); + //etat = DEMO_EN_COURS; + } + + if(TEST_BRAS.Touched()) + { + Strat = 0x11; + trame_Tx.data[0] = Strat; + while(TEST_BRAS.Touched()) + canProcessRx(); + can2.write(trame_Tx); + TEST_MOTEUR.Draw(0xFFF0F0F0, 0); + //etat = DEMO_EN_COURS; + } + + if(RETOUR.Touched()) + { + etat = CHOIX; + while(RETOUR.Touched()) + canProcessRx(); + + lcd.Clear (LCD_COLOR_WHITE); + lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"Match ou demonstration ?", CENTER_MODE); + DEMONSTRATION.Draw(LCD_COLOR_LIGHTGREEN, 0); + MATCH.Draw(0xFFF01010, 0); + } + //SelectionStrat(trame_Tx.data[0]); + if (Ack_strat == 1) + { + etat = DEMO_EN_COURS; + lcd.Clear(LCD_COLOR_WHITE); + lcd.SetFont(&Font24); + lcd.DisplayStringAt(0, 190, (uint8_t *)"DEMONSTRATION EN COURS", CENTER_MODE); + Ack_strat = 0; + } + + break; + + case DEMO_EN_COURS: + + if (demo_fin == 1) + { + etat = DEMO; + lcd.Clear(LCD_COLOR_WHITE); + TEST_MOTEUR.Draw(0xFFF0F0F0, 0); + TEST_BRAS.Draw(0xFFF0F0F0, 0); + RETOUR.Draw(0xFFFF0000, 0); + trame_Tx.id = 0x602; + trame_Tx.data[0] = 0; + can2.write(trame_Tx); + } + Ack_strat = 0; + + case SELECT_SIDE : + + //canProcessRx(); + if(COTE_BLEU.Touched()) + { + Cote = 0x0; + trame_Tx.data[0] = Cote; + can2.write(trame_Tx); + while(COTE_BLEU.Touched()) + canProcessRx(); + } + + if(COTE_JAUNE.Touched()) + { + Cote = 0x1; + trame_Tx.data[0] = Cote; + can2.write(trame_Tx); + while(COTE_JAUNE.Touched()) + canProcessRx(); + } + + if(RETOUR.Touched()) + { + etat = CHOIX; + while(RETOUR.Touched()) + canProcessRx(); + + lcd.Clear (LCD_COLOR_WHITE); + lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"Match ou demonstration ?", CENTER_MODE); + DEMONSTRATION.Draw(LCD_COLOR_LIGHTGREEN, 0); + MATCH.Draw(0xFFF01010, 0); + } + break; + + case TACTIQUE : + if (Cote == 0){ + lcd.Clear(0xFF0070FF); + lcd.SetBackColor(0xFF0070FF); + } + else if (Cote == 1){ + lcd.Clear(0xFFFFF000); + lcd.SetBackColor(0xFFFFF000); + } + else { + lcd.Clear(0xFF0070FF); + lcd.SetBackColor(0xFF0070FF); + } + + lcd.SetTextColor(LCD_COLOR_BLACK); + lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"Choisis une strat gros", CENTER_MODE); + + Strategie = Bouton_Strat(); // retourne valeur de Strategie si bouton strat renvoi -1 on reviens en arriere + if (Strategie == -1) + { + etat = SELECT_SIDE; + lcd.Clear(LCD_COLOR_WHITE); + lcd.SetBackColor(LCD_COLOR_WHITE); + lcd.SetTextColor(LCD_COLOR_BLACK); + lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"Choisis un cote gros", CENTER_MODE); + COTE_BLEU.Draw(0xFF0070FF, 0); + COTE_JAUNE.Draw(0xFFFFF000, 0); + RETOUR.Draw(0xFFFF0000, 0); + trame_Tx.id = 0x602; + } + else + { + etat = DETAILS; + lcd.Clear(LCD_COLOR_WHITE); + CHECK.Draw(0xFF00FF00); + RETOUR.Draw(0xFFFF0000); + SelectionStrat(Strategie); + } + + break; + + case DETAILS : + //canProcessRx(); + if (CHECK.Touched()) + { + SendRawId(ECRAN_START_MATCH); + //etat = WAIT_JACK; + while(CHECK.Touched()) + canProcessRx(); + } + + if(RETOUR.Touched()) + { + etat = TACTIQUE; + while(RETOUR.Touched()); + } + break; + + + case WAIT_JACK : + lcd.SetBackColor(LCD_COLOR_WHITE); + lcd.SetTextColor(LCD_COLOR_BLACK); + lcd.Clear(LCD_COLOR_WHITE); + lcd.SetFont(&Font24); + if (Cote == 0){ + lcd.Clear(0xFF0070FF); + lcd.SetBackColor(0xFF0070FF); + } + else if (Cote == 1){ + lcd.Clear(0xFFFFF000); + lcd.SetBackColor(0xFFFFF000); + } + else { + lcd.Clear(0xFF0070FF); + lcd.SetBackColor(0xFF0070FF); + } + SendRawId(DEBUG_FAKE_JAKE); // PERMET DE SIMULER LE RETRAIT DU JACK POUR QUE LE ROBOT DEMARRE APRES LA VALIDATION DE LA STRAT + /* while (Jack == 1){ + lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"En attente du Jack", CENTER_MODE); + }*/ + cpt_dizaine = 57, cpt_unite = 48; + while (cpt_dizaine !=47){ + lcd.DisplayChar(390,190,cpt_dizaine); + while (cpt_unite != 47) + { + lcd.DisplayChar(410,190,cpt_unite);//la fonction affiche un caractere en ASCII d'ou la valeur de cpt + cpt_unite--; + wait(1); + } + cpt_dizaine--; + cpt_unite = 57; + } + lcd.DisplayStringAt(0, 190, (uint8_t *)"FIN DU MATCH", CENTER_MODE); + wait(5); + etat = FIN; + break; + + case FIN : + lcd.Clear (LCD_COLOR_WHITE); + lcd.SetBackColor(LCD_COLOR_WHITE); + lcd.SetFont(&Font24); + lcd.DisplayStringAt(0, 170, (uint8_t *)"REDEMARAGE", CENTER_MODE); + lcd.DisplayStringAt(0, 190, (uint8_t *)"NECESSAIRE", CENTER_MODE); + while(1); // force le redemarage du robot + break; + + } + + } +} + + +void SendRawId (unsigned short id) +{ + CANMessage msgTx=CANMessage(); + msgTx.id=id; + msgTx.len=0; + can2.write(msgTx); +} + +void SelectionStrat (unsigned char numeroStrat) +{ + lcd.SetBackColor(LCD_COLOR_WHITE); + lcd.SetTextColor(LCD_COLOR_BLACK); + lcd.SetFont(&Font24); + switch (numeroStrat) + { + case 0x1 : + //description de Strategie n°1 + lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 1 :", LEFT_MODE); + break; + + case 0x2 : + //description de Strategie n°2 + lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 2 :", LEFT_MODE); + break; + + case 0x3 : + //description de Strategie n°3 + lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 3 :", LEFT_MODE); + break; + + case 0x4 : + //description de Strategie n°4 + lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 4 :", LEFT_MODE); + break; + + case 0x5 : + //description de Strategie n°5 + lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 5 :", LEFT_MODE); + break; + + case 0x6 : + //description de Strategie n°5 + lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 6 :", LEFT_MODE); + break; + + case 0x7 : + //description de Strategie n°5 + lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 7 :", LEFT_MODE); + break; + + case 0x8 : + //description de Strategie n°5 + lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 8 :", LEFT_MODE); + break; + + case 0x9 : + //description de Strategie n°5 + lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 9 :", LEFT_MODE); + break; + + case 0xA : + //description de Strategie n°5 + lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 10 :", LEFT_MODE); + break; + + case 0x10 : + lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 10 :", LEFT_MODE); + break; + } +} + +void Setflag(void) +{ + flagSendCan = 1; +} + +void canProcessRx(void) +{ + static signed char FIFO_occupation=0,FIFO_max_occupation=0; + char useless1 = 0; + + FIFO_occupation=FIFO_ecriture-FIFO_lecture; + if(FIFO_occupation<0) + FIFO_occupation=FIFO_occupation+SIZE_FIFO; + if(FIFO_max_occupation<FIFO_occupation) + FIFO_max_occupation=FIFO_occupation; + if(FIFO_occupation!=0) { + + switch(msgRxBuffer[FIFO_lecture].id) { + case ECRAN_PRINTF_1: + for(useless1 = 0; useless1 <8; useless1++) { + test[useless1] = msgRxBuffer[FIFO_lecture].data[useless1]; + } + //updateDisplay(); + break; + case ECRAN_PRINTF_2: + for(useless1 = 0; useless1 <8; useless1++) { + test[useless1+8] = msgRxBuffer[FIFO_lecture].data[useless1]; + } + //updateDisplay(); + //Ecrire_CANtxt(test); + break; + case ECRAN_PRINTF_3: + for(useless1 = 0; useless1 <8; useless1++) { + test[useless1+2*8] = msgRxBuffer[FIFO_lecture].data[useless1]; + } + //updateDisplay(); + //Ecrire_CANtxt(test); + break; + case ECRAN_PRINTF_4: + for(useless1 = 0; useless1 <8; useless1++) { + test[useless1+3*8] = msgRxBuffer[FIFO_lecture].data[useless1]; + } + //updateDisplay(); + //Ecrire_CANtxt(test); + break; + case ECRAN_PRINTF_CLEAR: + etat = CHOIX; + break; + case CHECK_IHM: + SendRawId(ALIVE_IHM); + break; + case RESET_IHM: + etat = CHOIX; + break; + case CHECK_BALISE: + //Check[1].color = Orange; + //DrawChecks(); + break; + case ALIVE_BALISE: + //Check[1].color = Green; + //DrawChecks(); + break; + case CHECK_MOTEUR: + //Check[2].color = Orange; + //DrawChecks(); + break; + case ALIVE_MOTEUR: + //Check[2].color = Green; + //DrawChecks(); + break; + case CHECK_ACTIONNEURS: + //Check[3].color = Orange; + //DrawChecks(); + break; + case ALIVE_ACTIONNEURS: + //Check[3].color = Green; + //DrawChecks(); + break; + case ECRAN_ALL_CHECK: + check_cartes=1; + //DrawEcran(1); + //EcranActuel = 1; + //menusOnEcranActuel = Liste_ecrans[EcranActuel-1].menus; + break; + case ECRAN_ACK_STRAT: + if (msgRxBuffer[FIFO_lecture].data[0] == Strat) + Ack_strat = 1; + break; + case ECRAN_ACK_COLOR: + if (etat != DEMO) + etat = TACTIQUE; + break; + case ECRAN_ACK_START_MATCH: + if (etat == DEMO_EN_COURS) + { + SendRawId(DEBUG_FAKE_JAKE); + } + else + { + etat = WAIT_JACK; + } + break; + case GLOBAL_START: + Jack=0; + break; + + case DEBUG_STRATEGIE_AUTOMATE : + if (msgRxBuffer[FIFO_lecture].data[0] == 19) { + demo_fin = 1; + } + break; + + default: + break; + } + FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO; + } +} + +void canRx_ISR (void) +{ + if (can2.read(msgRxBuffer[FIFO_ecriture])) { + led2 = !led2; + if(msgRxBuffer[FIFO_ecriture].id==RESET_IHM) + lcd.DisplayStringAt(0, LINE(6), (uint8_t *)"Erreur", CENTER_MODE);//mbed_reset(); + else FIFO_ecriture=(FIFO_ecriture+1)%SIZE_FIFO; + } +} + +signed char Bouton_Strat (void) +{ + CANMessage msgTx=CANMessage(); + msgTx.id=0x601; + msgTx.len=1; + + Button STRAT_1 (20, 10, 150, 150, "Strategie 1"); + Button STRAT_2 (180, 10, 150, 150, "Strategie 2"); + Button STRAT_3 (340, 10, 150, 150, "Strategie 3"); + Button STRAT_4 (20, 165, 150, 150, "Strategie 4"); + Button STRAT_5 (180, 165, 150, 150, "Strategie 5"); + Button STRAT_6 (340, 165, 150, 150, "Strategie 6"); + Button STRAT_7 (20, 320, 150, 150, "Strategie 7"); + Button STRAT_8 (180, 320, 150, 150, "Strategie 8"); + Button STRAT_9 (340, 320, 150, 150, "Strategie 9"); + Button STRAT_10 (530, 25, 245, 200, "Strategie 10"); + Button RETOUR (530, 255, 245, 200, "--Precedent--"); + //Definition des boutons + + Ack_strat = 0; + Strat = 0; + STRAT_1.Draw(0xFFF0F0F0, 0); + STRAT_2.Draw(0xFFF0F0F0, 0); + STRAT_3.Draw(0xFFF0F0F0, 0); + STRAT_4.Draw(0xFFF0F0F0, 0); + STRAT_5.Draw(0xFFF0F0F0, 0); + STRAT_6.Draw(0xFFF0F0F0, 0); + STRAT_7.Draw(0xFFF0F0F0, 0); + STRAT_8.Draw(0xFFF0F0F0, 0); + STRAT_9.Draw(0xFFF0F0F0, 0); + STRAT_10.Draw(0xFFF0F0F0, 0); + RETOUR.Draw(0xFFFF0000, 0); + + while(Ack_strat == 0) + { + canProcessRx(); + if (RETOUR.Touched()) + return -1; + while(RETOUR.Touched()); + //////////////////////////////STRATEGIE N°1 + if (STRAT_1.Touched()){ + Strat = 1; + msgTx.data[0] = 0x1; + can2.write(msgTx); + while(STRAT_1.Touched()); + } + /////////////////////////////STRATEGIE N°2 + if (STRAT_2.Touched()){ + Strat = 2; + msgTx.data[0] = 0x2; + can2.write(msgTx); + while(STRAT_2.Touched()); + } + //////////////////////////////STRATEGIE N°3 + if (STRAT_3.Touched()){ + Strat = 3; + msgTx.data[0] = 0x3; + can2.write(msgTx); + while(STRAT_3.Touched()); + } + /////////////////////////////STRATEGIE N°4 + if (STRAT_4.Touched()){ + Strat = 4; + msgTx.data[0] = 0x4; + can2.write(msgTx); + while(STRAT_4.Touched()); + } + ///////////////////////////////STRATEGIE N°5 + if (STRAT_5.Touched()){ + Strat = 5; + msgTx.data[0] = 0x5; + can2.write(msgTx); + while(STRAT_5.Touched()); + } + ////////////////////////////////STRATEGIE N°6 + if (STRAT_6.Touched()){ + Strat = 6; + msgTx.data[0] = 0x6; + can2.write(msgTx); + while(STRAT_6.Touched()); + } + /////////////////////////////////STRATEGIE N°7 + if (STRAT_7.Touched()){ + Strat = 7; + msgTx.data[0] = 0x7; + can2.write(msgTx); + while(STRAT_7.Touched()); + } + /////////////////////////////////STRATEGIE N°8 + if (STRAT_8.Touched()){ + Strat = 8; + msgTx.data[0] = 0x8; + can2.write(msgTx); + while(STRAT_8.Touched()); + } + /////////////////////////////////STRATEGIE N°9 + if (STRAT_9.Touched()){ + Strat = 9; + msgTx.data[0] = 0x9; + can2.write(msgTx); + while(STRAT_9.Touched()); + } + ///////////////////////////////////STRATEGIE N°10 + if (STRAT_10.Touched()){ + Strat = 10; + msgTx.data[0] = 0xA; + can2.write(msgTx); + while(STRAT_10.Touched()); + } + } + return Strat; +} + +//FONCTION DE L'ASSERVISSEMENT POUR LA DEMONSTRATION +void GoStraight (signed short distance,unsigned char recalage, unsigned short newValue, unsigned char isEnchainement) +{ + CANMessage msgTx=CANMessage(); + msgTx.id=ASSERVISSEMENT_RECALAGE; + msgTx.len=6; + msgTx.format=CANStandard; + msgTx.type=CANData; + // x sur 2 octets + msgTx.data[0]=(unsigned char)distance; + msgTx.data[1]=(unsigned char)(distance>>8); + //Recalage sur 1 octet + msgTx.data[2]=recalage; + //Valeur du recalage sur 2 octets + msgTx.data[3]=(unsigned char)newValue; + msgTx.data[4]=(unsigned char)(newValue>>8); + //Enchainement sur 1 octet + msgTx.data[5]=isEnchainement; + + can1.write(msgTx); + //wait_ms(500); +} \ No newline at end of file