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

Current consumption may depend on 3 different sources

Flash saving in FrSky code
SD card wav player (still read as raw 12000Hz 16bit samples)
This commit is contained in:
bsongis 2012-06-26 10:09:31 +00:00
parent 61bbfd6e7c
commit 5dd7c105b6
29 changed files with 1285 additions and 905 deletions

View file

@ -96,7 +96,7 @@ But in Dynamic Task Scheduling model(1),task resources will be recovered.
If in Static Task Scheduling model(0),mutex module can not be used, as this model don't
support to change task priority while CoOS running.
*/
#define CFG_TASK_SCHEDULE_EN (0)
#define CFG_TASK_SCHEDULE_EN (1)
/*---------------------- Task Management Config -----------------------------*/
@ -232,7 +232,7 @@ Enable(1) or disable(0) flag management.
Max number of flag is 32.
*/
#if CFG_TASK_WAITTING_EN > 0
#define CFG_FLAG_EN (0)
#define CFG_FLAG_EN (1)
#endif
@ -242,7 +242,7 @@ Enable(1) or disable(0) mutex management.
*/
#if CFG_TASK_WAITTING_EN > 0
#if CFG_TASK_SCHEDULE_EN > 0
#define CFG_MUTEX_EN (0)
#define CFG_MUTEX_EN (1)
#endif
#endif

View file

