Skip to content

Commit 0f0766f

Browse files
committed
codal_port/modmicrobit: Add microbit.scale function.
See issue #102. Signed-off-by: Damien George <[email protected]>
1 parent f3db1e6 commit 0f0766f

File tree

1 file changed

+31
-0
lines changed

1 file changed

+31
-0
lines changed

src/codal_port/modmicrobit.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,36 @@ STATIC mp_obj_t microbit_run_every(size_t n_args, const mp_obj_t *pos_args, mp_m
126126
}
127127
STATIC 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+
129159
STATIC 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

Comments
 (0)