Skip to content

Commit cc12d11

Browse files
committed
extmod/pbdevice: change power from bool to int
Some sensors require full power and have their builtin controls to adjust it, while some lights have intensity controlled by the hub directly, so we need more finegrained control than a bool.
1 parent 0f9e704 commit cc12d11

File tree

5 files changed

+18
-13
lines changed

5 files changed

+18
-13
lines changed

bricks/ev3dev/pbdevice.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ void pbdevice_set_values(pbdevice_t *pbdev, uint8_t mode, int32_t *values, uint8
218218
pb_assert(PBIO_ERROR_NOT_SUPPORTED);
219219
}
220220

221-
void pbdevice_set_power_supply(pbdevice_t *pbdev, bool on) {
221+
void pbdevice_set_power_supply(pbdevice_t *pbdev, int32_t duty) {
222222
pb_assert(PBIO_ERROR_NOT_SUPPORTED);
223223
}
224224

bricks/stm32/pbdevice.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -178,14 +178,15 @@ void pbdevice_set_values(pbdevice_t *pbdev, uint8_t mode, int32_t *values, uint8
178178
wait(pbio_iodev_set_data_end, pbio_iodev_set_data_cancel, iodev);
179179
}
180180

181-
// FIXME: iodev should take care of this based on device data
182-
void pbdevice_set_power_supply(pbdevice_t *pbdev, bool on) {
183-
if (on) {
184-
pb_assert(pbdrv_motor_set_duty_cycle(pbdev->iodev.port, -10000));
185-
mp_hal_delay_ms(1000);
186-
} else {
187-
pb_assert(pbdrv_motor_coast(pbdev->iodev.port));
181+
void pbdevice_set_power_supply(pbdevice_t *pbdev, int32_t duty) {
182+
// Bind user input to percentage
183+
if (duty < 0) {
184+
duty = 0;
185+
} else if (duty > 100) {
186+
duty = 100;
188187
}
188+
// Apply duty cycle in reverse to activate power
189+
pb_assert(pbdrv_motor_set_duty_cycle(pbdev->iodev.port, -100 * duty));
189190
}
190191

191192
void pbdevice_get_info(pbdevice_t *pbdev, pbio_port_t *port, pbio_iodev_type_id_t *id, uint8_t *mode, uint8_t *num_values) {

extmod/modiodevices.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ STATIC mp_obj_t iodevices_LUMPDevice_make_new(const mp_obj_type_t *type, size_t
5050
#if PYBRICKS_PY_PUPDEVICES
5151
// FIXME: Read sensor capability flag to see which sensor uses power. As
5252
// a precaution, only enable power for selected known sensors for now.
53-
bool power = (id == PBIO_IODEV_TYPE_ID_SPIKE_COLOR_SENSOR || id == PBIO_IODEV_TYPE_ID_SPIKE_ULTRASONIC_SENSOR);
54-
pbdevice_set_power_supply(self->pbdev, power);
53+
int32_t duty = (id == PBIO_IODEV_TYPE_ID_SPIKE_COLOR_SENSOR || id == PBIO_IODEV_TYPE_ID_SPIKE_ULTRASONIC_SENSOR) ? 100 : 0;
54+
pbdevice_set_power_supply(self->pbdev, duty);
5555
#endif // PYBRICKS_PY_PUPDEVICES
5656

5757
return MP_OBJ_FROM_PTR(self);

extmod/modpupdevices.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Copyright (c) 2018-2020 The Pybricks Authors
33

44
#include "py/mpconfig.h"
5+
#include "py/mphal.h"
56

67
#if PYBRICKS_PY_PUPDEVICES
78

@@ -216,7 +217,7 @@ STATIC mp_obj_t pupdevices_ColorSensor_make_new(const mp_obj_type_t *type, size_
216217
self->pbdev = pbdevice_get_device(port_num, PBIO_IODEV_TYPE_ID_SPIKE_COLOR_SENSOR);
217218

218219
// This sensor requires power, which iodevice does not do automatically yet
219-
pbdevice_set_power_supply(self->pbdev, true);
220+
pbdevice_set_power_supply(self->pbdev, 100);
220221

221222
// Create an instance of the LightArray class
222223
self->lights = builtins_LightArray_obj_make_new(self->pbdev, PBIO_IODEV_MODE_PUP_COLOR_SENSOR__LIGHT, 3);
@@ -228,6 +229,9 @@ STATIC mp_obj_t pupdevices_ColorSensor_make_new(const mp_obj_type_t *type, size_
228229
// Save default settings
229230
pb_hsv_map_save_default(&self->color_map);
230231

232+
// This sensor needs some time to get values right after turning power on
233+
mp_hal_delay_ms(1000);
234+
231235
return MP_OBJ_FROM_PTR(self);
232236
}
233237

@@ -353,7 +357,7 @@ STATIC mp_obj_t pupdevices_UltrasonicSensor_make_new(const mp_obj_type_t *type,
353357
self->pbdev = pbdevice_get_device(port_num, PBIO_IODEV_TYPE_ID_SPIKE_ULTRASONIC_SENSOR);
354358

355359
// This sensor requires power, which iodevice does not do automatically yet
356-
pbdevice_set_power_supply(self->pbdev, true);
360+
pbdevice_set_power_supply(self->pbdev, 100);
357361

358362
// Create an instance of the LightArray class
359363
self->lights = builtins_LightArray_obj_make_new(self->pbdev, PBIO_IODEV_MODE_PUP_ULTRASONIC_SENSOR__LIGHT, 4);

extmod/pbdevice.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ void pbdevice_get_values(pbdevice_t *pbdev, uint8_t mode, int32_t *values);
1818

1919
void pbdevice_set_values(pbdevice_t *pbdev, uint8_t mode, int32_t *values, uint8_t num_values);
2020

21-
void pbdevice_set_power_supply(pbdevice_t *pbdev, bool on);
21+
void pbdevice_set_power_supply(pbdevice_t *pbdev, int32_t duty);
2222

2323
void pbdevice_get_info(pbdevice_t *pbdev, pbio_port_t *port, pbio_iodev_type_id_t *id, uint8_t *mode, uint8_t *num_values);
2424

0 commit comments

Comments
 (0)