dumber/software/dumber3/Application/commands.h

132 lines
4.7 KiB
C

/**
******************************************************************************
* @file commands.h
* @brief commands handler header
* @author S. DI MERCURIO (dimercur@insa-toulouse.fr)
* @date December 2023
*
******************************************************************************
* @copyright Copyright 2023 INSA-GEI, Toulouse, France. All rights reserved.
* @copyright This project is released under the Lesser GNU Public License (LGPL-3.0-only).
*
* @copyright This file is part of "Dumber" project
*
* @copyright This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* @copyright This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
* @copyright You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
******************************************************************************
*/
#ifndef INC_CMD_H_
#define INC_CMD_H_
#include "application.h"
/** @addtogroup Application_Software
* @{
*/
/** @addtogroup COMMANDS
* @{
*/
/** @addtogroup COMMANDS_Public Public
* @{
*/
/** Enumeration class defining commands to be used in \ref CMD_Generic, \ref CMD_Move, \ref CMD_Turn structures */
typedef enum {
CMD_NONE=0x0, /**< Command is unknown */
CMD_PING, /**< PING command */
CMD_RESET, /**< RESET command */
CMD_START_WITH_WATCHDOG, /**< START_WITH_WATCHDOG command */
CMD_RESET_WATCHDOG, /**< RESET_WATCHDOG command */
CMD_GET_BATTERY, /**< GET_BATTERY command */
CMD_GET_VERSION, /**< GET_VERSION command */
CMD_START_WITHOUT_WATCHDOG, /**< START_WITHOUT_WATCHDOG command */
CMD_MOVE, /**< MOVE command */
CMD_TURN, /**< TURN command */
CMD_GET_BUSY_STATE, /**< GET_BUSY_STATE command */
CMD_TEST, /**< TEST command (not used yet) */
CMD_DEBUG, /**< DEBUG command (not used yet) */
CMD_POWER_OFF, /**< POWER_OFF command */
CMD_INVALID_CHECKSUM=0xFF /**< Received command string has an invalid checksum*/
} CMD_CommandsType;
/** Enumeration class defining possible generic answers */
typedef enum {
ANS_OK=0x80, /**< Answer OK, for a correct and processed command */
ANS_ERR, /**< Answer ERR, for rejected command (not accepted in current state), or invalid parameters */
ANS_UNKNOWN /**< Answer UNKNOWN, for unknown command */
} CMD_AnswersType;
/** Enumeration class defining battery levels */
typedef enum {
ANS_BAT_EMPTY=0, /**< Battery is empty, system will power off in seconds */
ANS_BAT_LOW, /**< Battery is low, should plug charger quickly */
ANS_BAT_OK /**< Charger is in correct state, charge is not required yet */
} CMD_BatteryLevelType;
/** Enumeration class defining busty states */
typedef enum {
ANS_STATE_NOT_BUSY=0, /**< Robot is not moving, ready for processing new movement */
ANS_STATE_BUSY /**< Robot is moving, not accepting new movement requests */
} CMD_BusyType;
/** Structure class used by cmdDecode function for generic commands
*
* @todo type of "type" field should be \ref CMD_CommandsType and not uint8_t
*/
typedef struct __attribute__((packed)) {
uint8_t type; /**< Command type, as found in \ref CMD_CommandsType enum */
} CMD_Generic;
/** Structure class used by cmdDecode function for MOVE command
*
* @todo type of "type" field should be \ref CMD_CommandsType and not uint8_t
*/
typedef struct __attribute__((packed)) {
uint8_t type; /**< Command type, as found in \ref CMD_CommandsType enum (should be \ref CMD_MOVE)*/
int16_t distance; /**< Distance for movement, positive for forward, negative for backward. Expressed in millimeters */
} CMD_Move;
/** Structure class used by cmdDecode function for TURN command
*
* @todo type of "type" field should be \ref CMD_CommandsType and not uint8_t
*/
typedef struct __attribute__((packed)) {
uint8_t type; /**< Command type, as found in \ref CMD_CommandsType enum (should be \ref CMD_TURN)*/
int16_t turns; /**< Angle of rotation, positive for clockwise and negative for counter-clockwise. Expressed in degree */
} CMD_Turn;
CMD_Generic* cmdDecode(char* cmd, uint8_t length);
void cmdSendAnswer(uint8_t ans);
void cmdSendString(char* str);
void cmdSendBatteryLevel(uint16_t batteryState);
void cmdSendVersion(void);
void cmdSendBusyState(uint8_t state);
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
#endif /* INC_CMD_H_ */