@@ -126,6 +126,36 @@ STATIC mp_obj_t microbit_run_every(size_t n_args, const mp_obj_t *pos_args, mp_m
126126}
127127STATIC MP_DEFINE_CONST_FUN_OBJ_KW (microbit_run_every_obj , 0 , microbit_run_every );
128128
129+ STATIC mp_obj_t microbit_scale (size_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
130+ enum { ARG_value , ARG_from_ , ARG_to };
131+ static const mp_arg_t allowed_args [] = {
132+ { MP_QSTR_value , MP_ARG_REQUIRED | MP_ARG_OBJ , {.u_rom_obj = MP_ROM_NONE } },
133+ { MP_QSTR_from_ , MP_ARG_REQUIRED | MP_ARG_OBJ , {.u_rom_obj = MP_ROM_NONE } },
134+ { MP_QSTR_to , MP_ARG_REQUIRED | MP_ARG_OBJ , {.u_rom_obj = MP_ROM_NONE } },
135+ };
136+
137+ mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
138+ mp_arg_parse_all (n_args , pos_args , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
139+
140+ // Extract from/to min/max arrays.
141+ mp_obj_t * from_items , * to_items ;
142+ mp_obj_get_array_fixed_n (args [ARG_from_ ].u_obj , 2 , & from_items );
143+ mp_obj_get_array_fixed_n (args [ARG_to ].u_obj , 2 , & to_items );
144+
145+ // Extract all float values.
146+ mp_float_t from_value = mp_obj_get_float (args [ARG_value ].u_obj );
147+ mp_float_t from_min = mp_obj_get_float (from_items [0 ]);
148+ mp_float_t from_max = mp_obj_get_float (from_items [1 ]);
149+ mp_float_t to_min = mp_obj_get_float (to_items [0 ]);
150+ mp_float_t to_max = mp_obj_get_float (to_items [1 ]);
151+
152+ // Compute scaled value.
153+ mp_float_t to_value = (from_value - from_min ) / (from_max - from_min ) * (to_max - to_min ) + to_min ;
154+
155+ return mp_obj_new_float (to_value );
156+ }
157+ STATIC MP_DEFINE_CONST_FUN_OBJ_KW (microbit_scale_obj , 0 , microbit_scale );
158+
129159STATIC const mp_rom_map_elem_t microbit_module_globals_table [] = {
130160 { MP_ROM_QSTR (MP_QSTR___name__ ), MP_ROM_QSTR (MP_QSTR_microbit ) },
131161
@@ -155,6 +185,7 @@ STATIC const mp_rom_map_elem_t microbit_module_globals_table[] = {
155185 { MP_ROM_QSTR (MP_QSTR_ws2812_write ), MP_ROM_PTR (& microbit_ws2812_write_obj ) },
156186
157187 { MP_ROM_QSTR (MP_QSTR_run_every ), MP_ROM_PTR (& microbit_run_every_obj ) },
188+ { MP_ROM_QSTR (MP_QSTR_scale ), MP_ROM_PTR (& microbit_scale_obj ) },
158189
159190 { MP_ROM_QSTR (MP_QSTR_pin0 ), MP_ROM_PTR (& microbit_p0_obj ) },
160191 { MP_ROM_QSTR (MP_QSTR_pin1 ), MP_ROM_PTR (& microbit_p1_obj ) },
0 commit comments