Skip to content

Commit

Permalink
Setup Beacon Board
Browse files Browse the repository at this point in the history
  • Loading branch information
NoahSprenger committed Mar 12, 2024
1 parent c027d40 commit e302f4f
Show file tree
Hide file tree
Showing 17 changed files with 478 additions and 4 deletions.
144 changes: 142 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ features = ["defmt", "rt", "stm32h735" ]
git = "https://github.com/uorocketry/atsamd"
features = ["same51j", "same51j-rt", "dma", "can"]

[workspace.dependencies.stm32l0xx-hal]
git = "https://github.com/stm32-rs/stm32l0xx-hal"
features = ["mcu-STM32L051K8Tx", "rt"]


[workspace.dependencies.serde]
version = "1.0.150"
default-features = false
Expand Down
17 changes: 17 additions & 0 deletions boards/beacon/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
[package]
name = "beacon"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
cortex-m = { workspace = true }
cortex-m-rt = "^0.7.0"
cortex-m-rtic = "1.1.3"
common-arm-stm32l0 = {path = "../../libraries/common-arm-stm32l0"}
common-arm = {path = "../../libraries/common-arm"}
stm32l0xx-hal = { workspace = true }
postcard = "1.0.2"
messages = { path = "../../libraries/messages" }
systick-monotonic = "1.0.1"
1 change: 1 addition & 0 deletions boards/beacon/src/communication.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
//! Interface the SPI-based CAN device here.
122 changes: 122 additions & 0 deletions boards/beacon/src/data_manager.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
use messages::command::RadioRate;
use messages::state::StateData;
use messages::Message;

#[derive(Clone)]
pub struct DataManager {
pub air: Option<Message>,
pub ekf_nav_1: Option<Message>,
pub ekf_nav_2: Option<Message>,
pub ekf_quat: Option<Message>,
pub imu_1: Option<Message>,
pub imu_2: Option<Message>,
pub utc_time: Option<Message>,
pub gps_vel: Option<Message>,
pub gps_pos_1: Option<Message>,
pub gps_pos_2: Option<Message>,
pub state: Option<StateData>,
pub logging_rate: Option<RadioRate>,
}

impl DataManager {
pub fn new() -> Self {
Self {
air: None,
ekf_nav_1: None,
ekf_nav_2: None,
ekf_quat: None,
imu_1: None,
imu_2: None,
utc_time: None,
gps_vel: None,
gps_pos_1: None,
gps_pos_2: None,
state: None,
logging_rate: Some(RadioRate::Slow), // start slow.
}
}

pub fn get_logging_rate(&mut self) -> RadioRate {

Check warning on line 39 in boards/beacon/src/data_manager.rs

View workflow job for this annotation

GitHub Actions / clippy

methods `get_logging_rate`, `take_sensors`, `clone_states`, and `handle_data` are never used

warning: methods `get_logging_rate`, `take_sensors`, `clone_states`, and `handle_data` are never used --> boards/beacon/src/data_manager.rs:39:12 | 21 | impl DataManager { | ---------------- methods in this implementation ... 39 | pub fn get_logging_rate(&mut self) -> RadioRate { | ^^^^^^^^^^^^^^^^ ... 50 | pub fn take_sensors(&mut self) -> [Option<Message>; 10] { | ^^^^^^^^^^^^ ... 65 | pub fn clone_states(&self) -> [Option<StateData>; 1] { | ^^^^^^^^^^^^ ... 68 | pub fn handle_data(&mut self, data: Message) { | ^^^^^^^^^^^ | = note: `#[warn(dead_code)]` on by default
if let Some(rate) = self.logging_rate.take() {
let rate_cln = rate.clone();
self.logging_rate = Some(rate);
return rate_cln;
}
self.logging_rate = Some(RadioRate::Slow);
return RadioRate::Slow;

Check warning on line 46 in boards/beacon/src/data_manager.rs

View workflow job for this annotation

GitHub Actions / clippy

unneeded `return` statement

warning: unneeded `return` statement --> boards/beacon/src/data_manager.rs:46:9 | 46 | return RadioRate::Slow; | ^^^^^^^^^^^^^^^^^^^^^^ | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return = note: `#[warn(clippy::needless_return)]` on by default help: remove `return` | 46 - return RadioRate::Slow; 46 + RadioRate::Slow |
}

/// Do not clone instead take to reduce CPU load.
pub fn take_sensors(&mut self) -> [Option<Message>; 10] {
[
self.air.take(),
self.ekf_nav_1.take(),
self.ekf_nav_2.take(),
self.ekf_quat.take(),
self.imu_1.take(),
self.imu_2.take(),
self.utc_time.take(),
self.gps_vel.take(),
self.gps_pos_1.take(),
self.gps_pos_2.take(),
]
}

pub fn clone_states(&self) -> [Option<StateData>; 1] {
[self.state.clone()]
}
pub fn handle_data(&mut self, data: Message) {
match data.data {
messages::Data::Sensor(ref sensor) => match sensor.data {
messages::sensor::SensorData::Air(_) => {
self.air = Some(data);
}
messages::sensor::SensorData::EkfNav1(_) => {
self.ekf_nav_1 = Some(data);
}
messages::sensor::SensorData::EkfNav2(_) => {
self.ekf_nav_2 = Some(data);
}
messages::sensor::SensorData::EkfQuat(_) => {
self.ekf_quat = Some(data);
}
messages::sensor::SensorData::GpsVel(_) => {
self.gps_vel = Some(data);
}
messages::sensor::SensorData::Imu1(_) => {
self.imu_1 = Some(data);
}
messages::sensor::SensorData::Imu2(_) => {
self.imu_2 = Some(data);
}
messages::sensor::SensorData::UtcTime(_) => {
self.utc_time = Some(data);
}
messages::sensor::SensorData::GpsPos1(_) => {
self.gps_pos_1 = Some(data);
}
messages::sensor::SensorData::GpsPos2(_) => {
self.gps_pos_2 = Some(data);
}
},
messages::Data::State(state) => {
self.state = Some(state.data);
}
messages::Data::Command(command) => match command.data {
messages::command::CommandData::RadioRateChange(command_data) => {
self.logging_rate = Some(command_data.rate);
}
messages::command::CommandData::DeployDrogue(_) => {}
messages::command::CommandData::DeployMain(_) => {}
messages::command::CommandData::PowerDown(_) => {}
},
_ => {}
}
}
}

impl Default for DataManager {
fn default() -> Self {
Self::new()
}
}
Loading

0 comments on commit e302f4f

Please sign in to comment.