@@ -126,6 +126,36 @@ STATIC mp_obj_t microbit_run_every(size_t n_args, const mp_obj_t *pos_args, mp_m
126
126
}
127
127
STATIC MP_DEFINE_CONST_FUN_OBJ_KW (microbit_run_every_obj , 0 , microbit_run_every );
128
128
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
+
129
159
STATIC const mp_rom_map_elem_t microbit_module_globals_table [] = {
130
160
{ MP_ROM_QSTR (MP_QSTR___name__ ), MP_ROM_QSTR (MP_QSTR_microbit ) },
131
161
@@ -155,6 +185,7 @@ STATIC const mp_rom_map_elem_t microbit_module_globals_table[] = {
155
185
{ MP_ROM_QSTR (MP_QSTR_ws2812_write ), MP_ROM_PTR (& microbit_ws2812_write_obj ) },
156
186
157
187
{ 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 ) },
158
189
159
190
{ MP_ROM_QSTR (MP_QSTR_pin0 ), MP_ROM_PTR (& microbit_p0_obj ) },
160
191
{ MP_ROM_QSTR (MP_QSTR_pin1 ), MP_ROM_PTR (& microbit_p1_obj ) },
0 commit comments