1
1
// Include MicroPython API.
2
2
#include "py/runtime.h"
3
3
4
+ // Used to get the time in the Timer class example.
5
+ #include "py/mphal.h"
6
+
4
7
// This is the function which will be called from Python as cexample.add_ints(a, b).
5
8
STATIC mp_obj_t example_add_ints (mp_obj_t a_obj , mp_obj_t b_obj ) {
6
9
// Extract the ints from the micropython input objects.
@@ -13,6 +16,59 @@ STATIC mp_obj_t example_add_ints(mp_obj_t a_obj, mp_obj_t b_obj) {
13
16
// Define a Python reference to the function above.
14
17
STATIC MP_DEFINE_CONST_FUN_OBJ_2 (example_add_ints_obj , example_add_ints );
15
18
19
+ // This structure represents Timer instance objects.
20
+ typedef struct _example_Timer_obj_t {
21
+ // All objects start with the base.
22
+ mp_obj_base_t base ;
23
+ // Everything below can be thought of as instance attributes, but they
24
+ // cannot be accessed by MicroPython code directly. In this example we
25
+ // store the time at which the object was created.
26
+ mp_uint_t start_time ;
27
+ } example_Timer_obj_t ;
28
+
29
+ // This is the Timer.time() method. After creating a Timer object, this
30
+ // can be called to get the time elapsed since creating the Timer.
31
+ STATIC mp_obj_t example_Timer_time (mp_obj_t self_in ) {
32
+ // The first argument is self. It is cast to the *example_Timer_obj_t
33
+ // type so we can read its attributes.
34
+ example_Timer_obj_t * self = MP_OBJ_TO_PTR (self_in );
35
+
36
+ // Get the elapsed time and return it as a MicroPython integer.
37
+ mp_uint_t elapsed = mp_hal_ticks_ms () - self -> start_time ;
38
+ return mp_obj_new_int_from_uint (elapsed );
39
+ }
40
+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (example_Timer_time_obj , example_Timer_time );
41
+
42
+ // This represents Timer.__new__ and Timer.__init__, which is called when
43
+ // the user instantiates a Timer object.
44
+ STATIC mp_obj_t example_Timer_make_new (const mp_obj_type_t * type , size_t n_args , size_t n_kw , const mp_obj_t * args ) {
45
+ // Allocates the new object and sets the type.
46
+ example_Timer_obj_t * self = m_new_obj (example_Timer_obj_t );
47
+ self -> base .type = (mp_obj_type_t * )type ;
48
+
49
+ // Initializes the time for this Timer instance.
50
+ self -> start_time = mp_hal_ticks_ms ();
51
+
52
+ // The make_new function always returns self.
53
+ return MP_OBJ_FROM_PTR (self );
54
+ }
55
+
56
+ // This collects all methods and other static class attributes of the Timer.
57
+ // The table structure is similar to the module table, as detailed below.
58
+ STATIC const mp_rom_map_elem_t example_Timer_locals_dict_table [] = {
59
+ { MP_ROM_QSTR (MP_QSTR_time ), MP_ROM_PTR (& example_Timer_time_obj ) },
60
+ };
61
+ STATIC MP_DEFINE_CONST_DICT (example_Timer_locals_dict , example_Timer_locals_dict_table );
62
+
63
+ // This defines the type(Timer) object.
64
+ MP_DEFINE_CONST_OBJ_TYPE (
65
+ example_type_Timer ,
66
+ MP_QSTR_Timer ,
67
+ MP_TYPE_FLAG_NONE ,
68
+ make_new , example_Timer_make_new ,
69
+ locals_dict , & example_Timer_locals_dict
70
+ );
71
+
16
72
// Define all properties of the module.
17
73
// Table entries are key/value pairs of the attribute name (a string)
18
74
// and the MicroPython object reference.
@@ -21,6 +77,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(example_add_ints_obj, example_add_ints);
21
77
STATIC const mp_rom_map_elem_t example_module_globals_table [] = {
22
78
{ MP_ROM_QSTR (MP_QSTR___name__ ), MP_ROM_QSTR (MP_QSTR_cexample ) },
23
79
{ MP_ROM_QSTR (MP_QSTR_add_ints ), MP_ROM_PTR (& example_add_ints_obj ) },
80
+ { MP_ROM_QSTR (MP_QSTR_Timer ), MP_ROM_PTR (& example_type_Timer ) },
24
81
};
25
82
STATIC MP_DEFINE_CONST_DICT (example_module_globals , example_module_globals_table );
26
83
0 commit comments