Skip to content

Commit 80adf67

Browse files
committed
add enum for sensor version
1 parent 7f58566 commit 80adf67

File tree

8 files changed

+73
-35
lines changed

8 files changed

+73
-35
lines changed

include/pipettes/core/sensor_tasks.hpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "i2c/core/poller.hpp"
99
#include "i2c/core/writer.hpp"
1010
#include "motor-control/core/tasks/usage_storage_task.hpp"
11+
#include "sensors/core/mmr920.hpp"
1112
#include "sensors/core/sensor_hardware_interface.hpp"
1213
#include "sensors/core/tasks/capacitive_sensor_task.hpp"
1314
#include "sensors/core/tasks/environmental_sensor_task.hpp"
@@ -39,7 +40,8 @@ void start_tasks(CanWriterTask& can_writer, I2CClient& i2c3_task_client,
3940
I2CPollerClient& i2c1_poller_client,
4041
sensors::hardware::SensorHardwareBase& sensor_hardware_primary,
4142
can::ids::NodeId id,
42-
eeprom::hardware_iface::EEPromHardwareIface& eeprom_hardware);
43+
eeprom::hardware_iface::EEPromHardwareIface& eeprom_hardware,
44+
sensors::mmr920::SensorVersion sensor_version);
4345

4446
void start_tasks(
4547
CanWriterTask& can_writer, I2CClient& i2c3_task_client,
@@ -48,7 +50,8 @@ void start_tasks(
4850
sensors::hardware::SensorHardwareBase& sensor_hardware_primary,
4951
sensors::hardware::SensorHardwareBase& sensor_hardware_secondary,
5052
can::ids::NodeId id,
51-
eeprom::hardware_iface::EEPromHardwareIface& eeprom_hardware);
53+
eeprom::hardware_iface::EEPromHardwareIface& eeprom_hardware,
54+
sensors::mmr920::SensorVersion sensor_version);
5255

