123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432 |
- /**
- ******************************************************************************
- * @file cmdManager.c
- * @author Lucien Senaneuch
- * @version V1.0
- * @date 16-mai-2016
- * @brief Gestion de commande reçu via l'uart
- * Traite les chaine de caractére reçu par l'uart.
- * Permet de verifier les erreurs de checksum,
- * de traiter les valeurs retour.
- *
- *@attention Utilise les variables global - receiptString - sendString
- *
- ******************************************************************************
- ******************************************************************************
- */
-
- #include <stm32f10x.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- #include "cmdManager.h"
- #include "battery.h"
- #include "motor.h"
- #include "system_dumby.h"
- #include "usart.h"
-
- /** @addtogroup Projects
- * @{
- */
-
- /** @addtogroup cmdManager
- * @{
- */
-
- /* Definition des commandes */
-
- #define PingCMD 'p'
- #define ResetCMD 'r'
- #define SetMotorCMD 'm'
- #define StartWWatchDogCMD 'W'
- #define ResetWatchdogCMD 'w'
- #define GetBatteryVoltageCMD 'v'
- #define GetVersionCMD 'V'
- #define StartWithoutWatchCMD 'u'
- #define MoveCMD 'M'
- #define TurnCMD 'T'
- #define BusyStateCMD 'b'
- #define TestCMD 't'
- #define DebugCMD 'a'
-
- #define OK_ANS "O\r"
- #define ERR_ANS "E\r"
- #define UNKNOW_ANS "C\r"
- #define BAT_OK "2\r"
- #define BAT_LOW "1\r"
- #define BAT_EMPTY "0\r"
-
- /** @addtogroup Checksum
- * @{
- */
- /**
- * @brief Inclut le checksum à sendString
- *
- * Parcours sendString pour y calculer le checksum ( xor sur chaque caractére)
- * et inclut le resultat en fin de chaine.
- *
- * @param None
- * @retval 0 ou 1
- *
- */
- void cmdAddChecksum(void) {
- uint16_t j;
- unsigned char checksum=0;
-
- for (j = 0; sendString[j] != '\r'; j++)
- checksum ^= sendString[j];
- if (checksum == '\r')
- checksum++;
- sendString[j] = checksum;
- sendString[j + 1] = '\r';
- }
-
- /**
- * @brief Verifie le checksum de la variable global recepitString
- *
- * Vérifie le dernier carctére de receiptString sensé être le checksum.
- * Si celui-ci est bon, ll retournera 0 et supprimera le checksum du tableau receiptString
- * sinon il retournera 1 sans faire de modification.
- * @param None
- * @retval 0 ou 1
- *
- */
- char cmdVerifyChecksum(void) {
- uint16_t j;
- uint16_t length;
- unsigned char checksum=0;
-
- length = strlen(receiptString);
- for (j = 0; j < length - 2; j++) {
- checksum ^= receiptString[j];
- }
- if (checksum == '\r')
- checksum++;
-
- if (receiptString[j] == checksum) {
- receiptString[length - 2] = 13;
- receiptString[length - 1] = 0;
- receiptString[length] = 0;
-
- return 0;
- } else
- return 1;
- }
-
- /**
- * @}
- */
-
-
- /** @addtogroup TestCmd
- * @{
- */
- /**
- * @brief Traite la commande de reception
- *
- * Gére le premier caractére de la chaine de reception pour en déduire la
- * commande à appliqué.
- * Copie E dans sendString si une erreur s'est produite.
- * Copie C dans sendString si la commande n'a pas abouti.
- *
- * @param None
- * @retval None
- */
-
- void cmdManage(void) {
- if (cmdVerifyChecksum() != 0) {
- strcpy(sendString, UNKNOW_ANS);
- } else { // Checksum valide
- if (Dumber.StateSystem==STATE_DISABLE) { // SI la batterie est trop faible, impossible d'accepter une commande: on reste dans ce mode
- strcpy(sendString, ERR_ANS);
- } else {
- switch (receiptString[0]) {
- case PingCMD:
- cmdPingAction();
- break;
-
- case ResetCMD:
- cmdResetAction();
- break;
-
- case StartWWatchDogCMD:
- cmdStartWithWatchdogAction();
- break;
-
- case ResetWatchdogCMD:
- cmdResetWatchdogAction();
- break;
-
- case GetBatteryVoltageCMD:
- cmdBatteryVoltageAction();
- break;
-
- case GetVersionCMD:
- cmdVersionAction();
- break;
-
- case StartWithoutWatchCMD:
- cmdStartWithoutWatchdogAction();
- break;
-
- case MoveCMD:
- cmdMoveAction();
- break;
-
- case TurnCMD:
- cmdTurnAction();
- break;
-
- case BusyStateCMD:
- cmdBusyStateAction();
- break;
-
- case 'a':
- cmdDebugAction();
- break;
-
- default:
- strcpy(sendString, UNKNOW_ANS);
- }
- }
- }
-
- Dumber.cpt_inactivity=0; // remise a zéro du compteur d'inativité
- }
-
- /**
- * @}
- */
-
-
- /** @addtogroup Traitement_Cmd
- * @{
- */
- /**
- * @brief Commande Ping
- * Retourne OK_ANS si success dans sendString. Sinon return ERR_ANS.
- *
- * @param None
- * @retval None
- */
-
- void cmdPingAction(void) {
- if (receiptString[1] == '\r')
- strcpy(sendString, OK_ANS);
- else
- strcpy(sendString, ERR_ANS);
- }
-
- /**
- * @brief Execute la commande reset.
- * Remet l'état de dumby à "idle".
- * Retourne OK_ANS si success dans sendString. Sinon return ERR_ANS.
- *
- * @param None
- * @retval None
- */
- void cmdResetAction(void) {
- systemChangeState(STATE_IDLE);
- strcpy(sendString, OK_ANS);
- }
-
- /**
- * @brief Execute la commande Version.
- * Retourne la version du soft dans sendString.
- * @param None
- * @retval None
- */
- void cmdVersionAction(void) {
- if (receiptString[1] == '\r')
- strcpy(sendString, VERSION);
- else
- strcpy(sendString, ERR_ANS);
- }
-
- /**
- * @brief Effectue une action BusyState.
- * Retourne si le robot est en mouvement ou non.
- * La variable est passé dans sendString - O ou 1.
- *
- * @param None
- * @retval None
- */
- void cmdBusyStateAction(void) {
- if ((Dumber.StateSystem == STATE_RUN) || (Dumber.StateSystem == STATE_LOW)) {
- if (Dumber.busyState == TRUE)
- strcpy(sendString, "1\r");
- else
- strcpy(sendString, "0\r");
- } else {
- strcpy(sendString, ERR_ANS);
- }
- }
-
- /**
- * @brief Effectue une remise à zéro du watchdog.
- *
- * @param None
- * @retval None
- */
- void cmdResetWatchdogAction(void) {
- if (systemResetWatchdog()!=0) { // Réussite
- strcpy(sendString, OK_ANS);
- } else strcpy(sendString, ERR_ANS);
- }
-
- /**
- * @brief Passe le robot en mode RUN.
- * Necessite que le robot soit en mode IDLE au préalable.
- * Le passage en mode run activera également les timers du watchdog.
- * Qu'il faut remettre à zero entre 950ms et 1050ms.
- *
- * @param None
- * @retval None
- */
- void cmdStartWithWatchdogAction(void) {
- if (Dumber.StateSystem == STATE_IDLE && receiptString[1] == '\r') {
- Dumber.WatchDogStartEnable = TRUE;
- systemChangeState(STATE_RUN);
- strcpy(sendString, OK_ANS);
- } else
- strcpy(sendString, ERR_ANS);
- }
-
- /**
- * @brief Passe le robot en mode RUN mais sans watchdog.
- * Necessite que dumby soit en mode IDLE au prealable.
- *
- * @param None
- * @retval None
- */
- void cmdStartWithoutWatchdogAction(void) {
- if (Dumber.StateSystem == STATE_IDLE && receiptString[1] == '\r') {
- Dumber.WatchDogStartEnable = FALSE;
- systemChangeState(STATE_RUN);
- strcpy(sendString, OK_ANS);
- } else
- strcpy(sendString, ERR_ANS);
- }
-
-
- /**
- * @brief Demande un mouvement en ligne droite.
- * Les paramétres sont inclus dans receiptString.
- * Le type de commande à envoyer est :"M=val\r". Ou val
- * peut être positif ou negatif.
- *
- * @param None
- * @retval None
- */
- void cmdMoveAction(void) {
- if (Dumber.StateSystem == STATE_RUN || Dumber.StateSystem == STATE_LOW) {
- int laps;
- uint16_t testReception = sscanf(receiptString, "M=%i\r", &laps);
- unsigned char mod = 0;
- tourPositionG = 0;
- tourPositionD = 0;
-
- if (testReception == 1) {
- Dumber.cpt_inactivity = 0;
- Dumber.busyState = TRUE;
- if (laps < 0) {
- laps = laps * -1;
- mod = REVERSE;
- } else
- mod = FORWARD;
-
- laps = laps * 2;
-
- motorRegulation(mod, mod, (unsigned) laps, (unsigned) laps,
- COMMONSPEED, COMMONSPEED);
-
- strcpy(sendString, OK_ANS);
- } else
- strcpy(sendString, ERR_ANS);
- }
- }
-
- /**
- * @brief Execute une action tourne avec les paramètres dans receitpString.
- * Type de commande à envoyer : "T=val\r". Ou val peut être positif
- * ou negatif.
- *
- * @param None
- * @retval None
- */
- void cmdTurnAction(void) {
- if (Dumber.StateSystem == STATE_RUN || Dumber.StateSystem == STATE_LOW) {
- int degree;
- uint16_t testReception = sscanf(receiptString, "T=%i\r", °ree);
- tourPositionG = 0;
- tourPositionD = 0;
-
- if (testReception == 1) {
- degree = degree * 1.40;
- Dumber.cpt_inactivity = 0;
- Dumber.busyState = TRUE;
-
- if (degree < 0) {
- degree = degree * -1;
- motorRegulation(FORWARD, REVERSE, (unsigned) degree,
- (unsigned) degree, LOWSPEED, LOWSPEED);
- } else {
- motorRegulation(REVERSE, FORWARD, (unsigned) degree,
- (unsigned) degree, LOWSPEED, LOWSPEED);
- }
- strcpy(sendString, OK_ANS);
- } else
- strcpy(sendString, ERR_ANS);
- }
- }
-
- /**
- * @brief retourne une valeur de batterie.
- * La valeur de la batterie peut être - 0 - 1 - 2.
- * Lorsque la batterie est pleine, la valeur retournée est 2.
- * Lorque la batterie est intermediaire, la valeur retournée est 1.
- * Lorsque la batterie est vide, la valeur retournée est 0.
- *
- * @param None
- * @retval None
- */
- void cmdBatteryVoltageAction(void) {
- char battery[2];
- battery[0] = Dumber.stateBattery + '0';
- battery[1] = '\r';
- strcpy(sendString, battery);
- }
-
- /**
- * @brief Envoie le nombre de tour théorique à effectuer.
- * Et le nombre de tour effectué au moment de reception de la commande.
- * Th- Consigne de commande en nombre de tour.
- * Re- Nombre de tour reel effectué.
- *
- * @param None
- * @retval None
- */
- void cmdDebugAction(void) {
- uint8_t j;
-
- sprintf(sendString, "Th-D=%u G=%u\r", tourPositionD, tourPositionG);
- usartSendData();
-
- for (j = 0; j < 200; j++);
- sprintf(sendString, "Re-D=%u G=%u\r", G_lapsRight, G_lapsLeft);
- usartSendData();
- }
-
- /**
- * @}
- */
-
- /**
- * @}
- */
-
- /**
- * @}
- */
|