Programme carte strategie (disco)
Dependencies: mbed SerialHalfDuplex SDFileSystem DISCO-F469NI_portrait liaison_Bluetooth ident_crac
Diff: Strategie/Strategie.cpp
- Revision:
- 38:76f886a1c8e6
- Parent:
- 37:fca332b64b42
- Child:
- 40:21bb685b553b
--- a/Strategie/Strategie.cpp Thu May 03 22:35:27 2018 +0000 +++ b/Strategie/Strategie.cpp Wed May 09 19:36:20 2018 +0000 @@ -67,6 +67,9 @@ char counter = 0; char check; char Jack = 1; +short SCORE_GLOBAL=10; +short SCORE_GR=0; +short SCORE_PR=0; int flag = 0, flag_strat = 0, flag_timer; char Ack_strat = 0; @@ -108,7 +111,7 @@ T_etat etat = INIT; E_stratGameEtat gameEtat = ETAT_CHECK_CARTES; E_stratGameEtat lastEtat = ETAT_CHECK_CARTES; - +E_Stratposdebut etat_pos=RECALAGE_1; /////////////////DEFINITION DES BOUTONS//////////////////// Button COTE_VERT(0, 25, 400, 300, "VERT"); @@ -166,15 +169,15 @@ #ifdef ROBOT_BIG -unsigned short id_check[NOMBRE_CARTES]= {CHECK_MOTEUR,CHECK_BALISE,CHECK_ACTIONNEURS_AVANT,CHECK_ACTIONNEURS_ARRIERE}; -unsigned short id_alive[NOMBRE_CARTES]= {ALIVE_MOTEUR,ALIVE_BALISE,ALIVE_ACTIONNEURS_AVANT,ALIVE_ACTIONNEURS_ARRIERE}; +unsigned short id_check[NOMBRE_CARTES]= {CHECK_MOTEUR,CHECK_BALISE}; +unsigned short id_alive[NOMBRE_CARTES]= {ALIVE_MOTEUR,ALIVE_BALISE}; InterruptIn jack(PG_11); // entrée analogique en interruption pour le jack #else -unsigned short id_check[NOMBRE_CARTES]= {CHECK_MOTEUR}; -unsigned short id_alive[NOMBRE_CARTES]= {ALIVE_MOTEUR}; +unsigned short id_check[NOMBRE_CARTES]= {CHECK_MOTEUR,CHECK_BALISE}; +unsigned short id_alive[NOMBRE_CARTES]= {ALIVE_MOTEUR,ALIVE_BALISE}; InterruptIn jack(PG_11); // entrée analogique en interruption pour le jack @@ -293,8 +296,8 @@ ligne=0; char aff[10]="toto"; sprintf(aff,"%lf ",Var); - lcd.DisplayStringAt(120, LINE(5+(ligne)), (uint8_t *)aff, LEFT_MODE); - ligne++; + lcd.DisplayStringAt(120, LINE(15+(ligne)), (uint8_t *)aff, LEFT_MODE); + //ligne++; } @@ -353,20 +356,7 @@ lcd.DisplayStringAt(110,650 , (uint8_t *)"Balise", LEFT_MODE); //////////////////////////////////////// - FORCE_LAUNCH.Draw(0xFFFF0000, 0); - - /*while(flag == 0) - { - ts.GetState(&TS_State); - canProcessRx(); - if (FORCE_LAUNCH.Touched()) - { - etat = CHOIX; - gameEtat = ETAT_CONFIG; - flag = 1; - while(FORCE_LAUNCH.Touched()); - } - }*/ + FORCE_LAUNCH.Draw(0xFFFF0000, 0); etat=ATT; break; @@ -570,7 +560,7 @@ COLOR_ORANGE.Draw(ORANGE,0); COLOR_JAUNE.Draw(JAUNE,0); COLOR_VERT.Draw(VERT,0); - COLOR_BLEU.Draw(VERT,0); + COLOR_BLEU.Draw(BLEU,0); lcd.SetBackColor(LCD_COLOR_WHITE); lcd.SetTextColor(NOIR); @@ -842,7 +832,6 @@ canProcessRx(); if(COTE_VERT.Touched()) { - liaison_Tx.envoyer(0x30,3,"123"); Cote = 0x0; InversStrat = Cote; etat = TACTIQUE; @@ -887,12 +876,12 @@ lcd.SetBackColor(VERT); } else if (Cote == 1){ - lcd.Clear(JAUNE); - lcd.SetBackColor(JAUNE); + lcd.Clear(ORANGE); + lcd.SetBackColor(ORANGE); } else { - lcd.Clear(VERT); - lcd.SetBackColor(VERT); + lcd.Clear(BLEU); + lcd.SetBackColor(BLEU); } lcd.SetTextColor(LCD_COLOR_BLACK); @@ -954,8 +943,8 @@ lcd.SetBackColor(VERT); } else if (Cote == 1){ - lcd.Clear(JAUNE); - lcd.SetBackColor(JAUNE); + lcd.Clear(ORANGE); + lcd.SetBackColor(ORANGE); } else { lcd.Clear(VERT); @@ -970,28 +959,43 @@ break; case COMPTEUR: - /*cptf=gameTimer.read(); + cptf=gameTimer.read(); lcd.SetTextColor(LCD_COLOR_BLACK); - cpt=int(cptf); + cpt=(int)cptf; if(cpt != cpt1){ lcd.Clear(VERT); - affichage_compteur(100-cpt); + // affichage_compteur(100-cpt); + affichage_compteur(SCORE_PR); + #ifdef ROBOT_BIG + affichage_var(SCORE_GR); + #else + affichage_var(SCORE_PR); + #endif + if(liaison_pr.paquet_en_attente()){ + PaquetDomotique *paquet=liaison_pr.lire(); + if(paquet->identifiant==PAQUET_IDENTIFIANT_AJOUTERSCORE){ + SCORE_PR+=convertir_score(paquet); + } + delete paquet; + } } cpt1=cpt; flag_timer=0; - affichage_debug(gameEtat); + //affichage_debug(gameEtat); lcd.SetBackColor(LCD_COLOR_WHITE); - */ + break; case FIN : lcd.Clear (LCD_COLOR_WHITE); lcd.SetBackColor(LCD_COLOR_WHITE); - lcd.DisplayStringAt(120, 190, (uint8_t *)"LANCEMENT", LEFT_MODE); - lcd.SetTextColor(LCD_COLOR_BLACK); - lcd.DisplayStringAt(120, 210, (uint8_t *)"REDEMARAGE", LEFT_MODE); - lcd.DisplayStringAt(120, 230, (uint8_t *)"NECESSAIRE", LEFT_MODE); + #ifdef ROBOT_BIG + affichage_compteur(SCORE_GR); + liaison_Tx.envoyer_short(PAQUET_IDENTIFIANT_FINMATCH,SCORE_GLOBAL); + #else + affichage_compteur(SCORE_PR); + #endif while(1); // force le redemarage du robot //break; @@ -1056,7 +1060,9 @@ printf("all card check, missing %d cards\n",(NOMBRE_CARTES-countAliveCard)); if(countAliveCard >= NOMBRE_CARTES) { gameEtat = ETAT_CONFIG; + SendRawId(ECRAN_ALL_CHECK); flag=1; + //tactile_printf("Selection couleur et strategie"); } else { @@ -1131,29 +1137,142 @@ jack.mode(PullDown); // désactivation de la résistance interne du jack jack.fall(&jack_ISR); // création de l'interrupt attachée au changement d'état (front descendant) sur le jack -#ifdef ROBOT_BIG //le gros robot n'a pas de recalage bordure pour ce placer au début, on lui envoit donc ça position - localData2 = POSITION_DEBUT_T; - localData3 = POSITION_DEBUT_Y; - if(InversStrat == 1) { - localData2 = 1800-localData2;//Inversion theta - if(localData2 > 1800) localData2 -= 3600; - else if(localData2 <= -1800) localData2 += 3600; - localData3 = 3000 - POSITION_DEBUT_Y;//Inversion du Y - } - SetOdometrie(ODOMETRIE_BIG_POSITION, POSITION_DEBUT_X,localData3,localData2); -#endif -#ifdef ROBOT_SMALL localData2 = POSITION_DEBUT_T; localData3 = POSITION_DEBUT_Y; if(InversStrat == 1) { localData2 = -localData2;//Inversion theta localData3 = 3000 - POSITION_DEBUT_Y;//Inversion du Y } - SetOdometrie(ODOMETRIE_SMALL_POSITION, POSITION_DEBUT_X,localData3,localData2); -#endif + SetOdometrie(ODOMETRIE_SMALL_POSITION, POSITION_DEBUT_X,1800,localData2); + + instruction = strat_instructions[actual_instruction]; + //On effectue le traitement de l'instruction + break; case ETAT_GAME_WAIT_FOR_JACK: - //On attend le jack + if(instruction.order==POSITION_DEBUT){ + switch(etat_pos){ + case RECALAGE_1: + waitingAckID = ASSERVISSEMENT_RECALAGE; + waitingAckFrom = ACKNOWLEDGE_MOTEUR; + #ifdef ROBOT_SMALL + GoStraight(3000, 1,MOITIEE_ROBOT-5, 0); //on se recale contre le mur donc il faut donner la valeur du centre du robot + #else + GoStraight(-3000, 1,MOITIEE_ROBOT, 0); + #endif + while(waitingAckID !=0 && waitingAckFrom !=0) + canProcessRx(); + waitingAckID_FIN=ASSERVISSEMENT_RECALAGE; + waitingAckFrom_FIN= INSTRUCTION_END_MOTEUR; + while(waitingAckID_FIN!=0 && waitingAckFrom_FIN !=0) + canProcessRx(); + etat_pos=RECULER_1; + break; + + case RECULER_1: + waitingAckID = ASSERVISSEMENT_RECALAGE; + waitingAckFrom = ACKNOWLEDGE_MOTEUR; + #ifdef ROBOT_SMALL + GoStraight(-450, 0, 0, 0); + #else + GoStraight(75, 0, 0, 0); + #endif + while(waitingAckID !=0 && waitingAckFrom !=0) + canProcessRx(); + waitingAckID_FIN=ASSERVISSEMENT_RECALAGE; + waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; + while(waitingAckID_FIN!=0 && waitingAckFrom_FIN !=0) + canProcessRx(); + etat_pos=TOURNER; + break; + + case TOURNER: + waitingAckID = ASSERVISSEMENT_ROTATION; + waitingAckFrom = ACKNOWLEDGE_MOTEUR; + if(Cote==0){ + localData2 = 900; + } + else{ + localData2=-900; + } + Rotate(localData2); + while(waitingAckID !=0 && waitingAckFrom !=0) + canProcessRx(); + waitingAckID_FIN=ASSERVISSEMENT_ROTATION; + waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; + while(waitingAckID_FIN!=0 && waitingAckFrom_FIN !=0) + canProcessRx(); + etat_pos=RECALAGE_2; + break; + + case RECALAGE_2: + waitingAckID = ASSERVISSEMENT_RECALAGE; + waitingAckFrom = ACKNOWLEDGE_MOTEUR; + if(Cote==1) + localData3=3000-MOITIEE_ROBOT; + else + localData3=MOITIEE_ROBOT; + #ifdef ROBOT_SMALL + GoStraight(3000, 2,localData3, 0); //on se recale contre le mur donc il faut donner la valeur du centre du robot + #else + GoStraight(-3000, 2,localData3, 0); + #endif + while(waitingAckID !=0 && waitingAckFrom !=0) + canProcessRx(); + waitingAckID_FIN=ASSERVISSEMENT_RECALAGE; + waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; + while(waitingAckID_FIN!=0 && waitingAckFrom_FIN !=0) + canProcessRx(); + etat_pos=RECULER_2; + break; + + case RECULER_2: + waitingAckID = ASSERVISSEMENT_RECALAGE; + waitingAckFrom = ACKNOWLEDGE_MOTEUR; + #ifdef ROBOT_SMALL + GoStraight(-200, 0, 0, 0); + #else + GoStraight(200, 0, 0, 0); + #endif + while(waitingAckID !=0 && waitingAckFrom !=0) + canProcessRx(); + waitingAckID_FIN=ASSERVISSEMENT_RECALAGE; + waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; + while(waitingAckID_FIN!=0 && waitingAckFrom_FIN !=0) + canProcessRx(); + etat_pos=GOTOPOS; + break; + + case GOTOPOS: + localData1 = -1; + + if(InversStrat == 1 && ingnorInversionOnce == 0) { + localData2 = -instruction.arg3; + localData3 = 3000 - instruction.arg2;//Inversion du Y + } else { + localData3 = instruction.arg2; + localData2 = instruction.arg3; + } + + GoToPosition(instruction.arg1,localData3,localData2,localData1); + waitingAckID = ASSERVISSEMENT_XYT; + waitingAckFrom = ACKNOWLEDGE_MOTEUR; + + while(waitingAckID !=0 && waitingAckFrom !=0) + canProcessRx(); + waitingAckID_FIN=ASSERVISSEMENT_XYT; + waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; + while(waitingAckID_FIN!=0 && waitingAckFrom_FIN !=0) + canProcessRx(); + etat_pos=FIN_POS; + break; + case FIN_POS: + actual_instruction = instruction.nextLineOK; + break; + } + } + + break; case ETAT_GAME_START: @@ -1191,7 +1310,7 @@ Traitement de l'instruction, envoie de la trame CAN */ //debug_Instruction(instruction); - affichage_debug(gameEtat); + //affichage_debug(gameEtat); actionPrecedente = instruction.order; switch(instruction.order) { @@ -1215,10 +1334,6 @@ if(InversStrat == 1 && ingnorInversionOnce == 0) { localData1 = -localData1;//Inversion de la direction - #ifdef ROBOT_BIG - localData2 = -localData2; - localData1 = -localData1;//Inversion de la direction - #endif } BendRadius(instruction.arg1, localData2, localData1, localData5); @@ -1245,14 +1360,7 @@ } else { localData5 = 0; } - } - #ifdef ROBOT_BIG - if(InversStrat == 1 && ingnorInversionOnce == 0) { - /*if (instruction.direction == FORWARD) instruction.direction = BACKWARD; - else instruction.direction = FORWARD;*/ - instruction.direction = ((instruction.direction == FORWARD)?BACKWARD:FORWARD); - } - #endif + } localData2 = (((instruction.direction == FORWARD)?1:-1)*instruction.arg1); GoStraight(localData2, 0, 0, localData5); @@ -1273,29 +1381,9 @@ } } - #ifdef ROBOT_SMALL if(InversStrat == 1 && ingnorInversionOnce == 0) { localData2 = -localData2; - } - #endif - #ifdef ROBOT_BIG - if(InversStrat == 1 && ingnorInversionOnce == 0) { - if(instruction.direction == RELATIVE) { - localData2 = instruction.arg3; - } else {//C'est un rotation absolu, il faut la convertir en relative - - localData2 = 1800-instruction.arg3;//Inversion theta - if(localData2 > 1800) localData2 -= 3600; - else if(localData2 <= -1800) localData2 += 3600; - - localData2 = (localData2 - theta_robot)%3600; - if(localData2 > 1800) { - localData2 = localData2-3600; - } - - } - } - #endif + } waitingAckID = ASSERVISSEMENT_ROTATION; waitingAckFrom = ACKNOWLEDGE_MOTEUR; Rotate(localData2); @@ -1317,15 +1405,6 @@ localData2 = instruction.arg3; } - #ifdef ROBOT_BIG - if(InversStrat == 1 && ingnorInversionOnce == 0) { - localData1 = -localData1; - localData2 = 1800-instruction.arg3;//Inversion theta - if(localData2 > 1800) localData2 -= 3600; - else if(localData2 <= -1800) localData2 += 3600; - } - #endif - GoToPosition(instruction.arg1,localData3,localData2,localData1); waitingAckID = ASSERVISSEMENT_XYT; waitingAckFrom = ACKNOWLEDGE_MOTEUR; @@ -1467,6 +1546,7 @@ } } else if(instruction.nextActionType == WAIT) { ///Actualisation des waiting ack afin d'attendre la fin des actions + SetOdometrie(0x28, x_robot, y_robot, theta_robot); gameEtat = ETAT_GAME_WAIT_END_INSTRUCTION; switch(instruction.order) { @@ -1591,7 +1671,13 @@ case ETAT_WARNING_TIMEOUT://Attente de la trame fin de danger ou du timeout de 2s if(timeoutWarning.read_ms() >= BALISE_TIMEOUT)//ça fait plus de 2s, il faut changer de stratégie { - gameEtat = ETAT_EVITEMENT; + if(instruction.nextLineOK == instruction.nextLineError) + gameEtat = ETAT_EVITEMENT; + else + { + actual_instruction = instruction.nextLineError; + gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION; + } } break; case ETAT_WARING_END_BALISE_WAIT://Attente d'une seconde apres la fin d'un End Balise pour etre sur que c'est bon @@ -1689,28 +1775,32 @@ break; case ETAT_ESTIMATION_POSITION : - wait_ms(100); + /*wait_ms(100); Rotate(3600); EvitEtat = ETAT_ESTIMATION_POSITION_ROTATION_ACK; waitingAckID = ASSERVISSEMENT_ROTATION; + waitingAckFrom = ACKNOWLEDGE_MOTEUR;*/ + GoToPosition(1400,300,0,1); + waitingAckID = ASSERVISSEMENT_XYT; waitingAckFrom = ACKNOWLEDGE_MOTEUR; break; case ETAT_ESTIMATION_POSITION_ROTATION_ACK: if(waitingAckID == 0 && waitingAckFrom == 0) + { EvitEtat = ETAT_ESTIMATION_POSITION_ROTATION_ACK_END; + waitingAckID_FIN = ASSERVISSEMENT_XYT; + waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; + } break; case ETAT_ESTIMATION_POSITION_ROTATION_ACK_END: - if(angle_moyen_balise_IR >= 13.5 && angle_moyen_balise_IR <= 14.5) - { - wait_ms(100); - SendRawId(ASSERVISSEMENT_STOP); - EvitEtat = ETAT_FIN_EVITEMENT; - } + if(waitingAckID == 0 && waitingAckFrom == 0) + EvitEtat = ETAT_ESTIMATION_POSITION_ROTATION_ACK_END; break; case ETAT_FIN_EVITEMENT: + gameEtat = ETAT_WARNING_END_LAST_INSTRUCTION; break; } } @@ -1749,7 +1839,6 @@ void canProcessRx(void) { static signed char FIFO_occupation=0,FIFO_max_occupation=0; - char useless1 = 0; char message[10]="toto"; char message1[10]="toto"; char message2[10]="toto"; @@ -1804,6 +1893,7 @@ if(waitingAckFrom == msgRxBuffer[FIFO_lecture].id) { waitingAckFrom = 0;//C'est la bonne carte qui indique qu'elle est en ligne } + flag=1; break; @@ -1820,12 +1910,10 @@ case INSTRUCTION_END_MOTEUR: case ACK_FIN_ACTION: if(waitingAckFrom == msgRxBuffer[FIFO_lecture].id && ((unsigned short)msgRxBuffer[FIFO_lecture].data[0]|((unsigned short)(msgRxBuffer[FIFO_lecture].data[1])<<8) == waitingAckID)) { - lcd.DisplayStringAt(0, LINE(16),(unsigned char *)"ACK OK",LEFT_MODE); waitingAckFrom = 0; waitingAckID = 0; } if(waitingAckFrom_FIN == msgRxBuffer[FIFO_lecture].id && ((unsigned short)msgRxBuffer[FIFO_lecture].data[0]|((unsigned short)(msgRxBuffer[FIFO_lecture].data[1])<<8) == waitingAckID_FIN)) { - //SendRawId(waitingAckID); waitingAckFrom_FIN = 0; waitingAckID_FIN = 0; } @@ -1841,28 +1929,6 @@ theta_robot=msgRxBuffer[FIFO_lecture].data[4]|((signed short)(msgRxBuffer[FIFO_lecture].data[5])<<8); break; - //case SERVO_AX12_SETGOAL: - //SendAck(0x114, SERVO_AX12_SETGOAL); - //if(AX12_isLocal(msgRxBuffer[FIFO_lecture].data[0])) - //AX12_setGoal(msgRxBuffer[FIFO_lecture].data[0], msgRxBuffer[FIFO_lecture].data[1]|((unsigned short)(msgRxBuffer[FIFO_lecture].data[2])<<8), msgRxBuffer[FIFO_lecture].data[3]|((unsigned short)(msgRxBuffer[FIFO_lecture].data[4])<<8)); - - //break; - - /*case SERVO_AX12_PROCESS: - SendAck(0x114, SERVO_AX12_PROCESS); - //AX12_processChange(1); - break; - - case SERVO_AX12_DONE: - SendRawId(POMPE_PWM); - //SendAck(0x114, SERVO_AX12_DONE); - AX12_notifyCANEnd(((unsigned short)(msgRxBuffer[FIFO_lecture].data[0]))); - - gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION; - waitingAckFrom = 0; - waitingAckID = 0;*/ - - //break; case ACK_ACTION: if(waitingAckID == msgRxBuffer[FIFO_lecture].id) { waitingAckFrom = 0; @@ -1882,15 +1948,31 @@ if(debut_angle_detection > fin_angle_detection) { - angle_moyen_balise_IR = (float)debut_angle_detection + ((15.0-(float)debut_angle_detection)+(float)fin_angle_detection)/2.0; - if(angle_moyen_balise_IR > 15.0) - angle_moyen_balise_IR-=15.0; + angle_moyen_balise_IR = (float)debut_angle_detection + ((15.0f-(float)debut_angle_detection)+(float)fin_angle_detection)/2.0f; + if(angle_moyen_balise_IR > 15.0f) + angle_moyen_balise_IR-=15.0f; } else angle_moyen_balise_IR = debut_angle_detection + (fin_angle_detection-debut_angle_detection)/2; + #ifdef ROBOT_BIG + float seuil_bas_avant = 12.0; // >= + float seuil_haut_avant = 0.0; // <= + float seuil_bas_arriere = 4.0; + float seuil_haut_arriere = 8.0; + #else + float seuil_bas_avant = 13.0; + float seuil_haut_avant = 15.0; + float seuil_bas_arriere = 5.0; + float seuil_haut_arriere = 7.0; + #endif - if (instruction.order != MV_TURN && instruction.order != ACTION ){ //J'ai rajouté cette ligne mais il faut tester avec et sans pour voir le comportement du robot, + if (instruction.order == MV_LINE && instruction.direction == FORWARD && angle_moyen_balise_IR >= seuil_bas_avant && angle_moyen_balise_IR <= seuil_haut_avant + || instruction.order == MV_LINE && instruction.direction == BACKWARD && angle_moyen_balise_IR >= seuil_bas_arriere && angle_moyen_balise_IR <= 7 + || instruction.order == MV_COURBURE && angle_moyen_balise_IR >= seuil_bas_avant && angle_moyen_balise_IR <= seuil_haut_avant + || instruction.order == MV_COURBURE && angle_moyen_balise_IR >= seuil_bas_arriere && angle_moyen_balise_IR <= seuil_haut_arriere + || instruction.order == MV_XYT && angle_moyen_balise_IR >= seuil_bas_avant && angle_moyen_balise_IR <= seuil_haut_avant + || instruction.order == MV_XYT && angle_moyen_balise_IR >= seuil_bas_arriere && angle_moyen_balise_IR <= seuil_haut_arriere ){ //J'ai rajouté cette ligne mais il faut tester avec et sans pour voir le comportement du robot, if(needToStop() != 0 && ingnorBaliseOnce ==0) { if(gameEtat > ETAT_GAME_START && gameEtat != ETAT_WARNING_TIMEOUT) { @@ -1903,7 +1985,11 @@ gameEtat = ETAT_WARNING_TIMEOUT; } } + } + + + ingnorBaliseOnce = 0; break; @@ -1934,7 +2020,7 @@ case RECEPTION_DATA: telemetreDistance=char_to_short_transformation(msgRxBuffer[FIFO_lecture].data[0], msgRxBuffer[FIFO_lecture].data[1]); - telemetreDistance= (float)telemetreDistance*100*35.5+50; + telemetreDistance= (float)telemetreDistance*100.0f*35.5f+50.0f; waitingAckFrom = 0; waitingAckID = 0; break; @@ -2122,11 +2208,15 @@ void affichage_compteur (int nombre) { - int dizaine=0,unite=0; + int dizaine=0,unite=0,centaine=0; + centaine=nombre/100; dizaine = nombre/10; unite = nombre-(10*dizaine); - print_segment(unite,0); - print_segment(dizaine,200); + print_segment(unite,-50); + print_segment(dizaine,125); + if(centaine!=0){ + print_segment(centaine,350); + } } @@ -2164,6 +2254,7 @@ void print_segment(int nombre, int decalage) { + switch(nombre) { case 0: