diff --git a/CMakeLists.txt b/CMakeLists.txt index c60db111..a23640b2 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -150,36 +150,37 @@ endif() ## Link Libraries to Executable target_link_libraries(${EXE_NAME} PRIVATE Threads::Threads Eigen3::Eigen + RoveComm_CPP quill::quill ${OpenCV_LIBS} ${GeographicLib_LIBRARIES} ${ZED_LIBS} - RoveComm_CPP ) ## Package Executable -install(TARGETS ${EXE_NAME} RUNTIME_DEPENDENCIES DIRECTORIES ${OpenCV_LIBS} ${GeographicLib_LIBRARIES} ${ZED_LIBS} quill::quill RoveComm_CPP RUNTIME DESTINATION bin) +install(TARGETS ${EXE_NAME} RUNTIME_DEPENDENCIES DIRECTORIES RoveComm_CPP ${OpenCV_LIBS} ${GeographicLib_LIBRARIES} ${ZED_LIBS} quill::quill RUNTIME DESTINATION bin) ## Unit/Integration Tests file(GLOB_RECURSE UnitTests_SRC CONFIGURE_DEPENDS "tests/Unit/*.cc") file(GLOB_RECURSE IntegrationTests_SRC CONFIGURE_DEPENDS "tests/Integration/*.cc") file(GLOB_RECURSE Algorithms_SRC CONFIGURE_DEPENDS "src/algorithms/*.cpp") -file(GLOB Logging_SRC CONFIGURE_DEPENDS "src/AutonomyLogging.cpp") +file(GLOB Network_SRC CONFIGURE_DEPENDS "src/AutonomyNetworking.cpp") +file(GLOB Logging_SRC CONFIGURE_DEPENDS "src/AutonomyLogging.cpp") list(LENGTH UnitTests_SRC UnitTests_LEN) list(LENGTH IntegrationTests_SRC IntegrationTests_LEN) if (UnitTests_LEN GREATER 0) - add_executable(${EXE_NAME}_UnitTests ${UnitTests_SRC} ${Algorithms_SRC} ${Logging_SRC}) - target_link_libraries(${EXE_NAME}_UnitTests GTest::gtest GTest::gtest_main quill::quill ${OpenCV_LIBS} ${GeographicLib_LIBRARIES}) + add_executable(${EXE_NAME}_UnitTests ${UnitTests_SRC} ${Algorithms_SRC} ${Network_SRC} ${Logging_SRC}) + target_link_libraries(${EXE_NAME}_UnitTests GTest::gtest GTest::gtest_main RoveComm_CPP quill::quill ${OpenCV_LIBS} ${GeographicLib_LIBRARIES}) add_test(Unit_Tests ${EXE_NAME}_UnitTests) else() message("No Unit Tests!") endif() if (IntegrationTests_LEN GREATER 0) - add_executable(${EXE_NAME}_IntegrationTests ${IntegrationTests_SRC} ${Algorithms_SRC} ${Logging_SRC}) - target_link_libraries(${EXE_NAME}_IntegrationTests GTest::gtest GTest::gtest_main quill::quill ${OpenCV_LIBS} ${GeographicLib_LIBRARIES}) + add_executable(${EXE_NAME}_IntegrationTests ${IntegrationTests_SRC} ${Algorithms_SRC} ${Network_SRC} ${Logging_SRC}) + target_link_libraries(${EXE_NAME}_IntegrationTests GTest::gtest GTest::gtest_main RoveComm_CPP quill::quill ${OpenCV_LIBS} ${GeographicLib_LIBRARIES}) add_test(Integration_Tests ${EXE_NAME}_IntegrationTests) else() message("No Integration Tests!") diff --git a/data/Custom_Dictionaries/Autonomy-Dictionary.txt b/data/Custom_Dictionaries/Autonomy-Dictionary.txt index d199e194..93fedef4 100644 --- a/data/Custom_Dictionaries/Autonomy-Dictionary.txt +++ b/data/Custom_Dictionaries/Autonomy-Dictionary.txt @@ -30,6 +30,7 @@ Contoller cpptools cschlosser CUDA +CURRENTLOG CURRENTSTATE deadband debfile diff --git a/src/AutonomyGlobals.cpp b/src/AutonomyGlobals.cpp index a152ca1f..be6d557b 100644 --- a/src/AutonomyGlobals.cpp +++ b/src/AutonomyGlobals.cpp @@ -43,8 +43,4 @@ namespace globals DriveBoard* g_pDriveBoard; MultimediaBoard* g_pMultimediaBoard; NavigationBoard* g_pNavigationBoard; - - // RoveComm Instances: - rovecomm::RoveCommUDP* g_pRoveCommUDPNode; - rovecomm::RoveCommTCP* g_pRoveCommTCPNode; } // namespace globals diff --git a/src/AutonomyGlobals.h b/src/AutonomyGlobals.h index 53f10931..3a9bb403 100644 --- a/src/AutonomyGlobals.h +++ b/src/AutonomyGlobals.h @@ -21,7 +21,6 @@ #include "handlers/WaypointHandler.h" /// \cond -#include #include #include #include @@ -60,10 +59,6 @@ namespace globals extern DriveBoard* g_pDriveBoard; // Global Drive Board Driver extern MultimediaBoard* g_pMultimediaBoard; // Global Multimedia Board Driver extern NavigationBoard* g_pNavigationBoard; // Global Navigation Board Driver - - // RoveComm Instances: - extern rovecomm::RoveCommUDP* g_pRoveCommUDPNode; // Global RoveComm UDP Instance. - extern rovecomm::RoveCommTCP* g_pRoveCommTCPNode; // Global RoveComm TCP Instance. } // namespace globals #endif // AUTONOMY_GLOBALS_H diff --git a/src/AutonomyLogging.cpp b/src/AutonomyLogging.cpp index 473a9dcc..576c22f6 100644 --- a/src/AutonomyLogging.cpp +++ b/src/AutonomyLogging.cpp @@ -9,8 +9,11 @@ ******************************************************************************/ #include "AutonomyLogging.h" +#include "AutonomyNetworking.h" /// \cond +#include +#include #include /// \endcond @@ -30,6 +33,7 @@ namespace logging ///////////////////////////////////////// quill::Logger* g_qFileLogger; quill::Logger* g_qConsoleLogger; + quill::Logger* g_qRoveCommLogger; quill::Logger* g_qSharedLogger; std::string g_szProgramStartTimeString; @@ -82,17 +86,22 @@ namespace logging std::filesystem::path szFullOutputPath = szFilePath / szFilenameWithExtension; // Create Handlers - std::shared_ptr qFileHandler = quill::rotating_file_handler(szFullOutputPath); - std::shared_ptr qConsoleHandler = quill::stdout_handler(); + std::shared_ptr qFileHandler = quill::rotating_file_handler(szFullOutputPath); + std::shared_ptr qConsoleHandler = quill::stdout_handler(); + std::shared_ptr qRoveCommHandler = quill::create_handler("RoveCommHandler"); // Configure Patterns - qFileHandler->set_pattern("%(ascii_time) %(level_name) [%(thread)] [%(filename):%(lineno)] %(message)", // format - "%Y-%m-%d %H:%M:%S.%Qms", // timestamp format - quill::Timezone::GmtTime); // timestamp's timezone + qFileHandler->set_pattern("%(ascii_time) %(level_name) [%(thread)] [%(filename):%(lineno)] %(message)", // format + "%Y-%m-%d %H:%M:%S.%Qms", // timestamp format + quill::Timezone::GmtTime); // timestamp's timezone - qConsoleHandler->set_pattern("%(ascii_time) %(level_name) [%(thread)] [%(filename):%(lineno)] %(message)", // format - "%Y-%m-%d %H:%M:%S.%Qms", // timestamp format - quill::Timezone::GmtTime); // timestamp's timezone + qConsoleHandler->set_pattern("%(ascii_time) %(level_name) [%(thread)] [%(filename):%(lineno)] %(message)", // format + "%Y-%m-%d %H:%M:%S.%Qms", // timestamp format + quill::Timezone::GmtTime); // timestamp's timezone + + qRoveCommHandler->set_pattern("%(ascii_time) %(level_name) [%(thread)] [%(filename):%(lineno)] %(message)", // format + "%Y-%m-%d %H:%M:%S.%Qms", // timestamp format + quill::Timezone::GmtTime); // timestamp's timezone // Enable Color Console static_cast(qConsoleHandler.get())->enable_console_colours(); @@ -109,20 +118,52 @@ namespace logging // Set Handler Filters qFileHandler->add_filter(std::make_unique("FileFilter", quill::LogLevel::TraceL3)); qConsoleHandler->add_filter(std::make_unique("ConsoleFilter", quill::LogLevel::Info)); + qRoveCommHandler->add_filter(std::make_unique("RoveCommFilter", quill::LogLevel::Info)); // Create Loggers - g_qFileLogger = quill::create_logger("FILE_LOGGER", {qFileHandler}); - g_qConsoleLogger = quill::create_logger("CONSOLE_LOGGER", {qConsoleHandler}); - g_qSharedLogger = quill::create_logger("SHARED_LOGGER", {qFileHandler, qConsoleHandler}); + g_qFileLogger = quill::create_logger("FILE_LOGGER", {qFileHandler}); + g_qConsoleLogger = quill::create_logger("CONSOLE_LOGGER", {qConsoleHandler}); + g_qRoveCommLogger = quill::create_logger("ROVECOMM_LOGGER", {qRoveCommHandler}); + g_qSharedLogger = quill::create_logger("SHARED_LOGGER", {qFileHandler, qConsoleHandler, qRoveCommHandler}); // Set Base Logging Levels - g_qSharedLogger->set_log_level(quill::LogLevel::TraceL3); g_qFileLogger->set_log_level(quill::LogLevel::TraceL3); g_qConsoleLogger->set_log_level(quill::LogLevel::TraceL3); + g_qRoveCommLogger->set_log_level(quill::LogLevel::TraceL3); + g_qSharedLogger->set_log_level(quill::LogLevel::TraceL3); // Enable Backtrace g_qFileLogger->init_backtrace(2, quill::LogLevel::Critical); g_qConsoleLogger->init_backtrace(2, quill::LogLevel::Critical); + g_qRoveCommLogger->init_backtrace(2, quill::LogLevel::Critical); g_qSharedLogger->init_backtrace(2, quill::LogLevel::Critical); } + + /****************************************************************************** + * @brief This method should never be called by this codebase, it is called + * internally by the quill library. + * + * @author Eli Byrd (edbgkk@mst.edu) + * @date 2024-03-17 + ******************************************************************************/ + void RoveCommHandler::write(quill::fmt_buffer_t const& formatted_log_message, quill::TransitEvent const& log_event) + { + // Not using these. + (void) log_event; + + std::string szTemp{formatted_log_message.data(), formatted_log_message.size()}; + + // Construct a RoveComm packet with the logging data. + rovecomm::RoveCommPacket stPacket; + stPacket.unDataId = manifest::Autonomy::TELEMETRY.find("CURRENTLOG")->second.DATA_ID; + stPacket.unDataCount = manifest::Autonomy::TELEMETRY.find("CURRENTLOG")->second.DATA_COUNT; + stPacket.eDataType = manifest::Autonomy::TELEMETRY.find("CURRENTLOG")->second.DATA_TYPE; + stPacket.vData = StringToVector({formatted_log_message.data(), formatted_log_message.size()}); + + // Send log command over RoveComm to BaseStation. + if (network::g_bRoveCommUDPStatus && network::g_bRoveCommTCPStatus) + { + network::g_pRoveCommUDPNode->SendUDPPacket(stPacket, "0.0.0.0", constants::ROVECOMM_OUTGOING_UDP_PORT); + } + } } // namespace logging diff --git a/src/AutonomyLogging.h b/src/AutonomyLogging.h index 533a7a5c..2bc2c1c7 100644 --- a/src/AutonomyLogging.h +++ b/src/AutonomyLogging.h @@ -18,6 +18,8 @@ #include /// \endcond +#include "./AutonomyConstants.h" + #ifndef AUTONOMY_LOGGING_H #define AUTONOMY_LOGGING_H @@ -56,6 +58,7 @@ namespace logging extern quill::Logger* g_qFileLogger; extern quill::Logger* g_qConsoleLogger; extern quill::Logger* g_qSharedLogger; + extern quill::Logger* g_qRoveCommLogger; extern std::string g_szProgramStartTimeString; ///////////////////////////////////////// @@ -122,5 +125,79 @@ namespace logging } }; + ///////////////////////////////////////// + // Define namespace custom handler + ///////////////////////////////////////// + + /****************************************************************************** + * @brief This class serves as a container class for a custom logger type + * defined to send logging messages over RoveComm from Autonomy. + * + * @author Eli Byrd (edbgkk@mst.edu) + * @date 2024-03-17 + ******************************************************************************/ + class RoveCommHandler : public quill::Handler + { + private: + /****************************************************************************** + * @brief A utility function to convert a string to a vector that is no longer + * than 255 characters long. + * + * @param szString - The string to convert + * @return std::vector - The string shown as a vector of characters. + * + * @author Eli Byrd (edbgkk@mst.edu) + * @date 2024-03-17 + ******************************************************************************/ + std::vector StringToVector(const std::string& szString) + { + std::vector result; + int length = std::min(static_cast(szString.length()), 255); + result.reserve(length); + + for (int i = 0; i < length; ++i) + { + result.push_back(szString[i]); + } + + return result; + } + + public: + /****************************************************************************** + * @brief Construct a new RoveCommHandler object. + * + * @author Eli Byrd (edbgkk@mst.edu) + * @date 2024-03-17 + ******************************************************************************/ + RoveCommHandler() = default; + + /****************************************************************************** + * @brief Destroy the RoveCommHandler object. + * + * @author Eli Byrd (edbgkk@mst.edu) + * @date 2024-03-17 + ******************************************************************************/ + ~RoveCommHandler() override = default; + + /****************************************************************************** + * @brief This method should never be called by this codebase, it is called + * internally by the quill library. + * + * @author Eli Byrd (edbgkk@mst.edu) + * @date 2024-03-17 + ******************************************************************************/ + void write(quill::fmt_buffer_t const& formatted_log_message, quill::TransitEvent const& log_event) override; + + /****************************************************************************** + * @brief This method should never be called by this codebase, it is called + * internally by the quill library. + * + * @author Eli Byrd (edbgkk@mst.edu) + * @date 2024-03-17 + ******************************************************************************/ + void flush() noexcept override {} + }; + } // namespace logging #endif // AUTONOMY_LOGGING_H diff --git a/src/AutonomyNetworking.cpp b/src/AutonomyNetworking.cpp new file mode 100644 index 00000000..ea1633f1 --- /dev/null +++ b/src/AutonomyNetworking.cpp @@ -0,0 +1,41 @@ +/****************************************************************************** + * @brief Defines functions and objects used for Autonomy Networking + * + * @file AutonomyNetworking.cpp + * @author Eli Byrd (edbgkk@mst.edu), ClayJay3 (claytonraycowen@gmail.com) + * @date 2024-03-17 + * + * @copyright Copyright Mars Rover Design Team 2024 - All Rights Reserved + ******************************************************************************/ + +#include "AutonomyNetworking.h" + +/****************************************************************************** + * @brief Defines functions and objects used for Autonomy Networking + * + * @file AutonomyNetworking.cpp + * @author Eli Byrd (edbgkk@mst.edu), ClayJay3 (claytonraycowen@gmail.com) + * @date 2024-03-17 + * + * @copyright Copyright Mars Rover Design Team 2024 - All Rights Reserved + ******************************************************************************/ + +#include "AutonomyNetworking.h" + +/****************************************************************************** + * @brief Namespace containing all networking types/structs that will be used + * project wide. + * + * @author Eli Byrd (edbgkk@mst.edu) + * @date 2024-03-17 + ******************************************************************************/ +namespace network +{ + // RoveComm Instances: + rovecomm::RoveCommUDP* g_pRoveCommUDPNode; + rovecomm::RoveCommTCP* g_pRoveCommTCPNode; + + // RoveComm Status: + bool g_bRoveCommUDPStatus = false; + bool g_bRoveCommTCPStatus = false; +} // namespace network diff --git a/src/AutonomyNetworking.h b/src/AutonomyNetworking.h new file mode 100644 index 00000000..647d473f --- /dev/null +++ b/src/AutonomyNetworking.h @@ -0,0 +1,40 @@ +/****************************************************************************** + * @brief Defines functions and objects used for Autonomy Networking + * + * @file AutonomyNetworking.h + * @author Eli Byrd (edbgkk@mst.edu), ClayJay3 (claytonraycowen@gmail.com) + * @date 2024-03-17 + * + * @copyright Copyright Mars Rover Design Team 2024 - All Rights Reserved + ******************************************************************************/ + +/// \cond +#include +#include +#include +#include + +/// \endcond + +#ifndef AUTONOMY_NETWORKING_H +#define AUTONOMY_NETWORKING_H + +/****************************************************************************** + * @brief Namespace containing all networking types/structs that will be used + * project wide. + * + * @author Eli Byrd (edbgkk@mst.edu) + * @date 2024-03-17 + ******************************************************************************/ +namespace network +{ + // RoveComm Instances: + extern rovecomm::RoveCommUDP* g_pRoveCommUDPNode; // Global RoveComm UDP Instance. + extern rovecomm::RoveCommTCP* g_pRoveCommTCPNode; // Global RoveComm TCP Instance. + + // RoveComm Status: + extern bool g_bRoveCommUDPStatus; + extern bool g_bRoveCommTCPStatus; +} // namespace network + +#endif // AUTONOMY_NETWORKING_H diff --git a/src/drivers/DriveBoard.cpp b/src/drivers/DriveBoard.cpp index c298df09..b4ff2fa5 100755 --- a/src/drivers/DriveBoard.cpp +++ b/src/drivers/DriveBoard.cpp @@ -14,6 +14,7 @@ #include "../AutonomyConstants.h" #include "../AutonomyGlobals.h" #include "../AutonomyLogging.h" +#include "../AutonomyNetworking.h" /// \cond #include @@ -46,7 +47,7 @@ DriveBoard::DriveBoard() m_pPID->EnableContinuousInput(0, 360); // Set RoveComm callbacks. - globals::g_pRoveCommUDPNode->AddUDPCallback(SetMaxSpeedCallback, manifest::Autonomy::COMMANDS.find("SETMAXSPEED")->second.DATA_ID); + network::g_pRoveCommUDPNode->AddUDPCallback(SetMaxSpeedCallback, manifest::Autonomy::COMMANDS.find("SETMAXSPEED")->second.DATA_ID); } /****************************************************************************** @@ -130,7 +131,7 @@ void DriveBoard::SendDrive(diffdrive::DrivePowers& stDrivePowers) // Check if we should send packets to the SIM or board. const char* cIPAddress = constants::MODE_SIM ? "127.0.0.1" : manifest::Core::IP_ADDRESS.IP_STR.c_str(); // Send drive command over RoveComm to drive board. - globals::g_pRoveCommUDPNode->SendUDPPacket(stPacket, cIPAddress, constants::ROVECOMM_OUTGOING_UDP_PORT); + network::g_pRoveCommUDPNode->SendUDPPacket(stPacket, cIPAddress, constants::ROVECOMM_OUTGOING_UDP_PORT); // Submit logger message. LOG_DEBUG(logging::g_qSharedLogger, "Driving at: ({}, {})", fDriveBoardLeftPower, fDriveBoardRightPower); @@ -159,7 +160,7 @@ void DriveBoard::SendStop() // Check if we should send packets to the SIM or board. const char* cIPAddress = constants::MODE_SIM ? "127.0.0.1" : manifest::Core::IP_ADDRESS.IP_STR.c_str(); // Send drive command over RoveComm to drive board. - globals::g_pRoveCommUDPNode->SendUDPPacket(stPacket, cIPAddress, constants::ROVECOMM_OUTGOING_UDP_PORT); + network::g_pRoveCommUDPNode->SendUDPPacket(stPacket, cIPAddress, constants::ROVECOMM_OUTGOING_UDP_PORT); } /****************************************************************************** diff --git a/src/drivers/MultimediaBoard.cpp b/src/drivers/MultimediaBoard.cpp index e04f60f7..6c69ccf3 100755 --- a/src/drivers/MultimediaBoard.cpp +++ b/src/drivers/MultimediaBoard.cpp @@ -10,6 +10,7 @@ #include "MultimediaBoard.h" #include "../AutonomyGlobals.h" +#include "../AutonomyNetworking.h" /// \cond #include @@ -120,7 +121,7 @@ void MultimediaBoard::SendLightingState(MultimediaBoardLightingState eState) // Check if we should send packets to the SIM or board. const char* cIPAddress = constants::MODE_SIM ? "127.0.0.1" : manifest::Core::IP_ADDRESS.IP_STR.c_str(); // Send multimedia board lighting state to board over RoveComm. - globals::g_pRoveCommUDPNode->SendUDPPacket(stPacket, cIPAddress, constants::ROVECOMM_OUTGOING_UDP_PORT); + network::g_pRoveCommUDPNode->SendUDPPacket(stPacket, cIPAddress, constants::ROVECOMM_OUTGOING_UDP_PORT); } /****************************************************************************** @@ -149,7 +150,7 @@ void MultimediaBoard::SendRGB(RGB stRGBVal) // Check if we should send packets to the SIM or board. const char* cIPAddress = constants::MODE_SIM ? "127.0.0.1" : manifest::Core::IP_ADDRESS.IP_STR.c_str(); // Send RGB values to multimedia board over RoveComm. - globals::g_pRoveCommUDPNode->SendUDPPacket(stPacket, cIPAddress, constants::ROVECOMM_OUTGOING_UDP_PORT); + network::g_pRoveCommUDPNode->SendUDPPacket(stPacket, cIPAddress, constants::ROVECOMM_OUTGOING_UDP_PORT); } /****************************************************************************** diff --git a/src/drivers/NavigationBoard.cpp b/src/drivers/NavigationBoard.cpp index f88d9104..5a713b08 100755 --- a/src/drivers/NavigationBoard.cpp +++ b/src/drivers/NavigationBoard.cpp @@ -11,6 +11,7 @@ #include "NavigationBoard.h" #include "../AutonomyGlobals.h" #include "../AutonomyLogging.h" +#include "../AutonomyNetworking.h" /// \cond // Put implicit #includes here. @@ -32,12 +33,12 @@ NavigationBoard::NavigationBoard() stSubscribePacket.unDataCount = 0; stSubscribePacket.eDataType = manifest::DataTypes::UINT8_T; stSubscribePacket.vData = std::vector{}; - globals::g_pRoveCommUDPNode->SendUDPPacket(stSubscribePacket, manifest::Nav::IP_ADDRESS.IP_STR.c_str(), constants::ROVECOMM_OUTGOING_UDP_PORT); + network::g_pRoveCommUDPNode->SendUDPPacket(stSubscribePacket, manifest::Nav::IP_ADDRESS.IP_STR.c_str(), constants::ROVECOMM_OUTGOING_UDP_PORT); // Set RoveComm callbacks. - globals::g_pRoveCommUDPNode->AddUDPCallback(ProcessGPSData, manifest::Nav::TELEMETRY.find("GPSLATLONALT")->second.DATA_ID); - globals::g_pRoveCommUDPNode->AddUDPCallback(ProcessAccuracyData, manifest::Nav::TELEMETRY.find("ACCURACYDATA")->second.DATA_ID); - globals::g_pRoveCommUDPNode->AddUDPCallback(ProcessCompassData, manifest::Nav::TELEMETRY.find("COMPASSDATA")->second.DATA_ID); + network::g_pRoveCommUDPNode->AddUDPCallback(ProcessGPSData, manifest::Nav::TELEMETRY.find("GPSLATLONALT")->second.DATA_ID); + network::g_pRoveCommUDPNode->AddUDPCallback(ProcessAccuracyData, manifest::Nav::TELEMETRY.find("ACCURACYDATA")->second.DATA_ID); + network::g_pRoveCommUDPNode->AddUDPCallback(ProcessCompassData, manifest::Nav::TELEMETRY.find("COMPASSDATA")->second.DATA_ID); } /****************************************************************************** diff --git a/src/handlers/StateMachineHandler.cpp b/src/handlers/StateMachineHandler.cpp index 43111d1a..3f06a5c4 100644 --- a/src/handlers/StateMachineHandler.cpp +++ b/src/handlers/StateMachineHandler.cpp @@ -12,6 +12,7 @@ #include "../AutonomyConstants.h" #include "../AutonomyGlobals.h" #include "../AutonomyLogging.h" +#include "../AutonomyNetworking.h" /****************************************************************************** * @brief Construct a new State Machine Handler object. @@ -25,8 +26,8 @@ StateMachineHandler::StateMachineHandler() LOG_INFO(logging::g_qSharedLogger, "Initializing State Machine."); // Set RoveComm Node callbacks. - globals::g_pRoveCommUDPNode->AddUDPCallback(AutonomyStartCallback, manifest::Autonomy::COMMANDS.find("STARTAUTONOMY")->second.DATA_ID); - globals::g_pRoveCommUDPNode->AddUDPCallback(AutonomyStopCallback, manifest::Autonomy::COMMANDS.find("DISABLEAUTONOMY")->second.DATA_ID); + network::g_pRoveCommUDPNode->AddUDPCallback(AutonomyStartCallback, manifest::Autonomy::COMMANDS.find("STARTAUTONOMY")->second.DATA_ID); + network::g_pRoveCommUDPNode->AddUDPCallback(AutonomyStopCallback, manifest::Autonomy::COMMANDS.find("DISABLEAUTONOMY")->second.DATA_ID); // State machine doesn't need to run at an unlimited speed. Cap main thread to a certain amount of iterations per second. this->SetMainThreadIPSLimit(constants::STATEMACHINE_MAX_IPS); diff --git a/src/handlers/WaypointHandler.cpp b/src/handlers/WaypointHandler.cpp index 50608e1c..567f4e06 100644 --- a/src/handlers/WaypointHandler.cpp +++ b/src/handlers/WaypointHandler.cpp @@ -10,6 +10,7 @@ #include "WaypointHandler.h" #include "../AutonomyGlobals.h" +#include "../AutonomyNetworking.h" /// \cond #include @@ -26,10 +27,10 @@ WaypointHandler::WaypointHandler() { // Set RoveComm callbacks. - globals::g_pRoveCommUDPNode->AddUDPCallback(AddPositionLegCallback, manifest::Autonomy::COMMANDS.find("ADDPOSITIONLEG")->second.DATA_ID); - globals::g_pRoveCommUDPNode->AddUDPCallback(AddMarkerLegCallback, manifest::Autonomy::COMMANDS.find("ADDMARKERLEG")->second.DATA_ID); - globals::g_pRoveCommUDPNode->AddUDPCallback(AddObjectLegCallback, manifest::Autonomy::COMMANDS.find("ADDOBJECTLEG")->second.DATA_ID); - globals::g_pRoveCommUDPNode->AddUDPCallback(ClearWaypointsCallback, manifest::Autonomy::COMMANDS.find("CLEARWAYPOINTS")->second.DATA_ID); + network::g_pRoveCommUDPNode->AddUDPCallback(AddPositionLegCallback, manifest::Autonomy::COMMANDS.find("ADDPOSITIONLEG")->second.DATA_ID); + network::g_pRoveCommUDPNode->AddUDPCallback(AddMarkerLegCallback, manifest::Autonomy::COMMANDS.find("ADDMARKERLEG")->second.DATA_ID); + network::g_pRoveCommUDPNode->AddUDPCallback(AddObjectLegCallback, manifest::Autonomy::COMMANDS.find("ADDOBJECTLEG")->second.DATA_ID); + network::g_pRoveCommUDPNode->AddUDPCallback(ClearWaypointsCallback, manifest::Autonomy::COMMANDS.find("CLEARWAYPOINTS")->second.DATA_ID); } /****************************************************************************** diff --git a/src/main.cpp b/src/main.cpp index 99bbfa11..cdda3d22 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,6 +10,7 @@ #include "./AutonomyGlobals.h" #include "./AutonomyLogging.h" +#include "./AutonomyNetworking.h" // Check if any file from the example directory has been included. // If not included, define empty run example function and set bRunExampleFlag @@ -108,19 +109,19 @@ int main() // Setup global objects. ///////////////////////////////////////// // Initialize RoveComm. - globals::g_pRoveCommUDPNode = new rovecomm::RoveCommUDP(); - globals::g_pRoveCommTCPNode = new rovecomm::RoveCommTCP(); + network::g_pRoveCommUDPNode = new rovecomm::RoveCommUDP(); + network::g_pRoveCommTCPNode = new rovecomm::RoveCommTCP(); // Start RoveComm instances bound on ports. - bool bRoveCommUDPInitSuccess = globals::g_pRoveCommUDPNode->InitUDPSocket(manifest::General::ETHERNET_UDP_PORT); - bool bRoveCommTCPInitSuccess = globals::g_pRoveCommTCPNode->InitTCPSocket(constants::ROVECOMM_TCP_INTERFACE_IP.c_str(), manifest::General::ETHERNET_TCP_PORT); + network::g_bRoveCommUDPStatus = network::g_pRoveCommUDPNode->InitUDPSocket(manifest::General::ETHERNET_UDP_PORT); + network::g_bRoveCommTCPStatus = network::g_pRoveCommTCPNode->InitTCPSocket(constants::ROVECOMM_TCP_INTERFACE_IP.c_str(), manifest::General::ETHERNET_TCP_PORT); // Check if RoveComm was successfully initialized. - if (!bRoveCommUDPInitSuccess || !bRoveCommTCPInitSuccess) + if (!network::g_bRoveCommUDPStatus || !network::g_bRoveCommTCPStatus) { // Submit logger message. LOG_CRITICAL(logging::g_qSharedLogger, "RoveComm did not initialize properly! UDPNode Status: {}, TCPNode Status: {}", - bRoveCommUDPInitSuccess, - bRoveCommTCPInitSuccess); + network::g_bRoveCommUDPStatus, + network::g_bRoveCommTCPStatus); // Since RoveComm is crucial, stop code. bMainStop = true; @@ -178,7 +179,7 @@ int main() stPacket.eDataType = manifest::Autonomy::TELEMETRY.find("CURRENTSTATE")->second.DATA_TYPE; stPacket.vData.emplace_back(static_cast(globals::g_pStateMachineHandler->GetCurrentState())); // Send drive command over RoveComm to drive board to all subscribers. - globals::g_pRoveCommUDPNode->SendUDPPacket(stPacket, "0.0.0.0", constants::ROVECOMM_OUTGOING_UDP_PORT); + network::g_pRoveCommUDPNode->SendUDPPacket(stPacket, "0.0.0.0", constants::ROVECOMM_OUTGOING_UDP_PORT); // Create a string to append FPS values to. std::string szMainInfo = ""; @@ -192,8 +193,8 @@ int main() szMainInfo += "LeftDetector FPS: " + std::to_string(pLeftDetector->GetIPS().GetAverageIPS()) + "\n"; szMainInfo += "RightDetector FPS: " + std::to_string(pRightDetector->GetIPS().GetAverageIPS()) + "\n"; szMainInfo += "\nStateMachine FPS: " + std::to_string(globals::g_pStateMachineHandler->GetIPS().GetAverageIPS()) + "\n"; - szMainInfo += "\nRoveCommUDP FPS: " + std::to_string(globals::g_pRoveCommTCPNode->GetIPS().GetAverageIPS()) + "\n"; - szMainInfo += "RoveCommTCP FPS: " + std::to_string(globals::g_pRoveCommTCPNode->GetIPS().GetAverageIPS()) + "\n"; + szMainInfo += "\nRoveCommUDP FPS: " + std::to_string(network::g_pRoveCommTCPNode->GetIPS().GetAverageIPS()) + "\n"; + szMainInfo += "RoveCommTCP FPS: " + std::to_string(network::g_pRoveCommTCPNode->GetIPS().GetAverageIPS()) + "\n"; szMainInfo += "\n--------[ State Machine Info ]--------\n"; szMainInfo += "Current State: " + statemachine::StateToString(globals::g_pStateMachineHandler->GetCurrentState()) + "\n"; szMainInfo += "\n--------[ Camera Info ]--------\n"; @@ -216,24 +217,24 @@ int main() globals::g_pStateMachineHandler->StopStateMachine(); globals::g_pTagDetectionHandler->StopAllDetectors(); globals::g_pCameraHandler->StopAllCameras(); - globals::g_pRoveCommUDPNode->CloseUDPSocket(); - globals::g_pRoveCommTCPNode->CloseTCPSocket(); + network::g_pRoveCommUDPNode->CloseUDPSocket(); + network::g_pRoveCommTCPNode->CloseTCPSocket(); // Delete dynamically allocated objects. delete globals::g_pStateMachineHandler; delete globals::g_pTagDetectionHandler; delete globals::g_pCameraHandler; delete globals::g_pWaypointHandler; - delete globals::g_pRoveCommUDPNode; - delete globals::g_pRoveCommTCPNode; + delete network::g_pRoveCommUDPNode; + delete network::g_pRoveCommTCPNode; // Set dangling pointers to null. globals::g_pStateMachineHandler = nullptr; globals::g_pTagDetectionHandler = nullptr; globals::g_pCameraHandler = nullptr; globals::g_pWaypointHandler = nullptr; - globals::g_pRoveCommUDPNode = nullptr; - globals::g_pRoveCommTCPNode = nullptr; + network::g_pRoveCommUDPNode = nullptr; + network::g_pRoveCommTCPNode = nullptr; } // Submit logger message that program is done cleaning up and is now exiting.