Gugen展示版

Fork of MagneWave by kouzi osaki

Committer:
pictus
Date:
Wed Dec 04 11:24:29 2013 +0000
Revision:
10:8b31cb1e385b
Parent:
9:486d9fde3e64
gugen????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
doctorura 0:5a700113dd87 1 #include "MagneWave.h"
doctorura 0:5a700113dd87 2
doctorura 2:0fc5df933021 3 #define DATA_OFFSET 44
doctorura 3:500b992880b3 4 #define DAC16_CENTER 32768
doctorura 2:0fc5df933021 5
doctorura 0:5a700113dd87 6 MagneWave::MagneWave( SoftMCP4922 *dac )
doctorura 0:5a700113dd87 7 {
doctorura 0:5a700113dd87 8 m_wave_DAC = dac;
doctorura 3:500b992880b3 9 m_wave_DAC->write_u16( DAC16_CENTER );
doctorura 4:8b4be75fd97a 10
doctorura 4:8b4be75fd97a 11 m_wptr = 0;
doctorura 4:8b4be75fd97a 12 m_rptr = 0;
doctorura 4:8b4be75fd97a 13 m_dacOn = false;
doctorura 4:8b4be75fd97a 14 m_fileEnd = false;
doctorura 4:8b4be75fd97a 15
doctorura 8:34dc92a836a3 16 NVIC_SetPriority(SysTick_IRQn, 1);
doctorura 8:34dc92a836a3 17 tick.attach_us( this, &MagneWave::dacOut, 125 );
doctorura 0:5a700113dd87 18 }
doctorura 0:5a700113dd87 19
doctorura 0:5a700113dd87 20 void MagneWave::play( FILE *wavefile )
doctorura 0:5a700113dd87 21 {
doctorura 0:5a700113dd87 22 // jump to wave data
doctorura 2:0fc5df933021 23 fseek( wavefile, DATA_OFFSET, SEEK_SET );
doctorura 0:5a700113dd87 24
doctorura 7:b0bb700d8383 25 m_dacOn = true;
doctorura 7:b0bb700d8383 26 m_fileEnd = false;
doctorura 7:b0bb700d8383 27
doctorura 5:a1c57d771887 28 while( m_dacOn ){
doctorura 9:486d9fde3e64 29 if( m_rptr != ( ( m_wptr + 1 ) & 0x7f ) ){
doctorura 9:486d9fde3e64 30
doctorura 9:486d9fde3e64 31 short dacVal16 = 0;
doctorura 9:486d9fde3e64 32 unsigned char tmp[2];
doctorura 9:486d9fde3e64 33
doctorura 9:486d9fde3e64 34 int ret = fread( tmp, 1, 2, wavefile);
doctorura 9:486d9fde3e64 35 if( ret < 2 ){
pictus 10:8b31cb1e385b 36 printf("eof\n\r");
doctorura 4:8b4be75fd97a 37 m_fileEnd = true;
doctorura 4:8b4be75fd97a 38 break;
doctorura 4:8b4be75fd97a 39 }
doctorura 9:486d9fde3e64 40 dacVal16 = tmp[0];
doctorura 9:486d9fde3e64 41 dacVal16 |= ( tmp[1] << 8 );
doctorura 6:d3e35dd7bfc5 42 dacVal16 += DAC16_CENTER;
doctorura 9:486d9fde3e64 43
doctorura 6:d3e35dd7bfc5 44 m_fifo[m_wptr]= ( unsigned short )dacVal16;
doctorura 5:a1c57d771887 45 m_wptr = ( m_wptr + 1 ) & 0x7f;
doctorura 0:5a700113dd87 46 }
doctorura 0:5a700113dd87 47 }
pictus 10:8b31cb1e385b 48 printf("off\n\r");
doctorura 0:5a700113dd87 49 }
doctorura 3:500b992880b3 50
doctorura 4:8b4be75fd97a 51 void MagneWave::dacOut()
doctorura 4:8b4be75fd97a 52 {
doctorura 4:8b4be75fd97a 53 if ( m_dacOn ) {
doctorura 4:8b4be75fd97a 54 if( m_rptr != m_wptr ){
doctorura 6:d3e35dd7bfc5 55 m_wave_DAC->write_u16( m_fifo[ m_rptr ] );
doctorura 5:a1c57d771887 56 m_rptr = ( m_rptr + 1 ) & 0x7f;
doctorura 4:8b4be75fd97a 57 }else{
doctorura 8:34dc92a836a3 58 //printf("nohit r=%d,w=%d\n", m_rptr, m_wptr);
doctorura 7:b0bb700d8383 59 //printf("nh\n");
doctorura 4:8b4be75fd97a 60 if( m_fileEnd ){
pictus 10:8b31cb1e385b 61 printf("eof\n\r");
doctorura 4:8b4be75fd97a 62 m_wptr = 0;
doctorura 4:8b4be75fd97a 63 m_rptr = 0;
doctorura 4:8b4be75fd97a 64 m_dacOn = false;
doctorura 4:8b4be75fd97a 65 m_fileEnd = false;
doctorura 4:8b4be75fd97a 66 m_wave_DAC->write_u16( DAC16_CENTER );
doctorura 4:8b4be75fd97a 67 }
doctorura 4:8b4be75fd97a 68 }
doctorura 4:8b4be75fd97a 69 }
doctorura 4:8b4be75fd97a 70 }
doctorura 4:8b4be75fd97a 71
doctorura 4:8b4be75fd97a 72