Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Setup Beacon Board #96

Merged
merged 1 commit into from
Mar 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading