Skip to content

Commit 256520f

Browse files
committed
microbit: Add microbit.scale function.
See issue #761. Signed-off-by: Damien George <[email protected]>
1 parent 8d21387 commit 256520f

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

inc/genhdr/qstrdefs.generated.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,7 @@ QDEF(MP_QSTR_floor, (const byte*)"\x7d\x05" "floor")
580580
QDEF(MP_QSTR_fmod, (const byte*)"\xe5\x04" "fmod")
581581
QDEF(MP_QSTR_format, (const byte*)"\x26\x06" "format")
582582
QDEF(MP_QSTR_frexp, (const byte*)"\x1c\x05" "frexp")
583+
QDEF(MP_QSTR_from_, (const byte*)"\x4c\x05" "from_")
583584
QDEF(MP_QSTR_from_bytes, (const byte*)"\x35\x0a" "from_bytes")
584585
QDEF(MP_QSTR_fromkeys, (const byte*)"\x37\x08" "fromkeys")
585586
QDEF(MP_QSTR_frozenset, (const byte*)"\xed\x09" "frozenset")
@@ -690,6 +691,7 @@ QDEF(MP_QSTR_rindex, (const byte*)"\xe9\x06" "rindex")
690691
QDEF(MP_QSTR_round, (const byte*)"\xe7\x05" "round")
691692
QDEF(MP_QSTR_rsplit, (const byte*)"\xa5\x06" "rsplit")
692693
QDEF(MP_QSTR_rstrip, (const byte*)"\x3b\x06" "rstrip")
694+
QDEF(MP_QSTR_scale, (const byte*)"\x7d\x05" "scale")
693695
QDEF(MP_QSTR_scan, (const byte*)"\x1a\x04" "scan")
694696
QDEF(MP_QSTR_sdiv, (const byte*)"\xcd\x04" "sdiv")
695697
QDEF(MP_QSTR_sep, (const byte*)"\x23\x03" "sep")
@@ -728,6 +730,7 @@ QDEF(MP_QSTR_ticks_ms, (const byte*)"\x42\x08" "ticks_ms")
728730
QDEF(MP_QSTR_ticks_us, (const byte*)"\x5a\x08" "ticks_us")
729731
QDEF(MP_QSTR_time, (const byte*)"\xf0\x04" "time")
730732
QDEF(MP_QSTR_time_pulse_us, (const byte*)"\x89\x0d" "time_pulse_us")
733+
QDEF(MP_QSTR_to, (const byte*)"\x9e\x02" "to")
731734
QDEF(MP_QSTR_to_bytes, (const byte*)"\xd8\x08" "to_bytes")
732735
QDEF(MP_QSTR_trunc, (const byte*)"\x5b\x05" "trunc")
733736
QDEF(MP_QSTR_tuple, (const byte*)"\xfd\x05" "tuple")

source/microbit/modmicrobit.cpp

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
extern "C" {
3131

3232
#include "py/nlr.h"
33-
#include "py/obj.h"
33+
#include "py/runtime.h"
3434
#include "py/mphal.h"
3535
#include "microbit/modmicrobit.h"
3636

@@ -81,6 +81,36 @@ STATIC mp_obj_t microbit_temperature(void) {
8181
}
8282
MP_DEFINE_CONST_FUN_OBJ_0(microbit_temperature_obj, microbit_temperature);
8383

84+
STATIC mp_obj_t microbit_scale(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
85+
enum { ARG_value, ARG_from_, ARG_to };
86+
static const mp_arg_t allowed_args[] = {
87+
{ MP_QSTR_value, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
88+
{ MP_QSTR_from_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
89+
{ MP_QSTR_to, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
90+
};
91+
92+
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
93+
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
94+
95+
// Extract from/to min/max arrays.
96+
mp_obj_t *from_items, *to_items;
97+
mp_obj_get_array_fixed_n(args[ARG_from_].u_obj, 2, &from_items);
98+
mp_obj_get_array_fixed_n(args[ARG_to].u_obj, 2, &to_items);
99+
100+
// Extract all float values.
101+
mp_float_t from_value = mp_obj_get_float(args[ARG_value].u_obj);
102+
mp_float_t from_min = mp_obj_get_float(from_items[0]);
103+
mp_float_t from_max = mp_obj_get_float(from_items[1]);
104+
mp_float_t to_min = mp_obj_get_float(to_items[0]);
105+
mp_float_t to_max = mp_obj_get_float(to_items[1]);
106+
107+
// Compute scaled value.
108+
mp_float_t to_value = (from_value - from_min) / (from_max - from_min) * (to_max - to_min) + to_min;
109+
110+
return mp_obj_new_float(to_value);
111+
}
112+
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(microbit_scale_obj, 0, microbit_scale);
113+
84114
STATIC const mp_map_elem_t microbit_module_globals_table[] = {
85115
{ MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_microbit) },
86116

@@ -103,6 +133,8 @@ STATIC const mp_map_elem_t microbit_module_globals_table[] = {
103133
{ MP_OBJ_NEW_QSTR(MP_QSTR_panic), (mp_obj_t)&microbit_panic_obj },
104134
{ MP_OBJ_NEW_QSTR(MP_QSTR_temperature), (mp_obj_t)&microbit_temperature_obj },
105135

136+
{ MP_OBJ_NEW_QSTR(MP_QSTR_scale), (mp_obj_t)&microbit_scale_obj },
137+
106138
{ MP_OBJ_NEW_QSTR(MP_QSTR_pin0), (mp_obj_t)&microbit_p0_obj },
107139
{ MP_OBJ_NEW_QSTR(MP_QSTR_pin1), (mp_obj_t)&microbit_p1_obj },
108140
{ MP_OBJ_NEW_QSTR(MP_QSTR_pin2), (mp_obj_t)&microbit_p2_obj },

0 commit comments

Comments
 (0)