3131#include "py/runtime.h"
3232#include "py/binary.h"
3333
34+ #include "shared-module/_eve/__init__.h"
35+
3436//| :mod:`_eve` --- low-level BridgeTek EVE bindings
3537//| ================================================
3638//|
4547
4648typedef struct _mp_obj__EVE_t {
4749 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 ;
5251} mp_obj__EVE_t ;
5352
5453STATIC const mp_obj_type_t _EVE_type ;
5554
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)
6057
6158STATIC 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 );
6461 return mp_const_none ;
6562}
6663STATIC MP_DEFINE_CONST_FUN_OBJ_2 (register_obj , _register );
6764
6865STATIC 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 ));
7467 return mp_const_none ;
7568}
7669STATIC MP_DEFINE_CONST_FUN_OBJ_1 (flush_obj , _flush );
7770
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-
8771STATIC 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 );
8972 mp_buffer_info_t buffer_info ;
9073 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 );
10275 return mp_const_none ;
10376}
10477STATIC MP_DEFINE_CONST_FUN_OBJ_2 (cc_obj , _cc );
10578
106- #define C4 (self , u ) (*(uint32_t*)append((self), sizeof(uint32_t)) = (u))
107-
10879#include "mod_eve-gen.h"
10980
11081// Hand-written functions {
11182
83+ #define ADD_X (self , x ) \
84+ common_hal__eve_add(EVEHAL(self), sizeof(x), &(x));
85+
11286STATIC 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 );
11489 return mp_const_none ;
11590}
11691STATIC MP_DEFINE_CONST_FUN_OBJ_2 (cmd0_obj , _cmd0 );
11792
11893STATIC 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 );
12397 return mp_const_none ;
12498}
12599STATIC MP_DEFINE_CONST_FUN_OBJ_3 (vertex2f_obj , _vertex2f );
126100
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-
136101STATIC mp_obj_t _cmd (size_t n_args , const mp_obj_t * args ) {
137102 mp_obj_t self = args [0 ];
138103 mp_obj_t num = args [1 ];
@@ -159,7 +124,8 @@ STATIC mp_obj_t _cmd(size_t n_args, const mp_obj_t *args) {
159124 }
160125 }
161126
162- uint32_t * p = (uint32_t * )append (self , sizeof (uint32_t ) * (1 + n ));
127+ uint32_t buf [16 ];
128+ uint32_t * p = buf ;
163129 * p ++ = 0xffffff00 | mp_obj_get_int_truncated (num );
164130 mp_obj_t * a = items ;
165131 uint32_t lo ;
@@ -181,6 +147,8 @@ STATIC mp_obj_t _cmd(size_t n_args, const mp_obj_t *args) {
181147 break ;
182148 }
183149 }
150+
151+ common_hal__eve_add (EVEHAL (self ), sizeof (uint32_t ) * (1 + n ), buf );
184152 return mp_const_none ;
185153}
186154STATIC 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[] = {
190158 { MP_ROM_QSTR (MP_QSTR_cc ), MP_ROM_PTR (& cc_obj ) },
191159 { MP_ROM_QSTR (MP_QSTR_flush ), MP_ROM_PTR (& flush_obj ) },
192160 { MP_ROM_QSTR (MP_QSTR_Vertex2f ), MP_ROM_PTR (& vertex2f_obj ) },
193- { MP_ROM_QSTR (MP_QSTR_VertexFormat ), MP_ROM_PTR (& vertexformat_obj ) },
194161 { MP_ROM_QSTR (MP_QSTR_cmd ), MP_ROM_PTR (& cmd_obj ) },
195162 { MP_ROM_QSTR (MP_QSTR_cmd0 ), MP_ROM_PTR (& cmd0_obj ) },
196163 ROM_DECLS
@@ -206,10 +173,9 @@ STATIC void _EVE_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_
206173STATIC 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 ) {
207174 // mp_arg_check_num(n_args, kw_args, 1, 1, false);
208175 mp_obj__EVE_t * o = m_new_obj (mp_obj__EVE_t );
209- mp_printf (& mp_plat_print , "_EVE %p make_new\n" , o );
210176 o -> base .type = & _EVE_type ;
211- o -> n = 0 ;
212- o -> vscale = 16 ;
177+ o -> _eve . n = 0 ;
178+ o -> _eve . vscale = 16 ;
213179 return MP_OBJ_FROM_PTR (o );
214180}
215181
0 commit comments