1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-26 01:35:21 +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 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. support to change task priority while CoOS running.
*/ */
#define CFG_TASK_SCHEDULE_EN (0) #define CFG_TASK_SCHEDULE_EN (1)
/*---------------------- Task Management Config -----------------------------*/ /*---------------------- Task Management Config -----------------------------*/
@ -232,7 +232,7 @@ Enable(1) or disable(0) flag management.
Max number of flag is 32. Max number of flag is 32.
*/ */
#if CFG_TASK_WAITTING_EN > 0 #if CFG_TASK_WAITTING_EN > 0
#define CFG_FLAG_EN (0) #define CFG_FLAG_EN (1)
#endif #endif
@ -242,7 +242,7 @@ Enable(1) or disable(0) mutex management.
*/ */
#if CFG_TASK_WAITTING_EN > 0 #if CFG_TASK_WAITTING_EN > 0
#if CFG_TASK_SCHEDULE_EN > 0 #if CFG_TASK_SCHEDULE_EN > 0
#define CFG_MUTEX_EN (0) #define CFG_MUTEX_EN (1)
#endif #endif
#endif #endif

View file

@ -333,7 +333,7 @@ ifeq ($(PCB), ARM)
EXTRAINCDIRS += ersky9x CoOS/kernel CoOS/portable EXTRAINCDIRS += ersky9x CoOS/kernel CoOS/portable
BOARDSRC = board_ersky9x.cpp BOARDSRC = board_ersky9x.cpp
SRC += ersky9x/core_cm3.c ersky9x/board_lowlevel.c ersky9x/crt.c ersky9x/vectors_sam3s.c 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 SRC += FatFs/ff.c FatFs/fattime.c FatFs/option/ccsbcs.c ersky9x/diskio.c
EEPROMSRC = eeprom_arm.cpp EEPROMSRC = eeprom_arm.cpp
PULSESSRC = pulses_arm.cpp PULSESSRC = pulses_arm.cpp
@ -632,7 +632,7 @@ FOXLIB=-L/usr/local/lib \
-Wl,-rpath,$(FOXPATH)/src/.libs -Wl,-rpath,$(FOXPATH)/src/.libs
simu: stamp_header $(BOARDSRC) $(CPPSRC) Makefile simu.cpp simpgmspace.cpp *.h *.lbm eeprom.bin 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: eeprom.bin:
dd if=/dev/zero of=$@ bs=1 count=2048 dd if=/dev/zero of=$@ bs=1 count=2048
@ -719,6 +719,7 @@ clean_list :
$(REMOVE) $(SRC:.c=.s) $(REMOVE) $(SRC:.c=.s)
$(REMOVE) *.o $(REMOVE) *.o
$(REMOVE) */*.o $(REMOVE) */*.o
$(REMOVE) */*/*.o
$(REMOVE) *.d $(REMOVE) *.d
$(REMOVE) *.lst $(REMOVE) *.lst
$(REMOVE) allsrc.cpp $(REMOVE) allsrc.cpp

View file

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

View file

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

View file

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

View file

@ -33,7 +33,30 @@
#include "../open9x.h" #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; toneTimeLeft = 0;
tonePause = 0; tonePause = 0;
@ -42,80 +65,105 @@ audioQueue::audioQueue()
t_queueWidx = 0; t_queueWidx = 0;
} }
// heartbeat is responsibile for issueing the audio tones and general square waves void audioTimerHandle(void)
// it is essentially the life of the class.
// it is called every 10ms
void audioQueue::heartbeat()
{ {
#if defined(SIMU) CoSetFlag(audioFlag);
return; }
#endif
if (toneTimeLeft > 0) { // TODO Should be here!
if (toneChanged) { extern uint16_t Sine_values[];
toneChanged = 0;
set_frequency(toneFreq * 61 / 2);
if(toneRateLimit == 0){ //only start if within rate limit void audioTask(void* pdata)
if(toneFreq == 0){ {
tone_stop(); static FIL wavFile;
} else {
tone_start(0); 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();
} }
toneRateLimit++; //count up the rate limit #if 1
if(toneRateLimit == TONE1_RATE_LIMIT){ //reset the rate limit
toneRateLimit = 0;
}
}
else if (toneFreqIncr && (toneTimeLeft&1) == 0) {
toneFreq += toneFreqIncr;
set_frequency(toneFreq * 61 / 2);
}
toneTimeLeft--; //time gets counted down
}
else { else {
if (tonePause > 0) { read /= 2;
tone_stop(); for (uint32_t i=0; i<read; i++) {
toneRateLimit = 0; //reset rate limit bufdata[i] = ((uint16_t)0x8000 + ((int16_t)(bufdata[i]))) >> 4;
tonePause--; //time gets counted down }
}
#endif
}
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);
}
else if (tonePause > 0) {
CoSetTmrCnt(audioTimer, tonePause, 0);
tonePause = 0;
toneStop();
CoStartTmr(audioTimer);
} }
else if (t_queueRidx != t_queueWidx) { else if (t_queueRidx != t_queueWidx) {
toneChanged = 1;
toneFreq = queueToneFreq[t_queueRidx]; toneFreq = queueToneFreq[t_queueRidx];
toneTimeLeft = queueToneLength[t_queueRidx]; toneTimeLeft = queueToneLength[t_queueRidx];
toneFreqIncr = queueToneFreqIncr[t_queueRidx]; // TODO ? toneFreqIncr = queueToneFreqIncr[t_queueRidx];
tonePause = queueTonePause[t_queueRidx]; tonePause = queueTonePause[t_queueRidx];
if (!queueToneRepeat[t_queueRidx]--) { if (!queueToneRepeat[t_queueRidx]--) {
t_queueRidx = (t_queueRidx + 1) % AUDIO_QUEUE_LENGTH; 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 { else {
if (tone2TimeLeft > 0) { audioState = 0;
if (tone2Changed) { toneStop();
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
}
}
} }
} }
} }
inline uint8_t audioQueue::getToneLength(uint8_t tLen) inline uint8_t getToneLength(uint8_t tLen)
{ {
uint8_t result = tLen; // default uint8_t result = tLen; // default
if (g_eeGeneral.beeperLength < 0) { if (g_eeGeneral.beeperLength < 0) {
@ -127,32 +175,33 @@ inline uint8_t audioQueue::getToneLength(uint8_t tLen)
return result; 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) uint8_t tFlags, int8_t tFreqIncr)
{ {
if (tFlags & PLAY_SOUND_VARIO) { if (tFlags & PLAY_SOUND_VARIO) {
tone2Changed = 1;
tone2Freq = tFreq; tone2Freq = tFreq;
tone2TimeLeft = tLen; tone2TimeLeft = tLen;
tone2Pause = tPause; tone2Pause = tPause;
if (audioState == 0) CoSetFlag(audioFlag);
} }
else { else {
if (tFreq > 0) { //we dont add pitch if zero as this is a pause only event 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 tFreq += g_eeGeneral.speakerPitch + BEEP_OFFSET; // add pitch compensator
} }
tLen = getToneLength(tLen); tLen = getToneLength(tLen);
if (tFlags & PLAY_NOW || (!busy() && empty())) { if ((tFlags & PLAY_NOW) || audioState == 0) {
toneChanged = 1; toneWavFile[0] = '\0';
toneFreq = tFreq; toneFreq = tFreq;
toneTimeLeft = tLen; toneTimeLeft = tLen;
tonePause = tPause; tonePause = tPause;
toneFreqIncr = tFreqIncr; // toneFreqIncr = tFreqIncr;
t_queueWidx = t_queueRidx; t_queueWidx = t_queueRidx;
CoSetFlag(audioFlag);
} }
else { else {
tFlags++; tFlags++;
@ -166,14 +215,20 @@ void audioQueue::play(uint8_t tFreq, uint8_t tLen, uint8_t tPause,
queueToneLength[t_queueWidx] = tLen; queueToneLength[t_queueWidx] = tLen;
queueTonePause[t_queueWidx] = tPause; queueTonePause[t_queueWidx] = tPause;
queueToneRepeat[t_queueWidx] = tFlags - 1; queueToneRepeat[t_queueWidx] = tFlags - 1;
queueToneFreqIncr[t_queueWidx] = tFreqIncr; // queueToneFreqIncr[t_queueWidx] = tFreqIncr;
t_queueWidx = next_queueWidx; 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 #ifdef HAPTIC
haptic.event(e); //do this before audio to help sync timings 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 (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) { switch (e) {
// inactivity timer alert // inactivity timer alert
case AU_INACTIVITY: case AU_INACTIVITY:
@ -193,7 +248,7 @@ void audioQueue::event(uint8_t e, uint8_t f)
break; break;
// low battery in tx // low battery in tx
case AU_TX_BATTERY_LOW: case AU_TX_BATTERY_LOW:
if (empty()) { if (audioEmpty()) {
play(60, 40, 6, 2, 1); play(60, 40, 6, 2, 1);
play(80, 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 TONE1_RATE_LIMIT (10)
#define TONE2_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:
audioQueue();
void play(uint8_t tFreq, uint8_t tLen, uint8_t tPause, uint8_t tFlags=0, int8_t tFreqIncr=0);
void pause(uint8_t tLen);
inline bool busy() {
return (toneTimeLeft > 0); return (toneTimeLeft > 0);
} }
void event(uint8_t e, uint8_t f=BEEP_DEFAULT_FREQ); void audioEvent(uint8_t e, uint8_t f=BEEP_DEFAULT_FREQ);
// heartbeat is responsibile for issueing the audio tones and general square waves inline bool audioEmpty()
// it is essentially the life of the class. {
void heartbeat();
// bool freeslots(uint8_t slots);
inline bool empty() {
return (t_queueRidx == t_queueWidx); return (t_queueRidx == t_queueWidx);
} }
protected: #define AUDIO_KEYPAD_UP() audioEvent(AU_KEYPAD_UP)
inline uint8_t getToneLength(uint8_t tLen); #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)
private: #define IS_AUDIO_BUSY() audioBusy()
uint8_t t_queueRidx;
uint8_t t_queueWidx;
uint8_t toneChanged; #define AUDIO_TIMER_30() audioEvent(AU_TIMER_30)
uint8_t toneFreq; #define AUDIO_TIMER_20() audioEvent(AU_TIMER_20)
int8_t toneFreqIncr; #define AUDIO_TIMER_10() audioEvent(AU_TIMER_10)
uint8_t toneTimeLeft; #define AUDIO_TIMER_LT3() audioEvent(AU_TIMER_LT3)
uint8_t tonePause; #define AUDIO_MINUTE_BEEP() audioEvent(AU_WARNING1)
uint8_t toneRateLimit; #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)
// vario #define AUDIO_HEARTBEAT()
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()
#endif #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 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 // Sound routines
void start_sound() void startSound()
{ {
register Pio *pioptr ; register Pio *pioptr ;
start_timer1() ; start_timer1() ;
init_dac() ; initDac() ;
init_twi() ; init_twi() ;
pioptr = PIOA ; pioptr = PIOA ;
@ -115,20 +101,17 @@ void buzzer_sound( uint8_t time )
Buzzer_count = time ; Buzzer_count = time ;
} }
void set_frequency( uint32_t frequency ) void setFrequency( uint32_t frequency )
{ {
register Tc *ptc ; register Tc *ptc ;
register uint32_t timer ; register uint32_t timer ;
timer = Master_frequency / (800 * frequency) ; // MCK/8 and 100 000 Hz timer = Master_frequency / (8 * frequency) ; // MCK/8 and 100 000 Hz
if ( timer > 65535 ) if (timer > 65535)
{
timer = 65535 ; timer = 65535 ;
} if (timer < 2)
if ( timer < 2 )
{
timer = 2 ; timer = 2 ;
}
ptc = TC0 ; // Tc block 0 (TC0-2) ptc = TC0 ; // Tc block 0 (TC0-2)
ptc->TC_CHANNEL[1].TC_CCR = TC_CCR0_CLKDIS ; // Stop clock 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_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) ptc->TC_CHANNEL[1].TC_CCR = 5 ; // Enable clock and trigger it (may only need trigger)
} }
// Start TIMER1 at 100000Hz, used for DACC trigger // Start TIMER1 at 100000Hz, used for DACC trigger
void start_timer1() void start_timer1()
{ {
@ -163,7 +145,7 @@ void start_timer1()
// Configure DAC1 (or DAC0 for REVB) // Configure DAC1 (or DAC0 for REVB)
// Not sure why PB14 has not be allocated to the DAC, although it is an EXTRA function // Not sure why PB14 has not be allocated to the DAC, although it is an EXTRA function
// So maybe it is automatically done // So maybe it is automatically done
void init_dac() void initDac()
{ {
register Dacc *dacptr ; register Dacc *dacptr ;
@ -181,23 +163,32 @@ void init_dac()
#endif #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. // Data for PDC must NOT be in flash, PDC needs a RAM source.
#ifndef SIMU
dacptr->DACC_TPR = (uint32_t) Sine_values ; dacptr->DACC_TPR = (uint32_t) Sine_values ;
dacptr->DACC_TNPR = (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_TNCR = 50 ; // words, 100 16 bit values
dacptr->DACC_PTCR = DACC_PTCR_TXTEN ; dacptr->DACC_PTCR = DACC_PTCR_TXTEN ;
NVIC_EnableIRQ(DACC_IRQn) ; 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() extern "C" void DAC_IRQHandler()
{ {
// Data for PDC must NOT be in flash, PDC needs a RAM source. // Data for PDC must NOT be in flash, PDC needs a RAM source.
#ifndef SIMU 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_TNPR = (uint32_t) Sine_values ;
#endif
DACC->DACC_TNCR = 50 ; // words, 100 16 bit values DACC->DACC_TNCR = 50 ; // words, 100 16 bit values
}
} }
void end_sound() void end_sound()

View file

@ -37,23 +37,26 @@
#define NUM_VOL_LEVELS 24 #define NUM_VOL_LEVELS 24
extern void start_sound( void ) ; extern void startSound( void ) ;
extern void buzzer_on( void ) ; extern void buzzer_on( void ) ;
extern void buzzer_off( void ) ; extern void buzzer_off( void ) ;
extern void buzzer_sound( uint8_t time ) ; 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 start_timer1( void ) ;
extern void init_dac( void ) ; extern void initDac( void ) ;
extern "C" void DAC_IRQHandler( void ) ;
extern void end_sound( 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 PMC->PMC_PCER0 |= 0x40000000L ; // Enable peripheral clock to DAC
DACC->DACC_IER = DACC_IER_ENDTX ; DACC->DACC_IER = DACC_IER_ENDTX ;
} }
inline void tone_stop( void ) inline void toneStop()
{ {
DACC->DACC_IDR = DACC_IDR_ENDTX ; // Disable interrupt DACC->DACC_IDR = DACC_IDR_ENDTX ; // Disable interrupt
} }

View file

@ -59,23 +59,10 @@ uint8_t FrskyRxBufferReady = 0;
int8_t frskyStreaming = -1; int8_t frskyStreaming = -1;
uint8_t frskyUsrStreaming = 0; uint8_t frskyUsrStreaming = 0;
uint8_t link_counter = 0; uint8_t link_counter = 0;
uint16_t currentConsumptionBoundary = 0;
uint32_t consumption = 0; FrskyData frskyData;
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];
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) #if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
FrskyHubData frskyHubData;
enum BarThresholdIdx { enum BarThresholdIdx {
THLD_ALT, THLD_ALT,
THLD_RPM, THLD_RPM,
@ -129,36 +116,36 @@ uint8_t frskyGetUserData(char *buffer, uint8_t bufSize)
#ifdef FRSKY_HUB #ifdef FRSKY_HUB
inline void getGpsPilotPosition() inline void getGpsPilotPosition()
{ {
frskyHubData.pilotLatitude = ((uint32_t)(frskyHubData.gpsLatitude_bp / 100) * 1000000) + (((uint32_t)(frskyHubData.gpsLatitude_bp % 100) * 10000 + frskyHubData.gpsLatitude_ap) * 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;
frskyHubData.pilotLongitude = ((uint32_t)(frskyHubData.gpsLongitude_bp / 100) * 1000000) + (((uint32_t)(frskyHubData.gpsLongitude_bp % 100) * 10000 + frskyHubData.gpsLongitude_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)(frskyHubData.gpsLatitude_bp / 100) * 100 + ((uint32_t)(frskyHubData.gpsLatitude_bp % 100) * 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 angle2 = (lat*lat) / 10000;
uint32_t angle4 = angle2 * angle2; uint32_t angle4 = angle2 * angle2;
frskyHubData.distFromEarthAxis = 139*(((uint32_t)10000000-((angle2*(uint32_t)123370)/81)+(angle4/25))/12500); frskyData.frskyHubData.distFromEarthAxis = 139*(((uint32_t)10000000-((angle2*(uint32_t)123370)/81)+(angle4/25))/12500);
// printf("frskyHubData.distFromEarthAxis=%d\n", frskyHubData.distFromEarthAxis); fflush(stdout); // printf("frskyData.frskyHubData.distFromEarthAxis=%d\n", frskyData.frskyHubData.distFromEarthAxis); fflush(stdout);
} }
inline void getGpsDistance() 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 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)(frskyHubData.gpsLongitude_bp / 100) * 1000000) + (((uint32_t)(frskyHubData.gpsLongitude_bp % 100) * 10000 + frskyHubData.gpsLongitude_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 dist = EARTH_RADIUS * angle / 1000000;
uint32_t result = dist*dist; uint32_t result = dist*dist;
angle = (lng > frskyHubData.pilotLongitude) ? lng - frskyHubData.pilotLongitude : frskyHubData.pilotLongitude - lng; angle = (lng > frskyData.frskyHubData.pilotLongitude) ? lng - frskyData.frskyHubData.pilotLongitude : frskyData.frskyHubData.pilotLongitude - lng;
dist = frskyHubData.distFromEarthAxis * angle / 1000000; dist = frskyData.frskyHubData.distFromEarthAxis * angle / 1000000;
result += dist*dist; 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; result += dist*dist;
frskyHubData.gpsDistance = isqrt32(result); frskyData.frskyHubData.gpsDistance = isqrt32(result);
if (frskyHubData.gpsDistance > frskyHubData.maxGpsDistance) if (frskyData.frskyHubData.gpsDistance > frskyData.frskyHubData.maxGpsDistance)
frskyHubData.maxGpsDistance = frskyHubData.gpsDistance; frskyData.frskyHubData.maxGpsDistance = frskyData.frskyHubData.gpsDistance;
} }
typedef enum { typedef enum {
@ -178,23 +165,23 @@ void evalVario(int16_t altitude_bp, uint16_t altitude_ap)
{ {
#if defined(VARIO) #if defined(VARIO)
int32_t varioAltitude_cm = (int32_t)altitude_bp * 100 + (altitude_bp > 0 ? altitude_ap : -altitude_ap); 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) if (varioAltitudeQueuePointer == VARIO_QUEUE_LENGTH)
varioAltitudeQueuePointer = 0; varioAltitudeQueuePointer = 0;
frskyHubData.varioAltitudeQueuePointer = varioAltitudeQueuePointer; frskyData.frskyHubData.varioAltitudeQueuePointer = varioAltitudeQueuePointer;
frskyHubData.varioSpeed -= frskyHubData.varioAltitudeQueue[varioAltitudeQueuePointer] ; frskyData.frskyHubData.varioSpeed -= frskyData.frskyHubData.varioAltitudeQueue[varioAltitudeQueuePointer] ;
frskyHubData.varioAltitudeQueue[varioAltitudeQueuePointer] = varioAltitude_cm - frskyHubData.varioAltitude_cm; frskyData.frskyHubData.varioAltitudeQueue[varioAltitudeQueuePointer] = varioAltitude_cm - frskyData.frskyHubData.varioAltitude_cm;
frskyHubData.varioAltitude_cm = varioAltitude_cm; frskyData.frskyHubData.varioAltitude_cm = varioAltitude_cm;
frskyHubData.varioSpeed += frskyHubData.varioAltitudeQueue[varioAltitudeQueuePointer] ; frskyData.frskyHubData.varioSpeed += frskyData.frskyHubData.varioAltitudeQueue[varioAltitudeQueuePointer] ;
#endif #endif
} }
void checkMinMaxAltitude() void checkMinMaxAltitude()
{ {
if (frskyHubData.baroAltitude_bp > frskyHubData.maxAltitude) if (frskyData.frskyHubData.baroAltitude_bp > frskyData.frskyHubData.maxAltitude)
frskyHubData.maxAltitude = frskyHubData.baroAltitude_bp; frskyData.frskyHubData.maxAltitude = frskyData.frskyHubData.baroAltitude_bp;
if (frskyHubData.baroAltitude_bp < frskyHubData.minAltitude) if (frskyData.frskyHubData.baroAltitude_bp < frskyData.frskyHubData.minAltitude)
frskyHubData.minAltitude = frskyHubData.baroAltitude_bp; frskyData.frskyHubData.minAltitude = frskyData.frskyHubData.baroAltitude_bp;
} }
void parseTelemHubByte(uint8_t byte) void parseTelemHubByte(uint8_t byte)
@ -238,119 +225,119 @@ void parseTelemHubByte(uint8_t byte)
if ((uint8_t)structPos == offsetof(FrskyHubData, gpsLatitude_bp)) { if ((uint8_t)structPos == offsetof(FrskyHubData, gpsLatitude_bp)) {
if (lowByte || byte) if (lowByte || byte)
frskyHubData.gpsFix = 1; frskyData.frskyHubData.gpsFix = 1;
else if (frskyHubData.gpsFix > 0 && frskyHubData.gpsLatitude_bp > 1) else if (frskyData.frskyHubData.gpsFix > 0 && frskyData.frskyHubData.gpsLatitude_bp > 1)
frskyHubData.gpsFix = 0; frskyData.frskyHubData.gpsFix = 0;
} }
else if ((uint8_t)structPos == offsetof(FrskyHubData, gpsLongitude_bp)) { else if ((uint8_t)structPos == offsetof(FrskyHubData, gpsLongitude_bp)) {
if (lowByte || byte) if (lowByte || byte)
frskyHubData.gpsFix = 1; frskyData.frskyHubData.gpsFix = 1;
else if (frskyHubData.gpsFix > 0 && frskyHubData.gpsLongitude_bp > 1) else if (frskyData.frskyHubData.gpsFix > 0 && frskyData.frskyHubData.gpsLongitude_bp > 1)
frskyHubData.gpsFix = 0; frskyData.frskyHubData.gpsFix = 0;
} }
if ((uint8_t)structPos == offsetof(FrskyHubData, gpsAltitude_bp) || 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))) { ((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 we don't have a fix, we may discard the value
if (frskyHubData.gpsFix <= 0) if (frskyData.frskyHubData.gpsFix <= 0)
return; return;
} }
((uint8_t*)&frskyHubData)[structPos] = lowByte; ((uint8_t*)&frskyData.frskyHubData)[structPos] = lowByte;
((uint8_t*)&frskyHubData)[structPos+1] = byte; ((uint8_t*)&frskyData.frskyHubData)[structPos+1] = byte;
switch ((uint8_t)structPos) { switch ((uint8_t)structPos) {
case offsetof(FrskyHubData, rpm): case offsetof(FrskyHubData, rpm):
frskyHubData.rpm *= (uint8_t)60/(g_model.frsky.blades+2); frskyData.frskyHubData.rpm *= (uint8_t)60/(g_model.frsky.blades+2);
if (frskyHubData.rpm > frskyHubData.maxRpm) if (frskyData.frskyHubData.rpm > frskyData.frskyHubData.maxRpm)
frskyHubData.maxRpm = frskyHubData.rpm; frskyData.frskyHubData.maxRpm = frskyData.frskyHubData.rpm;
break; break;
case offsetof(FrskyHubData, temperature1): case offsetof(FrskyHubData, temperature1):
if (frskyHubData.temperature1 > frskyHubData.maxTemperature1) if (frskyData.frskyHubData.temperature1 > frskyData.frskyHubData.maxTemperature1)
frskyHubData.maxTemperature1 = frskyHubData.temperature1; frskyData.frskyHubData.maxTemperature1 = frskyData.frskyHubData.temperature1;
break; break;
case offsetof(FrskyHubData, temperature2): case offsetof(FrskyHubData, temperature2):
if (frskyHubData.temperature2 > frskyHubData.maxTemperature2) if (frskyData.frskyHubData.temperature2 > frskyData.frskyHubData.maxTemperature2)
frskyHubData.maxTemperature2 = frskyHubData.temperature2; frskyData.frskyHubData.maxTemperature2 = frskyData.frskyHubData.temperature2;
break; break;
case offsetof(FrskyHubData, current): case offsetof(FrskyHubData, current):
if (frskyHubData.current > frskyHubData.maxCurrent) if (frskyData.frskyHubData.current > frskyData.frskyHubData.maxCurrent)
frskyHubData.maxCurrent = frskyHubData.current; frskyData.frskyHubData.maxCurrent = frskyData.frskyHubData.current;
break; break;
case offsetof(FrskyHubData, baroAltitude_bp): case offsetof(FrskyHubData, baroAltitude_bp):
// First received barometer altitude => Altitude offset // First received barometer altitude => Altitude offset
if (!frskyHubData.baroAltitudeOffset) if (!frskyData.frskyHubData.baroAltitudeOffset)
frskyHubData.baroAltitudeOffset = -frskyHubData.baroAltitude_bp; frskyData.frskyHubData.baroAltitudeOffset = -frskyData.frskyHubData.baroAltitude_bp;
if (g_model.varioSource == VARIO_SOURCE_BARO_V1) { 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(); checkMinMaxAltitude();
break; break;
case offsetof(FrskyHubData, baroAltitude_ap): case offsetof(FrskyHubData, baroAltitude_ap):
if (g_model.varioSource == VARIO_SOURCE_BARO_V2) { 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; break;
case offsetof(FrskyHubData, gpsAltitude_ap): case offsetof(FrskyHubData, gpsAltitude_ap):
if (!frskyHubData.gpsAltitudeOffset) if (!frskyData.frskyHubData.gpsAltitudeOffset)
frskyHubData.gpsAltitudeOffset = -frskyHubData.gpsAltitude_bp; frskyData.frskyHubData.gpsAltitudeOffset = -frskyData.frskyHubData.gpsAltitude_bp;
frskyHubData.gpsAltitude_bp += frskyHubData.gpsAltitudeOffset; frskyData.frskyHubData.gpsAltitude_bp += frskyData.frskyHubData.gpsAltitudeOffset;
if (!frskyHubData.baroAltitudeOffset) { if (!frskyData.frskyHubData.baroAltitudeOffset) {
if (frskyHubData.gpsAltitude_bp > frskyHubData.maxAltitude) if (frskyData.frskyHubData.gpsAltitude_bp > frskyData.frskyHubData.maxAltitude)
frskyHubData.maxAltitude = frskyHubData.gpsAltitude_bp; frskyData.frskyHubData.maxAltitude = frskyData.frskyHubData.gpsAltitude_bp;
if (frskyHubData.gpsAltitude_bp < frskyHubData.minAltitude) if (frskyData.frskyHubData.gpsAltitude_bp < frskyData.frskyHubData.minAltitude)
frskyHubData.minAltitude = frskyHubData.gpsAltitude_bp; 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 // First received GPS position => Pilot GPS position
getGpsPilotPosition(); getGpsPilotPosition();
} }
else if (frskyHubData.gpsDistNeeded || g_menuStack[0] == menuProcFrsky) { else if (frskyData.frskyHubData.gpsDistNeeded || g_menuStack[0] == menuProcFrsky) {
getGpsDistance(); getGpsDistance();
} }
break; break;
case offsetof(FrskyHubData, gpsSpeed_bp): case offsetof(FrskyHubData, gpsSpeed_bp):
// Speed => Max speed // Speed => Max speed
if (frskyHubData.gpsSpeed_bp > frskyHubData.maxGpsSpeed) if (frskyData.frskyHubData.gpsSpeed_bp > frskyData.frskyHubData.maxGpsSpeed)
frskyHubData.maxGpsSpeed = frskyHubData.gpsSpeed_bp; frskyData.frskyHubData.maxGpsSpeed = frskyData.frskyHubData.gpsSpeed_bp;
break; break;
case offsetof(FrskyHubData, volts): case offsetof(FrskyHubData, volts):
// Voltage => Cell number + Cell voltage // Voltage => Cell number + Cell voltage
{ {
uint8_t battnumber = ((frskyHubData.volts & 0x00F0) >> 4); uint8_t battnumber = ((frskyData.frskyHubData.volts & 0x00F0) >> 4);
if (battnumber < 12) { if (battnumber < 12) {
if (frskyHubData.cellsCount < battnumber+1) { if (frskyData.frskyHubData.cellsCount < battnumber+1) {
frskyHubData.cellsCount = battnumber+1; frskyData.frskyHubData.cellsCount = battnumber+1;
} }
uint8_t cellVolts = (uint8_t)(((((frskyHubData.volts & 0xFF00) >> 8) + ((frskyHubData.volts & 0x000F) << 8)))/10); uint8_t cellVolts = (uint8_t)(((((frskyData.frskyHubData.volts & 0xFF00) >> 8) + ((frskyData.frskyHubData.volts & 0x000F) << 8)))/10);
frskyHubData.cellVolts[battnumber] = cellVolts; frskyData.frskyHubData.cellVolts[battnumber] = cellVolts;
if (!frskyHubData.minCellVolts || cellVolts < frskyHubData.minCellVolts || battnumber==frskyHubData.minCellIdx) { if (!frskyData.frskyHubData.minCellVolts || cellVolts < frskyData.frskyHubData.minCellVolts || battnumber==frskyData.frskyHubData.minCellIdx) {
frskyHubData.minCellIdx = battnumber; frskyData.frskyHubData.minCellIdx = battnumber;
frskyHubData.minCellVolts = cellVolts; frskyData.frskyHubData.minCellVolts = cellVolts;
} }
} }
break; break;
} }
case offsetof(FrskyHubData, hour): 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; break;
case offsetof(FrskyHubData, accelX): case offsetof(FrskyHubData, accelX):
case offsetof(FrskyHubData, accelY): case offsetof(FrskyHubData, accelY):
case offsetof(FrskyHubData, accelZ): case offsetof(FrskyHubData, accelZ):
*(int16_t*)(&((uint8_t*)&frskyHubData)[structPos]) /= 10; *(int16_t*)(&((uint8_t*)&frskyData.frskyHubData)[structPos]) /= 10;
break; break;
} }
@ -361,12 +348,12 @@ void parseTelemHubByte(uint8_t byte)
void parseTelemWSHowHighByte(uint8_t byte) void parseTelemWSHowHighByte(uint8_t byte)
{ {
if (frskyUsrStreaming < (FRSKY_TIMEOUT10ms*3 - 10)) { if (frskyUsrStreaming < (FRSKY_TIMEOUT10ms*3 - 10)) {
((uint8_t*)&frskyHubData)[offsetof(FrskyHubData, baroAltitude_bp)] = byte; ((uint8_t*)&frskyData.frskyHubData)[offsetof(FrskyHubData, baroAltitude_bp)] = byte;
checkMinMaxAltitude(); checkMinMaxAltitude();
} }
else { else {
// At least 100mS passed since last data received // 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! // baroAltitude_bp unit here is feet!
frskyUsrStreaming = FRSKY_TIMEOUT10ms*3; // reset counter frskyUsrStreaming = FRSKY_TIMEOUT10ms*3; // reset counter
@ -391,27 +378,15 @@ void processFrskyPacket(uint8_t *packet)
// What type of packet? // What type of packet?
switch (packet[0]) 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 case LINKPKT: // A1/A2/RSSI values
link_counter += 32; link_counter += 32;
frskyTelemetry[0].set(packet[1], g_model.frsky.channels[0].type); frskyData.frskyTelemetry[0].set(packet[1], g_model.frsky.channels[0].type);
frskyTelemetry[1].set(packet[2], g_model.frsky.channels[1].type); frskyData.frskyTelemetry[1].set(packet[2], g_model.frsky.channels[1].type);
frskyRSSI[0].set(packet[3]); frskyData.frskyRSSI[0].set(packet[3]);
frskyRSSI[1].set(packet[4] / 2); frskyData.frskyRSSI[1].set(packet[4] / 2);
frskyStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected frskyStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected
if (g_model.varioSource >= VARIO_SOURCE_A1) { 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; break;
#if defined(FRSKY_HUB) || defined (WS_HOW_HIGH) #if defined(FRSKY_HUB) || defined (WS_HOW_HIGH)
@ -650,14 +625,16 @@ void check_frsky()
frskyStreaming--; frskyStreaming--;
} }
else { else {
frskyRSSI[0].set(0); frskyData.frskyRSSI[0].set(0);
frskyRSSI[1].set(0); frskyData.frskyRSSI[1].set(0);
} }
#endif #endif
uint16_t currint;
currint=(g_tmr10ms<s_currTmr ? 65535-s_currTmr+g_tmr10ms : g_tmr10ms-s_currTmr); frskyData.currentPrescale += frskyData.frskyHubData.current;
s_currTmr=g_tmr10ms; if (frskyData.currentPrescale >= currentConsumptionBoundary) {
consumption+=(frskyHubData.current*currint); frskyData.currentConsumption += 1;
frskyData.currentPrescale -= currentConsumptionBoundary;
}
#if defined(VARIO) #if defined(VARIO)
static uint16_t s_varioTmr = 0; static uint16_t s_varioTmr = 0;
@ -665,7 +642,7 @@ consumption+=(frskyHubData.current*currint);
#if defined(AUDIO) #if defined(AUDIO)
int16_t varioSpeedUpMin = (g_model.varioSpeedUpMin - VARIO_SPEED_LIMIT_UP_CENTER)*VARIO_SPEED_LIMIT_MUL; 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 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 SoundVarioBeepNextFreq = 0;
uint8_t SoundVarioBeepNextTime = 0; uint8_t SoundVarioBeepNextTime = 0;
@ -686,18 +663,18 @@ consumption+=(frskyHubData.current*currint);
s_varioTmr = g_tmr10ms; s_varioTmr = g_tmr10ms;
SoundVarioBeepTime = SoundVarioBeepNextTime; SoundVarioBeepTime = SoundVarioBeepNextTime;
SoundVarioBeepFreq = SoundVarioBeepNextFreq; SoundVarioBeepFreq = SoundVarioBeepNextFreq;
audio.play(SoundVarioBeepFreq, SoundVarioBeepTime, 0, PLAY_SOUND_VARIO); AUDIO_VARIO(SoundVarioBeepFreq, SoundVarioBeepTime);
} }
} }
else { else {
// negative vertical speed gives sound without pauses // negative vertical speed gives sound without pauses
SoundVarioBeepTime = SoundVarioBeepNextTime; SoundVarioBeepTime = SoundVarioBeepNextTime;
SoundVarioBeepFreq = SoundVarioBeepNextFreq; SoundVarioBeepFreq = SoundVarioBeepNextFreq;
audio.play(SoundVarioBeepFreq, 1, 0, PLAY_SOUND_VARIO); AUDIO_VARIO(SoundVarioBeepFreq, 1);
} }
} }
#else #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; uint16_t interval;
if (verticalSpeed == 0) { if (verticalSpeed == 0) {
@ -727,11 +704,11 @@ bool FRSKY_alarmRaised(uint8_t idx)
for (int i=0; i<2; i++) { for (int i=0; i<2; i++) {
if (ALARM_LEVEL(idx, i) != alarm_off) { if (ALARM_LEVEL(idx, i) != alarm_off) {
if (ALARM_GREATER(idx, i)) { 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; return true;
} }
else { 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; return true;
} }
} }
@ -756,7 +733,6 @@ inline void FRSKY_EnableRXD(void)
void FRSKY_Init(void) void FRSKY_Init(void)
{ {
// clear frsky variables // clear frsky variables
memset(frskyAlarms, 0, sizeof(frskyAlarms));
resetTelemetry(); resetTelemetry();
#if defined(PCBARM) #if defined(PCBARM)
@ -787,35 +763,7 @@ void FRSKY_Init(void)
#endif #endif
} }
#if 0 void FrskyValueWithMin::set(uint8_t value)
// 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)
{ {
if (this->value == 0) if (this->value == 0)
this->value = value; this->value = value;
@ -830,9 +778,9 @@ void FrskyRSSI::set(uint8_t value)
min = 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) { if (unit != UNIT_VOLTS) {
this->value = value; this->value = value;
} }
@ -840,52 +788,62 @@ void FrskyData::set(uint8_t value, uint8_t unit)
max = value; 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() void resetTelemetry()
{ {
memset(frskyTelemetry, 0, sizeof(frskyTelemetry)); // TODO these structs could be assembled to have only one memset
memset(frskyRSSI, 0, sizeof(frskyRSSI)); memset(&frskyData, 0, sizeof(frskyData));
memset(&frskyHubData, 0, sizeof(frskyHubData));
frskyEvalCurrentConsumptionBoundary();
#if defined(FRSKY_HUB) #if defined(FRSKY_HUB)
frskyHubData.gpsLatitude_bp = 2; frskyData.frskyHubData.gpsLatitude_bp = 2;
frskyHubData.gpsLongitude_bp = 2; frskyData.frskyHubData.gpsLongitude_bp = 2;
frskyHubData.gpsFix = -1; frskyData.frskyHubData.gpsFix = -1;
#endif #endif
#ifdef SIMU #ifdef SIMU
frskyTelemetry[0].set(120, UNIT_VOLTS); frskyTelemetry[0].set(120, UNIT_VOLTS);
frskyRSSI[0].set(75); frskyRSSI[0].set(75);
frskyHubData.fuelLevel = 75; frskyData.frskyHubData.fuelLevel = 75;
frskyHubData.rpm = 12000; frskyData.frskyHubData.rpm = 12000;
frskyHubData.gpsFix = 1; frskyData.frskyHubData.gpsFix = 1;
frskyHubData.gpsLatitude_bp = 4401; frskyData.frskyHubData.gpsLatitude_bp = 4401;
frskyHubData.gpsLatitude_ap = 7710; frskyData.frskyHubData.gpsLatitude_ap = 7710;
frskyHubData.gpsLongitude_bp = 1006; frskyData.frskyHubData.gpsLongitude_bp = 1006;
frskyHubData.gpsLongitude_ap = 8872; frskyData.frskyHubData.gpsLongitude_ap = 8872;
frskyHubData.gpsSpeed_bp = (100 * 250) / 463; frskyData.frskyHubData.gpsSpeed_bp = (100 * 250) / 463;
getGpsPilotPosition(); getGpsPilotPosition();
frskyHubData.gpsLatitude_bp = 4401; frskyData.frskyHubData.gpsLatitude_bp = 4401;
frskyHubData.gpsLatitude_ap = 7455; frskyData.frskyHubData.gpsLatitude_ap = 7455;
frskyHubData.gpsLongitude_bp = 1006; frskyData.frskyHubData.gpsLongitude_bp = 1006;
frskyHubData.gpsLongitude_ap = 9533; frskyData.frskyHubData.gpsLongitude_ap = 9533;
getGpsDistance(); getGpsDistance();
frskyHubData.cellsCount = 6; frskyData.frskyHubData.cellsCount = 6;
frskyHubData.gpsAltitude_bp = 50; frskyData.frskyHubData.gpsAltitude_bp = 50;
frskyHubData.baroAltitude_bp = 50; frskyData.frskyHubData.baroAltitude_bp = 50;
frskyHubData.minAltitude = 10; frskyData.frskyHubData.minAltitude = 10;
frskyHubData.maxAltitude = 500; frskyData.frskyHubData.maxAltitude = 500;
frskyHubData.accelY = 100; frskyData.frskyHubData.accelY = 100;
frskyHubData.temperature1 = -30; frskyData.frskyHubData.temperature1 = -30;
frskyHubData.maxTemperature1 = 100; frskyData.frskyHubData.maxTemperature1 = 100;
frskyHubData.maxCurrent = 56;
consumption=0; frskyData.frskyHubData.current = 5;
s_currTmr = g_tmr10ms; frskyData.frskyHubData.maxCurrent = 56;
frskyHubData.current = 5;
#endif #endif
} }
@ -942,8 +900,6 @@ const pm_uint8_t bchunit_ar[] PROGMEM = {
UNIT_KTS, // Speed UNIT_KTS, // Speed
UNIT_METERS, // Dist UNIT_METERS, // Dist
UNIT_METERS, // GPS Alt 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) 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); putsTelemetryValue(x, y, val, UNIT_VOLTS, att|PREC2);
break; 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_ACCx-1:
case TELEM_ACCy-1: case TELEM_ACCy-1:
case TELEM_ACCz-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); putsTelemetryValue(x, y, val, UNIT_RAW, att);
break; 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) #if defined(IMPERIAL_UNITS)
case TELEM_ALT-1: case TELEM_ALT-1:
case TELEM_MIN_ALT-1: case TELEM_MIN_ALT-1:
@ -1044,11 +1000,11 @@ void displayRssiLine()
{ {
if (frskyStreaming > 0) { if (frskyStreaming > 0) {
lcd_hline(0, 55, 128, 0); // separator 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_putsLeft(7*FH+1, STR_TX); lcd_outdezNAtt(4*FW, 7*FH+1, rssi, LEADING0, 2);
lcd_rect(25, 57, 38, 7); lcd_rect(25, 57, 38, 7);
lcd_filled_rect(26, 58, 4*rssi/11, 5, (rssi < getRssiAlarmValue(0)) ? DOTTED : SOLID); 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_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); lcd_rect(65, 57, 38, 7);
uint8_t v = 4*rssi/11; uint8_t v = 4*rssi/11;
@ -1065,17 +1021,17 @@ void displayGpsTime()
{ {
#define TIME_LINE (7*FH+1) #define TIME_LINE (7*FH+1)
uint8_t att = (frskyStreaming > 0 ? LEFT|LEADING0 : LEFT|LEADING0|BLINK); 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_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_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(); lcd_status_line();
} }
void displayGpsCoord(uint8_t y, char direction, int16_t bp, int16_t ap) 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 = '-'; if (!direction) direction = '-';
lcd_outdezAtt(10*FW, y, bp / 100, LEFT); // ddd before '.' lcd_outdezAtt(10*FW, y, bp / 100, LEFT); // ddd before '.'
@ -1162,9 +1118,9 @@ void menuProcFrsky(uint8_t event)
if (frskyStreaming > 0) { if (frskyStreaming > 0) {
if (field == TELEM_ACC) { if (field == TELEM_ACC) {
lcd_putsLeft(7*FH+1, STR_ACCEL); lcd_putsLeft(7*FH+1, STR_ACCEL);
lcd_outdezNAtt(4*FW, 7*FH+1, frskyHubData.accelX, LEFT|PREC2); lcd_outdezNAtt(4*FW, 7*FH+1, frskyData.frskyHubData.accelX, LEFT|PREC2);
lcd_outdezNAtt(10*FW, 7*FH+1, frskyHubData.accelY, LEFT|PREC2); lcd_outdezNAtt(10*FW, 7*FH+1, frskyData.frskyHubData.accelY, LEFT|PREC2);
lcd_outdezNAtt(16*FW, 7*FH+1, frskyHubData.accelZ, LEFT|PREC2); lcd_outdezNAtt(16*FW, 7*FH+1, frskyData.frskyHubData.accelZ, LEFT|PREC2);
break; break;
} }
else if (field == TELEM_GPS_TIME) { else if (field == TELEM_GPS_TIME) {
@ -1261,19 +1217,19 @@ void menuProcFrsky(uint8_t event)
if (g_model.frsky.channels[i].ratio) { if (g_model.frsky.channels[i].ratio) {
blink = (FRSKY_alarmRaised(i) ? INVERS : 0); blink = (FRSKY_alarmRaised(i) ? INVERS : 0);
putsStrIdx(0, y, STR_A, i+1, TWO_DOTS); putsStrIdx(0, y, STR_A, i+1, TWO_DOTS);
putsTelemetryChannel(3*FW, y, i+MAX_TIMERS, frskyTelemetry[i].value, blink|DBLSIZE|LEFT); 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, frskyTelemetry[i].min, NO_UNIT); 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, frskyTelemetry[i].max, NO_UNIT); lcd_putc(12*FW, y, '>'); putsTelemetryChannel(17*FW, y, i+MAX_TIMERS, frskyData.frskyTelemetry[i].max, NO_UNIT);
y += 3*FH; y += 3*FH;
} }
} }
#ifdef FRSKY_HUB #ifdef FRSKY_HUB
// Cells voltage // Cells voltage
if (frskyHubData.cellsCount > 0) { if (frskyData.frskyHubData.cellsCount > 0) {
uint8_t y = 1*FH; uint8_t y = 1*FH;
for (uint8_t k=0; k<frskyHubData.cellsCount && k<6; k++) { for (uint8_t k=0; k<frskyData.frskyHubData.cellsCount && k<6; k++) {
uint8_t attr = (barsThresholds[THLD_CELL] && frskyHubData.cellVolts[k] < barsThresholds[THLD_CELL]) ? BLINK|PREC2 : PREC2; uint8_t attr = (barsThresholds[THLD_CELL] && frskyData.frskyHubData.cellVolts[k] < barsThresholds[THLD_CELL]) ? BLINK|PREC2 : PREC2;
lcd_outdezNAtt(21*FW, y, frskyHubData.cellVolts[k] * 2, attr, 4); lcd_outdezNAtt(21*FW, y, frskyData.frskyHubData.cellVolts[k] * 2, attr, 4);
y += 1*FH; y += 1*FH;
} }
lcd_vline(17*FW+4, 8, 47); 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) { if (g_model.frsky.usrProto == USR_PROTO_FRSKY_HUB) {
// Latitude // Latitude
lcd_putsLeft(line, STR_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 // Longitude
line+=1*FH+1; line+=1*FH+1;
lcd_putsLeft(line, STR_LONGITUDE); 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(); displayGpsTime();
line+=1*FH+1; line+=1*FH+1;
} }
// Rssi // Rssi
lcd_putsLeft(line, STR_MINRSSI); lcd_putsLeft(line, STR_MINRSSI);
lcd_puts(10*FW, line, STR_TX); 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_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 #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_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) #define ALARM_LEVEL(channel, alarm) ((g_model.frsky.channels[channel].alarms_level >> (2*alarm)) & 3)
class FrskyRSSI { class FrskyValueWithMin {
public: public:
uint8_t value; uint8_t value;
uint8_t min; uint8_t min;
@ -60,7 +60,7 @@ class FrskyRSSI {
void set(uint8_t value); void set(uint8_t value);
}; };
class FrskyData: public FrskyRSSI { class FrskyValueWithMinMax: public FrskyValueWithMin {
public: public:
uint8_t max; uint8_t max;
void set(uint8_t value, uint8_t unit); void set(uint8_t value, uint8_t unit);
@ -119,7 +119,6 @@ PACK(struct FrskyHubData {
uint16_t current; // 0x28 Current uint16_t current; // 0x28 Current
int16_t varioAltitudeQueue[VARIO_QUEUE_LENGTH]; //circular buffer int16_t varioAltitudeQueue[VARIO_QUEUE_LENGTH]; //circular buffer
int32_t varioAltitude_cm; int32_t varioAltitude_cm;
int16_t varioSpeed;
/* next fields must keep this order! */ /* next fields must keep this order! */
int16_t minAltitude; int16_t minAltitude;
int16_t maxAltitude; int16_t maxAltitude;
@ -128,6 +127,7 @@ PACK(struct FrskyHubData {
int16_t maxTemperature2; int16_t maxTemperature2;
uint16_t maxGpsSpeed; uint16_t maxGpsSpeed;
uint16_t maxGpsDistance; uint16_t maxGpsDistance;
uint16_t maxCurrent;
/* end */ /* end */
int16_t varioAcc1; int16_t varioAcc1;
int16_t varioAcc2; int16_t varioAcc2;
@ -136,9 +136,9 @@ PACK(struct FrskyHubData {
// end of FrSky Hub data // end of FrSky Hub data
uint16_t gpsDistance; uint16_t gpsDistance;
int16_t gpsAltitudeOffset; int16_t gpsAltitudeOffset;
int16_t varioSpeed;
uint8_t varioAltitudeQueuePointer; // circular-buffer pointer uint8_t varioAltitudeQueuePointer; // circular-buffer pointer
uint8_t minCellIdx; uint8_t minCellIdx;
uint16_t maxCurrent;
}); });
#elif defined(WS_HOW_HIGH) #elif defined(WS_HOW_HIGH)
@ -150,23 +150,34 @@ struct FrskyHubData {
#endif #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) #if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
extern FrskyHubData frskyHubData;
extern uint8_t barsThresholds[]; extern uint8_t barsThresholds[];
#endif #endif
// Global Fr-Sky telemetry data variables // Global Fr-Sky telemetry data variables
extern int8_t frskyStreaming; // >0 (true) == data is streaming in. 0 = nodata detected for some time extern int8_t frskyStreaming; // >0 (true) == data is streaming in. 0 = nodata detected for some time
extern uint8_t frskyUsrStreaming; extern uint8_t frskyUsrStreaming;
extern uint32_t consumption;
#define SEND_MODEL_ALARMS 6 #define SEND_MODEL_ALARMS 6
extern uint8_t FrskyAlarmSendState; extern uint8_t FrskyAlarmSendState;
extern FrskyData frskyTelemetry[2]; extern FrskyData frskyData;
extern FrskyRSSI frskyRSSI[2];
extern uint8_t frskyTxBuffer[FRSKY_TX_PACKET_SIZE]; extern uint8_t frskyTxBuffer[FRSKY_TX_PACKET_SIZE];
extern uint8_t frskyTxBufferCount; extern uint8_t frskyTxBufferCount;
void FRSKY_Init(void); void FRSKY_Init(void);
void check_frsky(void); void check_frsky(void);
@ -175,6 +186,8 @@ inline void FRSKY_setModelAlarms(void)
FrskyAlarmSendState = SEND_MODEL_ALARMS; FrskyAlarmSendState = SEND_MODEL_ALARMS;
} }
extern void frskyEvalCurrentConsumptionBoundary();
bool FRSKY_alarmRaised(uint8_t idx); bool FRSKY_alarmRaised(uint8_t idx);
void resetTelemetry(); void resetTelemetry();

