Renames RobotNode to Dixon and adds Rustylee core

Refactors the existing `RobotNode` module by renaming its directory and associated files to `Dixon`. This consolidates the core C++ robot node under a new name.

Introduces the initial `rustylee` module, establishing a foundational structure for the robot's brain. This new Rust component includes:
- A state machine (Starting, Running, Stopping, Stopped) to manage the brain's operational lifecycle.
- Graceful shutdown capabilities using a `ctrlc` signal handler.
- A main watchdog loop that orchestrates state transitions and responds to shutdown requests.
This commit is contained in:
Russell Gilbert 2026-02-26 11:00:48 +00:00
parent d452578afc
commit 2f0cb6e359
22 changed files with 198 additions and 4 deletions

1
src/Dixon/version.txt Normal file
View file

@ -0,0 +1 @@
1.0.70

View file

@ -1 +0,0 @@
1.0.67

101
src/rustylee/Cargo.lock generated
View file

@ -2,6 +2,107 @@
# It is not intended for manual editing.
version = 4
[[package]]
name = "bitflags"
version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af"
[[package]]
name = "block2"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5"
dependencies = [
"objc2",
]
[[package]]
name = "cfg-if"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "cfg_aliases"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
[[package]]
name = "ctrlc"
version = "3.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0b1fab2ae45819af2d0731d60f2afe17227ebb1a1538a236da84c93e9a60162"
dependencies = [
"dispatch2",
"nix",
"windows-sys",
]
[[package]]
name = "dispatch2"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec"
dependencies = [
"bitflags",
"block2",
"libc",
"objc2",
]
[[package]]
name = "libc"
version = "0.2.180"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc"
[[package]]
name = "nix"
version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "225e7cfe711e0ba79a68baeddb2982723e4235247aefce1482f2f16c27865b66"
dependencies = [
"bitflags",
"cfg-if",
"cfg_aliases",
"libc",
]
[[package]]
name = "objc2"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05"
dependencies = [
"objc2-encode",
]
[[package]]
name = "objc2-encode"
version = "4.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"
[[package]]
name = "rustylee"
version = "0.1.0"
dependencies = [
"ctrlc",
]
[[package]]
name = "windows-link"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
[[package]]
name = "windows-sys"
version = "0.61.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
dependencies = [
"windows-link",
]

View file

@ -4,3 +4,4 @@ version = "0.1.0"
edition = "2024"
[dependencies]
ctrlc = "3.5.2"

View file

@ -0,0 +1,45 @@
//src/brain/mod.rs
pub mod state;
pub use self::state::State;
use std::thread::{self, JoinHandle};
pub struct Brain {
pub state: State,
device_threads: Vec<JoinHandle<()>>,
}
impl Brain {
pub fn new() -> Self {
Self {
state: State::Starting,
device_threads: Vec::new(),
}
}
pub fn request_shutdown(&mut self) {
if self.state == State::Running {
self.state = State::Stopping;
}
}
pub fn update(&mut self) {
match self.state {
State::Starting => {
// For now, we just instantly transition
self.state = State::Running;
}
State::Running => {
// Logic will go here eventually
}
State::Stopping => {
println!("Brain: Waiting for all threads to join...");
while let Some(handle) = self.device_threads.pop() {
let _ = handle.join();
}
self.state = State::Stopped;
}
State::Stopped => {}
}
}
}

View file

@ -0,0 +1,8 @@
//src/brain/state.rs
#[derive(PartialEq, Debug, Clone, Copy)]
pub enum State {
Starting,
Running,
Stopping,
Stopped,
}

View file

@ -1,3 +1,42 @@
mod brain;
use brain::{Brain, State};
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use std::sync::mpsc::{self, Receiver, Sender};
use std::{thread, time::Duration};
fn main() {
println!("Hello, world!");
}
// We wrap the Brain in an Arc + Mutex so the Signal Handler can access it
// though for simple flag-setting, an Atomic works too.
// Here we'll use a simple shared flag to tell the Brain to stop.
let shutdown_requested = Arc::new(AtomicBool::new(false));
let s = shutdown_requested.clone();
// 1. Signal Handling
// By default, in Rust/Unix, signals are delivered to the process.
// Setting the handler here ensures the main thread catches it.
ctrlc::set_handler(move || {
println!("\n[Signal] Shutdown signal caught!");
s.store(true, Ordering::SeqCst);
}).expect("Error setting signal handler");
let mut robot_brain = Brain::new();
// 2. The Watchdog Loop
// This loop runs until the Brain reaches the terminal 'Stopped' state
while robot_brain.state != State::Stopped {
// If the signal handler tripped the flag, tell the brain to stop
if shutdown_requested.load(Ordering::SeqCst) && robot_brain.state == State::Running {
robot_brain.request_shutdown();
}
// Run one "tick" of brain logic
robot_brain.update();
println!("Main Loop: I'm alive! State: {:?}", robot_brain.state);
thread::sleep(Duration::from_millis(500));
}
println!("Main Loop: Brain has Stopped. Exiting cleanly.");
}

View file

@ -1,7 +1,7 @@
#!/bin/bash
# Configuration
LOCAL_BIN="$HOME/dev/Dixon/src/RobotNode/cmake-build-pi5-debug/dixon"
LOCAL_BIN="$HOME/dev/Dixon/src/Dixon/cmake-build-pi5-debug/dixon"
REMOTE_TARGET="russellg59@dixon1"
REMOTE_DIR="/home/russellg59/dixon"
REMOTE_EXE="$REMOTE_DIR/dixon"