Gugen展示版

Fork of MagneWave by kouzi osaki

Committer:
doctorura
Date:
Fri Nov 08 23:05:35 2013 +0000
Revision:
7:b0bb700d8383
Parent:
6:d3e35dd7bfc5
Child:
8:34dc92a836a3
bugfix

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 7:b0bb700d8383 18 //NVIC_SetPriority(SysTick_IRQn, 1);
doctorura 7:b0bb700d8383 19 tick.attach_us( this, &MagneWave::dacOut, 250 );
doctorura 0:5a700113dd87 20 }
doctorura 0:5a700113dd87 21
doctorura 0:5a700113dd87 22 void MagneWave::play( FILE *wavefile )
doctorura 0:5a700113dd87 23 {
doctorura 7:b0bb700d8383 24 printf("seek\n");
doctorura 0:5a700113dd87 25 // jump to wave data
doctorura 2:0fc5df933021 26 fseek( wavefile, DATA_OFFSET, SEEK_SET );
doctorura 0:5a700113dd87 27
doctorura 7:b0bb700d8383 28 printf("1\n");
doctorura 7:b0bb700d8383 29 m_dacOn = true;
doctorura 7:b0bb700d8383 30 printf("2\n");
doctorura 7:b0bb700d8383 31 m_fileEnd = false;
doctorura 7:b0bb700d8383 32
doctorura 7:b0bb700d8383 33 printf("loop\n");
doctorura 5:a1c57d771887 34 while( m_dacOn ){
doctorura 5:a1c57d771887 35 if( m_rptr != ( m_wptr + 1 ) & 0x7f ){
doctorura 6:d3e35dd7bfc5 36 #ifdef NEW_CODE
doctorura 6:d3e35dd7bfc5 37 int tmpL = 0;
doctorura 6:d3e35dd7bfc5 38 int tmpH = 0;
doctorura 6:d3e35dd7bfc5 39 long dacVal16 = 0;
doctorura 7:b0bb700d8383 40 tmpL = fgetc( wavefile );
doctorura 6:d3e35dd7bfc5 41 if( tmpL == EOF ){
doctorura 7:b0bb700d8383 42 printf("eofL\n.");
doctorura 4:8b4be75fd97a 43 m_fileEnd = true;
doctorura 4:8b4be75fd97a 44 break;
doctorura 4:8b4be75fd97a 45 }
doctorura 7:b0bb700d8383 46 tmpH = fgetc( wavefile );
doctorura 6:d3e35dd7bfc5 47 if( tmpH == EOF ){
doctorura 7:b0bb700d8383 48 printf("eofH\n.");
doctorura 6:d3e35dd7bfc5 49 m_fileEnd = true;
doctorura 6:d3e35dd7bfc5 50 break;
doctorura 6:d3e35dd7bfc5 51 }
doctorura 6:d3e35dd7bfc5 52 dacVal16 = tmpL;
doctorura 6:d3e35dd7bfc5 53 dacVal16 |= ( tmpH << 8 );
doctorura 6:d3e35dd7bfc5 54 dacVal16 += DAC16_CENTER;
doctorura 6:d3e35dd7bfc5 55 m_fifo[m_wptr]= ( unsigned short )dacVal16;
doctorura 6:d3e35dd7bfc5 56 #else
doctorura 6:d3e35dd7bfc5 57 size_t readSize = fread( (char *)m_fifo[m_wptr], 2, 1, wavefile);
doctorura 6:d3e35dd7bfc5 58 if( readSize < 1 ){
doctorura 6:d3e35dd7bfc5 59 m_fileEnd = true;
doctorura 6:d3e35dd7bfc5 60 break;
doctorura 6:d3e35dd7bfc5 61 }
doctorura 6:d3e35dd7bfc5 62 #endif
doctorura 5:a1c57d771887 63 m_wptr = ( m_wptr + 1 ) & 0x7f;
doctorura 7:b0bb700d8383 64 }else{
doctorura 7:b0bb700d8383 65 printf("full\n");
doctorura 0:5a700113dd87 66 }
doctorura 0:5a700113dd87 67 }
doctorura 7:b0bb700d8383 68 printf("off\n");
doctorura 0:5a700113dd87 69 }
doctorura 3:500b992880b3 70
doctorura 4:8b4be75fd97a 71 void MagneWave::dacOut()
doctorura 4:8b4be75fd97a 72 {
doctorura 4:8b4be75fd97a 73 if ( m_dacOn ) {
doctorura 4:8b4be75fd97a 74 if( m_rptr != m_wptr ){
doctorura 6:d3e35dd7bfc5 75 #ifdef NEW_CODE
doctorura 6:d3e35dd7bfc5 76 m_wave_DAC->write_u16( m_fifo[ m_rptr ] );
doctorura 6:d3e35dd7bfc5 77 #else
doctorura 5:a1c57d771887 78 unsigned short tmpL = ( m_fifo[ m_rptr ] >> 8) & 0x00ff;
doctorura 5:a1c57d771887 79 unsigned short tmpH = ( m_fifo[ m_rptr ] << 8) & 0xff00;
doctorura 5:a1c57d771887 80 short dacVal16 = tmpH | tmpL;
doctorura 5:a1c57d771887 81
doctorura 4:8b4be75fd97a 82 dacVal16 += DAC16_CENTER;
doctorura 4:8b4be75fd97a 83 m_wave_DAC->write_u16( dacVal16 );
doctorura 6:d3e35dd7bfc5 84 #endif
doctorura 5:a1c57d771887 85 m_rptr = ( m_rptr + 1 ) & 0x7f;
doctorura 4:8b4be75fd97a 86 }else{
doctorura 7:b0bb700d8383 87 printf("nohit r=%d,w=%d\n", m_rptr, m_wptr);
doctorura 7:b0bb700d8383 88 //printf("nh\n");
doctorura 4:8b4be75fd97a 89 if( m_fileEnd ){
doctorura 6:d3e35dd7bfc5 90 printf("eof\n");
doctorura 4:8b4be75fd97a 91 m_wptr = 0;
doctorura 4:8b4be75fd97a 92 m_rptr = 0;
doctorura 4:8b4be75fd97a 93 m_dacOn = false;
doctorura 4:8b4be75fd97a 94 m_fileEnd = false;
doctorura 4:8b4be75fd97a 95 m_wave_DAC->write_u16( DAC16_CENTER );
doctorura 4:8b4be75fd97a 96 }
doctorura 4:8b4be75fd97a 97 }
doctorura 4:8b4be75fd97a 98 }
doctorura 4:8b4be75fd97a 99 }
doctorura 4:8b4be75fd97a 100
doctorura 4:8b4be75fd97a 101