5356
/**
5457
* Access to all sensor/eeprom tasks. This will be a singleton.

include/sensors/core/mmr920.hpp

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,21 @@ constexpr uint16_t ADDRESS = 0x67 << 1;
3131

3232
// Pressure cannot be measured beyond +/-8226.4F on the old sensors
3333
// New sensors have double the threshold but half the fidelity
34-
#if PCBA_PRIMARY_REVISION == 'e'
35-
constexpr float MAX_PRESSURE_READING = 16452.8F;
36-
#else
37-
constexpr float MAX_PRESSURE_READING = 8226.4F;
38-
#endif
34+
35+
enum class SensorVersion : int {
36+
mmr920c04 = 0,
37+
mmr920c10 = 1,
38+
};
39+
40+
[[nodiscard]] inline static auto get_max_pressure_reading(SensorVersion version)
41+
-> float {
42+
if (version == SensorVersion::mmr920c10) {
43+
return 16452.8F;
44+
} else {
45+
return 8226.4F;
46+
}
47+
}
48+
3949
enum class SensorStatus : uint8_t {
4050
SHUTDOWN = 0x0,
4151
IDLE = 0xE5,
@@ -267,25 +277,27 @@ struct __attribute__((packed, __may_alias__)) StatusCommand {
267277
struct PressureResult {
268278
// Pascals per 1 cmH20
269279
static constexpr float CMH20_TO_PASCALS = 98.0665;
270-
// conversion factor of a given 3 byte measurement to Pascals
271-
static constexpr float PA_PER_COUNT =
272-
#if PCBA_PRIMARY_REVISION == 'e'
273-
2 * 1e-5 * CMH20_TO_PASCALS; // 1.0e-5cmH2O/count * 98.0665Pa/cmH2O
274-
#else
275-
1e-5 * CMH20_TO_PASCALS; // 1.0e-5cmH2O/count * 98.0665Pa/cmH2O
276-
#endif
277280
uint32_t reading : 32 = 0;
278281

279-
[[nodiscard]] static auto to_pressure(uint32_t reg) -> float {
282+
[[nodiscard]] static auto get_pa_per_count(SensorVersion version) -> float {
283+
// conversion factor of a given 3 byte measurement to Pascals
284+
if (version == SensorVersion::mmr920c10) {
285+
return 2 * 1e-5 * CMH20_TO_PASCALS; // 1.0e-5cmH2O/count * 98.0665Pa/cmH2O
286+
}
287+
return 1e-5 * CMH20_TO_PASCALS; // 1.0e-5cmH2O/count * 98.0665Pa/cmH2O
288+
}
289+
290+
[[nodiscard]] static auto to_pressure(uint32_t reg, SensorVersion version) -> float {
280291
// Pressure is converted to pascals
281292
// Sign extend pressure result
282293
if ((reg & 0x00800000) != 0) {
283294
reg |= 0xFF000000;
284295
} else {
285296
reg &= 0x007FFFFF;
286297
}
298+
287299
float pressure =
288-
static_cast<float>(static_cast<int32_t>(reg)) * PA_PER_COUNT;
300+
static_cast<float>(static_cast<int32_t>(reg)) * get_pa_per_count(version);
289301
return pressure;
290302
}
291303
};

include/sensors/core/tasks/pressure_driver.hpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,15 @@ class MMR920 {
3535
MMR920(I2CQueueWriter &writer, I2CQueuePoller &poller,
3636
CanClient &can_client, OwnQueue &own_queue,
3737
sensors::hardware::SensorHardwareBase &hardware,
38-
const can::ids::SensorId &id)
38+
const can::ids::SensorId &id,
39+
const sensors::mmr920::SensorVersion version)
3940
: writer(writer),
4041
poller(poller),
4142
can_client(can_client),
4243
own_queue(own_queue),
4344
hardware(hardware),
44-
sensor_id(id) {}
45+
sensor_id(id),
46+
sensor_version(version){}
4547

4648
/**
4749
* @brief Check if the MMR92 has been initialized.
@@ -287,12 +289,12 @@ class MMR920 {
287289

288290
save_pressure(shifted_data_store);
289291
auto pressure = mmr920::PressureResult::to_pressure(
290-
_registers.pressure_result.reading);
292+
_registers.pressure_result.reading, sensor_version);
291293

292294
if (max_pressure_sync) {
293295
bool this_tick_over_threshold =
294296
std::fabs(pressure - current_pressure_baseline_pa) >=
295-
mmr920::MAX_PRESSURE_READING;
297+
mmr920::get_max_pressure_reading(sensor_version);
296298
bool over_threshold = false;
297299
if (this_tick_over_threshold) {
298300
max_pressure_consecutive_readings =
@@ -374,7 +376,7 @@ class MMR920 {
374376

375377
uint32_t shifted_data_store = temporary_data_store >> 8;
376378

377-
auto pressure = mmr920::PressureResult::to_pressure(shifted_data_store);
379+
auto pressure = mmr920::PressureResult::to_pressure(shifted_data_store, sensor_version);
378380
pressure_running_total += pressure;
379381

380382
if (!m.id.is_completed_poll) {
@@ -451,6 +453,7 @@ class MMR920 {
451453
OwnQueue &own_queue;
452454
hardware::SensorHardwareBase &hardware;
453455
const can::ids::SensorId &sensor_id;
456+
const sensors::mmr920::SensorVersion sensor_version;
454457

455458
mmr920::MMR920RegisterMap _registers{};
456459
mmr920::FilterSetting filter_setting =

include/sensors/core/tasks/pressure_sensor_task.hpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "i2c/core/messages.hpp"
88
#include "i2c/core/poller.hpp"
99
#include "i2c/core/writer.hpp"
10+
#include "sensors/core/mmr920.hpp"
1011
#include "sensors/core/tasks/pressure_driver.hpp"
1112
#include "sensors/core/utils.hpp"
1213

@@ -21,8 +22,9 @@ class PressureMessageHandler {
2122
I2CQueueWriter &i2c_writer, I2CQueuePoller &i2c_poller,
2223
CanClient &can_client, OwnQueue &own_queue,
2324
sensors::hardware::SensorHardwareBase &hardware,
24-
const can::ids::SensorId &id)
25-
: driver{i2c_writer, i2c_poller, can_client, own_queue, hardware, id} {}
25+
const can::ids::SensorId &id,
26+
const sensors::mmr920::SensorVersion& version)
27+
: driver{i2c_writer, i2c_poller, can_client, own_queue, hardware, id, version} {}
2628
PressureMessageHandler(const PressureMessageHandler &) = delete;
2729
PressureMessageHandler(const PressureMessageHandler &&) = delete;
2830
auto operator=(const PressureMessageHandler &)
@@ -192,9 +194,10 @@ class PressureSensorTask {
192194
[[noreturn]] void operator()(
193195
i2c::writer::Writer<QueueImpl> *writer,
194196
i2c::poller::Poller<QueueImpl> *poller, CanClient *can_client,
195-
sensors::hardware::SensorHardwareBase *hardware) {
197+
sensors::hardware::SensorHardwareBase *hardware,
198+
sensors::mmr920::SensorVersion *sensor_version) {
196199
auto handler = PressureMessageHandler{
197-
*writer, *poller, *can_client, get_queue(), *hardware, sensor_id};
200+
*writer, *poller, *can_client, get_queue(), *hardware, sensor_id, *sensor_version};
198201
handler.initialize();
199202
utils::TaskMessage message{};
200203
for (;;) {

pipettes/core/sensor_tasks.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ void sensor_tasks::start_tasks(
4646
sensor_tasks::I2CPollerClient& i2c2_poller_client,
4747
sensors::hardware::SensorHardwareBase& sensor_hardware_primary,
4848
can::ids::NodeId id,
49-
eeprom::hardware_iface::EEPromHardwareIface& eeprom_hardware) {
49+
eeprom::hardware_iface::EEPromHardwareIface& eeprom_hardware,
50+
sensors::mmr920::SensorVersion sensor_version) {
5051
// Low throughput sensor task (single channel)
5152
queue_client.set_node_id(id);
5253
auto& queues = sensor_tasks::get_queues();
@@ -69,7 +70,7 @@ void sensor_tasks::start_tasks(
6970
5, "enviro sensor", i2c3_task_client, i2c3_poller_client, queues);
7071
auto& pressure_sensor_task_rear = pressure_sensor_task_builder_rear.start(
7172
5, "pressure sensor s0", pressure_i2c_client, pressure_i2c_poller,
72-
queues, sensor_hardware_primary);
73+
queues, sensor_hardware_primary, sensor_version);
7374
auto& capacitive_sensor_task_rear =
7475
capacitive_sensor_task_builder_rear.start(
7576
5, "capacitive sensor s0", i2c3_task_client, i2c3_poller_client,
@@ -102,7 +103,8 @@ void sensor_tasks::start_tasks(
102103
sensors::hardware::SensorHardwareBase& sensor_hardware_primary,
103104
sensors::hardware::SensorHardwareBase& sensor_hardware_secondary,
104105
can::ids::NodeId id,
105-
eeprom::hardware_iface::EEPromHardwareIface& eeprom_hardware) {
106+
eeprom::hardware_iface::EEPromHardwareIface& eeprom_hardware,
107+
sensors::mmr920::SensorVersion sensor_version) {
106108
// High throughput sensor task (eight and ninety six channel)
107109
queue_client.set_node_id(id);
108110
auto& queues = sensor_tasks::get_queues();
@@ -133,10 +135,12 @@ void sensor_tasks::start_tasks(
133135
5, "enviro sensor", i2c3_task_client, i2c3_poller_client, queues);
134136
auto& pressure_sensor_task_rear = pressure_sensor_task_builder_rear.start(
135137
5, "pressure sensor s0", primary_pressure_i2c_client,
136-
primary_pressure_i2c_poller, queues, sensor_hardware_primary);
138+
primary_pressure_i2c_poller, queues, sensor_hardware_primary,
139+
sensor_version);
137140
auto& pressure_sensor_task_front = pressure_sensor_task_builder_front.start(
138141
5, "pressure sensor s1", secondary_pressure_i2c_client,
139-
secondary_pressure_i2c_poller, queues, sensor_hardware_secondary);
142+
secondary_pressure_i2c_poller, queues, sensor_hardware_secondary,
143+
sensor_version);
140144
auto& capacitive_sensor_task_rear =
141145
capacitive_sensor_task_builder_rear.start(
142146
5, "capacitive sensor s0", i2c3_task_client, i2c3_poller_client,

pipettes/firmware/main.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "pipettes/core/sensor_tasks.hpp"
3131
#include "pipettes/firmware/interfaces_g4.hpp"
3232
#include "pipettes/firmware/utility_configurations.hpp"
33+
#include "sensors/core/mmr920.hpp"
3334
#include "sensors/firmware/sensor_hardware.hpp"
3435
#include "spi/firmware/spi_comms.hpp"
3536

@@ -147,6 +148,14 @@ extern "C" void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
147148
}
148149
}
149150

151+
#if PCBA_PRIMARY_REVISION == 'e'
152+
static constexpr auto pressure_sensor_version =
153+
sensors::mmr920::SensorVersion::mmr920c10;
154+
#else
155+
static constexpr auto pressure_sensor_version =
156+
sensors::mmr920::SensorVersion::mmr920c04;
157+
#endif
158+
150159
// Unfortunately, these numbers need to be literals or defines
151160
// to get the compile-time checks to work so we can't actually
152161
// correctly rely on the hal to get these numbers - they need
@@ -183,7 +192,7 @@ auto initialize_motor_tasks(
183192
peripheral_tasks::get_i2c1_poller_client(),
184193
sensor_hardware_container.primary,
185194
sensor_hardware_container.secondary.value(), id,
186-
eeprom_hardware_iface);
195+
eeprom_hardware_iface, pressure_sensor_version);
187196

188197
initialize_linear_timer(plunger_callback);
189198
initialize_gear_timer(gear_callback_wrapper);
@@ -210,15 +219,17 @@ auto initialize_motor_tasks(
210219
peripheral_tasks::get_i2c1_poller_client(),
211220
sensor_hardware_container.primary,
212221
sensor_hardware_container.secondary.value(),
213-
id, eeprom_hardware_iface);
222+
id, eeprom_hardware_iface,
223+
pressure_sensor_version);
214224
} else {
215225
sensor_tasks::start_tasks(*central_tasks::get_tasks().can_writer,
216226
peripheral_tasks::get_i2c3_client(),
217227
peripheral_tasks::get_i2c3_poller_client(),
218228
peripheral_tasks::get_i2c1_client(),
219229
peripheral_tasks::get_i2c1_poller_client(),
220230
sensor_hardware_container.primary, id,
221-
eeprom_hardware_iface);
231+
eeprom_hardware_iface,
232+
pressure_sensor_version);
222233
}
223234

224235
initialize_linear_timer(plunger_callback);

sensors/tests/test_pressure_driver.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "i2c/tests/mock_response_queue.hpp"
1010
#include "motor-control/core/utils.hpp"
1111
#include "sensors/core/tasks/pressure_driver.hpp"
12+
#include "sensors/core/mmr920.hpp"
1213
#include "sensors/core/tasks/pressure_sensor_task.hpp"
1314
#include "sensors/core/utils.hpp"
1415
#include "sensors/tests/mock_hardware.hpp"
@@ -58,7 +59,7 @@ SCENARIO("Testing the pressure sensor driver") {
5859
writer.set_queue(&i2c_queue);
5960
poller.set_queue(&i2c_poll_queue);
6061
sensors::tasks::MMR920 driver(writer, poller, queue_client, pressure_queue,
61-
hardware, sensor_id);
62+
hardware, sensor_id, sensors::mmr920::SensorVersion::mmr920c04);
6263

6364
can::message_writer_task::TaskMessage empty_can_msg{};
6465

sensors/tests/test_pressure_sensor.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ SCENARIO("Receiving messages through the pressure sensor message handler") {
5656
poller.set_queue(&i2c_poll_queue);
5757

5858
auto sensor = sensors::tasks::PressureMessageHandler{
59-
writer, poller, queue_client, response_queue, mock_hw, sensor_id};
59+
writer, poller, queue_client, response_queue, mock_hw, sensor_id,
60+
sensors::mmr920::SensorVersion::mmr920c04};
6061

6162
GIVEN("A TransactionResponse message") {
6263
can_queue.reset();

0 commit comments

Comments
 (0)