Skip to content
Draft
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
4 changes: 4 additions & 0 deletions Cargo.lock

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

31 changes: 27 additions & 4 deletions app/cosmo/base.toml
Original file line number Diff line number Diff line change
Expand Up @@ -148,12 +148,12 @@ task-slots = ["sys", "packrat"]

[tasks.thermal]
name = "task-thermal"
features = ["cosmo"]
features = ["cosmo", "ereport"]
priority = 8
max-sizes = {flash = 32768, ram = 8192 }
max-sizes = {flash = 32768, ram = 16384 }
stacksize = 6000
start = true
task-slots = ["i2c_driver", "sensor", "cosmo_seq", "jefe"]
task-slots = ["i2c_driver", "sensor", "cosmo_seq", "jefe", "packrat"]
notifications = ["timer"]

[tasks.power]
Expand Down Expand Up @@ -1236,145 +1236,168 @@ name = "A_TS0"
device = "dimm"
description = "DIMM A, sensor 0"
sensors.temperature = 1
refdes = "J101"

[[config.sensor.devices]]
name = "A_TS1"
device = "dimm"
description = "DIMM A, sensor 1"
sensors.temperature = 1

refdes = "J101"

[[config.sensor.devices]]
name = "B_TS0"
device = "dimm"
description = "DIMM B, sensor 0"
sensors.temperature = 1
refdes = "J102"

[[config.sensor.devices]]
name = "B_TS1"
device = "dimm"
description = "DIMM B, sensor 1"
sensors.temperature = 1
refdes = "J102"

[[config.sensor.devices]]
name = "C_TS0"
device = "dimm"
description = "DIMM C, sensor 0"
sensors.temperature = 1
refdes = "J103"

[[config.sensor.devices]]
name = "C_TS1"
device = "dimm"
description = "DIMM C, sensor 1"
sensors.temperature = 1
refdes = "J103"

[[config.sensor.devices]]
name = "D_TS0"
device = "dimm"
description = "DIMM D, sensor 0"
sensors.temperature = 1
refdes = "J104"

[[config.sensor.devices]]
name = "D_TS1"
device = "dimm"
description = "DIMM D, sensor 1"
sensors.temperature = 1
refdes = "J104"

[[config.sensor.devices]]
name = "E_TS0"
device = "dimm"
description = "DIMM E, sensor 0"
sensors.temperature = 1
refdes = "J105"

[[config.sensor.devices]]
name = "E_TS1"
device = "dimm"
description = "DIMM E, sensor 1"
sensors.temperature = 1
refdes = "J105"

[[config.sensor.devices]]
name = "F_TS0"
device = "dimm"
description = "DIMM F, sensor 0"
sensors.temperature = 1
refdes = "J106"

[[config.sensor.devices]]
name = "F_TS1"
device = "dimm"
description = "DIMM F, sensor 1"
sensors.temperature = 1
refdes = "J106"

[[config.sensor.devices]]
name = "G_TS0"
device = "dimm"
description = "DIMM G, sensor 0"
sensors.temperature = 1
refdes = "J107"

[[config.sensor.devices]]
name = "G_TS1"
device = "dimm"
description = "DIMM G, sensor 1"
sensors.temperature = 1
refdes = "J107"

[[config.sensor.devices]]
name = "H_TS0"
device = "dimm"
description = "DIMM H, sensor 0"
sensors.temperature = 1
refdes = "J108"

[[config.sensor.devices]]
name = "H_TS1"
device = "dimm"
description = "DIMM H, sensor 1"
sensors.temperature = 1
refdes = "J108"

[[config.sensor.devices]]
name = "I_TS0"
device = "dimm"
description = "DIMM I, sensor 0"
sensors.temperature = 1
refdes = "J109"

[[config.sensor.devices]]
name = "I_TS1"
device = "dimm"
description = "DIMM I, sensor 1"
sensors.temperature = 1
refdes = "J109"

[[config.sensor.devices]]
name = "J_TS0"
device = "dimm"
description = "DIMM J, sensor 0"
sensors.temperature = 1
refdes = "J110"

[[config.sensor.devices]]
name = "J_TS1"
device = "dimm"
description = "DIMM J, sensor 1"
sensors.temperature = 1
refdes = "J110"

[[config.sensor.devices]]
name = "K_TS0"
device = "dimm"
description = "DIMM K, sensor 0"
sensors.temperature = 1
refdes = "J111"

[[config.sensor.devices]]
name = "K_TS1"
device = "dimm"
description = "DIMM K, sensor 1"
sensors.temperature = 1
refdes = "J111"

[[config.sensor.devices]]
name = "L_TS0"
device = "dimm"
description = "DIMM L, sensor 0"
sensors.temperature = 1
refdes = "J112"

[[config.sensor.devices]]
name = "L_TS1"
device = "dimm"
description = "DIMM L, sensor 1"
sensors.temperature = 1
refdes = "J112"

################################################################################
[config.spi.spi2]
Expand Down
50 changes: 41 additions & 9 deletions build/i2c/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@ use std::collections::{BTreeMap, HashMap, HashSet};
use std::fmt::Write;
use std::fs::File;

/// Outputs from code generation which may be used by other build scripts.
pub struct CodegenOutputs {
pub component_ids_by_sensor_id: Option<BTreeMap<usize, String>>,
pub num_i2c_sensors: Option<usize>,
}

