30
30
extern " C" {
31
31
32
32
#include " py/nlr.h"
33
- #include " py/obj .h"
33
+ #include " py/runtime .h"
34
34
#include " py/mphal.h"
35
35
#include " microbit/modmicrobit.h"
36
36
@@ -81,6 +81,36 @@ STATIC mp_obj_t microbit_temperature(void) {
81
81
}
82
82
MP_DEFINE_CONST_FUN_OBJ_0 (microbit_temperature_obj, microbit_temperature);
83
83
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
+
84
114
STATIC const mp_map_elem_t microbit_module_globals_table[] = {
85
115
{ MP_OBJ_NEW_QSTR (MP_QSTR___name__), MP_OBJ_NEW_QSTR (MP_QSTR_microbit) },
86
116
@@ -103,6 +133,8 @@ STATIC const mp_map_elem_t microbit_module_globals_table[] = {
103
133
{ MP_OBJ_NEW_QSTR (MP_QSTR_panic), (mp_obj_t )µbit_panic_obj },
104
134
{ MP_OBJ_NEW_QSTR (MP_QSTR_temperature), (mp_obj_t )µbit_temperature_obj },
105
135
136
+ { MP_OBJ_NEW_QSTR (MP_QSTR_scale), (mp_obj_t )µbit_scale_obj },
137
+
106
138
{ MP_OBJ_NEW_QSTR (MP_QSTR_pin0), (mp_obj_t )µbit_p0_obj },
107
139
{ MP_OBJ_NEW_QSTR (MP_QSTR_pin1), (mp_obj_t )µbit_p1_obj },
108
140
{ MP_OBJ_NEW_QSTR (MP_QSTR_pin2), (mp_obj_t )µbit_p2_obj },
0 commit comments