Skip to content

Commit 65f689e

Browse files
Copilotdlech
andcommitted
Add touch sensor support on Powered Up platform
- Added sensor_data field to pbio_port_dcm_t struct - Implemented reading touch sensor value and storing it - Updated pbio_port_dcm_get_analog_value to return sensor_data - Added touch sensor handling in pbio_port_dcm_assert_type_id - Added touch sensor support in PUPDevice Python bindings - Build tested successfully on technichub Co-authored-by: dlech <963645+dlech@users.noreply.github.com>
1 parent 9240d00 commit 65f689e

2 files changed

Lines changed: 32 additions & 5 deletions

File tree

lib/pbio/src/port_dcm_pup.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ struct _pbio_port_dcm_t {
4343
dev_id_group_t dev_id1_group;
4444
uint8_t gpio_value;
4545
uint8_t prev_gpio_value;
46+
/** Touch sensor data. */
47+
uint32_t sensor_data;
4648
};
4749

4850
pbio_port_dcm_t dcm_state[PBIO_CONFIG_PORT_DCM_NUM_DEV];
@@ -127,8 +129,7 @@ pbio_error_t pbio_port_dcm_thread(pbio_os_state_t *state, pbio_os_timer_t *timer
127129
PBIO_OS_AWAIT_MS(state, timer, DCM_AWAIT_MS);
128130

129131
// ID1 is inverse of touch sensor value
130-
// TODO: save this value to sensor dcm
131-
// sensor_data = !pbdrv_gpio_input(&pins->p5);
132+
dcm->sensor_data = !pbdrv_gpio_input(&pins->p5);
132133
}
133134
// if ID2 changed from low to high
134135
else if (dcm->prev_gpio_value == 0 && dcm->gpio_value == 1) {
@@ -327,6 +328,12 @@ pbio_error_t pbio_port_dcm_assert_type_id(pbio_port_dcm_t *dcm, lego_device_type
327328
return PBIO_SUCCESS;
328329
}
329330
return PBIO_ERROR_NO_DEV;
331+
case LEGO_DEVICE_TYPE_ID_LPF2_TOUCH:
332+
// Pass if requesting a specific match or any passive device.
333+
if (*type_id == LEGO_DEVICE_TYPE_ID_LPF2_TOUCH) {
334+
return PBIO_SUCCESS;
335+
}
336+
return PBIO_ERROR_NO_DEV;
330337
case LEGO_DEVICE_TYPE_ID_LPF2_UNKNOWN_UART:
331338
if (*type_id == LEGO_DEVICE_TYPE_ID_ANY_LUMP_UART) {
332339
return PBIO_SUCCESS;
@@ -338,7 +345,7 @@ pbio_error_t pbio_port_dcm_assert_type_id(pbio_port_dcm_t *dcm, lego_device_type
338345
}
339346

340347
uint32_t pbio_port_dcm_get_analog_value(pbio_port_dcm_t *dcm, const pbdrv_ioport_pins_t *pins, bool active) {
341-
return 0;
348+
return dcm->sensor_data;
342349
}
343350

344351
pbio_error_t pbio_port_dcm_get_analog_rgba(pbio_port_dcm_t *dcm, pbio_port_dcm_analog_rgba_t *rgba) {

pybricks/iodevices/pb_type_iodevices_pupdevice.c

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ typedef struct _iodevices_PUPDevice_obj_t {
3232
uint8_t last_mode;
3333
// ID of a passive device, if any.
3434
lego_device_type_id_t passive_id;
35+
// Port for passive devices.
36+
pbio_port_t *passive_port;
3537
} iodevices_PUPDevice_obj_t;
3638

3739
/**
@@ -50,12 +52,23 @@ static bool init_passive_pup_device(iodevices_PUPDevice_obj_t *self, mp_obj_t po
5052
pbio_port_t *port;
5153
pb_assert(pbio_port_get_port(port_id, &port));
5254

53-
lego_device_type_id_t type_id = LEGO_DEVICE_TYPE_ID_ANY_DC_MOTOR;
55+
// Check for touch sensor first.
56+
lego_device_type_id_t type_id = LEGO_DEVICE_TYPE_ID_LPF2_TOUCH;
57+
pbio_error_t err = pbio_port_dcm_assert_type_id(pbio_port_dcm_init_instance(port_id - PBIO_PORT_ID_A), &type_id);
58+
if (err == PBIO_SUCCESS) {
59+
self->passive_id = type_id;
60+
self->passive_port = port;
61+
return true;
62+
}
63+
64+
// Check for DC motor.
65+
type_id = LEGO_DEVICE_TYPE_ID_ANY_DC_MOTOR;
5466
pbio_dcmotor_t *dcmotor;
55-
pbio_error_t err = pbio_port_get_dcmotor(port, &type_id, &dcmotor);
67+
err = pbio_port_get_dcmotor(port, &type_id, &dcmotor);
5668

5769
if (err == PBIO_SUCCESS) {
5870
self->passive_id = type_id;
71+
self->passive_port = port;
5972
return true;
6073
}
6174
return false;
@@ -164,6 +177,13 @@ static mp_obj_t iodevices_PUPDevice_read(size_t n_args, const mp_obj_t *pos_args
164177
iodevices_PUPDevice_obj_t, self,
165178
PB_ARG_REQUIRED(mode));
166179

180+
if (self->passive_id == LEGO_DEVICE_TYPE_ID_LPF2_TOUCH) {
181+
// Get the touch sensor value from the port.
182+
uint32_t value;
183+
pb_assert(pbio_port_get_analog_value(self->passive_port, LEGO_DEVICE_TYPE_ID_LPF2_TOUCH, false, &value));
184+
return mp_obj_new_bool(value);
185+
}
186+
167187
// Passive devices don't support reading.
168188
if (self->passive_id != LEGO_DEVICE_TYPE_ID_LPF2_UNKNOWN_UART) {
169189
pb_assert(PBIO_ERROR_INVALID_OP);

0 commit comments

Comments
 (0)