Skip to content

Commit 5fba49d

Browse files
committed
pybricks.nxtdevices: Add TemperatureSensor.
1 parent 1f3032e commit 5fba49d

File tree

3 files changed

+30
-14
lines changed

3 files changed

+30
-14
lines changed

pybricks/nxtdevices/nxtdevices.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ extern const mp_obj_type_t pb_type_nxtdevices_TouchSensor;
1414
extern const mp_obj_type_t pb_type_nxtdevices_LightSensor;
1515
extern const mp_obj_type_t pb_type_nxtdevices_ColorSensor;
1616
extern const mp_obj_type_t pb_type_nxtdevices_UltrasonicSensor;
17+
extern const mp_obj_type_t pb_type_nxtdevices_TemperatureSensor;
1718

1819
#if PYBRICKS_PY_EV3DEVDEVICES
1920

2021
extern const mp_obj_type_t pb_type_nxtdevices_EnergyMeter;
2122
extern const mp_obj_type_t pb_type_nxtdevices_SoundSensor;
22-
extern const mp_obj_type_t pb_type_nxtdevices_TemperatureSensor;
2323

2424
int32_t analog_scale(int32_t mvolts, int32_t mvolts_min, int32_t mvolts_max, bool invert);
2525

pybricks/nxtdevices/pb_module_nxtdevices.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ static const mp_rom_map_elem_t nxtdevices_globals_table[] = {
1717
{ MP_ROM_QSTR(MP_QSTR_LightSensor), MP_ROM_PTR(&pb_type_nxtdevices_LightSensor) },
1818
{ MP_ROM_QSTR(MP_QSTR_ColorSensor), MP_ROM_PTR(&pb_type_nxtdevices_ColorSensor) },
1919
{ MP_ROM_QSTR(MP_QSTR_UltrasonicSensor), MP_ROM_PTR(&pb_type_nxtdevices_UltrasonicSensor) },
20+
{ MP_ROM_QSTR(MP_QSTR_TemperatureSensor), MP_ROM_PTR(&pb_type_nxtdevices_TemperatureSensor)},
2021
#if PYBRICKS_PY_EV3DEVDEVICES
2122
{ MP_ROM_QSTR(MP_QSTR_EnergyMeter), MP_ROM_PTR(&pb_type_nxtdevices_EnergyMeter) },
2223
{ MP_ROM_QSTR(MP_QSTR_SoundSensor), MP_ROM_PTR(&pb_type_nxtdevices_SoundSensor) },
23-
{ MP_ROM_QSTR(MP_QSTR_TemperatureSensor), MP_ROM_PTR(&pb_type_nxtdevices_TemperatureSensor)},
2424
#endif
2525
};
2626
static MP_DEFINE_CONST_DICT(pb_module_nxtdevices_globals, nxtdevices_globals_table);
Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,27 @@
11
// SPDX-License-Identifier: MIT
2-
// Copyright (c) 2018-2023 The Pybricks Authors
2+
// Copyright (c) 2018-2025 The Pybricks Authors
33

44
#include "py/mpconfig.h"
55

6-
#if PYBRICKS_PY_NXTDEVICES && PYBRICKS_PY_EV3DEVDEVICES
6+
#if PYBRICKS_PY_NXTDEVICES
7+
8+
#include "py/mphal.h"
9+
10+
#include <pbdrv/i2c.h>
11+
#include <pbio/port_interface.h>
712

813
#include <pybricks/common.h>
9-
#include <pybricks/nxtdevices.h>
14+
#include <pybricks/iodevices/iodevices.h>
1015
#include <pybricks/parameters.h>
1116

1217
#include <pybricks/util_mp/pb_kwarg_helper.h>
1318
#include <pybricks/util_mp/pb_obj_helper.h>
14-
#include <pybricks/common/pb_type_device.h>
19+
#include <pybricks/util_pb/pb_error.h>
1520

