[stock / M128] Issue 193 fixed (PWM_BACKLIGHT option added)
[ARM] No SD support after a Tx reboot on ARM flavors [all] Issue 194 fixed (negative GVARS - on all boards!) [all] Vario small change on center high limit
This commit is contained in:
@@ -103,6 +103,10 @@ HAPTIC = NO
|
|||||||
# Values = YES, NO
|
# Values = YES, NO
|
||||||
SP22 = NO
|
SP22 = NO
|
||||||
|
|
||||||
|
# Fade Backlight using PWM
|
||||||
|
# Values = YES, NO
|
||||||
|
PWM_BACKLIGHT = NO
|
||||||
|
|
||||||
# SPLASH on START
|
# SPLASH on START
|
||||||
# Values = YES, NO, FIXED
|
# Values = YES, NO, FIXED
|
||||||
SPLASH = YES
|
SPLASH = YES
|
||||||
@@ -611,6 +615,13 @@ ifeq ($(PCB), STD128)
|
|||||||
CPPDEFS += -DAUDIO
|
CPPDEFS += -DAUDIO
|
||||||
CPPSRC += audio_avr.cpp
|
CPPSRC += audio_avr.cpp
|
||||||
else
|
else
|
||||||
|
ifeq ($(PWM_BACKLIGHT), YES)
|
||||||
|
ifeq ($(VOICE), YES)
|
||||||
|
$(error Sorry, PWM_BACKLIGHT doesnt work on Mainboards with VOICE mod.)
|
||||||
|
else
|
||||||
|
CPPDEFS += -DPWM_BACKLIGHT
|
||||||
|
endif
|
||||||
|
endif
|
||||||
CPPSRC += beeper.cpp
|
CPPSRC += beeper.cpp
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -643,6 +654,13 @@ ifeq ($(PCB), STD)
|
|||||||
CPPDEFS += -DAUDIO
|
CPPDEFS += -DAUDIO
|
||||||
CPPSRC += audio_avr.cpp
|
CPPSRC += audio_avr.cpp
|
||||||
else
|
else
|
||||||
|
ifeq ($(PWM_BACKLIGHT), YES)
|
||||||
|
ifeq ($(VOICE), YES)
|
||||||
|
$(error Sorry, PWM_BACKLIGHT doesnt work on Mainboards with VOICE mod.)
|
||||||
|
else
|
||||||
|
CPPDEFS += -DPWM_BACKLIGHT
|
||||||
|
endif
|
||||||
|
endif
|
||||||
CPPSRC += beeper.cpp
|
CPPSRC += beeper.cpp
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|||||||
+20
-32
@@ -137,16 +137,15 @@ void refreshModelAudioFiles()
|
|||||||
info.lfsize = sizeof(lfn);
|
info.lfsize = sizeof(lfn);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char filename[64] = SOUNDS_PATH "/";
|
char filename[AUDIO_FILENAME_MAXLEN+1] = SOUNDS_PATH "/";
|
||||||
|
|
||||||
if (sdMounted()) {
|
if (sdMounted()) {
|
||||||
char *buf = strcat_modelname(&filename[sizeof(SOUNDS_PATH)], g_eeGeneral.currModel);
|
char *buf = strcat_modelname(&filename[sizeof(SOUNDS_PATH)], g_eeGeneral.currModel);
|
||||||
*buf++ = '/';
|
*buf++ = '/';
|
||||||
|
|
||||||
for (uint32_t i=0; i<MAX_PHASES; i++) {
|
for (uint32_t i=0; i<MAX_PHASES; i++) {
|
||||||
sdAvailablePhaseAudioFiles[i] = getAvailableFiles(strcat_phasename_default(buf, i), info, filename) << 4;
|
char *tmp = strcat_phasename(buf, i);
|
||||||
char *tmp = strcat_phasename_nodefault(buf, i);
|
sdAvailablePhaseAudioFiles[i] = (tmp != buf ? getAvailableFiles(strcat_phasename(buf, i), info, filename) : 0);
|
||||||
if (tmp != buf) sdAvailablePhaseAudioFiles[i] += getAvailableFiles(tmp, info, filename);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for (uint32_t i=0; i<MAX_MIXERS; i++) {
|
/* for (uint32_t i=0; i<MAX_MIXERS; i++) {
|
||||||
@@ -159,13 +158,15 @@ void refreshModelAudioFiles()
|
|||||||
bool isAudioFileAvailable(uint32_t i, char * filename)
|
bool isAudioFileAvailable(uint32_t i, char * filename)
|
||||||
{
|
{
|
||||||
uint8_t category = (i >> 24);
|
uint8_t category = (i >> 24);
|
||||||
|
uint8_t index = (i >> 16) & 0xFF;
|
||||||
|
uint8_t event = i & 0xFF;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
printf("isAudioFileAvailable(%08x)\n", i); fflush(stdout);
|
printf("isAudioFileAvailable(%08x)\n", i); fflush(stdout);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (category == SYSTEM_AUDIO_CATEGORY) {
|
if (category == SYSTEM_AUDIO_CATEGORY) {
|
||||||
if (sdAvailableSystemAudioFiles & ((uint32_t)1 << i)) {
|
if (sdAvailableSystemAudioFiles & ((uint32_t)1 << event)) {
|
||||||
strcpy(filename, SYSTEM_SOUNDS_PATH "/");
|
strcpy(filename, SYSTEM_SOUNDS_PATH "/");
|
||||||
strcpy(filename+sizeof(SYSTEM_SOUNDS_PATH), audioFilenames[i]);
|
strcpy(filename+sizeof(SYSTEM_SOUNDS_PATH), audioFilenames[i]);
|
||||||
strcat(filename+sizeof(SYSTEM_SOUNDS_PATH), SOUNDS_EXT);
|
strcat(filename+sizeof(SYSTEM_SOUNDS_PATH), SOUNDS_EXT);
|
||||||
@@ -173,24 +174,11 @@ bool isAudioFileAvailable(uint32_t i, char * filename)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (category == PHASE_AUDIO_CATEGORY) {
|
else if (category == PHASE_AUDIO_CATEGORY) {
|
||||||
uint8_t index = (i >> 16) & 0xFF;
|
if (sdAvailablePhaseAudioFiles[index] & ((uint32_t)1 << event)) {
|
||||||
uint8_t event = i & 0xFF;
|
|
||||||
if (sdAvailablePhaseAudioFiles[index] & (1 << event)) {
|
|
||||||
strcpy(filename, SOUNDS_PATH "/");
|
strcpy(filename, SOUNDS_PATH "/");
|
||||||
char *str = strcat_modelname(filename+sizeof(SOUNDS_PATH), g_eeGeneral.currModel);
|
char *str = strcat_modelname(filename+sizeof(SOUNDS_PATH), g_eeGeneral.currModel);
|
||||||
*str++ = '/';
|
*str++ = '/';
|
||||||
char * tmp = strcat_phasename_nodefault(str, index);
|
char * tmp = strcat_phasename(str, index);
|
||||||
if (tmp != str) {
|
|
||||||
strcpy(tmp, suffixes[event]);
|
|
||||||
strcat(tmp, SOUNDS_EXT);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((sdAvailablePhaseAudioFiles[index] >> 4) & (1 << event)) {
|
|
||||||
strcpy(filename, SOUNDS_PATH "/");
|
|
||||||
char *str = strcat_modelname(filename+sizeof(SOUNDS_PATH), g_eeGeneral.currModel);
|
|
||||||
*str++ = '/';
|
|
||||||
char * tmp = strcat_phasename_default(str, index);
|
|
||||||
if (tmp != str) {
|
if (tmp != str) {
|
||||||
strcpy(tmp, suffixes[event]);
|
strcpy(tmp, suffixes[event]);
|
||||||
strcat(tmp, SOUNDS_EXT);
|
strcat(tmp, SOUNDS_EXT);
|
||||||
@@ -199,13 +187,11 @@ bool isAudioFileAvailable(uint32_t i, char * filename)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (category == MIXER_AUDIO_CATEGORY) {
|
else if (category == MIXER_AUDIO_CATEGORY) {
|
||||||
uint8_t index = (i >> 16) & 0xFF;
|
if (sdAvailableMixerAudioFiles[index] & ((uint32_t)1 << event)) {
|
||||||
uint8_t event = i & 0xFF;
|
|
||||||
if (sdAvailableMixerAudioFiles[index] & (1 << event)) {
|
|
||||||
strcpy(filename, SOUNDS_PATH "/");
|
strcpy(filename, SOUNDS_PATH "/");
|
||||||
char *str = strcat_modelname(filename+sizeof(SOUNDS_PATH), g_eeGeneral.currModel);
|
char *str = strcat_modelname(filename+sizeof(SOUNDS_PATH), g_eeGeneral.currModel);
|
||||||
*str++ = '/';
|
*str++ = '/';
|
||||||
char * tmp = strcat_mixername_nodefault(str, index);
|
char * tmp = strcat_mixername(str, index);
|
||||||
if (tmp != str) {
|
if (tmp != str) {
|
||||||
strcpy(tmp, suffixes[event]);
|
strcpy(tmp, suffixes[event]);
|
||||||
strcat(tmp, SOUNDS_EXT);
|
strcat(tmp, SOUNDS_EXT);
|
||||||
@@ -290,9 +276,11 @@ void audioTimerHandle(void)
|
|||||||
void audioTask(void* pdata)
|
void audioTask(void* pdata)
|
||||||
{
|
{
|
||||||
#if defined(SDCARD)
|
#if defined(SDCARD)
|
||||||
codecsInit();
|
if (!unexpectedShutdown) {
|
||||||
sdInit();
|
codecsInit();
|
||||||
AUDIO_TADA();
|
sdInit();
|
||||||
|
AUDIO_TADA();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
@@ -635,7 +623,7 @@ void AudioQueue::playFile(const char *filename, uint8_t flags, uint8_t id)
|
|||||||
|
|
||||||
if (flags & PLAY_BACKGROUND) {
|
if (flags & PLAY_BACKGROUND) {
|
||||||
memset(&backgroundContext.fragment, 0, sizeof(AudioFragment));
|
memset(&backgroundContext.fragment, 0, sizeof(AudioFragment));
|
||||||
strcpy(backgroundContext.fragment.file, filename); // TODO strncpy
|
strncpy(backgroundContext.fragment.file, filename, 32);
|
||||||
backgroundContext.fragment.id = id;
|
backgroundContext.fragment.id = id;
|
||||||
if (!busy()) {
|
if (!busy()) {
|
||||||
state = AUDIO_RESUMING;
|
state = AUDIO_RESUMING;
|
||||||
@@ -692,11 +680,11 @@ void AudioQueue::reset()
|
|||||||
|
|
||||||
void audioEvent(uint8_t e, uint8_t f)
|
void audioEvent(uint8_t e, uint8_t f)
|
||||||
{
|
{
|
||||||
#ifdef SDCARD
|
#if defined(SDCARD)
|
||||||
char filename[32];
|
char filename[AUDIO_FILENAME_MAXLEN+1];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAPTIC
|
#if defined(HAPTIC)
|
||||||
haptic.event(e); //do this before audio to help sync timings
|
haptic.event(e); //do this before audio to help sync timings
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -706,7 +694,7 @@ void audioEvent(uint8_t e, uint8_t f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (g_eeGeneral.beeperMode>0 || (g_eeGeneral.beeperMode==0 && e>=AU_TRIM_MOVE) || (g_eeGeneral.beeperMode>=-1 && e<=AU_ERROR)) {
|
if (g_eeGeneral.beeperMode>0 || (g_eeGeneral.beeperMode==0 && e>=AU_TRIM_MOVE) || (g_eeGeneral.beeperMode>=-1 && e<=AU_ERROR)) {
|
||||||
#ifdef SDCARD
|
#if defined(SDCARD)
|
||||||
if (e < AU_FRSKY_FIRST && isAudioFileAvailable(e, filename)) {
|
if (e < AU_FRSKY_FIRST && isAudioFileAvailable(e, filename)) {
|
||||||
audioQueue.playFile(filename);
|
audioQueue.playFile(filename);
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-8
@@ -37,11 +37,12 @@
|
|||||||
|
|
||||||
#include "FatFs/ff.h"
|
#include "FatFs/ff.h"
|
||||||
|
|
||||||
#define AUDIO_QUEUE_LENGTH (20)
|
#define AUDIO_FILENAME_MAXLEN (40)
|
||||||
#define BEEP_DEFAULT_FREQ (70)
|
#define AUDIO_QUEUE_LENGTH (20)
|
||||||
#define BEEP_OFFSET (10)
|
#define BEEP_DEFAULT_FREQ (70)
|
||||||
#define BEEP_KEY_UP_FREQ (BEEP_DEFAULT_FREQ+5)
|
#define BEEP_OFFSET (10)
|
||||||
#define BEEP_KEY_DOWN_FREQ (BEEP_DEFAULT_FREQ-5)
|
#define BEEP_KEY_UP_FREQ (BEEP_DEFAULT_FREQ+5)
|
||||||
|
#define BEEP_KEY_DOWN_FREQ (BEEP_DEFAULT_FREQ-5)
|
||||||
|
|
||||||
extern uint16_t Sine_values[];
|
extern uint16_t Sine_values[];
|
||||||
|
|
||||||
@@ -57,7 +58,7 @@ class ToneFragment {
|
|||||||
|
|
||||||
class AudioFragment : public ToneFragment {
|
class AudioFragment : public ToneFragment {
|
||||||
public:
|
public:
|
||||||
char file[32+1];
|
char file[AUDIO_FILENAME_MAXLEN+1];
|
||||||
};
|
};
|
||||||
|
|
||||||
extern "C" void DAC_IRQHandler();
|
extern "C" void DAC_IRQHandler();
|
||||||
@@ -195,8 +196,8 @@ extern void pushPrompt(uint16_t prompt, uint8_t id=0);
|
|||||||
#define STOP_PLAY(id) audioQueue.stopPlay((id))
|
#define STOP_PLAY(id) audioQueue.stopPlay((id))
|
||||||
#define AUDIO_RESET() audioQueue.reset()
|
#define AUDIO_RESET() audioQueue.reset()
|
||||||
#if defined(SDCARD)
|
#if defined(SDCARD)
|
||||||
#define PLAY_PHASE_OFF(phase) do { char filename[64]; if (isAudioFileAvailable((PHASE_AUDIO_CATEGORY << 24) + (phase << 16) + AUDIO_EVENT_OFF, filename)) audioQueue.playFile(filename); } while (0)
|
#define PLAY_PHASE_OFF(phase) do { char filename[AUDIO_FILENAME_MAXLEN+1]; if (isAudioFileAvailable((PHASE_AUDIO_CATEGORY << 24) + (phase << 16) + AUDIO_EVENT_OFF, filename)) audioQueue.playFile(filename); } while (0)
|
||||||
#define PLAY_PHASE_ON(phase) do { char filename[64]; if (isAudioFileAvailable((PHASE_AUDIO_CATEGORY << 24) + (phase << 16) + AUDIO_EVENT_ON, filename)) audioQueue.playFile(filename); } while (0)
|
#define PLAY_PHASE_ON(phase) do { char filename[AUDIO_FILENAME_MAXLEN+1]; if (isAudioFileAvailable((PHASE_AUDIO_CATEGORY << 24) + (phase << 16) + AUDIO_EVENT_ON, filename)) audioQueue.playFile(filename); } while (0)
|
||||||
#else
|
#else
|
||||||
#define PLAY_PHASE_OFF(phase)
|
#define PLAY_PHASE_OFF(phase)
|
||||||
#define PLAY_PHASE_ON(phase)
|
#define PLAY_PHASE_ON(phase)
|
||||||
|
|||||||
+19
-15
@@ -90,6 +90,23 @@ void checkMinMaxAltitude()
|
|||||||
if (frskyData.hub.baroAltitude_bp < frskyData.hub.minAltitude)
|
if (frskyData.hub.baroAltitude_bp < frskyData.hub.minAltitude)
|
||||||
frskyData.hub.minAltitude = frskyData.hub.baroAltitude_bp;
|
frskyData.hub.minAltitude = frskyData.hub.baroAltitude_bp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(VARIO)
|
||||||
|
void evalVario(int16_t altitude_bp, uint16_t altitude_ap)
|
||||||
|
{
|
||||||
|
int32_t varioAltitude_cm = (int32_t)altitude_bp * 100 + (altitude_bp > 0 ? altitude_ap : -altitude_ap);
|
||||||
|
uint8_t varioAltitudeQueuePointer = frskyData.hub.varioAltitudeQueuePointer + 1;
|
||||||
|
if (varioAltitudeQueuePointer == VARIO_QUEUE_LENGTH)
|
||||||
|
varioAltitudeQueuePointer = 0;
|
||||||
|
frskyData.hub.varioAltitudeQueuePointer = varioAltitudeQueuePointer;
|
||||||
|
frskyData.hub.varioSpeed -= frskyData.hub.varioAltitudeQueue[varioAltitudeQueuePointer] ;
|
||||||
|
frskyData.hub.varioAltitudeQueue[varioAltitudeQueuePointer] = varioAltitude_cm - frskyData.hub.varioAltitude_cm;
|
||||||
|
frskyData.hub.varioAltitude_cm = varioAltitude_cm;
|
||||||
|
frskyData.hub.varioSpeed += frskyData.hub.varioAltitudeQueue[varioAltitudeQueuePointer] ;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define evalVario(...)
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(FRSKY_HUB)
|
#if defined(FRSKY_HUB)
|
||||||
@@ -144,21 +161,6 @@ typedef enum {
|
|||||||
TS_XOR = 0x80 // decode stuffed byte
|
TS_XOR = 0x80 // decode stuffed byte
|
||||||
} TS_STATE;
|
} TS_STATE;
|
||||||
|
|
||||||
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 = frskyData.hub.varioAltitudeQueuePointer + 1;
|
|
||||||
if (varioAltitudeQueuePointer == VARIO_QUEUE_LENGTH)
|
|
||||||
varioAltitudeQueuePointer = 0;
|
|
||||||
frskyData.hub.varioAltitudeQueuePointer = varioAltitudeQueuePointer;
|
|
||||||
frskyData.hub.varioSpeed -= frskyData.hub.varioAltitudeQueue[varioAltitudeQueuePointer] ;
|
|
||||||
frskyData.hub.varioAltitudeQueue[varioAltitudeQueuePointer] = varioAltitude_cm - frskyData.hub.varioAltitude_cm;
|
|
||||||
frskyData.hub.varioAltitude_cm = varioAltitude_cm;
|
|
||||||
frskyData.hub.varioSpeed += frskyData.hub.varioAltitudeQueue[varioAltitudeQueuePointer] ;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void parseTelemHubByte(uint8_t byte)
|
void parseTelemHubByte(uint8_t byte)
|
||||||
{
|
{
|
||||||
static int8_t structPos;
|
static int8_t structPos;
|
||||||
@@ -361,9 +363,11 @@ void processFrskyPacket(uint8_t *packet)
|
|||||||
frskyData.rssi[0].set(packet[3]);
|
frskyData.rssi[0].set(packet[3]);
|
||||||
frskyData.rssi[1].set(packet[4] / 2);
|
frskyData.rssi[1].set(packet[4] / 2);
|
||||||
frskyStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected
|
frskyStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected
|
||||||
|
#if defined(VARIO)
|
||||||
uint8_t varioSource = g_model.frsky.varioSource - VARIO_SOURCE_A1;
|
uint8_t varioSource = g_model.frsky.varioSource - VARIO_SOURCE_A1;
|
||||||
if (varioSource < 2)
|
if (varioSource < 2)
|
||||||
frskyData.hub.varioSpeed = applyChannelRatio(varioSource, frskyData.analog[varioSource].value);
|
frskyData.hub.varioSpeed = applyChannelRatio(varioSource, frskyData.analog[varioSource].value);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#if defined(FRSKY_HUB) || defined (WS_HOW_HIGH)
|
#if defined(FRSKY_HUB) || defined (WS_HOW_HIGH)
|
||||||
|
|||||||
+22
-7
@@ -141,24 +141,39 @@ PACK(struct FrskyHubData {
|
|||||||
|
|
||||||
// TODO later uint16_t minVfas;
|
// TODO later uint16_t minVfas;
|
||||||
});
|
});
|
||||||
|
#define FRSKY_HUB_DATA FrskyHubData hub;
|
||||||
#elif defined(WS_HOW_HIGH)
|
#elif defined(WS_HOW_HIGH)
|
||||||
|
PACK(struct WSHowHighData {
|
||||||
PACK(struct FrskyHubData {
|
|
||||||
int16_t baroAltitude_bp; // 0..9,999 meters
|
int16_t baroAltitude_bp; // 0..9,999 meters
|
||||||
int16_t baroAltitudeOffset;
|
int16_t baroAltitudeOffset;
|
||||||
int16_t minAltitude;
|
int16_t minAltitude;
|
||||||
int16_t maxAltitude;
|
int16_t maxAltitude;
|
||||||
|
#if defined(VARIO)
|
||||||
|
int16_t varioAltitudeQueue[VARIO_QUEUE_LENGTH]; //circular buffer
|
||||||
|
uint8_t varioAltitudeQueuePointer; // circular-buffer pointer
|
||||||
|
int32_t varioAltitude_cm;
|
||||||
|
int16_t varioSpeed; // Vertical speed in cm/s
|
||||||
|
#endif
|
||||||
});
|
});
|
||||||
|
#define FRSKY_HUB_DATA WSHowHighData hub;
|
||||||
|
#elif defined(VARIO)
|
||||||
|
PACK(struct VarioData {
|
||||||
|
int16_t varioAltitudeQueue[VARIO_QUEUE_LENGTH]; //circular buffer
|
||||||
|
uint8_t varioAltitudeQueuePointer; // circular-buffer pointer
|
||||||
|
int32_t varioAltitude_cm;
|
||||||
|
int16_t varioSpeed; // Vertical speed in cm/s
|
||||||
|
});
|
||||||
|
#define FRSKY_HUB_DATA VarioData hub;
|
||||||
|
#else
|
||||||
|
#define FRSKY_HUB_DATA
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct FrskyData {
|
struct FrskyData {
|
||||||
FrskyValueWithMinMax analog[2];
|
FrskyValueWithMinMax analog[2];
|
||||||
FrskyValueWithMin rssi[2];
|
FrskyValueWithMin rssi[2];
|
||||||
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
|
|
||||||
FrskyHubData hub;
|
FRSKY_HUB_DATA
|
||||||
#endif
|
|
||||||
uint16_t currentConsumption;
|
uint16_t currentConsumption;
|
||||||
uint16_t currentPrescale;
|
uint16_t currentPrescale;
|
||||||
uint16_t power;
|
uint16_t power;
|
||||||
|
|||||||
+23
-7
@@ -138,6 +138,8 @@ enum menuGeneralSetupItems {
|
|||||||
ITEM_SETUP_BACKLIGHT_LABEL,
|
ITEM_SETUP_BACKLIGHT_LABEL,
|
||||||
ITEM_SETUP_BACKLIGHT_MODE,
|
ITEM_SETUP_BACKLIGHT_MODE,
|
||||||
ITEM_SETUP_BACKLIGHT_DELAY,
|
ITEM_SETUP_BACKLIGHT_DELAY,
|
||||||
|
CASE_PWM_BACKLIGHT(ITEM_SETUP_BACKLIGHT_BRIGHTNESS_OFF)
|
||||||
|
CASE_PWM_BACKLIGHT(ITEM_SETUP_BACKLIGHT_BRIGHTNESS_ON)
|
||||||
ITEM_SETUP_FLASH_BEEP,
|
ITEM_SETUP_FLASH_BEEP,
|
||||||
#if defined(SPLASH) && !defined(FSPLASH)
|
#if defined(SPLASH) && !defined(FSPLASH)
|
||||||
ITEM_SETUP_DISABLE_SPLASH,
|
ITEM_SETUP_DISABLE_SPLASH,
|
||||||
@@ -162,7 +164,7 @@ void menuGeneralSetup(uint8_t event)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MENU(STR_MENURADIOSETUP, menuTabDiag, e_Setup, ITEM_SETUP_MAX+1, {0, IF_RTCLOCK(2) IF_RTCLOCK(2) LABEL(SOUND), 0, 0, IF_AUDIO(0) IF_VOICE(0) IF_HAPTIC(LABEL(HAPTIC)) IF_HAPTIC(0) IF_HAPTIC(0) IF_HAPTIC(0) IF_PCBSKY9X(0) IF_9X(0) LABEL(ALARMS), 0, IF_PCBSKY9X(0) IF_CPUARM(0) 0, 0, 0, IF_ROTARY_ENCODERS(0) 0, LABEL(TIMER_EVENTS), 0, 0, LABEL(BACKLIGHT), 0, 0, 0, IF_SPLASH(0) IF_FRSKY(0) IF_FRSKY(0) 0, LABEL(TX_MODE), CASE_PCBX9D(0) 1/*to force edit mode*/});
|
MENU(STR_MENURADIOSETUP, menuTabDiag, e_Setup, ITEM_SETUP_MAX+1, {0, IF_RTCLOCK(2) IF_RTCLOCK(2) LABEL(SOUND), 0, 0, IF_AUDIO(0) IF_VOICE(0) IF_HAPTIC(LABEL(HAPTIC)) IF_HAPTIC(0) IF_HAPTIC(0) IF_HAPTIC(0) IF_PCBSKY9X(0) IF_9X(0) LABEL(ALARMS), 0, IF_PCBSKY9X(0) IF_CPUARM(0) 0, 0, 0, IF_ROTARY_ENCODERS(0) 0, LABEL(TIMER_EVENTS), 0, 0, LABEL(BACKLIGHT), 0, 0, CASE_PWM_BACKLIGHT(0) CASE_PWM_BACKLIGHT(0) 0, IF_SPLASH(0) IF_FRSKY(0) IF_FRSKY(0) 0, LABEL(TX_MODE), CASE_PCBX9D(0) 1/*to force edit mode*/});
|
||||||
|
|
||||||
uint8_t sub = m_posVert - 1;
|
uint8_t sub = m_posVert - 1;
|
||||||
|
|
||||||
@@ -382,15 +384,15 @@ void menuGeneralSetup(uint8_t event)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ITEM_SETUP_THROTTLE_REVERSED:
|
case ITEM_SETUP_THROTTLE_REVERSED:
|
||||||
g_eeGeneral.throttleReversed = onoffMenuItem( g_eeGeneral.throttleReversed, RADIO_SETUP_2ND_COLUMN, y, STR_THROTTLEREVERSE, attr, event ) ;
|
g_eeGeneral.throttleReversed = onoffMenuItem(g_eeGeneral.throttleReversed, RADIO_SETUP_2ND_COLUMN, y, STR_THROTTLEREVERSE, attr, event ) ;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ITEM_SETUP_MINUTE_BEEP:
|
case ITEM_SETUP_MINUTE_BEEP:
|
||||||
g_eeGeneral.minuteBeep = onoffMenuItem( g_eeGeneral.minuteBeep, RADIO_SETUP_2ND_COLUMN, y, STR_MINUTEBEEP, attr, event ) ;
|
g_eeGeneral.minuteBeep = onoffMenuItem(g_eeGeneral.minuteBeep, RADIO_SETUP_2ND_COLUMN, y, STR_MINUTEBEEP, attr, event ) ;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ITEM_SETUP_COUNTDOWN_BEEP:
|
case ITEM_SETUP_COUNTDOWN_BEEP:
|
||||||
g_eeGeneral.preBeep = onoffMenuItem( g_eeGeneral.preBeep, RADIO_SETUP_2ND_COLUMN, y, STR_BEEPCOUNTDOWN, attr, event ) ;
|
g_eeGeneral.preBeep = onoffMenuItem(g_eeGeneral.preBeep, RADIO_SETUP_2ND_COLUMN, y, STR_BEEPCOUNTDOWN, attr, event ) ;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ITEM_SETUP_BACKLIGHT_MODE:
|
case ITEM_SETUP_BACKLIGHT_MODE:
|
||||||
@@ -402,16 +404,30 @@ void menuGeneralSetup(uint8_t event)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ITEM_SETUP_FLASH_BEEP:
|
case ITEM_SETUP_FLASH_BEEP:
|
||||||
g_eeGeneral.flashBeep = onoffMenuItem( g_eeGeneral.flashBeep, RADIO_SETUP_2ND_COLUMN, y, STR_ALARM, attr, event ) ;
|
g_eeGeneral.flashBeep = onoffMenuItem(g_eeGeneral.flashBeep, RADIO_SETUP_2ND_COLUMN, y, STR_ALARM, attr, event ) ;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ITEM_SETUP_BACKLIGHT_DELAY:
|
case ITEM_SETUP_BACKLIGHT_DELAY:
|
||||||
lcd_putsLeft( y, STR_BLDELAY);
|
lcd_putsLeft(y, STR_BLDELAY);
|
||||||
lcd_outdezAtt(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.lightAutoOff*5, attr|LEFT);
|
lcd_outdezAtt(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.lightAutoOff*5, attr|LEFT);
|
||||||
lcd_putc(lcdLastPos, y, 's');
|
lcd_putc(lcdLastPos, y, 's');
|
||||||
if(attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.lightAutoOff, 0, 600/5);
|
if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.lightAutoOff, 0, 600/5);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#if defined(PWM_BACKLIGHT)
|
||||||
|
case ITEM_SETUP_BACKLIGHT_BRIGHTNESS_OFF:
|
||||||
|
lcd_putsLeft(y, STR_BLOFFBRIGHTNESS);
|
||||||
|
lcd_outdezAtt(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.blOffBright, attr|LEFT);
|
||||||
|
if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.blOffBright, 0, 15);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ITEM_SETUP_BACKLIGHT_BRIGHTNESS_ON:
|
||||||
|
lcd_putsLeft(y, STR_BLONBRIGHTNESS);
|
||||||
|
lcd_outdezAtt(RADIO_SETUP_2ND_COLUMN, y, 15-g_eeGeneral.blOnBright, attr|LEFT);
|
||||||
|
if (attr) g_eeGeneral.blOnBright = 15 - checkIncDecGen(event, 15-g_eeGeneral.blOnBright, 0, 15);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(SPLASH) && !defined(FSPLASH)
|
#if defined(SPLASH) && !defined(FSPLASH)
|
||||||
case ITEM_SETUP_DISABLE_SPLASH:
|
case ITEM_SETUP_DISABLE_SPLASH:
|
||||||
{
|
{
|
||||||
|
|||||||
+1
-1
@@ -44,7 +44,7 @@ const pm_char * openLogs()
|
|||||||
// Determine and set log file filename
|
// Determine and set log file filename
|
||||||
FRESULT result;
|
FRESULT result;
|
||||||
DIR folder;
|
DIR folder;
|
||||||
char filename[24];
|
char filename[32];
|
||||||
|
|
||||||
if (!sdMounted())
|
if (!sdMounted())
|
||||||
return STR_NO_SDCARD;
|
return STR_NO_SDCARD;
|
||||||
|
|||||||
+10
-6
@@ -718,23 +718,27 @@ int8_t switchMenuItem(uint8_t x, uint8_t y, int8_t value, LcdFlags attr, uint8_t
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if defined(GVARS)
|
#if defined(GVARS)
|
||||||
int8_t gvarMenuItem(uint8_t x, uint8_t y, int8_t value, int8_t min, int8_t max, LcdFlags attr, uint8_t event)
|
int16_t gvarMenuItem(uint8_t x, uint8_t y, int16_t value, int8_t min, int8_t max, LcdFlags attr, uint8_t event)
|
||||||
{
|
{
|
||||||
bool invers = attr&INVERS;
|
uint8_t delta = (max <= 100 ? GV1_SMALL-1 : GV1_LARGE-1);
|
||||||
|
bool invers = (attr & INVERS);
|
||||||
if (invers && event == EVT_KEY_LONG(KEY_ENTER)) {
|
if (invers && event == EVT_KEY_LONG(KEY_ENTER)) {
|
||||||
s_editMode = !s_editMode;
|
s_editMode = !s_editMode;
|
||||||
value = ((value >= 126 || value <= -126) ? GET_GVAR(value, min, max, s_perout_flight_phase) : 126);
|
value = (value > max ? GET_GVAR(value, min, max, s_perout_flight_phase) : delta+1);
|
||||||
eeDirty(EE_MODEL);
|
eeDirty(EE_MODEL);
|
||||||
}
|
}
|
||||||
if (value >= 126 || value <= -126 || (max <= 120 && value >= 121)) {
|
if (value > max) {
|
||||||
if (attr & LEFT)
|
if (attr & LEFT)
|
||||||
attr -= LEFT; /* because of ZCHAR */
|
attr -= LEFT; /* because of ZCHAR */
|
||||||
else
|
else
|
||||||
x -= 2*FW+FWNUM;
|
x -= 2*FW+FWNUM;
|
||||||
int8_t idx = value - 125;
|
int8_t idx = value - delta;
|
||||||
|
if (invers) {
|
||||||
|
CHECK_INCDEC_MODELVAR(event, idx, -4, +5);
|
||||||
|
value = (int16_t)idx + delta;
|
||||||
|
}
|
||||||
if (idx <= 0) { idx = 1-idx; lcd_putcAtt(x-6, y, '-', attr); }
|
if (idx <= 0) { idx = 1-idx; lcd_putcAtt(x-6, y, '-', attr); }
|
||||||
putsStrIdx(x, y, STR_GV, idx, attr);
|
putsStrIdx(x, y, STR_GV, idx, attr);
|
||||||
if (invers) value = checkIncDec(event, (uint8_t)value, max <= 120 ? 121 : 126, 130, EE_MODEL);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
lcd_outdezAtt(x, y, value, attr);
|
lcd_outdezAtt(x, y, value, attr);
|
||||||
|
|||||||
+3
-1
@@ -231,10 +231,12 @@ TITLE(title)
|
|||||||
int8_t selectMenuItem(uint8_t x, uint8_t y, const pm_char *label, const pm_char *values, int8_t value, int8_t min, int8_t max, LcdFlags attr, uint8_t event);
|
int8_t selectMenuItem(uint8_t x, uint8_t y, const pm_char *label, const pm_char *values, int8_t value, int8_t min, int8_t max, LcdFlags attr, uint8_t event);
|
||||||
uint8_t onoffMenuItem(uint8_t value, uint8_t x, uint8_t y, const pm_char *label, LcdFlags attr, uint8_t event );
|
uint8_t onoffMenuItem(uint8_t value, uint8_t x, uint8_t y, const pm_char *label, LcdFlags attr, uint8_t event );
|
||||||
int8_t switchMenuItem(uint8_t x, uint8_t y, int8_t value, LcdFlags attr, uint8_t event);
|
int8_t switchMenuItem(uint8_t x, uint8_t y, int8_t value, LcdFlags attr, uint8_t event);
|
||||||
int8_t gvarMenuItem(uint8_t x, uint8_t y, int8_t value, int8_t min, int8_t max, LcdFlags attr, uint8_t event);
|
|
||||||
#if defined(GVARS)
|
#if defined(GVARS)
|
||||||
|
int16_t gvarMenuItem(uint8_t x, uint8_t y, int16_t value, int8_t min, int8_t max, LcdFlags attr, uint8_t event);
|
||||||
#define displayGVar(x, y, v) gvarMenuItem(x, y, v, 0, 0, 0, 0)
|
#define displayGVar(x, y, v) gvarMenuItem(x, y, v, 0, 0, 0, 0)
|
||||||
#else
|
#else
|
||||||
|
int8_t gvarMenuItem(uint8_t x, uint8_t y, int8_t value, int8_t min, int8_t max, LcdFlags attr, uint8_t event);
|
||||||
#define displayGVar(x, y, v) lcd_outdez8(x, y, v)
|
#define displayGVar(x, y, v) lcd_outdez8(x, y, v)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
+39
-6
@@ -1771,7 +1771,7 @@ bool swapExpoMix(uint8_t expo, uint8_t &idx, uint8_t up)
|
|||||||
|
|
||||||
enum ExposFields {
|
enum ExposFields {
|
||||||
IF_CPUARM(EXPO_FIELD_NAME)
|
IF_CPUARM(EXPO_FIELD_NAME)
|
||||||
EXPO_FIELD_WIDTH,
|
EXPO_FIELD_WEIGHT,
|
||||||
EXPO_FIELD_EXPO,
|
EXPO_FIELD_EXPO,
|
||||||
IF_CURVES(EXPO_FIELD_CURVE)
|
IF_CURVES(EXPO_FIELD_CURVE)
|
||||||
IF_FLIGHT_PHASES(EXPO_FIELD_FLIGHT_PHASE)
|
IF_FLIGHT_PHASES(EXPO_FIELD_FLIGHT_PHASE)
|
||||||
@@ -1800,7 +1800,7 @@ void menuModelExpoOne(uint8_t event)
|
|||||||
editSingleName(EXPO_ONE_2ND_COLUMN+3*FW-sizeof(ed->name)*FW, y, STR_EXPONAME, ed->name, sizeof(ed->name), event, attr);
|
editSingleName(EXPO_ONE_2ND_COLUMN+3*FW-sizeof(ed->name)*FW, y, STR_EXPONAME, ed->name, sizeof(ed->name), event, attr);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case EXPO_FIELD_WIDTH:
|
case EXPO_FIELD_WEIGHT:
|
||||||
lcd_putsLeft(y, STR_WEIGHT);
|
lcd_putsLeft(y, STR_WEIGHT);
|
||||||
ed->weight = gvarMenuItem(EXPO_ONE_2ND_COLUMN+3*FW, y, ed->weight, 0, 100, attr, event);
|
ed->weight = gvarMenuItem(EXPO_ONE_2ND_COLUMN+3*FW, y, ed->weight, 0, 100, attr, event);
|
||||||
break;
|
break;
|
||||||
@@ -1881,6 +1881,24 @@ enum MixFields {
|
|||||||
MIX_FIELD_COUNT
|
MIX_FIELD_COUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void gvarWeightItem(xcoord_t x, uint8_t y, MixData *md, uint8_t attr, uint8_t event)
|
||||||
|
{
|
||||||
|
#if defined(CPUARM) || !defined(GVARS)
|
||||||
|
md->weight = gvarMenuItem(x, y, md->weight, -125, 125, attr, event);
|
||||||
|
#else
|
||||||
|
int16_t weight = (md->weightMode ? (int16_t)GV1_LARGE + md->weight : md->weight);
|
||||||
|
weight = gvarMenuItem(x, y, weight, -125, 125, attr, event);
|
||||||
|
if (weight <= 125) {
|
||||||
|
md->weightMode = 0;
|
||||||
|
md->weight = weight;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
md->weightMode = 1;
|
||||||
|
md->weight = weight - GV1_LARGE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void menuModelMixOne(uint8_t event)
|
void menuModelMixOne(uint8_t event)
|
||||||
{
|
{
|
||||||
#if defined(PCBX9D)
|
#if defined(PCBX9D)
|
||||||
@@ -1948,12 +1966,27 @@ void menuModelMixOne(uint8_t event)
|
|||||||
break;
|
break;
|
||||||
case MIX_FIELD_WEIGHT:
|
case MIX_FIELD_WEIGHT:
|
||||||
lcd_putsColumnLeft(COLUMN_X, y, STR_WEIGHT);
|
lcd_putsColumnLeft(COLUMN_X, y, STR_WEIGHT);
|
||||||
md2->weight = gvarMenuItem(COLUMN_X+MIXES_2ND_COLUMN, y, md2->weight, -125, 125, attr|LEFT, event);
|
gvarWeightItem(COLUMN_X+MIXES_2ND_COLUMN, y, md2, attr|LEFT, event);
|
||||||
break;
|
break;
|
||||||
case MIX_FIELD_OFFSET:
|
case MIX_FIELD_OFFSET:
|
||||||
|
{
|
||||||
lcd_putsColumnLeft(COLUMN_X, y, NO_INDENT(STR_OFFSET));
|
lcd_putsColumnLeft(COLUMN_X, y, NO_INDENT(STR_OFFSET));
|
||||||
md2->offset = gvarMenuItem(COLUMN_X+MIXES_2ND_COLUMN, y, md2->offset, -125, 125, attr|LEFT, event);
|
#if defined(GVARS)
|
||||||
|
int16_t offset = (md2->offsetMode ? (int16_t)GV1_LARGE + md2->offset : md2->offset);
|
||||||
|
offset = gvarMenuItem(COLUMN_X+MIXES_2ND_COLUMN, y, offset, -125, 125, attr|LEFT, event);
|
||||||
|
if (offset <= 125) {
|
||||||
|
md2->offsetMode = 0;
|
||||||
|
md2->offset = offset;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
md2->offsetMode = 1;
|
||||||
|
md2->offset = offset - GV1_LARGE;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
md2->offset = gvarMenuItem(COLUMN_X+MIXES_2ND_COLUMN, y, md2->offset, -125, 125, attr|LEFT, event);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case MIX_FIELD_TRIM:
|
case MIX_FIELD_TRIM:
|
||||||
{
|
{
|
||||||
uint8_t not_stick = (md2->srcRaw > NUM_STICKS);
|
uint8_t not_stick = (md2->srcRaw > NUM_STICKS);
|
||||||
@@ -2258,7 +2291,7 @@ void menuModelExpoMix(uint8_t expo, uint8_t event)
|
|||||||
|
|
||||||
putsMixerSource(4*FW+0, y, md->srcRaw, isMixActive(i) ? BOLD : 0);
|
putsMixerSource(4*FW+0, y, md->srcRaw, isMixActive(i) ? BOLD : 0);
|
||||||
|
|
||||||
md->weight = gvarMenuItem(11*FW+3, y, md->weight, -125, 125, attr, event);
|
gvarWeightItem(11*FW+3, y, md, attr, event);
|
||||||
|
|
||||||
#if defined(CPUARM)
|
#if defined(CPUARM)
|
||||||
if (md->name[0]) {
|
if (md->name[0]) {
|
||||||
@@ -3425,7 +3458,7 @@ void menuModelTelemetry(uint8_t event)
|
|||||||
CHECK_INCDEC_MODELVAR(event, g_model.frsky.varioMin, -7, 7);
|
CHECK_INCDEC_MODELVAR(event, g_model.frsky.varioMin, -7, 7);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
CHECK_INCDEC_MODELVAR(event, g_model.frsky.varioCenterMin, -15, 5+min<int8_t>(0, g_model.frsky.varioCenterMax+5));
|
CHECK_INCDEC_MODELVAR(event, g_model.frsky.varioCenterMin, -15, 5+min<int8_t>(10, g_model.frsky.varioCenterMax+5));
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
CHECK_INCDEC_MODELVAR(event, g_model.frsky.varioCenterMax, -5+max<int8_t>(-10, g_model.frsky.varioCenterMin-5), +15);
|
CHECK_INCDEC_MODELVAR(event, g_model.frsky.varioCenterMax, -5+max<int8_t>(-10, g_model.frsky.varioCenterMin-5), +15);
|
||||||
|
|||||||
+32
-18
@@ -174,7 +174,8 @@ PACK(typedef struct t_EEGeneral {
|
|||||||
uint8_t preBeep:1;
|
uint8_t preBeep:1;
|
||||||
SPLASH_MODE; /* 3bits */
|
SPLASH_MODE; /* 3bits */
|
||||||
int8_t hapticMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all
|
int8_t hapticMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all
|
||||||
uint8_t spare3;
|
uint8_t blOffBright:4;
|
||||||
|
uint8_t blOnBright:4;
|
||||||
uint8_t lightAutoOff;
|
uint8_t lightAutoOff;
|
||||||
uint8_t templateSetup; //RETA order according to chout_ar array
|
uint8_t templateSetup; //RETA order according to chout_ar array
|
||||||
int8_t PPM_Multiplier;
|
int8_t PPM_Multiplier;
|
||||||
@@ -263,23 +264,24 @@ PACK(typedef struct t_LimitData {
|
|||||||
PACK(typedef struct t_MixData {
|
PACK(typedef struct t_MixData {
|
||||||
uint8_t destCh;
|
uint8_t destCh;
|
||||||
uint16_t phases;
|
uint16_t phases;
|
||||||
uint8_t curveMode:1; // O=curve, 1=differential
|
uint8_t curveMode:1; // O=curve, 1=differential
|
||||||
uint8_t noExpo:1;
|
uint8_t noExpo:1;
|
||||||
int8_t carryTrim:3;
|
int8_t carryTrim:3;
|
||||||
uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means :=
|
uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means :=
|
||||||
uint8_t spare:1;
|
uint8_t offsetMode:1; // TODO change offset to 16bits in future EEPROM
|
||||||
int16_t weight;
|
int16_t weight;
|
||||||
int8_t swtch;
|
int8_t swtch;
|
||||||
int8_t curveParam;
|
int8_t curveParam;
|
||||||
uint8_t mixWarn; // mixer warning
|
uint8_t mixWarn; // mixer warning
|
||||||
uint8_t delayUp;
|
uint8_t delayUp;
|
||||||
uint8_t delayDown;
|
uint8_t delayDown;
|
||||||
uint8_t speedUp;
|
uint8_t speedUp;
|
||||||
uint8_t speedDown;
|
uint8_t speedDown;
|
||||||
uint8_t srcRaw;
|
uint8_t srcRaw;
|
||||||
int8_t offset;
|
int8_t offset;
|
||||||
char name[LEN_EXPOMIX_NAME];
|
char name[LEN_EXPOMIX_NAME];
|
||||||
}) MixData;
|
}) MixData;
|
||||||
|
#define MD_WEIGHT(md) (md->weight)
|
||||||
#else
|
#else
|
||||||
#define DELAY_STEP 2
|
#define DELAY_STEP 2
|
||||||
#define SLOW_STEP 2
|
#define SLOW_STEP 2
|
||||||
@@ -289,7 +291,8 @@ PACK(typedef struct t_MixData {
|
|||||||
uint8_t destCh:4; // 0, 1..NUM_CHNOUT
|
uint8_t destCh:4; // 0, 1..NUM_CHNOUT
|
||||||
uint8_t curveMode:1; // O=curve, 1=differential
|
uint8_t curveMode:1; // O=curve, 1=differential
|
||||||
uint8_t noExpo:1;
|
uint8_t noExpo:1;
|
||||||
uint8_t spare:2;
|
uint8_t weightMode:1;
|
||||||
|
uint8_t offsetMode:1;
|
||||||
int8_t weight;
|
int8_t weight;
|
||||||
int8_t swtch:6;
|
int8_t swtch:6;
|
||||||
uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means :=
|
uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means :=
|
||||||
@@ -304,6 +307,17 @@ PACK(typedef struct t_MixData {
|
|||||||
int8_t curveParam;
|
int8_t curveParam;
|
||||||
int8_t offset;
|
int8_t offset;
|
||||||
}) MixData;
|
}) MixData;
|
||||||
|
#if defined(GVARS)
|
||||||
|
#define MD_WEIGHT(md) (md->weightMode ? (int16_t)GV1_LARGE+md->weight : md->weight)
|
||||||
|
#else
|
||||||
|
#define MD_WEIGHT(md) (md->weight)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(GVARS)
|
||||||
|
#define MD_OFFSET(md) (md->offsetMode ? (int16_t)GV1_LARGE+md->offset : md->offset)
|
||||||
|
#else
|
||||||
|
#define MD_OFFSET(md) (md->offset)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CPUARM)
|
#if defined(CPUARM)
|
||||||
|
|||||||
+27
-22
@@ -188,8 +188,6 @@ uint8_t zlen(const char *str, uint8_t size)
|
|||||||
|
|
||||||
char * strcat_zchar(char * dest, char * name, uint8_t size, const char *defaultName, uint8_t defaultNameSize, uint8_t defaultIdx)
|
char * strcat_zchar(char * dest, char * name, uint8_t size, const char *defaultName, uint8_t defaultNameSize, uint8_t defaultIdx)
|
||||||
{
|
{
|
||||||
// TODO review if all if are needed
|
|
||||||
|
|
||||||
int8_t len = 0;
|
int8_t len = 0;
|
||||||
|
|
||||||
if (name) {
|
if (name) {
|
||||||
@@ -278,6 +276,11 @@ void per10ms()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// These moved here from perOut() to improve beep trigger reliability.
|
// These moved here from perOut() to improve beep trigger reliability.
|
||||||
|
#if defined(PWM_BACKLIGHT)
|
||||||
|
if (g_tmr10ms % 4 == 0)
|
||||||
|
fadeBacklight(); // increment or decrement brightness until target brightness is reached
|
||||||
|
#endif
|
||||||
|
|
||||||
if(mixWarning & 1) if(((g_tmr10ms&0xFF)== 0)) AUDIO_MIX_WARNING_1();
|
if(mixWarning & 1) if(((g_tmr10ms&0xFF)== 0)) AUDIO_MIX_WARNING_1();
|
||||||
if(mixWarning & 2) if(((g_tmr10ms&0xFF)== 64) || ((g_tmr10ms&0xFF)== 72)) AUDIO_MIX_WARNING_2();
|
if(mixWarning & 2) if(((g_tmr10ms&0xFF)== 64) || ((g_tmr10ms&0xFF)== 72)) AUDIO_MIX_WARNING_2();
|
||||||
if(mixWarning & 4) if(((g_tmr10ms&0xFF)==128) || ((g_tmr10ms&0xFF)==136) || ((g_tmr10ms&0xFF)==144)) AUDIO_MIX_WARNING_3();
|
if(mixWarning & 4) if(((g_tmr10ms&0xFF)==128) || ((g_tmr10ms&0xFF)==136) || ((g_tmr10ms&0xFF)==144)) AUDIO_MIX_WARNING_3();
|
||||||
@@ -1070,20 +1073,21 @@ uint8_t s_gvar_timer = 0;
|
|||||||
uint8_t s_gvar_last = 0;
|
uint8_t s_gvar_last = 0;
|
||||||
|
|
||||||
#if defined(CPUM64)
|
#if defined(CPUM64)
|
||||||
int16_t getGVarValue(int8_t x, int16_t min, int16_t max)
|
int16_t getGVarValue(int16_t x, int16_t min, int16_t max)
|
||||||
{
|
{
|
||||||
if (x >= -125 && x <= (max <= 120 ? 120 : 125))
|
if (x > max) {
|
||||||
return x;
|
int8_t idx = (max <= 100 ? x - GV1_SMALL : x - GV1_LARGE);
|
||||||
|
int8_t mul = 1;
|
||||||
|
|
||||||
int8_t idx = (uint8_t)x - 126;
|
if (idx < 0) {
|
||||||
int8_t mul = 1;
|
idx = 1-idx;
|
||||||
|
mul = -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (idx < 0) {
|
x = GVAR_VALUE(idx, -1) * mul;
|
||||||
idx = 1-idx;
|
|
||||||
mul = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return limit(min, GVAR_VALUE(idx, -1), max) * mul;
|
return limit(min, x, max);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setGVarValue(uint8_t idx, int8_t value)
|
void setGVarValue(uint8_t idx, int8_t value)
|
||||||
@@ -1109,20 +1113,21 @@ uint8_t getGVarFlightPhase(uint8_t phase, uint8_t idx)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t getGVarValue(int8_t x, int16_t min, int16_t max, int8_t phase)
|
int16_t getGVarValue(int16_t x, int16_t min, int16_t max, int8_t phase)
|
||||||
{
|
{
|
||||||
if (x >= -125 && x <= (max <= 120 ? 120 : 125))
|
if (x > max) {
|
||||||
return x;
|
int8_t idx = (max <= 100 ? x - GV1_SMALL : x - GV1_LARGE);
|
||||||
|
int8_t mul = 1;
|
||||||
|
|
||||||
int8_t idx = (uint8_t)x - 126;
|
if (idx < 0) {
|
||||||
int8_t mul = 1;
|
idx = 1-idx;
|
||||||
|
mul = -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (idx < 0) {
|
x = GVAR_VALUE(idx, getGVarFlightPhase(phase, idx)) * mul;
|
||||||
idx = 1-idx;
|
|
||||||
mul = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return limit(min, GVAR_VALUE(idx, getGVarFlightPhase(phase, idx)), max) * mul;
|
return limit(min, x, max);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setGVarValue(uint8_t idx, int8_t value, int8_t phase)
|
void setGVarValue(uint8_t idx, int8_t value, int8_t phase)
|
||||||
@@ -2486,7 +2491,7 @@ void perOut(uint8_t mode, uint8_t tick10ms)
|
|||||||
|
|
||||||
//========== OFFSET ===============
|
//========== OFFSET ===============
|
||||||
if (apply_offset_and_curve) {
|
if (apply_offset_and_curve) {
|
||||||
int8_t offset = GET_GVAR(md->offset, -125, 125, s_perout_flight_phase);
|
int8_t offset = GET_GVAR(MD_OFFSET(md), -125, 125, s_perout_flight_phase);
|
||||||
if (offset) v += calc100toRESX(offset);
|
if (offset) v += calc100toRESX(offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2507,7 +2512,7 @@ void perOut(uint8_t mode, uint8_t tick10ms)
|
|||||||
v = applyCurve(v, md->curveParam);
|
v = applyCurve(v, md->curveParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t weight = GET_GVAR(md->weight, -500, 500, s_perout_flight_phase);
|
int16_t weight = GET_GVAR(MD_WEIGHT(md), -500, 500, s_perout_flight_phase);
|
||||||
|
|
||||||
//========== SPEED ===============
|
//========== SPEED ===============
|
||||||
if (mode == e_perout_mode_normal && (md->speedUp || md->speedDown)) { // there are delay values
|
if (mode == e_perout_mode_normal && (md->speedUp || md->speedDown)) { // there are delay values
|
||||||
|
|||||||
+12
-5
@@ -84,6 +84,12 @@
|
|||||||
#define IF_VOICE(x)
|
#define IF_VOICE(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(PWM_BACKLIGHT)
|
||||||
|
#define CASE_PWM_BACKLIGHT(x) x,
|
||||||
|
#else
|
||||||
|
#define CASE_PWM_BACKLIGHT(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(VARIO)
|
#if defined(VARIO)
|
||||||
#define IF_VARIO(x) x,
|
#define IF_VARIO(x) x,
|
||||||
#else
|
#else
|
||||||
@@ -725,17 +731,19 @@ inline bool navigationRotaryEncoder(uint8_t event)
|
|||||||
|
|
||||||
#if defined(GVARS)
|
#if defined(GVARS)
|
||||||
#if defined(CPUM64)
|
#if defined(CPUM64)
|
||||||
int16_t getGVarValue(int8_t x, int16_t min, int16_t max);
|
int16_t getGVarValue(int16_t x, int16_t min, int16_t max);
|
||||||
void setGVarValue(uint8_t x, int8_t value);
|
void setGVarValue(uint8_t x, int8_t value);
|
||||||
#define GET_GVAR(x, min, max, p) getGVarValue(x, min, max)
|
#define GET_GVAR(x, min, max, p) getGVarValue(x, min, max)
|
||||||
#define SET_GVAR(idx, val, p) setGVarValue(idx, val)
|
#define SET_GVAR(idx, val, p) setGVarValue(idx, val)
|
||||||
#else
|
#else
|
||||||
uint8_t getGVarFlightPhase(uint8_t phase, uint8_t idx);
|
uint8_t getGVarFlightPhase(uint8_t phase, uint8_t idx);
|
||||||
int16_t getGVarValue(int8_t x, int16_t min, int16_t max, int8_t phase);
|
int16_t getGVarValue(int16_t x, int16_t min, int16_t max, int8_t phase);
|
||||||
void setGVarValue(uint8_t x, int8_t value, int8_t phase);
|
void setGVarValue(uint8_t x, int8_t value, int8_t phase);
|
||||||
#define GET_GVAR(x, min, max, p) getGVarValue(x, min, max, p)
|
#define GET_GVAR(x, min, max, p) getGVarValue(x, min, max, p)
|
||||||
#define SET_GVAR(idx, val, p) setGVarValue(idx, val, p)
|
#define SET_GVAR(idx, val, p) setGVarValue(idx, val, p)
|
||||||
#endif
|
#endif
|
||||||
|
#define GV1_SMALL 123
|
||||||
|
#define GV1_LARGE 1024
|
||||||
#define GVAR_DISPLAY_TIME 100 /*1 second*/;
|
#define GVAR_DISPLAY_TIME 100 /*1 second*/;
|
||||||
extern uint8_t s_gvar_timer;
|
extern uint8_t s_gvar_timer;
|
||||||
extern uint8_t s_gvar_last;
|
extern uint8_t s_gvar_last;
|
||||||
@@ -1229,9 +1237,8 @@ void putsTelemetryValue(xcoord_t x, uint8_t y, lcdint_t val, uint8_t unit, uint8
|
|||||||
uint8_t zlen(const char *str, uint8_t size);
|
uint8_t zlen(const char *str, uint8_t size);
|
||||||
char * strcat_zchar(char * dest, char * name, uint8_t size, const char *defaultName, uint8_t defaultNameSize, uint8_t defaultIdx);
|
char * strcat_zchar(char * dest, char * name, uint8_t size, const char *defaultName, uint8_t defaultNameSize, uint8_t defaultIdx);
|
||||||
#define strcat_modelname(dest, idx) strcat_zchar(dest, modelNames[idx], LEN_MODEL_NAME, STR_MODEL, PSIZE(TR_MODEL), idx+1)
|
#define strcat_modelname(dest, idx) strcat_zchar(dest, modelNames[idx], LEN_MODEL_NAME, STR_MODEL, PSIZE(TR_MODEL), idx+1)
|
||||||
#define strcat_phasename_default(dest, idx) strcat_zchar(dest, NULL, 0, STR_FP, PSIZE(TR_FP), idx)
|
#define strcat_phasename(dest, idx) strcat_zchar(dest, g_model.phaseData[idx].name, LEN_FP_NAME, NULL, 0, 0)
|
||||||
#define strcat_phasename_nodefault(dest, idx) strcat_zchar(dest, g_model.phaseData[idx].name, LEN_FP_NAME, NULL, 0, 0)
|
#define strcat_mixername(dest, idx) strcat_zchar(dest, g_model.mixData[idx].name, LEN_EXPOMIX_NAME, NULL, 0, 0)
|
||||||
#define strcat_mixername_nodefault(dest, idx) strcat_zchar(dest, g_model.mixData[idx].name, LEN_EXPOMIX_NAME, NULL, 0, 0)
|
|
||||||
#define ZLEN(s) zlen(s, sizeof(s))
|
#define ZLEN(s) zlen(s, sizeof(s))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -64,6 +64,15 @@ inline void boardInit()
|
|||||||
OCR0 = 156;
|
OCR0 = 156;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(PWM_BACKLIGHT)
|
||||||
|
/** Smartieparts LED Backlight is connected to PORTB/pin7, which can be used as pwm output of timer2 **/
|
||||||
|
#if defined(SP22)
|
||||||
|
TCCR2 = (0b011 << CS20)|(1<<WGM20)|(1<<COM21)|(1<<COM20); // inv. pwm mode, clk/64
|
||||||
|
#else
|
||||||
|
TCCR2 = (0b011 << CS20)|(1<<WGM20)|(1<<COM21); // pwm mode, clk/64
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
TIMSK |= (1<<OCIE0) | (1<<TOIE0); // Enable Output-Compare and Overflow interrrupts
|
TIMSK |= (1<<OCIE0) | (1<<TOIE0); // Enable Output-Compare and Overflow interrrupts
|
||||||
/********************************/
|
/********************************/
|
||||||
}
|
}
|
||||||
@@ -215,3 +224,41 @@ bool checkSlaveMode()
|
|||||||
}
|
}
|
||||||
return lastSlaveMode;
|
return lastSlaveMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(PWM_BACKLIGHT)
|
||||||
|
|
||||||
|
// exponential PWM table for linear brightness
|
||||||
|
static const uint16_t pwmtable[16] PROGMEM =
|
||||||
|
{
|
||||||
|
0, 2, 3, 4, 6, 8, 11, 16, 23, 32, 45, 64, 90, 128, 181, 255
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint8_t bl_target;
|
||||||
|
static uint8_t bl_current;
|
||||||
|
|
||||||
|
void backlightFadeOn()
|
||||||
|
{
|
||||||
|
bl_target = 15 - g_eeGeneral.blOnBright;
|
||||||
|
}
|
||||||
|
|
||||||
|
void backlightFadeOff()
|
||||||
|
{
|
||||||
|
bl_target = g_eeGeneral.blOffBright;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool getBackLightState()
|
||||||
|
{
|
||||||
|
return (bl_target==g_eeGeneral.blOnBright);
|
||||||
|
}
|
||||||
|
|
||||||
|
void fadeBacklight() //called from per10ms()
|
||||||
|
{
|
||||||
|
if (bl_target != bl_current) {
|
||||||
|
if (bl_target > bl_current)
|
||||||
|
OCR2 = pgm_read_word(&pwmtable[++bl_current]);
|
||||||
|
else
|
||||||
|
OCR2 = pgm_read_word(&pwmtable[--bl_current]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -83,6 +83,16 @@ bool checkSlaveMode();
|
|||||||
#define JACK_PPM_OUT() PORTG &= ~(1<<OUT_G_SIM_CTL)
|
#define JACK_PPM_OUT() PORTG &= ~(1<<OUT_G_SIM_CTL)
|
||||||
#define JACK_PPM_IN() PORTG |= (1<<OUT_G_SIM_CTL)
|
#define JACK_PPM_IN() PORTG |= (1<<OUT_G_SIM_CTL)
|
||||||
|
|
||||||
|
#if defined(PWM_BACKLIGHT)
|
||||||
|
void backlightFadeOn();
|
||||||
|
#define __BACKLIGHT_ON backlightFadeOn()
|
||||||
|
void backlightFadeOff();
|
||||||
|
#define __BACKLIGHT_OFF backlightFadeOff()
|
||||||
|
bool getBackLightState();
|
||||||
|
#define IS_BACKLIGHT_ON() getBackLightState()
|
||||||
|
void fadeBacklight();
|
||||||
|
#else
|
||||||
|
|
||||||
#if defined(SP22)
|
#if defined(SP22)
|
||||||
#define __BACKLIGHT_ON PORTB &= ~(1 << OUT_B_LIGHT)
|
#define __BACKLIGHT_ON PORTB &= ~(1 << OUT_B_LIGHT)
|
||||||
#define __BACKLIGHT_OFF PORTB |= (1 << OUT_B_LIGHT)
|
#define __BACKLIGHT_OFF PORTB |= (1 << OUT_B_LIGHT)
|
||||||
@@ -92,6 +102,7 @@ bool checkSlaveMode();
|
|||||||
#define __BACKLIGHT_OFF PORTB &= ~(1 << OUT_B_LIGHT)
|
#define __BACKLIGHT_OFF PORTB &= ~(1 << OUT_B_LIGHT)
|
||||||
#define IS_BACKLIGHT_ON() (PORTB & (1<<OUT_B_LIGHT))
|
#define IS_BACKLIGHT_ON() (PORTB & (1<<OUT_B_LIGHT))
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
// G: The following comments relate to the original stock PCB only
|
// G: The following comments relate to the original stock PCB only
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -186,6 +186,12 @@ const pm_char STR_MINUTEBEEP[] PROGMEM = TR_MINUTEBEEP;
|
|||||||
const pm_char STR_BEEPCOUNTDOWN[] PROGMEM = TR_BEEPCOUNTDOWN;
|
const pm_char STR_BEEPCOUNTDOWN[] PROGMEM = TR_BEEPCOUNTDOWN;
|
||||||
const pm_char STR_BACKLIGHT_LABEL[] PROGMEM = TR_BACKLIGHT_LABEL;
|
const pm_char STR_BACKLIGHT_LABEL[] PROGMEM = TR_BACKLIGHT_LABEL;
|
||||||
const pm_char STR_BLDELAY[] PROGMEM = TR_BLDELAY;
|
const pm_char STR_BLDELAY[] PROGMEM = TR_BLDELAY;
|
||||||
|
|
||||||
|
#if defined(PWM_BACKLIGHT)
|
||||||
|
const pm_char STR_BLONBRIGHTNESS[] PROGMEM = TR_BLONBRIGHTNESS;
|
||||||
|
const pm_char STR_BLOFFBRIGHTNESS[] PROGMEM = TR_BLOFFBRIGHTNESS;
|
||||||
|
#endif
|
||||||
|
|
||||||
const pm_char STR_SPLASHSCREEN[] PROGMEM = TR_SPLASHSCREEN;
|
const pm_char STR_SPLASHSCREEN[] PROGMEM = TR_SPLASHSCREEN;
|
||||||
const pm_char STR_THROTTLEWARNING[] PROGMEM = TR_THROTTLEWARNING;
|
const pm_char STR_THROTTLEWARNING[] PROGMEM = TR_THROTTLEWARNING;
|
||||||
const pm_char STR_SWITCHWARNING[] PROGMEM = TR_SWITCHWARNING;
|
const pm_char STR_SWITCHWARNING[] PROGMEM = TR_SWITCHWARNING;
|
||||||
|
|||||||
@@ -301,6 +301,10 @@ extern const pm_char STR_MINUTEBEEP[];
|
|||||||
extern const pm_char STR_BEEPCOUNTDOWN[];
|
extern const pm_char STR_BEEPCOUNTDOWN[];
|
||||||
extern const pm_char STR_BACKLIGHT_LABEL[];
|
extern const pm_char STR_BACKLIGHT_LABEL[];
|
||||||
extern const pm_char STR_BLDELAY[];
|
extern const pm_char STR_BLDELAY[];
|
||||||
|
#if defined(PWM_BACKLIGHT)
|
||||||
|
extern const pm_char STR_BLONBRIGHTNESS[];
|
||||||
|
extern const pm_char STR_BLOFFBRIGHTNESS[];
|
||||||
|
#endif
|
||||||
extern const pm_char STR_SPLASHSCREEN[];
|
extern const pm_char STR_SPLASHSCREEN[];
|
||||||
extern const pm_char STR_THROTTLEWARNING[];
|
extern const pm_char STR_THROTTLEWARNING[];
|
||||||
extern const pm_char STR_SWITCHWARNING[];
|
extern const pm_char STR_SWITCHWARNING[];
|
||||||
|
|||||||
@@ -370,6 +370,8 @@
|
|||||||
#define TR_BEEPCOUNTDOWN INDENT"Countdown"
|
#define TR_BEEPCOUNTDOWN INDENT"Countdown"
|
||||||
#define TR_BACKLIGHT_LABEL "Backlight"
|
#define TR_BACKLIGHT_LABEL "Backlight"
|
||||||
#define TR_BLDELAY INDENT"Duration"
|
#define TR_BLDELAY INDENT"Duration"
|
||||||
|
#define TR_BLONBRIGHTNESS INDENT"ON Brightness"
|
||||||
|
#define TR_BLOFFBRIGHTNESS INDENT"OFF Brightness"
|
||||||
#define TR_SPLASHSCREEN "Splash screen"
|
#define TR_SPLASHSCREEN "Splash screen"
|
||||||
#define TR_THROTTLEWARNING TR("T-Warning","Throttle Warning")
|
#define TR_THROTTLEWARNING TR("T-Warning","Throttle Warning")
|
||||||
#define TR_SWITCHWARNING TR("S-Warning","Switch Warning")
|
#define TR_SWITCHWARNING TR("S-Warning","Switch Warning")
|
||||||
|
|||||||
Reference in New Issue
Block a user