Skip to content

Commit 50c0277

Browse files
fix(hardware): add handling for BatchReadFromSensorResponse to monitor_sensors (#19130)
1 parent 7eb658b commit 50c0277

File tree

2 files changed

+32
-9
lines changed

2 files changed

+32
-9
lines changed

hardware/opentrons_hardware/scripts/monitor_sensors.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22
import asyncio
33
import argparse
44
import datetime
5+
from struct import unpack
56

67
from opentrons_hardware.drivers.can_bus import (
78
build,
89
CanMessenger,
910
WaitableCallback,
1011
)
11-
from opentrons_hardware.firmware_bindings import constants
12+
from opentrons_hardware.firmware_bindings import constants, utils
1213
from opentrons_hardware.firmware_bindings.messages import (
1314
message_definitions,
1415
payloads,
@@ -22,6 +23,8 @@
2223

2324
from opentrons_hardware.scripts.can_args import add_can_args, build_settings
2425

26+
THRESHOLD_NUM_READS = 20
27+
2528

2629
async def do_run(
2730
messenger: CanMessenger,
@@ -33,7 +36,7 @@ async def do_run(
3336
) -> None:
3437
"""Configure and start the monitoring."""
3538
threshold_payload = payloads.SetSensorThresholdRequestPayload(
36-
sensor=fields.SensorTypeField(constants.SensorType.capacitive),
39+
sensor=fields.SensorTypeField(target_sensor.value),
3740
sensor_id=fields.SensorIdField(sensor_id),
3841
threshold=Int32Field(int(threshold * sensor_fixed_point_conversion)),
3942
mode=fields.SensorThresholdModeField(constants.SensorThresholdMode.absolute),
@@ -42,10 +45,21 @@ async def do_run(
4245
payload=threshold_payload
4346
)
4447
await messenger.send(target_node, threshold_message)
48+
baseline_payload = payloads.BaselineSensorRequestPayload(
49+
sensor=fields.SensorTypeField(target_sensor.value),
50+
sensor_id=fields.SensorIdField(sensor_id),
51+
number_of_reads=utils.UInt16Field(THRESHOLD_NUM_READS),
52+
)
53+
baseline_message = message_definitions.BaselineSensorRequest(
54+
payload=baseline_payload
55+
)
56+
57+
await messenger.send(target_node, baseline_message)
58+
# set sensor to report
4559
stim_payload = payloads.BindSensorOutputRequestPayload(
4660
sensor=fields.SensorTypeField(target_sensor.value),
4761
sensor_id=fields.SensorIdField(sensor_id),
48-
binding=fields.SensorOutputBindingField(3),
62+
binding=fields.SensorOutputBindingField(2),
4963
)
5064
stim_message = message_definitions.BindSensorOutputRequest(payload=stim_payload)
5165
reset_payload = payloads.BindSensorOutputRequestPayload(
@@ -68,6 +82,18 @@ async def do_run(
6882
)
6983
rd = message.payload.sensor_data
7084
print(f"{ts:.3f}: {s} {d.to_float():5.3f}, \traw data: {str(rd)}")
85+
elif isinstance(message, message_definitions.BatchReadFromSensorResponse):
86+
ts = (datetime.datetime.now() - start).total_seconds()
87+
s = constants.SensorType(message.payload.sensor.value).name
88+
data_length = message.payload.data_length.value
89+
data_bytes = message.payload.sensor_data.value
90+
struct_vals = [
91+
unpack(">l", data_bytes[i * 4 : i * 4 + 4])[0] / 65536
92+
for i in range(data_length)
93+
]
94+
for v in struct_vals:
95+
print(f"{ts:.3f}: {s} {v:5.3f}")
96+
7197
finally:
7298
print("cleaning up")
7399
await messenger.send(target_node, reset_message)

hardware/opentrons_hardware/sensors/sensor_driver.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from typing import Optional, AsyncIterator, Any, Sequence, List, Union
66
from contextlib import asynccontextmanager, suppress
77
from logging import getLogger
8+
from struct import unpack
89

910
from opentrons_hardware.drivers.can_bus.can_messenger import (
1011
CanMessenger,
@@ -303,13 +304,9 @@ def __call__(
303304
if isinstance(message, message_definitions.BatchReadFromSensorResponse):
304305
data_length = message.payload.data_length.value
305306
data_bytes = message.payload.sensor_data.value
306-
data_ints = [
307-
int.from_bytes(data_bytes[i * 4 : i * 4 + 4], byteorder="little")
308-
for i in range(data_length)
309-
]
310307
data_floats = [
311-
sensor_types.SensorDataType.build(d, message.payload.sensor)
312-
for d in data_ints
308+
unpack(">l", data_bytes[i * 4 : i * 4 + 4])[0] / 65536
309+
for i in range(data_length)
313310
]
314311

315312
for d in data_floats:

0 commit comments

Comments
 (0)