/* * Copyright (C) 2018 dimercur * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __COMROBOT_H__ #define __COMROBOT_H__ #include "messages.h" #include using namespace std; /** * Class used for communicating with robot over serial * * @brief Communication class with robot * */ class ComRobot { public: /** * Constructor */ ComRobot() { } /** * Destructor */ virtual ~ComRobot() { } /** * Open serial link with robot * @return File descriptor * @throw std::runtime_error if it fails */ int Open(); /** * Open serial link with robot * @param usart Filename of usart to open * @return File descriptor * @throw std::runtime_error if it fails */ int Open(string usart); /** * Close serial link * @return Success if above 0, failure if below 0 */ int Close(); /** * Send a message to robot * @param msg Message to send to robot * @return A message containing either an answer (Ack/Nak/Timeout/Error) or a value (battery level, robot state) depending of the command * @attention Input message is destroyed (delete) after being sent. You do not need to delete it yourself * @attention Write produce an answer message. You have to dispose it (delete) when you have finished using it * @attention Write is blocking until message is written into buffer (linux side) * @warning Write is not thread save : check that multiple tasks can't access this method simultaneously */ Message *Write(Message* msg); /** * Function called at beginning of Write method * Use it to do some synchronization (call of mutex, for example) */ virtual void Write_Pre() { } /** * Function called at end of Write method * Use it to do some synchronization (call of mutex, for example) */ virtual void Write_Post() { } Message *SendCommand(Message* msg, MessageID answerID, int maxRetries); static Message *Ping() { return new Message(MESSAGE_ROBOT_PING); } static Message *Reset() { return new Message(MESSAGE_ROBOT_RESET); } static Message *PowerOff() { return new Message(MESSAGE_ROBOT_POWEROFF); } static Message *StartWithWD() { return new Message(MESSAGE_ROBOT_START_WITH_WD); } static Message *StartWithoutWD() { return new Message(MESSAGE_ROBOT_START_WITHOUT_WD); } static Message *ReloadWD() { return new Message(MESSAGE_ROBOT_RELOAD_WD); } static Message *Move(int length) { return new MessageInt(MESSAGE_ROBOT_MOVE, length); } static Message *Turn(int angle) { return new MessageInt(MESSAGE_ROBOT_TURN, angle); } static Message *Stop() { return new Message(MESSAGE_ROBOT_STOP); } static Message *GoForward() { return new Message(MESSAGE_ROBOT_GO_FORWARD); } static Message *GoBackward() { return new Message(MESSAGE_ROBOT_GO_BACKWARD); } static Message *GoLeft() { return new Message(MESSAGE_ROBOT_GO_LEFT); } static Message *GoRight() { return new Message(MESSAGE_ROBOT_GO_RIGHT); } static Message *GetBattery() { return new Message(MESSAGE_ROBOT_BATTERY_GET); } static Message *GetState() { return new Message(MESSAGE_ROBOT_STATE_GET); } protected: /** * Serial link file descriptor */ int fd; /** * Get an answer from robot * @return String containing answer from robot * @attention Read method is blocking until a message is received (timeout of 500 ms) * @warning Read is not thread safe : Do not call it in multiple tasks simultaneously */ string Read(); /** * Convert a string to its message representation (when receiving data from robot) * @param s String from robot containing answer * @return Message corresponding to received array of char */ Message* StringToMessage(string s); /** * Convert a message to its string representation (for sending command to robot) * @param msg Message to be sent to robot * @return String containing command to robot */ string MessageToString(Message *msg); /** * Add a checksum and carriage return to a command string * @param[in,out] s String containing command for robot, without ending char (carriage return) */ void AddChecksum(string &s); /** * Verify if checksum of an incoming answer from robot is valid, * then remove checksum from incoming answer (if checksum is ok) * @param[in,out] s String containing incoming answer from robot * @return true is checksum is valid, false otherwise. */ bool VerifyChecksum(string &s); }; #endif /* __COMROBOT_H__ */