47
47
#include "py/runtime.h"
48
48
#include "py/mphal.h"
49
49
#include "modmachine.h"
50
+ #include "py/objarray.h"
50
51
#include "extmod/vfs_native.h"
51
52
52
53
53
54
typedef struct _mdac_obj_t {
54
55
mp_obj_base_t base ;
55
- int gpio_id ;
56
- dac_channel_t dac_id ;
57
- uint8_t * buffer ;
58
- size_t buf_len ;
59
- FILE * fhndl ;
60
- int noise ;
56
+ int gpio_id ;
57
+ dac_channel_t dac_id ;
58
+ uint8_t * buffer ;
59
+ size_t buf_len ;
60
+ size_t buf_ptr ;
61
+ FILE * fhndl ;
62
+ uint64_t timer_interval ;
63
+ uint8_t dac_timer_mode ;
61
64
} mdac_obj_t ;
62
65
63
66
extern int MainTaskCore ;
@@ -297,10 +300,23 @@ STATIC void dac_timer_isr(void *self_in)
297
300
else TIMERG0 .int_clr_timers .t0 = 1 ;
298
301
}
299
302
300
- uint32_t rnd = esp_random ();
301
- rnd = ((rnd & 0xff ) ^ ((rnd >> 8 ) & 0xff ) ^ ((rnd >> 16 ) & 0xff ) ^ ((rnd >> 24 ) & 0xff ));
302
- //rnd = ((rnd & 0xff) + ((rnd >> 8) & 0xff) + ((rnd >> 16) & 0xff) + ((rnd >> 24) & 0xff));
303
- dac_output_voltage (self -> dac_id , (uint8_t )rnd );
303
+ if (self -> dac_timer_mode == 1 ) {
304
+ // Generate random noise
305
+ uint32_t rnd = esp_random ();
306
+ rnd = ((rnd & 0xff ) ^ ((rnd >> 8 ) & 0xff ) ^ ((rnd >> 16 ) & 0xff ) ^ ((rnd >> 24 ) & 0xff ));
307
+ //rnd = ((rnd & 0xff) + ((rnd >> 8) & 0xff) + ((rnd >> 16) & 0xff) + ((rnd >> 24) & 0xff));
308
+ dac_output_voltage (self -> dac_id , (uint8_t )rnd );
309
+ }
310
+ else if (self -> dac_timer_mode == 2 ) {
311
+ // Output DAC values from buffer
312
+ dac_output_voltage (self -> dac_id , self -> buffer [self -> buf_ptr ]);
313
+ self -> buf_ptr ++ ;
314
+ if (self -> buf_ptr >= self -> buf_len ) {
315
+ if (trepeat ) self -> buf_ptr = 0 ;
316
+ else timer_stop = true;
317
+ }
318
+ }
319
+ else timer_stop = true;
304
320
305
321
if (timer_stop ) {
306
322
// --- Finished, all data read or ADC read error ---
@@ -335,7 +351,7 @@ STATIC esp_err_t start_dac_timer(mdac_obj_t *self)
335
351
config .counter_en = TIMER_PAUSE ;
336
352
config .alarm_en = TIMER_ALARM_EN ;
337
353
config .auto_reload = true;
338
- config .divider = 80 ; // 1 MHz
354
+ config .divider = ADC_TIMER_DIVIDER ; // 1 MHz
339
355
340
356
esp_err_t err = timer_init ((ADC_TIMER_NUM >> 1 ) & 1 , ADC_TIMER_NUM & 1 , & config );
341
357
if (err != ESP_OK ) return -1 ;
@@ -347,7 +363,7 @@ STATIC esp_err_t start_dac_timer(mdac_obj_t *self)
347
363
if (err != ESP_OK ) return -2 ;
348
364
349
365
// Configure the alarm value and the interrupt on alarm.
350
- err = timer_set_alarm_value ((ADC_TIMER_NUM >> 1 ) & 1 , ADC_TIMER_NUM & 1 , self -> noise );
366
+ err = timer_set_alarm_value ((ADC_TIMER_NUM >> 1 ) & 1 , ADC_TIMER_NUM & 1 , self -> timer_interval );
351
367
if (err != ESP_OK ) return -3 ;
352
368
353
369
// Enable timer interrupt
@@ -583,9 +599,10 @@ STATIC mp_obj_t mdac_waveform(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map
583
599
}
584
600
adc_timer_active = true;
585
601
dac_timer_active = true;
602
+ self -> dac_timer_mode = 1 ;
586
603
timer_stop = false;
587
604
if (freq < 500 || freq > 32000 ) mp_raise_ValueError ("Frequency out of range (500-32000 Hz)" );
588
- self -> noise = 1000000 / freq ;
605
+ self -> timer_interval = ( int ) ADC_TIMER_FREQ / freq ;
589
606
int err = start_dac_timer (self ) != ESP_OK ;
590
607
if (err ) {
591
608
ESP_LOGE ("DAC" , "Error starting DAC timer (%d)" , err );
@@ -644,6 +661,94 @@ STATIC mp_obj_t mdac_waveform(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map
644
661
}
645
662
STATIC MP_DEFINE_CONST_FUN_OBJ_KW (mdac_waveform_obj , 0 , mdac_waveform );
646
663
664
+ //------------------------------------------------------------------------------------------------
665
+ STATIC mp_obj_t mdac_write_buffer (mp_uint_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
666
+ enum { ARG_data , ARG_freq , ARG_mode , ARG_wait };
667
+ const mp_arg_t allowed_args [] = {
668
+ { MP_QSTR_data , MP_ARG_REQUIRED | MP_ARG_OBJ , {.u_obj = mp_const_none } },
669
+ { MP_QSTR_freq , MP_ARG_REQUIRED | MP_ARG_OBJ , {.u_obj = mp_const_none } },
670
+ { MP_QSTR_mode , MP_ARG_KW_ONLY | MP_ARG_BOOL , {.u_bool = false}},
671
+ { MP_QSTR_wait , MP_ARG_KW_ONLY | MP_ARG_BOOL , {.u_bool = false}},
672
+ };
673
+
674
+ mdac_obj_t * self = MP_OBJ_TO_PTR (pos_args [0 ]);
675
+ _is_init (self , true, false);
676
+
677
+ dac_func_stop (self );
678
+
679
+ mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
680
+ mp_arg_parse_all (n_args - 1 , pos_args + 1 , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
681
+
682
+ double freq = mp_obj_get_float (args [ARG_freq ].u_obj );
683
+ if ((freq < 0.001 ) || (freq > 18000.0 )) {
684
+ mp_raise_ValueError ("frequency out of range (0.001 - 18000 Hz)" );
685
+ }
686
+ double interv = (1.0 / freq ) * ADC_TIMER_FREQ ;
687
+
688
+ // Get arguments
689
+ bool wait = false;
690
+ trepeat = args [ARG_mode ].u_bool ;
691
+ // only wait if if not continuous mode
692
+ if (!trepeat ) wait = args [ARG_wait ].u_bool ;
693
+
694
+ adc_timer_active = true;
695
+ dac_timer_active = true;
696
+ self -> buffer = NULL ;
697
+ self -> buf_len = 0 ;
698
+ self -> buf_ptr = 0 ;
699
+
700
+ if (args [ARG_data ].u_obj != mp_const_none ) {
701
+ // Play from the provided array
702
+ if (!MP_OBJ_IS_TYPE (args [ARG_data ].u_obj , & mp_type_array )) {
703
+ adc_timer_active = false;
704
+ dac_timer_active = false;
705
+ mp_raise_ValueError ("array argument expected" );
706
+ }
707
+ mp_obj_array_t * arr = (mp_obj_array_t * )MP_OBJ_TO_PTR (args [ARG_data ].u_obj );
708
+ if (arr -> typecode != 'B' ) {
709
+ adc_timer_active = false;
710
+ dac_timer_active = false;
711
+ mp_raise_ValueError ("array argument of type 'B' expected" );
712
+ }
713
+ if (arr -> len < 1 ) {
714
+ self -> buf_len = 0 ;
715
+ adc_timer_active = false;
716
+ dac_timer_active = false;
717
+ mp_raise_ValueError ("array argument length must be >= 1" );
718
+ }
719
+ self -> buffer = arr -> items ;
720
+ if (self -> buf_len < 1 ) self -> buf_len = arr -> len ;
721
+ else if (arr -> len < self -> buf_len ) self -> buf_len = arr -> len ;
722
+ }
723
+ else {
724
+ adc_timer_active = false;
725
+ dac_timer_active = false;
726
+ mp_raise_ValueError ("array argument expected" );
727
+ }
728
+
729
+ self -> dac_timer_mode = 2 ;
730
+ self -> timer_interval = (int64_t )(round (interv ));
731
+ int err = start_dac_timer (self ) != ESP_OK ;
732
+ if (err ) {
733
+ adc_timer_active = false;
734
+ dac_timer_active = false;
735
+ self -> buffer = NULL ;
736
+ self -> buf_len = 0 ;
737
+ self -> buf_ptr = 0 ;
738
+ ESP_LOGE ("DAC" , "Error starting DAC timer (%d)" , err );
739
+ }
740
+
741
+ if (wait ) {
742
+ mp_hal_delay_ms (3 );
743
+ while (dac_timer_active ) {
744
+ mp_hal_delay_ms (3 );
745
+ }
746
+ }
747
+
748
+ return mp_const_true ;
749
+ }
750
+ STATIC MP_DEFINE_CONST_FUN_OBJ_KW (mdac_write_buffer_obj , 0 , mdac_write_buffer );
751
+
647
752
//-----------------------------------------------------------------------------------------------
648
753
STATIC mp_obj_t mdac_write_timed (mp_uint_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
649
754
enum { ARG_data , ARG_freq , ARG_mode , ARG_wait };
@@ -678,7 +783,7 @@ STATIC mp_obj_t mdac_write_timed(mp_uint_t n_args, const mp_obj_t *pos_args, mp_
678
783
679
784
mp_buffer_info_t src ;
680
785
self -> fhndl = NULL ;
681
- self -> noise = 0 ;
786
+ self -> timer_interval = 0 ;
682
787
683
788
if (MP_OBJ_IS_STR (args [ARG_data ].u_obj )) {
684
789
const char * dac_file = NULL ;
@@ -957,6 +1062,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(mdac_deinit_obj, mdac_deinit);
957
1062
STATIC const mp_rom_map_elem_t mdac_locals_dict_table [] = {
958
1063
{ MP_ROM_QSTR (MP_QSTR_write ), MP_ROM_PTR (& mdac_write_obj ) },
959
1064
{ MP_ROM_QSTR (MP_QSTR_write_timed ), MP_ROM_PTR (& mdac_write_timed_obj ) },
1065
+ { MP_ROM_QSTR (MP_QSTR_write_buffer ),MP_ROM_PTR (& mdac_write_buffer_obj ) },
960
1066
{ MP_ROM_QSTR (MP_QSTR_wavplay ), MP_ROM_PTR (& mdac_play_wav_obj ) },
961
1067
{ MP_ROM_QSTR (MP_QSTR_waveform ), MP_ROM_PTR (& mdac_waveform_obj ) },
962
1068
{ MP_ROM_QSTR (MP_QSTR_stopwave ), MP_ROM_PTR (& mdac_stopfunc_obj ) },
0 commit comments