LCOV - code coverage report
Current view: top level - examples/usercmodule/cexample - examplemodule.c (source / functions) Hit Total Coverage
Test: unix_coverage_v1.22.0-335-g9c7f0659e.info Lines: 12 12 100.0 %
Date: 2024-04-24 08:31:58 Functions: 3 3 100.0 %
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : // Include MicroPython API.
       2                 :            : #include "py/runtime.h"
       3                 :            : 
       4                 :            : // Used to get the time in the Timer class example.
       5                 :            : #include "py/mphal.h"
       6                 :            : 
       7                 :            : // This is the function which will be called from Python as cexample.add_ints(a, b).
       8                 :          2 : static mp_obj_t example_add_ints(mp_obj_t a_obj, mp_obj_t b_obj) {
       9                 :            :     // Extract the ints from the micropython input objects.
      10                 :          2 :     int a = mp_obj_get_int(a_obj);
      11                 :          2 :     int b = mp_obj_get_int(b_obj);
      12                 :            : 
      13                 :            :     // Calculate the addition and convert to MicroPython object.
      14                 :          2 :     return mp_obj_new_int(a + b);
      15                 :            : }
      16                 :            : // Define a Python reference to the function above.
      17                 :            : static MP_DEFINE_CONST_FUN_OBJ_2(example_add_ints_obj, example_add_ints);
      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                 :          4 : 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                 :          4 :     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                 :          4 :     mp_uint_t elapsed = mp_hal_ticks_ms() - self->start_time;
      38                 :          4 :     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                 :          2 : 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                 :          2 :     example_Timer_obj_t *self = mp_obj_malloc(example_Timer_obj_t, type);
      47                 :            : 
      48                 :            :     // Initializes the time for this Timer instance.
      49                 :          2 :     self->start_time = mp_hal_ticks_ms();
      50                 :            : 
      51                 :            :     // The make_new function always returns self.
      52                 :          2 :     return MP_OBJ_FROM_PTR(self);
      53                 :            : }
      54                 :            : 
      55                 :            : // This collects all methods and other static class attributes of the Timer.
      56                 :            : // The table structure is similar to the module table, as detailed below.
      57                 :            : static const mp_rom_map_elem_t example_Timer_locals_dict_table[] = {
      58                 :            :     { MP_ROM_QSTR(MP_QSTR_time), MP_ROM_PTR(&example_Timer_time_obj) },
      59                 :            : };
      60                 :            : static MP_DEFINE_CONST_DICT(example_Timer_locals_dict, example_Timer_locals_dict_table);
      61                 :            : 
      62                 :            : // This defines the type(Timer) object.
      63                 :            : MP_DEFINE_CONST_OBJ_TYPE(
      64                 :            :     example_type_Timer,
      65                 :            :     MP_QSTR_Timer,
      66                 :            :     MP_TYPE_FLAG_NONE,
      67                 :            :     make_new, example_Timer_make_new,
      68                 :            :     locals_dict, &example_Timer_locals_dict
      69                 :            :     );
      70                 :            : 
      71                 :            : // Define all attributes of the module.
      72                 :            : // Table entries are key/value pairs of the attribute name (a string)
      73                 :            : // and the MicroPython object reference.
      74                 :            : // All identifiers and strings are written as MP_QSTR_xxx and will be
      75                 :            : // optimized to word-sized integers by the build system (interned strings).
      76                 :            : static const mp_rom_map_elem_t example_module_globals_table[] = {
      77                 :            :     { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_cexample) },
      78                 :            :     { MP_ROM_QSTR(MP_QSTR_add_ints), MP_ROM_PTR(&example_add_ints_obj) },
      79                 :            :     { MP_ROM_QSTR(MP_QSTR_Timer),    MP_ROM_PTR(&example_type_Timer) },
      80                 :            : };
      81                 :            : static MP_DEFINE_CONST_DICT(example_module_globals, example_module_globals_table);
      82                 :            : 
      83                 :            : // Define module object.
      84                 :            : const mp_obj_module_t example_user_cmodule = {
      85                 :            :     .base = { &mp_type_module },
      86                 :            :     .globals = (mp_obj_dict_t *)&example_module_globals,
      87                 :            : };
      88                 :            : 
      89                 :            : // Register the module to make it available in Python.
      90                 :            : MP_REGISTER_MODULE(MP_QSTR_cexample, example_user_cmodule);

Generated by: LCOV version 1.15-5-g462f71d