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
1722typedef 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
3248static 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}
3753static MP_DEFINE_CONST_FUN_OBJ_1 (nxtdevices_TemperatureSensor_temperature_obj , nxtdevices_TemperatureSensor_temperature ) ;
3854
39- // dir(pybricks.ev3devices .TemperatureSensor)
55+ // dir(pybricks.nxtdevices .TemperatureSensor)
4056static 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};
4359static 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