Gugen展示版

Fork of MagneWave by kouzi osaki

Committer:
doctorura
Date:
Fri Nov 08 06:45:53 2013 +0000
Revision:
6:d3e35dd7bfc5
Parent:
5:a1c57d771887
Child:
7:b0bb700d8383
change irq setting.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
doctorura 0:5a700113dd87 1 #include "MagneWave.h"
doctorura 0:5a700113dd87 2
doctorura 6:d3e35dd7bfc5 3
doctorura 2:0fc5df933021 4 #define DATA_OFFSET 44
doctorura 3:500b992880b3 5 #define DAC16_CENTER 32768
doctorura 6:d3e35dd7bfc5 6 #define NEW_CODE
doctorura 2:0fc5df933021 7
doctorura 0:5a700113dd87 8 MagneWave::MagneWave( SoftMCP4922 *dac )
doctorura 0:5a700113dd87 9 {
doctorura 0:5a700113dd87 10 m_wave_DAC = dac;
doctorura 3:500b992880b3 11 m_wave_DAC->write_u16( DAC16_CENTER );
doctorura 4:8b4be75fd97a 12
doctorura 4:8b4be75fd97a 13 m_wptr = 0;
doctorura 4:8b4be75fd97a 14 m_rptr = 0;
doctorura 4:8b4be75fd97a 15 m_dacOn = false;
doctorura 4:8b4be75fd97a 16 m_fileEnd = false;
doctorura 4:8b4be75fd97a 17
doctorura 6:d3e35dd7bfc5 18 NVIC_SetPriority(SysTick_IRQn, 1);
doctorura 4:8b4be75fd97a 19 tick.attach_us( this, &MagneWave::dacOut, 125 );
doctorura 0:5a700113dd87 20 }
doctorura 0:5a700113dd87 21
doctorura 0:5a700113dd87 22 void MagneWave::play( FILE *wavefile )
doctorura 0:5a700113dd87 23 {
doctorura 6:d3e35dd7bfc5 24 m_wptr = 0;
doctorura 6:d3e35dd7bfc5 25 m_rptr = 0;
doctorura 4:8b4be75fd97a 26 m_dacOn = true;
doctorura 4:8b4be75fd97a 27 m_fileEnd = false;
doctorura 0:5a700113dd87 28
doctorura 0:5a700113dd87 29 // jump to wave data
doctorura 2:0fc5df933021 30 fseek( wavefile, DATA_OFFSET, SEEK_SET );
doctorura 0:5a700113dd87 31
doctorura 5:a1c57d771887 32 while( m_dacOn ){
doctorura 5:a1c57d771887 33 if( m_rptr != ( m_wptr + 1 ) & 0x7f ){
doctorura 6:d3e35dd7bfc5 34 #ifdef NEW_CODE
doctorura 6:d3e35dd7bfc5 35 int tmpL = 0;
doctorura 6:d3e35dd7bfc5 36 int tmpH = 0;
doctorura 6:d3e35dd7bfc5 37 long dacVal16 = 0;
doctorura 6:d3e35dd7bfc5 38 tmpL = fgetc( m_wavefile );
doctorura 6:d3e35dd7bfc5 39 if( tmpL == EOF ){
doctorura 4:8b4be75fd97a 40 m_fileEnd = true;
doctorura 4:8b4be75fd97a 41 break;
doctorura 4:8b4be75fd97a 42 }
doctorura 6:d3e35dd7bfc5 43 tmpH = fgetc( m_wavefile );
doctorura 6:d3e35dd7bfc5 44 if( tmpH == EOF ){
doctorura 6:d3e35dd7bfc5 45 m_fileEnd = true;
doctorura 6:d3e35dd7bfc5 46 break;
doctorura 6:d3e35dd7bfc5 47 }
doctorura 6:d3e35dd7bfc5 48 dacVal16 = tmpL;
doctorura 6:d3e35dd7bfc5 49 dacVal16 |= ( tmpH << 8 );
doctorura 6:d3e35dd7bfc5 50 dacVal16 += DAC16_CENTER;
doctorura 6:d3e35dd7bfc5 51 m_fifo[m_wptr]= ( unsigned short )dacVal16;
doctorura 6:d3e35dd7bfc5 52 #else
doctorura 6:d3e35dd7bfc5 53 size_t readSize = fread( (char *)m_fifo[m_wptr], 2, 1, wavefile);
doctorura 6:d3e35dd7bfc5 54 if( readSize < 1 ){
doctorura 6:d3e35dd7bfc5 55 m_fileEnd = true;
doctorura 6:d3e35dd7bfc5 56 break;
doctorura 6:d3e35dd7bfc5 57 }
doctorura 6:d3e35dd7bfc5 58 #endif
doctorura 5:a1c57d771887 59 m_wptr = ( m_wptr + 1 ) & 0x7f;
doctorura 0:5a700113dd87 60 }
doctorura 0:5a700113dd87 61 }
doctorura 0:5a700113dd87 62 }
doctorura 3:500b992880b3 63
doctorura 4:8b4be75fd97a 64 void MagneWave::dacOut()
doctorura 4:8b4be75fd97a 65 {
doctorura 4:8b4be75fd97a 66 if ( m_dacOn ) {
doctorura 4:8b4be75fd97a 67 if( m_rptr != m_wptr ){
doctorura 6:d3e35dd7bfc5 68 #ifdef NEW_CODE
doctorura 6:d3e35dd7bfc5 69 m_wave_DAC->write_u16( m_fifo[ m_rptr ] );
doctorura 6:d3e35dd7bfc5 70 #else
doctorura 5:a1c57d771887 71 unsigned short tmpL = ( m_fifo[ m_rptr ] >> 8) & 0x00ff;
doctorura 5:a1c57d771887 72 unsigned short tmpH = ( m_fifo[ m_rptr ] << 8) & 0xff00;
doctorura 5:a1c57d771887 73 short dacVal16 = tmpH | tmpL;
doctorura 5:a1c57d771887 74
doctorura 4:8b4be75fd97a 75 dacVal16 += DAC16_CENTER;
doctorura 4:8b4be75fd97a 76 m_wave_DAC->write_u16( dacVal16 );
doctorura 6:d3e35dd7bfc5 77 #endif
doctorura 5:a1c57d771887 78 m_rptr = ( m_rptr + 1 ) & 0x7f;
doctorura 4:8b4be75fd97a 79 }else{
doctorura 6:d3e35dd7bfc5 80 printf("nohit\n");
doctorura 4:8b4be75fd97a 81 if( m_fileEnd ){
doctorura 6:d3e35dd7bfc5 82 printf("eof\n");
doctorura 4:8b4be75fd97a 83 m_wptr = 0;
doctorura 4:8b4be75fd97a 84 m_rptr = 0;
doctorura 4:8b4be75fd97a 85 m_dacOn = false;
doctorura 4:8b4be75fd97a 86 m_fileEnd = false;
doctorura 4:8b4be75fd97a 87 m_wave_DAC->write_u16( DAC16_CENTER );
doctorura 4:8b4be75fd97a 88 }
doctorura 4:8b4be75fd97a 89 }
doctorura 4:8b4be75fd97a 90 }
doctorura 4:8b4be75fd97a 91 }
doctorura 4:8b4be75fd97a 92
doctorura 4:8b4be75fd97a 93