31
31
#include "py/runtime.h"
32
32
#include "py/binary.h"
33
33
34
+ #include "shared-module/_eve/__init__.h"
35
+
34
36
//| :mod:`_eve` --- low-level BridgeTek EVE bindings
35
37
//| ================================================
36
38
//|
45
47
46
48
typedef struct _mp_obj__EVE_t {
47
49
mp_obj_base_t base ;
48
- mp_obj_t dest [3 ]; // Own 'write' method, plus argument
49
- int vscale ; // fixed-point scaling used for Vertex2f
50
- size_t n ; // Current size of command buffer
51
- uint8_t buf [512 ]; // Command buffer
50
+ common_hal__eve_t _eve ;
52
51
} mp_obj__EVE_t ;
53
52
54
53
STATIC const mp_obj_type_t _EVE_type ;
55
54
56
- STATIC void _write (mp_obj__EVE_t * _EVE , mp_obj_t b ) {
57
- _EVE -> dest [2 ] = b ;
58
- mp_call_method_n_kw (1 , 0 , _EVE -> dest );
59
- }
55
+ #define EVEHAL (s ) \
56
+ (&((mp_obj__EVE_t*)mp_instance_cast_to_native_base((s), &_EVE_type))->_eve)
60
57
61
58
STATIC mp_obj_t _register (mp_obj_t self , mp_obj_t o ) {
62
- mp_obj__EVE_t * _EVE = mp_instance_cast_to_native_base (self , & _EVE_type );
63
- mp_load_method (o , MP_QSTR_write , _EVE -> dest );
59
+ common_hal__eve_t * eve = EVEHAL (self );
60
+ mp_load_method (o , MP_QSTR_write , eve -> dest );
64
61
return mp_const_none ;
65
62
}
66
63
STATIC MP_DEFINE_CONST_FUN_OBJ_2 (register_obj , _register );
67
64
68
65
STATIC mp_obj_t _flush (mp_obj_t self ) {
69
- mp_obj__EVE_t * _EVE = mp_instance_cast_to_native_base (self , & _EVE_type );
70
- if (_EVE -> n != 0 ) {
71
- _write (_EVE , mp_obj_new_bytearray_by_ref (_EVE -> n , _EVE -> buf ));
72
- _EVE -> n = 0 ;
73
- }
66
+ common_hal__eve_flush (EVEHAL (self ));
74
67
return mp_const_none ;
75
68
}
76
69
STATIC MP_DEFINE_CONST_FUN_OBJ_1 (flush_obj , _flush );
77
70
78
- STATIC void * append (mp_obj_t self , size_t m ) {
79
- mp_obj__EVE_t * _EVE = mp_instance_cast_to_native_base (self , & _EVE_type );
80
- if ((_EVE -> n + m ) > sizeof (_EVE -> buf ))
81
- _flush ((mp_obj_t )_EVE );
82
- uint8_t * r = _EVE -> buf + _EVE -> n ;
83
- _EVE -> n += m ;
84
- return (void * )r ;
85
- }
86
-
87
71
STATIC mp_obj_t _cc (mp_obj_t self , mp_obj_t b ) {
88
- mp_obj__EVE_t * _EVE = mp_instance_cast_to_native_base (self , & _EVE_type );
89
72
mp_buffer_info_t buffer_info ;
90
73
mp_get_buffer_raise (b , & buffer_info , MP_BUFFER_READ );
91
- if (buffer_info .len <= sizeof (_EVE -> buf )) {
92
- uint8_t * p = (uint8_t * )append (_EVE , buffer_info .len );
93
- // memcpy(p, buffer_info.buf, buffer_info.len);
94
- uint8_t * s = buffer_info .buf ;
95
- for (size_t i = 0 ; i < buffer_info .len ; i ++ )
96
- * p ++ = * s ++ ;
97
- } else {
98
- _flush (self );
99
- _write (_EVE , b );
100
- }
101
-
74
+ common_hal__eve_add (EVEHAL (self ), buffer_info .len , buffer_info .buf );
102
75
return mp_const_none ;
103
76
}
104
77
STATIC MP_DEFINE_CONST_FUN_OBJ_2 (cc_obj , _cc );
105
78
106
- #define C4 (self , u ) (*(uint32_t*)append((self), sizeof(uint32_t)) = (u))
107
-
108
79
#include "mod_eve-gen.h"
109
80
110
81
// Hand-written functions {
111
82
83
+ #define ADD_X (self , x ) \
84
+ common_hal__eve_add(EVEHAL(self), sizeof(x), &(x));
85
+
112
86
STATIC mp_obj_t _cmd0 (mp_obj_t self , mp_obj_t n ) {
113
- C4 (self , (0xffffff00 | mp_obj_get_int_truncated (n )));
87
+ uint32_t code = 0xffffff00 | mp_obj_get_int_truncated (n );
88
+ ADD_X (self , code );
114
89
return mp_const_none ;
115
90
}
116
91
STATIC MP_DEFINE_CONST_FUN_OBJ_2 (cmd0_obj , _cmd0 );
117
92
118
93
STATIC mp_obj_t _vertex2f (mp_obj_t self , mp_obj_t a0 , mp_obj_t a1 ) {
119
- mp_obj__EVE_t * _EVE = mp_instance_cast_to_native_base (self , & _EVE_type );
120
- int16_t x = (int16_t )(_EVE -> vscale * mp_obj_get_float (a0 ));
121
- int16_t y = (int16_t )(_EVE -> vscale * mp_obj_get_float (a1 ));
122
- C4 (self , (0x40000000 | ((x & 32767 ) << 15 ) | (y & 32767 )));
94
+ mp_float_t x = mp_obj_get_float (a0 );
95
+ mp_float_t y = mp_obj_get_float (a1 );
96
+ common_hal__eve_Vertex2f (EVEHAL (self ), x , y );
123
97
return mp_const_none ;
124
98
}
125
99
STATIC MP_DEFINE_CONST_FUN_OBJ_3 (vertex2f_obj , _vertex2f );
126
100
127
- STATIC mp_obj_t _vertexformat (mp_obj_t self , mp_obj_t a0 ) {
128
- mp_obj__EVE_t * _EVE = mp_instance_cast_to_native_base (self , & _EVE_type );
129
- uint32_t frac = mp_obj_get_int_truncated (a0 );
130
- C4 (self , ((0x27 << 24 ) | (frac & 3 )));
131
- _EVE -> vscale = 1 << frac ;
132
- return mp_const_none ;
133
- }
134
- STATIC MP_DEFINE_CONST_FUN_OBJ_2 (vertexformat_obj , _vertexformat );
135
-
136
101
STATIC mp_obj_t _cmd (size_t n_args , const mp_obj_t * args ) {
137
102
mp_obj_t self = args [0 ];
138
103
mp_obj_t num = args [1 ];
@@ -159,7 +124,8 @@ STATIC mp_obj_t _cmd(size_t n_args, const mp_obj_t *args) {
159
124
}
160
125
}
161
126
162
- uint32_t * p = (uint32_t * )append (self , sizeof (uint32_t ) * (1 + n ));
127
+ uint32_t buf [16 ];
128
+ uint32_t * p = buf ;
163
129
* p ++ = 0xffffff00 | mp_obj_get_int_truncated (num );
164
130
mp_obj_t * a = items ;
165
131
uint32_t lo ;
@@ -181,6 +147,8 @@ STATIC mp_obj_t _cmd(size_t n_args, const mp_obj_t *args) {
181
147
break ;
182
148
}
183
149
}
150
+
151
+ common_hal__eve_add (EVEHAL (self ), sizeof (uint32_t ) * (1 + n ), buf );
184
152
return mp_const_none ;
185
153
}
186
154
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (cmd_obj , 4 , 4 , _cmd );
@@ -190,7 +158,6 @@ STATIC const mp_rom_map_elem_t _EVE_locals_dict_table[] = {
190
158
{ MP_ROM_QSTR (MP_QSTR_cc ), MP_ROM_PTR (& cc_obj ) },
191
159
{ MP_ROM_QSTR (MP_QSTR_flush ), MP_ROM_PTR (& flush_obj ) },
192
160
{ MP_ROM_QSTR (MP_QSTR_Vertex2f ), MP_ROM_PTR (& vertex2f_obj ) },
193
- { MP_ROM_QSTR (MP_QSTR_VertexFormat ), MP_ROM_PTR (& vertexformat_obj ) },
194
161
{ MP_ROM_QSTR (MP_QSTR_cmd ), MP_ROM_PTR (& cmd_obj ) },
195
162
{ MP_ROM_QSTR (MP_QSTR_cmd0 ), MP_ROM_PTR (& cmd0_obj ) },
196
163
ROM_DECLS
@@ -206,10 +173,9 @@ STATIC void _EVE_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_
206
173
STATIC mp_obj_t _EVE_make_new (const mp_obj_type_t * type , size_t n_args , const mp_obj_t * args , mp_map_t * kw_args ) {
207
174
// mp_arg_check_num(n_args, kw_args, 1, 1, false);
208
175
mp_obj__EVE_t * o = m_new_obj (mp_obj__EVE_t );
209
- mp_printf (& mp_plat_print , "_EVE %p make_new\n" , o );
210
176
o -> base .type = & _EVE_type ;
211
- o -> n = 0 ;
212
- o -> vscale = 16 ;
177
+ o -> _eve . n = 0 ;
178
+ o -> _eve . vscale = 16 ;
213
179
return MP_OBJ_FROM_PTR (o );
214
180
}
215
181
0 commit comments