View file

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

View file

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

View file

@ -142,10 +142,13 @@ bool listSDcardModels()
s_menu_flags = BSS; s_menu_flags = BSS;
uint8_t offset = 0; uint8_t offset = 0;
#if defined(PCBV4)
// TODO as ARM
FRESULT result = f_mount(0, &g_FATFS_Obj); FRESULT result = f_mount(0, &g_FATFS_Obj);
if (result != FR_OK) { if (result != FR_OK) {
return SDCARD_ERROR(result); return SDCARD_ERROR(result);
} }
#endif
FRESULT res = f_opendir(&dir, MODELS_PATH); /* Open the directory */ FRESULT res = f_opendir(&dir, MODELS_PATH); /* Open the directory */
if (res == FR_OK) { if (res == FR_OK) {
@ -2325,6 +2328,7 @@ enum menuProcTelemetryItems {
ITEM_TELEMETRY_USR_PROTO, ITEM_TELEMETRY_USR_PROTO,
ITEM_TELEMETRY_USR_BLADES, ITEM_TELEMETRY_USR_BLADES,
#endif #endif
ITEM_TELEMETRY_USR_CURRENT_SOURCE,
#if defined(VARIO) #if defined(VARIO)
ITEM_TELEMETRY_VARIO_LABEL, ITEM_TELEMETRY_VARIO_LABEL,
ITEM_TELEMETRY_VARIO_SOURCE, ITEM_TELEMETRY_VARIO_SOURCE,
@ -2355,10 +2359,10 @@ enum menuProcTelemetryItems {
#endif #endif
#ifdef FRSKY #ifdef FRSKY
#define TELEM_COL2 (8*FW-2) #define TELEM_COL2 (8*FW-1)
void menuProcTelemetry(uint8_t event) 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; 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_UP):
case EVT_KEY_BREAK(KEY_LEFT): case EVT_KEY_BREAK(KEY_LEFT):
case EVT_KEY_BREAK(KEY_RIGHT): 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 FRSKY_setModelAlarms(); // update Fr-Sky module when edit mode exited
break; break;
} }
@ -2385,7 +2390,7 @@ void menuProcTelemetry(uint8_t event)
case ITEM_TELEMETRY_A2_LABEL: case ITEM_TELEMETRY_A2_LABEL:
lcd_putsLeft(y, STR_ACHANNEL); lcd_putsLeft(y, STR_ACHANNEL);
lcd_outdezAtt(2*FW, y, ch+1, 0); 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; break;
case ITEM_TELEMETRY_A1_RANGE: case ITEM_TELEMETRY_A1_RANGE:
@ -2496,6 +2501,12 @@ void menuProcTelemetry(uint8_t event)
break; break;
#endif #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) #if defined(VARIO)
case ITEM_TELEMETRY_VARIO_LABEL: case ITEM_TELEMETRY_VARIO_LABEL:
lcd_putsLeft(y, STR_VARIO); lcd_putsLeft(y, STR_VARIO);

View file

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

View file

@ -38,6 +38,7 @@ extern "C" {
#define MIXER_STACK_SIZE 300 #define MIXER_STACK_SIZE 300
#define MENUS_STACK_SIZE 300 #define MENUS_STACK_SIZE 300
#define AUDIO_STACK_SIZE 300
#define BT_STACK_SIZE 100 #define BT_STACK_SIZE 100
OS_TID mixerTaskId; OS_TID mixerTaskId;
@ -46,6 +47,13 @@ OS_STK mixerStack[MIXER_STACK_SIZE];
OS_TID menusTaskId; OS_TID menusTaskId;
OS_STK menusStack[MENUS_STACK_SIZE]; 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_TID btTask;
OS_STK btStack[BT_STACK_SIZE]; OS_STK btStack[BT_STACK_SIZE];
OS_TCID btTimer; OS_TCID btTimer;
@ -82,7 +90,7 @@ uint16_t g_timeMainMax;
uint8_t g_timeMainLast; uint8_t g_timeMainLast;
#endif #endif
#ifdef AUDIO #if defined(AUDIO) && !defined(PCBARM)
audioQueue audio; audioQueue audio;
#endif #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) 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]; else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_TM2) return s_timerVal[i-CSW_CHOUT_BASE-NUM_CHNOUT];
#if defined(FRSKY) #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_A2) return frskyData.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_TX) return frskyData.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_RSSI_RX) return frskyData.frskyRSSI[0].value;
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) #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 #endif
#if defined(FRSKY_HUB) #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_RPM) return frskyData.frskyHubData.rpm;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_FUEL) return frskyHubData.fuelLevel; 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 frskyHubData.temperature1; 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 frskyHubData.temperature2; 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 frskyHubData.gpsSpeed_bp; 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 frskyHubData.gpsDistance; 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 frskyHubData.gpsAltitude_bp; 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)frskyHubData.minCellVolts * 2; 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)frskyHubData.current; 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 consumption/360; else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CONSUMPTION) return frskyData.currentConsumption;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCx) return frskyHubData.accelX; 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 frskyHubData.accelY; 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 frskyHubData.accelZ; 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 frskyHubData.gpsCourse_bp; 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 frskyHubData.varioSpeed; 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 frskyTelemetry[0].min; 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 frskyTelemetry[1].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_CURRENT) return frskyHubData.maxCurrent; 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));
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));
#endif #endif
#endif #endif
else return 0; else return 0;
@ -1089,12 +1096,7 @@ void checkTrims()
AUDIO_TRIM_MIDDLE(after); AUDIO_TRIM_MIDDLE(after);
} }
else { else {
#if defined (AUDIO) AUDIO_TRIM(event, after);
audio.event(AU_TRIM_MOVE, after);
#else
if (event & _MSK_KEY_REPT) warble = true;
AUDIO_TRIM();
#endif
} }
#if defined(PCBSTD) #if defined(PCBSTD)
return 0; return 0;
@ -1652,12 +1654,7 @@ void evalFunctions()
if ((!momentary) || (~active_switches & switch_mask)) { if ((!momentary) || (~active_switches & switch_mask)) {
if (sd->func == FUNC_PLAY_SOUND) { if (sd->func == FUNC_PLAY_SOUND) {
#if defined(AUDIO) AUDIO_PLAY(AU_FRSKY_FIRST+sd->param);
audioDefevent(AU_FRSKY_FIRST+sd->param);
#else
// TODO sound with warble = !(g_tmr10ms % 60); AUDIO_WARNING2(); }
beep(3);
#endif
} }
#if defined(HAPTIC) #if defined(HAPTIC)
@ -2832,11 +2829,14 @@ void menusTask(void * pdata)
while (1) { while (1) {
shutdown_state = check_soft_power(); shutdown_state = check_soft_power();
#if 0 #if 0
if (shutdown_state == e_power_off) if (shutdown_state == e_power_off) {
break; break;
}
else if (shutdown_state == e_power_usb) { 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"; const char STR_BOOTLOADER[] = "Bootloader";
lcd_clear();
s_menu_count = 0;
s_menu[s_menu_count++] = STR_SDCARD; s_menu[s_menu_count++] = STR_SDCARD;
s_menu[s_menu_count++] = STR_BOOTLOADER; s_menu[s_menu_count++] = STR_BOOTLOADER;
uint8_t event = getEvent(false); uint8_t event = getEvent(false);
@ -2849,15 +2849,17 @@ void menusTask(void * pdata)
s_menu_count = 0; s_menu_count = 0;
} }
} }
refreshDisplay();
} }
#else #else
if (shutdown_state >= e_power_usb) if (shutdown_state >= e_power_usb) {
break; break;
}
#endif #endif
else {
perMain(); perMain();
}
CoTickDelay(5); // 10ms for now CoTickDelay(5); // 10ms for now
} }
SysTick->CTRL = 0; // turn off systick SysTick->CTRL = 0; // turn off systick
@ -2887,6 +2889,10 @@ void menusTask(void * pdata)
lcdSetRefVolt(0); // TODO before soft_power_off? lcdSetRefVolt(0); // TODO before soft_power_off?
} }
extern void audioTimerHandle(void);
extern void audioTask(void* pdata);
#endif #endif
int main(void) 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); // 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); // 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); 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(); CoStartOS();
#else #else

