@@ -98,6 +98,8 @@ STATIC mp_obj_t protomatter_protomatter_make_new(const mp_obj_type_t *type, size
98
98
mp_raise_ValueError (translate ("No timer available" ));
99
99
}
100
100
101
+ self -> width = args [ARG_bit_width ].u_int ;
102
+ self -> bufsize = 2 * args [ARG_bit_width ].u_int * self -> rgb_count / 3 * (1 << self -> addr_count );
101
103
claim_pins (args [ARG_rgb_list ].u_obj );
102
104
claim_pins (args [ARG_addr_list ].u_obj );
103
105
common_hal_mcu_pin_claim (args [ARG_clock_pin ].u_obj );
@@ -113,27 +115,13 @@ STATIC mp_obj_t protomatter_protomatter_make_new(const mp_obj_type_t *type, size
113
115
114
116
if (stat == PROTOMATTER_OK ) {
115
117
_PM_protoPtr = & self -> core ;
116
-
117
- uint16_t * framebuffer = m_malloc (2 * 64 * 32 , 0 );
118
- for (int i = 0 ; i < 64 * 32 ; i ++ ) {
119
- int r = (i % 2 ) ^ ((i / 64 ) % 2 );
120
- framebuffer [i ] = r ? 0xf000 : 0x000f ;
121
- }
122
- for (int i = 0 ; i < 64 ; i ++ ) {
123
- framebuffer [i ] = i >> 1 ;
124
- framebuffer [64 + i ] = i << 5 ;
125
- framebuffer [128 + i ] = (i >> 1 ) << 11 ;
126
- framebuffer [192 + i ] = (i >> 1 ) | (i << 5 ) | (i >> 1 ) << 11 ;
127
- }
128
-
129
- common_hal_mcu_disable_interrupts ();
118
+ uint16_t * framebuffer = m_malloc (self -> bufsize , 0 );
119
+ common_hal_mcu_disable_interrupts ();
130
120
stat = _PM_begin (& self -> core );
131
121
_PM_convert_565_byte (& self -> core , framebuffer , 64 );
132
-
133
- // while(true) _PM_row_handler(&self->core);
134
122
common_hal_protomatter_timer_enable (self -> timer );
135
- common_hal_mcu_enable_interrupts ();
136
123
m_free (framebuffer );
124
+ common_hal_mcu_enable_interrupts ();
137
125
}
138
126
139
127
if (stat != PROTOMATTER_OK ) {
@@ -227,6 +215,7 @@ STATIC mp_obj_t protomatter_protomatter_set_paused(mp_obj_t self_in, mp_obj_t va
227
215
} else if (!paused && self -> paused ) {
228
216
_PM_resume (& self -> core );
229
217
}
218
+ self -> paused = paused ;
230
219
231
220
return mp_const_none ;
232
221
}
@@ -253,14 +242,25 @@ const mp_obj_property_t protomatter_protomatter_frame_count_obj = {
253
242
(mp_obj_t )& mp_const_none_obj },
254
243
};
255
244
245
+ STATIC mp_obj_t protomatter_protomatter_write (mp_obj_t self_in , mp_obj_t buf ) {
246
+ protomatter_protomatter_obj_t * self = (protomatter_protomatter_obj_t * )self_in ;
247
+ check_for_deinit (self );
248
+ mp_buffer_info_t bufinfo ;
249
+ mp_get_buffer_raise (buf , & bufinfo , MP_BUFFER_READ );
250
+
251
+ mp_get_index (mp_obj_get_type (buf ), bufinfo .len , MP_OBJ_NEW_SMALL_INT (self -> bufsize - 1 ), false);
252
+ _PM_convert_565_byte (& self -> core , bufinfo .buf , self -> width );
253
+ return mp_const_none ;
254
+ }
255
+ MP_DEFINE_CONST_FUN_OBJ_2 (protomatter_protomatter_write_obj , protomatter_protomatter_write );
256
+
256
257
STATIC const mp_rom_map_elem_t protomatter_protomatter_locals_dict_table [] = {
257
258
{ MP_ROM_QSTR (MP_QSTR_deinit ), MP_ROM_PTR (& protomatter_protomatter_deinit_obj ) },
258
259
{ MP_ROM_QSTR (MP_QSTR_paused ), MP_ROM_PTR (& protomatter_protomatter_paused_obj ) },
259
260
{ MP_ROM_QSTR (MP_QSTR_frame_count ), MP_ROM_PTR (& protomatter_protomatter_frame_count_obj ) },
260
- // begin (method)
261
+ { MP_ROM_QSTR ( MP_QSTR_write ), MP_ROM_PTR ( & protomatter_protomatter_write_obj ) },
261
262
// stop (method)
262
263
// resume (method)
263
- // frameCount (property)
264
264
};
265
265
STATIC MP_DEFINE_CONST_DICT (protomatter_protomatter_locals_dict , protomatter_protomatter_locals_dict_table );
266
266
0 commit comments