• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pybricks / pybricks-micropython / 4552546924

pending completion
4552546924

Pull #156

github

GitHub
Merge 1c4b2f056 into 5c45c107c
Pull Request #156: Enable 1D gyro heading measurement and drivebase control

9 of 68 new or added lines in 6 files covered. (13.24%)

31 existing lines in 3 files now uncovered.

2967 of 5756 relevant lines covered (51.55%)

34317139.22 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/pybricks/geometry/pb_module_geometry.c
1
// SPDX-License-Identifier: MIT
2
// Copyright (c) 2018-2020 The Pybricks Authors
3

4
#include "py/mpconfig.h"
5

6
#if PYBRICKS_PY_GEOMETRY
7

8
#include "py/mphal.h"
9
#include "py/runtime.h"
10

11
#include <pybricks/geometry.h>
12

13
#include <pybricks/util_mp/pb_kwarg_helper.h>
14
#include <pybricks/util_mp/pb_obj_helper.h>
15
#include <pybricks/util_pb/pb_error.h>
16
#include <pybricks/util_mp/pb_type_enum.h>
17

18
STATIC const float pb_Axis_x_data[] = {1.0f, 0.0f, 0.0f};
19

20
const pb_type_Matrix_obj_t pb_Axis_X_obj = {
21
    {&pb_type_Matrix},
22
    .data = (float *)pb_Axis_x_data,
23
    .scale = 1.0f,
24
    .m = 3,
25
    .n = 1,
26
};
27

28
STATIC const float pb_Axis_y_data[] = {0.0f, 1.0f, 0.0f};
29

30
const pb_type_Matrix_obj_t pb_Axis_Y_obj = {
31
    {&pb_type_Matrix},
32
    .data = (float *)pb_Axis_y_data,
33
    .scale = 1.0f,
34
    .m = 3,
35
    .n = 1,
36
};
37

38
STATIC const float pb_Axis_z_data[] = {0.0f, 0.0f, 1.0f};
39

40
const pb_type_Matrix_obj_t pb_Axis_Z_obj = {
41
    {&pb_type_Matrix},
42
    .data = (float *)pb_Axis_z_data,
43
    .scale = 1.0f,
44
    .m = 3,
45
    .n = 1,
46
};
47

48
STATIC const float pb_Matrix_identity3_data[] = {
49
    1.0f, 0.0f, 0.0f,
50
    0.0f, 1.0f, 0.0f,
51
    0.0f, 0.0f, 1.0f,
52
};
53

54
const pb_type_Matrix_obj_t pb_Matrix_identity3_obj = {
55
    {&pb_type_Matrix},
56
    .data = (float *)pb_Matrix_identity3_data,
57
    .scale = 1.0f,
58
    .m = 3,
59
    .n = 3,
60
};
61

62
STATIC const mp_rom_map_elem_t pb_Axis_table[] = {
63
    { MP_ROM_QSTR(MP_QSTR_X),     MP_ROM_PTR(&pb_Axis_X_obj)},
64
    { MP_ROM_QSTR(MP_QSTR_Y),     MP_ROM_PTR(&pb_Axis_Y_obj)},
65
    { MP_ROM_QSTR(MP_QSTR_Z),     MP_ROM_PTR(&pb_Axis_Z_obj)},
66
};
67
STATIC MP_DEFINE_CONST_DICT(pb_type_Axis_locals_dict, pb_Axis_table);
68

69
const mp_obj_type_t pb_enum_type_Axis = {
70
    { &mp_type_type },
71
    .name = MP_QSTR_Axis,
72
    .locals_dict = (mp_obj_dict_t *)&(pb_type_Axis_locals_dict),
73
};
74

75
// pybricks.geometry.vector
76
STATIC mp_obj_t vector(size_t n_args, const mp_obj_t *args) {
×
77

78
    // Convert user object to floats
79
    float data[3];
×
80
    for (size_t i = 0; i < n_args; i++) {
×
81
        data[i] = mp_obj_get_float_to_f(args[i]);
×
82
    }
83

84
    // Create and return Matrix object with vector shape
85
    return pb_type_Matrix_make_vector(n_args, data, false);
×
86
}
87
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(pb_func_vector_obj, 2, 3, vector);
88

89
// pybricks.geometry.cross
NEW
90
STATIC mp_obj_t pb_func_cross(mp_obj_t a_in, mp_obj_t b_in) {
×
91

92
    // Get a and b vectors
NEW
93
    pb_type_Matrix_obj_t *a = MP_OBJ_TO_PTR(a_in);
×
NEW
94
    pb_type_Matrix_obj_t *b = MP_OBJ_TO_PTR(b_in);
×
95

96
    // Verify matching dimensions else raise error
NEW
97
    if (a->n * a->m != 3 || b->n * b->m != 3) {
×
NEW
98
        pb_assert(PBIO_ERROR_INVALID_ARG);
×
99
    }
100

101
    // Create c vector.
NEW
102
    pb_type_Matrix_obj_t *c = mp_obj_malloc(pb_type_Matrix_obj_t, &pb_type_Matrix);
×
NEW
103
    c->m = 3;
×
NEW
104
    c->n = 1;
×
NEW
105
    c->data = m_new(float, 3);
×
106

107
    // Evaluate cross product
NEW
108
    c->data[0] = a->data[1] * b->data[2] - a->data[2] * b->data[1];
×
NEW
109
    c->data[1] = a->data[2] * b->data[0] - a->data[0] * b->data[2];
×
NEW
110
    c->data[2] = a->data[0] * b->data[1] - a->data[1] * b->data[0];
×
NEW
111
    c->scale = a->scale * b->scale;
×
112

NEW
113
    return MP_OBJ_FROM_PTR(c);
×
114
}
115
MP_DEFINE_CONST_FUN_OBJ_2(pb_func_cross_obj, pb_func_cross);
116

117
STATIC const mp_rom_map_elem_t geometry_globals_table[] = {
118
    { MP_ROM_QSTR(MP_QSTR_Axis),        MP_ROM_PTR(&pb_enum_type_Axis)     },
119
    { MP_ROM_QSTR(MP_QSTR_Matrix),      MP_ROM_PTR(&pb_type_Matrix)        },
120
    { MP_ROM_QSTR(MP_QSTR_vector),      MP_ROM_PTR(&pb_func_vector_obj)    },
121
    { MP_ROM_QSTR(MP_QSTR_cross),       MP_ROM_PTR(&pb_func_cross_obj)     },
122
};
123
STATIC MP_DEFINE_CONST_DICT(pb_module_geometry_globals, geometry_globals_table);
124

125
const mp_obj_module_t pb_module_geometry = {
126
    .base = { &mp_type_module },
127
    .globals = (mp_obj_dict_t *)&pb_module_geometry_globals,
128
};
129

130
MP_REGISTER_MODULE(MP_QSTR_pybricks_dot_geometry, pb_module_geometry);
131

132
#endif // PYBRICKS_PY_GEOMETRY
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc