From d55486ff83333ae305b1a4458699071b008e2f07 Mon Sep 17 00:00:00 2001 From: caila-marashaj Date: Wed, 9 Aug 2023 17:00:51 -0400 Subject: [PATCH 01/12] modify tip presence sensor task --- gripper/core/tasks.cpp | 4 +- include/can/core/messages.hpp | 21 +++++++++- include/gripper/core/tasks.hpp | 4 +- include/pipettes/core/sensor_tasks.hpp | 18 ++++++-- .../sensors/core/message_handlers/sensors.hpp | 10 ++++- .../tasks/tip_presence_notification_task.hpp | 24 ++++++++--- pipettes/core/sensor_tasks.cpp | 41 +++++++++++++------ pipettes/firmware/main.cpp | 4 +- pipettes/firmware/utility_configurations.cpp | 4 +- 9 files changed, 100 insertions(+), 30 deletions(-) diff --git a/gripper/core/tasks.cpp b/gripper/core/tasks.cpp index 42bd5d5ad..cd16770c6 100644 --- a/gripper/core/tasks.cpp +++ b/gripper/core/tasks.cpp @@ -160,7 +160,9 @@ void gripper_tasks::QueueClient::send_pressure_sensor_queue_front( void gripper_tasks::QueueClient::send_pressure_sensor_queue_rear( const sensors::utils::TaskMessage&) {} -void gripper_tasks::QueueClient::send_tip_notification_queue( +void gripper_tasks::QueueClient::send_tip_notification_queue_rear( + const sensors::tip_presence::TaskMessage&) {} +void gripper_tasks::QueueClient::send_tip_notification_queue_front( const sensors::tip_presence::TaskMessage&) {} /** diff --git a/include/can/core/messages.hpp b/include/can/core/messages.hpp index d73bc66e7..9396c2c0a 100644 --- a/include/can/core/messages.hpp +++ b/include/can/core/messages.hpp @@ -1233,17 +1233,36 @@ struct BindSensorOutputResponse -> bool = default; }; -using TipStatusQueryRequest = Empty; +struct TipStatusQueryRequest : BaseMessage { + uint32_t message_index; + can::ids::SensorId sensor_id; + + template + static auto parse(Input body, Limit limit) -> TipStatusQueryRequest { + uint32_t msg_ind = 0; + uint8_t _id = 0; + + body = bit_utils::bytes_to_int(body, limit, msg_ind); + body = bit_utils::bytes_to_int(body, limit, _id); + return TipStatusQueryRequest{ + .message_index = msg_ind, + .sensor_id = static_cast(_id)}; + } + auto operator==(const TipStatusQueryRequest& other) const -> bool = default; +}; struct PushTipPresenceNotification : BaseMessage { uint32_t message_index; uint8_t ejector_flag_status; + can::ids::SensorId sensor_id{}; template auto serialize(Output body, Limit limit) const -> uint8_t { auto iter = bit_utils::int_to_bytes(message_index, body, limit); iter = bit_utils::int_to_bytes(ejector_flag_status, iter, limit); + iter = bit_utils::int_to_bytes(static_cast(sensor_id), iter, + limit); return iter - body; } diff --git a/include/gripper/core/tasks.hpp b/include/gripper/core/tasks.hpp index 637994c65..74d58a7ea 100644 --- a/include/gripper/core/tasks.hpp +++ b/include/gripper/core/tasks.hpp @@ -72,7 +72,9 @@ struct QueueClient : can::message_writer::MessageWriter { void send_pressure_sensor_queue_front(const sensors::utils::TaskMessage& m); void send_pressure_sensor_queue_rear(const sensors::utils::TaskMessage& m); - void send_tip_notification_queue( + void send_tip_notification_queue_rear( + const sensors::tip_presence::TaskMessage& m); + void send_tip_notification_queue_front( const sensors::tip_presence::TaskMessage& m); freertos_message_queue::FreeRTOSMessageQueue< diff --git a/include/pipettes/core/sensor_tasks.hpp b/include/pipettes/core/sensor_tasks.hpp index ff8660c66..f3c51e821 100644 --- a/include/pipettes/core/sensor_tasks.hpp +++ b/include/pipettes/core/sensor_tasks.hpp @@ -72,8 +72,11 @@ struct Tasks { freertos_message_queue::FreeRTOSMessageQueue>* pressure_sensor_task_front{nullptr}; sensors::tasks::TipPresenceNotificationTask< - freertos_message_queue::FreeRTOSMessageQueue>* tip_notification_task{ - nullptr}; + freertos_message_queue::FreeRTOSMessageQueue>* + tip_notification_task_rear{nullptr}; + sensors::tasks::TipPresenceNotificationTask< + freertos_message_queue::FreeRTOSMessageQueue>* + tip_notification_task_front{nullptr}; }; /** @@ -96,7 +99,10 @@ struct QueueClient : can::message_writer::MessageWriter { void send_pressure_sensor_queue_front(const sensors::utils::TaskMessage& m); - void send_tip_notification_queue( + void send_tip_notification_queue_rear( + const sensors::tip_presence::TaskMessage& m); + + void send_tip_notification_queue_front( const sensors::tip_presence::TaskMessage& m); freertos_message_queue::FreeRTOSMessageQueue* @@ -112,7 +118,11 @@ struct QueueClient : can::message_writer::MessageWriter { freertos_message_queue::FreeRTOSMessageQueue* pressure_sensor_queue_front{nullptr}; freertos_message_queue::FreeRTOSMessageQueue< - sensors::tip_presence::TaskMessage>* tip_notification_queue{nullptr}; + sensors::tip_presence::TaskMessage>* tip_notification_queue_rear{ + nullptr}; + freertos_message_queue::FreeRTOSMessageQueue< + sensors::tip_presence::TaskMessage>* tip_notification_queue_front{ + nullptr}; }; /** diff --git a/include/sensors/core/message_handlers/sensors.hpp b/include/sensors/core/message_handlers/sensors.hpp index b41632604..d06a88178 100644 --- a/include/sensors/core/message_handlers/sensors.hpp +++ b/include/sensors/core/message_handlers/sensors.hpp @@ -57,7 +57,15 @@ class SensorHandler { } void visit(const can::messages::TipStatusQueryRequest &m) { - client.send_tip_notification_queue(m); + switch (m.sensor_id) { + case can::ids::SensorId::S0: { + client.send_tip_notification_queue_rear(m); + break; + } + default: + client.send_tip_notification_queue_front(m); + break; + } } void send_to_queue(can::ids::SensorType type, can::ids::SensorId id, diff --git a/include/sensors/core/tasks/tip_presence_notification_task.hpp b/include/sensors/core/tasks/tip_presence_notification_task.hpp index 9e049bfab..0bde82df0 100644 --- a/include/sensors/core/tasks/tip_presence_notification_task.hpp +++ b/include/sensors/core/tasks/tip_presence_notification_task.hpp @@ -5,8 +5,9 @@ template class TipPresenceNotificationHandler { public: explicit TipPresenceNotificationHandler( - CanClient &can_client, sensors::hardware::SensorHardwareBase &hardware) - : can_client{can_client}, hardware{hardware} {} + CanClient &can_client, sensors::hardware::SensorHardwareBase &hardware, + const can::ids::SensorId &id) + : can_client{can_client}, hardware{hardware}, sensor_id{id} {} TipPresenceNotificationHandler(const TipPresenceNotificationHandler &) = delete; TipPresenceNotificationHandler(const TipPresenceNotificationHandler &&) = @@ -29,7 +30,13 @@ class TipPresenceNotificationHandler { can::messages::PushTipPresenceNotification{ .message_index = 0, .ejector_flag_status = - static_cast(hardware.check_tip_presence())}); + static_cast(hardware.check_tip_presence()), + .sensor_id = sensor_id, + }); + can_client.send_can_message(can::ids::NodeId::host, + can::messages::PushTipPresenceNotification{ + .message_index = 0, + }); } void visit(const can::messages::TipStatusQueryRequest &m) { @@ -38,12 +45,14 @@ class TipPresenceNotificationHandler { can::messages::PushTipPresenceNotification{ .message_index = m.message_index, .ejector_flag_status = - static_cast(hardware.check_tip_presence())}); + static_cast(hardware.check_tip_presence()), + .sensor_id = this->sensor_id}); } private: CanClient &can_client; sensors::hardware::SensorHardwareBase &hardware; + can::ids::SensorId sensor_id; }; /** @@ -56,7 +65,8 @@ class TipPresenceNotificationTask { public: using Messages = tip_presence::TaskMessage; using QueueType = QueueImpl; - TipPresenceNotificationTask(QueueType &queue) : queue{queue} {} + TipPresenceNotificationTask(QueueType &queue, can::ids::SensorId id) + : queue{queue}, sensor_id{id} {} TipPresenceNotificationTask(const TipPresenceNotificationTask &c) = delete; TipPresenceNotificationTask(const TipPresenceNotificationTask &&c) = delete; auto operator=(const TipPresenceNotificationTask &c) = delete; @@ -70,7 +80,8 @@ class TipPresenceNotificationTask { [[noreturn]] void operator()( CanClient *can_client, sensors::hardware::SensorHardwareBase *hardware) { - auto handler = TipPresenceNotificationHandler{*can_client, *hardware}; + auto handler = + TipPresenceNotificationHandler{*can_client, *hardware, sensor_id}; Messages message{}; for (;;) { if (queue.try_read(&message, queue.max_delay)) { @@ -83,6 +94,7 @@ class TipPresenceNotificationTask { private: QueueType &queue; + can::ids::SensorId sensor_id; }; } // namespace tasks diff --git a/pipettes/core/sensor_tasks.cpp b/pipettes/core/sensor_tasks.cpp index 484117a0e..e39aa480a 100644 --- a/pipettes/core/sensor_tasks.cpp +++ b/pipettes/core/sensor_tasks.cpp @@ -30,9 +30,13 @@ static auto pressure_sensor_task_builder_front = freertos_task::TaskStarter<512, sensors::tasks::PressureSensorTask, can::ids::SensorId>(can::ids::SensorId::S1); +static auto tip_notification_task_builder_rear = + freertos_task::TaskStarter<256, sensors::tasks::TipPresenceNotificationTask, + can::ids::SensorId>(can::ids::SensorId::S0); + static auto tip_notification_task_builder_front = - freertos_task::TaskStarter<256, - sensors::tasks::TipPresenceNotificationTask>{}; + freertos_task::TaskStarter<256, sensors::tasks::TipPresenceNotificationTask, + can::ids::SensorId>(can::ids::SensorId::S1); void sensor_tasks::start_tasks( sensor_tasks::CanWriterTask& can_writer, @@ -70,14 +74,14 @@ void sensor_tasks::start_tasks( capacitive_sensor_task_builder_rear.start( 5, "capacitive sensor s0", i2c3_task_client, i2c3_poller_client, sensor_hardware_primary, queues); - auto& tip_notification_task = tip_notification_task_builder_front.start( - 5, "tip notification", queues, sensor_hardware_primary); + auto& tip_notification_task_rear = tip_notification_task_builder_rear.start( + 5, "tip notification sensor s0", queues, sensor_hardware_primary); tasks.eeprom_task = &eeprom_task; tasks.environment_sensor_task = &environment_sensor_task; tasks.capacitive_sensor_task_rear = &capacitive_sensor_task_rear; tasks.pressure_sensor_task_rear = &pressure_sensor_task_rear; - tasks.tip_notification_task = &tip_notification_task; + tasks.tip_notification_task_rear = &tip_notification_task_rear; queues.set_queue(&can_writer.get_queue()); queues.eeprom_queue = &eeprom_task.get_queue(); @@ -85,7 +89,8 @@ void sensor_tasks::start_tasks( queues.capacitive_sensor_queue_rear = &capacitive_sensor_task_rear.get_queue(); queues.pressure_sensor_queue_rear = &pressure_sensor_task_rear.get_queue(); - queues.tip_notification_queue = &tip_notification_task.get_queue(); + queues.tip_notification_queue_rear = + &tip_notification_task_rear.get_queue(); } void sensor_tasks::start_tasks( @@ -134,14 +139,18 @@ void sensor_tasks::start_tasks( capacitive_sensor_task_builder_rear.start( 5, "capacitive sensor s0", i2c3_task_client, i2c3_poller_client, sensor_hardware_primary, queues, shared_cap_task); - auto& tip_notification_task = tip_notification_task_builder_front.start( - 5, "tip notification", queues, sensor_hardware_primary); + auto& tip_notification_task_rear = tip_notification_task_builder_rear.start( + 5, "tip notification sensor s0", queues, sensor_hardware_primary); + auto& tip_notification_task_front = + tip_notification_task_builder_front.start( + 5, "tip notification sensor s1", queues, sensor_hardware_secondary); tasks.eeprom_task = &eeprom_task; tasks.environment_sensor_task = &environment_sensor_task; tasks.pressure_sensor_task_rear = &pressure_sensor_task_rear; tasks.pressure_sensor_task_front = &pressure_sensor_task_front; - tasks.tip_notification_task = &tip_notification_task; + tasks.tip_notification_task_rear = &tip_notification_task_rear; + tasks.tip_notification_task_front = &tip_notification_task_front; tasks.capacitive_sensor_task_rear = &capacitive_sensor_task_rear; queues.set_queue(&can_writer.get_queue()); @@ -152,7 +161,10 @@ void sensor_tasks::start_tasks( queues.pressure_sensor_queue_rear = &pressure_sensor_task_rear.get_queue(); queues.pressure_sensor_queue_front = &pressure_sensor_task_front.get_queue(); - queues.tip_notification_queue = &tip_notification_task.get_queue(); + queues.tip_notification_queue_rear = + &tip_notification_task_rear.get_queue(); + queues.tip_notification_queue_front = + &tip_notification_task_front.get_queue(); if (shared_cap_task) { // There is only one cap sensor on the eight channel and so the "front" @@ -216,9 +228,14 @@ void sensor_tasks::QueueClient::send_pressure_sensor_queue_front( } } -void sensor_tasks::QueueClient::send_tip_notification_queue( +void sensor_tasks::QueueClient::send_tip_notification_queue_rear( + const sensors::tip_presence::TaskMessage& m) { + tip_notification_queue_rear->try_write(m); +} + +void sensor_tasks::QueueClient::send_tip_notification_queue_front( const sensors::tip_presence::TaskMessage& m) { - tip_notification_queue->try_write(m); + tip_notification_queue_front->try_write(m); } auto sensor_tasks::get_tasks() -> Tasks& { return tasks; } diff --git a/pipettes/firmware/main.cpp b/pipettes/firmware/main.cpp index 67e0303f5..e115c8dcc 100644 --- a/pipettes/firmware/main.cpp +++ b/pipettes/firmware/main.cpp @@ -143,13 +143,13 @@ static auto tail_accessor = extern "C" void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == tip_sense_gpio_primary.pin) { static_cast( - sensor_queue_client.tip_notification_queue->try_write_isr( + sensor_queue_client.tip_notification_queue_rear->try_write_isr( sensors::tip_presence::TipStatusChangeDetected{})); } else if (ok_for_secondary && GPIO_Pin == pins_for_sensor.secondary.value().tip_sense.value().pin) { static_cast( - sensor_queue_client.tip_notification_queue->try_write_isr( + sensor_queue_client.tip_notification_queue_front->try_write_isr( sensors::tip_presence::TipStatusChangeDetected{})); } } diff --git a/pipettes/firmware/utility_configurations.cpp b/pipettes/firmware/utility_configurations.cpp index 2bf5c7aba..1cbb11d67 100644 --- a/pipettes/firmware/utility_configurations.cpp +++ b/pipettes/firmware/utility_configurations.cpp @@ -121,7 +121,7 @@ auto utility_configs::sensor_configurations() gpio::PinConfig{ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-cstyle-cast) .port = GPIOC, - .pin = GPIO_PIN_12, + .pin = GPIO_PIN_7, .active_setting = GPIO_PIN_RESET}}, .secondary = sensors::hardware::SensorHardwareConfiguration{ .sync_out = @@ -138,7 +138,7 @@ auto utility_configs::sensor_configurations() .tip_sense = gpio::PinConfig{ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-cstyle-cast) .port = GPIOC, - .pin = GPIO_PIN_7, + .pin = GPIO_PIN_12, .active_setting = GPIO_PIN_RESET}}}; return pins; } From 249e9629ca8c2b9d987628413d70c8de7f55a61e Mon Sep 17 00:00:00 2001 From: caila-marashaj Date: Thu, 10 Aug 2023 12:34:35 -0400 Subject: [PATCH 02/12] dont send extra tip presence notif --- include/sensors/core/message_handlers/sensors.hpp | 5 ++++- .../sensors/core/tasks/tip_presence_notification_task.hpp | 4 ---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/include/sensors/core/message_handlers/sensors.hpp b/include/sensors/core/message_handlers/sensors.hpp index d06a88178..80add979a 100644 --- a/include/sensors/core/message_handlers/sensors.hpp +++ b/include/sensors/core/message_handlers/sensors.hpp @@ -62,8 +62,11 @@ class SensorHandler { client.send_tip_notification_queue_rear(m); break; } + case can::ids::SensorId::S1: { + client.send_tip_notificaiton_queue_front(m); + break; + } default: - client.send_tip_notification_queue_front(m); break; } } diff --git a/include/sensors/core/tasks/tip_presence_notification_task.hpp b/include/sensors/core/tasks/tip_presence_notification_task.hpp index 0bde82df0..d97a7b771 100644 --- a/include/sensors/core/tasks/tip_presence_notification_task.hpp +++ b/include/sensors/core/tasks/tip_presence_notification_task.hpp @@ -33,10 +33,6 @@ class TipPresenceNotificationHandler { static_cast(hardware.check_tip_presence()), .sensor_id = sensor_id, }); - can_client.send_can_message(can::ids::NodeId::host, - can::messages::PushTipPresenceNotification{ - .message_index = 0, - }); } void visit(const can::messages::TipStatusQueryRequest &m) { From 13808c566850605e46f116491032c3fd5dc8ccea Mon Sep 17 00:00:00 2001 From: caila-marashaj Date: Thu, 10 Aug 2023 14:07:39 -0400 Subject: [PATCH 03/12] fix typo --- include/sensors/core/message_handlers/sensors.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/sensors/core/message_handlers/sensors.hpp b/include/sensors/core/message_handlers/sensors.hpp index 80add979a..5f5401d20 100644 --- a/include/sensors/core/message_handlers/sensors.hpp +++ b/include/sensors/core/message_handlers/sensors.hpp @@ -63,7 +63,7 @@ class SensorHandler { break; } case can::ids::SensorId::S1: { - client.send_tip_notificaiton_queue_front(m); + client.send_tip_notification_queue_front(m); break; } default: From c545bce5846bb31581137f38c913dbf69e7f0eaf Mon Sep 17 00:00:00 2001 From: caila-marashaj Date: Thu, 10 Aug 2023 14:51:30 -0400 Subject: [PATCH 04/12] figure out how many sensors there are --- include/can/core/messages.hpp | 18 +----------------- .../sensors/core/message_handlers/sensors.hpp | 14 +++----------- 2 files changed, 4 insertions(+), 28 deletions(-) diff --git a/include/can/core/messages.hpp b/include/can/core/messages.hpp index 9396c2c0a..3d348a6e2 100644 --- a/include/can/core/messages.hpp +++ b/include/can/core/messages.hpp @@ -1233,23 +1233,7 @@ struct BindSensorOutputResponse -> bool = default; }; -struct TipStatusQueryRequest : BaseMessage { - uint32_t message_index; - can::ids::SensorId sensor_id; - - template - static auto parse(Input body, Limit limit) -> TipStatusQueryRequest { - uint32_t msg_ind = 0; - uint8_t _id = 0; - - body = bit_utils::bytes_to_int(body, limit, msg_ind); - body = bit_utils::bytes_to_int(body, limit, _id); - return TipStatusQueryRequest{ - .message_index = msg_ind, - .sensor_id = static_cast(_id)}; - } - auto operator==(const TipStatusQueryRequest& other) const -> bool = default; -}; +using TipStatusQueryRequest = Empty; struct PushTipPresenceNotification : BaseMessage { diff --git a/include/sensors/core/message_handlers/sensors.hpp b/include/sensors/core/message_handlers/sensors.hpp index 5f5401d20..4c7d733d8 100644 --- a/include/sensors/core/message_handlers/sensors.hpp +++ b/include/sensors/core/message_handlers/sensors.hpp @@ -57,17 +57,9 @@ class SensorHandler { } void visit(const can::messages::TipStatusQueryRequest &m) { - switch (m.sensor_id) { - case can::ids::SensorId::S0: { - client.send_tip_notification_queue_rear(m); - break; - } - case can::ids::SensorId::S1: { - client.send_tip_notification_queue_front(m); - break; - } - default: - break; + client.send_tip_notification_queue_rear(m); + if (tip_notification_queue_front) { + client.send_tip_notification_queue_front(m); } } From 337ea79f19f06dc622aff85c9eafe9698a6b2050 Mon Sep 17 00:00:00 2001 From: caila-marashaj Date: Fri, 11 Aug 2023 11:56:25 -0400 Subject: [PATCH 05/12] decide in sensor_tasks if theres a front queue --- include/sensors/core/message_handlers/sensors.hpp | 4 +--- pipettes/core/sensor_tasks.cpp | 4 +++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/sensors/core/message_handlers/sensors.hpp b/include/sensors/core/message_handlers/sensors.hpp index 4c7d733d8..8eac2f770 100644 --- a/include/sensors/core/message_handlers/sensors.hpp +++ b/include/sensors/core/message_handlers/sensors.hpp @@ -58,9 +58,7 @@ class SensorHandler { void visit(const can::messages::TipStatusQueryRequest &m) { client.send_tip_notification_queue_rear(m); - if (tip_notification_queue_front) { - client.send_tip_notification_queue_front(m); - } + client.send_tip_notification_queue_front(m); } void send_to_queue(can::ids::SensorType type, can::ids::SensorId id, diff --git a/pipettes/core/sensor_tasks.cpp b/pipettes/core/sensor_tasks.cpp index e39aa480a..8f2f494ec 100644 --- a/pipettes/core/sensor_tasks.cpp +++ b/pipettes/core/sensor_tasks.cpp @@ -235,7 +235,9 @@ void sensor_tasks::QueueClient::send_tip_notification_queue_rear( void sensor_tasks::QueueClient::send_tip_notification_queue_front( const sensors::tip_presence::TaskMessage& m) { - tip_notification_queue_front->try_write(m); + if (tip_notification_queue_front != nullptr) { + tip_notification_queue_front->try_write(m); + } } auto sensor_tasks::get_tasks() -> Tasks& { return tasks; } From 0b6a18b67911ff880c34216b6d74206b81e26404 Mon Sep 17 00:00:00 2001 From: caila-marashaj Date: Mon, 14 Aug 2023 14:17:30 -0400 Subject: [PATCH 06/12] only start front sensor task on 96 channel --- pipettes/core/sensor_tasks.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/pipettes/core/sensor_tasks.cpp b/pipettes/core/sensor_tasks.cpp index 8f2f494ec..a4805dacf 100644 --- a/pipettes/core/sensor_tasks.cpp +++ b/pipettes/core/sensor_tasks.cpp @@ -124,6 +124,8 @@ void sensor_tasks::start_tasks( ? i2c3_task_client : i2c2_task_client; auto shared_cap_task = PIPETTE_TYPE == EIGHT_CHANNEL ? true : false; + auto front_tip_presence_sensor = + PIPETTE_TYPE == NINETY_SIX_CHANNEL ? true : false; auto& eeprom_task = eeprom_task_builder.start( 5, "eeprom", eeprom_i2c_client, eeprom_hardware); @@ -141,16 +143,12 @@ void sensor_tasks::start_tasks( sensor_hardware_primary, queues, shared_cap_task); auto& tip_notification_task_rear = tip_notification_task_builder_rear.start( 5, "tip notification sensor s0", queues, sensor_hardware_primary); - auto& tip_notification_task_front = - tip_notification_task_builder_front.start( - 5, "tip notification sensor s1", queues, sensor_hardware_secondary); tasks.eeprom_task = &eeprom_task; tasks.environment_sensor_task = &environment_sensor_task; tasks.pressure_sensor_task_rear = &pressure_sensor_task_rear; tasks.pressure_sensor_task_front = &pressure_sensor_task_front; tasks.tip_notification_task_rear = &tip_notification_task_rear; - tasks.tip_notification_task_front = &tip_notification_task_front; tasks.capacitive_sensor_task_rear = &capacitive_sensor_task_rear; queues.set_queue(&can_writer.get_queue()); @@ -163,8 +161,6 @@ void sensor_tasks::start_tasks( &pressure_sensor_task_front.get_queue(); queues.tip_notification_queue_rear = &tip_notification_task_rear.get_queue(); - queues.tip_notification_queue_front = - &tip_notification_task_front.get_queue(); if (shared_cap_task) { // There is only one cap sensor on the eight channel and so the "front" @@ -182,6 +178,17 @@ void sensor_tasks::start_tasks( queues.capacitive_sensor_queue_front = &capacitive_sensor_task_front.get_queue(); } + if (front_tip_presence_sensor) { + // the eight channel only has one tip presence sensor, so the front + // task should only be started if we have a 96 channel pipette + auto& tip_notification_task_front = + tip_notification_task_builder_front.start( + 5, "tip notification sensor s1", queues, + sensor_hardware_secondary); + tasks.tip_notification_task_front = &tip_notification_task_front; + queues.tip_notification_queue_front = + &tip_notification_task_front.get_queue(); + } } sensor_tasks::QueueClient::QueueClient() From 6243bd3ad312f907ed1152b0a0e3a7a32c8237d9 Mon Sep 17 00:00:00 2001 From: Caila Marashaj <98041399+caila-marashaj@users.noreply.github.com> Date: Mon, 14 Aug 2023 14:39:23 -0400 Subject: [PATCH 07/12] Update pipettes/firmware/main.cpp Co-authored-by: Seth Foster --- pipettes/firmware/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipettes/firmware/main.cpp b/pipettes/firmware/main.cpp index e115c8dcc..b58730511 100644 --- a/pipettes/firmware/main.cpp +++ b/pipettes/firmware/main.cpp @@ -149,7 +149,7 @@ extern "C" void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { GPIO_Pin == pins_for_sensor.secondary.value().tip_sense.value().pin) { static_cast( - sensor_queue_client.tip_notification_queue_front->try_write_isr( + if(sensor_queue_client.tip_notification_queue_front) sensor_queue_client.tip_notification_queue_front->try_write_isr( sensors::tip_presence::TipStatusChangeDetected{})); } } From 36124c24d16585c5d329b3ca19d94eef4d92412f Mon Sep 17 00:00:00 2001 From: Caila Marashaj <98041399+caila-marashaj@users.noreply.github.com> Date: Mon, 14 Aug 2023 14:39:45 -0400 Subject: [PATCH 08/12] Update pipettes/firmware/main.cpp Co-authored-by: Seth Foster --- pipettes/firmware/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipettes/firmware/main.cpp b/pipettes/firmware/main.cpp index b58730511..839fd53bf 100644 --- a/pipettes/firmware/main.cpp +++ b/pipettes/firmware/main.cpp @@ -143,7 +143,7 @@ static auto tail_accessor = extern "C" void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == tip_sense_gpio_primary.pin) { static_cast( - sensor_queue_client.tip_notification_queue_rear->try_write_isr( + if(sensor_queue_client.tip_notification_queue_rear) sensor_queue_client.tip_notification_queue_rear->try_write_isr( sensors::tip_presence::TipStatusChangeDetected{})); } else if (ok_for_secondary && GPIO_Pin == From 2db88577eb436f8094c6ccf444f82d31e5ad187e Mon Sep 17 00:00:00 2001 From: Caila Marashaj <98041399+caila-marashaj@users.noreply.github.com> Date: Mon, 14 Aug 2023 14:41:55 -0400 Subject: [PATCH 09/12] Update include/sensors/core/tasks/tip_presence_notification_task.hpp Co-authored-by: Seth Foster --- include/sensors/core/tasks/tip_presence_notification_task.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/sensors/core/tasks/tip_presence_notification_task.hpp b/include/sensors/core/tasks/tip_presence_notification_task.hpp index d97a7b771..78429412b 100644 --- a/include/sensors/core/tasks/tip_presence_notification_task.hpp +++ b/include/sensors/core/tasks/tip_presence_notification_task.hpp @@ -42,7 +42,7 @@ class TipPresenceNotificationHandler { .message_index = m.message_index, .ejector_flag_status = static_cast(hardware.check_tip_presence()), - .sensor_id = this->sensor_id}); + .sensor_id = sensor_id}); } private: From 109d09cf4135fd0f05977dbe074b818d3e3c2b1c Mon Sep 17 00:00:00 2001 From: caila-marashaj Date: Mon, 14 Aug 2023 14:45:39 -0400 Subject: [PATCH 10/12] check if both tip presence sensor tasks are there before writing to them --- pipettes/core/sensor_tasks.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pipettes/core/sensor_tasks.cpp b/pipettes/core/sensor_tasks.cpp index a4805dacf..a32206b97 100644 --- a/pipettes/core/sensor_tasks.cpp +++ b/pipettes/core/sensor_tasks.cpp @@ -237,7 +237,9 @@ void sensor_tasks::QueueClient::send_pressure_sensor_queue_front( void sensor_tasks::QueueClient::send_tip_notification_queue_rear( const sensors::tip_presence::TaskMessage& m) { - tip_notification_queue_rear->try_write(m); + if (tip_notification_queue_rear != nullptr) { + tip_notification_queue_rear->try_write(m); + } } void sensor_tasks::QueueClient::send_tip_notification_queue_front( From f29211198e9a19381a7ca5a15a7a1cd0b249136c Mon Sep 17 00:00:00 2001 From: caila-marashaj Date: Mon, 14 Aug 2023 14:52:15 -0400 Subject: [PATCH 11/12] fix format error --- pipettes/firmware/main.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pipettes/firmware/main.cpp b/pipettes/firmware/main.cpp index 839fd53bf..71b37486c 100644 --- a/pipettes/firmware/main.cpp +++ b/pipettes/firmware/main.cpp @@ -143,14 +143,16 @@ static auto tail_accessor = extern "C" void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == tip_sense_gpio_primary.pin) { static_cast( - if(sensor_queue_client.tip_notification_queue_rear) sensor_queue_client.tip_notification_queue_rear->try_write_isr( - sensors::tip_presence::TipStatusChangeDetected{})); + if (sensor_queue_client.tip_notification_queue_rear) + sensor_queue_client.tip_notification_queue_rear->try_write_isr( + sensors::tip_presence::TipStatusChangeDetected{})); } else if (ok_for_secondary && GPIO_Pin == pins_for_sensor.secondary.value().tip_sense.value().pin) { static_cast( - if(sensor_queue_client.tip_notification_queue_front) sensor_queue_client.tip_notification_queue_front->try_write_isr( - sensors::tip_presence::TipStatusChangeDetected{})); + if (sensor_queue_client.tip_notification_queue_front) + sensor_queue_client.tip_notification_queue_front->try_write_isr( + sensors::tip_presence::TipStatusChangeDetected{})); } } From c582119d40b40287e4e41b5d3d6d414a15b53859 Mon Sep 17 00:00:00 2001 From: caila-marashaj Date: Mon, 14 Aug 2023 15:52:20 -0400 Subject: [PATCH 12/12] compare queues w nullptr explicitly --- pipettes/firmware/main.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pipettes/firmware/main.cpp b/pipettes/firmware/main.cpp index 71b37486c..55741bba9 100644 --- a/pipettes/firmware/main.cpp +++ b/pipettes/firmware/main.cpp @@ -142,17 +142,19 @@ static auto tail_accessor = extern "C" void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == tip_sense_gpio_primary.pin) { - static_cast( - if (sensor_queue_client.tip_notification_queue_rear) + if (sensor_queue_client.tip_notification_queue_rear != nullptr) { + static_cast( sensor_queue_client.tip_notification_queue_rear->try_write_isr( sensors::tip_presence::TipStatusChangeDetected{})); + } } else if (ok_for_secondary && GPIO_Pin == pins_for_sensor.secondary.value().tip_sense.value().pin) { - static_cast( - if (sensor_queue_client.tip_notification_queue_front) + if (sensor_queue_client.tip_notification_queue_front != nullptr) { + static_cast( sensor_queue_client.tip_notification_queue_front->try_write_isr( sensors::tip_presence::TipStatusChangeDetected{})); + } } }