View file

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

View file

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

View file

@ -74,8 +74,6 @@ class audioQueue
// it is essentially the life of the class. // it is essentially the life of the class.
void heartbeat(); void heartbeat();
// bool freeslots(uint8_t slots);
inline bool empty() { inline bool empty() {
return (t_queueRidx == t_queueWidx); 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_UP() audioDefevent(AU_KEYPAD_UP)
#define AUDIO_VARIO_DOWN() audioDefevent(AU_KEYPAD_DOWN) #define AUDIO_VARIO_DOWN() audioDefevent(AU_KEYPAD_DOWN)
#define AUDIO_TRIM_MIDDLE(f) audio.event(AU_TRIM_MIDDLE, f) #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_DRIVER() audio.driver()
#define AUDIO_HEARTBEAT() audio.heartbeat() #define AUDIO_HEARTBEAT() audio.heartbeat()

View file

@ -71,6 +71,7 @@ const pm_char STR_OPEN9X[] PROGMEM =
ISTR(VALARMFN) ISTR(VALARMFN)
ISTR(VTELPROTO) ISTR(VTELPROTO)
ISTR(GPSFORMAT) ISTR(GPSFORMAT)
ISTR(CURRENTSRC)
ISTR(VARIOSRC) ISTR(VARIOSRC)
#endif #endif
#ifdef TEMPLATES #ifdef TEMPLATES
@ -302,9 +303,12 @@ const pm_char STR_SHUTDOWN[] PROGMEM = TR_SHUTDOWN;
const pm_char STR_BATT_CALIB[] PROGMEM = TR_BATT_CALIB; 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) #if defined(PCBARM)
const pm_char STR_CURRENT_CALIB[] PROGMEM = TR_CURRENT_CALIB; const pm_char STR_CURRENT_CALIB[] PROGMEM = TR_CURRENT_CALIB;
const pm_char STR_CURRENT[] PROGMEM = TR_CURRENT;
#endif #endif
#if defined(SDCARD) #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_VALARMFN (OFS_VALARM + sizeof(TR_VALARM))
#define OFS_VTELPROTO (OFS_VALARMFN + sizeof(TR_VALARMFN)) #define OFS_VTELPROTO (OFS_VALARMFN + sizeof(TR_VALARMFN))
#define OFS_GPSFORMAT (OFS_VTELPROTO + sizeof(TR_VTELPROTO)) #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)) #define OFS_ENDTELEM (OFS_VARIOSRC + sizeof(TR_VARIOSRC))
#else #else
#define OFS_ENDTELEM (OFS_VTELEMCHNS + sizeof(TR_VTELEMCHNS)) #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_VALARMFN (STR_OPEN9X + OFS_VALARMFN)
#define STR_VTELPROTO (STR_OPEN9X + OFS_VTELPROTO) #define STR_VTELPROTO (STR_OPEN9X + OFS_VTELPROTO)
#define STR_GPSFORMAT (STR_OPEN9X + OFS_GPSFORMAT) #define STR_GPSFORMAT (STR_OPEN9X + OFS_GPSFORMAT)
#define STR_CURRENTSRC (STR_OPEN9X + OFS_CURRENTSRC)
#define STR_VARIOSRC (STR_OPEN9X + OFS_VARIOSRC) #define STR_VARIOSRC (STR_OPEN9X + OFS_VARIOSRC)
#define STR_TELEMCHNS (STR_OPEN9X + OFS_TELEMCHNS) #define STR_TELEMCHNS (STR_OPEN9X + OFS_TELEMCHNS)
#endif #endif
@ -373,9 +375,12 @@ extern const pm_char STR_SHUTDOWN[];
extern const pm_char STR_BATT_CALIB[]; extern const pm_char STR_BATT_CALIB[];
#if defined(PCBARM) || defined(FRSKY)
extern const pm_char STR_CURRENT[];
#endif
#if defined(PCBARM) #if defined(PCBARM)
extern const pm_char STR_CURRENT_CALIB[]; 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)) #define LEN_CALIB_FIELDS (PSIZE(TR_BATT_CALIB) > PSIZE(TR_CURRENT_CALIB) ? PSIZE(TR_BATT_CALIB) : PSIZE(TR_CURRENT_CALIB))
#else #else
#define LEN_CALIB_FIELDS PSIZE(TR_BATT_CALIB) #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 TR_FUNCSOUNDS "Warn1 ""Warn2 ""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick "
#define LEN_VTELEMCHNS "\004" #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 #ifdef IMPERIAL_UNITS
#define LENGTH_UNIT "ft\0" #define LENGTH_UNIT "ft\0"
@ -149,7 +149,7 @@
#endif #endif
#define LEN_VTELEMUNIT "\003" #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_V (STR_VTELEMUNIT+1)
#define STR_A (STR_VTELEMUNIT+4) #define STR_A (STR_VTELEMUNIT+4)
@ -168,6 +168,9 @@
#define TR_VTELPROTO "" #define TR_VTELPROTO ""
#endif #endif
#define LEN_CURRENTSRC "\003"
#define TR_CURRENTSRC "Hub""A1\0""A2\0"
#define LEN_VARIOSRC "\006" #define LEN_VARIOSRC "\006"
#define TR_VARIOSRC "BaroV1""BaroV2""A1\0 ""A2\0" #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 TR_FUNCSOUNDS "Warn 1""Warn 2""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick "
#define LEN_VTELEMCHNS "\004" #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 #ifdef IMPERIAL_UNITS
#define LENGTH_UNIT "ft\0" #define LENGTH_UNIT "ft\0"
@ -150,7 +150,7 @@
#endif #endif
#define LEN_VTELEMUNIT "\003" #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_V (STR_VTELEMUNIT+1)
#define STR_A (STR_VTELEMUNIT+4) #define STR_A (STR_VTELEMUNIT+4)
@ -169,6 +169,9 @@
#define TR_VTELPROTO "" #define TR_VTELPROTO ""
#endif #endif
#define LEN_CURRENTSRC "\003"
#define TR_CURRENTSRC "Hub""A1\0""A2\0"
#define LEN_VARIOSRC "\006" #define LEN_VARIOSRC "\006"
#define TR_VARIOSRC "BaroV1""BaroV2""A1\0 ""A2\0" #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 TR_FUNCSOUNDS "Warn1 ""Warn2 ""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick "
#define LEN_VTELEMCHNS "\004" #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 #ifdef IMPERIAL_UNITS
#define LENGTH_UNIT "ft\0" #define LENGTH_UNIT "ft\0"
@ -150,7 +150,7 @@
#endif #endif
#define LEN_VTELEMUNIT "\003" #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_V (STR_VTELEMUNIT+1)
#define STR_A (STR_VTELEMUNIT+4) #define STR_A (STR_VTELEMUNIT+4)
@ -169,6 +169,9 @@
#define TR_VTELPROTO "" #define TR_VTELPROTO ""
#endif #endif
#define LEN_CURRENTSRC "\003"
#define TR_CURRENTSRC "Hub""A1\0""A2\0"
#define LEN_VARIOSRC "\006" #define LEN_VARIOSRC "\006"
#define TR_VARIOSRC "BaroV1""BaroV2""A1\0 ""A2\0" #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 TR_FUNCSOUNDS "Warn1 ""Warn2 ""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick "
#define LEN_VTELEMCHNS "\004" #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 #ifdef IMPERIAL_UNITS
#define LENGTH_UNIT "ft\0" #define LENGTH_UNIT "ft\0"
@ -144,7 +144,7 @@
#endif #endif
#define LEN_VTELEMUNIT "\003" #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_V (STR_VTELEMUNIT+1)
#define STR_A (STR_VTELEMUNIT+4) #define STR_A (STR_VTELEMUNIT+4)
@ -163,6 +163,9 @@
#define TR_VTELPROTO "" #define TR_VTELPROTO ""
#endif #endif
#define LEN_CURRENTSRC "\003"
#define TR_CURRENTSRC "Hub""A1\0""A2\0"
#define LEN_VARIOSRC "\006" #define LEN_VARIOSRC "\006"
#define TR_VARIOSRC "BaroV1""BaroV2""A1\0 ""A2\0" #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 TR_FUNCSOUNDS "Warn1 ""Warn2 ""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick "
#define LEN_VTELEMCHNS "\004" #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 #ifdef IMPERIAL_UNITS
#define LENGTH_UNIT "ft\0" #define LENGTH_UNIT "ft\0"
@ -149,7 +149,7 @@
#endif #endif
#define LEN_VTELEMUNIT "\003" #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_V (STR_VTELEMUNIT+1)
#define STR_A (STR_VTELEMUNIT+4) #define STR_A (STR_VTELEMUNIT+4)
@ -168,6 +168,9 @@
#define TR_VTELPROTO "" #define TR_VTELPROTO ""
#endif #endif
#define LEN_CURRENTSRC "\003"
#define TR_CURRENTSRC "Hub""A1\0""A2\0"
#define LEN_VARIOSRC "\006" #define LEN_VARIOSRC "\006"
#define TR_VARIOSRC "BaroV1""BaroV2""A1\0 ""A2\0" #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 TR_FUNCSOUNDS "Varn1 ""Varn2 ""F\200r ""Ring ""SciFi ""Robot ""Pip ""Tada ""Syrsa ""Siren ""Alarm ""Ratata""Tick "
#define LEN_VTELEMCHNS "\004" #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 #ifdef IMPERIAL_UNITS
#define LENGTH_UNIT "fot" #define LENGTH_UNIT "fot"
@ -144,7 +144,7 @@
#endif #endif
#define LEN_VTELEMUNIT "\003" #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_V (STR_VTELEMUNIT+1)
#define STR_A (STR_VTELEMUNIT+4) #define STR_A (STR_VTELEMUNIT+4)
@ -163,6 +163,9 @@
#define TR_VTELPROTO "" #define TR_VTELPROTO ""
#endif #endif
#define LEN_CURRENTSRC "\003"
#define TR_CURRENTSRC "Hub""A1\0""A2\0"
#define LEN_VARIOSRC "\006" #define LEN_VARIOSRC "\006"
#define TR_VARIOSRC "BaroV1""BaroV2""A1 ""A2\0" #define TR_VARIOSRC "BaroV1""BaroV2""A1 ""A2\0"

View file

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