@ -333,7 +333,7 @@ ifeq ($(PCB), ARM)
EXTRAINCDIRS += ersky9x CoOS/kernel CoOS/portable
BOARDSRC = board_ersky9x.cpp
SRC += ersky9x/core_cm3.c ersky9x/board_lowlevel.c ersky9x/crt.c ersky9x/vectors_sam3s.c
SRC += CoOS/kernel/core.c CoOS/kernel/hook.c CoOS/kernel/task.c CoOS/kernel/event.c CoOS/kernel/time.c CoOS/kernel/timer.c CoOS/kernel/serviceReq.c CoOS/portable/GCC/port.c CoOS/portable/arch.c
SRC += CoOS/kernel/core.c CoOS/kernel/hook.c CoOS/kernel/task.c CoOS/kernel/event.c CoOS/kernel/time.c CoOS/kernel/timer.c CoOS/kernel/flag.c CoOS/kernel/mutex.c CoOS/kernel/serviceReq.c CoOS/portable/GCC/port.c CoOS/portable/arch.c
SRC += FatFs/ff.c FatFs/fattime.c FatFs/option/ccsbcs.c ersky9x/diskio.c
EEPROMSRC = eeprom_arm.cpp
PULSESSRC = pulses_arm.cpp
@ -632,7 +632,7 @@ FOXLIB=-L/usr/local/lib \
-Wl,-rpath,$(FOXPATH)/src/.libs
simu: stamp_header $(BOARDSRC) $(CPPSRC) Makefile simu.cpp simpgmspace.cpp *.h *.lbm eeprom.bin
g++ simu.cpp $(CPPFLAGS) $(BOARDSRC) $(CPPSRC) simpgmspace.cpp $(ARCH) -MD -DSIMU -o simu $(FOXINC) $(FOXLIB) -pthread
g++ $(CPPFLAGS) simu.cpp $(BOARDSRC) $(CPPSRC) simpgmspace.cpp $(ARCH) -MD -DSIMU -o simu $(FOXINC) $(FOXLIB) -pthread
eeprom.bin:
dd if=/dev/zero of=$@ bs=1 count=2048
@ -719,6 +719,7 @@ clean_list :
$(REMOVE) $(SRC:.c=.s)
$(REMOVE) *.o
$(REMOVE) */*.o
$(REMOVE) */*/*.o
$(REMOVE) *.d
$(REMOVE) *.lst
$(REMOVE) allsrc.cpp

View file

@ -60,7 +60,6 @@ extern void beep(uint8_t val);
#define AUDIO_KEYPAD_UP() beep(0)
#define AUDIO_KEYPAD_DOWN() beep(0)
#define AUDIO_MENUS() beep(0)
#define AUDIO_TRIM() beep(1)
#define AUDIO_WARNING2() beep(2)
#define AUDIO_WARNING1() beep(3)
#define AUDIO_ERROR() beep(4)
@ -76,7 +75,9 @@ extern void beep(uint8_t val);
#define AUDIO_POT_STICK_MIDDLE() beep(2)
#define AUDIO_VARIO_UP() _beep(1)
#define AUDIO_VARIO_DOWN() _beep(1)
#define AUDIO_TRIM_MIDDLE(f) beep(2)
#define AUDIO_TRIM(event, f) { if (event & _MSK_KEY_REPT) warble = true; beep(1); }
#define AUDIO_TRIM_MIDDLE(f) beep(2)
#define AUDIO_PLAY(p) beep(3)
#define IS_AUDIO_BUSY() (g_beepCnt || beepAgain || beepOn)

View file

@ -727,7 +727,7 @@ void board_init()
__enable_irq() ;
start_sound() ;
startSound() ;
eeprom_init();

View file

@ -920,14 +920,9 @@ const pm_char * eeBackupModel(uint8_t i_fileSrc)
DIR archiveFolder;
UINT written;
FRESULT result = f_mount(0, &g_FATFS_Obj);
if (result != FR_OK) {
return SDCARD_ERROR(result);
}
// check and create folder here
strcpy(buf, STR_MODELS_PATH);
result = f_opendir(&archiveFolder, buf);
FRESULT result = f_opendir(&archiveFolder, buf);
if (result != FR_OK) {
result = f_mkdir(buf);
if (result != FR_OK)
@ -995,17 +990,12 @@ const pm_char * eeRestoreModel(uint8_t i_fileDst, char *model_name)
FIL restoreFile;
UINT read;
FRESULT result = f_mount(0, &g_FATFS_Obj);
if (result != FR_OK) {
return SDCARD_ERROR(result);
}
strcpy(buf, STR_MODELS_PATH);
buf[sizeof(MODELS_PATH)-1] = '/';
strcpy(&buf[sizeof(MODELS_PATH)], model_name);
strcpy(&buf[strlen(buf)], STR_MODELS_EXT);
result = f_open(&restoreFile, buf, FA_OPEN_EXISTING | FA_READ);
FRESULT result = f_open(&restoreFile, buf, FA_OPEN_EXISTING | FA_READ);
if (result != FR_OK) {
return SDCARD_ERROR(result);
}

View file

@ -33,7 +33,30 @@
#include "../open9x.h"
audioQueue::audioQueue()
uint8_t audioState = 0;
uint8_t t_queueRidx;
uint8_t t_queueWidx;
uint8_t toneFreq;
//int8_t toneFreqIncr;
uint8_t toneTimeLeft;
uint8_t tonePause;
uint8_t tone2Freq;
uint8_t tone2TimeLeft;
uint8_t tone2Pause;
char toneWavFile[32+1] = "";
// queue arrays
uint8_t queueToneFreq[AUDIO_QUEUE_LENGTH];
// int8_t queueToneFreqIncr[AUDIO_QUEUE_LENGTH];
uint8_t queueToneLength[AUDIO_QUEUE_LENGTH];
uint8_t queueTonePause[AUDIO_QUEUE_LENGTH];
uint8_t queueToneRepeat[AUDIO_QUEUE_LENGTH];
void audioInit()
{
toneTimeLeft = 0;
tonePause = 0;
@ -42,80 +65,105 @@ audioQueue::audioQueue()
t_queueWidx = 0;
}
// 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
void audioQueue::heartbeat()
void audioTimerHandle(void)
{
#if defined(SIMU)
return;
#endif
CoSetFlag(audioFlag);
}
if (toneTimeLeft > 0) {
if (toneChanged) {
toneChanged = 0;
set_frequency(toneFreq * 61 / 2);
if(toneRateLimit == 0){ //only start if within rate limit
if(toneFreq == 0){
tone_stop();
} else {
tone_start(0);
}
}
toneRateLimit++; //count up the rate limit
if(toneRateLimit == TONE1_RATE_LIMIT){ //reset the rate limit
toneRateLimit = 0;
}
// TODO Should be here!
extern uint16_t Sine_values[];
void audioTask(void* pdata)
{
static FIL wavFile;
while (1) {
CoWaitForSingleFlag(audioFlag, 0);
audioState = 1; // TODO #define
if (toneWavFile[0]) {
FRESULT result = FR_OK;
uint16_t bufsize = 2*WAV_BUFFER_SIZE;
uint16_t * bufdata = wavSamplesBuffer;
if (toneWavFile[1]) {
result = f_open(&wavFile, toneWavFile, FA_OPEN_EXISTING | FA_READ);
toneWavFile[1] = '\0';
bufdata = wavSamplesArray;
bufsize = 4*WAV_BUFFER_SIZE;
register Dacc *dacptr = DACC;
dacptr->DACC_TPR = (uint32_t)wavSamplesArray;
wavSamplesBuffer = wavSamplesArray + WAV_BUFFER_SIZE;
dacptr->DACC_TNPR = (uint32_t)wavSamplesBuffer;
dacptr->DACC_TCR = WAV_BUFFER_SIZE/2;
dacptr->DACC_TNCR = WAV_BUFFER_SIZE/2;
setFrequency(12000);
toneStart();
}
UINT read;
if (result != FR_OK || f_read(&wavFile, (uint8_t *)bufdata, bufsize, &read) != FR_OK || read != bufsize) {
f_close(&wavFile);
toneWavFile[0] = '\0';
toneStop();
}
#if 1
else {
read /= 2;
for (uint32_t i=0; i<read; i++) {
bufdata[i] = ((uint16_t)0x8000 + ((int16_t)(bufdata[i]))) >> 4;
}
}
#endif
}
else if (toneFreqIncr && (toneTimeLeft&1) == 0) {
toneFreq += toneFreqIncr;
set_frequency(toneFreq * 61 / 2);
else if (toneTimeLeft > 0) {
CoSetTmrCnt(audioTimer, toneTimeLeft, 0);
toneTimeLeft = 0;
// TODO function for that ...
DACC->DACC_TPR = (uint32_t) Sine_values ;
DACC->DACC_TCR = 50 ; // words, 100 16 bit values
DACC->DACC_TNPR = (uint32_t) Sine_values ;
DACC->DACC_TNCR = 50 ; // words, 100 16 bit values
setFrequency(toneFreq * 6100 / 2);
toneStart();
CoStartTmr(audioTimer);
}
toneTimeLeft--; //time gets counted down
}
else {
if (tonePause > 0) {
tone_stop();
toneRateLimit = 0; //reset rate limit
tonePause--; //time gets counted down
else if (tonePause > 0) {
CoSetTmrCnt(audioTimer, tonePause, 0);
tonePause = 0;
toneStop();
CoStartTmr(audioTimer);
}
else if (t_queueRidx != t_queueWidx) {
toneChanged = 1;
toneFreq = queueToneFreq[t_queueRidx];
toneTimeLeft = queueToneLength[t_queueRidx];
toneFreqIncr = queueToneFreqIncr[t_queueRidx];
// TODO ? toneFreqIncr = queueToneFreqIncr[t_queueRidx];
tonePause = queueTonePause[t_queueRidx];
if (!queueToneRepeat[t_queueRidx]--) {
t_queueRidx = (t_queueRidx + 1) % AUDIO_QUEUE_LENGTH;
}
CoSetFlag(audioFlag);
}
else if (tone2TimeLeft > 0) {
CoSetTmrCnt(audioTimer, tone2TimeLeft, 0);
tone2TimeLeft = 0;
// TODO function for that ...
DACC->DACC_TPR = (uint32_t) Sine_values ;
DACC->DACC_TCR = 50 ; // words, 100 16 bit values
DACC->DACC_TNPR = (uint32_t) Sine_values ;
DACC->DACC_TNCR = 50 ; // words, 100 16 bit values
setFrequency(tone2Freq * 6100 / 2);
toneStart();
CoStartTmr(audioTimer);
}
else {
if (tone2TimeLeft > 0) {
if (tone2Changed) {
tone2Changed = 0;
set_frequency(tone2Freq * 61 / 2);
if(tone2RateLimit == 0){ //only start if within rate limit
tone_start(0);
}
}
tone2TimeLeft--; //time gets counted down
tone2RateLimit++; //count up the rate limit
if(tone2RateLimit == TONE2_RATE_LIMIT){ //reset the rate limit
tone2RateLimit = 0;
}
}
else {
tone_stop();
tone2RateLimit = 0; //reset rate limit
if (tone2Pause > 0) {
tone2Pause--; //time gets counted down
}
}
audioState = 0;
toneStop();
}
}
}
inline uint8_t audioQueue::getToneLength(uint8_t tLen)
inline uint8_t getToneLength(uint8_t tLen)
{
uint8_t result = tLen; // default
if (g_eeGeneral.beeperLength < 0) {
@ -127,32 +175,33 @@ inline uint8_t audioQueue::getToneLength(uint8_t tLen)
return result;
}
void audioQueue::pause(uint8_t tLen)
void pause(uint8_t tLen)
{
play(0, tLen, 5); // a pause
play(0, 0, tLen); // a pause
}
void audioQueue::play(uint8_t tFreq, uint8_t tLen, uint8_t tPause,
void play(uint8_t tFreq, uint8_t tLen, uint8_t tPause,
uint8_t tFlags, int8_t tFreqIncr)
{
if (tFlags & PLAY_SOUND_VARIO) {
tone2Changed = 1;
tone2Freq = tFreq;
tone2TimeLeft = tLen;
tone2Pause = tPause;
if (audioState == 0) CoSetFlag(audioFlag);
}
else {
if (tFreq > 0) { //we dont add pitch if zero as this is a pause only event
tFreq += g_eeGeneral.speakerPitch + BEEP_OFFSET; // add pitch compensator
}
tLen = getToneLength(tLen);
if (tFlags & PLAY_NOW || (!busy() && empty())) {
toneChanged = 1;
if ((tFlags & PLAY_NOW) || audioState == 0) {
toneWavFile[0] = '\0';
toneFreq = tFreq;
toneTimeLeft = tLen;
tonePause = tPause;
toneFreqIncr = tFreqIncr;
// toneFreqIncr = tFreqIncr;
t_queueWidx = t_queueRidx;
CoSetFlag(audioFlag);
}
else {
tFlags++;
@ -166,14 +215,20 @@ void audioQueue::play(uint8_t tFreq, uint8_t tLen, uint8_t tPause,
queueToneLength[t_queueWidx] = tLen;
queueTonePause[t_queueWidx] = tPause;
queueToneRepeat[t_queueWidx] = tFlags - 1;
queueToneFreqIncr[t_queueWidx] = tFreqIncr;
// queueToneFreqIncr[t_queueWidx] = tFreqIncr;
t_queueWidx = next_queueWidx;
}
}
}
}
void audioQueue::event(uint8_t e, uint8_t f)
void playFile(const char *filename)
{
strcpy(toneWavFile, filename);
CoSetFlag(audioFlag);
}
void audioEvent(uint8_t e, uint8_t f)
{
#ifdef HAPTIC
haptic.event(e); //do this before audio to help sync timings
@ -185,7 +240,7 @@ void audioQueue::event(uint8_t e, uint8_t f)
}
if (g_eeGeneral.beeperMode>0 || (g_eeGeneral.beeperMode==0 && e>=AU_TRIM_MOVE) || (g_eeGeneral.beeperMode>=-1 && e<=AU_ERROR)) {
if (e < AU_FRSKY_FIRST || empty()) {
if (e < AU_FRSKY_FIRST || audioEmpty()) {
switch (e) {
// inactivity timer alert
case AU_INACTIVITY:
@ -193,7 +248,7 @@ void audioQueue::event(uint8_t e, uint8_t f)
break;
// low battery in tx
case AU_TX_BATTERY_LOW:
if (empty()) {
if (audioEmpty()) {
play(60, 40, 6, 2, 1);
play(80, 40, 6, 2, -1);
}
@ -343,8 +398,3 @@ void audioQueue::event(uint8_t e, uint8_t f)
}
}
}
void audioDefevent(uint8_t e)
{
audio.event(e, BEEP_DEFAULT_FREQ);
}

View file

@ -43,91 +43,72 @@
#define TONE1_RATE_LIMIT (10)
#define TONE2_RATE_LIMIT (10)
class audioQueue
extern uint8_t t_queueRidx;
extern uint8_t t_queueWidx;
extern uint8_t toneFreq;
//int8_t toneFreqIncr;
extern uint8_t toneTimeLeft;
extern uint8_t tonePause;
extern char toneWavFile[32+1];
// vario
extern uint8_t tone2Freq;
extern uint8_t tone2TimeLeft;
extern uint8_t tone2Pause;
// queue arrays
extern uint8_t queueToneFreq[AUDIO_QUEUE_LENGTH];
// int8_t queueToneFreqIncr[AUDIO_QUEUE_LENGTH];
extern uint8_t queueToneLength[AUDIO_QUEUE_LENGTH];
extern uint8_t queueTonePause[AUDIO_QUEUE_LENGTH];
extern uint8_t queueToneRepeat[AUDIO_QUEUE_LENGTH];
void initAudio();
void play(uint8_t tFreq, uint8_t tLen, uint8_t tPause, uint8_t tFlags=0, int8_t tFreqIncr=0);
void playFile(const char *filename);
void pause(uint8_t tLen);
inline bool audioBusy()
{
public:
return (toneTimeLeft > 0);
}
audioQueue();
void audioEvent(uint8_t e, uint8_t f=BEEP_DEFAULT_FREQ);
inline bool audioEmpty()
{
return (t_queueRidx == t_queueWidx);
}
void play(uint8_t tFreq, uint8_t tLen, uint8_t tPause, uint8_t tFlags=0, int8_t tFreqIncr=0);
void pause(uint8_t tLen);
#define AUDIO_KEYPAD_UP() audioEvent(AU_KEYPAD_UP)
#define AUDIO_KEYPAD_DOWN() audioEvent(AU_KEYPAD_DOWN)
#define AUDIO_MENUS() audioEvent(AU_MENUS)
#define AUDIO_WARNING1() audioEvent(AU_WARNING1)
#define AUDIO_WARNING2() audioEvent(AU_WARNING2)
#define AUDIO_ERROR() audioEvent(AU_ERROR)
inline bool busy() {
return (toneTimeLeft > 0);
}
#define IS_AUDIO_BUSY() audioBusy()
void event(uint8_t e, uint8_t f=BEEP_DEFAULT_FREQ);
#define AUDIO_TIMER_30() audioEvent(AU_TIMER_30)
#define AUDIO_TIMER_20() audioEvent(AU_TIMER_20)
#define AUDIO_TIMER_10() audioEvent(AU_TIMER_10)
#define AUDIO_TIMER_LT3() audioEvent(AU_TIMER_LT3)
#define AUDIO_MINUTE_BEEP() audioEvent(AU_WARNING1)
#define AUDIO_INACTIVITY() audioEvent(AU_INACTIVITY)
#define AUDIO_MIX_WARNING_1() audioEvent(AU_MIX_WARNING_1)
#define AUDIO_MIX_WARNING_2() audioEvent(AU_MIX_WARNING_2)
#define AUDIO_MIX_WARNING_3() audioEvent(AU_MIX_WARNING_3)
#define AUDIO_POT_STICK_MIDDLE() audioEvent(AU_POT_STICK_MIDDLE)
#define AUDIO_VARIO_UP() audioEvent(AU_KEYPAD_UP)
#define AUDIO_VARIO_DOWN() audioEvent(AU_KEYPAD_DOWN)
#define AUDIO_TRIM_MIDDLE(f) audioEvent(AU_TRIM_MIDDLE, f)
#define AUDIO_TRIM(event, f) audioEvent(AU_TRIM_MOVE, f)
#define AUDIO_PLAY(p) audioEvent(p)
#define AUDIO_VARIO(f, t) play(f, t, 0, PLAY_SOUND_VARIO)
// heartbeat is responsibile for issueing the audio tones and general square waves
// it is essentially the life of the class.
void heartbeat();
// bool freeslots(uint8_t slots);
inline bool empty() {
return (t_queueRidx == t_queueWidx);
}
protected:
inline uint8_t getToneLength(uint8_t tLen);
private:
uint8_t t_queueRidx;
uint8_t t_queueWidx;
uint8_t toneChanged;
uint8_t toneFreq;
int8_t toneFreqIncr;
uint8_t toneTimeLeft;
uint8_t tonePause;
uint8_t toneRateLimit;
// vario
uint8_t tone2Changed;
uint8_t tone2Freq;
uint8_t tone2TimeLeft;
uint8_t tone2Pause;
uint8_t tone2RateLimit;
// queue arrays
uint8_t queueToneFreq[AUDIO_QUEUE_LENGTH];
int8_t queueToneFreqIncr[AUDIO_QUEUE_LENGTH];
uint8_t queueToneLength[AUDIO_QUEUE_LENGTH];
uint8_t queueTonePause[AUDIO_QUEUE_LENGTH];
uint8_t queueToneRepeat[AUDIO_QUEUE_LENGTH];
};
//wrapper function - dirty but results in a space saving!!!
extern audioQueue audio;
void audioDefevent(uint8_t e);
#define AUDIO_KEYPAD_UP() audioDefevent(AU_KEYPAD_UP)
#define AUDIO_KEYPAD_DOWN() audioDefevent(AU_KEYPAD_DOWN)
#define AUDIO_MENUS() audioDefevent(AU_MENUS)
#define AUDIO_WARNING1() audioDefevent(AU_WARNING1)
#define AUDIO_WARNING2() audioDefevent(AU_WARNING2)
#define AUDIO_ERROR() audioDefevent(AU_ERROR)
#define IS_AUDIO_BUSY() audio.busy()
#define AUDIO_TIMER_30() audioDefevent(AU_TIMER_30)
#define AUDIO_TIMER_20() audioDefevent(AU_TIMER_20)
#define AUDIO_TIMER_10() audioDefevent(AU_TIMER_10)
#define AUDIO_TIMER_LT3() audioDefevent(AU_TIMER_LT3)
#define AUDIO_MINUTE_BEEP() audioDefevent(AU_WARNING1)
#define AUDIO_INACTIVITY() audioDefevent(AU_INACTIVITY)
#define AUDIO_MIX_WARNING_1() audioDefevent(AU_MIX_WARNING_1)
#define AUDIO_MIX_WARNING_2() audioDefevent(AU_MIX_WARNING_2)
#define AUDIO_MIX_WARNING_3() audioDefevent(AU_MIX_WARNING_3)
#define AUDIO_POT_STICK_MIDDLE() audioDefevent(AU_POT_STICK_MIDDLE)
#define AUDIO_VARIO_UP() audioDefevent(AU_KEYPAD_UP)
#define AUDIO_VARIO_DOWN() audioDefevent(AU_KEYPAD_DOWN)
#define AUDIO_TRIM_MIDDLE(f) audio.event(AU_TRIM_MIDDLE, f)
#define AUDIO_HEARTBEAT() audio.heartbeat()
#define AUDIO_HEARTBEAT()
#endif

File diff suppressed because it is too large Load diff

View file

@ -51,28 +51,14 @@ uint16_t Sine_values[] =
872, 976,1084,1196,1311,1429,1550,1673,1797,1922
} ;
const uint16_t PianoTones[] =
{
28, 29, 31, 33, 35, 37, 39, 41, 44, 46,
49, 52, 55, 58, 62, 65, 69, 73, 78, 82,
87, 92, 98, 104, 110, 117, 123, 131, 139, 147,
156, 165, 175, 185, 196, 208, 220, 233, 247, 262, // d#, E, F, f#, G, g#, A, a#, B, C(middle)
277, 294, 311, 330, 349, 370, 392, 415, 440, 466, // c#, D, d#, E, F, f#, G, g#, A, a#
494, 523, 554, 587, 622, 659, 698, 740, 784, 831, // B, C, c#, D, d#, E, F, f#, G, g#
880, 932, 988, 1047, 1109, 1175, 1245, 1319, 1397, 1480,
1568, 1661, 1760, 1865, 1976, 2093, 2217, 2349, 2489, 2637,
2794, 2960, 3136, 3322, 3520 ,3729, 3951, 4186
} ;
// Sound routines
void start_sound()
void startSound()
{
register Pio *pioptr ;
start_timer1() ;
init_dac() ;
initDac() ;
init_twi() ;
pioptr = PIOA ;
@ -115,20 +101,17 @@ void buzzer_sound( uint8_t time )
Buzzer_count = time ;
}
void set_frequency( uint32_t frequency )
void setFrequency( uint32_t frequency )
{
register Tc *ptc ;
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 ;
}
timer = Master_frequency / (8 * 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
@ -136,7 +119,6 @@ void set_frequency( uint32_t frequency )
ptc->TC_CHANNEL[1].TC_CCR = 5 ; // Enable clock and trigger it (may only need trigger)
}
// Start TIMER1 at 100000Hz, used for DACC trigger
void start_timer1()
{
@ -163,7 +145,7 @@ void start_timer1()
// Configure DAC1 (or DAC0 for REVB)
// Not sure why PB14 has not be allocated to the DAC, although it is an EXTRA function
// So maybe it is automatically done
void init_dac()
void initDac()
{
register Dacc *dacptr ;
@ -181,23 +163,32 @@ void init_dac()
#endif
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 ;
#endif
dacptr->DACC_TCR = 50 ; // words, 100 16 bit values
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) ;
}
uint16_t wavSamplesArray[2*WAV_BUFFER_SIZE]; /* 2 buffers of 100ms at 12kHz */
uint16_t *wavSamplesBuffer;
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 ;
#endif
DACC->DACC_TNCR = 50 ; // words, 100 16 bit values
if (toneWavFile[0]) {
CoEnterISR(); // Enter the interrupt
CoSetFlag(audioFlag);
CoExitISR(); // Exit the interrupt
wavSamplesBuffer = (wavSamplesBuffer == wavSamplesArray) ? wavSamplesArray+WAV_BUFFER_SIZE : wavSamplesArray;
DACC->DACC_TNPR = (uint32_t)wavSamplesBuffer;
DACC->DACC_TNCR = WAV_BUFFER_SIZE/2;
}
else {
DACC->DACC_TNPR = (uint32_t) Sine_values ;
DACC->DACC_TNCR = 50 ; // words, 100 16 bit values
}
}
void end_sound()

View file

@ -37,23 +37,26 @@
#define NUM_VOL_LEVELS 24
extern void start_sound( void ) ;
extern void startSound( void ) ;
extern void buzzer_on( void ) ;
extern void buzzer_off( void ) ;
extern void buzzer_sound( uint8_t time ) ;
extern void set_frequency( uint32_t frequency ) ;
extern void setFrequency( uint32_t frequency ) ;
extern void start_timer1( void ) ;
extern void init_dac( void ) ;
extern "C" void DAC_IRQHandler( void ) ;
extern void initDac( void ) ;
extern void end_sound( void ) ;
inline void tone_start( register uint32_t time )
#define WAV_BUFFER_SIZE 1200
extern uint16_t wavSamplesArray[2*WAV_BUFFER_SIZE]; /* 2 buffers of 100ms at 12kHz */
extern uint16_t *wavSamplesBuffer;
inline void toneStart()
{
PMC->PMC_PCER0 |= 0x40000000L ; // Enable peripheral clock to DAC
DACC->DACC_IER = DACC_IER_ENDTX ;
}
inline void tone_stop( void )
inline void toneStop()
{
DACC->DACC_IDR = DACC_IDR_ENDTX ; // Disable interrupt
}

