Merge of the 2 sound_5ms() and audio.heartbeat() functions. Perhaps will be reverted, depending on what Mike thinks of it...
This commit is contained in:
@@ -419,7 +419,7 @@ extern "C" void TC2_IRQHandler()
|
||||
dummy = TC0->TC_CHANNEL[2].TC_SR;
|
||||
(void) dummy ; // Discard value - prevents compiler warning
|
||||
|
||||
sound_5ms() ;
|
||||
AUDIO_HEARTBEAT();
|
||||
|
||||
if ( ++pre_scale >= 2 ) {
|
||||
Tenms |= 1 ; // 10 mS has passed
|
||||
|
||||
+39
-45
@@ -42,10 +42,6 @@ audioQueue::audioQueue()
|
||||
t_queueWidx = 0;
|
||||
}
|
||||
|
||||
|
||||
#define QUEUE_TONE(tf,ttl,tfi) queueTone(tf * 61 / 2, ttl * 10, tfi * 61 / 2)
|
||||
|
||||
|
||||
// heartbeat is responsibile for issueing the audio tones and general square waves
|
||||
// it is essentially the life of the class.
|
||||
// it is called every 10ms
|
||||
@@ -55,56 +51,49 @@ void audioQueue::heartbeat()
|
||||
return;
|
||||
#endif
|
||||
|
||||
if (toneTimeLeft == 0) {
|
||||
if (tonePause == 0) {
|
||||
if (t_queueRidx != t_queueWidx) {
|
||||
toneFreq = queueToneFreq[t_queueRidx];
|
||||
toneTimeLeft = queueToneLength[t_queueRidx];
|
||||
toneFreqIncr = queueToneFreqIncr[t_queueRidx];
|
||||
tonePause = queueTonePause[t_queueRidx];
|
||||
if ((toneFreq == 0) || (toneTimeLeft == 0)) {
|
||||
//SPEAKER_OFF;
|
||||
}
|
||||
if (!queueToneRepeat[t_queueRidx]--) {
|
||||
t_queueRidx = (t_queueRidx + 1) % AUDIO_QUEUE_LENGTH;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if ((tone2Freq == 0) & (tone2TimeLeft == 0)) {
|
||||
//SPEAKER_OFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((toneFreq > 0) & (toneTimeLeft > 0)) {
|
||||
QUEUE_TONE(toneFreq, toneTimeLeft, toneFreqIncr);
|
||||
}
|
||||
else if (((tone2Freq > 0) & (tone2TimeLeft > 0)) & (tonePause == 0)) {
|
||||
//second flow tone here, priority on 1st, pause of 1st not allow to start second
|
||||
QUEUE_TONE(tone2Freq, tone2TimeLeft, 0);
|
||||
}
|
||||
|
||||
if (toneTimeLeft > 0) {
|
||||
if (toneChanged) {
|
||||
toneChanged = 0;
|
||||
set_frequency(toneFreq);
|
||||
tone_start(0);
|
||||
}
|
||||
else if (toneFreqIncr && (toneTimeLeft&1) == 0) {
|
||||
toneFreq += toneFreqIncr;
|
||||
set_frequency(toneFreq);
|
||||
}
|
||||
toneTimeLeft--; //time gets counted down
|
||||
toneFreq += toneFreqIncr;
|
||||
}
|
||||
else {
|
||||
if (tonePause > 0) {
|
||||
DACC->DACC_IDR = DACC_IDR_ENDTX ; // Disable interrupt
|
||||
// SPEAKER_OFF;
|
||||
tonePause--; //time gets counted down
|
||||
}
|
||||
}
|
||||
|
||||
if (tone2TimeLeft > 0) {
|
||||
tone2TimeLeft--; //time gets counted down
|
||||
}
|
||||
else {
|
||||
if (toneTimeLeft == 0) {
|
||||
//SPEAKER_OFF;
|
||||
else if (t_queueRidx != t_queueWidx) {
|
||||
toneChanged = 1;
|
||||
toneFreq = queueToneFreq[t_queueRidx];
|
||||
toneTimeLeft = queueToneLength[t_queueRidx];
|
||||
toneFreqIncr = queueToneFreqIncr[t_queueRidx];
|
||||
tonePause = queueTonePause[t_queueRidx];
|
||||
if (!queueToneRepeat[t_queueRidx]--) {
|
||||
t_queueRidx = (t_queueRidx + 1) % AUDIO_QUEUE_LENGTH;
|
||||
}
|
||||
}
|
||||
if (tone2Pause > 0) {
|
||||
tone2Pause--; //time gets counted down
|
||||
else {
|
||||
if (tone2TimeLeft > 0) {
|
||||
if (tone2Changed) {
|
||||
tone2Changed = 0;
|
||||
set_frequency(toneFreq);
|
||||
tone_start(0);
|
||||
}
|
||||
tone2TimeLeft--; //time gets counted down
|
||||
}
|
||||
else {
|
||||
DACC->DACC_IDR = DACC_IDR_ENDTX ; // Disable interrupt
|
||||
if (tone2Pause > 0) {
|
||||
tone2Pause--; //time gets counted down
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -124,7 +113,11 @@ inline uint8_t audioQueue::getToneLength(uint8_t tLen)
|
||||
void audioQueue::play(uint8_t tFreq, uint8_t tLen, uint8_t tPause,
|
||||
uint8_t tFlags, int8_t tFreqIncr)
|
||||
{
|
||||
// tLen *= 10;
|
||||
// tPause *= 10;
|
||||
|
||||
if (tFlags & PLAY_SOUND_VARIO) {
|
||||
tone2Changed = 1;
|
||||
tone2Freq = tFreq;
|
||||
tone2TimeLeft = tLen;
|
||||
tone2Pause = tPause;
|
||||
@@ -133,6 +126,7 @@ void audioQueue::play(uint8_t tFreq, uint8_t tLen, uint8_t tPause,
|
||||
tFreq += g_eeGeneral.speakerPitch + BEEP_OFFSET; // add pitch compensator
|
||||
tLen = getToneLength(tLen);
|
||||
if (tFlags & PLAY_NOW || (!busy() && empty())) {
|
||||
toneChanged = 1;
|
||||
toneFreq = tFreq;
|
||||
toneTimeLeft = tLen;
|
||||
tonePause = tPause;
|
||||
|
||||
@@ -73,12 +73,14 @@ class audioQueue
|
||||
uint8_t t_queueRidx;
|
||||
uint8_t t_queueWidx;
|
||||
|
||||
uint8_t toneChanged;
|
||||
uint8_t toneFreq;
|
||||
int8_t toneFreqIncr;
|
||||
uint8_t toneTimeLeft;
|
||||
uint8_t tonePause;
|
||||
|
||||
// vario
|
||||
uint8_t tone2Changed;
|
||||
uint8_t tone2Freq;
|
||||
uint8_t tone2TimeLeft;
|
||||
uint8_t tone2Pause;
|
||||
|
||||
+65
-106
@@ -52,7 +52,7 @@ void audioDefevent( uint8_t e ) ;
|
||||
|
||||
extern uint32_t Master_frequency ; // TODO in a .h?
|
||||
volatile uint8_t Buzzer_count ;
|
||||
|
||||
/*
|
||||
struct t_sound_globals
|
||||
{
|
||||
uint32_t Next_freq ;
|
||||
@@ -63,7 +63,7 @@ struct t_sound_globals
|
||||
uint32_t Frequency_increment ;
|
||||
uint32_t Next_frequency_increment ;
|
||||
} Sound_g ;
|
||||
|
||||
*/
|
||||
|
||||
// Must NOT be in flash, PDC needs a RAM source.
|
||||
uint16_t Sine_values[] =
|
||||
@@ -162,22 +162,24 @@ void buzzer_sound( uint8_t time )
|
||||
void set_frequency( uint32_t frequency )
|
||||
{
|
||||
register Tc *ptc ;
|
||||
register uint32_t timer ;
|
||||
register uint32_t timer ;
|
||||
|
||||
timer = Master_frequency / (800 * frequency) ; // MCK/8 and 100 000 Hz
|
||||
if ( timer > 65535 )
|
||||
{
|
||||
timer = 65535 ;
|
||||
}
|
||||
if ( timer < 2 )
|
||||
{
|
||||
timer = 2 ;
|
||||
}
|
||||
ptc = TC0 ; // Tc block 0 (TC0-2)
|
||||
ptc->TC_CHANNEL[1].TC_CCR = TC_CCR0_CLKDIS ; // Stop clock
|
||||
ptc->TC_CHANNEL[1].TC_RC = timer ; // 100 000 Hz
|
||||
ptc->TC_CHANNEL[1].TC_RA = timer >> 1 ;
|
||||
ptc->TC_CHANNEL[1].TC_CCR = 5 ; // Enable clock and trigger it (may only need trigger)
|
||||
frequency = frequency * 61 / 2;
|
||||
|
||||
timer = Master_frequency / (800 * frequency) ; // MCK/8 and 100 000 Hz
|
||||
if ( timer > 65535 )
|
||||
{
|
||||
timer = 65535 ;
|
||||
}
|
||||
if ( timer < 2 )
|
||||
{
|
||||
timer = 2 ;
|
||||
}
|
||||
ptc = TC0 ; // Tc block 0 (TC0-2)
|
||||
ptc->TC_CHANNEL[1].TC_CCR = TC_CCR0_CLKDIS ; // Stop clock
|
||||
ptc->TC_CHANNEL[1].TC_RC = timer ; // 100 000 Hz
|
||||
ptc->TC_CHANNEL[1].TC_RA = timer >> 1 ;
|
||||
ptc->TC_CHANNEL[1].TC_CCR = 5 ; // Enable clock and trigger it (may only need trigger)
|
||||
}
|
||||
|
||||
|
||||
@@ -185,22 +187,22 @@ void set_frequency( uint32_t frequency )
|
||||
void start_timer1()
|
||||
{
|
||||
register Tc *ptc ;
|
||||
register uint32_t timer ;
|
||||
register uint32_t timer ;
|
||||
|
||||
// Enable peripheral clock TC0 = bit 23 thru TC5 = bit 28
|
||||
PMC->PMC_PCER0 |= 0x01000000L ; // Enable peripheral clock to TC1
|
||||
|
||||
timer = Master_frequency / 800000 ; // MCK/8 and 100 000 Hz
|
||||
ptc = TC0 ; // Tc block 0 (TC0-2)
|
||||
ptc->TC_BCR = 0 ; // No sync
|
||||
ptc->TC_BMR = 0 ;
|
||||
ptc->TC_CHANNEL[1].TC_CMR = 0x00008000 ; // Waveform mode
|
||||
ptc->TC_CHANNEL[1].TC_RC = timer ; // 100 000 Hz
|
||||
ptc->TC_CHANNEL[1].TC_RA = timer >> 1 ;
|
||||
ptc->TC_CHANNEL[1].TC_CMR = 0x0009C001 ; // 0000 0000 0000 1001 1100 0000 0000 0001
|
||||
timer = Master_frequency / 800000 ; // MCK/8 and 100 000 Hz
|
||||
ptc = TC0 ; // Tc block 0 (TC0-2)
|
||||
ptc->TC_BCR = 0 ; // No sync
|
||||
ptc->TC_BMR = 0 ;
|
||||
ptc->TC_CHANNEL[1].TC_CMR = 0x00008000 ; // Waveform mode
|
||||
ptc->TC_CHANNEL[1].TC_RC = timer ; // 100 000 Hz
|
||||
ptc->TC_CHANNEL[1].TC_RA = timer >> 1 ;
|
||||
ptc->TC_CHANNEL[1].TC_CMR = 0x0009C001 ; // 0000 0000 0000 1001 1100 0000 0000 0001
|
||||
// MCK/8, set @ RA, Clear @ RC waveform
|
||||
ptc->TC_CHANNEL[1].TC_CCR = 5 ; // Enable clock and trigger it (may only need trigger)
|
||||
Sound_g.Frequency = 1000 ;
|
||||
ptc->TC_CHANNEL[1].TC_CCR = 5 ; // Enable clock and trigger it (may only need trigger)
|
||||
// Sound_g.Frequency = 1000 ;
|
||||
}
|
||||
|
||||
|
||||
@@ -210,46 +212,46 @@ void start_timer1()
|
||||
// So maybe it is automatically done
|
||||
void init_dac()
|
||||
{
|
||||
register Dacc *dacptr ;
|
||||
register Dacc *dacptr ;
|
||||
|
||||
PMC->PMC_PCER0 |= 0x40000000L ; // Enable peripheral clock to DAC
|
||||
dacptr = DACC ;
|
||||
dacptr = DACC ;
|
||||
#ifdef REVB
|
||||
dacptr->DACC_MR = 0x0B000215L ; // 0000 1011 0000 0001 0000 0010 0001 0101
|
||||
dacptr->DACC_MR = 0x0B000215L ; // 0000 1011 0000 0001 0000 0010 0001 0101
|
||||
#else
|
||||
dacptr->DACC_MR = 0x0B010215L ; // 0000 1011 0000 0001 0000 0010 0001 0101
|
||||
dacptr->DACC_MR = 0x0B010215L ; // 0000 1011 0000 0001 0000 0010 0001 0101
|
||||
#endif
|
||||
#ifdef REVB
|
||||
dacptr->DACC_CHER = 1 ; // Enable channel 0
|
||||
dacptr->DACC_CHER = 1 ; // Enable channel 0
|
||||
#else
|
||||
dacptr->DACC_CHER = 2 ; // Enable channel 1
|
||||
dacptr->DACC_CHER = 2 ; // Enable channel 1
|
||||
#endif
|
||||
dacptr->DACC_CDR = 2048 ; // Half amplitude
|
||||
dacptr->DACC_CDR = 2048 ; // Half amplitude
|
||||
// Data for PDC must NOT be in flash, PDC needs a RAM source.
|
||||
#ifndef SIMU
|
||||
dacptr->DACC_TPR = (uint32_t) Sine_values ;
|
||||
dacptr->DACC_TNPR = (uint32_t) Sine_values ;
|
||||
dacptr->DACC_TPR = (uint32_t) Sine_values ;
|
||||
dacptr->DACC_TNPR = (uint32_t) Sine_values ;
|
||||
#endif
|
||||
dacptr->DACC_TCR = 50 ; // words, 100 16 bit values
|
||||
dacptr->DACC_TNCR = 50 ; // words, 100 16 bit values
|
||||
dacptr->DACC_PTCR = DACC_PTCR_TXTEN ;
|
||||
NVIC_EnableIRQ(DACC_IRQn) ;
|
||||
dacptr->DACC_TCR = 50 ; // words, 100 16 bit values
|
||||
dacptr->DACC_TNCR = 50 ; // words, 100 16 bit values
|
||||
dacptr->DACC_PTCR = DACC_PTCR_TXTEN ;
|
||||
NVIC_EnableIRQ(DACC_IRQn) ;
|
||||
}
|
||||
|
||||
extern "C" void DAC_IRQHandler()
|
||||
{
|
||||
// Data for PDC must NOT be in flash, PDC needs a RAM source.
|
||||
#ifndef SIMU
|
||||
DACC->DACC_TNPR = (uint32_t) Sine_values ;
|
||||
DACC->DACC_TNPR = (uint32_t) Sine_values ;
|
||||
#endif
|
||||
DACC->DACC_TNCR = 50 ; // words, 100 16 bit values
|
||||
if ( Sound_g.Tone_timer )
|
||||
{
|
||||
if ( --Sound_g.Tone_timer == 0 )
|
||||
{
|
||||
DACC->DACC_IDR = DACC_IDR_ENDTX ;
|
||||
}
|
||||
}
|
||||
DACC->DACC_TNCR = 50 ; // words, 100 16 bit values
|
||||
/* if ( Sound_g.Tone_timer )
|
||||
{
|
||||
if ( --Sound_g.Tone_timer == 0 )
|
||||
{
|
||||
DACC->DACC_IDR = DACC_IDR_ENDTX ;
|
||||
}
|
||||
} */
|
||||
// if ( Tone_ms_timer == 0 )
|
||||
// {
|
||||
// Tone_ms_timer = -1 ;
|
||||
@@ -259,59 +261,15 @@ extern "C" void DAC_IRQHandler()
|
||||
|
||||
void end_sound()
|
||||
{
|
||||
DACC->DACC_IDR = DACC_IDR_ENDTX ;
|
||||
NVIC_DisableIRQ(DACC_IRQn) ;
|
||||
TWI0->TWI_IDR = TWI_IDR_TXCOMP ;
|
||||
NVIC_DisableIRQ(TWI0_IRQn) ;
|
||||
PMC->PMC_PCER0 &= ~0x00080000L ; // Disable peripheral clock to TWI0
|
||||
DACC->DACC_IDR = DACC_IDR_ENDTX ;
|
||||
NVIC_DisableIRQ(DACC_IRQn) ;
|
||||
TWI0->TWI_IDR = TWI_IDR_TXCOMP ;
|
||||
NVIC_DisableIRQ(TWI0_IRQn) ;
|
||||
PMC->PMC_PCER0 &= ~0x00080000L ; // Disable peripheral clock to TWI0
|
||||
PMC->PMC_PCER0 &= ~0x40000000L ; // Disable peripheral clock to DAC
|
||||
}
|
||||
|
||||
// Called every 5mS from interrupt routine
|
||||
void sound_5ms()
|
||||
{
|
||||
if ( Sound_g.Tone_ms_timer > 0 )
|
||||
{
|
||||
Sound_g.Tone_ms_timer -= 1 ;
|
||||
}
|
||||
|
||||
if ( Sound_g.Tone_ms_timer == 0 )
|
||||
{
|
||||
if ( Sound_g.Sound_time )
|
||||
{
|
||||
Sound_g.Tone_ms_timer = ( Sound_g.Sound_time + 4 ) / 5 ;
|
||||
if ( Sound_g.Next_freq ) // 0 => silence for time
|
||||
{
|
||||
Sound_g.Frequency = Sound_g.Next_freq ;
|
||||
Sound_g.Frequency_increment = Sound_g.Next_frequency_increment ;
|
||||
set_frequency( Sound_g.Frequency ) ;
|
||||
tone_start( 0 ) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
DACC->DACC_IDR = DACC_IDR_ENDTX ; // Silence
|
||||
}
|
||||
Sound_g.Sound_time = 0 ;
|
||||
}
|
||||
else
|
||||
{
|
||||
DACC->DACC_IDR = DACC_IDR_ENDTX ; // Disable interrupt
|
||||
Sound_g.Tone_timer = 0 ;
|
||||
}
|
||||
}
|
||||
else if ( ( Sound_g.Tone_ms_timer & 1 ) == 0 ) // Every 10 mS
|
||||
{
|
||||
if ( Sound_g.Frequency )
|
||||
{
|
||||
if ( Sound_g.Frequency_increment )
|
||||
{
|
||||
Sound_g.Frequency += Sound_g.Frequency_increment ;
|
||||
set_frequency( Sound_g.Frequency ) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
// frequency in Hz, time in mS
|
||||
void playTone( uint32_t frequency, uint32_t time )
|
||||
{
|
||||
@@ -322,7 +280,8 @@ void playTone( uint32_t frequency, uint32_t time )
|
||||
// Tone_ms_timer = ( time + 4 ) / 5 ;
|
||||
// tone_start( 0 ) ;
|
||||
}
|
||||
|
||||
#endif
|
||||
/*
|
||||
uint32_t queueTone( uint32_t frequency, uint32_t time, uint32_t frequency_increment )
|
||||
{
|
||||
if ( Sound_g.Sound_time == 0 )
|
||||
@@ -334,19 +293,19 @@ uint32_t queueTone( uint32_t frequency, uint32_t time, uint32_t frequency_increm
|
||||
}
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
*/
|
||||
// Time is in milliseconds
|
||||
void tone_start( register uint32_t time )
|
||||
{
|
||||
PMC->PMC_PCER0 |= 0x40000000L ; // Enable peripheral clock to DAC
|
||||
Sound_g.Tone_timer = Sound_g.Frequency * time / 1000 ;
|
||||
DACC->DACC_IER = DACC_IER_ENDTX ;
|
||||
// Sound_g.Tone_timer = Sound_g.Frequency * time / 1000 ;
|
||||
DACC->DACC_IER = DACC_IER_ENDTX ;
|
||||
}
|
||||
|
||||
void tone_stop()
|
||||
{
|
||||
DACC->DACC_IDR = DACC_IDR_ENDTX ; // Disable interrupt
|
||||
Sound_g.Tone_timer = 0 ;
|
||||
DACC->DACC_IDR = DACC_IDR_ENDTX ; // Disable interrupt
|
||||
// Sound_g.Tone_timer = 0 ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -2093,7 +2093,7 @@ void perMain()
|
||||
|
||||
#if defined(PCBARM)
|
||||
HAPTIC_HEARTBEAT();
|
||||
AUDIO_HEARTBEAT(); // the queue processing
|
||||
// AUDIO_HEARTBEAT(); // the queue processing
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user