Gugen展示版
Fork of MagneWave by
MagneWave.cpp@7:b0bb700d8383, 2013-11-08 (annotated)
- 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?
User | Revision | Line number | New 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 |