1621
// pybricks.nxtdevices.TemperatureSensor class object
1722
typedef struct _nxtdevices_TemperatureSensor_obj_t {
18-
pb_type_device_obj_base_t device_base;
23+
mp_obj_base_t base;
24+
mp_obj_t *i2c_device_obj;
1925
} nxtdevices_TemperatureSensor_obj_t;
2026

2127
// pybricks.nxtdevices.TemperatureSensor.__init__
@@ -24,21 +30,31 @@ static mp_obj_t nxtdevices_TemperatureSensor_make_new(const mp_obj_type_t *type,
2430
PB_ARG_REQUIRED(port));
2531

2632
nxtdevices_TemperatureSensor_obj_t *self = mp_obj_malloc(nxtdevices_TemperatureSensor_obj_t, type);
27-
pb_type_device_init_class(&self->device_base, port_in, LEGO_DEVICE_TYPE_ID_NXT_TEMPERATURE_SENSOR);
33+
self->i2c_device_obj = pb_type_i2c_device_make_new(port_in, 0x4C, true, false, false);
34+
35+
// Set resolution to 0.125 degrees as a fair balance between speed and accuracy.
36+
const uint8_t write_data[] = { 0x01, (1 << 6) | (0 << 5) };
37+
pb_type_i2c_device_start_operation(self->i2c_device_obj, write_data, MP_ARRAY_SIZE(write_data), 0, NULL);
38+
2839
return MP_OBJ_FROM_PTR(self);
2940
}
3041

42+
static mp_obj_t map_temperature(const uint8_t *data, size_t len) {
43+
int16_t combined = ((uint16_t)data[0] << 8) | data[1];
44+
return mp_obj_new_float_from_f((combined >> 4) / 16.0f);
45+
}
46+
3147
// pybricks.nxtdevices.TemperatureSensor.temperature
3248
static mp_obj_t nxtdevices_TemperatureSensor_temperature(mp_obj_t self_in) {
33-
int16_t *temperature_scaled = pb_type_device_get_data_blocking(self_in, LEGO_DEVICE_MODE_NXT_TEMPERATURE_SENSOR_CELSIUS);
34-
// FIXME: ENDIANNESS
35-
return mp_obj_new_float((temperature_scaled[0] >> 4) / 16.0);
49+
nxtdevices_TemperatureSensor_obj_t *self = MP_OBJ_TO_PTR(self_in);
50+
const uint8_t write_data[] = { 0x00 };
51+
return pb_type_i2c_device_start_operation(self->i2c_device_obj, write_data, MP_ARRAY_SIZE(write_data), 2, map_temperature);
3652
}
3753
static MP_DEFINE_CONST_FUN_OBJ_1(nxtdevices_TemperatureSensor_temperature_obj, nxtdevices_TemperatureSensor_temperature);
3854

39-
// dir(pybricks.ev3devices.TemperatureSensor)
55+
// dir(pybricks.nxtdevices.TemperatureSensor)
4056
static const mp_rom_map_elem_t nxtdevices_TemperatureSensor_locals_dict_table[] = {
41-
{ MP_ROM_QSTR(MP_QSTR_temperature), MP_ROM_PTR(&nxtdevices_TemperatureSensor_temperature_obj) },
57+
{ MP_ROM_QSTR(MP_QSTR_temperature), MP_ROM_PTR(&nxtdevices_TemperatureSensor_temperature_obj) },
4258
};
4359
static MP_DEFINE_CONST_DICT(nxtdevices_TemperatureSensor_locals_dict, nxtdevices_TemperatureSensor_locals_dict_table);
4460

@@ -49,4 +65,4 @@ MP_DEFINE_CONST_OBJ_TYPE(pb_type_nxtdevices_TemperatureSensor,
4965
make_new, nxtdevices_TemperatureSensor_make_new,
5066
locals_dict, &nxtdevices_TemperatureSensor_locals_dict);
5167

52-
#endif // PYBRICKS_PY_NXTDEVICES && PYBRICKS_PY_EV3DEVDEVICES
68+
#endif // PYBRICKS_PY_NXTDEVICES

0 commit comments

Comments
 (0)