2
2
import asyncio
3
3
import argparse
4
4
import datetime
5
+ from struct import unpack
5
6
6
7
from opentrons_hardware .drivers .can_bus import (
7
8
build ,
8
9
CanMessenger ,
9
10
WaitableCallback ,
10
11
)
11
- from opentrons_hardware .firmware_bindings import constants
12
+ from opentrons_hardware .firmware_bindings import constants , utils
12
13
from opentrons_hardware .firmware_bindings .messages import (
13
14
message_definitions ,
14
15
payloads ,
22
23
23
24
from opentrons_hardware .scripts .can_args import add_can_args , build_settings
24
25
26
+ THRESHOLD_NUM_READS = 20
27
+
25
28
26
29
async def do_run (
27
30
messenger : CanMessenger ,
@@ -33,7 +36,7 @@ async def do_run(
33
36
) -> None :
34
37
"""Configure and start the monitoring."""
35
38
threshold_payload = payloads .SetSensorThresholdRequestPayload (
36
- sensor = fields .SensorTypeField (constants . SensorType . capacitive ),
39
+ sensor = fields .SensorTypeField (target_sensor . value ),
37
40
sensor_id = fields .SensorIdField (sensor_id ),
38
41
threshold = Int32Field (int (threshold * sensor_fixed_point_conversion )),
39
42
mode = fields .SensorThresholdModeField (constants .SensorThresholdMode .absolute ),
@@ -42,10 +45,21 @@ async def do_run(
42
45
payload = threshold_payload
43
46
)
44
47
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
45
59
stim_payload = payloads .BindSensorOutputRequestPayload (
46
60
sensor = fields .SensorTypeField (target_sensor .value ),
47
61
sensor_id = fields .SensorIdField (sensor_id ),
48
- binding = fields .SensorOutputBindingField (3 ),
62
+ binding = fields .SensorOutputBindingField (2 ),
49
63
)
50
64
stim_message = message_definitions .BindSensorOutputRequest (payload = stim_payload )
51
65
reset_payload = payloads .BindSensorOutputRequestPayload (
@@ -68,6 +82,18 @@ async def do_run(
68
82
)
69
83
rd = message .payload .sensor_data
70
84
print (f"{ ts :.3f} : { s } { d .to_float ():5.3f} , \t raw 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
+
71
97
finally :
72
98
print ("cleaning up" )
73
99
await messenger .send (target_node , reset_message )
0 commit comments