From ad9f738bb0aebb24a96ceea4d680ee0c2a9a2548 Mon Sep 17 00:00:00 2001 From: BlueAndi Date: Wed, 17 Apr 2024 23:15:08 +0200 Subject: [PATCH 01/15] Zumo32U4 model supports now serial communication over emitter/receiver. --- webots/protos/Zumo32U4.proto | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/webots/protos/Zumo32U4.proto b/webots/protos/Zumo32U4.proto index e4aafb22..33405aa3 100644 --- a/webots/protos/Zumo32U4.proto +++ b/webots/protos/Zumo32U4.proto @@ -5,7 +5,7 @@ EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2023a/project PROTO Zumo32U4 [ field SFVec3f translation 0 0 0 field SFRotation rotation 0 0 1 0 - field SFString name "robot" + field SFString name "Zumo" field SFString contactMaterial "default" # Contact material of the tracks ] { @@ -13,12 +13,16 @@ PROTO Zumo32U4 [ translation IS translation rotation IS rotation children [ - Speaker { + Receiver { + name "serialComRx" + type "serial" } Emitter { name "serialComTx" type "serial" } + Speaker { + } DEF SHIELD Group { children [ Transform { From df195f2465a6702981df6bd00032a568ebd3d629 Mon Sep 17 00:00:00 2001 From: BlueAndi Date: Wed, 17 Apr 2024 23:15:48 +0200 Subject: [PATCH 02/15] "//" replaced with "/* ... */". --- lib/Service/Logging.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Service/Logging.h b/lib/Service/Logging.h index f61edfa9..1dabafcf 100644 --- a/lib/Service/Logging.h +++ b/lib/Service/Logging.h @@ -338,7 +338,7 @@ namespace Logging } } -}; // namespace Logging +}; /* namespace Logging */ /****************************************************************************** * Functions From 1edeb6b87157aa87f9110f06933ab7c95305e039 Mon Sep 17 00:00:00 2001 From: BlueAndi Date: Wed, 17 Apr 2024 23:20:58 +0200 Subject: [PATCH 03/15] Socket server for communication with ZumoComSystem replaced by Webots serial driver. --- lib/ArduinoNative/Arduino.cpp | 163 ++++--- lib/ArduinoNative/SocketServer.cpp | 444 ------------------ lib/HALCalibSim/Board.h | 11 + lib/HALConvoyLeaderSim/Board.cpp | 8 + lib/HALConvoyLeaderSim/Board.h | 20 + lib/HALLineFollowerSim/Board.h | 11 + lib/HALRemoteControlSim/Board.cpp | 8 + lib/HALRemoteControlSim/Board.h | 20 + lib/HALSensorFusionSim/Board.cpp | 8 + lib/HALSensorFusionSim/Board.h | 20 + lib/HALSim/WebotsSerialDrv.cpp | 309 ++++++++++++ .../WebotsSerialDrv.h} | 155 +++--- platformio.ini | 2 + scripts/webots_launcher.py | 33 +- 14 files changed, 618 insertions(+), 594 deletions(-) delete mode 100644 lib/ArduinoNative/SocketServer.cpp create mode 100644 lib/HALSim/WebotsSerialDrv.cpp rename lib/{ArduinoNative/SocketServer.h => HALSim/WebotsSerialDrv.h} (52%) diff --git a/lib/ArduinoNative/Arduino.cpp b/lib/ArduinoNative/Arduino.cpp index 50022cc9..5927e7d8 100644 --- a/lib/ArduinoNative/Arduino.cpp +++ b/lib/ArduinoNative/Arduino.cpp @@ -39,16 +39,15 @@ #include -#else +#else /* UNIT_TEST */ #include #include #include -#include "SocketServer.h" #include #include -#endif +#endif /* UNIT_TEST */ /****************************************************************************** * Compiler Switches @@ -67,14 +66,15 @@ /** This type defines the possible program arguments. */ typedef struct { - const char* socketServerPort; /**< Socket server port */ - const char* robotName; /**< Robot name */ - bool isSerialOverSocket; /**< Is serial communication over socket? */ - bool verbose; /**< Show verbose information */ + const char* robotName; /**< Robot name */ + bool isZumoComSystemEnabled; /**< Is the ZumoComSystem enabled? */ + const char* serialRxChannel; /**< Serial Rx channel */ + const char* serialTxChannel; /**< Serial Tx channel */ + bool verbose; /**< Show verbose information */ } PrgArguments; -#endif +#endif /* UNIT_TEST */ /****************************************************************************** * Prototypes @@ -88,7 +88,7 @@ extern void loop(); static int handleCommandLineArguments(PrgArguments& prgArguments, int argc, char** argv); static void showPrgArguments(const PrgArguments& prgArgs); -#endif +#endif /* UNIT_TEST */ /****************************************************************************** * Local Variables @@ -113,22 +113,26 @@ static const int MAX_TIME_STEP = 10; */ static SimTime* gSimTime = nullptr; +/** Supported long program arguments. */ +static const struct option LONG_OPTIONS[] = {{"help", no_argument, nullptr, 0}, + {"serialRxCh", required_argument, nullptr, 0}, + {"serialTxCh", required_argument, nullptr, 0}, + {nullptr, no_argument, nullptr, 0}}; /* Marks the end. */ + /** Program argument default value of the robot name. */ static const char* PRG_ARG_ROBOT_NAME_DEFAULT = ""; -/** Default port used for socket communications. */ -static const char* PRG_ARG_SOCKET_SERVER_PORT_DEFAULT = "65432"; +/** Program argument default value of the flag whether the ZumoComSystem is enabled or not. */ +static bool PRG_ARG_IS_ZUMO_COM_SYSTEM_ENABLED_DEFAULT = false; -/** Program argument default value of the verbose flag. */ -static bool PRG_ARG_VERBOSE_DEFAULT = false; +/** Program argument default value of the serial rx channel. */ +static const char PRG_ARG_SERIAL_RX_CH_DEFAULT[] = "1"; -/** Program argument default value of the serial over socket flag. */ -static bool PRG_ARG_IS_SERIAL_OVER_SOCKET_DEFAULT = false; +/** Program argument default value of the serial tx channel. */ +static const char PRG_ARG_SERIAL_TX_CH_DEFAULT[] = "2"; -/** - * Maximum number of socket connections. - */ -static const uint8_t SOCKET_SERVER_MAX_CONNECTIONS = 1U; +/** Program argument default value of the verbose flag. */ +static bool PRG_ARG_VERBOSE_DEFAULT = false; #endif /* UNIT_TEST */ @@ -175,14 +179,15 @@ extern void delay(unsigned long ms) } } -#else +#else /* UNIT_TEST */ extern int main(int argc, char** argv) { - int status = 0; - Keyboard& keyboard = Board::getInstance().getKeyboard(); - PrgArguments prgArguments; - SocketServer socketStream; + int status = 0; + Board& board = Board::getInstance(); + Keyboard& keyboard = board.getKeyboard(); + WebotsSerialDrv* simSerial = board.getSimSerial(); + PrgArguments prgArguments; printf("\n*** Radon Ulzer ***\n"); @@ -200,30 +205,34 @@ extern int main(int argc, char** argv) showPrgArguments(prgArguments); } - /* Enable socket server? */ - if (true == prgArguments.isSerialOverSocket) + /* It might happen that the user enables the ZumoComSystem, but the + * choosen application doesn't support it. + */ + if ((nullptr == simSerial) && (true == prgArguments.isZumoComSystemEnabled)) { - if (false == socketStream.init(prgArguments.socketServerPort, SOCKET_SERVER_MAX_CONNECTIONS)) - { - printf("Error initializing SocketServer.\n"); - status = -1; - } - else - { - if (true == prgArguments.verbose) - { - printf("SocketServer ready on port %s.\n", prgArguments.socketServerPort); - } + printf("Warning: The application doesn't support the ZumoComSystem.\n"); - Serial.setStream(socketStream); - Logging::disable(); - } + prgArguments.isZumoComSystemEnabled = false; + } + + /* Is ZumoComSystem enabled? */ + if ((nullptr != simSerial) && (true == prgArguments.isZumoComSystemEnabled)) + { + /* Set serial rx/tx channels for communication with the ZumoComSystem. */ + simSerial->setRxChannel(atoi(prgArguments.serialRxChannel)); + simSerial->setTxChannel(atoi(prgArguments.serialTxChannel)); + + /* Use the serial interface for ZumoComSystem communication and not for + * logging. + */ + Serial.setStream(*simSerial); + Logging::disable(); } if (0 == status) { /* Get simulation time handler. It will be used by millis() and delay(). */ - gSimTime = &Board::getInstance().getSimTime(); + gSimTime = &board.getSimTime(); } } @@ -249,12 +258,12 @@ extern int main(int argc, char** argv) */ /* Enable all simulation devices. Must be done before any other access to the devices. */ - Board::getInstance().enableSimulationDevices(); + board.enableSimulationDevices(); /* Do one single simulation step to force that all sensors will deliver already data. * Otherwise e.g. the position sensor will provide NaN. * This must be done before setup() is called! - * + * * Prerequisite: The sensors must be enabled! */ if (false == gSimTime->step()) @@ -271,7 +280,6 @@ extern int main(int argc, char** argv) { keyboard.getPressedButtons(); loop(); - socketStream.process(); } } } @@ -314,30 +322,48 @@ extern void delay(unsigned long ms) static int handleCommandLineArguments(PrgArguments& prgArguments, int argc, char** argv) { int status = 0; - const char* availableOptions = "p:n:hs"; + const char* availableOptions = "n:cnvh"; const char* programName = argv[0]; - int option = getopt(argc, argv, availableOptions); + int optionIndex = 0; + int option = getopt_long(argc, argv, availableOptions, LONG_OPTIONS, &optionIndex); /* Set default values */ - prgArguments.socketServerPort = PRG_ARG_SOCKET_SERVER_PORT_DEFAULT; - prgArguments.robotName = PRG_ARG_ROBOT_NAME_DEFAULT; - prgArguments.verbose = PRG_ARG_VERBOSE_DEFAULT; - prgArguments.isSerialOverSocket = PRG_ARG_IS_SERIAL_OVER_SOCKET_DEFAULT; + prgArguments.robotName = PRG_ARG_ROBOT_NAME_DEFAULT; + prgArguments.isZumoComSystemEnabled = PRG_ARG_IS_ZUMO_COM_SYSTEM_ENABLED_DEFAULT; + prgArguments.serialRxChannel = PRG_ARG_SERIAL_RX_CH_DEFAULT; + prgArguments.serialTxChannel = PRG_ARG_SERIAL_TX_CH_DEFAULT; + prgArguments.verbose = PRG_ARG_VERBOSE_DEFAULT; while ((-1 != option) && (0 == status)) { switch (option) { - case 'n': /* Name */ - prgArguments.robotName = optarg; + case 0: /* Long option */ + + if (0 == strcmp(LONG_OPTIONS[optionIndex].name, "help")) + { + status = -1; + } + else if (0 == strcmp(LONG_OPTIONS[optionIndex].name, "serialRxCh")) + { + prgArguments.serialRxChannel = optarg; + } + else if (0 == strcmp(LONG_OPTIONS[optionIndex].name, "serialTxCh")) + { + prgArguments.serialTxChannel = optarg; + } + else + { + status = -1; + } break; - case 'p': /* SocketServer Port */ - prgArguments.socketServerPort = optarg; + case 'c': /* Is ZumoComSystem enabled? */ + prgArguments.isZumoComSystemEnabled = true; break; - case 's': /* Is serial over socket? */ - prgArguments.isSerialOverSocket = true; + case 'n': /* Name */ + prgArguments.robotName = optarg; break; case 'v': /* Verbose */ @@ -355,19 +381,21 @@ static int handleCommandLineArguments(PrgArguments& prgArguments, int argc, char break; } - option = getopt(argc, argv, availableOptions); + option = getopt_long(argc, argv, availableOptions, LONG_OPTIONS, &optionIndex); } /* Does the user need help? */ if (0 > status) { printf("Usage: %s \nOptions:\n", programName); - printf("\t-h\t\t\tShow this help message.\n"); /* Help */ - printf("\t-n \t\tSet robot name.\n"); /* Robot Name */ - printf("\t-p \tSet SocketServer port."); /* SocketServer Port */ - printf(" Default: %s\n", PRG_ARG_SOCKET_SERVER_PORT_DEFAULT); /* SocketServer port default value */ - printf("\t-s\t\t\tEnable serial over socket.\n"); /* Flag */ - printf("\t-v\t\t\tVerbose mode.\n"); /* Flag */ + printf("\t-h\t\t\tShow this help message.\n"); /* Help */ + printf("\t-n \t\tSet robot name.\n"); /* Robot Name */ + printf("\t-c\t\t\tEnable ZumoComSystem. Default: Disabled\n"); /* Flag */ + printf("\t--serialRxCh \t\tSet serial rx channel (ZumoComSystem)."); /* Serial rx channel */ + printf(" Default: %s\n", PRG_ARG_SERIAL_RX_CH_DEFAULT); /* Serial rx channel default value */ + printf("\t--serialTxCh \t\tSet serial tx channel (ZumoComSystem)."); /* Serial txchannel */ + printf(" Default: %s\n", PRG_ARG_SERIAL_TX_CH_DEFAULT); /* Serial tx channel default value */ + printf("\t-v\t\t\tVerbose mode. Default: Disabled\n"); /* Flag */ } return status; @@ -380,10 +408,11 @@ static int handleCommandLineArguments(PrgArguments& prgArguments, int argc, char */ static void showPrgArguments(const PrgArguments& prgArgs) { - printf("Robot name : %s\n", prgArgs.robotName); - printf("SocketServer Port : %s\n", prgArgs.socketServerPort); - printf("Serial over socket: %s\n", (false == prgArgs.isSerialOverSocket) ? "disabled" : "enabled"); + printf("Robot name : %s\n", prgArgs.robotName); + printf("ZumoComSystem : %s\n", (false == prgArgs.isZumoComSystemEnabled) ? "disabled" : "enabled"); + printf("Serial rx channel: %s\n", prgArgs.serialRxChannel); + printf("Serial tx channel: %s\n", prgArgs.serialTxChannel); /* Skip verbose flag. */ } -#endif \ No newline at end of file +#endif /* UNIT_TEST */ \ No newline at end of file diff --git a/lib/ArduinoNative/SocketServer.cpp b/lib/ArduinoNative/SocketServer.cpp deleted file mode 100644 index 4ce3c61c..00000000 --- a/lib/ArduinoNative/SocketServer.cpp +++ /dev/null @@ -1,444 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 - 2024 Andreas Merkle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/******************************************************************************* - DESCRIPTION -*******************************************************************************/ -/** - * @brief Socket Server for Inter-Process Communication - * @author Gabryel Reyes - */ - -/****************************************************************************** - * Includes - *****************************************************************************/ - -#include "SocketServer.h" -#include -#include -#include - -#ifdef _WIN32 -#undef UNICODE -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#pragma comment(lib, "Ws2_32.lib") -#else -#include /* definition of inet_ntoa */ -#include /* definition of gethostbyname */ -#include /* definition of struct sockaddr_in */ -#include -#include -#include /* definition of close */ -#include /* definition of memset for tests. */ -#endif - -/****************************************************************************** - * Macros - *****************************************************************************/ - -#ifndef _WIN32 -#define INVALID_SOCKET (SOCKET)(~0) -#define SOCKET_ERROR (-1) -#endif - -/****************************************************************************** - * Types and classes - *****************************************************************************/ - -#ifndef _WIN32 -typedef unsigned int UINT_PTR; -typedef UINT_PTR SOCKET; -#endif - -/****************************************************************************** - * Prototypes - *****************************************************************************/ - -/****************************************************************************** - * Local Variables - *****************************************************************************/ - -/** SocketServer Members. PIMPL Idiom. */ -struct SocketServer::SocketServerImpl -{ - /** - * File Descriptor of the Client Socket. - */ - SOCKET m_clientSocket; - - /** - * File Descriptor of the Listening Socket. - */ - SOCKET m_listenSocket; - - /** - * Queue for the received bytes. - */ - std::queue m_rcvQueue; - - /** - * Construct an SocketServerImpl instance. - */ - SocketServerImpl() : m_clientSocket(INVALID_SOCKET), m_listenSocket(INVALID_SOCKET), m_rcvQueue() - { - } -}; - -/****************************************************************************** - * Public Methods - *****************************************************************************/ - -SocketServer::SocketServer() : Stream(), m_members(new SocketServerImpl) -{ -} - -SocketServer::~SocketServer() -{ - /* Sockets are closed before deleting m_members. */ - closeListeningSocket(); - - if (nullptr != m_members) - { - delete m_members; - } -} - -bool SocketServer::init(const char* port, uint8_t maxConnections) -{ - int result; - struct addrinfo hints; - struct addrinfo* addrInfo = nullptr; - - if (nullptr == m_members) - { - return false; - } - - memset(&hints, 0, sizeof(struct addrinfo)); - - hints.ai_family = AF_INET; - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = IPPROTO_TCP; - hints.ai_flags = AI_PASSIVE; - -#ifdef _WIN32 - WSADATA wsaData; - - /* Initialize Winsock */ - result = WSAStartup(MAKEWORD(2, 2), &wsaData); - if (0 != result) - { - printf("WSAStartup failed with error: %d\n", result); - return false; - } - -#endif - - /* Resolve the server address and port */ - result = getaddrinfo(nullptr, port, &hints, &addrInfo); - if (0 != result) - { - printf("getaddrinfo failed with error: %d\n", result); - closeListeningSocket(); - return false; - } - - /* Create a SOCKET for the server to listen for client connections. */ - m_members->m_listenSocket = socket(addrInfo->ai_family, addrInfo->ai_socktype, addrInfo->ai_protocol); - if (INVALID_SOCKET == m_members->m_listenSocket) - { - printf("socket failed\n"); - freeaddrinfo(addrInfo); - closeListeningSocket(); - return false; - } - - /* Setup the TCP listening socket */ - result = bind(m_members->m_listenSocket, addrInfo->ai_addr, static_cast(addrInfo->ai_addrlen)); - if (SOCKET_ERROR == result) - { - printf("bind failed\n"); - freeaddrinfo(addrInfo); - closeListeningSocket(); - return false; - } - - freeaddrinfo(addrInfo); - - result = listen(m_members->m_listenSocket, maxConnections); - if (SOCKET_ERROR == result) - { - printf("listen failed\n"); - closeListeningSocket(); - return false; - } - - return true; -} - -void SocketServer::print(const char str[]) -{ - /* Not implemented*/ - (void)str; -} - -void SocketServer::print(uint8_t value) -{ - /* Not implemented*/ - (void)value; -} - -void SocketServer::print(uint16_t value) -{ - /* Not implemented*/ - (void)value; -} - -void SocketServer::print(uint32_t value) -{ - /* Not implemented*/ - (void)value; -} - -void SocketServer::print(int8_t value) -{ - /* Not implemented*/ - (void)value; -} - -void SocketServer::print(int16_t value) -{ - /* Not implemented*/ - (void)value; -} - -void SocketServer::print(int32_t value) -{ - /* Not implemented*/ - (void)value; -} - -void SocketServer::println(const char str[]) -{ - /* Not implemented*/ - (void)str; -} - -void SocketServer::println(uint8_t value) -{ - /* Not implemented*/ - (void)value; -} - -void SocketServer::println(uint16_t value) -{ - /* Not implemented*/ - (void)value; -} - -void SocketServer::println(uint32_t value) -{ - /* Not implemented*/ - (void)value; -} - -void SocketServer::println(int8_t value) -{ - /* Not implemented*/ - (void)value; -} - -void SocketServer::println(int16_t value) -{ - /* Not implemented*/ - (void)value; -} - -void SocketServer::println(int32_t value) -{ - /* Not implemented*/ - (void)value; -} - -size_t SocketServer::write(const uint8_t* buffer, size_t length) -{ - size_t bytesSent = 0; - - if (nullptr != m_members) - { - /* Echo the buffer back to the sender */ - if (INVALID_SOCKET != m_members->m_clientSocket) - { - int result = send(m_members->m_clientSocket, reinterpret_cast(buffer), length, 0); - if (SOCKET_ERROR == result) - { - printf("send failed\n"); - /* Error on the socket. Client is now invalid. */ - m_members->m_clientSocket = INVALID_SOCKET; - } - else - { - bytesSent = result; - } - } - } - return bytesSent; -} - -int SocketServer::available() const -{ - return (nullptr != m_members) ? m_members->m_rcvQueue.size() : 0; -} - -size_t SocketServer::readBytes(uint8_t* buffer, size_t length) -{ - size_t count = 0; - - for (count = 0; count < length; count++) - { - uint8_t byte; - if (false == getByte(byte)) - { - break; - } - else - { - buffer[count] = byte; - } - } - - return count; -} - -void SocketServer::process() -{ - if (nullptr != m_members) - { - if (INVALID_SOCKET != m_members->m_listenSocket) - { - fd_set readFDS, writeFDS, exceptFDS; - int result; - struct timeval timeout; - - timeout.tv_sec = 0; - timeout.tv_usec = 0; - - FD_ZERO(&readFDS); - FD_ZERO(&writeFDS); - FD_ZERO(&exceptFDS); - - FD_SET(m_members->m_listenSocket, &readFDS); - FD_SET(m_members->m_listenSocket, &exceptFDS); - - /* If there is a client connected */ - if (INVALID_SOCKET != m_members->m_clientSocket) - { - FD_SET(m_members->m_clientSocket, &readFDS); - FD_SET(m_members->m_clientSocket, &exceptFDS); - } - - result = select(m_members->m_listenSocket + 1, &readFDS, &writeFDS, &exceptFDS, &timeout); - - if (0 < result) - { - /* New Client Connection available */ - if (FD_ISSET(m_members->m_listenSocket, &readFDS)) - { - /* Accept a client socket */ - m_members->m_clientSocket = accept(m_members->m_listenSocket, nullptr, nullptr); - if (INVALID_SOCKET == m_members->m_clientSocket) - { - printf("accept failed\n"); - } - } - - /* Client Ready to read */ - if (FD_ISSET(m_members->m_clientSocket, &readFDS)) - { - const size_t bufferLength = UINT8_MAX; - char recvbuf[bufferLength]; - int result = recv(m_members->m_clientSocket, recvbuf, bufferLength, 0); - - if (0 < result) - { - for (uint8_t idx = 0; idx < result; idx++) - { - m_members->m_rcvQueue.push(static_cast(recvbuf[idx])); - } - } - else - { - /* Client disconnected or error on the socket. */ - m_members->m_clientSocket = INVALID_SOCKET; - } - } - } - } - } -} - -/****************************************************************************** - * Private Methods - *****************************************************************************/ - -void SocketServer::closeListeningSocket() -{ - if (nullptr != m_members) - { - /* Close the listening socket. */ - if (INVALID_SOCKET != m_members->m_listenSocket) - { -#ifdef _WIN32 - closesocket(m_members->m_listenSocket); -#else - close(m_members->m_listenSocket); -#endif - } - } - -#ifdef _WIN32 - /* Terminate the use of the Winsock 2 DLL. */ - WSACleanup(); -#endif -} - -bool SocketServer::getByte(uint8_t& byte) -{ - if (nullptr != m_members) - { - if (false == m_members->m_rcvQueue.empty()) - { - byte = m_members->m_rcvQueue.front(); - m_members->m_rcvQueue.pop(); - return true; - } - } - return false; -} - -/****************************************************************************** - * Local Functions - *****************************************************************************/ diff --git a/lib/HALCalibSim/Board.h b/lib/HALCalibSim/Board.h index fa2d0826..3e86dd3a 100644 --- a/lib/HALCalibSim/Board.h +++ b/lib/HALCalibSim/Board.h @@ -394,6 +394,17 @@ class Board : public IBoard return m_keyboard; } + /** + * Get the simulation serial driver, which is connected within Webots. + * + * @return If serial driver is available, it will return a pointer to it, otherwise nullptr. + */ + WebotsSerialDrv* getSimSerial() + { + /* Not supported. */ + return nullptr; + } + /** * Enable all simulation devices. * It is called by the main entry only. diff --git a/lib/HALConvoyLeaderSim/Board.cpp b/lib/HALConvoyLeaderSim/Board.cpp index 4ce7f198..21024871 100644 --- a/lib/HALConvoyLeaderSim/Board.cpp +++ b/lib/HALConvoyLeaderSim/Board.cpp @@ -117,6 +117,12 @@ const char* Board::PROXIMITY_SENSOR_FRONT_LEFT_NAME = "proxim_sensor_fl"; /* Name of the front right proximity sensor in the robot simulation. */ const char* Board::PROXIMITY_SENSOR_FRONT_RIGHT_NAME = "proxim_sensor_fr"; +/* Name of the serial emitter in the RadonUlzer simulation. */ +const char* Board::EMITTER_NAME_SERIAL = "serialComTx"; + +/* Name of the serial receiver in the RadonUlzer simulation. */ +const char* Board::RECEIVER_NAME_SERIAL = "serialComRx"; + /****************************************************************************** * Public Methods *****************************************************************************/ @@ -160,6 +166,7 @@ Board::Board() : m_ledGreen(m_robot.getLED(LED_GREEN_NAME)), m_proximitySensors(m_robot.getDistanceSensor(PROXIMITY_SENSOR_FRONT_LEFT_NAME), m_robot.getDistanceSensor(PROXIMITY_SENSOR_FRONT_RIGHT_NAME)), + m_serialDrv(m_robot.getEmitter(EMITTER_NAME_SERIAL), m_robot.getReceiver(RECEIVER_NAME_SERIAL)), m_settings() { } @@ -178,6 +185,7 @@ void Board::enableSimulationDevices() m_robot.getDistanceSensor(LIGHT_SENSOR_4_NAME)->enable(timeStep); m_robot.getDistanceSensor(PROXIMITY_SENSOR_FRONT_LEFT_NAME)->enable(timeStep); m_robot.getDistanceSensor(PROXIMITY_SENSOR_FRONT_RIGHT_NAME)->enable(timeStep); + m_robot.getReceiver(RECEIVER_NAME_SERIAL)->enable(timeStep); } /****************************************************************************** diff --git a/lib/HALConvoyLeaderSim/Board.h b/lib/HALConvoyLeaderSim/Board.h index 50b27ee4..a63e52ca 100644 --- a/lib/HALConvoyLeaderSim/Board.h +++ b/lib/HALConvoyLeaderSim/Board.h @@ -62,6 +62,7 @@ #include #include #include +#include /****************************************************************************** * Macros @@ -296,6 +297,12 @@ class Board : public IBoard /** Name of the front right proximity sensor in the robot simulation. */ static const char* PROXIMITY_SENSOR_FRONT_RIGHT_NAME; + /** Name of the serial emitter in the RadonUlzer simulation. */ + static const char* EMITTER_NAME_SERIAL; + + /** Name of the serial receiver in the RadonUlzer simulation. */ + static const char* RECEIVER_NAME_SERIAL; + /** Simulated roboter instance. */ webots::Robot m_robot; @@ -341,6 +348,9 @@ class Board : public IBoard /** Proximity sensors */ ProximitySensors m_proximitySensors; + /** Simulation serial driver */ + WebotsSerialDrv m_serialDrv; + /** Settings */ Settings m_settings; @@ -376,6 +386,16 @@ class Board : public IBoard return m_keyboard; } + /** + * Get the simulation serial driver, which is connected within Webots. + * + * @return If serial driver is available, it will return a pointer to it, otherwise nullptr. + */ + WebotsSerialDrv* getSimSerial() + { + return &m_serialDrv; + } + /** * Enable all simulation devices. * It is called by the main entry only. diff --git a/lib/HALLineFollowerSim/Board.h b/lib/HALLineFollowerSim/Board.h index eb439e40..264c292e 100644 --- a/lib/HALLineFollowerSim/Board.h +++ b/lib/HALLineFollowerSim/Board.h @@ -392,6 +392,17 @@ class Board : public IBoard return m_keyboard; } + /** + * Get the simulation serial driver, which is connected within Webots. + * + * @return If serial driver is available, it will return a pointer to it, otherwise nullptr. + */ + WebotsSerialDrv* getSimSerial() + { + /* Not supported. */ + return nullptr; + } + /** * Enable all simulation devices. * It is called by the main entry only. diff --git a/lib/HALRemoteControlSim/Board.cpp b/lib/HALRemoteControlSim/Board.cpp index 21a8f080..dfc17741 100644 --- a/lib/HALRemoteControlSim/Board.cpp +++ b/lib/HALRemoteControlSim/Board.cpp @@ -117,6 +117,12 @@ const char* Board::PROXIMITY_SENSOR_FRONT_LEFT_NAME = "proxim_sensor_fl"; /* Name of the front right proximity sensor in the robot simulation. */ const char* Board::PROXIMITY_SENSOR_FRONT_RIGHT_NAME = "proxim_sensor_fr"; +/* Name of the serial emitter in the RadonUlzer simulation. */ +const char* Board::EMITTER_NAME_SERIAL = "serialComTx"; + +/* Name of the serial receiver in the RadonUlzer simulation. */ +const char* Board::RECEIVER_NAME_SERIAL = "serialComRx"; + /****************************************************************************** * Public Methods *****************************************************************************/ @@ -160,6 +166,7 @@ Board::Board() : m_ledGreen(m_robot.getLED(LED_GREEN_NAME)), m_proximitySensors(m_robot.getDistanceSensor(PROXIMITY_SENSOR_FRONT_LEFT_NAME), m_robot.getDistanceSensor(PROXIMITY_SENSOR_FRONT_RIGHT_NAME)), + m_serialDrv(m_robot.getEmitter(EMITTER_NAME_SERIAL), m_robot.getReceiver(RECEIVER_NAME_SERIAL)), m_settings() { } @@ -178,6 +185,7 @@ void Board::enableSimulationDevices() m_robot.getDistanceSensor(LIGHT_SENSOR_4_NAME)->enable(timeStep); m_robot.getDistanceSensor(PROXIMITY_SENSOR_FRONT_LEFT_NAME)->enable(timeStep); m_robot.getDistanceSensor(PROXIMITY_SENSOR_FRONT_RIGHT_NAME)->enable(timeStep); + m_robot.getReceiver(RECEIVER_NAME_SERIAL)->enable(timeStep); } /****************************************************************************** * External Functions diff --git a/lib/HALRemoteControlSim/Board.h b/lib/HALRemoteControlSim/Board.h index 50b27ee4..a63e52ca 100644 --- a/lib/HALRemoteControlSim/Board.h +++ b/lib/HALRemoteControlSim/Board.h @@ -62,6 +62,7 @@ #include #include #include +#include /****************************************************************************** * Macros @@ -296,6 +297,12 @@ class Board : public IBoard /** Name of the front right proximity sensor in the robot simulation. */ static const char* PROXIMITY_SENSOR_FRONT_RIGHT_NAME; + /** Name of the serial emitter in the RadonUlzer simulation. */ + static const char* EMITTER_NAME_SERIAL; + + /** Name of the serial receiver in the RadonUlzer simulation. */ + static const char* RECEIVER_NAME_SERIAL; + /** Simulated roboter instance. */ webots::Robot m_robot; @@ -341,6 +348,9 @@ class Board : public IBoard /** Proximity sensors */ ProximitySensors m_proximitySensors; + /** Simulation serial driver */ + WebotsSerialDrv m_serialDrv; + /** Settings */ Settings m_settings; @@ -376,6 +386,16 @@ class Board : public IBoard return m_keyboard; } + /** + * Get the simulation serial driver, which is connected within Webots. + * + * @return If serial driver is available, it will return a pointer to it, otherwise nullptr. + */ + WebotsSerialDrv* getSimSerial() + { + return &m_serialDrv; + } + /** * Enable all simulation devices. * It is called by the main entry only. diff --git a/lib/HALSensorFusionSim/Board.cpp b/lib/HALSensorFusionSim/Board.cpp index 6d00879d..83e5c589 100644 --- a/lib/HALSensorFusionSim/Board.cpp +++ b/lib/HALSensorFusionSim/Board.cpp @@ -111,6 +111,12 @@ const char* Board::GYRO_NAME = "gyro"; /* Name of the magnetometer in the robot simulation. */ const char* Board::MAGNETOMETER_NAME = "magnetometer"; +/* Name of the serial emitter in the RadonUlzer simulation. */ +const char* Board::EMITTER_NAME_SERIAL = "serialComTx"; + +/* Name of the serial receiver in the RadonUlzer simulation. */ +const char* Board::RECEIVER_NAME_SERIAL = "serialComRx"; + /****************************************************************************** * Public Methods *****************************************************************************/ @@ -152,6 +158,7 @@ Board::Board() : m_ledYellow(m_robot.getLED(LED_YELLOW_NAME)), m_imu(m_robot.getAccelerometer(ACCELEROMETER_NAME), m_robot.getGyro(GYRO_NAME), m_robot.getCompass(MAGNETOMETER_NAME)), + m_serialDrv(m_robot.getEmitter(EMITTER_NAME_SERIAL), m_robot.getReceiver(RECEIVER_NAME_SERIAL)), m_settings() { } @@ -171,6 +178,7 @@ void Board::enableSimulationDevices() m_robot.getAccelerometer(ACCELEROMETER_NAME)->enable(timeStep); m_robot.getGyro(GYRO_NAME)->enable(timeStep); m_robot.getCompass(MAGNETOMETER_NAME)->enable(timeStep); + m_robot.getReceiver(RECEIVER_NAME_SERIAL)->enable(timeStep); } /****************************************************************************** diff --git a/lib/HALSensorFusionSim/Board.h b/lib/HALSensorFusionSim/Board.h index 70a5ae61..c89d5912 100644 --- a/lib/HALSensorFusionSim/Board.h +++ b/lib/HALSensorFusionSim/Board.h @@ -57,6 +57,7 @@ #include #include #include +#include /****************************************************************************** * Macros @@ -235,6 +236,12 @@ class Board : public IBoard /** Name of the Magnetometer in the robot simulation. */ static const char* MAGNETOMETER_NAME; + /** Name of the serial emitter in the RadonUlzer simulation. */ + static const char* EMITTER_NAME_SERIAL; + + /** Name of the serial receiver in the RadonUlzer simulation. */ + static const char* RECEIVER_NAME_SERIAL; + /** Simulated roboter instance. */ webots::Robot m_robot; @@ -265,6 +272,9 @@ class Board : public IBoard /** IMU driver */ IMU m_imu; + /** Simulation serial driver */ + WebotsSerialDrv m_serialDrv; + /** Settings */ Settings m_settings; @@ -300,6 +310,16 @@ class Board : public IBoard return m_keyboard; } + /** + * Get the simulation serial driver, which is connected within Webots. + * + * @return If serial driver is available, it will return a pointer to it, otherwise nullptr. + */ + WebotsSerialDrv* getSimSerial() + { + return &m_serialDrv; + } + /** * Enable all simulation devices. * It is called by the main entry only. diff --git a/lib/HALSim/WebotsSerialDrv.cpp b/lib/HALSim/WebotsSerialDrv.cpp new file mode 100644 index 00000000..24d01752 --- /dev/null +++ b/lib/HALSim/WebotsSerialDrv.cpp @@ -0,0 +1,309 @@ +/* MIT License + * + * Copyright (c) 2023 - 2024 Andreas Merkle + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/******************************************************************************* + DESCRIPTION +*******************************************************************************/ +/** + * @brief Webots serial driver + * @author Andreas Merkle + */ + +/****************************************************************************** + * Includes + *****************************************************************************/ +#include "WebotsSerialDrv.h" +#include + +/****************************************************************************** + * Macros + *****************************************************************************/ + +/****************************************************************************** + * Types and classes + *****************************************************************************/ + +/****************************************************************************** + * Prototypes + *****************************************************************************/ + +/****************************************************************************** + * Local Variables + *****************************************************************************/ + +/****************************************************************************** + * Public Methods + *****************************************************************************/ + +WebotsSerialDrv::WebotsSerialDrv(webots::Emitter* emitter, webots::Receiver* receiver) : + Stream(), + m_emitter(emitter), + m_receiver(receiver), + m_dataRemains(0U) +{ + /* Nothing to do. */ +} + +WebotsSerialDrv::~WebotsSerialDrv() +{ + /* Nothing to do. */ +} + +void WebotsSerialDrv::setRxChannel(int32_t channelId) +{ + if (nullptr != m_receiver) + { + /* Shall be positive for inter-robot communication. */ + if (0 <= channelId) + { + m_receiver->setChannel(channelId); + } + } +} + +void WebotsSerialDrv::setTxChannel(int32_t channelId) +{ + if (nullptr != m_emitter) + { + /* Shall be positive for inter-robot communication. */ + if (0 <= channelId) + { + m_emitter->setChannel(channelId); + } + } +} + +void WebotsSerialDrv::print(const char str[]) +{ + if (nullptr != str) + { + (void)m_emitter->send(str, strlen(str)); + } +} + +void WebotsSerialDrv::print(uint8_t value) +{ + char buffer[4U]; /* [0; 255] + string termination */ + int32_t length = snprintf(buffer, sizeof(buffer), "%u", value); + + (void)m_emitter->send(buffer, length); +} + +void WebotsSerialDrv::print(uint16_t value) +{ + char buffer[6U]; /* [0; 65535] + string termination */ + int32_t length = snprintf(buffer, sizeof(buffer), "%u", value); + + (void)m_emitter->send(buffer, length); +} + +void WebotsSerialDrv::print(uint32_t value) +{ + char buffer[11U]; /* [0; 4294967295] + string termination */ + int32_t length = snprintf(buffer, sizeof(buffer), "%u", value); + + (void)m_emitter->send(buffer, length); +} + +void WebotsSerialDrv::print(int8_t value) +{ + char buffer[5U]; /* [-128; 127] + string termination */ + int32_t length = snprintf(buffer, sizeof(buffer), "%d", value); + + (void)m_emitter->send(buffer, length); +} + +void WebotsSerialDrv::print(int16_t value) +{ + char buffer[6U]; /* [-32768; 32767] + string termination */ + int32_t length = snprintf(buffer, sizeof(buffer), "%d", value); + + (void)m_emitter->send(buffer, length); +} + +void WebotsSerialDrv::print(int32_t value) +{ + char buffer[12U]; /* [-2147483648; 2147483647] + string termination */ + int32_t length = snprintf(buffer, sizeof(buffer), "%d", value); + + (void)m_emitter->send(buffer, length); +} + +void WebotsSerialDrv::println(const char str[]) +{ + if (nullptr != str) + { + size_t length = strlen(str); + char buffer[length + 1U]; + + length = snprintf(buffer, sizeof(buffer), "%s\n", str); + + (void)m_emitter->send(buffer, length); + } +} + +void WebotsSerialDrv::println(uint8_t value) +{ + char buffer[5U]; /* [0; 255] + LF + string termination */ + int32_t length = snprintf(buffer, sizeof(buffer), "%u\n", value); + + (void)m_emitter->send(buffer, length); +} + +void WebotsSerialDrv::println(uint16_t value) +{ + char buffer[7U]; /* [0; 65535] + LF + string termination */ + int32_t length = snprintf(buffer, sizeof(buffer), "%u\n", value); + + (void)m_emitter->send(buffer, length); +} + +void WebotsSerialDrv::println(uint32_t value) +{ + char buffer[12U]; /* [0; 4294967295] + LF + string termination */ + int32_t length = snprintf(buffer, sizeof(buffer), "%u\n", value); + + (void)m_emitter->send(buffer, length); +} + +void WebotsSerialDrv::println(int8_t value) +{ + char buffer[6U]; /* [-128; 127] + LF + string termination */ + int32_t length = snprintf(buffer, sizeof(buffer), "%d\n", value); + + (void)m_emitter->send(buffer, length); +} + +void WebotsSerialDrv::println(int16_t value) +{ + char buffer[7U]; /* [-32768; 32767] + LF + string termination */ + int32_t length = snprintf(buffer, sizeof(buffer), "%d\n", value); + + (void)m_emitter->send(buffer, length); +} + +void WebotsSerialDrv::println(int32_t value) +{ + char buffer[13U]; /* [-2147483648; 2147483647] + LF + string termination */ + int32_t length = snprintf(buffer, sizeof(buffer), "%d\n", value); + + (void)m_emitter->send(buffer, length); +} + +size_t WebotsSerialDrv::write(const uint8_t* buffer, size_t length) +{ + int32_t result = m_emitter->send(buffer, length); + const int32_t SUCCESS = 1; + + return (SUCCESS == result) ? length : 0; +} + +int WebotsSerialDrv::available() const +{ + int32_t dataSize = 0; + + /* If in the last read not all data was read, return the remaining bytes. */ + if (0U < m_dataRemains) + { + dataSize = m_dataRemains; + } + /* Otherwise return the size of the current head packet. + * Attention, calling the getDataSize() is illegal in case the queue is + * empty! + */ + else if (0 < m_receiver->getQueueLength()) + { + dataSize = m_receiver->getDataSize(); + } + else + { + /* Nothing to do. */ + ; + } + + return dataSize; +} + +size_t WebotsSerialDrv::readBytes(uint8_t* buffer, size_t length) +{ + size_t read = 0U; + + /* Attention, calling the getData() or getDataSize() is illegal in case the + * queue is empty! + */ + if (0 < m_receiver->getQueueLength()) + { + const uint8_t* message = static_cast(m_receiver->getData()); + int32_t messageSize = m_receiver->getDataSize(); + + /* If in the last read not all data was read, return the remaining bytes. */ + if (0U < m_dataRemains) + { + /* Partial read? */ + if (m_dataRemains > length) + { + read = length; + } + /* Read all. */ + else + { + read = m_dataRemains; + } + + (void)memcpy(buffer, &message[messageSize - m_dataRemains], read); + m_dataRemains -= read; + } + else + { + /* Partial read? */ + if (messageSize > length) + { + read = length; + } + /* Read all. */ + else + { + read = messageSize; + } + + (void)memcpy(buffer, message, read); + m_dataRemains = messageSize - read; + } + + /* If the complete head packet is read, it will be thrown away. */ + if (0U == m_dataRemains) + { + m_receiver->nextPacket(); + } + } + + return read; +} + +/****************************************************************************** + * Private Methods + *****************************************************************************/ + +/****************************************************************************** + * Local Functions + *****************************************************************************/ diff --git a/lib/ArduinoNative/SocketServer.h b/lib/HALSim/WebotsSerialDrv.h similarity index 52% rename from lib/ArduinoNative/SocketServer.h rename to lib/HALSim/WebotsSerialDrv.h index c063ac16..7b7e9c33 100644 --- a/lib/ArduinoNative/SocketServer.h +++ b/lib/HALSim/WebotsSerialDrv.h @@ -25,18 +25,23 @@ DESCRIPTION *******************************************************************************/ /** - * @brief Socket Server for Inter-Process Communication - * @author Gabryel Reyes + * @brief Webots serial driver + * @author Andreas Merkle + * + * @addtogroup HALSim + * + * @{ */ -#ifndef SOCKET_SERVER_H -#define SOCKET_SERVER_H +#ifndef WEBOTS_SERIAL_DRV_H +#define WEBOTS_SERIAL_DRV_H /****************************************************************************** * Includes *****************************************************************************/ - #include "Stream.h" +#include +#include /****************************************************************************** * Macros @@ -47,169 +52,179 @@ *****************************************************************************/ /** - * Socket Server for Inter-Process Communication. + * Webots serial driver. */ -class SocketServer : public Stream +class WebotsSerialDrv : public Stream { public: /** - * Construct a SocketServer. + * Construct a Webots serial driver. + * + * @param[in] emitter Webots emitter used to send data over simulated serial. + * @param[in] receiver Webots receiver used to receive data over simulated serial. + */ + WebotsSerialDrv(webots::Emitter* emitter, webots::Receiver* receiver); + + /** + * Destruct the Webots serial driver. */ - SocketServer(); + virtual ~WebotsSerialDrv(); /** - * Destruct the SocketServer. + * Set the serial receive channel id. + * + * @param[in] channelId Channel ID, shall be positive for inter-robot communication. */ - ~SocketServer(); + void setRxChannel(int32_t channelId); /** - * Initialize the SocketServer. - * @param[in] port Port number to set the Socket to. - * @param[in] maxConnections Number of maxConnections allowed. - * @returns true if server has been succesfully set-up. + * Set the serial sender channel id. + * + * @param[in] channelId Channel ID, shall be positive for inter-robot communication. */ - bool init(const char* port, uint8_t maxConnections); + void setTxChannel(int32_t channelId); /** - * Print argument to the Output Stream. + * Print argument to the output stream. + * * @param[in] str Argument to print. */ void print(const char str[]) final; /** - * Print argument to the Output Stream. + * Print argument to the output stream. + * * @param[in] value Argument to print. */ void print(uint8_t value) final; /** - * Print argument to the Output Stream. + * Print argument to the output stream. + * * @param[in] value Argument to print. */ void print(uint16_t value) final; /** - * Print argument to the Output Stream. + * Print argument to the output stream. + * * @param[in] value Argument to print. */ void print(uint32_t value) final; /** - * Print argument to the Output Stream. + * Print argument to the output stream. + * * @param[in] value Argument to print. */ void print(int8_t value) final; /** - * Print argument to the Output Stream. + * Print argument to the output stream. + * * @param[in] value Argument to print. */ void print(int16_t value) final; /** - * Print argument to the Output Stream. + * Print argument to the output stream. + * * @param[in] value Argument to print. */ void print(int32_t value) final; /** - * Print argument to the Output Stream. - * Appends Carriage Return at the end of the argument. + * Print argument to the output stream. + * Appends carriage return at the end of the argument. + * * @param[in] str Argument to print. */ void println(const char str[]) final; /** - * Print argument to the Output Stream. - * Appends Carriage Return at the end of the argument. + * Print argument to the output stream. + * Appends carriage return at the end of the argument. + * * @param[in] value Argument to print. */ void println(uint8_t value) final; /** - * Print argument to the Output Stream. - * Appends Carriage Return at the end of the argument. + * Print argument to the output stream. + * Appends carriage return at the end of the argument. + * * @param[in] value Argument to print. */ void println(uint16_t value) final; /** - * Print argument to the Output Stream. - * Appends Carriage Return at the end of the argument. + * Print argument to the output stream. + * Appends carriage return at the end of the argument. + * * @param[in] value Argument to print. */ void println(uint32_t value) final; /** - * Print argument to the Output Stream. - * Appends Carriage Return at the end of the argument. + * Print argument to the output stream. + * Appends carriage return at the end of the argument. + * * @param[in] value Argument to print. */ void println(int8_t value) final; /** - * Print argument to the Output Stream. - * Appends Carriage Return at the end of the argument. + * Print argument to the output stream. + * Appends carriage return at the end of the argument. + * * @param[in] value Argument to print. */ void println(int16_t value) final; /** - * Print argument to the Output Stream. - * Appends Carriage Return at the end of the argument. + * Print argument to the output stream. + * Appends carriage return at the end of the argument. + * * @param[in] value Argument to print. */ void println(int32_t value) final; /** - * Send a message to the socket. - * @param[in] buf Byte buffer to send - * @param[in] length Number of bytes to send - * @returns Number of bytes written + * Write data buffer to serial. + * + * @param[in] buffer Byte buffer to send. + * @param[in] length Number of bytes to send. + * + * @return Number of bytes written. */ size_t write(const uint8_t* buffer, size_t length) final; /** * Check if any data has been received. - * @returns number of available bytes. + * + * @return Number of available bytes. */ int available() const final; /** - * Read bytes into a buffer. - * @param[in] buffer Array to write bytes to. - * @param[in] length number of bytes to be read. - * @returns Number of bytes read from Stream. + * Read data from serial. + * + * @param[in] buffer Array to read data in. + * @param[in] length Number of bytes to be read. + * + * @return Number of bytes read from stream. */ size_t readBytes(uint8_t* buffer, size_t length) final; - /** - * Process the receiving of messages and client connections. - */ - void process(); - private: - /** Struct for Implementation of PIMPL Idiom. */ - struct SocketServerImpl; - - /** SocketServer Members. PIMPL Idiom. */ - SocketServerImpl* m_members; + webots::Emitter* m_emitter; /**< The emitter used to send data. */ + webots::Receiver* m_receiver; /**< The receiver used to receive data. */ + size_t m_dataRemains; /**< Number of bytes which are remaining in head packet. */ /* Not allowed. */ - SocketServer(const SocketServer& srv); - SocketServer& operator=(const SocketServer& srv); - - /** - * Close the listening socket connection. - */ - void closeListeningSocket(); - - /** - * Get a Byte from the receiving buffer, if any. - * @param[out] byte buffer to write the byte to. - * @returns If a received byte has been succesfully written to the buffer, returns true. Otherwise, false. - */ - bool getByte(uint8_t& byte); + WebotsSerialDrv(); + WebotsSerialDrv(const WebotsSerialDrv& srv); /**< Copy construction of an instance. */ + WebotsSerialDrv& operator=(const WebotsSerialDrv& srv); /**< Assignment of an instance. */ }; #endif /* SOCKET_SERVER_H_ */ diff --git a/platformio.ini b/platformio.ini index b2b276b2..c0526b04 100644 --- a/platformio.ini +++ b/platformio.ini @@ -117,6 +117,8 @@ extra_scripts = post:./scripts/copy_webots_shared_libs.py post:./scripts/package.py webots_robot_name = Zumo +webots_robot_serial_rx_channel = 1 +webots_robot_serial_tx_channel = 2 ; ***************************************************************************** ; PC target environment for tests diff --git a/scripts/webots_launcher.py b/scripts/webots_launcher.py index eee15676..1e6b24a6 100644 --- a/scripts/webots_launcher.py +++ b/scripts/webots_launcher.py @@ -38,9 +38,15 @@ OS_PLATFORM_TYPE_LINUX = "Linux" OS_PLATFORM_TYPE_MACOS = "Darwin" OS_PLATFORM_TYPE = platform.system() -PROGRAM_PATH = "$BUILD_DIR/" -PROGRAM_OPTIONS_SOCKET = '-s' ROBOT_NAME = env.GetProjectOption("webots_robot_name") # pylint: disable=undefined-variable +ROBOT_SERIAL_RX_CHANNEL = env.GetProjectOption("webots_robot_serial_rx_channel") # pylint: disable=undefined-variable +ROBOT_SERIAL_TX_CHANNEL = env.GetProjectOption("webots_robot_serial_tx_channel") # pylint: disable=undefined-variable +PROGRAM_PATH = "$BUILD_DIR/" +PROGRAM_OPTIONS = '' +PROGRAM_OPTIONS_ZUMO_COM_SYSTEM = '-c ' \ + + '--serialRxCh ' + ROBOT_SERIAL_RX_CHANNEL + ' ' \ + + '--serialTxCh ' + ROBOT_SERIAL_TX_CHANNEL + ' ' \ + + '-v' WEBOTS_CONTROLLER_OPTIONS = '--robot-name=' + ROBOT_NAME + ' --stdout-redirect' if OS_PLATFORM_TYPE == OS_PLATFORM_TYPE_WIN: @@ -65,12 +71,13 @@ WEBOTS_LAUNCHER_ACTION = WEBOTS_CONTROLLER + ' '\ + WEBOTS_CONTROLLER_OPTIONS + ' ' \ - + PROGRAM_PATH + PROGRAM_NAME + + PROGRAM_PATH + PROGRAM_NAME + ' ' \ + + PROGRAM_OPTIONS -WEBOTS_LAUNCHER_SOCKET_ACTION = WEBOTS_CONTROLLER + ' ' \ - + WEBOTS_CONTROLLER_OPTIONS + ' ' \ - + PROGRAM_PATH + PROGRAM_NAME + ' ' \ - + PROGRAM_OPTIONS_SOCKET +WEBOTS_LAUNCHER_ZUMO_COM_SYSTEM_ACTION = WEBOTS_CONTROLLER + ' ' \ + + WEBOTS_CONTROLLER_OPTIONS + ' ' \ + + PROGRAM_PATH + PROGRAM_NAME + ' ' \ + + PROGRAM_OPTIONS_ZUMO_COM_SYSTEM ################################################################################ # Classes @@ -91,17 +98,17 @@ actions=[ WEBOTS_LAUNCHER_ACTION ], - title="WebotsLauncher", - description="Launch application with Webots launcher." + title="Launch alone", + description="Launch application with Webots launcher and without ZumoComSystem." ) # pylint: disable=undefined-variable env.AddCustomTarget( - name="webots_launcher_socket", + name="webots_launcher_zumo_com_system", dependencies=PROGRAM_PATH + PROGRAM_NAME, actions=[ - WEBOTS_LAUNCHER_SOCKET_ACTION + WEBOTS_LAUNCHER_ZUMO_COM_SYSTEM_ACTION ], - title="WebotsLauncherSocket", - description="Launch application with Webots launcher and enable socket." + title="Launch with ZumoComSystem", + description="Launch application with Webots launcher and with ZumoComSystem." ) From 46f5385c8f56775ce2842d587d042b85407bc417 Mon Sep 17 00:00:00 2001 From: BlueAndi Date: Wed, 17 Apr 2024 23:22:09 +0200 Subject: [PATCH 04/15] Model for ZumoComSystem introduced on a separate world. --- webots/protos/ZumoComSystem.proto | 40 ++++++++++++++ .../LineFollowerTrack.wbt | 52 +++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 webots/protos/ZumoComSystem.proto create mode 100644 webots/worlds/zumo_with_com_system/LineFollowerTrack.wbt diff --git a/webots/protos/ZumoComSystem.proto b/webots/protos/ZumoComSystem.proto new file mode 100644 index 00000000..58b5bb31 --- /dev/null +++ b/webots/protos/ZumoComSystem.proto @@ -0,0 +1,40 @@ +#VRML_SIM R2023a utf8 + +PROTO ZumoComSystem [ + field SFVec3f translation 0 0 0 + field SFRotation rotation 0 0 1 0 + field SFString name "ZumoComSystem" +] +{ + Robot { + translation IS translation + rotation IS rotation + children [ + DEF BODY Group { + children [ + Shape { + geometry Box { + size 0.06 0.05 0.01 + } + } + ] + } + Receiver { + name "serialComRx" + type "serial" + } + Emitter { + name "serialComTx" + type "serial" + } + ] + name IS name + description "DroidControlShip" + boundingObject USE BODY + physics Physics { + density -1 + mass 0.1 + } + controller "" + } +} \ No newline at end of file diff --git a/webots/worlds/zumo_with_com_system/LineFollowerTrack.wbt b/webots/worlds/zumo_with_com_system/LineFollowerTrack.wbt new file mode 100644 index 00000000..bc65515e --- /dev/null +++ b/webots/worlds/zumo_with_com_system/LineFollowerTrack.wbt @@ -0,0 +1,52 @@ +#VRML_SIM R2023b utf8 + +EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2023a/projects/objects/backgrounds/protos/TexturedBackground.proto" +EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2023a/projects/objects/backgrounds/protos/TexturedBackgroundLight.proto" +EXTERNPROTO "../../protos/Zumo32U4.proto" +EXTERNPROTO "../../protos/ZumoComSystem.proto" +EXTERNPROTO "../../protos/LineFollowerTrack.proto" +IMPORTABLE EXTERNPROTO "../../protos/Supervisor.proto" + +WorldInfo { + info [ + "Example uses of Track nodes, as caterpillar tracks on a robot, or as a conveyor belt." + ] + title "Track" + basicTimeStep 8 + contactProperties [ + ContactProperties { + material1 "rubber" + material2 "cardboard" + coulombFriction [ + 0.65 + ] + } + ] +} +Viewpoint { + orientation 0.3787583266277594 0.09714544028170935 -0.9203830145339561 2.677946076660944 + position 1.2569587324159737 0.7945022889765716 1.5111964909293643 +} +TexturedBackground { +} +TexturedBackgroundLight { +} +LineFollowerTrack { + contactMaterial "cardboard" +} +DEF ROBOT Zumo32U4 { + translation -0.24713614078815466 -0.04863962992854465 0.013994298332013683 + rotation -1.0564747468923541e-06 8.746699709178704e-07 0.9999999999990595 1.5880805820884731 + name "Zumo" + contactMaterial "rubber" +} +ZumoComSystem { + translation 0 0 0 + rotation 0 0 1 0 + name "ZumoComSystem" +} +Supervisor { + name "Supervisor" + controller "Supervisor" + supervisor TRUE +} From b7999f2e3d64b748d5ff7a3c63139a5632767462 Mon Sep 17 00:00:00 2001 From: BlueAndi Date: Wed, 17 Apr 2024 23:36:00 +0200 Subject: [PATCH 05/15] Description for Webots serial communication to ZumoComSystem updated. --- README.md | 17 ++++++----------- doc/images/pio_webots_launcher.jpg | Bin 104304 -> 114241 bytes doc/images/pio_webots_launcher_socket.jpg | Bin 40518 -> 0 bytes .../pio_webots_launcher_zumo_com_system.jpg | Bin 0 -> 38552 bytes 4 files changed, 6 insertions(+), 11 deletions(-) delete mode 100644 doc/images/pio_webots_launcher_socket.jpg create mode 100644 doc/images/pio_webots_launcher_zumo_com_system.jpg diff --git a/README.md b/README.md index d6a024d8..2d3a20ca 100644 --- a/README.md +++ b/README.md @@ -123,21 +123,16 @@ Example for **LineFollowerSim** application: 2. Now the keyboard keys a, b and c can be used to control the robot according to the implemented application logic. ## Communicate with the DroidControlShip -For the communication with the DroidControlShip a socket server needs to be enabled, which is disabled by default. +The communication with the DroidControlShip goes via a Webots serial connection, which is disabled by default. -Use the -s flag to enable it with default port 65432. Note, this will disable the standard logging, because the serial communication will automatically be routed over the socket. The SerialMuxProt protocol is used to exchange data in both directions. +Use the -c flag to enable it with default channels (see _webots_robot_serial_rx_channel_ and _webots_robot_serial_tx_channel_ in [platformio.ini](./platformio.ini)). Note, this will disable the standard logging, because the serial communication uses the SerialMuxProt procotol for data interchange. ```bash -$ program.exe -s +$ program.exe -c ``` -The port can be changed via command line parameters, please use -? to get more details. -```bash -$ program.exe -? -``` - -For simplicity a Platformio project task was added, which start the socket server as well. +For simplicity a Platformio project task was added, which enables the Webots serial connection as well. -![Example](./doc/images/pio_webots_launcher_socket.jpg) +![Example](./doc/images/pio_webots_launcher_zumo_com_system.jpg) # The target @@ -159,7 +154,7 @@ Example for the **LineFollowerTarget** application: | Calib | Application used for motor speed calibration. | Yes | No | ./webots/worlds/LargeTrack.wbt ./webots/worlds/LineFollowerTrack.wbt | | ConvoyLeader | A line follower, providing information to the [DroidControlShip](https://github.com/BlueAndi/DroidControlShip) in a convoy leader role. | No | Yes | ./webots/worlds/GridWithMarkers.wbt ./webots/worlds/HeadingCalculation.wbt | | LineFollower | Just a line follower, using a PID controller. | Yes | No | ./webots/worlds/ETrack.wbt ./webots/worlds/LargeTrack.wbt ./webots/worlds/LineFollowerTrack.wbt | -| RemoteControl | The robot is remote controlled by e.g. the [DroidControlShip](https://github.com/BlueAndi/DroidControlShip) in a convoy follower role. | No | Yes | Any | +| RemoteControl | The robot is remote controlled by e.g. the [DroidControlShip](https://github.com/BlueAndi/DroidControlShip) in a convoy follower role. | No | Yes | ./webots/world/zumo_with_com_system/* | | SensorFusion | The robot provides odometry and inertial data to the [DroidControlShip](https://github.com/BlueAndi/DroidControlShip), which calculates the sensor fusion based location information. | No | Yes | ./webots/worlds/SensorFustion.wbt | | Test | Only for testing purposes on native environment. | Yes | No | N/A | diff --git a/doc/images/pio_webots_launcher.jpg b/doc/images/pio_webots_launcher.jpg index e111263fe40b7fcd5a79c11324ec9e37ff7fe464..23df4c5f2c8f8edb3a7a552ed0ab4137a6493959 100644 GIT binary patch literal 114241 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
  • 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

    y!}u-jg6Er=&=7)MZD&UijnD49bxkT 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%0Ap5n^Bm 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 diff --git a/doc/images/pio_webots_launcher_zumo_com_system.jpg b/doc/images/pio_webots_launcher_zumo_com_system.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5c873d39d1bd858ebba4bd9457106aea66179930 GIT binary patch literal 38552 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 BX6FC^ literal 0 HcmV?d00001 From 6504fc871ab6c6cfa613665abe70f9db478d87dd Mon Sep 17 00:00:00 2001 From: BlueAndi Date: Wed, 17 Apr 2024 23:45:04 +0200 Subject: [PATCH 06/15] Obsolete status check condition removed. --- lib/ArduinoNative/Arduino.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/lib/ArduinoNative/Arduino.cpp b/lib/ArduinoNative/Arduino.cpp index 5927e7d8..8872f917 100644 --- a/lib/ArduinoNative/Arduino.cpp +++ b/lib/ArduinoNative/Arduino.cpp @@ -229,11 +229,8 @@ extern int main(int argc, char** argv) Logging::disable(); } - if (0 == status) - { - /* Get simulation time handler. It will be used by millis() and delay(). */ - gSimTime = &board.getSimTime(); - } + /* Get simulation time handler. It will be used by millis() and delay(). */ + gSimTime = &board.getSimTime(); } if (0 != status) From 6a174ef0a726425a586c20eba35e44b0c8b1cfd0 Mon Sep 17 00:00:00 2001 From: BlueAndi Date: Wed, 17 Apr 2024 23:52:49 +0200 Subject: [PATCH 07/15] Missing includes fixed. --- lib/HALCalibSim/Board.h | 1 + lib/HALLineFollowerSim/Board.h | 1 + 2 files changed, 2 insertions(+) diff --git a/lib/HALCalibSim/Board.h b/lib/HALCalibSim/Board.h index 3e86dd3a..42480ce0 100644 --- a/lib/HALCalibSim/Board.h +++ b/lib/HALCalibSim/Board.h @@ -63,6 +63,7 @@ #include #include #include +#include /****************************************************************************** * Macros diff --git a/lib/HALLineFollowerSim/Board.h b/lib/HALLineFollowerSim/Board.h index 264c292e..2cd09049 100644 --- a/lib/HALLineFollowerSim/Board.h +++ b/lib/HALLineFollowerSim/Board.h @@ -61,6 +61,7 @@ #include #include #include +#include #ifdef DEBUG_ODOMETRY #include From c1ca6ff345a790c76aaa7841403ab7c9584f5720 Mon Sep 17 00:00:00 2001 From: BlueAndi Date: Thu, 18 Apr 2024 00:06:46 +0200 Subject: [PATCH 08/15] Wrong comment fixed. --- lib/HALSim/WebotsSerialDrv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/HALSim/WebotsSerialDrv.h b/lib/HALSim/WebotsSerialDrv.h index 7b7e9c33..c5d8253c 100644 --- a/lib/HALSim/WebotsSerialDrv.h +++ b/lib/HALSim/WebotsSerialDrv.h @@ -227,5 +227,5 @@ class WebotsSerialDrv : public Stream WebotsSerialDrv& operator=(const WebotsSerialDrv& srv); /**< Assignment of an instance. */ }; -#endif /* SOCKET_SERVER_H_ */ +#endif /* WEBOTS_SERIAL_DRV_H */ /** @} */ From 6bec095bdce7af13238983cd8b987057f095d726 Mon Sep 17 00:00:00 2001 From: BlueAndi Date: Thu, 18 Apr 2024 23:55:45 +0200 Subject: [PATCH 09/15] Robot device names of the sensors and actors are now single source and provided by a header file. --- lib/HALCalibSim/Board.cpp | 120 ++++++------------------ lib/HALCalibSim/Board.h | 66 -------------- lib/HALConvoyLeaderSim/Board.cpp | 126 +++++++------------------- lib/HALConvoyLeaderSim/Board.h | 68 -------------- lib/HALLineFollowerSim/Board.cpp | 106 +++++----------------- lib/HALLineFollowerSim/Board.h | 67 -------------- lib/HALRemoteControlSim/Board.cpp | 126 +++++++------------------- lib/HALRemoteControlSim/Board.h | 68 -------------- lib/HALSensorFusionSim/Board.cpp | 116 ++++++------------------ lib/HALSensorFusionSim/Board.h | 62 ------------- lib/HALSim/RobotDevices.h | 146 ++++++++++++++++++++++++++++++ 11 files changed, 295 insertions(+), 776 deletions(-) create mode 100644 lib/HALSim/RobotDevices.h diff --git a/lib/HALCalibSim/Board.cpp b/lib/HALCalibSim/Board.cpp index 86c04574..cd45cca3 100644 --- a/lib/HALCalibSim/Board.cpp +++ b/lib/HALCalibSim/Board.cpp @@ -33,6 +33,7 @@ * Includes *****************************************************************************/ #include +#include /****************************************************************************** * Compiler Switches @@ -54,72 +55,6 @@ * Local Variables *****************************************************************************/ -/* Name of the speaker in the robot simulation. */ -const char* Board::SPEAKER_NAME = "speaker"; - -/* Name of the display in the robot simulation. */ -const char* Board::DISPLAY_NAME = "robot_display"; - -/* Name of the left motor in the robot simulation. */ -const char* Board::LEFT_MOTOR_NAME = "motor_left"; - -/* Name of the right motor in the robot simulation. */ -const char* Board::RIGHT_MOTOR_NAME = "motor_right"; - -/* Name of the infrared emitter 0 in the robot simulation. */ -const char* Board::EMITTER_0_NAME = "emitter_l"; - -/* Name of the infrared emitter 1 in the robot simulation. */ -const char* Board::EMITTER_1_NAME = "emitter_lm"; - -/* Name of the infrared emitter 2 in the robot simulation. */ -const char* Board::EMITTER_2_NAME = "emitter_m"; - -/* Name of the infrared emitter 3 in the robot simulation. */ -const char* Board::EMITTER_3_NAME = "emitter_rm"; - -/* Name of the infrared emitter 4 in the robot simulation. */ -const char* Board::EMITTER_4_NAME = "emitter_r"; - -/** Name of the position sensor of the left motor in the robot simulation. */ -const char* Board::POS_SENSOR_LEFT_NAME = "position_sensor_left"; - -/** Name of the position sensor of the right motor in the robot simulation. */ -const char* Board::POS_SENSOR_RIGHT_NAME = "position_sensor_right"; - -/* Name of the light sensor 0 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_0_NAME = "lightsensor_l"; - -/* Name of the light sensor 1 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_1_NAME = "lightsensor_lm"; - -/* Name of the light sensor 2 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_2_NAME = "lightsensor_m"; - -/* Name of the light sensor 3 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_3_NAME = "lightsensor_rm"; - -/* Name of the light sensor 4 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_4_NAME = "lightsensor_r"; - -/* Name of the red LED in the robot simulation. */ -const char* Board::LED_RED_NAME = "led_red"; - -/* Name of the yellow LED in the robot simulation. */ -const char* Board::LED_YELLOW_NAME = "led_yellow"; - -/* Name of the green LED in the robot simulation. */ -const char* Board::LED_GREEN_NAME = "led_green"; - -/* Name of the front left proximity sensor in the robot simulation. */ -const char* Board::PROXIMITY_SENSOR_FRONT_LEFT_NAME = "proxim_sensor_fl"; - -/* Name of the front right proximity sensor in the robot simulation. */ -const char* Board::PROXIMITY_SENSOR_FRONT_RIGHT_NAME = "proxim_sensor_fr"; - -/* Name of the sender in the robot simulation. */ -const char* Board::SENDER_NAME = "serialComTx"; - /****************************************************************************** * Public Methods *****************************************************************************/ @@ -149,21 +84,26 @@ Board::Board() : m_buttonA(m_keyboard), m_buttonB(m_keyboard), m_buttonC(m_keyboard), - m_buzzer(m_robot.getSpeaker(SPEAKER_NAME)), - m_display(m_robot.getDisplay(DISPLAY_NAME)), - m_encoders(m_robot.getPositionSensor(POS_SENSOR_LEFT_NAME), m_robot.getPositionSensor(POS_SENSOR_RIGHT_NAME)), - m_lineSensors(m_robot.getEmitter(EMITTER_0_NAME), m_robot.getEmitter(EMITTER_1_NAME), - m_robot.getEmitter(EMITTER_2_NAME), m_robot.getEmitter(EMITTER_3_NAME), - m_robot.getEmitter(EMITTER_4_NAME), m_robot.getDistanceSensor(LIGHT_SENSOR_0_NAME), - m_robot.getDistanceSensor(LIGHT_SENSOR_1_NAME), m_robot.getDistanceSensor(LIGHT_SENSOR_2_NAME), - m_robot.getDistanceSensor(LIGHT_SENSOR_3_NAME), m_robot.getDistanceSensor(LIGHT_SENSOR_4_NAME)), - m_motors(m_robot.getMotor(LEFT_MOTOR_NAME), m_robot.getMotor(RIGHT_MOTOR_NAME)), - m_ledRed(m_robot.getLED(LED_RED_NAME)), - m_ledYellow(m_robot.getLED(LED_YELLOW_NAME)), - m_ledGreen(m_robot.getLED(LED_GREEN_NAME)), - m_proximitySensors(m_robot.getDistanceSensor(PROXIMITY_SENSOR_FRONT_LEFT_NAME), - m_robot.getDistanceSensor(PROXIMITY_SENSOR_FRONT_RIGHT_NAME)), - m_sender(m_robot.getEmitter(SENDER_NAME)), + m_buzzer(m_robot.getSpeaker(RobotDeviceNames::SPEAKER_NAME)), + m_display(m_robot.getDisplay(RobotDeviceNames::DISPLAY_NAME)), + m_encoders(m_robot.getPositionSensor(RobotDeviceNames::POS_SENSOR_LEFT_NAME), + m_robot.getPositionSensor(RobotDeviceNames::POS_SENSOR_RIGHT_NAME)), + m_lineSensors( + m_robot.getEmitter(RobotDeviceNames::EMITTER_0_NAME), m_robot.getEmitter(RobotDeviceNames::EMITTER_1_NAME), + m_robot.getEmitter(RobotDeviceNames::EMITTER_2_NAME), m_robot.getEmitter(RobotDeviceNames::EMITTER_3_NAME), + m_robot.getEmitter(RobotDeviceNames::EMITTER_4_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_0_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_1_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_2_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_3_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_4_NAME)), + m_motors(m_robot.getMotor(RobotDeviceNames::LEFT_MOTOR_NAME), m_robot.getMotor(RobotDeviceNames::RIGHT_MOTOR_NAME)), + m_ledRed(m_robot.getLED(RobotDeviceNames::LED_RED_NAME)), + m_ledYellow(m_robot.getLED(RobotDeviceNames::LED_YELLOW_NAME)), + m_ledGreen(m_robot.getLED(RobotDeviceNames::LED_GREEN_NAME)), + m_proximitySensors(m_robot.getDistanceSensor(RobotDeviceNames::PROXIMITY_SENSOR_FRONT_LEFT_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::PROXIMITY_SENSOR_FRONT_RIGHT_NAME)), + m_sender(m_robot.getEmitter(RobotDeviceNames::EMITTER_NAME_SERIAL)), m_settings() { } @@ -173,15 +113,15 @@ void Board::enableSimulationDevices() const int timeStep = m_simTime.getTimeStep(); m_robot.getKeyboard()->enable(timeStep); - m_robot.getPositionSensor(POS_SENSOR_LEFT_NAME)->enable(timeStep); - m_robot.getPositionSensor(POS_SENSOR_RIGHT_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_0_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_1_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_2_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_3_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_4_NAME)->enable(timeStep); - m_robot.getDistanceSensor(PROXIMITY_SENSOR_FRONT_LEFT_NAME)->enable(timeStep); - m_robot.getDistanceSensor(PROXIMITY_SENSOR_FRONT_RIGHT_NAME)->enable(timeStep); + m_robot.getPositionSensor(RobotDeviceNames::POS_SENSOR_LEFT_NAME)->enable(timeStep); + m_robot.getPositionSensor(RobotDeviceNames::POS_SENSOR_RIGHT_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_0_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_1_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_2_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_3_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_4_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::PROXIMITY_SENSOR_FRONT_LEFT_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::PROXIMITY_SENSOR_FRONT_RIGHT_NAME)->enable(timeStep); } /****************************************************************************** diff --git a/lib/HALCalibSim/Board.h b/lib/HALCalibSim/Board.h index 42480ce0..7b0100d6 100644 --- a/lib/HALCalibSim/Board.h +++ b/lib/HALCalibSim/Board.h @@ -244,73 +244,7 @@ class Board : public IBoard m_buzzer.process(); } -protected: private: - /** Name of the speaker in the robot simulation. */ - static const char* SPEAKER_NAME; - - /** Name of the display in the robot simulation. */ - static const char* DISPLAY_NAME; - - /** Name of the left motor in the robot simulation. */ - static const char* LEFT_MOTOR_NAME; - - /** Name of the right motor in the robot simulation. */ - static const char* RIGHT_MOTOR_NAME; - - /** Name of the infrared emitter 0 in the robot simulation. */ - static const char* EMITTER_0_NAME; - - /** Name of the infrared emitter 1 in the robot simulation. */ - static const char* EMITTER_1_NAME; - - /** Name of the infrared emitter 2 in the robot simulation. */ - static const char* EMITTER_2_NAME; - - /** Name of the infrared emitter 3 in the robot simulation. */ - static const char* EMITTER_3_NAME; - - /** Name of the infrared emitter 4 in the robot simulation. */ - static const char* EMITTER_4_NAME; - - /** Name of the position sensor of the left motor in the robot simulation. */ - static const char* POS_SENSOR_LEFT_NAME; - - /** Name of the position sensor of the right motor in the robot simulation. */ - static const char* POS_SENSOR_RIGHT_NAME; - - /** Name of the light sensor 0 in the robot simulation. */ - static const char* LIGHT_SENSOR_0_NAME; - - /** Name of the light sensor 1 in the robot simulation. */ - static const char* LIGHT_SENSOR_1_NAME; - - /** Name of the light sensor 2 in the robot simulation. */ - static const char* LIGHT_SENSOR_2_NAME; - - /** Name of the light sensor 3 in the robot simulation. */ - static const char* LIGHT_SENSOR_3_NAME; - - /** Name of the light sensor 4 in the robot simulation. */ - static const char* LIGHT_SENSOR_4_NAME; - - /** Name of the red LED in the robot simulation. */ - static const char* LED_RED_NAME; - - /** Name of the yellow LED in the robot simulation. */ - static const char* LED_YELLOW_NAME; - - /** Name of the green LED in the robot simulation. */ - static const char* LED_GREEN_NAME; - - /** Name of the front proximity sensor in the robot simulation. */ - static const char* PROXIMITY_SENSOR_FRONT_LEFT_NAME; - - /** Name of the front right proximity sensor in the robot simulation. */ - static const char* PROXIMITY_SENSOR_FRONT_RIGHT_NAME; - - /** Name of the sender in the robot simulation. */ - static const char* SENDER_NAME; /** Simulated roboter instance. */ webots::Robot m_robot; diff --git a/lib/HALConvoyLeaderSim/Board.cpp b/lib/HALConvoyLeaderSim/Board.cpp index 21024871..c4df1740 100644 --- a/lib/HALConvoyLeaderSim/Board.cpp +++ b/lib/HALConvoyLeaderSim/Board.cpp @@ -33,6 +33,7 @@ * Includes *****************************************************************************/ #include +#include /****************************************************************************** * Compiler Switches @@ -54,75 +55,6 @@ * Local Variables *****************************************************************************/ -/* Name of the speaker in the robot simulation. */ -const char* Board::SPEAKER_NAME = "speaker"; - -/* Name of the display in the robot simulation. */ -const char* Board::DISPLAY_NAME = "robot_display"; - -/* Name of the left motor in the robot simulation. */ -const char* Board::LEFT_MOTOR_NAME = "motor_left"; - -/* Name of the right motor in the robot simulation. */ -const char* Board::RIGHT_MOTOR_NAME = "motor_right"; - -/* Name of the infrared emitter 0 in the robot simulation. */ -const char* Board::EMITTER_0_NAME = "emitter_l"; - -/* Name of the infrared emitter 1 in the robot simulation. */ -const char* Board::EMITTER_1_NAME = "emitter_lm"; - -/* Name of the infrared emitter 2 in the robot simulation. */ -const char* Board::EMITTER_2_NAME = "emitter_m"; - -/* Name of the infrared emitter 3 in the robot simulation. */ -const char* Board::EMITTER_3_NAME = "emitter_rm"; - -/* Name of the infrared emitter 4 in the robot simulation. */ -const char* Board::EMITTER_4_NAME = "emitter_r"; - -/** Name of the position sensor of the left motor in the robot simulation. */ -const char* Board::POS_SENSOR_LEFT_NAME = "position_sensor_left"; - -/** Name of the position sensor of the right motor in the robot simulation. */ -const char* Board::POS_SENSOR_RIGHT_NAME = "position_sensor_right"; - -/* Name of the light sensor 0 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_0_NAME = "lightsensor_l"; - -/* Name of the light sensor 1 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_1_NAME = "lightsensor_lm"; - -/* Name of the light sensor 2 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_2_NAME = "lightsensor_m"; - -/* Name of the light sensor 3 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_3_NAME = "lightsensor_rm"; - -/* Name of the light sensor 4 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_4_NAME = "lightsensor_r"; - -/* Name of the red LED in the robot simulation. */ -const char* Board::LED_RED_NAME = "led_red"; - -/* Name of the yellow LED in the robot simulation. */ -const char* Board::LED_YELLOW_NAME = "led_yellow"; - -/* Name of the green LED in the robot simulation. */ -const char* Board::LED_GREEN_NAME = "led_green"; - -/* Name of the front left proximity sensor in the robot simulation. */ -const char* Board::PROXIMITY_SENSOR_FRONT_LEFT_NAME = "proxim_sensor_fl"; - -/* Name of the front right proximity sensor in the robot simulation. */ -const char* Board::PROXIMITY_SENSOR_FRONT_RIGHT_NAME = "proxim_sensor_fr"; - -/* Name of the serial emitter in the RadonUlzer simulation. */ -const char* Board::EMITTER_NAME_SERIAL = "serialComTx"; - -/* Name of the serial receiver in the RadonUlzer simulation. */ -const char* Board::RECEIVER_NAME_SERIAL = "serialComRx"; - /****************************************************************************** * Public Methods *****************************************************************************/ @@ -152,21 +84,27 @@ Board::Board() : m_buttonA(m_keyboard), m_buttonB(m_keyboard), m_buttonC(m_keyboard), - m_buzzer(m_robot.getSpeaker(SPEAKER_NAME)), - m_display(m_robot.getDisplay(DISPLAY_NAME)), - m_encoders(m_robot.getPositionSensor(POS_SENSOR_LEFT_NAME), m_robot.getPositionSensor(POS_SENSOR_RIGHT_NAME)), - m_lineSensors(m_robot.getEmitter(EMITTER_0_NAME), m_robot.getEmitter(EMITTER_1_NAME), - m_robot.getEmitter(EMITTER_2_NAME), m_robot.getEmitter(EMITTER_3_NAME), - m_robot.getEmitter(EMITTER_4_NAME), m_robot.getDistanceSensor(LIGHT_SENSOR_0_NAME), - m_robot.getDistanceSensor(LIGHT_SENSOR_1_NAME), m_robot.getDistanceSensor(LIGHT_SENSOR_2_NAME), - m_robot.getDistanceSensor(LIGHT_SENSOR_3_NAME), m_robot.getDistanceSensor(LIGHT_SENSOR_4_NAME)), - m_motors(m_robot.getMotor(LEFT_MOTOR_NAME), m_robot.getMotor(RIGHT_MOTOR_NAME)), - m_ledRed(m_robot.getLED(LED_RED_NAME)), - m_ledYellow(m_robot.getLED(LED_YELLOW_NAME)), - m_ledGreen(m_robot.getLED(LED_GREEN_NAME)), - m_proximitySensors(m_robot.getDistanceSensor(PROXIMITY_SENSOR_FRONT_LEFT_NAME), - m_robot.getDistanceSensor(PROXIMITY_SENSOR_FRONT_RIGHT_NAME)), - m_serialDrv(m_robot.getEmitter(EMITTER_NAME_SERIAL), m_robot.getReceiver(RECEIVER_NAME_SERIAL)), + m_buzzer(m_robot.getSpeaker(RobotDeviceNames::SPEAKER_NAME)), + m_display(m_robot.getDisplay(RobotDeviceNames::DISPLAY_NAME)), + m_encoders(m_robot.getPositionSensor(RobotDeviceNames::POS_SENSOR_LEFT_NAME), + m_robot.getPositionSensor(RobotDeviceNames::POS_SENSOR_RIGHT_NAME)), + m_lineSensors( + m_robot.getEmitter(RobotDeviceNames::EMITTER_0_NAME), m_robot.getEmitter(RobotDeviceNames::EMITTER_1_NAME), + m_robot.getEmitter(RobotDeviceNames::EMITTER_2_NAME), m_robot.getEmitter(RobotDeviceNames::EMITTER_3_NAME), + m_robot.getEmitter(RobotDeviceNames::EMITTER_4_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_0_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_1_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_2_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_3_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_4_NAME)), + m_motors(m_robot.getMotor(RobotDeviceNames::LEFT_MOTOR_NAME), m_robot.getMotor(RobotDeviceNames::RIGHT_MOTOR_NAME)), + m_ledRed(m_robot.getLED(RobotDeviceNames::LED_RED_NAME)), + m_ledYellow(m_robot.getLED(RobotDeviceNames::LED_YELLOW_NAME)), + m_ledGreen(m_robot.getLED(RobotDeviceNames::LED_GREEN_NAME)), + m_proximitySensors(m_robot.getDistanceSensor(RobotDeviceNames::PROXIMITY_SENSOR_FRONT_LEFT_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::PROXIMITY_SENSOR_FRONT_RIGHT_NAME)), + m_serialDrv(m_robot.getEmitter(RobotDeviceNames::EMITTER_NAME_SERIAL), + m_robot.getReceiver(RobotDeviceNames::RECEIVER_NAME_SERIAL)), m_settings() { } @@ -176,16 +114,16 @@ void Board::enableSimulationDevices() const int timeStep = m_simTime.getTimeStep(); m_robot.getKeyboard()->enable(timeStep); - m_robot.getPositionSensor(POS_SENSOR_LEFT_NAME)->enable(timeStep); - m_robot.getPositionSensor(POS_SENSOR_RIGHT_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_0_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_1_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_2_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_3_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_4_NAME)->enable(timeStep); - m_robot.getDistanceSensor(PROXIMITY_SENSOR_FRONT_LEFT_NAME)->enable(timeStep); - m_robot.getDistanceSensor(PROXIMITY_SENSOR_FRONT_RIGHT_NAME)->enable(timeStep); - m_robot.getReceiver(RECEIVER_NAME_SERIAL)->enable(timeStep); + m_robot.getPositionSensor(RobotDeviceNames::POS_SENSOR_LEFT_NAME)->enable(timeStep); + m_robot.getPositionSensor(RobotDeviceNames::POS_SENSOR_RIGHT_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_0_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_1_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_2_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_3_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_4_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::PROXIMITY_SENSOR_FRONT_LEFT_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::PROXIMITY_SENSOR_FRONT_RIGHT_NAME)->enable(timeStep); + m_robot.getReceiver(RobotDeviceNames::RECEIVER_NAME_SERIAL)->enable(timeStep); } /****************************************************************************** diff --git a/lib/HALConvoyLeaderSim/Board.h b/lib/HALConvoyLeaderSim/Board.h index a63e52ca..1ee66215 100644 --- a/lib/HALConvoyLeaderSim/Board.h +++ b/lib/HALConvoyLeaderSim/Board.h @@ -234,74 +234,6 @@ class Board : public IBoard } private: - /** Name of the speaker in the robot simulation. */ - static const char* SPEAKER_NAME; - - /** Name of the display in the robot simulation. */ - static const char* DISPLAY_NAME; - - /** Name of the left motor in the robot simulation. */ - static const char* LEFT_MOTOR_NAME; - - /** Name of the right motor in the robot simulation. */ - static const char* RIGHT_MOTOR_NAME; - - /** Name of the infrared emitter 0 in the robot simulation. */ - static const char* EMITTER_0_NAME; - - /** Name of the infrared emitter 1 in the robot simulation. */ - static const char* EMITTER_1_NAME; - - /** Name of the infrared emitter 2 in the robot simulation. */ - static const char* EMITTER_2_NAME; - - /** Name of the infrared emitter 3 in the robot simulation. */ - static const char* EMITTER_3_NAME; - - /** Name of the infrared emitter 4 in the robot simulation. */ - static const char* EMITTER_4_NAME; - - /** Name of the position sensor of the left motor in the robot simulation. */ - static const char* POS_SENSOR_LEFT_NAME; - - /** Name of the position sensor of the right motor in the robot simulation. */ - static const char* POS_SENSOR_RIGHT_NAME; - - /** Name of the light sensor 0 in the robot simulation. */ - static const char* LIGHT_SENSOR_0_NAME; - - /** Name of the light sensor 1 in the robot simulation. */ - static const char* LIGHT_SENSOR_1_NAME; - - /** Name of the light sensor 2 in the robot simulation. */ - static const char* LIGHT_SENSOR_2_NAME; - - /** Name of the light sensor 3 in the robot simulation. */ - static const char* LIGHT_SENSOR_3_NAME; - - /** Name of the light sensor 4 in the robot simulation. */ - static const char* LIGHT_SENSOR_4_NAME; - - /** Name of the red LED in the robot simulation. */ - static const char* LED_RED_NAME; - - /** Name of the yellow LED in the robot simulation. */ - static const char* LED_YELLOW_NAME; - - /** Name of the green LED in the robot simulation. */ - static const char* LED_GREEN_NAME; - - /** Name of the front proximity sensor in the robot simulation. */ - static const char* PROXIMITY_SENSOR_FRONT_LEFT_NAME; - - /** Name of the front right proximity sensor in the robot simulation. */ - static const char* PROXIMITY_SENSOR_FRONT_RIGHT_NAME; - - /** Name of the serial emitter in the RadonUlzer simulation. */ - static const char* EMITTER_NAME_SERIAL; - - /** Name of the serial receiver in the RadonUlzer simulation. */ - static const char* RECEIVER_NAME_SERIAL; /** Simulated roboter instance. */ webots::Robot m_robot; diff --git a/lib/HALLineFollowerSim/Board.cpp b/lib/HALLineFollowerSim/Board.cpp index 285f6f8b..f79d3dff 100644 --- a/lib/HALLineFollowerSim/Board.cpp +++ b/lib/HALLineFollowerSim/Board.cpp @@ -33,6 +33,7 @@ * Includes *****************************************************************************/ #include +#include /****************************************************************************** * Compiler Switches @@ -54,68 +55,6 @@ * Local Variables *****************************************************************************/ -/* Name of the speaker in the robot simulation. */ -const char* Board::SPEAKER_NAME = "speaker"; - -/* Name of the display in the robot simulation. */ -const char* Board::DISPLAY_NAME = "robot_display"; - -/* Name of the left motor in the robot simulation. */ -const char* Board::LEFT_MOTOR_NAME = "motor_left"; - -/* Name of the right motor in the robot simulation. */ -const char* Board::RIGHT_MOTOR_NAME = "motor_right"; - -/* Name of the infrared emitter 0 in the robot simulation. */ -const char* Board::EMITTER_0_NAME = "emitter_l"; - -/* Name of the infrared emitter 1 in the robot simulation. */ -const char* Board::EMITTER_1_NAME = "emitter_lm"; - -/* Name of the infrared emitter 2 in the robot simulation. */ -const char* Board::EMITTER_2_NAME = "emitter_m"; - -/* Name of the infrared emitter 3 in the robot simulation. */ -const char* Board::EMITTER_3_NAME = "emitter_rm"; - -/* Name of the infrared emitter 4 in the robot simulation. */ -const char* Board::EMITTER_4_NAME = "emitter_r"; - -/** Name of the position sensor of the left motor in the robot simulation. */ -const char* Board::POS_SENSOR_LEFT_NAME = "position_sensor_left"; - -/** Name of the position sensor of the right motor in the robot simulation. */ -const char* Board::POS_SENSOR_RIGHT_NAME = "position_sensor_right"; - -/* Name of the light sensor 0 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_0_NAME = "lightsensor_l"; - -/* Name of the light sensor 1 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_1_NAME = "lightsensor_lm"; - -/* Name of the light sensor 2 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_2_NAME = "lightsensor_m"; - -/* Name of the light sensor 3 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_3_NAME = "lightsensor_rm"; - -/* Name of the light sensor 4 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_4_NAME = "lightsensor_r"; - -/* Name of the red LED in the robot simulation. */ -const char* Board::LED_RED_NAME = "led_red"; - -/* Name of the yellow LED in the robot simulation. */ -const char* Board::LED_YELLOW_NAME = "led_yellow"; - -/* Name of the green LED in the robot simulation. */ -const char* Board::LED_GREEN_NAME = "led_green"; - -#ifdef DEBUG_ODOMETRY -/* Name of the sender to the webots supervisor. */ -const char* Board::SENDER_NAME = "serialComTx"; -#endif /* DEBUG_ODOMETRY */ - /****************************************************************************** * Public Methods *****************************************************************************/ @@ -144,18 +83,23 @@ Board::Board() : m_buttonA(m_keyboard), m_buttonB(m_keyboard), m_buttonC(m_keyboard), - m_buzzer(m_robot.getSpeaker(SPEAKER_NAME)), - m_display(m_robot.getDisplay(DISPLAY_NAME)), - m_encoders(m_robot.getPositionSensor(POS_SENSOR_LEFT_NAME), m_robot.getPositionSensor(POS_SENSOR_RIGHT_NAME)), - m_lineSensors(m_robot.getEmitter(EMITTER_0_NAME), m_robot.getEmitter(EMITTER_1_NAME), - m_robot.getEmitter(EMITTER_2_NAME), m_robot.getEmitter(EMITTER_3_NAME), - m_robot.getEmitter(EMITTER_4_NAME), m_robot.getDistanceSensor(LIGHT_SENSOR_0_NAME), - m_robot.getDistanceSensor(LIGHT_SENSOR_1_NAME), m_robot.getDistanceSensor(LIGHT_SENSOR_2_NAME), - m_robot.getDistanceSensor(LIGHT_SENSOR_3_NAME), m_robot.getDistanceSensor(LIGHT_SENSOR_4_NAME)), - m_motors(m_robot.getMotor(LEFT_MOTOR_NAME), m_robot.getMotor(RIGHT_MOTOR_NAME)), - m_ledRed(m_robot.getLED(LED_RED_NAME)), - m_ledYellow(m_robot.getLED(LED_YELLOW_NAME)), - m_ledGreen(m_robot.getLED(LED_GREEN_NAME)), + m_buzzer(m_robot.getSpeaker(RobotDeviceNames::SPEAKER_NAME)), + m_display(m_robot.getDisplay(RobotDeviceNames::DISPLAY_NAME)), + m_encoders(m_robot.getPositionSensor(RobotDeviceNames::POS_SENSOR_LEFT_NAME), + m_robot.getPositionSensor(RobotDeviceNames::POS_SENSOR_RIGHT_NAME)), + m_lineSensors( + m_robot.getEmitter(RobotDeviceNames::EMITTER_0_NAME), m_robot.getEmitter(RobotDeviceNames::EMITTER_1_NAME), + m_robot.getEmitter(RobotDeviceNames::EMITTER_2_NAME), m_robot.getEmitter(RobotDeviceNames::EMITTER_3_NAME), + m_robot.getEmitter(RobotDeviceNames::EMITTER_4_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_0_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_1_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_2_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_3_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_4_NAME)), + m_motors(m_robot.getMotor(RobotDeviceNames::LEFT_MOTOR_NAME), m_robot.getMotor(RobotDeviceNames::RIGHT_MOTOR_NAME)), + m_ledRed(m_robot.getLED(RobotDeviceNames::LED_RED_NAME)), + m_ledYellow(m_robot.getLED(RobotDeviceNames::LED_YELLOW_NAME)), + m_ledGreen(m_robot.getLED(RobotDeviceNames::LED_GREEN_NAME)), m_settings() #ifdef DEBUG_ODOMETRY , @@ -169,13 +113,13 @@ void Board::enableSimulationDevices() const int timeStep = m_simTime.getTimeStep(); m_robot.getKeyboard()->enable(timeStep); - m_robot.getPositionSensor(POS_SENSOR_LEFT_NAME)->enable(timeStep); - m_robot.getPositionSensor(POS_SENSOR_RIGHT_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_0_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_1_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_2_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_3_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_4_NAME)->enable(timeStep); + m_robot.getPositionSensor(RobotDeviceNames::POS_SENSOR_LEFT_NAME)->enable(timeStep); + m_robot.getPositionSensor(RobotDeviceNames::POS_SENSOR_RIGHT_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_0_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_1_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_2_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_3_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_4_NAME)->enable(timeStep); } /****************************************************************************** diff --git a/lib/HALLineFollowerSim/Board.h b/lib/HALLineFollowerSim/Board.h index 2cd09049..992e5147 100644 --- a/lib/HALLineFollowerSim/Board.h +++ b/lib/HALLineFollowerSim/Board.h @@ -241,73 +241,6 @@ class Board : public IBoard } private: - /** Name of the speaker in the robot simulation. */ - static const char* SPEAKER_NAME; - - /** Name of the display in the robot simulation. */ - static const char* DISPLAY_NAME; - - /** Name of the left motor in the robot simulation. */ - static const char* LEFT_MOTOR_NAME; - - /** Name of the right motor in the robot simulation. */ - static const char* RIGHT_MOTOR_NAME; - - /** Name of the infrared emitter 0 in the robot simulation. */ - static const char* EMITTER_0_NAME; - - /** Name of the infrared emitter 1 in the robot simulation. */ - static const char* EMITTER_1_NAME; - - /** Name of the infrared emitter 2 in the robot simulation. */ - static const char* EMITTER_2_NAME; - - /** Name of the infrared emitter 3 in the robot simulation. */ - static const char* EMITTER_3_NAME; - - /** Name of the infrared emitter 4 in the robot simulation. */ - static const char* EMITTER_4_NAME; - - /** Name of the position sensor of the left motor in the robot simulation. */ - static const char* POS_SENSOR_LEFT_NAME; - - /** Name of the position sensor of the right motor in the robot simulation. */ - static const char* POS_SENSOR_RIGHT_NAME; - - /** Name of the light sensor 0 in the robot simulation. */ - static const char* LIGHT_SENSOR_0_NAME; - - /** Name of the light sensor 1 in the robot simulation. */ - static const char* LIGHT_SENSOR_1_NAME; - - /** Name of the light sensor 2 in the robot simulation. */ - static const char* LIGHT_SENSOR_2_NAME; - - /** Name of the light sensor 3 in the robot simulation. */ - static const char* LIGHT_SENSOR_3_NAME; - - /** Name of the light sensor 4 in the robot simulation. */ - static const char* LIGHT_SENSOR_4_NAME; - - /** Name of the red LED in the robot simulation. */ - static const char* LED_RED_NAME; - - /** Name of the yellow LED in the robot simulation. */ - static const char* LED_YELLOW_NAME; - - /** Name of the green LED in the robot simulation. */ - static const char* LED_GREEN_NAME; - - /** Name of the front proximity sensor in the robot simulation. */ - static const char* PROXIMITY_SENSOR_FRONT_LEFT_NAME; - - /** Name of the front right proximity sensor in the robot simulation. */ - static const char* PROXIMITY_SENSOR_FRONT_RIGHT_NAME; - -#ifdef DEBUG_ODOMETRY - /** Name of the sender to the webots supervisor. */ - static const char* SENDER_NAME; -#endif /* DEBUG_ODOMETRY */ /** Simulated roboter instance. */ webots::Robot m_robot; diff --git a/lib/HALRemoteControlSim/Board.cpp b/lib/HALRemoteControlSim/Board.cpp index dfc17741..0a145f41 100644 --- a/lib/HALRemoteControlSim/Board.cpp +++ b/lib/HALRemoteControlSim/Board.cpp @@ -33,6 +33,7 @@ * Includes *****************************************************************************/ #include +#include /****************************************************************************** * Compiler Switches @@ -54,75 +55,6 @@ * Local Variables *****************************************************************************/ -/* Name of the speaker in the robot simulation. */ -const char* Board::SPEAKER_NAME = "speaker"; - -/* Name of the display in the robot simulation. */ -const char* Board::DISPLAY_NAME = "robot_display"; - -/* Name of the left motor in the robot simulation. */ -const char* Board::LEFT_MOTOR_NAME = "motor_left"; - -/* Name of the right motor in the robot simulation. */ -const char* Board::RIGHT_MOTOR_NAME = "motor_right"; - -/* Name of the infrared emitter 0 in the robot simulation. */ -const char* Board::EMITTER_0_NAME = "emitter_l"; - -/* Name of the infrared emitter 1 in the robot simulation. */ -const char* Board::EMITTER_1_NAME = "emitter_lm"; - -/* Name of the infrared emitter 2 in the robot simulation. */ -const char* Board::EMITTER_2_NAME = "emitter_m"; - -/* Name of the infrared emitter 3 in the robot simulation. */ -const char* Board::EMITTER_3_NAME = "emitter_rm"; - -/* Name of the infrared emitter 4 in the robot simulation. */ -const char* Board::EMITTER_4_NAME = "emitter_r"; - -/** Name of the position sensor of the left motor in the robot simulation. */ -const char* Board::POS_SENSOR_LEFT_NAME = "position_sensor_left"; - -/** Name of the position sensor of the right motor in the robot simulation. */ -const char* Board::POS_SENSOR_RIGHT_NAME = "position_sensor_right"; - -/* Name of the light sensor 0 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_0_NAME = "lightsensor_l"; - -/* Name of the light sensor 1 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_1_NAME = "lightsensor_lm"; - -/* Name of the light sensor 2 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_2_NAME = "lightsensor_m"; - -/* Name of the light sensor 3 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_3_NAME = "lightsensor_rm"; - -/* Name of the light sensor 4 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_4_NAME = "lightsensor_r"; - -/* Name of the red LED in the robot simulation. */ -const char* Board::LED_RED_NAME = "led_red"; - -/* Name of the yellow LED in the robot simulation. */ -const char* Board::LED_YELLOW_NAME = "led_yellow"; - -/* Name of the green LED in the robot simulation. */ -const char* Board::LED_GREEN_NAME = "led_green"; - -/* Name of the front left proximity sensor in the robot simulation. */ -const char* Board::PROXIMITY_SENSOR_FRONT_LEFT_NAME = "proxim_sensor_fl"; - -/* Name of the front right proximity sensor in the robot simulation. */ -const char* Board::PROXIMITY_SENSOR_FRONT_RIGHT_NAME = "proxim_sensor_fr"; - -/* Name of the serial emitter in the RadonUlzer simulation. */ -const char* Board::EMITTER_NAME_SERIAL = "serialComTx"; - -/* Name of the serial receiver in the RadonUlzer simulation. */ -const char* Board::RECEIVER_NAME_SERIAL = "serialComRx"; - /****************************************************************************** * Public Methods *****************************************************************************/ @@ -152,21 +84,27 @@ Board::Board() : m_buttonA(m_keyboard), m_buttonB(m_keyboard), m_buttonC(m_keyboard), - m_buzzer(m_robot.getSpeaker(SPEAKER_NAME)), - m_display(m_robot.getDisplay(DISPLAY_NAME)), - m_encoders(m_robot.getPositionSensor(POS_SENSOR_LEFT_NAME), m_robot.getPositionSensor(POS_SENSOR_RIGHT_NAME)), - m_lineSensors(m_robot.getEmitter(EMITTER_0_NAME), m_robot.getEmitter(EMITTER_1_NAME), - m_robot.getEmitter(EMITTER_2_NAME), m_robot.getEmitter(EMITTER_3_NAME), - m_robot.getEmitter(EMITTER_4_NAME), m_robot.getDistanceSensor(LIGHT_SENSOR_0_NAME), - m_robot.getDistanceSensor(LIGHT_SENSOR_1_NAME), m_robot.getDistanceSensor(LIGHT_SENSOR_2_NAME), - m_robot.getDistanceSensor(LIGHT_SENSOR_3_NAME), m_robot.getDistanceSensor(LIGHT_SENSOR_4_NAME)), - m_motors(m_robot.getMotor(LEFT_MOTOR_NAME), m_robot.getMotor(RIGHT_MOTOR_NAME)), - m_ledRed(m_robot.getLED(LED_RED_NAME)), - m_ledYellow(m_robot.getLED(LED_YELLOW_NAME)), - m_ledGreen(m_robot.getLED(LED_GREEN_NAME)), - m_proximitySensors(m_robot.getDistanceSensor(PROXIMITY_SENSOR_FRONT_LEFT_NAME), - m_robot.getDistanceSensor(PROXIMITY_SENSOR_FRONT_RIGHT_NAME)), - m_serialDrv(m_robot.getEmitter(EMITTER_NAME_SERIAL), m_robot.getReceiver(RECEIVER_NAME_SERIAL)), + m_buzzer(m_robot.getSpeaker(RobotDeviceNames::SPEAKER_NAME)), + m_display(m_robot.getDisplay(RobotDeviceNames::DISPLAY_NAME)), + m_encoders(m_robot.getPositionSensor(RobotDeviceNames::POS_SENSOR_LEFT_NAME), + m_robot.getPositionSensor(RobotDeviceNames::POS_SENSOR_RIGHT_NAME)), + m_lineSensors( + m_robot.getEmitter(RobotDeviceNames::EMITTER_0_NAME), m_robot.getEmitter(RobotDeviceNames::EMITTER_1_NAME), + m_robot.getEmitter(RobotDeviceNames::EMITTER_2_NAME), m_robot.getEmitter(RobotDeviceNames::EMITTER_3_NAME), + m_robot.getEmitter(RobotDeviceNames::EMITTER_4_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_0_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_1_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_2_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_3_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_4_NAME)), + m_motors(m_robot.getMotor(RobotDeviceNames::LEFT_MOTOR_NAME), m_robot.getMotor(RobotDeviceNames::RIGHT_MOTOR_NAME)), + m_ledRed(m_robot.getLED(RobotDeviceNames::LED_RED_NAME)), + m_ledYellow(m_robot.getLED(RobotDeviceNames::LED_YELLOW_NAME)), + m_ledGreen(m_robot.getLED(RobotDeviceNames::LED_GREEN_NAME)), + m_proximitySensors(m_robot.getDistanceSensor(RobotDeviceNames::PROXIMITY_SENSOR_FRONT_LEFT_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::PROXIMITY_SENSOR_FRONT_RIGHT_NAME)), + m_serialDrv(m_robot.getEmitter(RobotDeviceNames::EMITTER_NAME_SERIAL), + m_robot.getReceiver(RobotDeviceNames::RECEIVER_NAME_SERIAL)), m_settings() { } @@ -176,16 +114,16 @@ void Board::enableSimulationDevices() const int timeStep = m_simTime.getTimeStep(); m_robot.getKeyboard()->enable(timeStep); - m_robot.getPositionSensor(POS_SENSOR_LEFT_NAME)->enable(timeStep); - m_robot.getPositionSensor(POS_SENSOR_RIGHT_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_0_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_1_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_2_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_3_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_4_NAME)->enable(timeStep); - m_robot.getDistanceSensor(PROXIMITY_SENSOR_FRONT_LEFT_NAME)->enable(timeStep); - m_robot.getDistanceSensor(PROXIMITY_SENSOR_FRONT_RIGHT_NAME)->enable(timeStep); - m_robot.getReceiver(RECEIVER_NAME_SERIAL)->enable(timeStep); + m_robot.getPositionSensor(RobotDeviceNames::POS_SENSOR_LEFT_NAME)->enable(timeStep); + m_robot.getPositionSensor(RobotDeviceNames::POS_SENSOR_RIGHT_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_0_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_1_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_2_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_3_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_4_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::PROXIMITY_SENSOR_FRONT_LEFT_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::PROXIMITY_SENSOR_FRONT_RIGHT_NAME)->enable(timeStep); + m_robot.getReceiver(RobotDeviceNames::RECEIVER_NAME_SERIAL)->enable(timeStep); } /****************************************************************************** * External Functions diff --git a/lib/HALRemoteControlSim/Board.h b/lib/HALRemoteControlSim/Board.h index a63e52ca..1ee66215 100644 --- a/lib/HALRemoteControlSim/Board.h +++ b/lib/HALRemoteControlSim/Board.h @@ -234,74 +234,6 @@ class Board : public IBoard } private: - /** Name of the speaker in the robot simulation. */ - static const char* SPEAKER_NAME; - - /** Name of the display in the robot simulation. */ - static const char* DISPLAY_NAME; - - /** Name of the left motor in the robot simulation. */ - static const char* LEFT_MOTOR_NAME; - - /** Name of the right motor in the robot simulation. */ - static const char* RIGHT_MOTOR_NAME; - - /** Name of the infrared emitter 0 in the robot simulation. */ - static const char* EMITTER_0_NAME; - - /** Name of the infrared emitter 1 in the robot simulation. */ - static const char* EMITTER_1_NAME; - - /** Name of the infrared emitter 2 in the robot simulation. */ - static const char* EMITTER_2_NAME; - - /** Name of the infrared emitter 3 in the robot simulation. */ - static const char* EMITTER_3_NAME; - - /** Name of the infrared emitter 4 in the robot simulation. */ - static const char* EMITTER_4_NAME; - - /** Name of the position sensor of the left motor in the robot simulation. */ - static const char* POS_SENSOR_LEFT_NAME; - - /** Name of the position sensor of the right motor in the robot simulation. */ - static const char* POS_SENSOR_RIGHT_NAME; - - /** Name of the light sensor 0 in the robot simulation. */ - static const char* LIGHT_SENSOR_0_NAME; - - /** Name of the light sensor 1 in the robot simulation. */ - static const char* LIGHT_SENSOR_1_NAME; - - /** Name of the light sensor 2 in the robot simulation. */ - static const char* LIGHT_SENSOR_2_NAME; - - /** Name of the light sensor 3 in the robot simulation. */ - static const char* LIGHT_SENSOR_3_NAME; - - /** Name of the light sensor 4 in the robot simulation. */ - static const char* LIGHT_SENSOR_4_NAME; - - /** Name of the red LED in the robot simulation. */ - static const char* LED_RED_NAME; - - /** Name of the yellow LED in the robot simulation. */ - static const char* LED_YELLOW_NAME; - - /** Name of the green LED in the robot simulation. */ - static const char* LED_GREEN_NAME; - - /** Name of the front proximity sensor in the robot simulation. */ - static const char* PROXIMITY_SENSOR_FRONT_LEFT_NAME; - - /** Name of the front right proximity sensor in the robot simulation. */ - static const char* PROXIMITY_SENSOR_FRONT_RIGHT_NAME; - - /** Name of the serial emitter in the RadonUlzer simulation. */ - static const char* EMITTER_NAME_SERIAL; - - /** Name of the serial receiver in the RadonUlzer simulation. */ - static const char* RECEIVER_NAME_SERIAL; /** Simulated roboter instance. */ webots::Robot m_robot; diff --git a/lib/HALSensorFusionSim/Board.cpp b/lib/HALSensorFusionSim/Board.cpp index 83e5c589..e4ab52d1 100644 --- a/lib/HALSensorFusionSim/Board.cpp +++ b/lib/HALSensorFusionSim/Board.cpp @@ -33,6 +33,7 @@ * Includes *****************************************************************************/ #include +#include /****************************************************************************** * Compiler Switches @@ -54,69 +55,6 @@ * Local Variables *****************************************************************************/ -/* Name of the speaker in the robot simulation. */ -const char* Board::SPEAKER_NAME = "speaker"; - -/* Name of the left motor in the robot simulation. */ -const char* Board::LEFT_MOTOR_NAME = "motor_left"; - -/* Name of the right motor in the robot simulation. */ -const char* Board::RIGHT_MOTOR_NAME = "motor_right"; - -/* Name of the infrared emitter 0 in the robot simulation. */ -const char* Board::EMITTER_0_NAME = "emitter_l"; - -/* Name of the infrared emitter 1 in the robot simulation. */ -const char* Board::EMITTER_1_NAME = "emitter_lm"; - -/* Name of the infrared emitter 2 in the robot simulation. */ -const char* Board::EMITTER_2_NAME = "emitter_m"; - -/* Name of the infrared emitter 3 in the robot simulation. */ -const char* Board::EMITTER_3_NAME = "emitter_rm"; - -/* Name of the infrared emitter 4 in the robot simulation. */ -const char* Board::EMITTER_4_NAME = "emitter_r"; - -/** Name of the position sensor of the left motor in the robot simulation. */ -const char* Board::POS_SENSOR_LEFT_NAME = "position_sensor_left"; - -/** Name of the position sensor of the right motor in the robot simulation. */ -const char* Board::POS_SENSOR_RIGHT_NAME = "position_sensor_right"; - -/* Name of the light sensor 0 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_0_NAME = "lightsensor_l"; - -/* Name of the light sensor 1 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_1_NAME = "lightsensor_lm"; - -/* Name of the light sensor 2 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_2_NAME = "lightsensor_m"; - -/* Name of the light sensor 3 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_3_NAME = "lightsensor_rm"; - -/* Name of the light sensor 4 in the robot simulation. */ -const char* Board::LIGHT_SENSOR_4_NAME = "lightsensor_r"; - -/* Name of the yellow LED in the robot simulation. */ -const char* Board::LED_YELLOW_NAME = "led_yellow"; - -/* Name of the accelerometer in the robot simulation. */ -const char* Board::ACCELEROMETER_NAME = "accelerometer"; - -/* Name of the gyro in the robot simulation. */ -const char* Board::GYRO_NAME = "gyro"; - -/* Name of the magnetometer in the robot simulation. */ -const char* Board::MAGNETOMETER_NAME = "magnetometer"; - -/* Name of the serial emitter in the RadonUlzer simulation. */ -const char* Board::EMITTER_NAME_SERIAL = "serialComTx"; - -/* Name of the serial receiver in the RadonUlzer simulation. */ -const char* Board::RECEIVER_NAME_SERIAL = "serialComRx"; - /****************************************************************************** * Public Methods *****************************************************************************/ @@ -147,18 +85,24 @@ Board::Board() : m_simTime(m_robot), m_keyboard(m_simTime, m_robot.getKeyboard()), m_buttonA(m_keyboard), - m_buzzer(m_robot.getSpeaker(SPEAKER_NAME)), - m_encoders(m_robot.getPositionSensor(POS_SENSOR_LEFT_NAME), m_robot.getPositionSensor(POS_SENSOR_RIGHT_NAME)), - m_lineSensors(m_robot.getEmitter(EMITTER_0_NAME), m_robot.getEmitter(EMITTER_1_NAME), - m_robot.getEmitter(EMITTER_2_NAME), m_robot.getEmitter(EMITTER_3_NAME), - m_robot.getEmitter(EMITTER_4_NAME), m_robot.getDistanceSensor(LIGHT_SENSOR_0_NAME), - m_robot.getDistanceSensor(LIGHT_SENSOR_1_NAME), m_robot.getDistanceSensor(LIGHT_SENSOR_2_NAME), - m_robot.getDistanceSensor(LIGHT_SENSOR_3_NAME), m_robot.getDistanceSensor(LIGHT_SENSOR_4_NAME)), - m_motors(m_robot.getMotor(LEFT_MOTOR_NAME), m_robot.getMotor(RIGHT_MOTOR_NAME)), - m_ledYellow(m_robot.getLED(LED_YELLOW_NAME)), - m_imu(m_robot.getAccelerometer(ACCELEROMETER_NAME), m_robot.getGyro(GYRO_NAME), - m_robot.getCompass(MAGNETOMETER_NAME)), - m_serialDrv(m_robot.getEmitter(EMITTER_NAME_SERIAL), m_robot.getReceiver(RECEIVER_NAME_SERIAL)), + m_buzzer(m_robot.getSpeaker(RobotDeviceNames::SPEAKER_NAME)), + m_encoders(m_robot.getPositionSensor(RobotDeviceNames::POS_SENSOR_LEFT_NAME), + m_robot.getPositionSensor(RobotDeviceNames::POS_SENSOR_RIGHT_NAME)), + m_lineSensors( + m_robot.getEmitter(RobotDeviceNames::EMITTER_0_NAME), m_robot.getEmitter(RobotDeviceNames::EMITTER_1_NAME), + m_robot.getEmitter(RobotDeviceNames::EMITTER_2_NAME), m_robot.getEmitter(RobotDeviceNames::EMITTER_3_NAME), + m_robot.getEmitter(RobotDeviceNames::EMITTER_4_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_0_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_1_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_2_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_3_NAME), + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_4_NAME)), + m_motors(m_robot.getMotor(RobotDeviceNames::LEFT_MOTOR_NAME), m_robot.getMotor(RobotDeviceNames::RIGHT_MOTOR_NAME)), + m_ledYellow(m_robot.getLED(RobotDeviceNames::LED_YELLOW_NAME)), + m_imu(m_robot.getAccelerometer(RobotDeviceNames::ACCELEROMETER_NAME), m_robot.getGyro(RobotDeviceNames::GYRO_NAME), + m_robot.getCompass(RobotDeviceNames::MAGNETOMETER_NAME)), + m_serialDrv(m_robot.getEmitter(RobotDeviceNames::EMITTER_NAME_SERIAL), + m_robot.getReceiver(RobotDeviceNames::RECEIVER_NAME_SERIAL)), m_settings() { } @@ -168,17 +112,17 @@ void Board::enableSimulationDevices() const int timeStep = m_simTime.getTimeStep(); m_robot.getKeyboard()->enable(timeStep); - m_robot.getPositionSensor(POS_SENSOR_LEFT_NAME)->enable(timeStep); - m_robot.getPositionSensor(POS_SENSOR_RIGHT_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_0_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_1_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_2_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_3_NAME)->enable(timeStep); - m_robot.getDistanceSensor(LIGHT_SENSOR_4_NAME)->enable(timeStep); - m_robot.getAccelerometer(ACCELEROMETER_NAME)->enable(timeStep); - m_robot.getGyro(GYRO_NAME)->enable(timeStep); - m_robot.getCompass(MAGNETOMETER_NAME)->enable(timeStep); - m_robot.getReceiver(RECEIVER_NAME_SERIAL)->enable(timeStep); + m_robot.getPositionSensor(RobotDeviceNames::POS_SENSOR_LEFT_NAME)->enable(timeStep); + m_robot.getPositionSensor(RobotDeviceNames::POS_SENSOR_RIGHT_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_0_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_1_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_2_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_3_NAME)->enable(timeStep); + m_robot.getDistanceSensor(RobotDeviceNames::LIGHT_SENSOR_4_NAME)->enable(timeStep); + m_robot.getAccelerometer(RobotDeviceNames::ACCELEROMETER_NAME)->enable(timeStep); + m_robot.getGyro(RobotDeviceNames::GYRO_NAME)->enable(timeStep); + m_robot.getCompass(RobotDeviceNames::MAGNETOMETER_NAME)->enable(timeStep); + m_robot.getReceiver(RobotDeviceNames::RECEIVER_NAME_SERIAL)->enable(timeStep); } /****************************************************************************** diff --git a/lib/HALSensorFusionSim/Board.h b/lib/HALSensorFusionSim/Board.h index c89d5912..f9f714b0 100644 --- a/lib/HALSensorFusionSim/Board.h +++ b/lib/HALSensorFusionSim/Board.h @@ -179,68 +179,6 @@ class Board : public IBoard } private: - /** Name of the speaker in the robot simulation. */ - static const char* SPEAKER_NAME; - - /** Name of the left motor in the robot simulation. */ - static const char* LEFT_MOTOR_NAME; - - /** Name of the right motor in the robot simulation. */ - static const char* RIGHT_MOTOR_NAME; - - /** Name of the infrared emitter 0 in the robot simulation. */ - static const char* EMITTER_0_NAME; - - /** Name of the infrared emitter 1 in the robot simulation. */ - static const char* EMITTER_1_NAME; - - /** Name of the infrared emitter 2 in the robot simulation. */ - static const char* EMITTER_2_NAME; - - /** Name of the infrared emitter 3 in the robot simulation. */ - static const char* EMITTER_3_NAME; - - /** Name of the infrared emitter 4 in the robot simulation. */ - static const char* EMITTER_4_NAME; - - /** Name of the position sensor of the left motor in the robot simulation. */ - static const char* POS_SENSOR_LEFT_NAME; - - /** Name of the position sensor of the right motor in the robot simulation. */ - static const char* POS_SENSOR_RIGHT_NAME; - - /** Name of the light sensor 0 in the robot simulation. */ - static const char* LIGHT_SENSOR_0_NAME; - - /** Name of the light sensor 1 in the robot simulation. */ - static const char* LIGHT_SENSOR_1_NAME; - - /** Name of the light sensor 2 in the robot simulation. */ - static const char* LIGHT_SENSOR_2_NAME; - - /** Name of the light sensor 3 in the robot simulation. */ - static const char* LIGHT_SENSOR_3_NAME; - - /** Name of the light sensor 4 in the robot simulation. */ - static const char* LIGHT_SENSOR_4_NAME; - - /** Name of the yellow LED in the robot simulation. */ - static const char* LED_YELLOW_NAME; - - /** Name of the accelerometer in the robot simulation. */ - static const char* ACCELEROMETER_NAME; - - /** Name of the gyro in the robot simulation. */ - static const char* GYRO_NAME; - - /** Name of the Magnetometer in the robot simulation. */ - static const char* MAGNETOMETER_NAME; - - /** Name of the serial emitter in the RadonUlzer simulation. */ - static const char* EMITTER_NAME_SERIAL; - - /** Name of the serial receiver in the RadonUlzer simulation. */ - static const char* RECEIVER_NAME_SERIAL; /** Simulated roboter instance. */ webots::Robot m_robot; diff --git a/lib/HALSim/RobotDevices.h b/lib/HALSim/RobotDevices.h new file mode 100644 index 00000000..a6619367 --- /dev/null +++ b/lib/HALSim/RobotDevices.h @@ -0,0 +1,146 @@ +/* MIT License + * + * Copyright (c) 2023 - 2024 Andreas Merkle + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/******************************************************************************* + DESCRIPTION +*******************************************************************************/ +/** + * @brief Robot device names in Webots + * @author Andreas Merkle + * + * @addtogroup HALInterfaces + * + * @{ + */ + +#ifndef ROBOT_DEVICE_NAMES_H +#define ROBOT_DEVICE_NAMES_H + +/****************************************************************************** + * Compile Switches + *****************************************************************************/ + +/****************************************************************************** + * Includes + *****************************************************************************/ +#include + +/****************************************************************************** + * Macros + *****************************************************************************/ + +/****************************************************************************** + * Types and Classes + *****************************************************************************/ + +/** + * Robot device names in Webots. + */ +namespace RobotDeviceNames +{ + /** Name of the speaker in the robot simulation. */ + static const char* SPEAKER_NAME = "speaker"; + + /** Name of the display in the robot simulation. */ + static const char* DISPLAY_NAME = "robot_display"; + + /** Name of the left motor in the robot simulation. */ + static const char* LEFT_MOTOR_NAME = "motor_left"; + + /** Name of the right motor in the robot simulation. */ + static const char* RIGHT_MOTOR_NAME = "motor_right"; + + /** Name of the infrared emitter 0 in the robot simulation. */ + static const char* EMITTER_0_NAME = "emitter_l"; + + /** Name of the infrared emitter 1 in the robot simulation. */ + static const char* EMITTER_1_NAME = "emitter_lm"; + + /** Name of the infrared emitter 2 in the robot simulation. */ + static const char* EMITTER_2_NAME = "emitter_m"; + + /** Name of the infrared emitter 3 in the robot simulation. */ + static const char* EMITTER_3_NAME = "emitter_rm"; + + /** Name of the infrared emitter 4 in the robot simulation. */ + static const char* EMITTER_4_NAME = "emitter_r"; + + /** Name of the position sensor of the left motor in the robot simulation. */ + static const char* POS_SENSOR_LEFT_NAME = "position_sensor_left"; + + /** Name of the position sensor of the right motor in the robot simulation. */ + static const char* POS_SENSOR_RIGHT_NAME = "position_sensor_right"; + + /** Name of the light sensor 0 in the robot simulation. */ + static const char* LIGHT_SENSOR_0_NAME = "lightsensor_l"; + + /** Name of the light sensor 1 in the robot simulation. */ + static const char* LIGHT_SENSOR_1_NAME = "lightsensor_lm"; + + /** Name of the light sensor 2 in the robot simulation. */ + static const char* LIGHT_SENSOR_2_NAME = "lightsensor_m"; + + /** Name of the light sensor 3 in the robot simulation. */ + static const char* LIGHT_SENSOR_3_NAME = "lightsensor_rm"; + + /** Name of the light sensor 4 in the robot simulation. */ + static const char* LIGHT_SENSOR_4_NAME = "lightsensor_r"; + + /** Name of the red LED in the robot simulation. */ + static const char* LED_RED_NAME = "led_red"; + + /** Name of the yellow LED in the robot simulation. */ + static const char* LED_YELLOW_NAME = "led_yellow"; + + /** Name of the green LED in the robot simulation. */ + static const char* LED_GREEN_NAME = "led_green"; + + /** Name of the front left proximity sensor in the robot simulation. */ + static const char* PROXIMITY_SENSOR_FRONT_LEFT_NAME = "proxim_sensor_fl"; + + /** Name of the front right proximity sensor in the robot simulation. */ + static const char* PROXIMITY_SENSOR_FRONT_RIGHT_NAME = "proxim_sensor_fr"; + + /** Name of the accelerometer in the robot simulation. */ + static const char* ACCELEROMETER_NAME = "accelerometer"; + + /** Name of the gyro in the robot simulation. */ + static const char* GYRO_NAME = "gyro"; + + /** Name of the magnetometer in the robot simulation. */ + static const char* MAGNETOMETER_NAME = "magnetometer"; + + /** Name of the serial emitter in the RadonUlzer simulation. */ + static const char* EMITTER_NAME_SERIAL = "serialComTx"; + + /** Name of the serial receiver in the RadonUlzer simulation. */ + static const char* RECEIVER_NAME_SERIAL = "serialComRx"; + +}; /* namespace RobotDeviceNames */ + +/****************************************************************************** + * Functions + *****************************************************************************/ + +#endif /* ROBOT_DEVICE_NAMES_H */ +/** @} */ From f032e80b0afb3e2549b81067c6de6d71c504d536 Mon Sep 17 00:00:00 2001 From: BlueAndi Date: Fri, 19 Apr 2024 00:05:56 +0200 Subject: [PATCH 10/15] File renamed for consistency with the internal namespace and etc. --- lib/HALCalibSim/Board.cpp | 2 +- lib/HALConvoyLeaderSim/Board.cpp | 2 +- lib/HALLineFollowerSim/Board.cpp | 2 +- lib/HALRemoteControlSim/Board.cpp | 2 +- lib/HALSensorFusionSim/Board.cpp | 2 +- lib/HALSim/{RobotDevices.h => RobotDeviceNames.h} | 0 6 files changed, 5 insertions(+), 5 deletions(-) rename lib/HALSim/{RobotDevices.h => RobotDeviceNames.h} (100%) diff --git a/lib/HALCalibSim/Board.cpp b/lib/HALCalibSim/Board.cpp index cd45cca3..21c95b4b 100644 --- a/lib/HALCalibSim/Board.cpp +++ b/lib/HALCalibSim/Board.cpp @@ -33,7 +33,7 @@ * Includes *****************************************************************************/ #include -#include +#include /****************************************************************************** * Compiler Switches diff --git a/lib/HALConvoyLeaderSim/Board.cpp b/lib/HALConvoyLeaderSim/Board.cpp index c4df1740..b6721de9 100644 --- a/lib/HALConvoyLeaderSim/Board.cpp +++ b/lib/HALConvoyLeaderSim/Board.cpp @@ -33,7 +33,7 @@ * Includes *****************************************************************************/ #include -#include +#include /****************************************************************************** * Compiler Switches diff --git a/lib/HALLineFollowerSim/Board.cpp b/lib/HALLineFollowerSim/Board.cpp index f79d3dff..d70999ad 100644 --- a/lib/HALLineFollowerSim/Board.cpp +++ b/lib/HALLineFollowerSim/Board.cpp @@ -33,7 +33,7 @@ * Includes *****************************************************************************/ #include -#include +#include /****************************************************************************** * Compiler Switches diff --git a/lib/HALRemoteControlSim/Board.cpp b/lib/HALRemoteControlSim/Board.cpp index 0a145f41..11ce3e23 100644 --- a/lib/HALRemoteControlSim/Board.cpp +++ b/lib/HALRemoteControlSim/Board.cpp @@ -33,7 +33,7 @@ * Includes *****************************************************************************/ #include -#include +#include /****************************************************************************** * Compiler Switches diff --git a/lib/HALSensorFusionSim/Board.cpp b/lib/HALSensorFusionSim/Board.cpp index e4ab52d1..e55cc70e 100644 --- a/lib/HALSensorFusionSim/Board.cpp +++ b/lib/HALSensorFusionSim/Board.cpp @@ -33,7 +33,7 @@ * Includes *****************************************************************************/ #include -#include +#include /****************************************************************************** * Compiler Switches diff --git a/lib/HALSim/RobotDevices.h b/lib/HALSim/RobotDeviceNames.h similarity index 100% rename from lib/HALSim/RobotDevices.h rename to lib/HALSim/RobotDeviceNames.h From baece101dec2cc29421cfad85bf4de4d4f55fb35 Mon Sep 17 00:00:00 2001 From: BlueAndi Date: Wed, 15 May 2024 20:19:46 +0200 Subject: [PATCH 11/15] Disable logging, because SerMuxProt is applied. --- lib/APPSensorFusion/App.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/APPSensorFusion/App.cpp b/lib/APPSensorFusion/App.cpp index 49c9d677..9f39468d 100644 --- a/lib/APPSensorFusion/App.cpp +++ b/lib/APPSensorFusion/App.cpp @@ -39,6 +39,7 @@ #include #include #include +#include /****************************************************************************** * Compiler Switches @@ -67,6 +68,7 @@ void App::setup() { Serial.begin(SERIAL_BAUDRATE); + Logging::disable(); /* Initialize HAL */ Board::getInstance().init(); From 5ceef8a17810ea9e6163ffc7ff9201b3bcb3bc46 Mon Sep 17 00:00:00 2001 From: BlueAndi Date: Wed, 15 May 2024 20:37:52 +0200 Subject: [PATCH 12/15] ZumoComSystem related worlds moved to a separate folder. The ZumoComSystem was added to the worlds too. --- README.md | 6 ++--- .../PlatoonTrack.wbt | 24 +++++++++++++++---- .../SensorFusionTrack.wbt | 12 +++++++--- 3 files changed, 32 insertions(+), 10 deletions(-) rename webots/worlds/{ => zumo_with_com_system}/PlatoonTrack.wbt (77%) rename webots/worlds/{ => zumo_with_com_system}/SensorFusionTrack.wbt (78%) diff --git a/README.md b/README.md index a7e3c4c5..5dd7dfed 100644 --- a/README.md +++ b/README.md @@ -152,11 +152,11 @@ Example for the **LineFollowerTarget** application: | Application | Description | Standalone | DroidControlShop Required | Webots World | | - | - | - | - | - | | Calib | Application used for motor speed calibration. | Yes | No | ./webots/worlds/LargeTrack.wbt ./webots/worlds/LineFollowerTrack.wbt | -| ConvoyLeader | A line follower, providing information to the [DroidControlShip](https://github.com/BlueAndi/DroidControlShip) in a convoy leader role. | No | Yes | ./webots/worlds/PlatoonTrack.wbt | -| ConvoyFollower | Convoy follower, providing information to the [DroidControlShip](https://github.com/BlueAndi/DroidControlShip) to drive to its target. | No | Yes | ./webots/worlds/PlatoonTrack.wbt | +| ConvoyLeader | A line follower, providing information to the [DroidControlShip](https://github.com/BlueAndi/DroidControlShip) in a convoy leader role. | No | Yes | ./webots/worlds/zumo_with_com_system/PlatoonTrack.wbt | +| ConvoyFollower | Convoy follower, providing information to the [DroidControlShip](https://github.com/BlueAndi/DroidControlShip) to drive to its target. | No | Yes | ./webots/worlds/zumo_with_com_system/PlatoonTrack.wbt | | LineFollower | Just a line follower, using a PID controller. | Yes | No | ./webots/worlds/ETrack.wbt ./webots/worlds/LargeTrack.wbt ./webots/worlds/LineFollowerTrack.wbt | | RemoteControl | The robot is remote controlled by e.g. the [DroidControlShip](https://github.com/BlueAndi/DroidControlShip) in a convoy follower role. | No | Yes | ./webots/world/zumo_with_com_system/* | -| SensorFusion | The robot provides odometry and inertial data to the [DroidControlShip](https://github.com/BlueAndi/DroidControlShip), which calculates the sensor fusion based location information. | No | Yes | ./webots/worlds/SensorFusionTrack.wbt | +| SensorFusion | The robot provides odometry and inertial data to the [DroidControlShip](https://github.com/BlueAndi/DroidControlShip), which calculates the sensor fusion based location information. | No | Yes | ./webots/worlds/zumo_with_com_system/SensorFusionTrack.wbt | | Test | Only for testing purposes on native environment. | Yes | No | N/A | # Documentation diff --git a/webots/worlds/PlatoonTrack.wbt b/webots/worlds/zumo_with_com_system/PlatoonTrack.wbt similarity index 77% rename from webots/worlds/PlatoonTrack.wbt rename to webots/worlds/zumo_with_com_system/PlatoonTrack.wbt index 894fc68c..a8d2a94b 100644 --- a/webots/worlds/PlatoonTrack.wbt +++ b/webots/worlds/zumo_with_com_system/PlatoonTrack.wbt @@ -2,10 +2,11 @@ EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2023a/projects/objects/backgrounds/protos/TexturedBackground.proto" EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2023a/projects/objects/backgrounds/protos/TexturedBackgroundLight.proto" -EXTERNPROTO "../protos/Zumo32U4.proto" -EXTERNPROTO "../protos/PlatoonTrack.proto" -EXTERNPROTO "../protos/Supervisor.proto" -EXTERNPROTO "../protos/Obstacle.proto" +EXTERNPROTO "../../protos/Zumo32U4.proto" +EXTERNPROTO "../../protos/ZumoComSystem.proto" +EXTERNPROTO "../../protos/PlatoonTrack.proto" +EXTERNPROTO "../../protos/Supervisor.proto" +EXTERNPROTO "../../protos/Obstacle.proto" WorldInfo { info [ @@ -41,18 +42,33 @@ DEF LEADER Zumo32U4 { name "leader" contactMaterial "rubber" } +ZumoComSystem { + translation 0 0 0 + rotation 0 0 1 0 + name "ZumoComSystemLeader" +} DEF FOLLOWER1 Zumo32U4 { translation -3.15 -1.2 0.013994298332013683 rotation -1.0564747468923541e-06 8.746699709178704e-07 0.9999999999990595 1.5880805820884731 name "follower_1" contactMaterial "rubber" } +ZumoComSystem { + translation 0 0 0 + rotation 0 0 1 0 + name "ZumoComSystemFollower1" +} DEF FOLLOWER2 Zumo32U4 { translation -3.15 -1.35 0.013994298332013683 rotation -1.0564747468923541e-06 8.746699709178704e-07 0.9999999999990595 1.5880805820884731 name "follower_2" contactMaterial "rubber" } +ZumoComSystem { + translation 0 0 0 + rotation 0 0 1 0 + name "ZumoComSystemFollower2" +} Supervisor { name "PlatoonSupervisor" controller "PlatoonSupervisor" diff --git a/webots/worlds/SensorFusionTrack.wbt b/webots/worlds/zumo_with_com_system/SensorFusionTrack.wbt similarity index 78% rename from webots/worlds/SensorFusionTrack.wbt rename to webots/worlds/zumo_with_com_system/SensorFusionTrack.wbt index 468e9c3e..4fe00402 100644 --- a/webots/worlds/SensorFusionTrack.wbt +++ b/webots/worlds/zumo_with_com_system/SensorFusionTrack.wbt @@ -2,9 +2,10 @@ EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2023a/projects/objects/backgrounds/protos/TexturedBackground.proto" EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2023a/projects/objects/backgrounds/protos/TexturedBackgroundLight.proto" -EXTERNPROTO "../protos/Zumo32U4.proto" -EXTERNPROTO "../protos/SensorFusionTrack.proto" -IMPORTABLE EXTERNPROTO "../protos/Supervisor.proto" +EXTERNPROTO "../../protos/Zumo32U4.proto" +EXTERNPROTO "../../protos/ZumoComSystem.proto" +EXTERNPROTO "../../protos/SensorFusionTrack.proto" +IMPORTABLE EXTERNPROTO "../../protos/Supervisor.proto" WorldInfo { info [ @@ -39,6 +40,11 @@ DEF ROBOT Zumo32U4 { name "Zumo" contactMaterial "rubber" } +ZumoComSystem { + translation 0 0 0 + rotation 0 0 1 0 + name "ZumoComSystem" +} Supervisor { name "Supervisor" controller "Supervisor" From a192d218dea6ca7c56b4df72a3f7ad7802c85c3a Mon Sep 17 00:00:00 2001 From: BlueAndi Date: Fri, 17 May 2024 01:26:56 +0200 Subject: [PATCH 13/15] Batch file added to simply start a platoon of 3 robots. --- start_platoon.bat | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 start_platoon.bat diff --git a/start_platoon.bat b/start_platoon.bat new file mode 100644 index 00000000..41a7c9c8 --- /dev/null +++ b/start_platoon.bat @@ -0,0 +1,33 @@ +@echo off + +set PATH=%PATH%; +set WEBOTS_CONTROLLER="%WEBOTS_HOME%\msys64\mingw64\bin\webots-controller.exe" +set PROGRAM_NAME=program.exe +set CONVOY_LEADER_PROGRAM_PATH=.pio\build\ConvoyLeaderSim +set CONVOY_FOLLOWER_PROGRAM_PATH=.pio\build\ConvoyFollowerSim + +rem Compile Convoy Leader +%USERPROFILE%\.platformio\penv\Scripts\pio.exe run --environment ConvoyLeaderSim + +rem Compile Convoy Follower +%USERPROFILE%\.platformio\penv\Scripts\pio.exe run --environment ConvoyFollowerSim + +rem Start the convoy leader +echo Start convoy leader. +start "Convoy Leader" ""%WEBOTS_CONTROLLER%"" --robot-name=leader --stdout-redirect %CONVOY_LEADER_PROGRAM_PATH%\%PROGRAM_NAME% -c --serialRxCh=1 --serialTxCh=2 -v" + +rem Start the followers +for /L %%i in (1, 1, 2) do ( + call :start_follower %%i +) + +exit /b + +:start_follower +set INSTANCE=%1 +set ROBOT_NAME=follower_%instance% +set /a SERIAL_RX_CHANNEL=(INSTANCE * 2) + 0 +set /a SERIAL_TX_CHANNEL=(INSTANCE * 2) + 1 +echo Start convoy follower %INSTANCE%. +start "Convoy Follower %INSTANCE%" ""%WEBOTS_CONTROLLER%"" --robot-name=%ROBOT_NAME% --stdout-redirect %CONVOY_FOLLOWER_PROGRAM_PATH%\%PROGRAM_NAME% -c --serialRxCh=%SERIAL_RX_CHANNEL% --serialTxCh=%SERIAL_TX_CHANNEL% -v" +exit /b From 5a1449b27c6e3227b2caf56d51debf46c5770397 Mon Sep 17 00:00:00 2001 From: Andreas Merkle Date: Fri, 17 May 2024 14:13:12 +0200 Subject: [PATCH 14/15] Obsolete winsocket library switch removed. --- platformio.ini | 3 -- scripts/add_os_specific_build_flags.py | 55 -------------------------- 2 files changed, 58 deletions(-) delete mode 100644 scripts/add_os_specific_build_flags.py diff --git a/platformio.ini b/platformio.ini index 8f871711..c8995ccf 100644 --- a/platformio.ini +++ b/platformio.ini @@ -113,7 +113,6 @@ lib_ignore = HALTest extra_scripts = ./scripts/webots_launcher.py - pre:./scripts/add_os_specific_build_flags.py pre:./scripts/create_webots_library.py pre:./scripts/copy_sounds.py post:./scripts/copy_webots_shared_libs.py @@ -140,8 +139,6 @@ lib_ignore = HALSim HALTarget Webots -extra_scripts = - pre:./scripts/add_os_specific_build_flags.py ; ***************************************************************************** ; Calibration application diff --git a/scripts/add_os_specific_build_flags.py b/scripts/add_os_specific_build_flags.py deleted file mode 100644 index 637f30da..00000000 --- a/scripts/add_os_specific_build_flags.py +++ /dev/null @@ -1,55 +0,0 @@ -""" Detect Operative System and add corresponding build flags """ - -# MIT License -# -# Copyright (c) 2023 - 2024 Andreas Merkle -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -# - - -################################################################################ -# Imports -################################################################################ -import platform - -Import("env") # pylint: disable=undefined-variable - -################################################################################ -# Variables -################################################################################ - -OS_PLATFORM_TYPE_WIN = "Windows" -OS_PLATFORM_TYPE = platform.system() -WINDOWS_BUILD_FLAGS = ['-lws2_32'] - -################################################################################ -# Classes -################################################################################ - -################################################################################ -# Functions -################################################################################ - -################################################################################ -# Main -################################################################################ - -if OS_PLATFORM_TYPE == OS_PLATFORM_TYPE_WIN: - env.Append(BUILD_FLAGS=WINDOWS_BUILD_FLAGS) # pylint: disable=undefined-variable From 420eda460e16e690d947057de95e960022b2ae72 Mon Sep 17 00:00:00 2001 From: Andreas Merkle Date: Fri, 17 May 2024 14:54:39 +0200 Subject: [PATCH 15/15] Missing extra_scripts option fixed. --- platformio.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/platformio.ini b/platformio.ini index c8995ccf..2f5765b1 100644 --- a/platformio.ini +++ b/platformio.ini @@ -139,6 +139,7 @@ lib_ignore = HALSim HALTarget Webots +extra_scripts = ; ***************************************************************************** ; Calibration application