View file

@ -59,23 +59,10 @@ uint8_t FrskyRxBufferReady = 0;
int8_t frskyStreaming = -1;
uint8_t frskyUsrStreaming = 0;
uint8_t link_counter = 0;
uint32_t consumption = 0;
uint16_t s_currTmr = 0;
FrskyData frskyTelemetry[2];
FrskyRSSI frskyRSSI[2];
struct FrskyAlarm {
uint8_t level; // The alarm's 'urgency' level. 0=disabled, 1=yellow, 2=orange, 3=red
uint8_t greater; // 1 = 'if greater than'. 0 = 'if less than'
uint8_t value; // The threshold above or below which the alarm will sound
};
struct FrskyAlarm frskyAlarms[4];
uint16_t currentConsumptionBoundary = 0;
FrskyData frskyData;
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
FrskyHubData frskyHubData;
enum BarThresholdIdx {
THLD_ALT,
THLD_RPM,
@ -129,36 +116,36 @@ uint8_t frskyGetUserData(char *buffer, uint8_t bufSize)
#ifdef FRSKY_HUB
inline void getGpsPilotPosition()
{
frskyHubData.pilotLatitude = ((uint32_t)(frskyHubData.gpsLatitude_bp / 100) * 1000000) + (((uint32_t)(frskyHubData.gpsLatitude_bp % 100) * 10000 + frskyHubData.gpsLatitude_ap) * 5) / 3;
frskyHubData.pilotLongitude = ((uint32_t)(frskyHubData.gpsLongitude_bp / 100) * 1000000) + (((uint32_t)(frskyHubData.gpsLongitude_bp % 100) * 10000 + frskyHubData.gpsLongitude_ap) * 5) / 3;
uint32_t lat = (uint32_t)(frskyHubData.gpsLatitude_bp / 100) * 100 + ((uint32_t)(frskyHubData.gpsLatitude_bp % 100) * 5) / 3;
frskyData.frskyHubData.pilotLatitude = ((uint32_t)(frskyData.frskyHubData.gpsLatitude_bp / 100) * 1000000) + (((uint32_t)(frskyData.frskyHubData.gpsLatitude_bp % 100) * 10000 + frskyData.frskyHubData.gpsLatitude_ap) * 5) / 3;
frskyData.frskyHubData.pilotLongitude = ((uint32_t)(frskyData.frskyHubData.gpsLongitude_bp / 100) * 1000000) + (((uint32_t)(frskyData.frskyHubData.gpsLongitude_bp % 100) * 10000 + frskyData.frskyHubData.gpsLongitude_ap) * 5) / 3;
uint32_t lat = (uint32_t)(frskyData.frskyHubData.gpsLatitude_bp / 100) * 100 + ((uint32_t)(frskyData.frskyHubData.gpsLatitude_bp % 100) * 5) / 3;
uint32_t angle2 = (lat*lat) / 10000;
uint32_t angle4 = angle2 * angle2;
frskyHubData.distFromEarthAxis = 139*(((uint32_t)10000000-((angle2*(uint32_t)123370)/81)+(angle4/25))/12500);
// printf("frskyHubData.distFromEarthAxis=%d\n", frskyHubData.distFromEarthAxis); fflush(stdout);
frskyData.frskyHubData.distFromEarthAxis = 139*(((uint32_t)10000000-((angle2*(uint32_t)123370)/81)+(angle4/25))/12500);
// printf("frskyData.frskyHubData.distFromEarthAxis=%d\n", frskyData.frskyHubData.distFromEarthAxis); fflush(stdout);
}
inline void getGpsDistance()
{
uint32_t lat = ((uint32_t)(frskyHubData.gpsLatitude_bp / 100) * 1000000) + (((uint32_t)(frskyHubData.gpsLatitude_bp % 100) * 10000 + frskyHubData.gpsLatitude_ap) * 5) / 3;
uint32_t lng = ((uint32_t)(frskyHubData.gpsLongitude_bp / 100) * 1000000) + (((uint32_t)(frskyHubData.gpsLongitude_bp % 100) * 10000 + frskyHubData.gpsLongitude_ap) * 5) / 3;
uint32_t lat = ((uint32_t)(frskyData.frskyHubData.gpsLatitude_bp / 100) * 1000000) + (((uint32_t)(frskyData.frskyHubData.gpsLatitude_bp % 100) * 10000 + frskyData.frskyHubData.gpsLatitude_ap) * 5) / 3;
uint32_t lng = ((uint32_t)(frskyData.frskyHubData.gpsLongitude_bp / 100) * 1000000) + (((uint32_t)(frskyData.frskyHubData.gpsLongitude_bp % 100) * 10000 + frskyData.frskyHubData.gpsLongitude_ap) * 5) / 3;
// printf("lat=%d (%d), long=%d (%d)\n", lat, abs(lat - frskyHubData.pilotLatitude), lng, abs(lng - frskyHubData.pilotLongitude));
// printf("lat=%d (%d), long=%d (%d)\n", lat, abs(lat - frskyData.frskyHubData.pilotLatitude), lng, abs(lng - frskyData.frskyHubData.pilotLongitude));
uint32_t angle = (lat > frskyHubData.pilotLatitude) ? lat - frskyHubData.pilotLatitude : frskyHubData.pilotLatitude - lat;
uint32_t angle = (lat > frskyData.frskyHubData.pilotLatitude) ? lat - frskyData.frskyHubData.pilotLatitude : frskyData.frskyHubData.pilotLatitude - lat;
uint32_t dist = EARTH_RADIUS * angle / 1000000;
uint32_t result = dist*dist;
angle = (lng > frskyHubData.pilotLongitude) ? lng - frskyHubData.pilotLongitude : frskyHubData.pilotLongitude - lng;
dist = frskyHubData.distFromEarthAxis * angle / 1000000;
angle = (lng > frskyData.frskyHubData.pilotLongitude) ? lng - frskyData.frskyHubData.pilotLongitude : frskyData.frskyHubData.pilotLongitude - lng;
dist = frskyData.frskyHubData.distFromEarthAxis * angle / 1000000;
result += dist*dist;
dist = abs(frskyHubData.baroAltitudeOffset ? frskyHubData.baroAltitude_bp : frskyHubData.gpsAltitude_bp);
dist = abs(frskyData.frskyHubData.baroAltitudeOffset ? frskyData.frskyHubData.baroAltitude_bp : frskyData.frskyHubData.gpsAltitude_bp);
result += dist*dist;
frskyHubData.gpsDistance = isqrt32(result);
if (frskyHubData.gpsDistance > frskyHubData.maxGpsDistance)
frskyHubData.maxGpsDistance = frskyHubData.gpsDistance;
frskyData.frskyHubData.gpsDistance = isqrt32(result);
if (frskyData.frskyHubData.gpsDistance > frskyData.frskyHubData.maxGpsDistance)
frskyData.frskyHubData.maxGpsDistance = frskyData.frskyHubData.gpsDistance;
}
typedef enum {
@ -178,23 +165,23 @@ void evalVario(int16_t altitude_bp, uint16_t altitude_ap)
{
#if defined(VARIO)
int32_t varioAltitude_cm = (int32_t)altitude_bp * 100 + (altitude_bp > 0 ? altitude_ap : -altitude_ap);
uint8_t varioAltitudeQueuePointer = frskyHubData.varioAltitudeQueuePointer + 1;
uint8_t varioAltitudeQueuePointer = frskyData.frskyHubData.varioAltitudeQueuePointer + 1;
if (varioAltitudeQueuePointer == VARIO_QUEUE_LENGTH)
varioAltitudeQueuePointer = 0;
frskyHubData.varioAltitudeQueuePointer = varioAltitudeQueuePointer;
frskyHubData.varioSpeed -= frskyHubData.varioAltitudeQueue[varioAltitudeQueuePointer] ;
frskyHubData.varioAltitudeQueue[varioAltitudeQueuePointer] = varioAltitude_cm - frskyHubData.varioAltitude_cm;
frskyHubData.varioAltitude_cm = varioAltitude_cm;
frskyHubData.varioSpeed += frskyHubData.varioAltitudeQueue[varioAltitudeQueuePointer] ;
frskyData.frskyHubData.varioAltitudeQueuePointer = varioAltitudeQueuePointer;
frskyData.frskyHubData.varioSpeed -= frskyData.frskyHubData.varioAltitudeQueue[varioAltitudeQueuePointer] ;
frskyData.frskyHubData.varioAltitudeQueue[varioAltitudeQueuePointer] = varioAltitude_cm - frskyData.frskyHubData.varioAltitude_cm;
frskyData.frskyHubData.varioAltitude_cm = varioAltitude_cm;
frskyData.frskyHubData.varioSpeed += frskyData.frskyHubData.varioAltitudeQueue[varioAltitudeQueuePointer] ;
#endif
}
void checkMinMaxAltitude()
{
if (frskyHubData.baroAltitude_bp > frskyHubData.maxAltitude)
frskyHubData.maxAltitude = frskyHubData.baroAltitude_bp;
if (frskyHubData.baroAltitude_bp < frskyHubData.minAltitude)
frskyHubData.minAltitude = frskyHubData.baroAltitude_bp;
if (frskyData.frskyHubData.baroAltitude_bp > frskyData.frskyHubData.maxAltitude)
frskyData.frskyHubData.maxAltitude = frskyData.frskyHubData.baroAltitude_bp;
if (frskyData.frskyHubData.baroAltitude_bp < frskyData.frskyHubData.minAltitude)
frskyData.frskyHubData.minAltitude = frskyData.frskyHubData.baroAltitude_bp;
}
void parseTelemHubByte(uint8_t byte)
@ -238,119 +225,119 @@ void parseTelemHubByte(uint8_t byte)
if ((uint8_t)structPos == offsetof(FrskyHubData, gpsLatitude_bp)) {
if (lowByte || byte)
frskyHubData.gpsFix = 1;
else if (frskyHubData.gpsFix > 0 && frskyHubData.gpsLatitude_bp > 1)
frskyHubData.gpsFix = 0;
frskyData.frskyHubData.gpsFix = 1;
else if (frskyData.frskyHubData.gpsFix > 0 && frskyData.frskyHubData.gpsLatitude_bp > 1)
frskyData.frskyHubData.gpsFix = 0;
}
else if ((uint8_t)structPos == offsetof(FrskyHubData, gpsLongitude_bp)) {
if (lowByte || byte)
frskyHubData.gpsFix = 1;
else if (frskyHubData.gpsFix > 0 && frskyHubData.gpsLongitude_bp > 1)
frskyHubData.gpsFix = 0;
frskyData.frskyHubData.gpsFix = 1;
else if (frskyData.frskyHubData.gpsFix > 0 && frskyData.frskyHubData.gpsLongitude_bp > 1)
frskyData.frskyHubData.gpsFix = 0;
}
if ((uint8_t)structPos == offsetof(FrskyHubData, gpsAltitude_bp) ||
((uint8_t)structPos >= offsetof(FrskyHubData, gpsAltitude_ap) && (uint8_t)structPos <= offsetof(FrskyHubData, gpsLatitudeNS) && (uint8_t)structPos != offsetof(FrskyHubData, baroAltitude_bp) && (uint8_t)structPos != offsetof(FrskyHubData, baroAltitude_ap))) {
// If we don't have a fix, we may discard the value
if (frskyHubData.gpsFix <= 0)
if (frskyData.frskyHubData.gpsFix <= 0)
return;
}
((uint8_t*)&frskyHubData)[structPos] = lowByte;
((uint8_t*)&frskyHubData)[structPos+1] = byte;
((uint8_t*)&frskyData.frskyHubData)[structPos] = lowByte;
((uint8_t*)&frskyData.frskyHubData)[structPos+1] = byte;
switch ((uint8_t)structPos) {
case offsetof(FrskyHubData, rpm):
frskyHubData.rpm *= (uint8_t)60/(g_model.frsky.blades+2);
if (frskyHubData.rpm > frskyHubData.maxRpm)
frskyHubData.maxRpm = frskyHubData.rpm;
frskyData.frskyHubData.rpm *= (uint8_t)60/(g_model.frsky.blades+2);
if (frskyData.frskyHubData.rpm > frskyData.frskyHubData.maxRpm)
frskyData.frskyHubData.maxRpm = frskyData.frskyHubData.rpm;
break;
case offsetof(FrskyHubData, temperature1):
if (frskyHubData.temperature1 > frskyHubData.maxTemperature1)
frskyHubData.maxTemperature1 = frskyHubData.temperature1;
if (frskyData.frskyHubData.temperature1 > frskyData.frskyHubData.maxTemperature1)
frskyData.frskyHubData.maxTemperature1 = frskyData.frskyHubData.temperature1;
break;
case offsetof(FrskyHubData, temperature2):
if (frskyHubData.temperature2 > frskyHubData.maxTemperature2)
frskyHubData.maxTemperature2 = frskyHubData.temperature2;
if (frskyData.frskyHubData.temperature2 > frskyData.frskyHubData.maxTemperature2)
frskyData.frskyHubData.maxTemperature2 = frskyData.frskyHubData.temperature2;
break;
case offsetof(FrskyHubData, current):
if (frskyHubData.current > frskyHubData.maxCurrent)
frskyHubData.maxCurrent = frskyHubData.current;
if (frskyData.frskyHubData.current > frskyData.frskyHubData.maxCurrent)
frskyData.frskyHubData.maxCurrent = frskyData.frskyHubData.current;
break;
case offsetof(FrskyHubData, baroAltitude_bp):
// First received barometer altitude => Altitude offset
if (!frskyHubData.baroAltitudeOffset)
frskyHubData.baroAltitudeOffset = -frskyHubData.baroAltitude_bp;
if (!frskyData.frskyHubData.baroAltitudeOffset)
frskyData.frskyHubData.baroAltitudeOffset = -frskyData.frskyHubData.baroAltitude_bp;
if (g_model.varioSource == VARIO_SOURCE_BARO_V1) {
evalVario(frskyHubData.baroAltitude_bp, 0);
evalVario(frskyData.frskyHubData.baroAltitude_bp, 0);
}
frskyHubData.baroAltitude_bp += frskyHubData.baroAltitudeOffset;
frskyData.frskyHubData.baroAltitude_bp += frskyData.frskyHubData.baroAltitudeOffset;
checkMinMaxAltitude();
break;
case offsetof(FrskyHubData, baroAltitude_ap):
if (g_model.varioSource == VARIO_SOURCE_BARO_V2) {
evalVario(frskyHubData.baroAltitude_bp-frskyHubData.baroAltitudeOffset, frskyHubData.baroAltitude_ap);
evalVario(frskyData.frskyHubData.baroAltitude_bp-frskyData.frskyHubData.baroAltitudeOffset, frskyData.frskyHubData.baroAltitude_ap);
}
break;
case offsetof(FrskyHubData, gpsAltitude_ap):
if (!frskyHubData.gpsAltitudeOffset)
frskyHubData.gpsAltitudeOffset = -frskyHubData.gpsAltitude_bp;
frskyHubData.gpsAltitude_bp += frskyHubData.gpsAltitudeOffset;
if (!frskyHubData.baroAltitudeOffset) {
if (frskyHubData.gpsAltitude_bp > frskyHubData.maxAltitude)
frskyHubData.maxAltitude = frskyHubData.gpsAltitude_bp;
if (frskyHubData.gpsAltitude_bp < frskyHubData.minAltitude)
frskyHubData.minAltitude = frskyHubData.gpsAltitude_bp;
if (!frskyData.frskyHubData.gpsAltitudeOffset)
frskyData.frskyHubData.gpsAltitudeOffset = -frskyData.frskyHubData.gpsAltitude_bp;
frskyData.frskyHubData.gpsAltitude_bp += frskyData.frskyHubData.gpsAltitudeOffset;
if (!frskyData.frskyHubData.baroAltitudeOffset) {
if (frskyData.frskyHubData.gpsAltitude_bp > frskyData.frskyHubData.maxAltitude)
frskyData.frskyHubData.maxAltitude = frskyData.frskyHubData.gpsAltitude_bp;
if (frskyData.frskyHubData.gpsAltitude_bp < frskyData.frskyHubData.minAltitude)
frskyData.frskyHubData.minAltitude = frskyData.frskyHubData.gpsAltitude_bp;
}
if (!frskyHubData.pilotLatitude && !frskyHubData.pilotLongitude) {
if (!frskyData.frskyHubData.pilotLatitude && !frskyData.frskyHubData.pilotLongitude) {
// First received GPS position => Pilot GPS position
getGpsPilotPosition();
}
else if (frskyHubData.gpsDistNeeded || g_menuStack[0] == menuProcFrsky) {
else if (frskyData.frskyHubData.gpsDistNeeded || g_menuStack[0] == menuProcFrsky) {
getGpsDistance();
}
break;
case offsetof(FrskyHubData, gpsSpeed_bp):
// Speed => Max speed
if (frskyHubData.gpsSpeed_bp > frskyHubData.maxGpsSpeed)
frskyHubData.maxGpsSpeed = frskyHubData.gpsSpeed_bp;
if (frskyData.frskyHubData.gpsSpeed_bp > frskyData.frskyHubData.maxGpsSpeed)
frskyData.frskyHubData.maxGpsSpeed = frskyData.frskyHubData.gpsSpeed_bp;
break;
case offsetof(FrskyHubData, volts):
// Voltage => Cell number + Cell voltage
{
uint8_t battnumber = ((frskyHubData.volts & 0x00F0) >> 4);
uint8_t battnumber = ((frskyData.frskyHubData.volts & 0x00F0) >> 4);
if (battnumber < 12) {
if (frskyHubData.cellsCount < battnumber+1) {
frskyHubData.cellsCount = battnumber+1;
if (frskyData.frskyHubData.cellsCount < battnumber+1) {
frskyData.frskyHubData.cellsCount = battnumber+1;
}
uint8_t cellVolts = (uint8_t)(((((frskyHubData.volts & 0xFF00) >> 8) + ((frskyHubData.volts & 0x000F) << 8)))/10);
frskyHubData.cellVolts[battnumber] = cellVolts;
if (!frskyHubData.minCellVolts || cellVolts < frskyHubData.minCellVolts || battnumber==frskyHubData.minCellIdx) {
frskyHubData.minCellIdx = battnumber;
frskyHubData.minCellVolts = cellVolts;
uint8_t cellVolts = (uint8_t)(((((frskyData.frskyHubData.volts & 0xFF00) >> 8) + ((frskyData.frskyHubData.volts & 0x000F) << 8)))/10);
frskyData.frskyHubData.cellVolts[battnumber] = cellVolts;
if (!frskyData.frskyHubData.minCellVolts || cellVolts < frskyData.frskyHubData.minCellVolts || battnumber==frskyData.frskyHubData.minCellIdx) {
frskyData.frskyHubData.minCellIdx = battnumber;
frskyData.frskyHubData.minCellVolts = cellVolts;
}
}
break;
}
case offsetof(FrskyHubData, hour):
frskyHubData.hour = ((uint8_t)(frskyHubData.hour + g_eeGeneral.timezone + 24)) % 24;
frskyData.frskyHubData.hour = ((uint8_t)(frskyData.frskyHubData.hour + g_eeGeneral.timezone + 24)) % 24;
break;
case offsetof(FrskyHubData, accelX):
case offsetof(FrskyHubData, accelY):
case offsetof(FrskyHubData, accelZ):
*(int16_t*)(&((uint8_t*)&frskyHubData)[structPos]) /= 10;
*(int16_t*)(&((uint8_t*)&frskyData.frskyHubData)[structPos]) /= 10;
break;
}
@ -361,12 +348,12 @@ void parseTelemHubByte(uint8_t byte)
void parseTelemWSHowHighByte(uint8_t byte)
{
if (frskyUsrStreaming < (FRSKY_TIMEOUT10ms*3 - 10)) {
((uint8_t*)&frskyHubData)[offsetof(FrskyHubData, baroAltitude_bp)] = byte;
((uint8_t*)&frskyData.frskyHubData)[offsetof(FrskyHubData, baroAltitude_bp)] = byte;
checkMinMaxAltitude();
}
else {
// At least 100mS passed since last data received
((uint8_t*)&frskyHubData)[offsetof(FrskyHubData, baroAltitude_bp)+1] = byte;
((uint8_t*)&frskyData.frskyHubData)[offsetof(FrskyHubData, baroAltitude_bp)+1] = byte;
}
// baroAltitude_bp unit here is feet!
frskyUsrStreaming = FRSKY_TIMEOUT10ms*3; // reset counter
@ -391,27 +378,15 @@ void processFrskyPacket(uint8_t *packet)
// What type of packet?
switch (packet[0])
{
case A22PKT:
case A21PKT:
case A12PKT:
case A11PKT:
{
struct FrskyAlarm *alarmptr ;
alarmptr = &frskyAlarms[(packet[0]-A22PKT)] ;
alarmptr->value = packet[1];
alarmptr->greater = packet[2] & 0x01;
alarmptr->level = packet[3] & 0x03;
}
break;
case LINKPKT: // A1/A2/RSSI values
link_counter += 32;
frskyTelemetry[0].set(packet[1], g_model.frsky.channels[0].type);
frskyTelemetry[1].set(packet[2], g_model.frsky.channels[1].type);
frskyRSSI[0].set(packet[3]);
frskyRSSI[1].set(packet[4] / 2);
frskyData.frskyTelemetry[0].set(packet[1], g_model.frsky.channels[0].type);
frskyData.frskyTelemetry[1].set(packet[2], g_model.frsky.channels[1].type);
frskyData.frskyRSSI[0].set(packet[3]);
frskyData.frskyRSSI[1].set(packet[4] / 2);
frskyStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected
if (g_model.varioSource >= VARIO_SOURCE_A1) {
frskyHubData.varioSpeed = applyChannelRatio(g_model.varioSource - VARIO_SOURCE_A1, frskyTelemetry[g_model.varioSource - VARIO_SOURCE_A1].value);
frskyData.frskyHubData.varioSpeed = applyChannelRatio(g_model.varioSource - VARIO_SOURCE_A1, frskyData.frskyTelemetry[g_model.varioSource - VARIO_SOURCE_A1].value);
}
break;
#if defined(FRSKY_HUB) || defined (WS_HOW_HIGH)
@ -650,22 +625,24 @@ void check_frsky()
frskyStreaming--;
}
else {
frskyRSSI[0].set(0);
frskyRSSI[1].set(0);
frskyData.frskyRSSI[0].set(0);
frskyData.frskyRSSI[1].set(0);
}
#endif
uint16_t currint;
currint=(g_tmr10ms<s_currTmr ? 65535-s_currTmr+g_tmr10ms : g_tmr10ms-s_currTmr);
s_currTmr=g_tmr10ms;
consumption+=(frskyHubData.current*currint);
frskyData.currentPrescale += frskyData.frskyHubData.current;
if (frskyData.currentPrescale >= currentConsumptionBoundary) {
frskyData.currentConsumption += 1;
frskyData.currentPrescale -= currentConsumptionBoundary;
}
#if defined(VARIO)
static uint16_t s_varioTmr = 0;
if (isFunctionActive(FUNC_VARIO)) {
static uint16_t s_varioTmr = 0;
if (isFunctionActive(FUNC_VARIO)) {
#if defined(AUDIO)
int16_t varioSpeedUpMin = (g_model.varioSpeedUpMin - VARIO_SPEED_LIMIT_UP_CENTER)*VARIO_SPEED_LIMIT_MUL;
int16_t varioSpeedDownMin = (VARIO_SPEED_LIMIT_DOWN_OFF - g_model.varioSpeedDownMin)*(-VARIO_SPEED_LIMIT_MUL);
int16_t verticalSpeed = limit((int16_t)(-VARIO_SPEED_LIMIT*100), frskyHubData.varioSpeed, (int16_t)(+VARIO_SPEED_LIMIT*100));
int16_t verticalSpeed = limit((int16_t)(-VARIO_SPEED_LIMIT*100), frskyData.frskyHubData.varioSpeed, (int16_t)(+VARIO_SPEED_LIMIT*100));
uint8_t SoundVarioBeepNextFreq = 0;
uint8_t SoundVarioBeepNextTime = 0;
@ -686,18 +663,18 @@ consumption+=(frskyHubData.current*currint);
s_varioTmr = g_tmr10ms;
SoundVarioBeepTime = SoundVarioBeepNextTime;
SoundVarioBeepFreq = SoundVarioBeepNextFreq;
audio.play(SoundVarioBeepFreq, SoundVarioBeepTime, 0, PLAY_SOUND_VARIO);
AUDIO_VARIO(SoundVarioBeepFreq, SoundVarioBeepTime);
}
}
else {
// negative vertical speed gives sound without pauses
SoundVarioBeepTime = SoundVarioBeepNextTime;
SoundVarioBeepFreq = SoundVarioBeepNextFreq;
audio.play(SoundVarioBeepFreq, 1, 0, PLAY_SOUND_VARIO);
AUDIO_VARIO(SoundVarioBeepFreq, 1);
}
}
#else
int8_t verticalSpeed = limit((int16_t)-100, (int16_t)(frskyHubData.varioSpeed/10), (int16_t)+100);
int8_t verticalSpeed = limit((int16_t)-100, (int16_t)(frskyData.frskyHubData.varioSpeed/10), (int16_t)+100);
uint16_t interval;
if (verticalSpeed == 0) {
@ -727,11 +704,11 @@ bool FRSKY_alarmRaised(uint8_t idx)
for (int i=0; i<2; i++) {
if (ALARM_LEVEL(idx, i) != alarm_off) {
if (ALARM_GREATER(idx, i)) {
if (frskyTelemetry[idx].value > g_model.frsky.channels[idx].alarms_value[i])
if (frskyData.frskyTelemetry[idx].value > g_model.frsky.channels[idx].alarms_value[i])
return true;
}
else {
if (frskyTelemetry[idx].value < g_model.frsky.channels[idx].alarms_value[i])
if (frskyData.frskyTelemetry[idx].value < g_model.frsky.channels[idx].alarms_value[i])
return true;
}
}
@ -756,7 +733,6 @@ inline void FRSKY_EnableRXD(void)
void FRSKY_Init(void)
{
// clear frsky variables
memset(frskyAlarms, 0, sizeof(frskyAlarms));
resetTelemetry();
#if defined(PCBARM)
@ -787,35 +763,7 @@ void FRSKY_Init(void)
#endif
}
#if 0
// Send packet requesting all alarm settings be sent back to us
void frskyAlarmsRefresh()
{
if (frskyTxBufferCount) return; // we only have one buffer. If it's in use, then we can't send. Sorry.
{
uint8_t *ptr ;
ptr = &frskyTxBuffer[0] ;
*ptr++ = START_STOP; // Start of packet
*ptr++ = ALRM_REQUEST;
*ptr++ = 0x00 ;
*ptr++ = 0x00 ;
*ptr++ = 0x00 ;
*ptr++ = 0x00 ;
*ptr++ = 0x00 ;
*ptr++ = 0x00 ;
*ptr++ = 0x00 ;
*ptr++ = 0x00 ;
*ptr++ = START_STOP; // End of packet
}
frskyTxBufferCount = 11;
frskyTransmitBuffer();
}
#endif
void FrskyRSSI::set(uint8_t value)
void FrskyValueWithMin::set(uint8_t value)
{
if (this->value == 0)
this->value = value;
@ -830,9 +778,9 @@ void FrskyRSSI::set(uint8_t value)
min = value;
}
void FrskyData::set(uint8_t value, uint8_t unit)
void FrskyValueWithMinMax::set(uint8_t value, uint8_t unit)
{
FrskyRSSI::set(value);
FrskyValueWithMin::set(value);
if (unit != UNIT_VOLTS) {
this->value = value;
}
@ -840,52 +788,62 @@ void FrskyData::set(uint8_t value, uint8_t unit)
max = value;
}
void frskyEvalCurrentConsumptionBoundary()
{
if (g_model.frsky.currentSource == CURRENT_SOURCE_HUB) {
currentConsumptionBoundary = 360;
}
else {
currentConsumptionBoundary = 360000L / (g_model.frsky.channels[g_model.frsky.currentSource-1].ratio << g_model.frsky.channels[g_model.frsky.currentSource-1].multiplier);
}
}
void resetTelemetry()
{
memset(frskyTelemetry, 0, sizeof(frskyTelemetry));
memset(frskyRSSI, 0, sizeof(frskyRSSI));
memset(&frskyHubData, 0, sizeof(frskyHubData));
// TODO these structs could be assembled to have only one memset
memset(&frskyData, 0, sizeof(frskyData));
frskyEvalCurrentConsumptionBoundary();
#if defined(FRSKY_HUB)
frskyHubData.gpsLatitude_bp = 2;
frskyHubData.gpsLongitude_bp = 2;
frskyHubData.gpsFix = -1;
frskyData.frskyHubData.gpsLatitude_bp = 2;
frskyData.frskyHubData.gpsLongitude_bp = 2;
frskyData.frskyHubData.gpsFix = -1;
#endif
#ifdef SIMU
frskyTelemetry[0].set(120, UNIT_VOLTS);
frskyRSSI[0].set(75);
frskyHubData.fuelLevel = 75;
frskyHubData.rpm = 12000;
frskyData.frskyHubData.fuelLevel = 75;
frskyData.frskyHubData.rpm = 12000;
frskyHubData.gpsFix = 1;
frskyHubData.gpsLatitude_bp = 4401;
frskyHubData.gpsLatitude_ap = 7710;
frskyHubData.gpsLongitude_bp = 1006;
frskyHubData.gpsLongitude_ap = 8872;
frskyHubData.gpsSpeed_bp = (100 * 250) / 463;
frskyData.frskyHubData.gpsFix = 1;
frskyData.frskyHubData.gpsLatitude_bp = 4401;
frskyData.frskyHubData.gpsLatitude_ap = 7710;
frskyData.frskyHubData.gpsLongitude_bp = 1006;
frskyData.frskyHubData.gpsLongitude_ap = 8872;
frskyData.frskyHubData.gpsSpeed_bp = (100 * 250) / 463;
getGpsPilotPosition();
frskyHubData.gpsLatitude_bp = 4401;
frskyHubData.gpsLatitude_ap = 7455;
frskyHubData.gpsLongitude_bp = 1006;
frskyHubData.gpsLongitude_ap = 9533;
frskyData.frskyHubData.gpsLatitude_bp = 4401;
frskyData.frskyHubData.gpsLatitude_ap = 7455;
frskyData.frskyHubData.gpsLongitude_bp = 1006;
frskyData.frskyHubData.gpsLongitude_ap = 9533;
getGpsDistance();
frskyHubData.cellsCount = 6;
frskyData.frskyHubData.cellsCount = 6;
frskyHubData.gpsAltitude_bp = 50;
frskyHubData.baroAltitude_bp = 50;
frskyHubData.minAltitude = 10;
frskyHubData.maxAltitude = 500;
frskyData.frskyHubData.gpsAltitude_bp = 50;
frskyData.frskyHubData.baroAltitude_bp = 50;
frskyData.frskyHubData.minAltitude = 10;
frskyData.frskyHubData.maxAltitude = 500;
frskyHubData.accelY = 100;
frskyHubData.temperature1 = -30;
frskyHubData.maxTemperature1 = 100;
frskyHubData.maxCurrent = 56;
consumption=0;
s_currTmr = g_tmr10ms;
frskyHubData.current = 5;
frskyData.frskyHubData.accelY = 100;
frskyData.frskyHubData.temperature1 = -30;
frskyData.frskyHubData.maxTemperature1 = 100;
frskyData.frskyHubData.current = 5;
frskyData.frskyHubData.maxCurrent = 56;
#endif
}
@ -942,8 +900,6 @@ const pm_uint8_t bchunit_ar[] PROGMEM = {
UNIT_KTS, // Speed
UNIT_METERS, // Dist
UNIT_METERS, // GPS Alt
UNIT_AMPS, // current
UNIT_MILLIAMPS, // current consumption
};
void putsTelemetryChannel(uint8_t x, uint8_t y, uint8_t channel, int16_t val, uint8_t att)
@ -983,6 +939,15 @@ void putsTelemetryChannel(uint8_t x, uint8_t y, uint8_t channel, int16_t val, ui
putsTelemetryValue(x, y, val, UNIT_VOLTS, att|PREC2);
break;
case TELEM_CURRENT-1:
case TELEM_MAX_CURRENT-1:
putsTelemetryValue(x, y, val, UNIT_AMPS, att);
break;
case TELEM_CONSUMPTION-1:
putsTelemetryValue(x, y, val, UNIT_MAH, att);
break;
case TELEM_ACCx-1:
case TELEM_ACCy-1:
case TELEM_ACCz-1:
@ -995,15 +960,6 @@ void putsTelemetryChannel(uint8_t x, uint8_t y, uint8_t channel, int16_t val, ui
putsTelemetryValue(x, y, val, UNIT_RAW, att);
break;
case TELEM_CURRENT-1:
case TELEM_MAX_CURRENT-1:
putsTelemetryValue(x, y, val, UNIT_AMPS, att);
break;
case TELEM_CONSUMPTION-1:
putsTelemetryValue(x, y, val, UNIT_MILLIAMPS, att);
break;
#if defined(IMPERIAL_UNITS)
case TELEM_ALT-1:
case TELEM_MIN_ALT-1:
@ -1044,11 +1000,11 @@ void displayRssiLine()
{
if (frskyStreaming > 0) {
lcd_hline(0, 55, 128, 0); // separator
uint8_t rssi = min((uint8_t)99, frskyRSSI[1].value);
uint8_t rssi = min((uint8_t)99, frskyData.frskyRSSI[1].value);
lcd_putsLeft(7*FH+1, STR_TX); lcd_outdezNAtt(4*FW, 7*FH+1, rssi, LEADING0, 2);
lcd_rect(25, 57, 38, 7);
lcd_filled_rect(26, 58, 4*rssi/11, 5, (rssi < getRssiAlarmValue(0)) ? DOTTED : SOLID);
rssi = min((uint8_t)99, frskyRSSI[0].value);
rssi = min((uint8_t)99, frskyData.frskyRSSI[0].value);
lcd_puts(105, 7*FH+1, STR_RX); lcd_outdezNAtt(105+4*FW-1, 7*FH+1, rssi, LEADING0, 2);
lcd_rect(65, 57, 38, 7);
uint8_t v = 4*rssi/11;
@ -1065,17 +1021,17 @@ void displayGpsTime()
{
#define TIME_LINE (7*FH+1)
uint8_t att = (frskyStreaming > 0 ? LEFT|LEADING0 : LEFT|LEADING0|BLINK);
lcd_outdezNAtt(6*FW+5, TIME_LINE, frskyHubData.hour, att, 2);
lcd_outdezNAtt(6*FW+5, TIME_LINE, frskyData.frskyHubData.hour, att, 2);
lcd_putcAtt(8*FW+2, TIME_LINE, ':', att);
lcd_outdezNAtt(9*FW+2, TIME_LINE, frskyHubData.min, att, 2);
lcd_outdezNAtt(9*FW+2, TIME_LINE, frskyData.frskyHubData.min, att, 2);
lcd_putcAtt(11*FW-1, TIME_LINE, ':', att);
lcd_outdezNAtt(12*FW-1, TIME_LINE, frskyHubData.sec, att, 2);
lcd_outdezNAtt(12*FW-1, TIME_LINE, frskyData.frskyHubData.sec, att, 2);
lcd_status_line();
}
void displayGpsCoord(uint8_t y, char direction, int16_t bp, int16_t ap)
{
if (frskyHubData.gpsFix >= 0) {
if (frskyData.frskyHubData.gpsFix >= 0) {
if (!direction) direction = '-';
lcd_outdezAtt(10*FW, y, bp / 100, LEFT); // ddd before '.'
@ -1162,9 +1118,9 @@ void menuProcFrsky(uint8_t event)
if (frskyStreaming > 0) {
if (field == TELEM_ACC) {
lcd_putsLeft(7*FH+1, STR_ACCEL);
lcd_outdezNAtt(4*FW, 7*FH+1, frskyHubData.accelX, LEFT|PREC2);
lcd_outdezNAtt(10*FW, 7*FH+1, frskyHubData.accelY, LEFT|PREC2);
lcd_outdezNAtt(16*FW, 7*FH+1, frskyHubData.accelZ, LEFT|PREC2);
lcd_outdezNAtt(4*FW, 7*FH+1, frskyData.frskyHubData.accelX, LEFT|PREC2);
lcd_outdezNAtt(10*FW, 7*FH+1, frskyData.frskyHubData.accelY, LEFT|PREC2);
lcd_outdezNAtt(16*FW, 7*FH+1, frskyData.frskyHubData.accelZ, LEFT|PREC2);
break;
}
else if (field == TELEM_GPS_TIME) {
@ -1261,19 +1217,19 @@ void menuProcFrsky(uint8_t event)
if (g_model.frsky.channels[i].ratio) {
blink = (FRSKY_alarmRaised(i) ? INVERS : 0);
putsStrIdx(0, y, STR_A, i+1, TWO_DOTS);
putsTelemetryChannel(3*FW, y, i+MAX_TIMERS, frskyTelemetry[i].value, blink|DBLSIZE|LEFT);
lcd_putc(12*FW-1, y-FH, '<'); putsTelemetryChannel(17*FW, y-FH, i+MAX_TIMERS, frskyTelemetry[i].min, NO_UNIT);
lcd_putc(12*FW, y, '>'); putsTelemetryChannel(17*FW, y, i+MAX_TIMERS, frskyTelemetry[i].max, NO_UNIT);
putsTelemetryChannel(3*FW, y, i+MAX_TIMERS, frskyData.frskyTelemetry[i].value, blink|DBLSIZE|LEFT);
lcd_putc(12*FW-1, y-FH, '<'); putsTelemetryChannel(17*FW, y-FH, i+MAX_TIMERS, frskyData.frskyTelemetry[i].min, NO_UNIT);
lcd_putc(12*FW, y, '>'); putsTelemetryChannel(17*FW, y, i+MAX_TIMERS, frskyData.frskyTelemetry[i].max, NO_UNIT);
y += 3*FH;
}
}
#ifdef FRSKY_HUB
// Cells voltage
if (frskyHubData.cellsCount > 0) {
if (frskyData.frskyHubData.cellsCount > 0) {
uint8_t y = 1*FH;
for (uint8_t k=0; k<frskyHubData.cellsCount && k<6; k++) {
uint8_t attr = (barsThresholds[THLD_CELL] && frskyHubData.cellVolts[k] < barsThresholds[THLD_CELL]) ? BLINK|PREC2 : PREC2;
lcd_outdezNAtt(21*FW, y, frskyHubData.cellVolts[k] * 2, attr, 4);
for (uint8_t k=0; k<frskyData.frskyHubData.cellsCount && k<6; k++) {
uint8_t attr = (barsThresholds[THLD_CELL] && frskyData.frskyHubData.cellVolts[k] < barsThresholds[THLD_CELL]) ? BLINK|PREC2 : PREC2;
lcd_outdezNAtt(21*FW, y, frskyData.frskyHubData.cellVolts[k] * 2, attr, 4);
y += 1*FH;
}
lcd_vline(17*FW+4, 8, 47);
@ -1288,20 +1244,20 @@ void menuProcFrsky(uint8_t event)
if (g_model.frsky.usrProto == USR_PROTO_FRSKY_HUB) {
// Latitude
lcd_putsLeft(line, STR_LATITUDE);
displayGpsCoord(line, frskyHubData.gpsLatitudeNS, frskyHubData.gpsLatitude_bp, frskyHubData.gpsLatitude_ap);
displayGpsCoord(line, frskyData.frskyHubData.gpsLatitudeNS, frskyData.frskyHubData.gpsLatitude_bp, frskyData.frskyHubData.gpsLatitude_ap);
// Longitude
line+=1*FH+1;
lcd_putsLeft(line, STR_LONGITUDE);
displayGpsCoord(line, frskyHubData.gpsLongitudeEW, frskyHubData.gpsLongitude_bp, frskyHubData.gpsLongitude_ap);
displayGpsCoord(line, frskyData.frskyHubData.gpsLongitudeEW, frskyData.frskyHubData.gpsLongitude_bp, frskyData.frskyHubData.gpsLongitude_ap);
displayGpsTime();
line+=1*FH+1;
}
// Rssi
lcd_putsLeft(line, STR_MINRSSI);
lcd_puts(10*FW, line, STR_TX);
lcd_outdezNAtt(lcdLastPos, line, frskyRSSI[1].min, LEFT|LEADING0, 2);
lcd_outdezNAtt(lcdLastPos, line, frskyData.frskyRSSI[1].min, LEFT|LEADING0, 2);
lcd_puts(16*FW, line, STR_RX);
lcd_outdezNAtt(lcdLastPos, line, frskyRSSI[0].min, LEFT|LEADING0, 2);
lcd_outdezNAtt(lcdLastPos, line, frskyData.frskyRSSI[0].min, LEFT|LEADING0, 2);
}
#endif
}

View file

@ -52,7 +52,7 @@ enum AlarmLevel {
#define ALARM_GREATER(channel, alarm) ((g_model.frsky.channels[channel].alarms_greater >> alarm) & 1)
#define ALARM_LEVEL(channel, alarm) ((g_model.frsky.channels[channel].alarms_level >> (2*alarm)) & 3)
class FrskyRSSI {
class FrskyValueWithMin {
public:
uint8_t value;
uint8_t min;
@ -60,7 +60,7 @@ class FrskyRSSI {
void set(uint8_t value);
};
class FrskyData: public FrskyRSSI {
class FrskyValueWithMinMax: public FrskyValueWithMin {
public:
uint8_t max;
void set(uint8_t value, uint8_t unit);
@ -119,7 +119,6 @@ PACK(struct FrskyHubData {
uint16_t current; // 0x28 Current
int16_t varioAltitudeQueue[VARIO_QUEUE_LENGTH]; //circular buffer
int32_t varioAltitude_cm;
int16_t varioSpeed;
/* next fields must keep this order! */
int16_t minAltitude;
int16_t maxAltitude;
@ -128,6 +127,7 @@ PACK(struct FrskyHubData {
int16_t maxTemperature2;
uint16_t maxGpsSpeed;
uint16_t maxGpsDistance;
uint16_t maxCurrent;
/* end */
int16_t varioAcc1;
int16_t varioAcc2;
@ -136,9 +136,9 @@ PACK(struct FrskyHubData {
// end of FrSky Hub data
uint16_t gpsDistance;
int16_t gpsAltitudeOffset;
int16_t varioSpeed;
uint8_t varioAltitudeQueuePointer; // circular-buffer pointer
uint8_t minCellIdx;
uint16_t maxCurrent;
});
#elif defined(WS_HOW_HIGH)
@ -150,23 +150,34 @@ struct FrskyHubData {
#endif
struct FrskyData {
FrskyValueWithMinMax frskyTelemetry[2];
FrskyValueWithMin frskyRSSI[2];
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
FrskyHubData frskyHubData;
#endif
uint16_t currentConsumption;
uint16_t currentPrescale;
};
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
extern FrskyHubData frskyHubData;
extern uint8_t barsThresholds[];
#endif
// Global Fr-Sky telemetry data variables
extern int8_t frskyStreaming; // >0 (true) == data is streaming in. 0 = nodata detected for some time
extern uint8_t frskyUsrStreaming;
extern uint32_t consumption;
#define SEND_MODEL_ALARMS 6
extern uint8_t FrskyAlarmSendState;
extern FrskyData frskyTelemetry[2];
extern FrskyRSSI frskyRSSI[2];
extern FrskyData frskyData;
extern uint8_t frskyTxBuffer[FRSKY_TX_PACKET_SIZE];
extern uint8_t frskyTxBufferCount;
void FRSKY_Init(void);
void check_frsky(void);
@ -175,6 +186,8 @@ inline void FRSKY_setModelAlarms(void)
FrskyAlarmSendState = SEND_MODEL_ALARMS;
}
extern void frskyEvalCurrentConsumptionBoundary();
bool FRSKY_alarmRaised(uint8_t idx);
void resetTelemetry();

View file

@ -523,9 +523,10 @@ extern uint32_t Cmd_A41_resp;
#define OCR_SD_CCS (0)
#endif
const char STR_DELETE_FILE[] = "Delete";
const char STR_COPY_FILE[] = "Copy";
const char STR_RENAME_FILE[] = "Rename";
const pm_char STR_PLAY_FILE[] PROGMEM = "Play";
const pm_char STR_DELETE_FILE[] PROGMEM = "Delete";
const pm_char STR_COPY_FILE[] PROGMEM = "Copy";
const pm_char STR_RENAME_FILE[] PROGMEM = "Rename";
void menuProcSd(uint8_t event)
{
@ -536,6 +537,8 @@ void menuProcSd(uint8_t event)
TCHAR lfn[_MAX_LFN + 1];
fno.lfname = lfn;
fno.lfsize = sizeof(lfn);
#else
char lfn[32];
#endif
uint8_t _event = event;
@ -549,7 +552,10 @@ void menuProcSd(uint8_t event)
switch(event) {
case EVT_ENTRY:
#if defined(PCBV4)
// TODO as ARM
f_mount(0, &g_FATFS_Obj);
#endif
f_chdir("/");
reusableBuffer.sd.offset = 255;
break;
@ -562,6 +568,7 @@ void menuProcSd(uint8_t event)
killEvents(event);
f_chdir(reusableBuffer.sd.lines[index]);
s_pgOfs = 0;
m_posVert = 1;
reusableBuffer.sd.offset = 255;
}
}
@ -570,6 +577,13 @@ void menuProcSd(uint8_t event)
case EVT_KEY_LONG(KEY_MENU):
killEvents(event);
if (m_posVert > 0) {
#if defined(PCBARM)
uint8_t index = m_posVert-1-s_pgOfs;
char * line = reusableBuffer.sd.lines[index];
if (!strcmp(line+strlen(line)-4, ".wav")) {
s_menu[s_menu_count++] = STR_PLAY_FILE;
}
#endif
s_menu[s_menu_count++] = STR_DELETE_FILE;
s_menu[s_menu_count++] = STR_RENAME_FILE;
s_menu[s_menu_count++] = STR_COPY_FILE;
@ -613,7 +627,7 @@ void menuProcSd(uint8_t event)
for (uint8_t i=0; i<7; i++) {
uint8_t y = FH+i*FH;
uint8_t x = 0;
uint8_t attr = (m_posVert-1-s_pgOfs == i ? INVERS : 0);
uint8_t attr = (m_posVert-1-s_pgOfs == i ? BSS|INVERS : BSS);
if (reusableBuffer.sd.flags[i]) { lcd_putcAtt(0, y, '[', attr); x += FW; }
lcd_putsAtt(x, y, reusableBuffer.sd.lines[i], attr);
if (reusableBuffer.sd.flags[i]) { lcd_putcAtt(lcdLastPos, y, ']', attr); }
@ -625,15 +639,23 @@ void menuProcSd(uint8_t event)
uint8_t index = m_posVert-1-s_pgOfs;
if (result == STR_DELETE_FILE) {
f_getcwd(lfn, SD_SCREEN_FILE_LENGTH);
strcat_P(lfn, "/");
strcat_P(lfn, reusableBuffer.sd.lines[index]);
strcat_P(lfn, PSTR("/"));
strcat(lfn, reusableBuffer.sd.lines[index]);
f_unlink(lfn);
strncpy(statusLineMsg, reusableBuffer.sd.lines[index], 13);
strcpy_P(statusLineMsg+min((uint8_t)strlen(statusLineMsg), (uint8_t)13), PSTR(" removed"));
showStatusLine();
if (m_posVert == reusableBuffer.sd.count) m_posVert--;
if ((uint16_t)m_posVert == reusableBuffer.sd.count) m_posVert--;
reusableBuffer.sd.offset = s_pgOfs-1;
}
#if defined(PCBARM)
else if (result == STR_PLAY_FILE) {
f_getcwd(lfn, SD_SCREEN_FILE_LENGTH);
strcat_P(lfn, PSTR("/"));
strcat(lfn, reusableBuffer.sd.lines[index]);
playFile(lfn);
}
#endif
}
}
}
@ -725,9 +747,6 @@ void menuProcDiagVers(uint8_t event)
lcd_putsLeft(5*FH, stamp4);
lcd_putsLeft(7*FH, STR_EEPROMV);
lcd_outdezAtt(8*FW, 7*FH, g_eeGeneral.myVers, LEFT);
#if defined(PCBARM) && defined(SDCARD)
lcd_puts(12*FW, 7*FH, Card_state == 8 /* TODO SD_ST_DATA*/ ? "SDCARD OK" : "NO SDCARD");
#endif
}
void menuProcDiagKeys(uint8_t event)

View file

@ -130,31 +130,31 @@ void writeLogs()
#ifdef FRSKY
f_printf(&g_oLogFile, "%d,", frskyStreaming);
f_printf(&g_oLogFile, "%d,", frskyRSSI[0].value);
f_printf(&g_oLogFile, "%d,", frskyRSSI[1].value);
f_printf(&g_oLogFile, "%d,", frskyTelemetry[0].value);
f_printf(&g_oLogFile, "%d,", frskyTelemetry[1].value);
f_printf(&g_oLogFile, "%d,", frskyData.frskyRSSI[0].value);
f_printf(&g_oLogFile, "%d,", frskyData.frskyRSSI[1].value);
f_printf(&g_oLogFile, "%d,", frskyData.frskyTelemetry[0].value);
f_printf(&g_oLogFile, "%d,", frskyData.frskyTelemetry[1].value);
#endif
#ifdef FRSKY_HUB
if (g_model.frsky.usrProto == USR_PROTO_FRSKY_HUB) {
f_printf(&g_oLogFile, "%4d-%02d-%02d,", frskyHubData.year+2000, frskyHubData.month, frskyHubData.day);
f_printf(&g_oLogFile, "%02d:%02d:%02d,", frskyHubData.hour, frskyHubData.min, frskyHubData.sec);
f_printf(&g_oLogFile, "%03d.%04d%c,", frskyHubData.gpsLongitude_bp, frskyHubData.gpsLongitude_ap,
frskyHubData.gpsLongitudeEW ? frskyHubData.gpsLongitudeEW : '-');
f_printf(&g_oLogFile, "%03d.%04d%c,", frskyHubData.gpsLatitude_bp, frskyHubData.gpsLatitude_ap,
frskyHubData.gpsLatitudeNS ? frskyHubData.gpsLatitudeNS : '-');
f_printf(&g_oLogFile, "%03d.%d,", frskyHubData.gpsCourse_bp, frskyHubData.gpsCourse_ap);
f_printf(&g_oLogFile, "%d.%d,", frskyHubData.gpsSpeed_bp, frskyHubData.gpsSpeed_ap);
f_printf(&g_oLogFile, "%03d.%d,", frskyHubData.gpsAltitude_bp, frskyHubData.gpsAltitude_ap);
f_printf(&g_oLogFile, "%d.%d,", frskyHubData.baroAltitude_bp, frskyHubData.baroAltitude_ap);
f_printf(&g_oLogFile, "%d,", frskyHubData.temperature1);
f_printf(&g_oLogFile, "%d,", frskyHubData.temperature2);
f_printf(&g_oLogFile, "%d,", frskyHubData.rpm);
f_printf(&g_oLogFile, "%d,", frskyHubData.fuelLevel);
f_printf(&g_oLogFile, "%d,", frskyHubData.volts);
f_printf(&g_oLogFile, "%d,", frskyHubData.accelX);
f_printf(&g_oLogFile, "%d,", frskyHubData.accelY);
f_printf(&g_oLogFile, "%d,", frskyHubData.accelZ);
f_printf(&g_oLogFile, "%4d-%02d-%02d,", frskyData.frskyHubData.year+2000, frskyData.frskyHubData.month, frskyData.frskyHubData.day);
f_printf(&g_oLogFile, "%02d:%02d:%02d,", frskyData.frskyHubData.hour, frskyData.frskyHubData.min, frskyData.frskyHubData.sec);
f_printf(&g_oLogFile, "%03d.%04d%c,", frskyData.frskyHubData.gpsLongitude_bp, frskyData.frskyHubData.gpsLongitude_ap,
frskyData.frskyHubData.gpsLongitudeEW ? frskyData.frskyHubData.gpsLongitudeEW : '-');
f_printf(&g_oLogFile, "%03d.%04d%c,", frskyData.frskyHubData.gpsLatitude_bp, frskyData.frskyHubData.gpsLatitude_ap,
frskyData.frskyHubData.gpsLatitudeNS ? frskyData.frskyHubData.gpsLatitudeNS : '-');
f_printf(&g_oLogFile, "%03d.%d,", frskyData.frskyHubData.gpsCourse_bp, frskyData.frskyHubData.gpsCourse_ap);
f_printf(&g_oLogFile, "%d.%d,", frskyData.frskyHubData.gpsSpeed_bp, frskyData.frskyHubData.gpsSpeed_ap);
f_printf(&g_oLogFile, "%03d.%d,", frskyData.frskyHubData.gpsAltitude_bp, frskyData.frskyHubData.gpsAltitude_ap);
f_printf(&g_oLogFile, "%d.%d,", frskyData.frskyHubData.baroAltitude_bp, frskyData.frskyHubData.baroAltitude_ap);
f_printf(&g_oLogFile, "%d,", frskyData.frskyHubData.temperature1);
f_printf(&g_oLogFile, "%d,", frskyData.frskyHubData.temperature2);
f_printf(&g_oLogFile, "%d,", frskyData.frskyHubData.rpm);
f_printf(&g_oLogFile, "%d,", frskyData.frskyHubData.fuelLevel);
f_printf(&g_oLogFile, "%d,", frskyData.frskyHubData.volts);
f_printf(&g_oLogFile, "%d,", frskyData.frskyHubData.accelX);
f_printf(&g_oLogFile, "%d,", frskyData.frskyHubData.accelY);
f_printf(&g_oLogFile, "%d,", frskyData.frskyHubData.accelZ);
}
#endif
for (uint8_t i=0; i<NUM_STICKS+NUM_POTS; i++)

View file

@ -142,10 +142,13 @@ bool listSDcardModels()
s_menu_flags = BSS;
uint8_t offset = 0;
#if defined(PCBV4)
// TODO as ARM
FRESULT result = f_mount(0, &g_FATFS_Obj);
if (result != FR_OK) {
return SDCARD_ERROR(result);
}
#endif
FRESULT res = f_opendir(&dir, MODELS_PATH); /* Open the directory */
if (res == FR_OK) {
@ -2325,6 +2328,7 @@ enum menuProcTelemetryItems {
ITEM_TELEMETRY_USR_PROTO,
ITEM_TELEMETRY_USR_BLADES,
#endif
ITEM_TELEMETRY_USR_CURRENT_SOURCE,
#if defined(VARIO)
ITEM_TELEMETRY_VARIO_LABEL,
ITEM_TELEMETRY_VARIO_SOURCE,
@ -2355,10 +2359,10 @@ enum menuProcTelemetryItems {
#endif
#ifdef FRSKY
#define TELEM_COL2 (8*FW-2)
#define TELEM_COL2 (8*FW-1)
void menuProcTelemetry(uint8_t event)
{
MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, ITEM_TELEMETRY_MAX+1, {0, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 1, USRDATA_LINES VARIO_LINES (uint8_t)-1, 1, 1, 1, 1, (uint8_t)-1, 2, 2, 2, 2});
MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, ITEM_TELEMETRY_MAX+1, {0, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 1, USRDATA_LINES 0, VARIO_LINES (uint8_t)-1, 1, 1, 1, 1, (uint8_t)-1, 2, 2, 2, 2});
uint8_t sub = m_posVert - 1;
@ -2367,7 +2371,8 @@ void menuProcTelemetry(uint8_t event)
case EVT_KEY_BREAK(KEY_UP):
case EVT_KEY_BREAK(KEY_LEFT):
case EVT_KEY_BREAK(KEY_RIGHT):
if (s_editMode>0 && sub<=13)
frskyEvalCurrentConsumptionBoundary();
if (s_editMode>0 && sub<=ITEM_TELEMETRY_RSSI_ALARM2)
FRSKY_setModelAlarms(); // update Fr-Sky module when edit mode exited
break;
}
@ -2385,7 +2390,7 @@ void menuProcTelemetry(uint8_t event)
case ITEM_TELEMETRY_A2_LABEL:
lcd_putsLeft(y, STR_ACHANNEL);
lcd_outdezAtt(2*FW, y, ch+1, 0);
putsTelemetryChannel(TELEM_COL2+6*FW, y, ch+MAX_TIMERS, frskyTelemetry[ch].value, LEFT);
putsTelemetryChannel(TELEM_COL2+6*FW, y, ch+MAX_TIMERS, frskyData.frskyTelemetry[ch].value, LEFT);
break;
case ITEM_TELEMETRY_A1_RANGE:
@ -2496,6 +2501,12 @@ void menuProcTelemetry(uint8_t event)
break;
#endif
case ITEM_TELEMETRY_USR_CURRENT_SOURCE:
lcd_puts(4, y, STR_CURRENT);
lcd_putsiAtt(TELEM_COL2, y, STR_CURRENTSRC, g_model.frsky.currentSource, attr);
if (attr) CHECK_INCDEC_MODELVAR(event, g_model.frsky.currentSource, 0, 2);
break;
#if defined(VARIO)
case ITEM_TELEMETRY_VARIO_LABEL:
lcd_putsLeft(y, STR_VARIO);

View file

@ -333,6 +333,7 @@ enum TelemetryUnit {
UNIT_DEGREES,
UNIT_PERCENT,
UNIT_MILLIAMPS,
UNIT_MAH,
UNIT_MAX,
UNIT_FEET,
UNIT_KTS
@ -402,7 +403,7 @@ enum VarioSource {
};
PACK(typedef struct t_FrSkyBarData {
uint16_t source:4;
uint16_t source:4; // TODO modification in next EEPROM
uint16_t barMin:6; // minimum for bar display
uint16_t barMax:6; // ditto for max display (would usually = ratio)
}) FrSkyBarData;
@ -413,12 +414,18 @@ enum FrskyUsrProtocols {
USR_PROTO_WS_HOW_HIGH
};
enum CurrentSource {
CURRENT_SOURCE_HUB,
CURRENT_SOURCE_A1,
CURRENT_SOURCE_A2
};
PACK(typedef struct t_FrSkyData {
FrSkyChannelData channels[2];
uint8_t usrProto:3; // Protocol in FrSky user data, 0=None, 1=FrSky hub, 2=WS HowHigh
uint8_t imperial:1;
uint8_t blades:2; // How many blades for RPMs, 0=2 blades, 1=3 blades
uint8_t spare:2;
uint8_t currentSource:2;
FrSkyBarData bars[4];
FrSkyRSSIAlarm rssiAlarms[2];
}) FrSkyData;
@ -593,10 +600,10 @@ PACK(typedef struct t_ModelData {
EXTDATA;
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5ms increments
uint8_t thrTraceSrc;
uint8_t modelId;
uint8_t frskyLines[4];
uint8_t frskyLines[4]; // TODO modification in next EEPROM
uint16_t frskyLinesXtra;
int8_t servoCenter[NUM_CHNOUT];

View file

@ -38,6 +38,7 @@ extern "C" {
#define MIXER_STACK_SIZE 300
#define MENUS_STACK_SIZE 300
#define AUDIO_STACK_SIZE 300
#define BT_STACK_SIZE 100
OS_TID mixerTaskId;
@ -46,6 +47,13 @@ OS_STK mixerStack[MIXER_STACK_SIZE];
OS_TID menusTaskId;
OS_STK menusStack[MENUS_STACK_SIZE];
OS_TID audioTaskId;
OS_STK audioStack[AUDIO_STACK_SIZE];
OS_TCID audioTimer;
OS_FlagID audioFlag;
OS_MutexID sdMutex;
/*OS_TID btTask;
OS_STK btStack[BT_STACK_SIZE];
OS_TCID btTimer;
@ -82,7 +90,7 @@ uint16_t g_timeMainMax;
uint8_t g_timeMainLast;
#endif
#ifdef AUDIO
#if defined(AUDIO) && !defined(PCBARM)
audioQueue audio;
#endif
@ -449,32 +457,31 @@ int16_t getValue(uint8_t i)
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT) return ex_chans[i-CSW_CHOUT_BASE];
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_TM2) return s_timerVal[i-CSW_CHOUT_BASE-NUM_CHNOUT];
#if defined(FRSKY)
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_A2) return frskyTelemetry[i-CSW_CHOUT_BASE-NUM_CHNOUT-2].value;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_RSSI_TX) return frskyRSSI[1].value;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_RSSI_RX) return frskyRSSI[0].value;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_A2) return frskyData.frskyTelemetry[i-CSW_CHOUT_BASE-NUM_CHNOUT-2].value;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_RSSI_TX) return frskyData.frskyRSSI[1].value;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_RSSI_RX) return frskyData.frskyRSSI[0].value;
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ALT) return frskyHubData.baroAltitude_bp;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ALT) return frskyData.frskyHubData.baroAltitude_bp;
#endif
#if defined(FRSKY_HUB)
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_RPM) return frskyHubData.rpm;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_FUEL) return frskyHubData.fuelLevel;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_T1) return frskyHubData.temperature1;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_T2) return frskyHubData.temperature2;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_SPEED) return frskyHubData.gpsSpeed_bp;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_DIST) return frskyHubData.gpsDistance;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_GPSALT) return frskyHubData.gpsAltitude_bp;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CELL) return (int16_t)frskyHubData.minCellVolts * 2;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CURRENT) return (int16_t)frskyHubData.current;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CONSUMPTION) return consumption/360;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCx) return frskyHubData.accelX;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCy) return frskyHubData.accelY;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCz) return frskyHubData.accelZ;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_HDG) return frskyHubData.gpsCourse_bp;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_VSPD) return frskyHubData.varioSpeed;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_A1) return frskyTelemetry[0].min;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_A2) return frskyTelemetry[1].min;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MAX_CURRENT) return frskyHubData.maxCurrent;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MAX_DIST) return *(((int16_t*)(&frskyHubData.minAltitude))+i-(CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_ALT-1));
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_RPM) return frskyData.frskyHubData.rpm;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_FUEL) return frskyData.frskyHubData.fuelLevel;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_T1) return frskyData.frskyHubData.temperature1;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_T2) return frskyData.frskyHubData.temperature2;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_SPEED) return frskyData.frskyHubData.gpsSpeed_bp;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_DIST) return frskyData.frskyHubData.gpsDistance;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_GPSALT) return frskyData.frskyHubData.gpsAltitude_bp;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CELL) return (int16_t)frskyData.frskyHubData.minCellVolts * 2;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CURRENT) return (int16_t)frskyData.frskyHubData.current;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CONSUMPTION) return frskyData.currentConsumption;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCx) return frskyData.frskyHubData.accelX;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCy) return frskyData.frskyHubData.accelY;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCz) return frskyData.frskyHubData.accelZ;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_HDG) return frskyData.frskyHubData.gpsCourse_bp;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_VSPD) return frskyData.frskyHubData.varioSpeed;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_A1) return frskyData.frskyTelemetry[0].min;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_A2) return frskyData.frskyTelemetry[1].min;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MAX_DIST) return *(((int16_t*)(&frskyData.frskyHubData.minAltitude))+i-(CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_ALT-1));
#endif
#endif
else return 0;
@ -1089,12 +1096,7 @@ void checkTrims()
AUDIO_TRIM_MIDDLE(after);
}
else {
#if defined (AUDIO)
audio.event(AU_TRIM_MOVE, after);
#else
if (event & _MSK_KEY_REPT) warble = true;
AUDIO_TRIM();
#endif
AUDIO_TRIM(event, after);
}
#if defined(PCBSTD)
return 0;
@ -1652,12 +1654,7 @@ void evalFunctions()
if ((!momentary) || (~active_switches & switch_mask)) {
if (sd->func == FUNC_PLAY_SOUND) {
#if defined(AUDIO)
audioDefevent(AU_FRSKY_FIRST+sd->param);
#else
// TODO sound with warble = !(g_tmr10ms % 60); AUDIO_WARNING2(); }
beep(3);
#endif
AUDIO_PLAY(AU_FRSKY_FIRST+sd->param);
}
#if defined(HAPTIC)
@ -2832,11 +2829,14 @@ void menusTask(void * pdata)
while (1) {
shutdown_state = check_soft_power();
#if 0
if (shutdown_state == e_power_off)
if (shutdown_state == e_power_off) {
break;
}
else if (shutdown_state == e_power_usb) {
const char STR_SDCARD[] = "SD Card";
const char STR_SDCARD[] = "Massstorage"; // TODO translations
const char STR_BOOTLOADER[] = "Bootloader";
lcd_clear();
s_menu_count = 0;
s_menu[s_menu_count++] = STR_SDCARD;
s_menu[s_menu_count++] = STR_BOOTLOADER;
uint8_t event = getEvent(false);
@ -2849,15 +2849,17 @@ void menusTask(void * pdata)
s_menu_count = 0;
}
}
refreshDisplay();
}
#else
if (shutdown_state >= e_power_usb)
if (shutdown_state >= e_power_usb) {
break;
}
#endif
perMain();
else {
perMain();
}
CoTickDelay(5); // 10ms for now
}
SysTick->CTRL = 0; // turn off systick
@ -2887,6 +2889,10 @@ void menusTask(void * pdata)
lcdSetRefVolt(0); // TODO before soft_power_off?
}
extern void audioTimerHandle(void);
extern void audioTask(void* pdata);
#endif
int main(void)
@ -3031,8 +3037,14 @@ int main(void)
// btTimer = CoCreateTmr(TMR_TYPE_PERIODIC, 1000/(1000/CFG_SYSTICK_FREQ), 1000/(1000/CFG_SYSTICK_FREQ), btTimerHandle);
// btTaskId = CoCreateTask(btTask, NULL, 19, &btStack[BT_STACK_SIZE-1], BT_STACK_SIZE);
menusTaskId = CoCreateTask(menusTask, NULL, 10, &menusStack[MENUS_STACK_SIZE-1], MENUS_STACK_SIZE);
mixerTaskId = CoCreateTask(mixerTask, NULL, 5, &mixerStack[MIXER_STACK_SIZE-1], MIXER_STACK_SIZE);
menusTaskId = CoCreateTask(menusTask, NULL, 10, &menusStack[MENUS_STACK_SIZE-1], MENUS_STACK_SIZE);
audioFlag = CoCreateFlag(true, false); // Auto-reset, start FALSE
audioTimer = CoCreateTmr(TMR_TYPE_ONE_SHOT, 1000/(1000/CFG_SYSTICK_FREQ), 1000/(1000/CFG_SYSTICK_FREQ), audioTimerHandle);
audioTaskId = CoCreateTask(audioTask, NULL, 7, &audioStack[AUDIO_STACK_SIZE-1], AUDIO_STACK_SIZE);
sdMutex = CoCreateMutex();
CoStartOS();
#else

View file

@ -47,6 +47,7 @@ Pio Pioa, Piob, Pioc;
Pwm pwm;
Twi Twio;
Usart Usart0;
Dacc dacc;
uint32_t eeprom_pointer;
char* eeprom_buffer_data;
volatile int32_t eeprom_buffer_size;
@ -354,5 +355,11 @@ int f_printf (FIL*, const TCHAR*, ...) /* Put a formatte
return 0;
}
FRESULT f_getcwd (TCHAR *path, UINT sz_path)
{
getcwd(path, sz_path);
return FR_OK;
}
uint32_t Card_state = 8;
#endif

View file

@ -99,6 +99,7 @@ extern sem_t *eeprom_write_sem;
#if defined(PCBARM)
extern Pio Pioa, Piob, Pioc;
extern Twi Twio;
extern Dacc dacc;
extern Usart Usart0;
#undef USART0
#define USART0 (&Usart0)
@ -110,6 +111,8 @@ extern Usart Usart0;
#define PIOC (&Pioc)
#undef TWI0
#define TWI0 (&Twio)
#undef DACC
#define DACC (&dacc)
extern Pwm pwm;
#undef PWM
#define PWM (&pwm)
@ -292,4 +295,11 @@ void eeprom_read_block (void *pointer_ram,
#define wdt_reset() sleep(1/*ms*/)
#define board_init()
#define CoSetFlag(...)
#define CoSetTmrCnt(...)
#define CoEnterISR(...)
#define CoExitISR(...)
#define CoStartTmr(...)
#define CoWaitForSingleFlag(...)
#endif

View file

@ -74,8 +74,6 @@ class audioQueue
// it is essentially the life of the class.
void heartbeat();
// bool freeslots(uint8_t slots);
inline bool empty() {
return (t_queueRidx == t_queueWidx);
}
@ -132,6 +130,9 @@ void audioDefevent(uint8_t e);
#define AUDIO_VARIO_UP() audioDefevent(AU_KEYPAD_UP)
#define AUDIO_VARIO_DOWN() audioDefevent(AU_KEYPAD_DOWN)
#define AUDIO_TRIM_MIDDLE(f) audio.event(AU_TRIM_MIDDLE, f)
#define AUDIO_TRIM(event, f) audio.event(AU_TRIM_MOVE, f)
#define AUDIO_PLAY(p) audio.event(p)
#define AUDIO_VARIO(f, t) audio.play(f, t, 0, PLAY_SOUND_VARIO)
#define AUDIO_DRIVER() audio.driver()
#define AUDIO_HEARTBEAT() audio.heartbeat()

View file

@ -71,6 +71,7 @@ const pm_char STR_OPEN9X[] PROGMEM =
ISTR(VALARMFN)
ISTR(VTELPROTO)
ISTR(GPSFORMAT)
ISTR(CURRENTSRC)
ISTR(VARIOSRC)
#endif
#ifdef TEMPLATES
@ -302,9 +303,12 @@ const pm_char STR_SHUTDOWN[] PROGMEM = TR_SHUTDOWN;
const pm_char STR_BATT_CALIB[] PROGMEM = TR_BATT_CALIB;
#if defined(PCBARM) || defined(FRSKY)
const pm_char STR_CURRENT[] PROGMEM = TR_CURRENT;
#endif
#if defined(PCBARM)
const pm_char STR_CURRENT_CALIB[] PROGMEM = TR_CURRENT_CALIB;
const pm_char STR_CURRENT[] PROGMEM = TR_CURRENT;
#endif
#if defined(SDCARD)

View file

@ -98,7 +98,8 @@ extern const pm_char STR_OPEN9X[];
#define OFS_VALARMFN (OFS_VALARM + sizeof(TR_VALARM))
#define OFS_VTELPROTO (OFS_VALARMFN + sizeof(TR_VALARMFN))
#define OFS_GPSFORMAT (OFS_VTELPROTO + sizeof(TR_VTELPROTO))
#define OFS_VARIOSRC (OFS_GPSFORMAT + sizeof(TR_GPSFORMAT))
#define OFS_CURRENTSRC (OFS_GPSFORMAT + sizeof(TR_GPSFORMAT))
#define OFS_VARIOSRC (OFS_CURRENTSRC + sizeof(TR_CURRENTSRC))
#define OFS_ENDTELEM (OFS_VARIOSRC + sizeof(TR_VARIOSRC))
#else
#define OFS_ENDTELEM (OFS_VTELEMCHNS + sizeof(TR_VTELEMCHNS))
@ -165,6 +166,7 @@ extern const pm_char STR_OPEN9X[];
#define STR_VALARMFN (STR_OPEN9X + OFS_VALARMFN)
#define STR_VTELPROTO (STR_OPEN9X + OFS_VTELPROTO)
#define STR_GPSFORMAT (STR_OPEN9X + OFS_GPSFORMAT)
#define STR_CURRENTSRC (STR_OPEN9X + OFS_CURRENTSRC)
#define STR_VARIOSRC (STR_OPEN9X + OFS_VARIOSRC)
#define STR_TELEMCHNS (STR_OPEN9X + OFS_TELEMCHNS)
#endif
@ -373,9 +375,12 @@ extern const pm_char STR_SHUTDOWN[];
extern const pm_char STR_BATT_CALIB[];
#if defined(PCBARM) || defined(FRSKY)
extern const pm_char STR_CURRENT[];
#endif
#if defined(PCBARM)
extern const pm_char STR_CURRENT_CALIB[];
extern const pm_char STR_CURRENT[];
#define LEN_CALIB_FIELDS (PSIZE(TR_BATT_CALIB) > PSIZE(TR_CURRENT_CALIB) ? PSIZE(TR_BATT_CALIB) : PSIZE(TR_CURRENT_CALIB))
#else
#define LEN_CALIB_FIELDS PSIZE(TR_BATT_CALIB)

View file

@ -138,7 +138,7 @@
#define TR_FUNCSOUNDS "Warn1 ""Warn2 ""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick "
#define LEN_VTELEMCHNS "\004"
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""A\0 ""mAh\0""AccX""AccY""AccZ""Hdg\0""VSpd""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Spd+""A+\0 ""Dst+""Acc\0""Time"
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""Curr""Cnsp""AccX""AccY""AccZ""Hdg\0""VSpd""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Spd+""Dst+""Cur+""Acc\0""Time"
#ifdef IMPERIAL_UNITS
#define LENGTH_UNIT "ft\0"
@ -149,7 +149,7 @@
#endif
#define LEN_VTELEMUNIT "\003"
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0"
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0""mAh"
#define STR_V (STR_VTELEMUNIT+1)
#define STR_A (STR_VTELEMUNIT+4)
@ -168,6 +168,9 @@
#define TR_VTELPROTO ""
#endif
#define LEN_CURRENTSRC "\003"
#define TR_CURRENTSRC "Hub""A1\0""A2\0"
#define LEN_VARIOSRC "\006"
#define TR_VARIOSRC "BaroV1""BaroV2""A1\0 ""A2\0"

View file

@ -139,7 +139,7 @@
#define TR_FUNCSOUNDS "Warn 1""Warn 2""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick "
#define LEN_VTELEMCHNS "\004"
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""A\0 ""mAh\0""AccX""AccY""AccZ""Hdg\0""VSpd""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Spd+""A+\0 ""Dst+""Acc\0""Time"
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""Curr""Cnsp""AccX""AccY""AccZ""Hdg\0""VSpd""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Spd+""Dst+""Cur+""Acc\0""Time"
#ifdef IMPERIAL_UNITS
#define LENGTH_UNIT "ft\0"
@ -150,7 +150,7 @@
#endif
#define LEN_VTELEMUNIT "\003"
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0"
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0""mAh"
#define STR_V (STR_VTELEMUNIT+1)
#define STR_A (STR_VTELEMUNIT+4)
@ -168,7 +168,10 @@
#else
#define TR_VTELPROTO ""
#endif
#define LEN_CURRENTSRC "\003"
#define TR_CURRENTSRC "Hub""A1\0""A2\0"
#define LEN_VARIOSRC "\006"
#define TR_VARIOSRC "BaroV1""BaroV2""A1\0 ""A2\0"

View file

@ -139,7 +139,7 @@
#define TR_FUNCSOUNDS "Warn1 ""Warn2 ""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick "
#define LEN_VTELEMCHNS "\004"
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""A\0 ""mAh\0""AccX""AccY""AccZ""Hdg\0""VSpd""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Spd+""A+\0 ""Dst+""Acc\0""Time"
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""Curr""Cnsp""AccX""AccY""AccZ""Hdg\0""VSpd""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Spd+""Dst+""Cur+""Acc\0""Time"
#ifdef IMPERIAL_UNITS
#define LENGTH_UNIT "ft\0"
@ -150,7 +150,7 @@
#endif
#define LEN_VTELEMUNIT "\003"
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0"
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0""mAh"
#define STR_V (STR_VTELEMUNIT+1)
#define STR_A (STR_VTELEMUNIT+4)
@ -169,6 +169,9 @@
#define TR_VTELPROTO ""
#endif
#define LEN_CURRENTSRC "\003"
#define TR_CURRENTSRC "Hub""A1\0""A2\0"
#define LEN_VARIOSRC "\006"
#define TR_VARIOSRC "BaroV1""BaroV2""A1\0 ""A2\0"

View file

@ -133,7 +133,7 @@
#define TR_FUNCSOUNDS "Warn1 ""Warn2 ""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick "
#define LEN_VTELEMCHNS "\004"
#define TR_VTELEMCHNS "---\0""Chr1""Chr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""Alt\0""Rpm\0""Carb""T1\0 ""T2\0 ""Vit\0""Dist""AltG""Elem""A\0 ""mAh\0""AccX""AccY""AccZ""Cap\0""VitV""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Vit+""A+\0 ""Dst+""Acc\0""Time"
#define TR_VTELEMCHNS "---\0""Chr1""Chr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""Alt\0""Rpm\0""Carb""T1\0 ""T2\0 ""Vit\0""Dist""AltG""Elem""Cour""Cnsm""AccX""AccY""AccZ""Cap\0""VitV""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Vit+""Dst+""Cur+""Acc\0""Time"
#ifdef IMPERIAL_UNITS
#define LENGTH_UNIT "ft\0"
@ -144,7 +144,7 @@
#endif
#define LEN_VTELEMUNIT "\003"
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0"
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0""mAh"
#define STR_V (STR_VTELEMUNIT+1)
#define STR_A (STR_VTELEMUNIT+4)
@ -163,6 +163,9 @@
#define TR_VTELPROTO ""
#endif
#define LEN_CURRENTSRC "\003"
#define TR_CURRENTSRC "Hub""A1\0""A2\0"
#define LEN_VARIOSRC "\006"
#define TR_VARIOSRC "BaroV1""BaroV2""A1\0 ""A2\0"

View file

@ -138,7 +138,7 @@
#define TR_FUNCSOUNDS "Warn1 ""Warn2 ""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick "
#define LEN_VTELEMCHNS "\004"
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""Alt\0""Rpm\0""Carb""T1\0 ""T2\0 ""Vel\0""Dist""GAlt""Cell""A\0 ""mAh\0""AccX""AccY""AccZ""Dir\0""VelV""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Vel+""A+\0 ""Dst+""Acc\0""Time"
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""Alt\0""Rpm\0""Carb""T1\0 ""T2\0 ""Vel\0""Dist""GAlt""Cell""Curr""Cnsp""AccX""AccY""AccZ""Dir\0""VelV""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Vel+""Dst+""Cur+""Acc\0""Time"
#ifdef IMPERIAL_UNITS
#define LENGTH_UNIT "ft\0"
@ -149,7 +149,7 @@
#endif
#define LEN_VTELEMUNIT "\003"
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0"
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0""mAh"
#define STR_V (STR_VTELEMUNIT+1)
#define STR_A (STR_VTELEMUNIT+4)
@ -168,6 +168,9 @@
#define TR_VTELPROTO ""
#endif
#define LEN_CURRENTSRC "\003"
#define TR_CURRENTSRC "Hub""A1\0""A2\0"
#define LEN_VARIOSRC "\006"
#define TR_VARIOSRC "BaroV1""BaroV2""A1\0 ""A2\0"

View file

@ -133,7 +133,7 @@
#define TR_FUNCSOUNDS "Varn1 ""Varn2 ""F\200r ""Ring ""SciFi ""Robot ""Pip ""Tada ""Syrsa ""Siren ""Alarm ""Ratata""Tick "
#define LEN_VTELEMCHNS "\004"
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""H\202jd""Varv""Tank""T1\0 ""T2\0 ""Fart""Avst""GHjd""Batt""A\0 ""mAh\0""AccX""AccY""AccZ""Hdg\0""VFrt""A1-\0""A2-\0""Hjd-""Hjd+""Rpm+""T1+\0""T2+\0""Frt+""A+\0 ""Avs+""Acc\0""Tid\0"
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""H\202jd""Varv""Tank""T1\0 ""T2\0 ""Fart""Avst""GHjd""Batt""Curr""Cnsp""AccX""AccY""AccZ""Hdg\0""VFrt""A1-\0""A2-\0""Hjd-""Hjd+""Rpm+""T1+\0""T2+\0""Frt+""Avs+""Cur+""Acc\0""Tid\0"
#ifdef IMPERIAL_UNITS
#define LENGTH_UNIT "fot"
@ -144,7 +144,7 @@
#endif
#define LEN_VTELEMUNIT "\003"
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0"
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0""mAh"
#define STR_V (STR_VTELEMUNIT+1)
#define STR_A (STR_VTELEMUNIT+4)
@ -163,6 +163,9 @@
#define TR_VTELPROTO ""
#endif
#define LEN_CURRENTSRC "\003"
#define TR_CURRENTSRC "Hub""A1\0""A2\0"
#define LEN_VARIOSRC "\006"
#define TR_VARIOSRC "BaroV1""BaroV2""A1 ""A2\0"

View file

@ -5,7 +5,8 @@ import os, sys, shutil, platform, subprocess
def generate(str, idx):
if platform.system() == "Windows":
subprocess.Popen(["C:\Program Files\eSpeak\command_line\espeak.exe", "-w", "%04d.wav" % idx, str], stdout=subprocess.PIPE, stderr=subprocess.PIPE).wait()
subprocess.Popen(["D:\Perso\workspace\companion9x\AD4CONVERTER.EXE", "-E4", "%04d.WAV" % idx], stdout=subprocess.PIPE, stderr=subprocess.PIPE).wait()
if 'ad4' in sys.argv:
subprocess.Popen(["D:\Perso\workspace\companion9x\AD4CONVERTER.EXE", "-E4", "%04d.WAV" % idx], stdout=subprocess.PIPE, stderr=subprocess.PIPE).wait()
if __name__ == "__main__":