1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-25 09:16:07 +03:00

Cleanup new beeper code. Decreases code-size, removes unneeded state BEEPER_STOP, reduces needs for some comments, removes some magic numbers, simplifies logic and improves maintainability.

This commit is contained in:
Dominic Clifton 2015-04-24 23:03:50 +02:00
parent 5c0e0952d6
commit 6360aa0dca
3 changed files with 48 additions and 59 deletions

View file

@ -42,10 +42,12 @@
#define MAX_MULTI_BEEPS 20 //size limit for 'beep_multiBeeps[]'
#define BEEPER_COMMAND_REPEAT 0xFE
#define BEEPER_COMMAND_STOP 0xFF
/* Beeper Sound Sequences: (Square wave generation)
* Sequence must end with 0xFF or 0xFE. 0xFE repeats the sequence from
* start when 0xFF stops the sound when it's completed.
* If repeat is used then BEEPER_STOP call must be used for stopping the sound.
*
* "Sound" Sequences are made so that 1st, 3rd, 5th.. are the delays how
* long the beeper is on and 2nd, 4th, 6th.. are the delays how long beeper
@ -53,59 +55,59 @@
*/
// short fast beep
static const uint8_t beep_shortBeep[] = {
10, 10, 0xFF
10, 10, BEEPER_COMMAND_STOP
};
// arming beep
static const uint8_t beep_armingBeep[] = {
30, 5, 5, 5, 0xFF
30, 5, 5, 5, BEEPER_COMMAND_STOP
};
// armed beep (first pause, then short beep)
static const uint8_t beep_armedBeep[] = {
0, 245, 10, 5, 0xFF
0, 245, 10, 5, BEEPER_COMMAND_STOP
};
// disarming beeps
static const uint8_t beep_disarmBeep[] = {
15, 5, 15, 5, 0xFF
15, 5, 15, 5, BEEPER_COMMAND_STOP
};
// beeps while stick held in disarm position (after pause)
static const uint8_t beep_disarmRepeatBeep[] = {
0, 35, 40, 5, 0xFF
0, 35, 40, 5, BEEPER_COMMAND_STOP
};
// Long beep and pause after that
static const uint8_t beep_lowBatteryBeep[] = {
25, 50, 0xFF
25, 50, BEEPER_COMMAND_STOP
};
// critical battery beep
static const uint8_t beep_critBatteryBeep[] = {
50, 2, 0xFF
50, 2, BEEPER_COMMAND_STOP
};
// single confirmation beep
static const uint8_t beep_confirmBeep[] = {
2, 20, 0xFF
2, 20, BEEPER_COMMAND_STOP
};
// transmitter-signal-lost tone
static const uint8_t beep_txLostBeep[] = {
50, 50, 0xFF
50, 50, BEEPER_COMMAND_STOP
};
// SOS morse code:
static const uint8_t beep_sos[] = {
10, 10, 10, 10, 10, 40, 40, 10, 40, 10, 40, 40, 10, 10, 10, 10, 10, 70, 0xFF
10, 10, 10, 10, 10, 40, 40, 10, 40, 10, 40, 40, 10, 10, 10, 10, 10, 70, BEEPER_COMMAND_STOP
};
// Arming when GPS is fixed
static const uint8_t beep_armedGpsFix[] = {
5, 5, 15, 5, 5, 5, 15, 30, 0xFF
5, 5, 15, 5, 5, 5, 15, 30, BEEPER_COMMAND_STOP
};
// Ready beeps. When gps has fix and copter is ready to fly.
static const uint8_t beep_readyBeep[] = {
4, 5, 4, 5, 8, 5, 15, 5, 8, 5, 4, 5, 4, 5, 0xFF
4, 5, 4, 5, 8, 5, 15, 5, 8, 5, 4, 5, 4, 5, BEEPER_COMMAND_STOP
};
// 2 fast short beeps
static const uint8_t beep_2shortBeeps[] = {
5, 5, 5, 5, 0xFF
5, 5, 5, 5, BEEPER_COMMAND_STOP
};
// 3 fast short beeps
static const uint8_t beep_3shortBeeps[] = {
5, 5, 5, 5, 5, 5, 0xFF
5, 5, 5, 5, 5, 5, BEEPER_COMMAND_STOP
};
// array used for variable # of beeps (reporting GPS sat count, etc)
static uint8_t beep_multiBeeps[MAX_MULTI_BEEPS+2];
@ -131,105 +133,79 @@ static void beeperCalculations(void);
*/
void beeper(beeperMode_e mode)
{
#ifdef GPS
uint8_t i;
#endif
// Just return if same or higher priority sound is active.
if (beeperMode <= mode)
return;
switch (mode) {
case BEEPER_STOP:
beeperMode = BEEPER_STOPPED;
beeperNextToggleTime = millis();
BEEP_OFF;
beeperIsOn = 0;
beeperPtr = NULL;
break;
case BEEPER_READY_BEEP:
beeperPtr = beep_readyBeep;
beeperMode = mode;
break;
case BEEPER_ARMING:
beeperPtr = beep_armingBeep;
beeperMode = mode;
beeperNextToggleTime = 0;
break;
case BEEPER_DISARMING:
beeperPtr = beep_disarmBeep;
beeperMode = mode;
beeperNextToggleTime = 0;
break;
case BEEPER_DISARM_REPEAT:
beeperPtr = beep_disarmRepeatBeep;
beeperMode = mode;
beeperNextToggleTime = 0;
break;
case BEEPER_ACC_CALIBRATION:
beeperPtr = beep_2shortBeeps;
beeperMode = mode;
break;
case BEEPER_ACC_CALIBRATION_FAIL:
beeperPtr = beep_3shortBeeps;
beeperMode = mode;
break;
case BEEPER_RX_LOST_LANDING:
beeperPtr = beep_sos;
beeperMode = mode;
beeperNextToggleTime = 0;
break;
case BEEPER_RX_LOST:
beeperPtr = beep_txLostBeep;
beeperMode = mode;
beeperNextToggleTime = 0;
break;
case BEEPER_BAT_LOW:
beeperPtr = beep_lowBatteryBeep;
beeperMode = mode;
beeperNextToggleTime = 0;
break;
case BEEPER_BAT_CRIT_LOW:
beeperPtr = beep_critBatteryBeep;
beeperMode = mode;
beeperNextToggleTime = 0;
break;
case BEEPER_ARMED:
beeperPtr = beep_armedBeep;
beeperMode = mode;
break;
case BEEPER_ARMING_GPS_FIX:
beeperPtr = beep_armedGpsFix;
beeperMode = mode;
beeperNextToggleTime = 0;
break;
case BEEPER_CONFIRM_BEEP:
beeperPtr = beep_confirmBeep;
beeperMode = mode;
beeperNextToggleTime = 0;
break;
case BEEPER_MULTI_BEEPS:
beeperPtr = beep_multiBeeps;
beeperMode = mode;
beeperNextToggleTime = 0;
break;
case BEEPER_RX_SET:
#ifdef GPS // if GPS fix then beep out number of satellites
#ifdef GPS
// if GPS fix then beep out number of satellites
if (feature(FEATURE_GPS) && STATE(GPS_FIX) && GPS_numSat >= 5) {
i = 0;
uint8_t i = 0;
do {
beep_multiBeeps[i++] = 5;
beep_multiBeeps[i++] = 10;
} while (i < MAX_MULTI_BEEPS && GPS_numSat > i / 2);
beep_multiBeeps[i-1] = 50; //extend last pause
beep_multiBeeps[i] = 0xFF;
beep_multiBeeps[i-1] = 50; // extend last pause
beep_multiBeeps[i] = BEEPER_COMMAND_STOP;
beeperPtr = beep_multiBeeps;
beeperMode = mode;
break;
}
#endif
beeperPtr = beep_shortBeep;
beeperMode = mode;
beeperNextToggleTime = 0;
break;
@ -237,8 +213,18 @@ void beeper(beeperMode_e mode)
return;
}
beeperPos = 0;
beeperMode = mode;
}
void beeperSilence(void)
{
beeperMode = BEEPER_STOPPED;
beeperNextToggleTime = millis();
BEEP_OFF;
beeperIsOn = 0;
beeperPtr = NULL;
beeperPos = 0;
}
/*
* Emits the given number of 20ms beeps (with 200ms spacing).
* This function returns immediately (does not block).
@ -259,7 +245,7 @@ void queueConfirmationBeep(uint8_t beepCount)
beep_multiBeeps[i++] = 2; //20ms beep
beep_multiBeeps[i++] = 20; //200ms pause
} while (i < cLimit);
beep_multiBeeps[i] = 0xFF; //sequence end
beep_multiBeeps[i] = BEEPER_COMMAND_STOP; //sequence end
beeper(BEEPER_MULTI_BEEPS); //initiate sequence
}
}
@ -281,7 +267,12 @@ void beeperUpdate(void)
return;
}
if (!beeperIsOn && beeperNextToggleTime <= millis()) {
uint32_t now = millis();
if (beeperNextToggleTime > now) {
return;
}
if (!beeperIsOn) {
beeperIsOn = 1;
if (beeperPtr[beeperPos] != 0) {
BEEP_ON;
@ -291,14 +282,14 @@ void beeperUpdate(void)
armingBeepTimeMicros = micros();
}
}
beeperCalculations();
} else if (beeperIsOn && beeperNextToggleTime <= millis()) {
} else {
beeperIsOn = 0;
if (beeperPtr[beeperPos] != 0) {
BEEP_OFF;
}
beeperCalculations();
}
beeperCalculations();
}
/*
@ -306,11 +297,9 @@ void beeperUpdate(void)
*/
void beeperCalculations(void)
{
if (beeperPtr[beeperPos] == 0xFE) {
// If sequence is 0xFE then repeat from start
if (beeperPtr[beeperPos] == BEEPER_COMMAND_REPEAT) {
beeperPos = 0;
} else if (beeperPtr[beeperPos] == 0xFF) {
// If sequence is 0xFF then stop
} else if (beeperPtr[beeperPos] == BEEPER_COMMAND_STOP) {
beeperMode = BEEPER_STOPPED;
BEEP_OFF;
beeperIsOn = 0;