//
// Our definition of the `Config` type. We share this type with all other
// build-specific types; we must not set `deny_unknown_fields` here.
Expand Down Expand Up @@ -224,7 +230,7 @@ struct I2cSensors {

#[derive(Clone, Debug, Deserialize, Hash, PartialOrd, PartialEq, Eq, Ord)]
#[serde(untagged)]
enum Refdes {
pub enum Refdes {
Component(String),
Path(Vec<String>),
}
Expand Down Expand Up @@ -295,6 +301,7 @@ struct I2cSensorsDescription {
by_device: MultiMap<DeviceKey, usize>,
by_name: MultiMap<DeviceNameKey, usize>,
by_refdes: MultiMap<DeviceRefdesKey, usize>,
component_id_by_id: Option<BTreeMap<usize, String>>,

// list of all devices and a list of their sensors, with an optional sensor
// name (if present)
Expand All @@ -304,11 +311,16 @@ struct I2cSensorsDescription {
}

impl I2cSensorsDescription {
fn new(devices: &[I2cDevice]) -> Self {
fn new(devices: &[I2cDevice], component_ids: bool) -> Self {
let mut desc = Self {
by_device: MultiMap::with_capacity(devices.len()),
by_name: MultiMap::new(),
by_refdes: MultiMap::new(),
component_id_by_id: if component_ids {
Some(BTreeMap::new())
} else {
None
},
device_sensors: vec![Vec::new(); devices.len()],
total_sensors: 0,
};
Expand Down Expand Up @@ -401,6 +413,18 @@ impl I2cSensorsDescription {
}

if let Some(refdes) = d.refdes.clone() {
// If we are also generating a LUT of device refdeses by sensor IDs,
// do that now...
if let Some(ref mut by_id) = self.component_id_by_id {
if let Some(prev) = by_id.insert(id, refdes.to_component_id()) {
panic!(
"weird: colliding refdes for sensor ID {id}: {prev:?} \
and {:?}",
d.refdes.as_ref()
);
};
}

self.by_refdes.insert(
DeviceRefdesKey {
device: d.device.clone(),
Expand Down Expand Up @@ -1571,10 +1595,10 @@ impl ConfigGenerator {
}

fn sensors_description(&self) -> I2cSensorsDescription {
I2cSensorsDescription::new(&self.devices)
I2cSensorsDescription::new(&self.devices, self.component_ids)
}

pub fn generate_sensors(&mut self) -> Result<()> {
fn generate_sensors(&mut self) -> Result<I2cSensorsDescription> {
let s = self.sensors_description();

write!(
Expand Down Expand Up @@ -1665,7 +1689,7 @@ impl ConfigGenerator {
}

writeln!(&mut self.output, "\n }}")?;
Ok(())
Ok(s)
}

pub fn generate_ports(&mut self) -> Result<()> {
Expand Down Expand Up @@ -1709,8 +1733,9 @@ impl From<Disposition> for CodegenSettings {
}
}

pub fn codegen(settings: impl Into<CodegenSettings>) -> Result<()> {
pub fn codegen(settings: impl Into<CodegenSettings>) -> Result<CodegenOutputs> {
let settings = settings.into();
assert_eq!(cfg!(feature = "component-id"), settings.component_ids);
use std::io::Write;

let out_dir = build_util::out_dir();
Expand All @@ -1721,6 +1746,11 @@ pub fn codegen(settings: impl Into<CodegenSettings>) -> Result<()> {

g.generate_header()?;

let mut outputs = CodegenOutputs {
component_ids_by_sensor_id: None,
num_i2c_sensors: None,
};

match settings.disposition {
Disposition::Target => {
let n = g.ncontrollers();
Expand Down Expand Up @@ -1755,7 +1785,9 @@ pub fn codegen(settings: impl Into<CodegenSettings>) -> Result<()> {

Disposition::Sensors => {
g.generate_devices()?;
g.generate_sensors()?;
let desc = g.generate_sensors()?;
outputs.component_ids_by_sensor_id = desc.component_id_by_id;
outputs.num_i2c_sensors = Some(desc.total_sensors);
}

Disposition::Validation => {
Expand All @@ -1768,7 +1800,7 @@ pub fn codegen(settings: impl Into<CodegenSettings>) -> Result<()> {

file.write_all(g.output.as_bytes())?;

Ok(())
Ok(outputs)
}

pub struct I2cDeviceDescription {
Expand Down Expand Up @@ -1838,7 +1870,7 @@ where
}

impl Refdes {
fn to_component_id(&self) -> String {
pub fn to_component_id(&self) -> String {
self.join_with_case(str::make_ascii_uppercase, "/")
}

Expand Down
3 changes: 3 additions & 0 deletions task/sensor-api/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ counters = { path = "../../lib/counters" }
drv-i2c-api.path = "../../drv/i2c-api"
derive-idol-err.path = "../../lib/derive-idol-err"
userlib.path = "../../sys/userlib"
fixedstr = { path = "../../lib/fixedstr", optional = true }

# This section is here to discourage RLS/rust-analyzer from doing test builds,
# since test builds don't work for cross compilation.
Expand All @@ -38,6 +39,8 @@ h753 = ["build-i2c/h753"]
# Include component ID strings in I2cDevice structs. This is necessary if
# `drv-i2c-api` is built with the `component-id` feature.
component-id = ["drv-i2c-api/component-id"]
# Also generate a table of component IDs by sensor ID.
component-id-lookup = ["component-id", "fixedstr"]

[lints]
workspace = true
Loading
Loading