Crée une commande shell moteur <gauche|droit> <vitesse> qui permet de contrôler les moteurs depuis le terminal. Par exemple :
uart: $ moteur gauche 128
Moteur gauche: vitesse 128
Solution :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Simule l'envoi d'une commande PWM au moteur physique.
Sur le robot, ces fonctions écrivent dans les registres I2C du STM8. */
static void moteur_gauche(int direction, int vitesse)
{
printf("Moteur gauche : dir=%d, vitesse=%d\n", direction, vitesse);
}
static void moteur_droit(int direction, int vitesse)
{
printf("Moteur droit : dir=%d, vitesse=%d\n", direction, vitesse);
}
/* Interprète "moteur <gauche|droit> <vitesse>".
Retourne 0 si OK, -1 en cas d'erreur. */
int cmd_moteur(int argc, char **argv)
{
if (argc != 3) {
printf("Erreur : Usage : moteur <gauche|droit> <vitesse>\n");
return -1;
}
int vitesse = atoi(argv[2]);
if (vitesse < 0 || vitesse > 255) {
printf("Erreur : vitesse doit être entre 0 et 255\n");
return -1;
}
if (strcmp(argv[1], "gauche") == 0) {
moteur_gauche(0, vitesse);
printf("Moteur gauche : vitesse %d\n", vitesse);
} else if (strcmp(argv[1], "droit") == 0) {
moteur_droit(0, vitesse);
printf("Moteur droit : vitesse %d\n", vitesse);
} else {
printf("Erreur : moteur inconnu '%s' (utiliser 'gauche' ou 'droit')\n",
argv[1]);
return -1;
}
return 0;
}
/* Arrête les deux moteurs */
int cmd_stop(int argc, char **argv)
{
(void)argc;
(void)argv;
moteur_gauche(0, 0);
moteur_droit(0, 0);
printf("Moteurs arrêtés\n");
return 0;
}
int main(void)
{
printf("Shell prêt. Simulation de commandes :\n\n");
char *cmd1[] = { "moteur", "gauche", "128" };
cmd_moteur(3, cmd1);
char *cmd2[] = { "moteur", "droit", "200" };
cmd_moteur(3, cmd2);
char *cmd3[] = { "moteur", "centre", "50" };
cmd_moteur(3, cmd3); /* erreur attendue */
char *cmd4[] = { "moteur", "gauche", "300" };
cmd_moteur(3, cmd4); /* vitesse hors plage */
printf("\n");
cmd_stop(0, NULL);
return 0;
}
Solution copiée dans l'éditeur.