@@ -93,12 +93,77 @@ static mp_obj_t sensor_get_int(mp_obj_t self_in, mp_obj_t channel_in) {
9393}
9494MP_DEFINE_CONST_FUN_OBJ_2 (sensor_get_int_obj , sensor_get_int );
9595
96+ static void sensor_attr_get_internal (mp_obj_t self_in , mp_obj_t channel_in , mp_obj_t attr_in , struct sensor_value * res ) {
97+ mp_obj_sensor_t * self = MP_OBJ_TO_PTR (self_in );
98+
99+ int st = sensor_attr_get (self -> dev , mp_obj_get_int (channel_in ), mp_obj_get_int (attr_in ), res );
100+ if (st != 0 ) {
101+ mp_raise_OSError (- st );
102+ }
103+ }
104+
105+ static mp_obj_t sensor_attr_get_float (mp_obj_t self_in , mp_obj_t channel_in , mp_obj_t attr_in ) {
106+ struct sensor_value val ;
107+ sensor_attr_get_internal (self_in , channel_in , attr_in , & val );
108+ return mp_obj_new_float (val .val1 + (mp_float_t )val .val2 / 1000000 );
109+ }
110+ MP_DEFINE_CONST_FUN_OBJ_3 (sensor_attr_get_float_obj , sensor_attr_get_float );
111+
112+ static mp_obj_t sensor_attr_get_micros (mp_obj_t self_in , mp_obj_t channel_in , mp_obj_t attr_in ) {
113+ struct sensor_value val ;
114+ sensor_attr_get_internal (self_in , channel_in , attr_in , & val );
115+ return MP_OBJ_NEW_SMALL_INT (val .val1 * 1000000 + val .val2 );
116+ }
117+ MP_DEFINE_CONST_FUN_OBJ_3 (sensor_attr_get_micros_obj , sensor_attr_get_micros );
118+
119+ static mp_obj_t sensor_attr_get_millis (mp_obj_t self_in , mp_obj_t channel_in , mp_obj_t attr_in ) {
120+ struct sensor_value val ;
121+ sensor_attr_get_internal (self_in , channel_in , attr_in , & val );
122+ return MP_OBJ_NEW_SMALL_INT (val .val1 * 1000 + val .val2 / 1000 );
123+ }
124+ MP_DEFINE_CONST_FUN_OBJ_3 (sensor_attr_get_millis_obj , sensor_attr_get_millis );
125+
126+ static mp_obj_t sensor_attr_get_int (mp_obj_t self_in , mp_obj_t channel_in , mp_obj_t attr_in ) {
127+ struct sensor_value val ;
128+ sensor_attr_get_internal (self_in , channel_in , attr_in , & val );
129+ return MP_OBJ_NEW_SMALL_INT (val .val1 );
130+ }
131+ MP_DEFINE_CONST_FUN_OBJ_3 (sensor_attr_get_int_obj , sensor_attr_get_int );
132+
133+ static mp_obj_t mp_sensor_attr_set (size_t n_args , const mp_obj_t * args ) {
134+ mp_obj_sensor_t * self = MP_OBJ_TO_PTR (args [0 ]);
135+ mp_obj_t channel_in = args [1 ];
136+ mp_obj_t attr_in = args [2 ];
137+ struct sensor_value val ;
138+ if (n_args == 4 ) {
139+ // One float argument
140+ float v = mp_obj_get_float (args [3 ]);
141+ val .val1 = (int32_t )v ;
142+ val .val2 = (int32_t )((v - val .val1 ) * 1000000 );
143+ } else {
144+ // Two integer arguments
145+ val .val1 = mp_obj_get_int (args [3 ]);
146+ val .val2 = mp_obj_get_int (args [4 ]);
147+ }
148+ int st = sensor_attr_set (self -> dev , mp_obj_get_int (channel_in ), mp_obj_get_int (attr_in ), & val );
149+ if (st != 0 ) {
150+ mp_raise_OSError (- st );
151+ }
152+ return mp_const_none ;
153+ }
154+ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (sensor_attr_set_obj , 4 , 5 , mp_sensor_attr_set );
155+
96156static const mp_rom_map_elem_t sensor_locals_dict_table [] = {
97157 { MP_ROM_QSTR (MP_QSTR_measure ), MP_ROM_PTR (& sensor_measure_obj ) },
98158 { MP_ROM_QSTR (MP_QSTR_get_float ), MP_ROM_PTR (& sensor_get_float_obj ) },
99159 { MP_ROM_QSTR (MP_QSTR_get_micros ), MP_ROM_PTR (& sensor_get_micros_obj ) },
100160 { MP_ROM_QSTR (MP_QSTR_get_millis ), MP_ROM_PTR (& sensor_get_millis_obj ) },
101161 { MP_ROM_QSTR (MP_QSTR_get_int ), MP_ROM_PTR (& sensor_get_int_obj ) },
162+ { MP_ROM_QSTR (MP_QSTR_attr_get_float ), MP_ROM_PTR (& sensor_attr_get_float_obj ) },
163+ { MP_ROM_QSTR (MP_QSTR_attr_get_micros ), MP_ROM_PTR (& sensor_attr_get_micros_obj ) },
164+ { MP_ROM_QSTR (MP_QSTR_attr_get_millis ), MP_ROM_PTR (& sensor_attr_get_millis_obj ) },
165+ { MP_ROM_QSTR (MP_QSTR_attr_get_int ), MP_ROM_PTR (& sensor_attr_get_int_obj ) },
166+ { MP_ROM_QSTR (MP_QSTR_attr_set ), MP_ROM_PTR (& sensor_attr_set_obj ) },
102167};
103168
104169static MP_DEFINE_CONST_DICT (sensor_locals_dict , sensor_locals_dict_table ) ;
@@ -119,12 +184,15 @@ static const mp_rom_map_elem_t mp_module_zsensor_globals_table[] = {
119184 C (ACCEL_X ),
120185 C (ACCEL_Y ),
121186 C (ACCEL_Z ),
187+ C (ACCEL_XYZ ),
122188 C (GYRO_X ),
123189 C (GYRO_Y ),
124190 C (GYRO_Z ),
191+ C (GYRO_XYZ ),
125192 C (MAGN_X ),
126193 C (MAGN_Y ),
127194 C (MAGN_Z ),
195+ C (MAGN_XYZ ),
128196 C (DIE_TEMP ),
129197 C (AMBIENT_TEMP ),
130198 C (PRESS ),
@@ -145,6 +213,26 @@ static const mp_rom_map_elem_t mp_module_zsensor_globals_table[] = {
145213 C (GAS_RES ),
146214 C (VOLTAGE ),
147215#undef C
216+ #define C (name ) { MP_ROM_QSTR (MP_QSTR_ATTR_ ##name ), MP_ROM_INT(SENSOR_ATTR_##name) }
217+ C (SAMPLING_FREQUENCY ),
218+ C (LOWER_THRESH ),
219+ C (UPPER_THRESH ),
220+ C (SLOPE_TH ),
221+ C (SLOPE_DUR ),
222+ C (HYSTERESIS ),
223+ C (OVERSAMPLING ),
224+ C (FULL_SCALE ),
225+ C (OFFSET ),
226+ C (CALIB_TARGET ),
227+ C (CONFIGURATION ),
228+ C (CALIBRATION ),
229+ C (FEATURE_MASK ),
230+ C (ALERT ),
231+ C (FF_DUR ),
232+ C (BATCH_DURATION ),
233+ C (GAIN ),
234+ C (RESOLUTION ),
235+ #undef C
148236};
149237
150238static MP_DEFINE_CONST_DICT (mp_module_zsensor_globals , mp_module_zsensor_globals_table ) ;
0 commit comments