diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..69ab804
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,10 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Ignored default folder with query files
+/queries/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/.idea/Dixon.iml b/.idea/Dixon.iml
new file mode 100644
index 0000000..bc2cd87
--- /dev/null
+++ b/.idea/Dixon.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/aws.xml b/.idea/aws.xml
new file mode 100644
index 0000000..b63b642
--- /dev/null
+++ b/.idea/aws.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/editor.xml b/.idea/editor.xml
new file mode 100644
index 0000000..fef3201
--- /dev/null
+++ b/.idea/editor.xml
@@ -0,0 +1,249 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..df87cf9
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..55d757f
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/RobotNode/CMakeLists.txt b/src/RobotNode/CMakeLists.txt
index 5f742d2..65145f2 100644
--- a/src/RobotNode/CMakeLists.txt
+++ b/src/RobotNode/CMakeLists.txt
@@ -1,10 +1,20 @@
+# Sets the minimum CMake version required to handle modern C++ features
cmake_minimum_required(VERSION 4.1)
+
+# Defines the project name (used for internal variable naming and IDE display
project(Dixon)
+# Forces the compiler to use C++20 features (required for modern libgpiod)
set(CMAKE_CXX_STANDARD 20)
+# Define the executable and its source files
add_executable(Dixon main.cpp
DixonNodeState.cpp
DixonNodeState.h
DixonBrain.cpp
- DixonBrain.h)
+ DixonBrain.h
+ CardioCenter/Heart.cpp
+ CardioCenter/Heart.h)
+
+# 2. Tell the linker what libraries to "glue" to that executable
+target_link_libraries(Dixon PRIVATE gpiodcxx gpiod)
\ No newline at end of file
diff --git a/src/RobotNode/CardioCenter/Heart.cpp b/src/RobotNode/CardioCenter/Heart.cpp
new file mode 100644
index 0000000..fb3e3a9
--- /dev/null
+++ b/src/RobotNode/CardioCenter/Heart.cpp
@@ -0,0 +1,22 @@
+#include "Heart.h"
+
+Heart::Heart(const char* chipName, unsigned int lineOffset)
+ : _chip(chipName),
+ _line(_chip.get_line(lineOffset)),
+ _isOn(false)
+{
+ // Request the GPIO line as an output, initial value LOW
+ _line.request(
+ { "heart", gpiod::line_request::DIRECTION_OUTPUT, 0 },
+ 0
+ );
+}
+
+void Heart::beat()
+{
+ // Toggle the state
+ _isOn = !_isOn;
+
+ // Write the new value to the GPIO line
+ _line.set_value(_isOn ? 1 : 0);
+}
\ No newline at end of file
diff --git a/src/RobotNode/CardioCenter/Heart.h b/src/RobotNode/CardioCenter/Heart.h
new file mode 100644
index 0000000..a76a30e
--- /dev/null
+++ b/src/RobotNode/CardioCenter/Heart.h
@@ -0,0 +1,16 @@
+#pragma once
+#include
+
+class Heart
+{
+public:
+ Heart(const char* chipName = "gpiochip0", unsigned int lineOffset = 17);
+
+ // DixonBrain calls this when a beat occurs
+ void beat();
+
+private:
+ gpiod::chip _chip;
+ gpiod::line _line;
+ bool _isOn;
+};
\ No newline at end of file