11// Include MicroPython API.
22#include "py/runtime.h"
33
4+ // Used to get the time in the Timer class example.
5+ #include "py/mphal.h"
6+
47// This is the function which will be called from Python as cexample.add_ints(a, b).
58STATIC mp_obj_t example_add_ints (mp_obj_t a_obj , mp_obj_t b_obj ) {
69 // 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) {
1316// Define a Python reference to the function above.
1417STATIC MP_DEFINE_CONST_FUN_OBJ_2 (example_add_ints_obj , example_add_ints );
1518
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+
1672// Define all properties of the module.
1773// Table entries are key/value pairs of the attribute name (a string)
1874// and the MicroPython object reference.
@@ -21,6 +77,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(example_add_ints_obj, example_add_ints);
2177STATIC const mp_rom_map_elem_t example_module_globals_table [] = {
2278 { MP_ROM_QSTR (MP_QSTR___name__ ), MP_ROM_QSTR (MP_QSTR_cexample ) },
2379 { 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 ) },
2481};
2582STATIC MP_DEFINE_CONST_DICT (example_module_globals , example_module_globals_table );
2683
0 commit comments