mirror of
https://github.com/opentx/opentx.git
synced 2025-07-25 01:05:10 +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:
parent
61bbfd6e7c
commit
5dd7c105b6
29 changed files with 1285 additions and 905 deletions
|
@ -96,7 +96,7 @@ But in Dynamic Task Scheduling model(1),task resources will be recovered.
|
|||
If in Static Task Scheduling model(0),mutex module can not be used, as this model don't
|
||||
support to change task priority while CoOS running.
|
||||
*/
|
||||
#define CFG_TASK_SCHEDULE_EN (0)
|
||||
#define CFG_TASK_SCHEDULE_EN (1)
|
||||
|
||||
|
||||
/*---------------------- Task Management Config -----------------------------*/
|
||||
|
@ -232,7 +232,7 @@ Enable(1) or disable(0) flag management.
|
|||
Max number of flag is 32.
|
||||
*/
|
||||
#if CFG_TASK_WAITTING_EN > 0
|
||||
#define CFG_FLAG_EN (0)
|
||||
#define CFG_FLAG_EN (1)
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -242,7 +242,7 @@ Enable(1) or disable(0) mutex management.
|
|||
*/
|
||||
#if CFG_TASK_WAITTING_EN > 0
|
||||
#if CFG_TASK_SCHEDULE_EN > 0
|
||||
#define CFG_MUTEX_EN (0)
|
||||
#define CFG_MUTEX_EN (1)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
|
|
@ -333,7 +333,7 @@ ifeq ($(PCB), ARM)
|
|||
EXTRAINCDIRS += ersky9x CoOS/kernel CoOS/portable
|
||||
BOARDSRC = board_ersky9x.cpp
|
||||
SRC += ersky9x/core_cm3.c ersky9x/board_lowlevel.c ersky9x/crt.c ersky9x/vectors_sam3s.c
|
||||
SRC += CoOS/kernel/core.c CoOS/kernel/hook.c CoOS/kernel/task.c CoOS/kernel/event.c CoOS/kernel/time.c CoOS/kernel/timer.c CoOS/kernel/serviceReq.c CoOS/portable/GCC/port.c CoOS/portable/arch.c
|
||||
SRC += CoOS/kernel/core.c CoOS/kernel/hook.c CoOS/kernel/task.c CoOS/kernel/event.c CoOS/kernel/time.c CoOS/kernel/timer.c CoOS/kernel/flag.c CoOS/kernel/mutex.c CoOS/kernel/serviceReq.c CoOS/portable/GCC/port.c CoOS/portable/arch.c
|
||||
SRC += FatFs/ff.c FatFs/fattime.c FatFs/option/ccsbcs.c ersky9x/diskio.c
|
||||
EEPROMSRC = eeprom_arm.cpp
|
||||
PULSESSRC = pulses_arm.cpp
|
||||
|
@ -632,7 +632,7 @@ FOXLIB=-L/usr/local/lib \
|
|||
-Wl,-rpath,$(FOXPATH)/src/.libs
|
||||
|
||||
simu: stamp_header $(BOARDSRC) $(CPPSRC) Makefile simu.cpp simpgmspace.cpp *.h *.lbm eeprom.bin
|
||||
g++ simu.cpp $(CPPFLAGS) $(BOARDSRC) $(CPPSRC) simpgmspace.cpp $(ARCH) -MD -DSIMU -o simu $(FOXINC) $(FOXLIB) -pthread
|
||||
g++ $(CPPFLAGS) simu.cpp $(BOARDSRC) $(CPPSRC) simpgmspace.cpp $(ARCH) -MD -DSIMU -o simu $(FOXINC) $(FOXLIB) -pthread
|
||||
|
||||
eeprom.bin:
|
||||
dd if=/dev/zero of=$@ bs=1 count=2048
|
||||
|
@ -719,6 +719,7 @@ clean_list :
|
|||
$(REMOVE) $(SRC:.c=.s)
|
||||
$(REMOVE) *.o
|
||||
$(REMOVE) */*.o
|
||||
$(REMOVE) */*/*.o
|
||||
$(REMOVE) *.d
|
||||
$(REMOVE) *.lst
|
||||
$(REMOVE) allsrc.cpp
|
||||
|
|
|
@ -60,7 +60,6 @@ extern void beep(uint8_t val);
|
|||
#define AUDIO_KEYPAD_UP() beep(0)
|
||||
#define AUDIO_KEYPAD_DOWN() beep(0)
|
||||
#define AUDIO_MENUS() beep(0)
|
||||
#define AUDIO_TRIM() beep(1)
|
||||
#define AUDIO_WARNING2() beep(2)
|
||||
#define AUDIO_WARNING1() beep(3)
|
||||
#define AUDIO_ERROR() beep(4)
|
||||
|
@ -76,7 +75,9 @@ extern void beep(uint8_t val);
|
|||
#define AUDIO_POT_STICK_MIDDLE() beep(2)
|
||||
#define AUDIO_VARIO_UP() _beep(1)
|
||||
#define AUDIO_VARIO_DOWN() _beep(1)
|
||||
#define AUDIO_TRIM(event, f) { if (event & _MSK_KEY_REPT) warble = true; beep(1); }
|
||||
#define AUDIO_TRIM_MIDDLE(f) beep(2)
|
||||
#define AUDIO_PLAY(p) beep(3)
|
||||
|
||||
#define IS_AUDIO_BUSY() (g_beepCnt || beepAgain || beepOn)
|
||||
|
||||
|
|
|
@ -727,7 +727,7 @@ void board_init()
|
|||
|
||||
__enable_irq() ;
|
||||
|
||||
start_sound() ;
|
||||
startSound() ;
|
||||
|
||||
eeprom_init();
|
||||
|
||||
|
|
|
@ -920,14 +920,9 @@ const pm_char * eeBackupModel(uint8_t i_fileSrc)
|
|||
DIR archiveFolder;
|
||||
UINT written;
|
||||
|
||||
FRESULT result = f_mount(0, &g_FATFS_Obj);
|
||||
if (result != FR_OK) {
|
||||
return SDCARD_ERROR(result);
|
||||
}
|
||||
|
||||
// check and create folder here
|
||||
strcpy(buf, STR_MODELS_PATH);
|
||||
result = f_opendir(&archiveFolder, buf);
|
||||
FRESULT result = f_opendir(&archiveFolder, buf);
|
||||
if (result != FR_OK) {
|
||||
result = f_mkdir(buf);
|
||||
if (result != FR_OK)
|
||||
|
@ -995,17 +990,12 @@ const pm_char * eeRestoreModel(uint8_t i_fileDst, char *model_name)
|
|||
FIL restoreFile;
|
||||
UINT read;
|
||||
|
||||
FRESULT result = f_mount(0, &g_FATFS_Obj);
|
||||
if (result != FR_OK) {
|
||||
return SDCARD_ERROR(result);
|
||||
}
|
||||
|
||||
strcpy(buf, STR_MODELS_PATH);
|
||||
buf[sizeof(MODELS_PATH)-1] = '/';
|
||||
strcpy(&buf[sizeof(MODELS_PATH)], model_name);
|
||||
strcpy(&buf[strlen(buf)], STR_MODELS_EXT);
|
||||
|
||||
result = f_open(&restoreFile, buf, FA_OPEN_EXISTING | FA_READ);
|
||||
FRESULT result = f_open(&restoreFile, buf, FA_OPEN_EXISTING | FA_READ);
|
||||
if (result != FR_OK) {
|
||||
return SDCARD_ERROR(result);
|
||||
}
|
||||
|
|
|
@ -33,7 +33,30 @@
|
|||
|
||||
#include "../open9x.h"
|
||||
|
||||
audioQueue::audioQueue()
|
||||
uint8_t audioState = 0;
|
||||
|
||||
uint8_t t_queueRidx;
|
||||
uint8_t t_queueWidx;
|
||||
|
||||
uint8_t toneFreq;
|
||||
//int8_t toneFreqIncr;
|
||||
uint8_t toneTimeLeft;
|
||||
uint8_t tonePause;
|
||||
|
||||
uint8_t tone2Freq;
|
||||
uint8_t tone2TimeLeft;
|
||||
uint8_t tone2Pause;
|
||||
|
||||
char toneWavFile[32+1] = "";
|
||||
|
||||
// queue arrays
|
||||
uint8_t queueToneFreq[AUDIO_QUEUE_LENGTH];
|
||||
// int8_t queueToneFreqIncr[AUDIO_QUEUE_LENGTH];
|
||||
uint8_t queueToneLength[AUDIO_QUEUE_LENGTH];
|
||||
uint8_t queueTonePause[AUDIO_QUEUE_LENGTH];
|
||||
uint8_t queueToneRepeat[AUDIO_QUEUE_LENGTH];
|
||||
|
||||
void audioInit()
|
||||
{
|
||||
toneTimeLeft = 0;
|
||||
tonePause = 0;
|
||||
|
@ -42,80 +65,105 @@ audioQueue::audioQueue()
|
|||
t_queueWidx = 0;
|
||||
}
|
||||
|
||||
// heartbeat is responsibile for issueing the audio tones and general square waves
|
||||
// it is essentially the life of the class.
|
||||
// it is called every 10ms
|
||||
void audioQueue::heartbeat()
|
||||
void audioTimerHandle(void)
|
||||
{
|
||||
#if defined(SIMU)
|
||||
return;
|
||||
#endif
|
||||
CoSetFlag(audioFlag);
|
||||
}
|
||||
|
||||
if (toneTimeLeft > 0) {
|
||||
if (toneChanged) {
|
||||
toneChanged = 0;
|
||||
set_frequency(toneFreq * 61 / 2);
|
||||
if(toneRateLimit == 0){ //only start if within rate limit
|
||||
if(toneFreq == 0){
|
||||
tone_stop();
|
||||
} else {
|
||||
tone_start(0);
|
||||
// TODO Should be here!
|
||||
extern uint16_t Sine_values[];
|
||||
|
||||
|
||||
void audioTask(void* pdata)
|
||||
{
|
||||
static FIL wavFile;
|
||||
|
||||
while (1) {
|
||||
CoWaitForSingleFlag(audioFlag, 0);
|
||||
|
||||
audioState = 1; // TODO #define
|
||||
|
||||
if (toneWavFile[0]) {
|
||||
FRESULT result = FR_OK;
|
||||
uint16_t bufsize = 2*WAV_BUFFER_SIZE;
|
||||
uint16_t * bufdata = wavSamplesBuffer;
|
||||
if (toneWavFile[1]) {
|
||||
result = f_open(&wavFile, toneWavFile, FA_OPEN_EXISTING | FA_READ);
|
||||
toneWavFile[1] = '\0';
|
||||
bufdata = wavSamplesArray;
|
||||
bufsize = 4*WAV_BUFFER_SIZE;
|
||||
register Dacc *dacptr = DACC;
|
||||
dacptr->DACC_TPR = (uint32_t)wavSamplesArray;
|
||||
wavSamplesBuffer = wavSamplesArray + WAV_BUFFER_SIZE;
|
||||
dacptr->DACC_TNPR = (uint32_t)wavSamplesBuffer;
|
||||
dacptr->DACC_TCR = WAV_BUFFER_SIZE/2;
|
||||
dacptr->DACC_TNCR = WAV_BUFFER_SIZE/2;
|
||||
setFrequency(12000);
|
||||
toneStart();
|
||||
}
|
||||
UINT read;
|
||||
if (result != FR_OK || f_read(&wavFile, (uint8_t *)bufdata, bufsize, &read) != FR_OK || read != bufsize) {
|
||||
f_close(&wavFile);
|
||||
toneWavFile[0] = '\0';
|
||||
toneStop();
|
||||
}
|
||||
toneRateLimit++; //count up the rate limit
|
||||
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
|
||||
}
|
||||
#if 1
|
||||
else {
|
||||
if (tonePause > 0) {
|
||||
tone_stop();
|
||||
toneRateLimit = 0; //reset rate limit
|
||||
tonePause--; //time gets counted down
|
||||
read /= 2;
|
||||
for (uint32_t i=0; i<read; i++) {
|
||||
bufdata[i] = ((uint16_t)0x8000 + ((int16_t)(bufdata[i]))) >> 4;
|
||||
}
|
||||
}
|
||||
#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) {
|
||||
toneChanged = 1;
|
||||
toneFreq = queueToneFreq[t_queueRidx];
|
||||
toneTimeLeft = queueToneLength[t_queueRidx];
|
||||
toneFreqIncr = queueToneFreqIncr[t_queueRidx];
|
||||
// TODO ? toneFreqIncr = queueToneFreqIncr[t_queueRidx];
|
||||
tonePause = queueTonePause[t_queueRidx];
|
||||
if (!queueToneRepeat[t_queueRidx]--) {
|
||||
t_queueRidx = (t_queueRidx + 1) % AUDIO_QUEUE_LENGTH;
|
||||
}
|
||||
CoSetFlag(audioFlag);
|
||||
}
|
||||
else if (tone2TimeLeft > 0) {
|
||||
CoSetTmrCnt(audioTimer, tone2TimeLeft, 0);
|
||||
tone2TimeLeft = 0;
|
||||
// TODO function for that ...
|
||||
DACC->DACC_TPR = (uint32_t) Sine_values ;
|
||||
DACC->DACC_TCR = 50 ; // words, 100 16 bit values
|
||||
DACC->DACC_TNPR = (uint32_t) Sine_values ;
|
||||
DACC->DACC_TNCR = 50 ; // words, 100 16 bit values
|
||||
setFrequency(tone2Freq * 6100 / 2);
|
||||
toneStart();
|
||||
CoStartTmr(audioTimer);
|
||||
}
|
||||
else {
|
||||
if (tone2TimeLeft > 0) {
|
||||
if (tone2Changed) {
|
||||
tone2Changed = 0;
|
||||
set_frequency(tone2Freq * 61 / 2);
|
||||
if(tone2RateLimit == 0){ //only start if within rate limit
|
||||
tone_start(0);
|
||||
}
|
||||
}
|
||||
tone2TimeLeft--; //time gets counted down
|
||||
tone2RateLimit++; //count up the rate limit
|
||||
if(tone2RateLimit == TONE2_RATE_LIMIT){ //reset the rate limit
|
||||
tone2RateLimit = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
tone_stop();
|
||||
tone2RateLimit = 0; //reset rate limit
|
||||
if (tone2Pause > 0) {
|
||||
tone2Pause--; //time gets counted down
|
||||
}
|
||||
}
|
||||
audioState = 0;
|
||||
toneStop();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inline uint8_t audioQueue::getToneLength(uint8_t tLen)
|
||||
inline uint8_t getToneLength(uint8_t tLen)
|
||||
{
|
||||
uint8_t result = tLen; // default
|
||||
if (g_eeGeneral.beeperLength < 0) {
|
||||
|
@ -127,32 +175,33 @@ inline uint8_t audioQueue::getToneLength(uint8_t tLen)
|
|||
return result;
|
||||
}
|
||||
|
||||
void audioQueue::pause(uint8_t tLen)
|
||||
void pause(uint8_t tLen)
|
||||
{
|
||||
play(0, tLen, 5); // a pause
|
||||
play(0, 0, tLen); // a pause
|
||||
}
|
||||
|
||||
void audioQueue::play(uint8_t tFreq, uint8_t tLen, uint8_t tPause,
|
||||
void play(uint8_t tFreq, uint8_t tLen, uint8_t tPause,
|
||||
uint8_t tFlags, int8_t tFreqIncr)
|
||||
{
|
||||
if (tFlags & PLAY_SOUND_VARIO) {
|
||||
tone2Changed = 1;
|
||||
tone2Freq = tFreq;
|
||||
tone2TimeLeft = tLen;
|
||||
tone2Pause = tPause;
|
||||
if (audioState == 0) CoSetFlag(audioFlag);
|
||||
}
|
||||
else {
|
||||
if (tFreq > 0) { //we dont add pitch if zero as this is a pause only event
|
||||
tFreq += g_eeGeneral.speakerPitch + BEEP_OFFSET; // add pitch compensator
|
||||
}
|
||||
tLen = getToneLength(tLen);
|
||||
if (tFlags & PLAY_NOW || (!busy() && empty())) {
|
||||
toneChanged = 1;
|
||||
if ((tFlags & PLAY_NOW) || audioState == 0) {
|
||||
toneWavFile[0] = '\0';
|
||||
toneFreq = tFreq;
|
||||
toneTimeLeft = tLen;
|
||||
tonePause = tPause;
|
||||
toneFreqIncr = tFreqIncr;
|
||||
// toneFreqIncr = tFreqIncr;
|
||||
t_queueWidx = t_queueRidx;
|
||||
CoSetFlag(audioFlag);
|
||||
}
|
||||
else {
|
||||
tFlags++;
|
||||
|
@ -166,14 +215,20 @@ void audioQueue::play(uint8_t tFreq, uint8_t tLen, uint8_t tPause,
|
|||
queueToneLength[t_queueWidx] = tLen;
|
||||
queueTonePause[t_queueWidx] = tPause;
|
||||
queueToneRepeat[t_queueWidx] = tFlags - 1;
|
||||
queueToneFreqIncr[t_queueWidx] = tFreqIncr;
|
||||
// queueToneFreqIncr[t_queueWidx] = tFreqIncr;
|
||||
t_queueWidx = next_queueWidx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void audioQueue::event(uint8_t e, uint8_t f)
|
||||
void playFile(const char *filename)
|
||||
{
|
||||
strcpy(toneWavFile, filename);
|
||||
CoSetFlag(audioFlag);
|
||||
}
|
||||
|
||||
void audioEvent(uint8_t e, uint8_t f)
|
||||
{
|
||||
#ifdef HAPTIC
|
||||
haptic.event(e); //do this before audio to help sync timings
|
||||
|
@ -185,7 +240,7 @@ void audioQueue::event(uint8_t e, uint8_t f)
|
|||
}
|
||||
|
||||
if (g_eeGeneral.beeperMode>0 || (g_eeGeneral.beeperMode==0 && e>=AU_TRIM_MOVE) || (g_eeGeneral.beeperMode>=-1 && e<=AU_ERROR)) {
|
||||
if (e < AU_FRSKY_FIRST || empty()) {
|
||||
if (e < AU_FRSKY_FIRST || audioEmpty()) {
|
||||
switch (e) {
|
||||
// inactivity timer alert
|
||||
case AU_INACTIVITY:
|
||||
|
@ -193,7 +248,7 @@ void audioQueue::event(uint8_t e, uint8_t f)
|
|||
break;
|
||||
// low battery in tx
|
||||
case AU_TX_BATTERY_LOW:
|
||||
if (empty()) {
|
||||
if (audioEmpty()) {
|
||||
play(60, 40, 6, 2, 1);
|
||||
play(80, 40, 6, 2, -1);
|
||||
}
|
||||
|
@ -343,8 +398,3 @@ void audioQueue::event(uint8_t e, uint8_t f)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
void audioDefevent(uint8_t e)
|
||||
{
|
||||
audio.event(e, BEEP_DEFAULT_FREQ);
|
||||
}
|
||||
|
|
|
@ -43,91 +43,72 @@
|
|||
#define TONE1_RATE_LIMIT (10)
|
||||
#define TONE2_RATE_LIMIT (10)
|
||||
|
||||
class audioQueue
|
||||
extern uint8_t t_queueRidx;
|
||||
extern uint8_t t_queueWidx;
|
||||
|
||||
extern uint8_t toneFreq;
|
||||
//int8_t toneFreqIncr;
|
||||
extern uint8_t toneTimeLeft;
|
||||
extern uint8_t tonePause;
|
||||
|
||||
extern char toneWavFile[32+1];
|
||||
|
||||
// vario
|
||||
extern uint8_t tone2Freq;
|
||||
extern uint8_t tone2TimeLeft;
|
||||
extern uint8_t tone2Pause;
|
||||
|
||||
// queue arrays
|
||||
extern uint8_t queueToneFreq[AUDIO_QUEUE_LENGTH];
|
||||
// int8_t queueToneFreqIncr[AUDIO_QUEUE_LENGTH];
|
||||
extern uint8_t queueToneLength[AUDIO_QUEUE_LENGTH];
|
||||
extern uint8_t queueTonePause[AUDIO_QUEUE_LENGTH];
|
||||
extern uint8_t queueToneRepeat[AUDIO_QUEUE_LENGTH];
|
||||
|
||||
void initAudio();
|
||||
|
||||
void play(uint8_t tFreq, uint8_t tLen, uint8_t tPause, uint8_t tFlags=0, int8_t tFreqIncr=0);
|
||||
void playFile(const char *filename);
|
||||
void pause(uint8_t tLen);
|
||||
|
||||
inline bool audioBusy()
|
||||
{
|
||||
public:
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
// it is essentially the life of the class.
|
||||
void heartbeat();
|
||||
|
||||
// bool freeslots(uint8_t slots);
|
||||
|
||||
inline bool empty() {
|
||||
inline bool audioEmpty()
|
||||
{
|
||||
return (t_queueRidx == t_queueWidx);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
inline uint8_t getToneLength(uint8_t tLen);
|
||||
#define AUDIO_KEYPAD_UP() audioEvent(AU_KEYPAD_UP)
|
||||
#define AUDIO_KEYPAD_DOWN() audioEvent(AU_KEYPAD_DOWN)
|
||||
#define AUDIO_MENUS() audioEvent(AU_MENUS)
|
||||
#define AUDIO_WARNING1() audioEvent(AU_WARNING1)
|
||||
#define AUDIO_WARNING2() audioEvent(AU_WARNING2)
|
||||
#define AUDIO_ERROR() audioEvent(AU_ERROR)
|
||||
|
||||
private:
|
||||
uint8_t t_queueRidx;
|
||||
uint8_t t_queueWidx;
|
||||
#define IS_AUDIO_BUSY() audioBusy()
|
||||
|
||||
uint8_t toneChanged;
|
||||
uint8_t toneFreq;
|
||||
int8_t toneFreqIncr;
|
||||
uint8_t toneTimeLeft;
|
||||
uint8_t tonePause;
|
||||
uint8_t toneRateLimit;
|
||||
#define AUDIO_TIMER_30() audioEvent(AU_TIMER_30)
|
||||
#define AUDIO_TIMER_20() audioEvent(AU_TIMER_20)
|
||||
#define AUDIO_TIMER_10() audioEvent(AU_TIMER_10)
|
||||
#define AUDIO_TIMER_LT3() audioEvent(AU_TIMER_LT3)
|
||||
#define AUDIO_MINUTE_BEEP() audioEvent(AU_WARNING1)
|
||||
#define AUDIO_INACTIVITY() audioEvent(AU_INACTIVITY)
|
||||
#define AUDIO_MIX_WARNING_1() audioEvent(AU_MIX_WARNING_1)
|
||||
#define AUDIO_MIX_WARNING_2() audioEvent(AU_MIX_WARNING_2)
|
||||
#define AUDIO_MIX_WARNING_3() audioEvent(AU_MIX_WARNING_3)
|
||||
#define AUDIO_POT_STICK_MIDDLE() audioEvent(AU_POT_STICK_MIDDLE)
|
||||
#define AUDIO_VARIO_UP() audioEvent(AU_KEYPAD_UP)
|
||||
#define AUDIO_VARIO_DOWN() audioEvent(AU_KEYPAD_DOWN)
|
||||
#define AUDIO_TRIM_MIDDLE(f) audioEvent(AU_TRIM_MIDDLE, f)
|
||||
#define AUDIO_TRIM(event, f) audioEvent(AU_TRIM_MOVE, f)
|
||||
#define AUDIO_PLAY(p) audioEvent(p)
|
||||
#define AUDIO_VARIO(f, t) play(f, t, 0, PLAY_SOUND_VARIO)
|
||||
|
||||
// vario
|
||||
uint8_t tone2Changed;
|
||||
uint8_t tone2Freq;
|
||||
uint8_t tone2TimeLeft;
|
||||
uint8_t tone2Pause;
|
||||
uint8_t tone2RateLimit;
|
||||
|
||||
// queue arrays
|
||||
uint8_t queueToneFreq[AUDIO_QUEUE_LENGTH];
|
||||
int8_t queueToneFreqIncr[AUDIO_QUEUE_LENGTH];
|
||||
uint8_t queueToneLength[AUDIO_QUEUE_LENGTH];
|
||||
uint8_t queueTonePause[AUDIO_QUEUE_LENGTH];
|
||||
uint8_t queueToneRepeat[AUDIO_QUEUE_LENGTH];
|
||||
|
||||
};
|
||||
|
||||
//wrapper function - dirty but results in a space saving!!!
|
||||
extern audioQueue audio;
|
||||
|
||||
void audioDefevent(uint8_t e);
|
||||
|
||||
#define AUDIO_KEYPAD_UP() audioDefevent(AU_KEYPAD_UP)
|
||||
#define AUDIO_KEYPAD_DOWN() audioDefevent(AU_KEYPAD_DOWN)
|
||||
#define AUDIO_MENUS() audioDefevent(AU_MENUS)
|
||||
#define AUDIO_WARNING1() audioDefevent(AU_WARNING1)
|
||||
#define AUDIO_WARNING2() audioDefevent(AU_WARNING2)
|
||||
#define AUDIO_ERROR() audioDefevent(AU_ERROR)
|
||||
|
||||
|
||||
#define IS_AUDIO_BUSY() audio.busy()
|
||||
|
||||
#define AUDIO_TIMER_30() audioDefevent(AU_TIMER_30)
|
||||
#define AUDIO_TIMER_20() audioDefevent(AU_TIMER_20)
|
||||
#define AUDIO_TIMER_10() audioDefevent(AU_TIMER_10)
|
||||
#define AUDIO_TIMER_LT3() audioDefevent(AU_TIMER_LT3)
|
||||
#define AUDIO_MINUTE_BEEP() audioDefevent(AU_WARNING1)
|
||||
#define AUDIO_INACTIVITY() audioDefevent(AU_INACTIVITY)
|
||||
#define AUDIO_MIX_WARNING_1() audioDefevent(AU_MIX_WARNING_1)
|
||||
#define AUDIO_MIX_WARNING_2() audioDefevent(AU_MIX_WARNING_2)
|
||||
#define AUDIO_MIX_WARNING_3() audioDefevent(AU_MIX_WARNING_3)
|
||||
#define AUDIO_POT_STICK_MIDDLE() audioDefevent(AU_POT_STICK_MIDDLE)
|
||||
#define AUDIO_VARIO_UP() audioDefevent(AU_KEYPAD_UP)
|
||||
#define AUDIO_VARIO_DOWN() audioDefevent(AU_KEYPAD_DOWN)
|
||||
#define AUDIO_TRIM_MIDDLE(f) audio.event(AU_TRIM_MIDDLE, f)
|
||||
|
||||
#define AUDIO_HEARTBEAT() audio.heartbeat()
|
||||
#define AUDIO_HEARTBEAT()
|
||||
|
||||
#endif
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -51,28 +51,14 @@ uint16_t Sine_values[] =
|
|||
872, 976,1084,1196,1311,1429,1550,1673,1797,1922
|
||||
} ;
|
||||
|
||||
const uint16_t PianoTones[] =
|
||||
{
|
||||
28, 29, 31, 33, 35, 37, 39, 41, 44, 46,
|
||||
49, 52, 55, 58, 62, 65, 69, 73, 78, 82,
|
||||
87, 92, 98, 104, 110, 117, 123, 131, 139, 147,
|
||||
156, 165, 175, 185, 196, 208, 220, 233, 247, 262, // d#, E, F, f#, G, g#, A, a#, B, C(middle)
|
||||
277, 294, 311, 330, 349, 370, 392, 415, 440, 466, // c#, D, d#, E, F, f#, G, g#, A, a#
|
||||
494, 523, 554, 587, 622, 659, 698, 740, 784, 831, // B, C, c#, D, d#, E, F, f#, G, g#
|
||||
880, 932, 988, 1047, 1109, 1175, 1245, 1319, 1397, 1480,
|
||||
1568, 1661, 1760, 1865, 1976, 2093, 2217, 2349, 2489, 2637,
|
||||
2794, 2960, 3136, 3322, 3520 ,3729, 3951, 4186
|
||||
} ;
|
||||
|
||||
|
||||
// Sound routines
|
||||
|
||||
void start_sound()
|
||||
void startSound()
|
||||
{
|
||||
register Pio *pioptr ;
|
||||
|
||||
start_timer1() ;
|
||||
init_dac() ;
|
||||
initDac() ;
|
||||
init_twi() ;
|
||||
|
||||
pioptr = PIOA ;
|
||||
|
@ -115,20 +101,17 @@ void buzzer_sound( uint8_t time )
|
|||
Buzzer_count = time ;
|
||||
}
|
||||
|
||||
void set_frequency( uint32_t frequency )
|
||||
void setFrequency( uint32_t frequency )
|
||||
{
|
||||
register Tc *ptc ;
|
||||
register uint32_t timer ;
|
||||
|
||||
timer = Master_frequency / (800 * frequency) ; // MCK/8 and 100 000 Hz
|
||||
if ( timer > 65535 )
|
||||
{
|
||||
timer = Master_frequency / (8 * frequency) ; // MCK/8 and 100 000 Hz
|
||||
if (timer > 65535)
|
||||
timer = 65535 ;
|
||||
}
|
||||
if ( timer < 2 )
|
||||
{
|
||||
if (timer < 2)
|
||||
timer = 2 ;
|
||||
}
|
||||
|
||||
ptc = TC0 ; // Tc block 0 (TC0-2)
|
||||
ptc->TC_CHANNEL[1].TC_CCR = TC_CCR0_CLKDIS ; // Stop clock
|
||||
ptc->TC_CHANNEL[1].TC_RC = timer ; // 100 000 Hz
|
||||
|
@ -136,7 +119,6 @@ void set_frequency( uint32_t frequency )
|
|||
ptc->TC_CHANNEL[1].TC_CCR = 5 ; // Enable clock and trigger it (may only need trigger)
|
||||
}
|
||||
|
||||
|
||||
// Start TIMER1 at 100000Hz, used for DACC trigger
|
||||
void start_timer1()
|
||||
{
|
||||
|
@ -163,7 +145,7 @@ void start_timer1()
|
|||
// Configure DAC1 (or DAC0 for REVB)
|
||||
// Not sure why PB14 has not be allocated to the DAC, although it is an EXTRA function
|
||||
// So maybe it is automatically done
|
||||
void init_dac()
|
||||
void initDac()
|
||||
{
|
||||
register Dacc *dacptr ;
|
||||
|
||||
|
@ -181,23 +163,32 @@ void init_dac()
|
|||
#endif
|
||||
dacptr->DACC_CDR = 2048 ; // Half amplitude
|
||||
// Data for PDC must NOT be in flash, PDC needs a RAM source.
|
||||
#ifndef SIMU
|
||||
dacptr->DACC_TPR = (uint32_t) Sine_values ;
|
||||
dacptr->DACC_TNPR = (uint32_t) Sine_values ;
|
||||
#endif
|
||||
dacptr->DACC_TCR = 50 ; // words, 100 16 bit values
|
||||
dacptr->DACC_TNCR = 50 ; // words, 100 16 bit values
|
||||
dacptr->DACC_PTCR = DACC_PTCR_TXTEN ;
|
||||
NVIC_EnableIRQ(DACC_IRQn) ;
|
||||
}
|
||||
|
||||
uint16_t wavSamplesArray[2*WAV_BUFFER_SIZE]; /* 2 buffers of 100ms at 12kHz */
|
||||
uint16_t *wavSamplesBuffer;
|
||||
|
||||
extern "C" void DAC_IRQHandler()
|
||||
{
|
||||
// Data for PDC must NOT be in flash, PDC needs a RAM source.
|
||||
#ifndef SIMU
|
||||
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 ;
|
||||
#endif
|
||||
DACC->DACC_TNCR = 50 ; // words, 100 16 bit values
|
||||
}
|
||||
}
|
||||
|
||||
void end_sound()
|
||||
|
|
|
@ -37,23 +37,26 @@
|
|||
|
||||
#define NUM_VOL_LEVELS 24
|
||||
|
||||
extern void start_sound( void ) ;
|
||||
extern void startSound( void ) ;
|
||||
extern void buzzer_on( void ) ;
|
||||
extern void buzzer_off( void ) ;
|
||||
extern void buzzer_sound( uint8_t time ) ;
|
||||
extern void set_frequency( uint32_t frequency ) ;
|
||||
extern void setFrequency( uint32_t frequency ) ;
|
||||
extern void start_timer1( void ) ;
|
||||
extern void init_dac( void ) ;
|
||||
extern "C" void DAC_IRQHandler( void ) ;
|
||||
extern void initDac( void ) ;
|
||||
extern void end_sound( void ) ;
|
||||
|
||||
inline void tone_start( register uint32_t time )
|
||||
#define WAV_BUFFER_SIZE 1200
|
||||
extern uint16_t wavSamplesArray[2*WAV_BUFFER_SIZE]; /* 2 buffers of 100ms at 12kHz */
|
||||
extern uint16_t *wavSamplesBuffer;
|
||||
|
||||
inline void toneStart()
|
||||
{
|
||||
PMC->PMC_PCER0 |= 0x40000000L ; // Enable peripheral clock to DAC
|
||||
DACC->DACC_IER = DACC_IER_ENDTX ;
|
||||
}
|
||||
|
||||
inline void tone_stop( void )
|
||||
inline void toneStop()
|
||||
{
|
||||
DACC->DACC_IDR = DACC_IDR_ENDTX ; // Disable interrupt
|
||||
}
|
||||
|
|
374
src/frsky.cpp
374
src/frsky.cpp
|
@ -59,23 +59,10 @@ uint8_t FrskyRxBufferReady = 0;
|
|||
int8_t frskyStreaming = -1;
|
||||
uint8_t frskyUsrStreaming = 0;
|
||||
uint8_t link_counter = 0;
|
||||
|
||||
uint32_t consumption = 0;
|
||||
uint16_t s_currTmr = 0;
|
||||
|
||||
FrskyData frskyTelemetry[2];
|
||||
FrskyRSSI frskyRSSI[2];
|
||||
|
||||
struct FrskyAlarm {
|
||||
uint8_t level; // The alarm's 'urgency' level. 0=disabled, 1=yellow, 2=orange, 3=red
|
||||
uint8_t greater; // 1 = 'if greater than'. 0 = 'if less than'
|
||||
uint8_t value; // The threshold above or below which the alarm will sound
|
||||
};
|
||||
|
||||
struct FrskyAlarm frskyAlarms[4];
|
||||
uint16_t currentConsumptionBoundary = 0;
|
||||
FrskyData frskyData;
|
||||
|
||||
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
|
||||
FrskyHubData frskyHubData;
|
||||
enum BarThresholdIdx {
|
||||
THLD_ALT,
|
||||
THLD_RPM,
|
||||
|
@ -129,36 +116,36 @@ uint8_t frskyGetUserData(char *buffer, uint8_t bufSize)
|
|||
#ifdef FRSKY_HUB
|
||||
inline void getGpsPilotPosition()
|
||||
{
|
||||
frskyHubData.pilotLatitude = ((uint32_t)(frskyHubData.gpsLatitude_bp / 100) * 1000000) + (((uint32_t)(frskyHubData.gpsLatitude_bp % 100) * 10000 + frskyHubData.gpsLatitude_ap) * 5) / 3;
|
||||
frskyHubData.pilotLongitude = ((uint32_t)(frskyHubData.gpsLongitude_bp / 100) * 1000000) + (((uint32_t)(frskyHubData.gpsLongitude_bp % 100) * 10000 + frskyHubData.gpsLongitude_ap) * 5) / 3;
|
||||
uint32_t lat = (uint32_t)(frskyHubData.gpsLatitude_bp / 100) * 100 + ((uint32_t)(frskyHubData.gpsLatitude_bp % 100) * 5) / 3;
|
||||
frskyData.frskyHubData.pilotLatitude = ((uint32_t)(frskyData.frskyHubData.gpsLatitude_bp / 100) * 1000000) + (((uint32_t)(frskyData.frskyHubData.gpsLatitude_bp % 100) * 10000 + frskyData.frskyHubData.gpsLatitude_ap) * 5) / 3;
|
||||
frskyData.frskyHubData.pilotLongitude = ((uint32_t)(frskyData.frskyHubData.gpsLongitude_bp / 100) * 1000000) + (((uint32_t)(frskyData.frskyHubData.gpsLongitude_bp % 100) * 10000 + frskyData.frskyHubData.gpsLongitude_ap) * 5) / 3;
|
||||
uint32_t lat = (uint32_t)(frskyData.frskyHubData.gpsLatitude_bp / 100) * 100 + ((uint32_t)(frskyData.frskyHubData.gpsLatitude_bp % 100) * 5) / 3;
|
||||
uint32_t angle2 = (lat*lat) / 10000;
|
||||
uint32_t angle4 = angle2 * angle2;
|
||||
frskyHubData.distFromEarthAxis = 139*(((uint32_t)10000000-((angle2*(uint32_t)123370)/81)+(angle4/25))/12500);
|
||||
// printf("frskyHubData.distFromEarthAxis=%d\n", frskyHubData.distFromEarthAxis); fflush(stdout);
|
||||
frskyData.frskyHubData.distFromEarthAxis = 139*(((uint32_t)10000000-((angle2*(uint32_t)123370)/81)+(angle4/25))/12500);
|
||||
// printf("frskyData.frskyHubData.distFromEarthAxis=%d\n", frskyData.frskyHubData.distFromEarthAxis); fflush(stdout);
|
||||
}
|
||||
|
||||
inline void getGpsDistance()
|
||||
{
|
||||
uint32_t lat = ((uint32_t)(frskyHubData.gpsLatitude_bp / 100) * 1000000) + (((uint32_t)(frskyHubData.gpsLatitude_bp % 100) * 10000 + frskyHubData.gpsLatitude_ap) * 5) / 3;
|
||||
uint32_t lng = ((uint32_t)(frskyHubData.gpsLongitude_bp / 100) * 1000000) + (((uint32_t)(frskyHubData.gpsLongitude_bp % 100) * 10000 + frskyHubData.gpsLongitude_ap) * 5) / 3;
|
||||
uint32_t lat = ((uint32_t)(frskyData.frskyHubData.gpsLatitude_bp / 100) * 1000000) + (((uint32_t)(frskyData.frskyHubData.gpsLatitude_bp % 100) * 10000 + frskyData.frskyHubData.gpsLatitude_ap) * 5) / 3;
|
||||
uint32_t lng = ((uint32_t)(frskyData.frskyHubData.gpsLongitude_bp / 100) * 1000000) + (((uint32_t)(frskyData.frskyHubData.gpsLongitude_bp % 100) * 10000 + frskyData.frskyHubData.gpsLongitude_ap) * 5) / 3;
|
||||
|
||||
// printf("lat=%d (%d), long=%d (%d)\n", lat, abs(lat - frskyHubData.pilotLatitude), lng, abs(lng - frskyHubData.pilotLongitude));
|
||||
// printf("lat=%d (%d), long=%d (%d)\n", lat, abs(lat - frskyData.frskyHubData.pilotLatitude), lng, abs(lng - frskyData.frskyHubData.pilotLongitude));
|
||||
|
||||
uint32_t angle = (lat > frskyHubData.pilotLatitude) ? lat - frskyHubData.pilotLatitude : frskyHubData.pilotLatitude - lat;
|
||||
uint32_t angle = (lat > frskyData.frskyHubData.pilotLatitude) ? lat - frskyData.frskyHubData.pilotLatitude : frskyData.frskyHubData.pilotLatitude - lat;
|
||||
uint32_t dist = EARTH_RADIUS * angle / 1000000;
|
||||
uint32_t result = dist*dist;
|
||||
|
||||
angle = (lng > frskyHubData.pilotLongitude) ? lng - frskyHubData.pilotLongitude : frskyHubData.pilotLongitude - lng;
|
||||
dist = frskyHubData.distFromEarthAxis * angle / 1000000;
|
||||
angle = (lng > frskyData.frskyHubData.pilotLongitude) ? lng - frskyData.frskyHubData.pilotLongitude : frskyData.frskyHubData.pilotLongitude - lng;
|
||||
dist = frskyData.frskyHubData.distFromEarthAxis * angle / 1000000;
|
||||
result += dist*dist;
|
||||
|
||||
dist = abs(frskyHubData.baroAltitudeOffset ? frskyHubData.baroAltitude_bp : frskyHubData.gpsAltitude_bp);
|
||||
dist = abs(frskyData.frskyHubData.baroAltitudeOffset ? frskyData.frskyHubData.baroAltitude_bp : frskyData.frskyHubData.gpsAltitude_bp);
|
||||
result += dist*dist;
|
||||
|
||||
frskyHubData.gpsDistance = isqrt32(result);
|
||||
if (frskyHubData.gpsDistance > frskyHubData.maxGpsDistance)
|
||||
frskyHubData.maxGpsDistance = frskyHubData.gpsDistance;
|
||||
frskyData.frskyHubData.gpsDistance = isqrt32(result);
|
||||
if (frskyData.frskyHubData.gpsDistance > frskyData.frskyHubData.maxGpsDistance)
|
||||
frskyData.frskyHubData.maxGpsDistance = frskyData.frskyHubData.gpsDistance;
|
||||
}
|
||||
|
||||
typedef enum {
|
||||
|
@ -178,23 +165,23 @@ void evalVario(int16_t altitude_bp, uint16_t altitude_ap)
|
|||
{
|
||||
#if defined(VARIO)
|
||||
int32_t varioAltitude_cm = (int32_t)altitude_bp * 100 + (altitude_bp > 0 ? altitude_ap : -altitude_ap);
|
||||
uint8_t varioAltitudeQueuePointer = frskyHubData.varioAltitudeQueuePointer + 1;
|
||||
uint8_t varioAltitudeQueuePointer = frskyData.frskyHubData.varioAltitudeQueuePointer + 1;
|
||||
if (varioAltitudeQueuePointer == VARIO_QUEUE_LENGTH)
|
||||
varioAltitudeQueuePointer = 0;
|
||||
frskyHubData.varioAltitudeQueuePointer = varioAltitudeQueuePointer;
|
||||
frskyHubData.varioSpeed -= frskyHubData.varioAltitudeQueue[varioAltitudeQueuePointer] ;
|
||||
frskyHubData.varioAltitudeQueue[varioAltitudeQueuePointer] = varioAltitude_cm - frskyHubData.varioAltitude_cm;
|
||||
frskyHubData.varioAltitude_cm = varioAltitude_cm;
|
||||
frskyHubData.varioSpeed += frskyHubData.varioAltitudeQueue[varioAltitudeQueuePointer] ;
|
||||
frskyData.frskyHubData.varioAltitudeQueuePointer = varioAltitudeQueuePointer;
|
||||
frskyData.frskyHubData.varioSpeed -= frskyData.frskyHubData.varioAltitudeQueue[varioAltitudeQueuePointer] ;
|
||||
frskyData.frskyHubData.varioAltitudeQueue[varioAltitudeQueuePointer] = varioAltitude_cm - frskyData.frskyHubData.varioAltitude_cm;
|
||||
frskyData.frskyHubData.varioAltitude_cm = varioAltitude_cm;
|
||||
frskyData.frskyHubData.varioSpeed += frskyData.frskyHubData.varioAltitudeQueue[varioAltitudeQueuePointer] ;
|
||||
#endif
|
||||
}
|
||||
|
||||
void checkMinMaxAltitude()
|
||||
{
|
||||
if (frskyHubData.baroAltitude_bp > frskyHubData.maxAltitude)
|
||||
frskyHubData.maxAltitude = frskyHubData.baroAltitude_bp;
|
||||
if (frskyHubData.baroAltitude_bp < frskyHubData.minAltitude)
|
||||
frskyHubData.minAltitude = frskyHubData.baroAltitude_bp;
|
||||
if (frskyData.frskyHubData.baroAltitude_bp > frskyData.frskyHubData.maxAltitude)
|
||||
frskyData.frskyHubData.maxAltitude = frskyData.frskyHubData.baroAltitude_bp;
|
||||
if (frskyData.frskyHubData.baroAltitude_bp < frskyData.frskyHubData.minAltitude)
|
||||
frskyData.frskyHubData.minAltitude = frskyData.frskyHubData.baroAltitude_bp;
|
||||
}
|
||||
|
||||
void parseTelemHubByte(uint8_t byte)
|
||||
|
@ -238,119 +225,119 @@ void parseTelemHubByte(uint8_t byte)
|
|||
|
||||
if ((uint8_t)structPos == offsetof(FrskyHubData, gpsLatitude_bp)) {
|
||||
if (lowByte || byte)
|
||||
frskyHubData.gpsFix = 1;
|
||||
else if (frskyHubData.gpsFix > 0 && frskyHubData.gpsLatitude_bp > 1)
|
||||
frskyHubData.gpsFix = 0;
|
||||
frskyData.frskyHubData.gpsFix = 1;
|
||||
else if (frskyData.frskyHubData.gpsFix > 0 && frskyData.frskyHubData.gpsLatitude_bp > 1)
|
||||
frskyData.frskyHubData.gpsFix = 0;
|
||||
}
|
||||
else if ((uint8_t)structPos == offsetof(FrskyHubData, gpsLongitude_bp)) {
|
||||
if (lowByte || byte)
|
||||
frskyHubData.gpsFix = 1;
|
||||
else if (frskyHubData.gpsFix > 0 && frskyHubData.gpsLongitude_bp > 1)
|
||||
frskyHubData.gpsFix = 0;
|
||||
frskyData.frskyHubData.gpsFix = 1;
|
||||
else if (frskyData.frskyHubData.gpsFix > 0 && frskyData.frskyHubData.gpsLongitude_bp > 1)
|
||||
frskyData.frskyHubData.gpsFix = 0;
|
||||
}
|
||||
|
||||
if ((uint8_t)structPos == offsetof(FrskyHubData, gpsAltitude_bp) ||
|
||||
((uint8_t)structPos >= offsetof(FrskyHubData, gpsAltitude_ap) && (uint8_t)structPos <= offsetof(FrskyHubData, gpsLatitudeNS) && (uint8_t)structPos != offsetof(FrskyHubData, baroAltitude_bp) && (uint8_t)structPos != offsetof(FrskyHubData, baroAltitude_ap))) {
|
||||
// If we don't have a fix, we may discard the value
|
||||
if (frskyHubData.gpsFix <= 0)
|
||||
if (frskyData.frskyHubData.gpsFix <= 0)
|
||||
return;
|
||||
}
|
||||
|
||||
((uint8_t*)&frskyHubData)[structPos] = lowByte;
|
||||
((uint8_t*)&frskyHubData)[structPos+1] = byte;
|
||||
((uint8_t*)&frskyData.frskyHubData)[structPos] = lowByte;
|
||||
((uint8_t*)&frskyData.frskyHubData)[structPos+1] = byte;
|
||||
|
||||
switch ((uint8_t)structPos) {
|
||||
|
||||
case offsetof(FrskyHubData, rpm):
|
||||
frskyHubData.rpm *= (uint8_t)60/(g_model.frsky.blades+2);
|
||||
if (frskyHubData.rpm > frskyHubData.maxRpm)
|
||||
frskyHubData.maxRpm = frskyHubData.rpm;
|
||||
frskyData.frskyHubData.rpm *= (uint8_t)60/(g_model.frsky.blades+2);
|
||||
if (frskyData.frskyHubData.rpm > frskyData.frskyHubData.maxRpm)
|
||||
frskyData.frskyHubData.maxRpm = frskyData.frskyHubData.rpm;
|
||||
break;
|
||||
|
||||
case offsetof(FrskyHubData, temperature1):
|
||||
if (frskyHubData.temperature1 > frskyHubData.maxTemperature1)
|
||||
frskyHubData.maxTemperature1 = frskyHubData.temperature1;
|
||||
if (frskyData.frskyHubData.temperature1 > frskyData.frskyHubData.maxTemperature1)
|
||||
frskyData.frskyHubData.maxTemperature1 = frskyData.frskyHubData.temperature1;
|
||||
break;
|
||||
|
||||
case offsetof(FrskyHubData, temperature2):
|
||||
if (frskyHubData.temperature2 > frskyHubData.maxTemperature2)
|
||||
frskyHubData.maxTemperature2 = frskyHubData.temperature2;
|
||||
if (frskyData.frskyHubData.temperature2 > frskyData.frskyHubData.maxTemperature2)
|
||||
frskyData.frskyHubData.maxTemperature2 = frskyData.frskyHubData.temperature2;
|
||||
break;
|
||||
|
||||
case offsetof(FrskyHubData, current):
|
||||
if (frskyHubData.current > frskyHubData.maxCurrent)
|
||||
frskyHubData.maxCurrent = frskyHubData.current;
|
||||
if (frskyData.frskyHubData.current > frskyData.frskyHubData.maxCurrent)
|
||||
frskyData.frskyHubData.maxCurrent = frskyData.frskyHubData.current;
|
||||
break;
|
||||
|
||||
case offsetof(FrskyHubData, baroAltitude_bp):
|
||||
// First received barometer altitude => Altitude offset
|
||||
if (!frskyHubData.baroAltitudeOffset)
|
||||
frskyHubData.baroAltitudeOffset = -frskyHubData.baroAltitude_bp;
|
||||
if (!frskyData.frskyHubData.baroAltitudeOffset)
|
||||
frskyData.frskyHubData.baroAltitudeOffset = -frskyData.frskyHubData.baroAltitude_bp;
|
||||
if (g_model.varioSource == VARIO_SOURCE_BARO_V1) {
|
||||
evalVario(frskyHubData.baroAltitude_bp, 0);
|
||||
evalVario(frskyData.frskyHubData.baroAltitude_bp, 0);
|
||||
}
|
||||
frskyHubData.baroAltitude_bp += frskyHubData.baroAltitudeOffset;
|
||||
frskyData.frskyHubData.baroAltitude_bp += frskyData.frskyHubData.baroAltitudeOffset;
|
||||
checkMinMaxAltitude();
|
||||
break;
|
||||
|
||||
case offsetof(FrskyHubData, baroAltitude_ap):
|
||||
if (g_model.varioSource == VARIO_SOURCE_BARO_V2) {
|
||||
evalVario(frskyHubData.baroAltitude_bp-frskyHubData.baroAltitudeOffset, frskyHubData.baroAltitude_ap);
|
||||
evalVario(frskyData.frskyHubData.baroAltitude_bp-frskyData.frskyHubData.baroAltitudeOffset, frskyData.frskyHubData.baroAltitude_ap);
|
||||
}
|
||||
break;
|
||||
|
||||
case offsetof(FrskyHubData, gpsAltitude_ap):
|
||||
if (!frskyHubData.gpsAltitudeOffset)
|
||||
frskyHubData.gpsAltitudeOffset = -frskyHubData.gpsAltitude_bp;
|
||||
frskyHubData.gpsAltitude_bp += frskyHubData.gpsAltitudeOffset;
|
||||
if (!frskyHubData.baroAltitudeOffset) {
|
||||
if (frskyHubData.gpsAltitude_bp > frskyHubData.maxAltitude)
|
||||
frskyHubData.maxAltitude = frskyHubData.gpsAltitude_bp;
|
||||
if (frskyHubData.gpsAltitude_bp < frskyHubData.minAltitude)
|
||||
frskyHubData.minAltitude = frskyHubData.gpsAltitude_bp;
|
||||
if (!frskyData.frskyHubData.gpsAltitudeOffset)
|
||||
frskyData.frskyHubData.gpsAltitudeOffset = -frskyData.frskyHubData.gpsAltitude_bp;
|
||||
frskyData.frskyHubData.gpsAltitude_bp += frskyData.frskyHubData.gpsAltitudeOffset;
|
||||
if (!frskyData.frskyHubData.baroAltitudeOffset) {
|
||||
if (frskyData.frskyHubData.gpsAltitude_bp > frskyData.frskyHubData.maxAltitude)
|
||||
frskyData.frskyHubData.maxAltitude = frskyData.frskyHubData.gpsAltitude_bp;
|
||||
if (frskyData.frskyHubData.gpsAltitude_bp < frskyData.frskyHubData.minAltitude)
|
||||
frskyData.frskyHubData.minAltitude = frskyData.frskyHubData.gpsAltitude_bp;
|
||||
}
|
||||
|
||||
if (!frskyHubData.pilotLatitude && !frskyHubData.pilotLongitude) {
|
||||
if (!frskyData.frskyHubData.pilotLatitude && !frskyData.frskyHubData.pilotLongitude) {
|
||||
// First received GPS position => Pilot GPS position
|
||||
getGpsPilotPosition();
|
||||
}
|
||||
else if (frskyHubData.gpsDistNeeded || g_menuStack[0] == menuProcFrsky) {
|
||||
else if (frskyData.frskyHubData.gpsDistNeeded || g_menuStack[0] == menuProcFrsky) {
|
||||
getGpsDistance();
|
||||
}
|
||||
break;
|
||||
|
||||
case offsetof(FrskyHubData, gpsSpeed_bp):
|
||||
// Speed => Max speed
|
||||
if (frskyHubData.gpsSpeed_bp > frskyHubData.maxGpsSpeed)
|
||||
frskyHubData.maxGpsSpeed = frskyHubData.gpsSpeed_bp;
|
||||
if (frskyData.frskyHubData.gpsSpeed_bp > frskyData.frskyHubData.maxGpsSpeed)
|
||||
frskyData.frskyHubData.maxGpsSpeed = frskyData.frskyHubData.gpsSpeed_bp;
|
||||
break;
|
||||
|
||||
case offsetof(FrskyHubData, volts):
|
||||
// Voltage => Cell number + Cell voltage
|
||||
{
|
||||
uint8_t battnumber = ((frskyHubData.volts & 0x00F0) >> 4);
|
||||
uint8_t battnumber = ((frskyData.frskyHubData.volts & 0x00F0) >> 4);
|
||||
if (battnumber < 12) {
|
||||
if (frskyHubData.cellsCount < battnumber+1) {
|
||||
frskyHubData.cellsCount = battnumber+1;
|
||||
if (frskyData.frskyHubData.cellsCount < battnumber+1) {
|
||||
frskyData.frskyHubData.cellsCount = battnumber+1;
|
||||
}
|
||||
uint8_t cellVolts = (uint8_t)(((((frskyHubData.volts & 0xFF00) >> 8) + ((frskyHubData.volts & 0x000F) << 8)))/10);
|
||||
frskyHubData.cellVolts[battnumber] = cellVolts;
|
||||
if (!frskyHubData.minCellVolts || cellVolts < frskyHubData.minCellVolts || battnumber==frskyHubData.minCellIdx) {
|
||||
frskyHubData.minCellIdx = battnumber;
|
||||
frskyHubData.minCellVolts = cellVolts;
|
||||
uint8_t cellVolts = (uint8_t)(((((frskyData.frskyHubData.volts & 0xFF00) >> 8) + ((frskyData.frskyHubData.volts & 0x000F) << 8)))/10);
|
||||
frskyData.frskyHubData.cellVolts[battnumber] = cellVolts;
|
||||
if (!frskyData.frskyHubData.minCellVolts || cellVolts < frskyData.frskyHubData.minCellVolts || battnumber==frskyData.frskyHubData.minCellIdx) {
|
||||
frskyData.frskyHubData.minCellIdx = battnumber;
|
||||
frskyData.frskyHubData.minCellVolts = cellVolts;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case offsetof(FrskyHubData, hour):
|
||||
frskyHubData.hour = ((uint8_t)(frskyHubData.hour + g_eeGeneral.timezone + 24)) % 24;
|
||||
frskyData.frskyHubData.hour = ((uint8_t)(frskyData.frskyHubData.hour + g_eeGeneral.timezone + 24)) % 24;
|
||||
break;
|
||||
|
||||
case offsetof(FrskyHubData, accelX):
|
||||
case offsetof(FrskyHubData, accelY):
|
||||
case offsetof(FrskyHubData, accelZ):
|
||||
*(int16_t*)(&((uint8_t*)&frskyHubData)[structPos]) /= 10;
|
||||
*(int16_t*)(&((uint8_t*)&frskyData.frskyHubData)[structPos]) /= 10;
|
||||
break;
|
||||
|
||||
}
|
||||
|
@ -361,12 +348,12 @@ void parseTelemHubByte(uint8_t byte)
|
|||
void parseTelemWSHowHighByte(uint8_t byte)
|
||||
{
|
||||
if (frskyUsrStreaming < (FRSKY_TIMEOUT10ms*3 - 10)) {
|
||||
((uint8_t*)&frskyHubData)[offsetof(FrskyHubData, baroAltitude_bp)] = byte;
|
||||
((uint8_t*)&frskyData.frskyHubData)[offsetof(FrskyHubData, baroAltitude_bp)] = byte;
|
||||
checkMinMaxAltitude();
|
||||
}
|
||||
else {
|
||||
// At least 100mS passed since last data received
|
||||
((uint8_t*)&frskyHubData)[offsetof(FrskyHubData, baroAltitude_bp)+1] = byte;
|
||||
((uint8_t*)&frskyData.frskyHubData)[offsetof(FrskyHubData, baroAltitude_bp)+1] = byte;
|
||||
}
|
||||
// baroAltitude_bp unit here is feet!
|
||||
frskyUsrStreaming = FRSKY_TIMEOUT10ms*3; // reset counter
|
||||
|
@ -391,27 +378,15 @@ void processFrskyPacket(uint8_t *packet)
|
|||
// What type of packet?
|
||||
switch (packet[0])
|
||||
{
|
||||
case A22PKT:
|
||||
case A21PKT:
|
||||
case A12PKT:
|
||||
case A11PKT:
|
||||
{
|
||||
struct FrskyAlarm *alarmptr ;
|
||||
alarmptr = &frskyAlarms[(packet[0]-A22PKT)] ;
|
||||
alarmptr->value = packet[1];
|
||||
alarmptr->greater = packet[2] & 0x01;
|
||||
alarmptr->level = packet[3] & 0x03;
|
||||
}
|
||||
break;
|
||||
case LINKPKT: // A1/A2/RSSI values
|
||||
link_counter += 32;
|
||||
frskyTelemetry[0].set(packet[1], g_model.frsky.channels[0].type);
|
||||
frskyTelemetry[1].set(packet[2], g_model.frsky.channels[1].type);
|
||||
frskyRSSI[0].set(packet[3]);
|
||||
frskyRSSI[1].set(packet[4] / 2);
|
||||
frskyData.frskyTelemetry[0].set(packet[1], g_model.frsky.channels[0].type);
|
||||
frskyData.frskyTelemetry[1].set(packet[2], g_model.frsky.channels[1].type);
|
||||
frskyData.frskyRSSI[0].set(packet[3]);
|
||||
frskyData.frskyRSSI[1].set(packet[4] / 2);
|
||||
frskyStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected
|
||||
if (g_model.varioSource >= VARIO_SOURCE_A1) {
|
||||
frskyHubData.varioSpeed = applyChannelRatio(g_model.varioSource - VARIO_SOURCE_A1, frskyTelemetry[g_model.varioSource - VARIO_SOURCE_A1].value);
|
||||
frskyData.frskyHubData.varioSpeed = applyChannelRatio(g_model.varioSource - VARIO_SOURCE_A1, frskyData.frskyTelemetry[g_model.varioSource - VARIO_SOURCE_A1].value);
|
||||
}
|
||||
break;
|
||||
#if defined(FRSKY_HUB) || defined (WS_HOW_HIGH)
|
||||
|
@ -650,14 +625,16 @@ void check_frsky()
|
|||
frskyStreaming--;
|
||||
}
|
||||
else {
|
||||
frskyRSSI[0].set(0);
|
||||
frskyRSSI[1].set(0);
|
||||
frskyData.frskyRSSI[0].set(0);
|
||||
frskyData.frskyRSSI[1].set(0);
|
||||
}
|
||||
#endif
|
||||
uint16_t currint;
|
||||
currint=(g_tmr10ms<s_currTmr ? 65535-s_currTmr+g_tmr10ms : g_tmr10ms-s_currTmr);
|
||||
s_currTmr=g_tmr10ms;
|
||||
consumption+=(frskyHubData.current*currint);
|
||||
|
||||
frskyData.currentPrescale += frskyData.frskyHubData.current;
|
||||
if (frskyData.currentPrescale >= currentConsumptionBoundary) {
|
||||
frskyData.currentConsumption += 1;
|
||||
frskyData.currentPrescale -= currentConsumptionBoundary;
|
||||
}
|
||||
|
||||
#if defined(VARIO)
|
||||
static uint16_t s_varioTmr = 0;
|
||||
|
@ -665,7 +642,7 @@ consumption+=(frskyHubData.current*currint);
|
|||
#if defined(AUDIO)
|
||||
int16_t varioSpeedUpMin = (g_model.varioSpeedUpMin - VARIO_SPEED_LIMIT_UP_CENTER)*VARIO_SPEED_LIMIT_MUL;
|
||||
int16_t varioSpeedDownMin = (VARIO_SPEED_LIMIT_DOWN_OFF - g_model.varioSpeedDownMin)*(-VARIO_SPEED_LIMIT_MUL);
|
||||
int16_t verticalSpeed = limit((int16_t)(-VARIO_SPEED_LIMIT*100), frskyHubData.varioSpeed, (int16_t)(+VARIO_SPEED_LIMIT*100));
|
||||
int16_t verticalSpeed = limit((int16_t)(-VARIO_SPEED_LIMIT*100), frskyData.frskyHubData.varioSpeed, (int16_t)(+VARIO_SPEED_LIMIT*100));
|
||||
|
||||
uint8_t SoundVarioBeepNextFreq = 0;
|
||||
uint8_t SoundVarioBeepNextTime = 0;
|
||||
|
@ -686,18 +663,18 @@ consumption+=(frskyHubData.current*currint);
|
|||
s_varioTmr = g_tmr10ms;
|
||||
SoundVarioBeepTime = SoundVarioBeepNextTime;
|
||||
SoundVarioBeepFreq = SoundVarioBeepNextFreq;
|
||||
audio.play(SoundVarioBeepFreq, SoundVarioBeepTime, 0, PLAY_SOUND_VARIO);
|
||||
AUDIO_VARIO(SoundVarioBeepFreq, SoundVarioBeepTime);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// negative vertical speed gives sound without pauses
|
||||
SoundVarioBeepTime = SoundVarioBeepNextTime;
|
||||
SoundVarioBeepFreq = SoundVarioBeepNextFreq;
|
||||
audio.play(SoundVarioBeepFreq, 1, 0, PLAY_SOUND_VARIO);
|
||||
AUDIO_VARIO(SoundVarioBeepFreq, 1);
|
||||
}
|
||||
}
|
||||
#else
|
||||
int8_t verticalSpeed = limit((int16_t)-100, (int16_t)(frskyHubData.varioSpeed/10), (int16_t)+100);
|
||||
int8_t verticalSpeed = limit((int16_t)-100, (int16_t)(frskyData.frskyHubData.varioSpeed/10), (int16_t)+100);
|
||||
|
||||
uint16_t interval;
|
||||
if (verticalSpeed == 0) {
|
||||
|
@ -727,11 +704,11 @@ bool FRSKY_alarmRaised(uint8_t idx)
|
|||
for (int i=0; i<2; i++) {
|
||||
if (ALARM_LEVEL(idx, i) != alarm_off) {
|
||||
if (ALARM_GREATER(idx, i)) {
|
||||
if (frskyTelemetry[idx].value > g_model.frsky.channels[idx].alarms_value[i])
|
||||
if (frskyData.frskyTelemetry[idx].value > g_model.frsky.channels[idx].alarms_value[i])
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
if (frskyTelemetry[idx].value < g_model.frsky.channels[idx].alarms_value[i])
|
||||
if (frskyData.frskyTelemetry[idx].value < g_model.frsky.channels[idx].alarms_value[i])
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -756,7 +733,6 @@ inline void FRSKY_EnableRXD(void)
|
|||
void FRSKY_Init(void)
|
||||
{
|
||||
// clear frsky variables
|
||||
memset(frskyAlarms, 0, sizeof(frskyAlarms));
|
||||
resetTelemetry();
|
||||
|
||||
#if defined(PCBARM)
|
||||
|
@ -787,35 +763,7 @@ void FRSKY_Init(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
#if 0
|
||||
// Send packet requesting all alarm settings be sent back to us
|
||||
void frskyAlarmsRefresh()
|
||||
{
|
||||
|
||||
if (frskyTxBufferCount) return; // we only have one buffer. If it's in use, then we can't send. Sorry.
|
||||
|
||||
{
|
||||
uint8_t *ptr ;
|
||||
ptr = &frskyTxBuffer[0] ;
|
||||
*ptr++ = START_STOP; // Start of packet
|
||||
*ptr++ = ALRM_REQUEST;
|
||||
*ptr++ = 0x00 ;
|
||||
*ptr++ = 0x00 ;
|
||||
*ptr++ = 0x00 ;
|
||||
*ptr++ = 0x00 ;
|
||||
*ptr++ = 0x00 ;
|
||||
*ptr++ = 0x00 ;
|
||||
*ptr++ = 0x00 ;
|
||||
*ptr++ = 0x00 ;
|
||||
*ptr++ = START_STOP; // End of packet
|
||||
}
|
||||
|
||||
frskyTxBufferCount = 11;
|
||||
frskyTransmitBuffer();
|
||||
}
|
||||
#endif
|
||||
|
||||
void FrskyRSSI::set(uint8_t value)
|
||||
void FrskyValueWithMin::set(uint8_t value)
|
||||
{
|
||||
if (this->value == 0)
|
||||
this->value = value;
|
||||
|
@ -830,9 +778,9 @@ void FrskyRSSI::set(uint8_t value)
|
|||
min = value;
|
||||
}
|
||||
|
||||
void FrskyData::set(uint8_t value, uint8_t unit)
|
||||
void FrskyValueWithMinMax::set(uint8_t value, uint8_t unit)
|
||||
{
|
||||
FrskyRSSI::set(value);
|
||||
FrskyValueWithMin::set(value);
|
||||
if (unit != UNIT_VOLTS) {
|
||||
this->value = value;
|
||||
}
|
||||
|
@ -840,52 +788,62 @@ void FrskyData::set(uint8_t value, uint8_t unit)
|
|||
max = value;
|
||||
}
|
||||
|
||||
void frskyEvalCurrentConsumptionBoundary()
|
||||
{
|
||||
if (g_model.frsky.currentSource == CURRENT_SOURCE_HUB) {
|
||||
currentConsumptionBoundary = 360;
|
||||
}
|
||||
else {
|
||||
currentConsumptionBoundary = 360000L / (g_model.frsky.channels[g_model.frsky.currentSource-1].ratio << g_model.frsky.channels[g_model.frsky.currentSource-1].multiplier);
|
||||
}
|
||||
}
|
||||
|
||||
void resetTelemetry()
|
||||
{
|
||||
memset(frskyTelemetry, 0, sizeof(frskyTelemetry));
|
||||
memset(frskyRSSI, 0, sizeof(frskyRSSI));
|
||||
memset(&frskyHubData, 0, sizeof(frskyHubData));
|
||||
// TODO these structs could be assembled to have only one memset
|
||||
memset(&frskyData, 0, sizeof(frskyData));
|
||||
|
||||
frskyEvalCurrentConsumptionBoundary();
|
||||
|
||||
#if defined(FRSKY_HUB)
|
||||
frskyHubData.gpsLatitude_bp = 2;
|
||||
frskyHubData.gpsLongitude_bp = 2;
|
||||
frskyHubData.gpsFix = -1;
|
||||
frskyData.frskyHubData.gpsLatitude_bp = 2;
|
||||
frskyData.frskyHubData.gpsLongitude_bp = 2;
|
||||
frskyData.frskyHubData.gpsFix = -1;
|
||||
#endif
|
||||
|
||||
#ifdef SIMU
|
||||
frskyTelemetry[0].set(120, UNIT_VOLTS);
|
||||
frskyRSSI[0].set(75);
|
||||
frskyHubData.fuelLevel = 75;
|
||||
frskyHubData.rpm = 12000;
|
||||
frskyData.frskyHubData.fuelLevel = 75;
|
||||
frskyData.frskyHubData.rpm = 12000;
|
||||
|
||||
frskyHubData.gpsFix = 1;
|
||||
frskyHubData.gpsLatitude_bp = 4401;
|
||||
frskyHubData.gpsLatitude_ap = 7710;
|
||||
frskyHubData.gpsLongitude_bp = 1006;
|
||||
frskyHubData.gpsLongitude_ap = 8872;
|
||||
frskyHubData.gpsSpeed_bp = (100 * 250) / 463;
|
||||
frskyData.frskyHubData.gpsFix = 1;
|
||||
frskyData.frskyHubData.gpsLatitude_bp = 4401;
|
||||
frskyData.frskyHubData.gpsLatitude_ap = 7710;
|
||||
frskyData.frskyHubData.gpsLongitude_bp = 1006;
|
||||
frskyData.frskyHubData.gpsLongitude_ap = 8872;
|
||||
frskyData.frskyHubData.gpsSpeed_bp = (100 * 250) / 463;
|
||||
getGpsPilotPosition();
|
||||
|
||||
frskyHubData.gpsLatitude_bp = 4401;
|
||||
frskyHubData.gpsLatitude_ap = 7455;
|
||||
frskyHubData.gpsLongitude_bp = 1006;
|
||||
frskyHubData.gpsLongitude_ap = 9533;
|
||||
frskyData.frskyHubData.gpsLatitude_bp = 4401;
|
||||
frskyData.frskyHubData.gpsLatitude_ap = 7455;
|
||||
frskyData.frskyHubData.gpsLongitude_bp = 1006;
|
||||
frskyData.frskyHubData.gpsLongitude_ap = 9533;
|
||||
getGpsDistance();
|
||||
|
||||
frskyHubData.cellsCount = 6;
|
||||
frskyData.frskyHubData.cellsCount = 6;
|
||||
|
||||
frskyHubData.gpsAltitude_bp = 50;
|
||||
frskyHubData.baroAltitude_bp = 50;
|
||||
frskyHubData.minAltitude = 10;
|
||||
frskyHubData.maxAltitude = 500;
|
||||
frskyData.frskyHubData.gpsAltitude_bp = 50;
|
||||
frskyData.frskyHubData.baroAltitude_bp = 50;
|
||||
frskyData.frskyHubData.minAltitude = 10;
|
||||
frskyData.frskyHubData.maxAltitude = 500;
|
||||
|
||||
frskyHubData.accelY = 100;
|
||||
frskyHubData.temperature1 = -30;
|
||||
frskyHubData.maxTemperature1 = 100;
|
||||
frskyHubData.maxCurrent = 56;
|
||||
consumption=0;
|
||||
s_currTmr = g_tmr10ms;
|
||||
frskyHubData.current = 5;
|
||||
frskyData.frskyHubData.accelY = 100;
|
||||
frskyData.frskyHubData.temperature1 = -30;
|
||||
frskyData.frskyHubData.maxTemperature1 = 100;
|
||||
|
||||
frskyData.frskyHubData.current = 5;
|
||||
frskyData.frskyHubData.maxCurrent = 56;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -942,8 +900,6 @@ const pm_uint8_t bchunit_ar[] PROGMEM = {
|
|||
UNIT_KTS, // Speed
|
||||
UNIT_METERS, // Dist
|
||||
UNIT_METERS, // GPS Alt
|
||||
UNIT_AMPS, // current
|
||||
UNIT_MILLIAMPS, // current consumption
|
||||
};
|
||||
|
||||
void putsTelemetryChannel(uint8_t x, uint8_t y, uint8_t channel, int16_t val, uint8_t att)
|
||||
|
@ -983,6 +939,15 @@ void putsTelemetryChannel(uint8_t x, uint8_t y, uint8_t channel, int16_t val, ui
|
|||
putsTelemetryValue(x, y, val, UNIT_VOLTS, att|PREC2);
|
||||
break;
|
||||
|
||||
case TELEM_CURRENT-1:
|
||||
case TELEM_MAX_CURRENT-1:
|
||||
putsTelemetryValue(x, y, val, UNIT_AMPS, att);
|
||||
break;
|
||||
|
||||
case TELEM_CONSUMPTION-1:
|
||||
putsTelemetryValue(x, y, val, UNIT_MAH, att);
|
||||
break;
|
||||
|
||||
case TELEM_ACCx-1:
|
||||
case TELEM_ACCy-1:
|
||||
case TELEM_ACCz-1:
|
||||
|
@ -995,15 +960,6 @@ void putsTelemetryChannel(uint8_t x, uint8_t y, uint8_t channel, int16_t val, ui
|
|||
putsTelemetryValue(x, y, val, UNIT_RAW, att);
|
||||
break;
|
||||
|
||||
case TELEM_CURRENT-1:
|
||||
case TELEM_MAX_CURRENT-1:
|
||||
putsTelemetryValue(x, y, val, UNIT_AMPS, att);
|
||||
break;
|
||||
|
||||
case TELEM_CONSUMPTION-1:
|
||||
putsTelemetryValue(x, y, val, UNIT_MILLIAMPS, att);
|
||||
break;
|
||||
|
||||
#if defined(IMPERIAL_UNITS)
|
||||
case TELEM_ALT-1:
|
||||
case TELEM_MIN_ALT-1:
|
||||
|
@ -1044,11 +1000,11 @@ void displayRssiLine()
|
|||
{
|
||||
if (frskyStreaming > 0) {
|
||||
lcd_hline(0, 55, 128, 0); // separator
|
||||
uint8_t rssi = min((uint8_t)99, frskyRSSI[1].value);
|
||||
uint8_t rssi = min((uint8_t)99, frskyData.frskyRSSI[1].value);
|
||||
lcd_putsLeft(7*FH+1, STR_TX); lcd_outdezNAtt(4*FW, 7*FH+1, rssi, LEADING0, 2);
|
||||
lcd_rect(25, 57, 38, 7);
|
||||
lcd_filled_rect(26, 58, 4*rssi/11, 5, (rssi < getRssiAlarmValue(0)) ? DOTTED : SOLID);
|
||||
rssi = min((uint8_t)99, frskyRSSI[0].value);
|
||||
rssi = min((uint8_t)99, frskyData.frskyRSSI[0].value);
|
||||
lcd_puts(105, 7*FH+1, STR_RX); lcd_outdezNAtt(105+4*FW-1, 7*FH+1, rssi, LEADING0, 2);
|
||||
lcd_rect(65, 57, 38, 7);
|
||||
uint8_t v = 4*rssi/11;
|
||||
|
@ -1065,17 +1021,17 @@ void displayGpsTime()
|
|||
{
|
||||
#define TIME_LINE (7*FH+1)
|
||||
uint8_t att = (frskyStreaming > 0 ? LEFT|LEADING0 : LEFT|LEADING0|BLINK);
|
||||
lcd_outdezNAtt(6*FW+5, TIME_LINE, frskyHubData.hour, att, 2);
|
||||
lcd_outdezNAtt(6*FW+5, TIME_LINE, frskyData.frskyHubData.hour, att, 2);
|
||||
lcd_putcAtt(8*FW+2, TIME_LINE, ':', att);
|
||||
lcd_outdezNAtt(9*FW+2, TIME_LINE, frskyHubData.min, att, 2);
|
||||
lcd_outdezNAtt(9*FW+2, TIME_LINE, frskyData.frskyHubData.min, att, 2);
|
||||
lcd_putcAtt(11*FW-1, TIME_LINE, ':', att);
|
||||
lcd_outdezNAtt(12*FW-1, TIME_LINE, frskyHubData.sec, att, 2);
|
||||
lcd_outdezNAtt(12*FW-1, TIME_LINE, frskyData.frskyHubData.sec, att, 2);
|
||||
lcd_status_line();
|
||||
}
|
||||
|
||||
void displayGpsCoord(uint8_t y, char direction, int16_t bp, int16_t ap)
|
||||
{
|
||||
if (frskyHubData.gpsFix >= 0) {
|
||||
if (frskyData.frskyHubData.gpsFix >= 0) {
|
||||
if (!direction) direction = '-';
|
||||
|
||||
lcd_outdezAtt(10*FW, y, bp / 100, LEFT); // ddd before '.'
|
||||
|
@ -1162,9 +1118,9 @@ void menuProcFrsky(uint8_t event)
|
|||
if (frskyStreaming > 0) {
|
||||
if (field == TELEM_ACC) {
|
||||
lcd_putsLeft(7*FH+1, STR_ACCEL);
|
||||
lcd_outdezNAtt(4*FW, 7*FH+1, frskyHubData.accelX, LEFT|PREC2);
|
||||
lcd_outdezNAtt(10*FW, 7*FH+1, frskyHubData.accelY, LEFT|PREC2);
|
||||
lcd_outdezNAtt(16*FW, 7*FH+1, frskyHubData.accelZ, LEFT|PREC2);
|
||||
lcd_outdezNAtt(4*FW, 7*FH+1, frskyData.frskyHubData.accelX, LEFT|PREC2);
|
||||
lcd_outdezNAtt(10*FW, 7*FH+1, frskyData.frskyHubData.accelY, LEFT|PREC2);
|
||||
lcd_outdezNAtt(16*FW, 7*FH+1, frskyData.frskyHubData.accelZ, LEFT|PREC2);
|
||||
break;
|
||||
}
|
||||
else if (field == TELEM_GPS_TIME) {
|
||||
|
@ -1261,19 +1217,19 @@ void menuProcFrsky(uint8_t event)
|
|||
if (g_model.frsky.channels[i].ratio) {
|
||||
blink = (FRSKY_alarmRaised(i) ? INVERS : 0);
|
||||
putsStrIdx(0, y, STR_A, i+1, TWO_DOTS);
|
||||
putsTelemetryChannel(3*FW, y, i+MAX_TIMERS, frskyTelemetry[i].value, blink|DBLSIZE|LEFT);
|
||||
lcd_putc(12*FW-1, y-FH, '<'); putsTelemetryChannel(17*FW, y-FH, i+MAX_TIMERS, frskyTelemetry[i].min, NO_UNIT);
|
||||
lcd_putc(12*FW, y, '>'); putsTelemetryChannel(17*FW, y, i+MAX_TIMERS, frskyTelemetry[i].max, NO_UNIT);
|
||||
putsTelemetryChannel(3*FW, y, i+MAX_TIMERS, frskyData.frskyTelemetry[i].value, blink|DBLSIZE|LEFT);
|
||||
lcd_putc(12*FW-1, y-FH, '<'); putsTelemetryChannel(17*FW, y-FH, i+MAX_TIMERS, frskyData.frskyTelemetry[i].min, NO_UNIT);
|
||||
lcd_putc(12*FW, y, '>'); putsTelemetryChannel(17*FW, y, i+MAX_TIMERS, frskyData.frskyTelemetry[i].max, NO_UNIT);
|
||||
y += 3*FH;
|
||||
}
|
||||
}
|
||||
#ifdef FRSKY_HUB
|
||||
// Cells voltage
|
||||
if (frskyHubData.cellsCount > 0) {
|
||||
if (frskyData.frskyHubData.cellsCount > 0) {
|
||||
uint8_t y = 1*FH;
|
||||
for (uint8_t k=0; k<frskyHubData.cellsCount && k<6; k++) {
|
||||
uint8_t attr = (barsThresholds[THLD_CELL] && frskyHubData.cellVolts[k] < barsThresholds[THLD_CELL]) ? BLINK|PREC2 : PREC2;
|
||||
lcd_outdezNAtt(21*FW, y, frskyHubData.cellVolts[k] * 2, attr, 4);
|
||||
for (uint8_t k=0; k<frskyData.frskyHubData.cellsCount && k<6; k++) {
|
||||
uint8_t attr = (barsThresholds[THLD_CELL] && frskyData.frskyHubData.cellVolts[k] < barsThresholds[THLD_CELL]) ? BLINK|PREC2 : PREC2;
|
||||
lcd_outdezNAtt(21*FW, y, frskyData.frskyHubData.cellVolts[k] * 2, attr, 4);
|
||||
y += 1*FH;
|
||||
}
|
||||
lcd_vline(17*FW+4, 8, 47);
|
||||
|
@ -1288,20 +1244,20 @@ void menuProcFrsky(uint8_t event)
|
|||
if (g_model.frsky.usrProto == USR_PROTO_FRSKY_HUB) {
|
||||
// Latitude
|
||||
lcd_putsLeft(line, STR_LATITUDE);
|
||||
displayGpsCoord(line, frskyHubData.gpsLatitudeNS, frskyHubData.gpsLatitude_bp, frskyHubData.gpsLatitude_ap);
|
||||
displayGpsCoord(line, frskyData.frskyHubData.gpsLatitudeNS, frskyData.frskyHubData.gpsLatitude_bp, frskyData.frskyHubData.gpsLatitude_ap);
|
||||
// Longitude
|
||||
line+=1*FH+1;
|
||||
lcd_putsLeft(line, STR_LONGITUDE);
|
||||
displayGpsCoord(line, frskyHubData.gpsLongitudeEW, frskyHubData.gpsLongitude_bp, frskyHubData.gpsLongitude_ap);
|
||||
displayGpsCoord(line, frskyData.frskyHubData.gpsLongitudeEW, frskyData.frskyHubData.gpsLongitude_bp, frskyData.frskyHubData.gpsLongitude_ap);
|
||||
displayGpsTime();
|
||||
line+=1*FH+1;
|
||||
}
|
||||
// Rssi
|
||||
lcd_putsLeft(line, STR_MINRSSI);
|
||||
lcd_puts(10*FW, line, STR_TX);
|
||||
lcd_outdezNAtt(lcdLastPos, line, frskyRSSI[1].min, LEFT|LEADING0, 2);
|
||||
lcd_outdezNAtt(lcdLastPos, line, frskyData.frskyRSSI[1].min, LEFT|LEADING0, 2);
|
||||
lcd_puts(16*FW, line, STR_RX);
|
||||
lcd_outdezNAtt(lcdLastPos, line, frskyRSSI[0].min, LEFT|LEADING0, 2);
|
||||
lcd_outdezNAtt(lcdLastPos, line, frskyData.frskyRSSI[0].min, LEFT|LEADING0, 2);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
29
src/frsky.h
29
src/frsky.h
|
@ -52,7 +52,7 @@ enum AlarmLevel {
|
|||
#define ALARM_GREATER(channel, alarm) ((g_model.frsky.channels[channel].alarms_greater >> alarm) & 1)
|
||||
#define ALARM_LEVEL(channel, alarm) ((g_model.frsky.channels[channel].alarms_level >> (2*alarm)) & 3)
|
||||
|
||||
class FrskyRSSI {
|
||||
class FrskyValueWithMin {
|
||||
public:
|
||||
uint8_t value;
|
||||
uint8_t min;
|
||||
|
@ -60,7 +60,7 @@ class FrskyRSSI {
|
|||
void set(uint8_t value);
|
||||
};
|
||||
|
||||
class FrskyData: public FrskyRSSI {
|
||||
class FrskyValueWithMinMax: public FrskyValueWithMin {
|
||||
public:
|
||||
uint8_t max;
|
||||
void set(uint8_t value, uint8_t unit);
|
||||
|
@ -119,7 +119,6 @@ PACK(struct FrskyHubData {
|
|||
uint16_t current; // 0x28 Current
|
||||
int16_t varioAltitudeQueue[VARIO_QUEUE_LENGTH]; //circular buffer
|
||||
int32_t varioAltitude_cm;
|
||||
int16_t varioSpeed;
|
||||
/* next fields must keep this order! */
|
||||
int16_t minAltitude;
|
||||
int16_t maxAltitude;
|
||||
|
@ -128,6 +127,7 @@ PACK(struct FrskyHubData {
|
|||
int16_t maxTemperature2;
|
||||
uint16_t maxGpsSpeed;
|
||||
uint16_t maxGpsDistance;
|
||||
uint16_t maxCurrent;
|
||||
/* end */
|
||||
int16_t varioAcc1;
|
||||
int16_t varioAcc2;
|
||||
|
@ -136,9 +136,9 @@ PACK(struct FrskyHubData {
|
|||
// end of FrSky Hub data
|
||||
uint16_t gpsDistance;
|
||||
int16_t gpsAltitudeOffset;
|
||||
int16_t varioSpeed;
|
||||
uint8_t varioAltitudeQueuePointer; // circular-buffer pointer
|
||||
uint8_t minCellIdx;
|
||||
uint16_t maxCurrent;
|
||||
});
|
||||
|
||||
#elif defined(WS_HOW_HIGH)
|
||||
|
@ -150,23 +150,34 @@ struct FrskyHubData {
|
|||
|
||||
#endif
|
||||
|
||||
struct FrskyData {
|
||||
FrskyValueWithMinMax frskyTelemetry[2];
|
||||
FrskyValueWithMin frskyRSSI[2];
|
||||
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
|
||||
FrskyHubData frskyHubData;
|
||||
#endif
|
||||
uint16_t currentConsumption;
|
||||
uint16_t currentPrescale;
|
||||
};
|
||||
|
||||
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
|
||||
extern FrskyHubData frskyHubData;
|
||||
extern uint8_t barsThresholds[];
|
||||
#endif
|
||||
|
||||
// Global Fr-Sky telemetry data variables
|
||||
extern int8_t frskyStreaming; // >0 (true) == data is streaming in. 0 = nodata detected for some time
|
||||
extern uint8_t frskyUsrStreaming;
|
||||
extern uint32_t consumption;
|
||||
|
||||
#define SEND_MODEL_ALARMS 6
|
||||
extern uint8_t FrskyAlarmSendState;
|
||||
|
||||
extern FrskyData frskyTelemetry[2];
|
||||
extern FrskyRSSI frskyRSSI[2];
|
||||
extern FrskyData frskyData;
|
||||
|
||||
extern uint8_t frskyTxBuffer[FRSKY_TX_PACKET_SIZE];
|
||||
extern uint8_t frskyTxBufferCount;
|
||||
|
||||
|
||||
|
||||
void FRSKY_Init(void);
|
||||
void check_frsky(void);
|
||||
|
||||
|
@ -175,6 +186,8 @@ inline void FRSKY_setModelAlarms(void)
|
|||
FrskyAlarmSendState = SEND_MODEL_ALARMS;
|
||||
}
|
||||
|
||||
extern void frskyEvalCurrentConsumptionBoundary();
|
||||
|
||||
bool FRSKY_alarmRaised(uint8_t idx);
|
||||
|
||||
void resetTelemetry();
|
||||
|
|
|
@ -523,9 +523,10 @@ extern uint32_t Cmd_A41_resp;
|
|||
#define OCR_SD_CCS (0)
|
||||
#endif
|
||||
|
||||
const char STR_DELETE_FILE[] = "Delete";
|
||||
const char STR_COPY_FILE[] = "Copy";
|
||||
const char STR_RENAME_FILE[] = "Rename";
|
||||
const pm_char STR_PLAY_FILE[] PROGMEM = "Play";
|
||||
const pm_char STR_DELETE_FILE[] PROGMEM = "Delete";
|
||||
const pm_char STR_COPY_FILE[] PROGMEM = "Copy";
|
||||
const pm_char STR_RENAME_FILE[] PROGMEM = "Rename";
|
||||
|
||||
void menuProcSd(uint8_t event)
|
||||
{
|
||||
|
@ -536,6 +537,8 @@ void menuProcSd(uint8_t event)
|
|||
TCHAR lfn[_MAX_LFN + 1];
|
||||
fno.lfname = lfn;
|
||||
fno.lfsize = sizeof(lfn);
|
||||
#else
|
||||
char lfn[32];
|
||||
#endif
|
||||
|
||||
uint8_t _event = event;
|
||||
|
@ -549,7 +552,10 @@ void menuProcSd(uint8_t event)
|
|||
|
||||
switch(event) {
|
||||
case EVT_ENTRY:
|
||||
#if defined(PCBV4)
|
||||
// TODO as ARM
|
||||
f_mount(0, &g_FATFS_Obj);
|
||||
#endif
|
||||
f_chdir("/");
|
||||
reusableBuffer.sd.offset = 255;
|
||||
break;
|
||||
|
@ -562,6 +568,7 @@ void menuProcSd(uint8_t event)
|
|||
killEvents(event);
|
||||
f_chdir(reusableBuffer.sd.lines[index]);
|
||||
s_pgOfs = 0;
|
||||
m_posVert = 1;
|
||||
reusableBuffer.sd.offset = 255;
|
||||
}
|
||||
}
|
||||
|
@ -570,6 +577,13 @@ void menuProcSd(uint8_t event)
|
|||
case EVT_KEY_LONG(KEY_MENU):
|
||||
killEvents(event);
|
||||
if (m_posVert > 0) {
|
||||
#if defined(PCBARM)
|
||||
uint8_t index = m_posVert-1-s_pgOfs;
|
||||
char * line = reusableBuffer.sd.lines[index];
|
||||
if (!strcmp(line+strlen(line)-4, ".wav")) {
|
||||
s_menu[s_menu_count++] = STR_PLAY_FILE;
|
||||
}
|
||||
#endif
|
||||
s_menu[s_menu_count++] = STR_DELETE_FILE;
|
||||
s_menu[s_menu_count++] = STR_RENAME_FILE;
|
||||
s_menu[s_menu_count++] = STR_COPY_FILE;
|
||||
|
@ -613,7 +627,7 @@ void menuProcSd(uint8_t event)
|
|||
for (uint8_t i=0; i<7; i++) {
|
||||
uint8_t y = FH+i*FH;
|
||||
uint8_t x = 0;
|
||||
uint8_t attr = (m_posVert-1-s_pgOfs == i ? INVERS : 0);
|
||||
uint8_t attr = (m_posVert-1-s_pgOfs == i ? BSS|INVERS : BSS);
|
||||
if (reusableBuffer.sd.flags[i]) { lcd_putcAtt(0, y, '[', attr); x += FW; }
|
||||
lcd_putsAtt(x, y, reusableBuffer.sd.lines[i], attr);
|
||||
if (reusableBuffer.sd.flags[i]) { lcd_putcAtt(lcdLastPos, y, ']', attr); }
|
||||
|
@ -625,15 +639,23 @@ void menuProcSd(uint8_t event)
|
|||
uint8_t index = m_posVert-1-s_pgOfs;
|
||||
if (result == STR_DELETE_FILE) {
|
||||
f_getcwd(lfn, SD_SCREEN_FILE_LENGTH);
|
||||
strcat_P(lfn, "/");
|
||||
strcat_P(lfn, reusableBuffer.sd.lines[index]);
|
||||
strcat_P(lfn, PSTR("/"));
|
||||
strcat(lfn, reusableBuffer.sd.lines[index]);
|
||||
f_unlink(lfn);
|
||||
strncpy(statusLineMsg, reusableBuffer.sd.lines[index], 13);
|
||||
strcpy_P(statusLineMsg+min((uint8_t)strlen(statusLineMsg), (uint8_t)13), PSTR(" removed"));
|
||||
showStatusLine();
|
||||
if (m_posVert == reusableBuffer.sd.count) m_posVert--;
|
||||
if ((uint16_t)m_posVert == reusableBuffer.sd.count) m_posVert--;
|
||||
reusableBuffer.sd.offset = s_pgOfs-1;
|
||||
}
|
||||
#if defined(PCBARM)
|
||||
else if (result == STR_PLAY_FILE) {
|
||||
f_getcwd(lfn, SD_SCREEN_FILE_LENGTH);
|
||||
strcat_P(lfn, PSTR("/"));
|
||||
strcat(lfn, reusableBuffer.sd.lines[index]);
|
||||
playFile(lfn);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -725,9 +747,6 @@ void menuProcDiagVers(uint8_t event)
|
|||
lcd_putsLeft(5*FH, stamp4);
|
||||
lcd_putsLeft(7*FH, STR_EEPROMV);
|
||||
lcd_outdezAtt(8*FW, 7*FH, g_eeGeneral.myVers, LEFT);
|
||||
#if defined(PCBARM) && defined(SDCARD)
|
||||
lcd_puts(12*FW, 7*FH, Card_state == 8 /* TODO SD_ST_DATA*/ ? "SDCARD OK" : "NO SDCARD");
|
||||
#endif
|
||||
}
|
||||
|
||||
void menuProcDiagKeys(uint8_t event)
|
||||
|
|
|
@ -130,31 +130,31 @@ void writeLogs()
|
|||
|
||||
#ifdef FRSKY
|
||||
f_printf(&g_oLogFile, "%d,", frskyStreaming);
|
||||
f_printf(&g_oLogFile, "%d,", frskyRSSI[0].value);
|
||||
f_printf(&g_oLogFile, "%d,", frskyRSSI[1].value);
|
||||
f_printf(&g_oLogFile, "%d,", frskyTelemetry[0].value);
|
||||
f_printf(&g_oLogFile, "%d,", frskyTelemetry[1].value);
|
||||
f_printf(&g_oLogFile, "%d,", frskyData.frskyRSSI[0].value);
|
||||
f_printf(&g_oLogFile, "%d,", frskyData.frskyRSSI[1].value);
|
||||
f_printf(&g_oLogFile, "%d,", frskyData.frskyTelemetry[0].value);
|
||||
f_printf(&g_oLogFile, "%d,", frskyData.frskyTelemetry[1].value);
|
||||
#endif
|
||||
#ifdef FRSKY_HUB
|
||||
if (g_model.frsky.usrProto == USR_PROTO_FRSKY_HUB) {
|
||||
f_printf(&g_oLogFile, "%4d-%02d-%02d,", frskyHubData.year+2000, frskyHubData.month, frskyHubData.day);
|
||||
f_printf(&g_oLogFile, "%02d:%02d:%02d,", frskyHubData.hour, frskyHubData.min, frskyHubData.sec);
|
||||
f_printf(&g_oLogFile, "%03d.%04d%c,", frskyHubData.gpsLongitude_bp, frskyHubData.gpsLongitude_ap,
|
||||
frskyHubData.gpsLongitudeEW ? frskyHubData.gpsLongitudeEW : '-');
|
||||
f_printf(&g_oLogFile, "%03d.%04d%c,", frskyHubData.gpsLatitude_bp, frskyHubData.gpsLatitude_ap,
|
||||
frskyHubData.gpsLatitudeNS ? frskyHubData.gpsLatitudeNS : '-');
|
||||
f_printf(&g_oLogFile, "%03d.%d,", frskyHubData.gpsCourse_bp, frskyHubData.gpsCourse_ap);
|
||||
f_printf(&g_oLogFile, "%d.%d,", frskyHubData.gpsSpeed_bp, frskyHubData.gpsSpeed_ap);
|
||||
f_printf(&g_oLogFile, "%03d.%d,", frskyHubData.gpsAltitude_bp, frskyHubData.gpsAltitude_ap);
|
||||
f_printf(&g_oLogFile, "%d.%d,", frskyHubData.baroAltitude_bp, frskyHubData.baroAltitude_ap);
|
||||
f_printf(&g_oLogFile, "%d,", frskyHubData.temperature1);
|
||||
f_printf(&g_oLogFile, "%d,", frskyHubData.temperature2);
|
||||
f_printf(&g_oLogFile, "%d,", frskyHubData.rpm);
|
||||
f_printf(&g_oLogFile, "%d,", frskyHubData.fuelLevel);
|
||||
f_printf(&g_oLogFile, "%d,", frskyHubData.volts);
|
||||
f_printf(&g_oLogFile, "%d,", frskyHubData.accelX);
|
||||
f_printf(&g_oLogFile, "%d,", frskyHubData.accelY);
|
||||
f_printf(&g_oLogFile, "%d,", frskyHubData.accelZ);
|
||||
f_printf(&g_oLogFile, "%4d-%02d-%02d,", frskyData.frskyHubData.year+2000, frskyData.frskyHubData.month, frskyData.frskyHubData.day);
|
||||
f_printf(&g_oLogFile, "%02d:%02d:%02d,", frskyData.frskyHubData.hour, frskyData.frskyHubData.min, frskyData.frskyHubData.sec);
|
||||
f_printf(&g_oLogFile, "%03d.%04d%c,", frskyData.frskyHubData.gpsLongitude_bp, frskyData.frskyHubData.gpsLongitude_ap,
|
||||
frskyData.frskyHubData.gpsLongitudeEW ? frskyData.frskyHubData.gpsLongitudeEW : '-');
|
||||
f_printf(&g_oLogFile, "%03d.%04d%c,", frskyData.frskyHubData.gpsLatitude_bp, frskyData.frskyHubData.gpsLatitude_ap,
|
||||
frskyData.frskyHubData.gpsLatitudeNS ? frskyData.frskyHubData.gpsLatitudeNS : '-');
|
||||
f_printf(&g_oLogFile, "%03d.%d,", frskyData.frskyHubData.gpsCourse_bp, frskyData.frskyHubData.gpsCourse_ap);
|
||||
f_printf(&g_oLogFile, "%d.%d,", frskyData.frskyHubData.gpsSpeed_bp, frskyData.frskyHubData.gpsSpeed_ap);
|
||||
f_printf(&g_oLogFile, "%03d.%d,", frskyData.frskyHubData.gpsAltitude_bp, frskyData.frskyHubData.gpsAltitude_ap);
|
||||
f_printf(&g_oLogFile, "%d.%d,", frskyData.frskyHubData.baroAltitude_bp, frskyData.frskyHubData.baroAltitude_ap);
|
||||
f_printf(&g_oLogFile, "%d,", frskyData.frskyHubData.temperature1);
|
||||
f_printf(&g_oLogFile, "%d,", frskyData.frskyHubData.temperature2);
|
||||
f_printf(&g_oLogFile, "%d,", frskyData.frskyHubData.rpm);
|
||||
f_printf(&g_oLogFile, "%d,", frskyData.frskyHubData.fuelLevel);
|
||||
f_printf(&g_oLogFile, "%d,", frskyData.frskyHubData.volts);
|
||||
f_printf(&g_oLogFile, "%d,", frskyData.frskyHubData.accelX);
|
||||
f_printf(&g_oLogFile, "%d,", frskyData.frskyHubData.accelY);
|
||||
f_printf(&g_oLogFile, "%d,", frskyData.frskyHubData.accelZ);
|
||||
}
|
||||
#endif
|
||||
for (uint8_t i=0; i<NUM_STICKS+NUM_POTS; i++)
|
||||
|
|
|
@ -142,10 +142,13 @@ bool listSDcardModels()
|
|||
s_menu_flags = BSS;
|
||||
uint8_t offset = 0;
|
||||
|
||||
#if defined(PCBV4)
|
||||
// TODO as ARM
|
||||
FRESULT result = f_mount(0, &g_FATFS_Obj);
|
||||
if (result != FR_OK) {
|
||||
return SDCARD_ERROR(result);
|
||||
}
|
||||
#endif
|
||||
|
||||
FRESULT res = f_opendir(&dir, MODELS_PATH); /* Open the directory */
|
||||
if (res == FR_OK) {
|
||||
|
@ -2325,6 +2328,7 @@ enum menuProcTelemetryItems {
|
|||
ITEM_TELEMETRY_USR_PROTO,
|
||||
ITEM_TELEMETRY_USR_BLADES,
|
||||
#endif
|
||||
ITEM_TELEMETRY_USR_CURRENT_SOURCE,
|
||||
#if defined(VARIO)
|
||||
ITEM_TELEMETRY_VARIO_LABEL,
|
||||
ITEM_TELEMETRY_VARIO_SOURCE,
|
||||
|
@ -2355,10 +2359,10 @@ enum menuProcTelemetryItems {
|
|||
#endif
|
||||
|
||||
#ifdef FRSKY
|
||||
#define TELEM_COL2 (8*FW-2)
|
||||
#define TELEM_COL2 (8*FW-1)
|
||||
void menuProcTelemetry(uint8_t event)
|
||||
{
|
||||
MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, ITEM_TELEMETRY_MAX+1, {0, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 1, USRDATA_LINES VARIO_LINES (uint8_t)-1, 1, 1, 1, 1, (uint8_t)-1, 2, 2, 2, 2});
|
||||
MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, ITEM_TELEMETRY_MAX+1, {0, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 1, USRDATA_LINES 0, VARIO_LINES (uint8_t)-1, 1, 1, 1, 1, (uint8_t)-1, 2, 2, 2, 2});
|
||||
|
||||
uint8_t sub = m_posVert - 1;
|
||||
|
||||
|
@ -2367,7 +2371,8 @@ void menuProcTelemetry(uint8_t event)
|
|||
case EVT_KEY_BREAK(KEY_UP):
|
||||
case EVT_KEY_BREAK(KEY_LEFT):
|
||||
case EVT_KEY_BREAK(KEY_RIGHT):
|
||||
if (s_editMode>0 && sub<=13)
|
||||
frskyEvalCurrentConsumptionBoundary();
|
||||
if (s_editMode>0 && sub<=ITEM_TELEMETRY_RSSI_ALARM2)
|
||||
FRSKY_setModelAlarms(); // update Fr-Sky module when edit mode exited
|
||||
break;
|
||||
}
|
||||
|
@ -2385,7 +2390,7 @@ void menuProcTelemetry(uint8_t event)
|
|||
case ITEM_TELEMETRY_A2_LABEL:
|
||||
lcd_putsLeft(y, STR_ACHANNEL);
|
||||
lcd_outdezAtt(2*FW, y, ch+1, 0);
|
||||
putsTelemetryChannel(TELEM_COL2+6*FW, y, ch+MAX_TIMERS, frskyTelemetry[ch].value, LEFT);
|
||||
putsTelemetryChannel(TELEM_COL2+6*FW, y, ch+MAX_TIMERS, frskyData.frskyTelemetry[ch].value, LEFT);
|
||||
break;
|
||||
|
||||
case ITEM_TELEMETRY_A1_RANGE:
|
||||
|
@ -2496,6 +2501,12 @@ void menuProcTelemetry(uint8_t event)
|
|||
break;
|
||||
#endif
|
||||
|
||||
case ITEM_TELEMETRY_USR_CURRENT_SOURCE:
|
||||
lcd_puts(4, y, STR_CURRENT);
|
||||
lcd_putsiAtt(TELEM_COL2, y, STR_CURRENTSRC, g_model.frsky.currentSource, attr);
|
||||
if (attr) CHECK_INCDEC_MODELVAR(event, g_model.frsky.currentSource, 0, 2);
|
||||
break;
|
||||
|
||||
#if defined(VARIO)
|
||||
case ITEM_TELEMETRY_VARIO_LABEL:
|
||||
lcd_putsLeft(y, STR_VARIO);
|
||||
|
|
|
@ -333,6 +333,7 @@ enum TelemetryUnit {
|
|||
UNIT_DEGREES,
|
||||
UNIT_PERCENT,
|
||||
UNIT_MILLIAMPS,
|
||||
UNIT_MAH,
|
||||
UNIT_MAX,
|
||||
UNIT_FEET,
|
||||
UNIT_KTS
|
||||
|
@ -402,7 +403,7 @@ enum VarioSource {
|
|||
};
|
||||
|
||||
PACK(typedef struct t_FrSkyBarData {
|
||||
uint16_t source:4;
|
||||
uint16_t source:4; // TODO modification in next EEPROM
|
||||
uint16_t barMin:6; // minimum for bar display
|
||||
uint16_t barMax:6; // ditto for max display (would usually = ratio)
|
||||
}) FrSkyBarData;
|
||||
|
@ -413,12 +414,18 @@ enum FrskyUsrProtocols {
|
|||
USR_PROTO_WS_HOW_HIGH
|
||||
};
|
||||
|
||||
enum CurrentSource {
|
||||
CURRENT_SOURCE_HUB,
|
||||
CURRENT_SOURCE_A1,
|
||||
CURRENT_SOURCE_A2
|
||||
};
|
||||
|
||||
PACK(typedef struct t_FrSkyData {
|
||||
FrSkyChannelData channels[2];
|
||||
uint8_t usrProto:3; // Protocol in FrSky user data, 0=None, 1=FrSky hub, 2=WS HowHigh
|
||||
uint8_t imperial:1;
|
||||
uint8_t blades:2; // How many blades for RPMs, 0=2 blades, 1=3 blades
|
||||
uint8_t spare:2;
|
||||
uint8_t currentSource:2;
|
||||
FrSkyBarData bars[4];
|
||||
FrSkyRSSIAlarm rssiAlarms[2];
|
||||
}) FrSkyData;
|
||||
|
@ -593,10 +600,10 @@ PACK(typedef struct t_ModelData {
|
|||
|
||||
EXTDATA;
|
||||
|
||||
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
|
||||
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5ms increments
|
||||
uint8_t thrTraceSrc;
|
||||
uint8_t modelId;
|
||||
uint8_t frskyLines[4];
|
||||
uint8_t frskyLines[4]; // TODO modification in next EEPROM
|
||||
uint16_t frskyLinesXtra;
|
||||
int8_t servoCenter[NUM_CHNOUT];
|
||||
|
||||
|
|
|
@ -38,6 +38,7 @@ extern "C" {
|
|||
|
||||
#define MIXER_STACK_SIZE 300
|
||||
#define MENUS_STACK_SIZE 300
|
||||
#define AUDIO_STACK_SIZE 300
|
||||
#define BT_STACK_SIZE 100
|
||||
|
||||
OS_TID mixerTaskId;
|
||||
|
@ -46,6 +47,13 @@ OS_STK mixerStack[MIXER_STACK_SIZE];
|
|||
OS_TID menusTaskId;
|
||||
OS_STK menusStack[MENUS_STACK_SIZE];
|
||||
|
||||
OS_TID audioTaskId;
|
||||
OS_STK audioStack[AUDIO_STACK_SIZE];
|
||||
OS_TCID audioTimer;
|
||||
OS_FlagID audioFlag;
|
||||
|
||||
OS_MutexID sdMutex;
|
||||
|
||||
/*OS_TID btTask;
|
||||
OS_STK btStack[BT_STACK_SIZE];
|
||||
OS_TCID btTimer;
|
||||
|
@ -82,7 +90,7 @@ uint16_t g_timeMainMax;
|
|||
uint8_t g_timeMainLast;
|
||||
#endif
|
||||
|
||||
#ifdef AUDIO
|
||||
#if defined(AUDIO) && !defined(PCBARM)
|
||||
audioQueue audio;
|
||||
#endif
|
||||
|
||||
|
@ -449,32 +457,31 @@ int16_t getValue(uint8_t i)
|
|||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT) return ex_chans[i-CSW_CHOUT_BASE];
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_TM2) return s_timerVal[i-CSW_CHOUT_BASE-NUM_CHNOUT];
|
||||
#if defined(FRSKY)
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_A2) return frskyTelemetry[i-CSW_CHOUT_BASE-NUM_CHNOUT-2].value;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_RSSI_TX) return frskyRSSI[1].value;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_RSSI_RX) return frskyRSSI[0].value;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_A2) return frskyData.frskyTelemetry[i-CSW_CHOUT_BASE-NUM_CHNOUT-2].value;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_RSSI_TX) return frskyData.frskyRSSI[1].value;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_RSSI_RX) return frskyData.frskyRSSI[0].value;
|
||||
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ALT) return frskyHubData.baroAltitude_bp;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ALT) return frskyData.frskyHubData.baroAltitude_bp;
|
||||
#endif
|
||||
#if defined(FRSKY_HUB)
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_RPM) return frskyHubData.rpm;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_FUEL) return frskyHubData.fuelLevel;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_T1) return frskyHubData.temperature1;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_T2) return frskyHubData.temperature2;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_SPEED) return frskyHubData.gpsSpeed_bp;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_DIST) return frskyHubData.gpsDistance;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_GPSALT) return frskyHubData.gpsAltitude_bp;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CELL) return (int16_t)frskyHubData.minCellVolts * 2;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CURRENT) return (int16_t)frskyHubData.current;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CONSUMPTION) return consumption/360;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCx) return frskyHubData.accelX;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCy) return frskyHubData.accelY;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCz) return frskyHubData.accelZ;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_HDG) return frskyHubData.gpsCourse_bp;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_VSPD) return frskyHubData.varioSpeed;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_A1) return frskyTelemetry[0].min;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_A2) return frskyTelemetry[1].min;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MAX_CURRENT) return frskyHubData.maxCurrent;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MAX_DIST) return *(((int16_t*)(&frskyHubData.minAltitude))+i-(CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_ALT-1));
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_RPM) return frskyData.frskyHubData.rpm;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_FUEL) return frskyData.frskyHubData.fuelLevel;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_T1) return frskyData.frskyHubData.temperature1;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_T2) return frskyData.frskyHubData.temperature2;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_SPEED) return frskyData.frskyHubData.gpsSpeed_bp;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_DIST) return frskyData.frskyHubData.gpsDistance;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_GPSALT) return frskyData.frskyHubData.gpsAltitude_bp;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CELL) return (int16_t)frskyData.frskyHubData.minCellVolts * 2;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CURRENT) return (int16_t)frskyData.frskyHubData.current;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CONSUMPTION) return frskyData.currentConsumption;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCx) return frskyData.frskyHubData.accelX;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCy) return frskyData.frskyHubData.accelY;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCz) return frskyData.frskyHubData.accelZ;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_HDG) return frskyData.frskyHubData.gpsCourse_bp;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_VSPD) return frskyData.frskyHubData.varioSpeed;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_A1) return frskyData.frskyTelemetry[0].min;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_A2) return frskyData.frskyTelemetry[1].min;
|
||||
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MAX_DIST) return *(((int16_t*)(&frskyData.frskyHubData.minAltitude))+i-(CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_ALT-1));
|
||||
#endif
|
||||
#endif
|
||||
else return 0;
|
||||
|
@ -1089,12 +1096,7 @@ void checkTrims()
|
|||
AUDIO_TRIM_MIDDLE(after);
|
||||
}
|
||||
else {
|
||||
#if defined (AUDIO)
|
||||
audio.event(AU_TRIM_MOVE, after);
|
||||
#else
|
||||
if (event & _MSK_KEY_REPT) warble = true;
|
||||
AUDIO_TRIM();
|
||||
#endif
|
||||
AUDIO_TRIM(event, after);
|
||||
}
|
||||
#if defined(PCBSTD)
|
||||
return 0;
|
||||
|
@ -1652,12 +1654,7 @@ void evalFunctions()
|
|||
|
||||
if ((!momentary) || (~active_switches & switch_mask)) {
|
||||
if (sd->func == FUNC_PLAY_SOUND) {
|
||||
#if defined(AUDIO)
|
||||
audioDefevent(AU_FRSKY_FIRST+sd->param);
|
||||
#else
|
||||
// TODO sound with warble = !(g_tmr10ms % 60); AUDIO_WARNING2(); }
|
||||
beep(3);
|
||||
#endif
|
||||
AUDIO_PLAY(AU_FRSKY_FIRST+sd->param);
|
||||
}
|
||||
|
||||
#if defined(HAPTIC)
|
||||
|
@ -2832,11 +2829,14 @@ void menusTask(void * pdata)
|
|||
while (1) {
|
||||
shutdown_state = check_soft_power();
|
||||
#if 0
|
||||
if (shutdown_state == e_power_off)
|
||||
if (shutdown_state == e_power_off) {
|
||||
break;
|
||||
}
|
||||
else if (shutdown_state == e_power_usb) {
|
||||
const char STR_SDCARD[] = "SD Card";
|
||||
const char STR_SDCARD[] = "Massstorage"; // TODO translations
|
||||
const char STR_BOOTLOADER[] = "Bootloader";
|
||||
lcd_clear();
|
||||
s_menu_count = 0;
|
||||
s_menu[s_menu_count++] = STR_SDCARD;
|
||||
s_menu[s_menu_count++] = STR_BOOTLOADER;
|
||||
uint8_t event = getEvent(false);
|
||||
|
@ -2849,15 +2849,17 @@ void menusTask(void * pdata)
|
|||
s_menu_count = 0;
|
||||
}
|
||||
}
|
||||
refreshDisplay();
|
||||
}
|
||||
#else
|
||||
if (shutdown_state >= e_power_usb)
|
||||
if (shutdown_state >= e_power_usb) {
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
else {
|
||||
perMain();
|
||||
}
|
||||
CoTickDelay(5); // 10ms for now
|
||||
|
||||
}
|
||||
|
||||
SysTick->CTRL = 0; // turn off systick
|
||||
|
@ -2887,6 +2889,10 @@ void menusTask(void * pdata)
|
|||
|
||||
lcdSetRefVolt(0); // TODO before soft_power_off?
|
||||
}
|
||||
|
||||
extern void audioTimerHandle(void);
|
||||
extern void audioTask(void* pdata);
|
||||
|
||||
#endif
|
||||
|
||||
int main(void)
|
||||
|
@ -3031,8 +3037,14 @@ int main(void)
|
|||
// btTimer = CoCreateTmr(TMR_TYPE_PERIODIC, 1000/(1000/CFG_SYSTICK_FREQ), 1000/(1000/CFG_SYSTICK_FREQ), btTimerHandle);
|
||||
|
||||
// btTaskId = CoCreateTask(btTask, NULL, 19, &btStack[BT_STACK_SIZE-1], BT_STACK_SIZE);
|
||||
menusTaskId = CoCreateTask(menusTask, NULL, 10, &menusStack[MENUS_STACK_SIZE-1], MENUS_STACK_SIZE);
|
||||
mixerTaskId = CoCreateTask(mixerTask, NULL, 5, &mixerStack[MIXER_STACK_SIZE-1], MIXER_STACK_SIZE);
|
||||
menusTaskId = CoCreateTask(menusTask, NULL, 10, &menusStack[MENUS_STACK_SIZE-1], MENUS_STACK_SIZE);
|
||||
|
||||
audioFlag = CoCreateFlag(true, false); // Auto-reset, start FALSE
|
||||
audioTimer = CoCreateTmr(TMR_TYPE_ONE_SHOT, 1000/(1000/CFG_SYSTICK_FREQ), 1000/(1000/CFG_SYSTICK_FREQ), audioTimerHandle);
|
||||
audioTaskId = CoCreateTask(audioTask, NULL, 7, &audioStack[AUDIO_STACK_SIZE-1], AUDIO_STACK_SIZE);
|
||||
|
||||
sdMutex = CoCreateMutex();
|
||||
|
||||
CoStartOS();
|
||||
#else
|
||||
|
|
|
@ -47,6 +47,7 @@ Pio Pioa, Piob, Pioc;
|
|||
Pwm pwm;
|
||||
Twi Twio;
|
||||
Usart Usart0;
|
||||
Dacc dacc;
|
||||
uint32_t eeprom_pointer;
|
||||
char* eeprom_buffer_data;
|
||||
volatile int32_t eeprom_buffer_size;
|
||||
|
@ -354,5 +355,11 @@ int f_printf (FIL*, const TCHAR*, ...) /* Put a formatte
|
|||
return 0;
|
||||
}
|
||||
|
||||
FRESULT f_getcwd (TCHAR *path, UINT sz_path)
|
||||
{
|
||||
getcwd(path, sz_path);
|
||||
return FR_OK;
|
||||
}
|
||||
|
||||
uint32_t Card_state = 8;
|
||||
#endif
|
||||
|
|
|
@ -99,6 +99,7 @@ extern sem_t *eeprom_write_sem;
|
|||
#if defined(PCBARM)
|
||||
extern Pio Pioa, Piob, Pioc;
|
||||
extern Twi Twio;
|
||||
extern Dacc dacc;
|
||||
extern Usart Usart0;
|
||||
#undef USART0
|
||||
#define USART0 (&Usart0)
|
||||
|
@ -110,6 +111,8 @@ extern Usart Usart0;
|
|||
#define PIOC (&Pioc)
|
||||
#undef TWI0
|
||||
#define TWI0 (&Twio)
|
||||
#undef DACC
|
||||
#define DACC (&dacc)
|
||||
extern Pwm pwm;
|
||||
#undef PWM
|
||||
#define PWM (&pwm)
|
||||
|
@ -292,4 +295,11 @@ void eeprom_read_block (void *pointer_ram,
|
|||
#define wdt_reset() sleep(1/*ms*/)
|
||||
#define board_init()
|
||||
|
||||
#define CoSetFlag(...)
|
||||
#define CoSetTmrCnt(...)
|
||||
#define CoEnterISR(...)
|
||||
#define CoExitISR(...)
|
||||
#define CoStartTmr(...)
|
||||
#define CoWaitForSingleFlag(...)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -74,8 +74,6 @@ class audioQueue
|
|||
// it is essentially the life of the class.
|
||||
void heartbeat();
|
||||
|
||||
// bool freeslots(uint8_t slots);
|
||||
|
||||
inline bool empty() {
|
||||
return (t_queueRidx == t_queueWidx);
|
||||
}
|
||||
|
@ -132,6 +130,9 @@ void audioDefevent(uint8_t e);
|
|||
#define AUDIO_VARIO_UP() audioDefevent(AU_KEYPAD_UP)
|
||||
#define AUDIO_VARIO_DOWN() audioDefevent(AU_KEYPAD_DOWN)
|
||||
#define AUDIO_TRIM_MIDDLE(f) audio.event(AU_TRIM_MIDDLE, f)
|
||||
#define AUDIO_TRIM(event, f) audio.event(AU_TRIM_MOVE, f)
|
||||
#define AUDIO_PLAY(p) audio.event(p)
|
||||
#define AUDIO_VARIO(f, t) audio.play(f, t, 0, PLAY_SOUND_VARIO)
|
||||
|
||||
#define AUDIO_DRIVER() audio.driver()
|
||||
#define AUDIO_HEARTBEAT() audio.heartbeat()
|
||||
|
|
|
@ -71,6 +71,7 @@ const pm_char STR_OPEN9X[] PROGMEM =
|
|||
ISTR(VALARMFN)
|
||||
ISTR(VTELPROTO)
|
||||
ISTR(GPSFORMAT)
|
||||
ISTR(CURRENTSRC)
|
||||
ISTR(VARIOSRC)
|
||||
#endif
|
||||
#ifdef TEMPLATES
|
||||
|
@ -302,9 +303,12 @@ const pm_char STR_SHUTDOWN[] PROGMEM = TR_SHUTDOWN;
|
|||
|
||||
const pm_char STR_BATT_CALIB[] PROGMEM = TR_BATT_CALIB;
|
||||
|
||||
#if defined(PCBARM) || defined(FRSKY)
|
||||
const pm_char STR_CURRENT[] PROGMEM = TR_CURRENT;
|
||||
#endif
|
||||
|
||||
#if defined(PCBARM)
|
||||
const pm_char STR_CURRENT_CALIB[] PROGMEM = TR_CURRENT_CALIB;
|
||||
const pm_char STR_CURRENT[] PROGMEM = TR_CURRENT;
|
||||
#endif
|
||||
|
||||
#if defined(SDCARD)
|
||||
|
|
|
@ -98,7 +98,8 @@ extern const pm_char STR_OPEN9X[];
|
|||
#define OFS_VALARMFN (OFS_VALARM + sizeof(TR_VALARM))
|
||||
#define OFS_VTELPROTO (OFS_VALARMFN + sizeof(TR_VALARMFN))
|
||||
#define OFS_GPSFORMAT (OFS_VTELPROTO + sizeof(TR_VTELPROTO))
|
||||
#define OFS_VARIOSRC (OFS_GPSFORMAT + sizeof(TR_GPSFORMAT))
|
||||
#define OFS_CURRENTSRC (OFS_GPSFORMAT + sizeof(TR_GPSFORMAT))
|
||||
#define OFS_VARIOSRC (OFS_CURRENTSRC + sizeof(TR_CURRENTSRC))
|
||||
#define OFS_ENDTELEM (OFS_VARIOSRC + sizeof(TR_VARIOSRC))
|
||||
#else
|
||||
#define OFS_ENDTELEM (OFS_VTELEMCHNS + sizeof(TR_VTELEMCHNS))
|
||||
|
@ -165,6 +166,7 @@ extern const pm_char STR_OPEN9X[];
|
|||
#define STR_VALARMFN (STR_OPEN9X + OFS_VALARMFN)
|
||||
#define STR_VTELPROTO (STR_OPEN9X + OFS_VTELPROTO)
|
||||
#define STR_GPSFORMAT (STR_OPEN9X + OFS_GPSFORMAT)
|
||||
#define STR_CURRENTSRC (STR_OPEN9X + OFS_CURRENTSRC)
|
||||
#define STR_VARIOSRC (STR_OPEN9X + OFS_VARIOSRC)
|
||||
#define STR_TELEMCHNS (STR_OPEN9X + OFS_TELEMCHNS)
|
||||
#endif
|
||||
|
@ -373,9 +375,12 @@ extern const pm_char STR_SHUTDOWN[];
|
|||
|
||||
extern const pm_char STR_BATT_CALIB[];
|
||||
|
||||
#if defined(PCBARM) || defined(FRSKY)
|
||||
extern const pm_char STR_CURRENT[];
|
||||
#endif
|
||||
|
||||
#if defined(PCBARM)
|
||||
extern const pm_char STR_CURRENT_CALIB[];
|
||||
extern const pm_char STR_CURRENT[];
|
||||
#define LEN_CALIB_FIELDS (PSIZE(TR_BATT_CALIB) > PSIZE(TR_CURRENT_CALIB) ? PSIZE(TR_BATT_CALIB) : PSIZE(TR_CURRENT_CALIB))
|
||||
#else
|
||||
#define LEN_CALIB_FIELDS PSIZE(TR_BATT_CALIB)
|
||||
|
|
|
@ -138,7 +138,7 @@
|
|||
#define TR_FUNCSOUNDS "Warn1 ""Warn2 ""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick "
|
||||
|
||||
#define LEN_VTELEMCHNS "\004"
|
||||
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""A\0 ""mAh\0""AccX""AccY""AccZ""Hdg\0""VSpd""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Spd+""A+\0 ""Dst+""Acc\0""Time"
|
||||
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""Curr""Cnsp""AccX""AccY""AccZ""Hdg\0""VSpd""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Spd+""Dst+""Cur+""Acc\0""Time"
|
||||
|
||||
#ifdef IMPERIAL_UNITS
|
||||
#define LENGTH_UNIT "ft\0"
|
||||
|
@ -149,7 +149,7 @@
|
|||
#endif
|
||||
|
||||
#define LEN_VTELEMUNIT "\003"
|
||||
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0"
|
||||
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0""mAh"
|
||||
#define STR_V (STR_VTELEMUNIT+1)
|
||||
#define STR_A (STR_VTELEMUNIT+4)
|
||||
|
||||
|
@ -168,6 +168,9 @@
|
|||
#define TR_VTELPROTO ""
|
||||
#endif
|
||||
|
||||
#define LEN_CURRENTSRC "\003"
|
||||
#define TR_CURRENTSRC "Hub""A1\0""A2\0"
|
||||
|
||||
#define LEN_VARIOSRC "\006"
|
||||
#define TR_VARIOSRC "BaroV1""BaroV2""A1\0 ""A2\0"
|
||||
|
||||
|
|
|
@ -139,7 +139,7 @@
|
|||
#define TR_FUNCSOUNDS "Warn 1""Warn 2""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick "
|
||||
|
||||
#define LEN_VTELEMCHNS "\004"
|
||||
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""A\0 ""mAh\0""AccX""AccY""AccZ""Hdg\0""VSpd""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Spd+""A+\0 ""Dst+""Acc\0""Time"
|
||||
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""Curr""Cnsp""AccX""AccY""AccZ""Hdg\0""VSpd""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Spd+""Dst+""Cur+""Acc\0""Time"
|
||||
|
||||
#ifdef IMPERIAL_UNITS
|
||||
#define LENGTH_UNIT "ft\0"
|
||||
|
@ -150,7 +150,7 @@
|
|||
#endif
|
||||
|
||||
#define LEN_VTELEMUNIT "\003"
|
||||
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0"
|
||||
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0""mAh"
|
||||
#define STR_V (STR_VTELEMUNIT+1)
|
||||
#define STR_A (STR_VTELEMUNIT+4)
|
||||
|
||||
|
@ -169,6 +169,9 @@
|
|||
#define TR_VTELPROTO ""
|
||||
#endif
|
||||
|
||||
#define LEN_CURRENTSRC "\003"
|
||||
#define TR_CURRENTSRC "Hub""A1\0""A2\0"
|
||||
|
||||
#define LEN_VARIOSRC "\006"
|
||||
#define TR_VARIOSRC "BaroV1""BaroV2""A1\0 ""A2\0"
|
||||
|
||||
|
|
|
@ -139,7 +139,7 @@
|
|||
#define TR_FUNCSOUNDS "Warn1 ""Warn2 ""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick "
|
||||
|
||||
#define LEN_VTELEMCHNS "\004"
|
||||
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""A\0 ""mAh\0""AccX""AccY""AccZ""Hdg\0""VSpd""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Spd+""A+\0 ""Dst+""Acc\0""Time"
|
||||
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""Curr""Cnsp""AccX""AccY""AccZ""Hdg\0""VSpd""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Spd+""Dst+""Cur+""Acc\0""Time"
|
||||
|
||||
#ifdef IMPERIAL_UNITS
|
||||
#define LENGTH_UNIT "ft\0"
|
||||
|
@ -150,7 +150,7 @@
|
|||
#endif
|
||||
|
||||
#define LEN_VTELEMUNIT "\003"
|
||||
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0"
|
||||
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0""mAh"
|
||||
#define STR_V (STR_VTELEMUNIT+1)
|
||||
#define STR_A (STR_VTELEMUNIT+4)
|
||||
|
||||
|
@ -169,6 +169,9 @@
|
|||
#define TR_VTELPROTO ""
|
||||
#endif
|
||||
|
||||
#define LEN_CURRENTSRC "\003"
|
||||
#define TR_CURRENTSRC "Hub""A1\0""A2\0"
|
||||
|
||||
#define LEN_VARIOSRC "\006"
|
||||
#define TR_VARIOSRC "BaroV1""BaroV2""A1\0 ""A2\0"
|
||||
|
||||
|
|
|
@ -133,7 +133,7 @@
|
|||
#define TR_FUNCSOUNDS "Warn1 ""Warn2 ""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick "
|
||||
|
||||
#define LEN_VTELEMCHNS "\004"
|
||||
#define TR_VTELEMCHNS "---\0""Chr1""Chr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""Alt\0""Rpm\0""Carb""T1\0 ""T2\0 ""Vit\0""Dist""AltG""Elem""A\0 ""mAh\0""AccX""AccY""AccZ""Cap\0""VitV""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Vit+""A+\0 ""Dst+""Acc\0""Time"
|
||||
#define TR_VTELEMCHNS "---\0""Chr1""Chr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""Alt\0""Rpm\0""Carb""T1\0 ""T2\0 ""Vit\0""Dist""AltG""Elem""Cour""Cnsm""AccX""AccY""AccZ""Cap\0""VitV""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Vit+""Dst+""Cur+""Acc\0""Time"
|
||||
|
||||
#ifdef IMPERIAL_UNITS
|
||||
#define LENGTH_UNIT "ft\0"
|
||||
|
@ -144,7 +144,7 @@
|
|||
#endif
|
||||
|
||||
#define LEN_VTELEMUNIT "\003"
|
||||
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0"
|
||||
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0""mAh"
|
||||
#define STR_V (STR_VTELEMUNIT+1)
|
||||
#define STR_A (STR_VTELEMUNIT+4)
|
||||
|
||||
|
@ -163,6 +163,9 @@
|
|||
#define TR_VTELPROTO ""
|
||||
#endif
|
||||
|
||||
#define LEN_CURRENTSRC "\003"
|
||||
#define TR_CURRENTSRC "Hub""A1\0""A2\0"
|
||||
|
||||
#define LEN_VARIOSRC "\006"
|
||||
#define TR_VARIOSRC "BaroV1""BaroV2""A1\0 ""A2\0"
|
||||
|
||||
|
|
|
@ -138,7 +138,7 @@
|
|||
#define TR_FUNCSOUNDS "Warn1 ""Warn2 ""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick "
|
||||
|
||||
#define LEN_VTELEMCHNS "\004"
|
||||
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""Alt\0""Rpm\0""Carb""T1\0 ""T2\0 ""Vel\0""Dist""GAlt""Cell""A\0 ""mAh\0""AccX""AccY""AccZ""Dir\0""VelV""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Vel+""A+\0 ""Dst+""Acc\0""Time"
|
||||
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""Alt\0""Rpm\0""Carb""T1\0 ""T2\0 ""Vel\0""Dist""GAlt""Cell""Curr""Cnsp""AccX""AccY""AccZ""Dir\0""VelV""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Vel+""Dst+""Cur+""Acc\0""Time"
|
||||
|
||||
#ifdef IMPERIAL_UNITS
|
||||
#define LENGTH_UNIT "ft\0"
|
||||
|
@ -149,7 +149,7 @@
|
|||
#endif
|
||||
|
||||
#define LEN_VTELEMUNIT "\003"
|
||||
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0"
|
||||
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0""mAh"
|
||||
#define STR_V (STR_VTELEMUNIT+1)
|
||||
#define STR_A (STR_VTELEMUNIT+4)
|
||||
|
||||
|
@ -168,6 +168,9 @@
|
|||
#define TR_VTELPROTO ""
|
||||
#endif
|
||||
|
||||
#define LEN_CURRENTSRC "\003"
|
||||
#define TR_CURRENTSRC "Hub""A1\0""A2\0"
|
||||
|
||||
#define LEN_VARIOSRC "\006"
|
||||
#define TR_VARIOSRC "BaroV1""BaroV2""A1\0 ""A2\0"
|
||||
|
||||
|
|
|
@ -133,7 +133,7 @@
|
|||
#define TR_FUNCSOUNDS "Varn1 ""Varn2 ""F\200r ""Ring ""SciFi ""Robot ""Pip ""Tada ""Syrsa ""Siren ""Alarm ""Ratata""Tick "
|
||||
|
||||
#define LEN_VTELEMCHNS "\004"
|
||||
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""H\202jd""Varv""Tank""T1\0 ""T2\0 ""Fart""Avst""GHjd""Batt""A\0 ""mAh\0""AccX""AccY""AccZ""Hdg\0""VFrt""A1-\0""A2-\0""Hjd-""Hjd+""Rpm+""T1+\0""T2+\0""Frt+""A+\0 ""Avs+""Acc\0""Tid\0"
|
||||
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""A1\0 ""A2\0 ""Tx\0 ""Rx\0 ""H\202jd""Varv""Tank""T1\0 ""T2\0 ""Fart""Avst""GHjd""Batt""Curr""Cnsp""AccX""AccY""AccZ""Hdg\0""VFrt""A1-\0""A2-\0""Hjd-""Hjd+""Rpm+""T1+\0""T2+\0""Frt+""Avs+""Cur+""Acc\0""Tid\0"
|
||||
|
||||
#ifdef IMPERIAL_UNITS
|
||||
#define LENGTH_UNIT "fot"
|
||||
|
@ -144,7 +144,7 @@
|
|||
#endif
|
||||
|
||||
#define LEN_VTELEMUNIT "\003"
|
||||
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0"
|
||||
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0""mAh"
|
||||
#define STR_V (STR_VTELEMUNIT+1)
|
||||
#define STR_A (STR_VTELEMUNIT+4)
|
||||
|
||||
|
@ -163,6 +163,9 @@
|
|||
#define TR_VTELPROTO ""
|
||||
#endif
|
||||
|
||||
#define LEN_CURRENTSRC "\003"
|
||||
#define TR_CURRENTSRC "Hub""A1\0""A2\0"
|
||||
|
||||
#define LEN_VARIOSRC "\006"
|
||||
#define TR_VARIOSRC "BaroV1""BaroV2""A1 ""A2\0"
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@ import os, sys, shutil, platform, subprocess
|
|||
def generate(str, idx):
|
||||
if platform.system() == "Windows":
|
||||
subprocess.Popen(["C:\Program Files\eSpeak\command_line\espeak.exe", "-w", "%04d.wav" % idx, str], stdout=subprocess.PIPE, stderr=subprocess.PIPE).wait()
|
||||
if 'ad4' in sys.argv:
|
||||
subprocess.Popen(["D:\Perso\workspace\companion9x\AD4CONVERTER.EXE", "-E4", "%04d.WAV" % idx], stdout=subprocess.PIPE, stderr=subprocess.PIPE).wait()
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue