diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000..cbff6c3 --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,7 @@ +# Exclude all IntelliJ / JetBrains project settings everywhere +**/.idea/ +**/.idea/** + +# Also ignore IntelliJ module files anywhere +*.iml +*.iws \ No newline at end of file diff --git a/.gitignore b/src/RobotNode/.gitignore similarity index 98% rename from .gitignore rename to src/RobotNode/.gitignore index d4fb281..91b645d 100644 --- a/.gitignore +++ b/src/RobotNode/.gitignore @@ -38,4 +38,4 @@ *.app # debug information files -*.dwo +*.dwo \ No newline at end of file diff --git a/src/RobotNode/CMakeLists.txt b/src/RobotNode/CMakeLists.txt new file mode 100644 index 0000000..5f742d2 --- /dev/null +++ b/src/RobotNode/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 4.1) +project(Dixon) + +set(CMAKE_CXX_STANDARD 20) + +add_executable(Dixon main.cpp + DixonNodeState.cpp + DixonNodeState.h + DixonBrain.cpp + DixonBrain.h) diff --git a/src/RobotNode/DixonBrain.cpp b/src/RobotNode/DixonBrain.cpp new file mode 100644 index 0000000..8e9ca53 --- /dev/null +++ b/src/RobotNode/DixonBrain.cpp @@ -0,0 +1,50 @@ +#include "DixonBrain.h" +#include +#include +#include + +DixonBrain::DixonBrain() + : state_(DixonNodeState::instance()) +{ + std::cout << "DixonBrain initialised\n"; +} + +DixonBrain::~DixonBrain() +{ + stop(); + std::cout << "DixonBrain destroyed\n"; +} + +void DixonBrain::start() +{ + if (state_.isBrainRunning()) + return; + + state_.setBrainRunning(true); + + loopThread_ = std::thread(&DixonBrain::runLoop, this); + + std::cout << "DixonBrain started\n"; +} + +void DixonBrain::stop() +{ + if (!state_.isBrainRunning()) + return; + + state_.setBrainRunning(false); + + if (loopThread_.joinable()) + loopThread_.join(); + + std::cout << "DixonBrain stopped\n"; +} + +void DixonBrain::runLoop() +{ + while (state_.isBrainRunning()) + { + // TODO: main control logic + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + } +} \ No newline at end of file diff --git a/src/RobotNode/DixonBrain.h b/src/RobotNode/DixonBrain.h new file mode 100644 index 0000000..d4b4099 --- /dev/null +++ b/src/RobotNode/DixonBrain.h @@ -0,0 +1,19 @@ +#pragma once +#include "DixonNodeState.h" +#include + +class DixonBrain +{ +public: + DixonBrain(); + ~DixonBrain(); + + void start(); + void stop(); + +private: + void runLoop(); + + DixonNodeState& state_; + std::thread loopThread_; +}; \ No newline at end of file diff --git a/src/RobotNode/DixonNodeState.cpp b/src/RobotNode/DixonNodeState.cpp new file mode 100644 index 0000000..7fe544f --- /dev/null +++ b/src/RobotNode/DixonNodeState.cpp @@ -0,0 +1,31 @@ +#include "DixonNodeState.h" + +DixonNodeState& DixonNodeState::instance() +{ + static DixonNodeState instance; + return instance; +} + +void DixonNodeState::setConnected(bool value) +{ + std::lock_guard lock(mutex_); + connected_ = value; +} + +bool DixonNodeState::isConnected() const +{ + std::lock_guard lock(mutex_); + return connected_; +} + +void DixonNodeState::setBrainRunning(bool value) +{ + std::lock_guard lock(mutex_); + brainRunning_ = value; +} + +bool DixonNodeState::isBrainRunning() const +{ + std::lock_guard lock(mutex_); + return brainRunning_; +} \ No newline at end of file diff --git a/src/RobotNode/DixonNodeState.h b/src/RobotNode/DixonNodeState.h new file mode 100644 index 0000000..f062aee --- /dev/null +++ b/src/RobotNode/DixonNodeState.h @@ -0,0 +1,27 @@ +#pragma once +#include + +class DixonNodeState +{ +public: + static DixonNodeState& instance(); + + void setConnected(bool value); + bool isConnected() const; + + void setBrainRunning(bool value); + bool isBrainRunning() const; + + DixonNodeState(const DixonNodeState&) = delete; + DixonNodeState& operator=(const DixonNodeState&) = delete; + DixonNodeState(DixonNodeState&&) = delete; + DixonNodeState& operator=(DixonNodeState&&) = delete; + +private: + DixonNodeState() = default; + ~DixonNodeState() = default; + + mutable std::mutex mutex_; + bool connected_ = false; + bool brainRunning_ = false; +}; \ No newline at end of file diff --git a/src/RobotNode/main.cpp b/src/RobotNode/main.cpp new file mode 100644 index 0000000..109face --- /dev/null +++ b/src/RobotNode/main.cpp @@ -0,0 +1,23 @@ +#include +#include "DixonBrain.h" +#include "DixonNodeState.h" + +int main() +{ + std::cout << "Starting Dixon...\n"; + + // Create the brain controller + DixonBrain brain; + + // Start the brain's control loop + brain.start(); + + std::cout << "Dixon is running. Press Enter to stop...\n"; + std::cin.get(); + + // Stop the brain cleanly + brain.stop(); + + std::cout << "Dixon shut down.\n"; + return 0; +}