Vario. Port from unstable branch. Part 1.

This commit is contained in:
bsongis
2012-04-27 15:36:17 +00:00
parent d39c35439a
commit a2ade445ac
9 changed files with 134 additions and 41 deletions
+29 -15
View File
@@ -162,6 +162,21 @@ typedef enum {
TS_XOR = 0x80 // decode stuffed byte
} TS_STATE;
void evalVario(int16_t altitude_bp, uint8_t altitude_ap)
{
int16_t varioAltitude_cm = altitude_bp * 100 + (altitude_bp > 0 ? altitude_ap : -altitude_ap);
frskyHubData.queuePointer = (frskyHubData.queuePointer + 1) % VARIO_QUEUE_LENGTH;
frskyHubData.varioAltitudeQueue[frskyHubData.queuePointer] = varioAltitude_cm - frskyHubData.varioAltitude_cm;
frskyHubData.varioAltitude_cm = varioAltitude_cm;
int16_t speed = 0;
for (uint8_t i=0; i<VARIO_QUEUE_LENGTH; i++) {
speed += frskyHubData.varioAltitudeQueue[i];
}
frskyHubData.varioSpeed = speed;
}
void parseTelemHubByte(uint8_t byte)
{
static int8_t structPos;
@@ -242,7 +257,7 @@ void parseTelemHubByte(uint8_t byte)
frskyHubData.maxTemperature2 = frskyHubData.temperature2;
break;
case offsetof(FrskyHubData, baroAltitude_bp):
case offsetof(FrskyHubData, baroAltitude_ap):
// First received barometer altitude => Altitude offset
if (!frskyHubData.baroAltitudeOffset)
frskyHubData.baroAltitudeOffset = -frskyHubData.baroAltitude_bp;
@@ -252,20 +267,8 @@ void parseTelemHubByte(uint8_t byte)
if (frskyHubData.baroAltitude_bp < frskyHubData.minAltitude)
frskyHubData.minAltitude = frskyHubData.baroAltitude_bp;
{
int16_t actVario = frskyHubData.baroAltitude_bp - frskyHubData.lastBaroAltitude_bp;
frskyHubData.varioAcc2 = frskyHubData.varioAcc2 - frskyHubData.varioQueue[frskyHubData.queuePointer];
frskyHubData.varioQueue[frskyHubData.queuePointer] = actVario;
uint8_t tmp = frskyHubData.queuePointer + 5;
if (tmp >= 10)
tmp -= 10;
tmp = (uint8_t)frskyHubData.varioQueue[tmp];
frskyHubData.varioAcc2 = frskyHubData.varioAcc2 + (int8_t)tmp;
frskyHubData.varioAcc1 = frskyHubData.varioAcc1 + actVario - (int8_t)tmp;
frskyHubData.varioSpeed = frskyHubData.varioAcc1 - frskyHubData.varioAcc2;
if (++frskyHubData.queuePointer >= 10)
frskyHubData.queuePointer = 0;
frskyHubData.lastBaroAltitude_bp = frskyHubData.baroAltitude_bp;
if (g_model.varioSource == VARIO_SOURCE_BARO) {
evalVario(frskyHubData.baroAltitude_bp, frskyHubData.baroAltitude_ap);
}
break;
@@ -285,6 +288,9 @@ void parseTelemHubByte(uint8_t byte)
else if (frskyHubData.gpsDistNeeded || g_menuStack[0] == menuProcFrsky) {
getGpsDistance();
}
if (g_model.varioSource == VARIO_SOURCE_GPS) {
evalVario(frskyHubData.gpsAltitude_bp, frskyHubData.gpsAltitude_ap);
}
break;
case offsetof(FrskyHubData, gpsSpeed_bp):
@@ -370,6 +376,14 @@ void processFrskyPacket(uint8_t *packet)
frskyRSSI[0].set(packet[3]);
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) {
#warning TODO
#if 0
frskyHubData.varioSpeed =
(frskyTelemetry[g_model.varioSource - VARIO_SOURCE_A1].value - g_model.varioAXCenter) *
((g_model.varioAXMultiplier - 127)/10);
#endif
}
break;
#if defined(FRSKY_HUB) || defined (WS_HOW_HIGH)
case USRPKT: // User Data packet
+6 -2
View File
@@ -68,6 +68,10 @@ class FrskyData: public FrskyRSSI {
#define EARTH_RADIUSKM ((uint32_t)6371)
#define EARTH_RADIUS ((uint32_t)111194)
#define VARIO_QUEUE_LENGTH 5
#define VARIO_SPEED_LIMIT 10 //m/s
#define VARIO_SPEED_LIMIT_MUL 20 //to get 0.2m steps
#if defined(FRSKY_HUB)
PACK(struct FrskyHubData {
int16_t baroAltitudeOffset;// spare reused
@@ -109,7 +113,7 @@ PACK(struct FrskyHubData {
uint8_t cellsCount:4; // 4bits out of 16bits spare reused
uint8_t minCellVolts; // 8bits out of 16bits spare reused
uint16_t current; // 0x28 Current
int8_t varioQueue[10]; // circular-buffer
int16_t varioAltitudeQueue[VARIO_QUEUE_LENGTH]; //circular buffer
uint8_t queuePointer; // circular-buffer pointer
int8_t spare2;
int16_t lastBaroAltitude_bp;
@@ -131,7 +135,7 @@ PACK(struct FrskyHubData {
uint16_t gpsDistance;
int16_t gpsAltitudeOffset;
uint8_t minCellMinVolts;
int32_t varioAltitude_cm;
});
#elif defined(WS_HOW_HIGH)
+36 -1
View File
@@ -2129,7 +2129,7 @@ void menuProcFunctionSwitches(uint8_t event)
void menuProcTelemetry(uint8_t event)
{
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, 27, {0, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 1, (uint8_t)-1, 0, 0, (uint8_t)-1, 1, 1, 1, 1, (uint8_t)-1, 2, 2, 2, 2});
MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, 30, {0, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 1, (uint8_t)-1, 0, 0, (uint8_t)-1, 0, 1, (uint8_t)-1, 1, 1, 1, 1, (uint8_t)-1, 2, 2, 2, 2});
#else
MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, 24, {0, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 1, (uint8_t)-1, 1, 1, 1, 1, (uint8_t)-1, 2, 2, 2, 2});
#endif
@@ -2279,6 +2279,41 @@ void menuProcTelemetry(uint8_t event)
subN++;
#endif
if (s_pgOfs<subN) {
y = (subN-s_pgOfs)*FH;
lcd_putsLeft(y, STR_VARIO);
}
subN++;
if(s_pgOfs<subN) {
y = (subN-s_pgOfs)*FH;
lcd_puts(4, y, STR_SOURCE);
lcd_putsiAtt(TELEM_COL2, y, STR_VARIOSRC, g_model.varioSource, ((sub==subN && m_posHorz==0) ? blink : 0));
if (sub==subN) {
CHECK_INCDEC_MODELVAR(event, g_model.varioSource, VARIO_SOURCE_NONE, VARIO_SOURCE_LAST-1);
}
}
subN++;
if(s_pgOfs<subN) {
y = (subN-s_pgOfs)*FH;
lcd_puts(4, y, STR_LIMIT);
lcd_outdezAtt(TELEM_COL2, y, -VARIO_SPEED_LIMIT_MUL*(255 - g_model.varioSpeedDownMin), ((sub==subN && m_posHorz==0) ? blink : 0)|PREC2|LEFT);
lcd_outdezAtt(TELEM_COL2+6*FW, y, VARIO_SPEED_LIMIT_MUL*g_model.varioSpeedUpMin, ((sub==subN && m_posHorz==1) ? blink : 0)|PREC2|LEFT);
if (sub==subN && (s_editMode>0 || p1valdiff)) {
switch (m_posHorz) {
case 0:
g_model.varioSpeedDownMin = checkIncDec(event, g_model.varioSpeedDownMin, 0, 255, EE_MODEL);
break;
case 1:
CHECK_INCDEC_MODELVAR(event, g_model.varioSpeedUpMin, 0, 15);
break;
}
}
}
subN++;
// Display
if(s_pgOfs<subN) {
y = (subN-s_pgOfs)*FH;
+15 -1
View File
@@ -290,7 +290,7 @@ enum Functions {
FUNC_PLAY_SOMO,
#endif
FUNC_RESET,
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
#if defined(FRSKY)
FUNC_VARIO,
#endif
#ifdef SDCARD
@@ -374,6 +374,15 @@ enum TelemetrySource {
TELEM_STATUS_MAX = TELEM_GPS_TIME
};
enum VarioSource {
VARIO_SOURCE_NONE = 0,
VARIO_SOURCE_BARO,
VARIO_SOURCE_GPS,
VARIO_SOURCE_A1,
VARIO_SOURCE_A2,
VARIO_SOURCE_LAST
};
PACK(typedef struct t_FrSkyBarData {
uint16_t source:4;
uint16_t barMin:6; // minimum for bar display
@@ -556,6 +565,11 @@ PACK(typedef struct t_ModelData {
uint8_t frskyLines[4];
uint16_t frskyLinesXtra;
int8_t servoCenter[NUM_CHNOUT];
// TODO:temporary place, need to move to frskydata
uint8_t varioSource:4;
uint8_t varioSpeedUpMin:4; // if increment in 0.2m/s = 3.0m/s max
uint8_t varioSpeedDownMin;
}) ModelData;
extern EEGeneral g_eeGeneral;
+6 -1
View File
@@ -70,6 +70,7 @@ const pm_char STR_OPEN9X[] PROGMEM =
ISTR(VALARMFN)
ISTR(VTELPROTO)
ISTR(GPSFORMAT)
ISTR(VARIOSRC)
#endif
#ifdef TEMPLATES
ISTR(VTEMPLATES)
@@ -185,6 +186,7 @@ const pm_char STR_ALARMWARNING[] PROGMEM = TR_ALARMWARNING;
const pm_char STR_NODATAALARM[] PROGMEM = TR_NODATAALARM;
const pm_char STR_TIMEZONE[] PROGMEM = TR_TIMEZONE;
const pm_char STR_GPSCOORD[] PROGMEM = TR_GPSCOORD;
const pm_char STR_VARIO[] PROGMEM = TR_VARIO;
#endif
const pm_char STR_RXCHANNELORD[] PROGMEM = TR_RXCHANNELORD;
const pm_char STR_SLAVE[] PROGMEM = TR_SLAVE;
@@ -285,10 +287,13 @@ const pm_char STR_MIXERWEIGHT[] PROGMEM = TR_MIXERWEIGHT;
const pm_char STR_MIXEROFFSET[] PROGMEM = TR_MIXEROFFSET;
const pm_char STR_DRWEIGHT[] PROGMEM = TR_DRWEIGHT;
const pm_char STR_DREXPO[] PROGMEM = TR_DREXPO;
const pm_char STR_MINLIMIT[] PROGMEM = TR_MINLIMIT;
const pm_char STR_MAXLIMIT[] PROGMEM = TR_MAXLIMIT;
#endif
#if defined(ROTARY_ENCODERS) || defined(FRSKY)
const pm_char STR_MINLIMIT[] PROGMEM = TR_MINLIMIT;
#endif
#if defined(FRSKY_HUB)
const pm_char STR_MINRSSI[] PROGMEM = TR_MINRSSI;
const pm_char STR_LATITUDE[] PROGMEM = TR_LATITUDE;
+8 -2
View File
@@ -89,7 +89,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_ENDTELEM (OFS_GPSFORMAT + sizeof(TR_GPSFORMAT))
#define OFS_VARIOSRC (OFS_GPSFORMAT + sizeof(TR_GPSFORMAT))
#define OFS_ENDTELEM (OFS_VARIOSRC + sizeof(TR_VARIOSRC))
#else
#define OFS_ENDTELEM (OFS_VTELEMCHNS + sizeof(TR_VTELEMCHNS))
#endif
@@ -154,6 +155,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_VARIOSRC (STR_OPEN9X + OFS_VARIOSRC)
#define STR_TELEMCHNS (STR_OPEN9X + OFS_TELEMCHNS)
#endif
@@ -268,6 +270,7 @@ extern const pm_char STR_ALARMWARNING[];
extern const pm_char STR_NODATAALARM[];
extern const pm_char STR_TIMEZONE[];
extern const pm_char STR_GPSCOORD[];
extern const pm_char STR_VARIO[];
extern const pm_char STR_RXCHANNELORD[];
extern const pm_char STR_SLAVE[];
extern const pm_char STR_MODESRC[];
@@ -348,10 +351,13 @@ extern const pm_char STR_MIXERWEIGHT[];
extern const pm_char STR_MIXEROFFSET[];
extern const pm_char STR_DRWEIGHT[];
extern const pm_char STR_DREXPO[];
extern const pm_char STR_MINLIMIT[];
extern const pm_char STR_MAXLIMIT[];
#endif
#if defined(ROTARY_ENCODERS) || defined(FRSKY)
extern const pm_char STR_MINLIMIT[];
#endif
#ifdef FRSKY_HUB
extern const pm_char STR_MINRSSI[];
extern const pm_char STR_LATITUDE[];
+10 -5
View File
@@ -80,9 +80,9 @@
#define LEN_VFSWFUNC "\015"
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
#define TR_VARIO "Vario "
#define TR_VVARIO "Vario "
#else
#define TR_VARIO
#define TR_VVARIO
#endif
#ifdef SDCARD
#define TR_SDCLOGGS "SDCARD Logs "
@@ -104,7 +104,7 @@
#else
#define TR_TEST
#endif
#define TR_VFSWFUNC "Security \0 ""Trainer \0 ""Instant Trim " TR_SOUND TR_SOMO "Reset\0 " TR_VARIO TR_SDCLOGGS TR_TEST
#define TR_VFSWFUNC "Security \0 ""Trainer \0 ""Instant Trim " TR_SOUND TR_SOMO "Reset\0 " TR_VVARIO TR_SDCLOGGS TR_TEST
#define LEN_VFSWRESET "\006"
#define TR_VFSWRESET "Timer1""Timer2""All ""Telem."
@@ -143,8 +143,11 @@
#define TR_VTELPROTO ""
#endif
#define LEN_GPSFORMAT "\004"
#define TR_GPSFORMAT "HMS NMEA"
#define LEN_VARIOSRC "\004"
#define TR_VARIOSRC "None""Baro""GPS ""A1 ""A2 "
#define LEN_GPSFORMAT "\004"
#define TR_GPSFORMAT "HMS NMEA"
#define LEN2_VTEMPLATES 13
#define LEN_VTEMPLATES "\015"
@@ -351,11 +354,13 @@
#define TR_SYNCMENU "Sync [MENU]"
#define TR_BACK "Back"
#define TR_MINLIMIT "Min Limit"
#define STR_LIMIT (STR_MINLIMIT+4)
#define TR_MAXLIMIT "Max Limit"
#define TR_MINRSSI "Min Rssi"
#define TR_LATITUDE "Latitude"
#define TR_LONGITUDE "Longitude"
#define TR_GPSCOORD "Gps Coords"
#define TR_VARIO "Vario"
#define TR_SHUTDOWN "SHUTTING DOWN"
#define TR_BATT_CALIB "Battery Calib"
#define TR_CURRENT_CALIB "Current Calib"
+12 -7
View File
@@ -80,9 +80,9 @@
#define LEN_VFSWFUNC "\015"
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
#define TR_VARIO "Vario "
#define TR_VVARIO "Vario "
#else
#define TR_VARIO
#define TR_VVARIO
#endif
#ifdef SDCARD
#define TR_SDCLOGGS "SDCARD Logs "
@@ -104,7 +104,7 @@
#else
#define TR_TEST
#endif
#define TR_VFSWFUNC "Securite \0 ""Ecolage \0 ""Trim instant " TR_SOUND TR_SOMO "Reset\0 " TR_VARIO TR_SDCLOGGS TR_TEST
#define TR_VFSWFUNC "Securite \0 ""Ecolage \0 ""Trim instant " TR_SOUND TR_SOMO "Reset\0 " TR_VVARIO TR_SDCLOGGS TR_TEST
#define LEN_VFSWRESET "\006"
#define TR_VFSWRESET "Timer1""Timer2""All ""Telem."
@@ -143,11 +143,14 @@
#define TR_VTELPROTO ""
#endif
#define LEN_GPSFORMAT "\004"
#define TR_GPSFORMAT "HMS NMEA"
#define LEN_VARIOSRC "\004"
#define TR_VARIOSRC "None""Baro""GPS ""A1 ""A2 "
#define LEN_VUNITSFORMAT "\004"
#define TR_VUNITSFORMAT "MetrImpr"
#define LEN_GPSFORMAT "\004"
#define TR_GPSFORMAT "HMS NMEA"
#define LEN_VUNITSFORMAT "\004"
#define TR_VUNITSFORMAT "MetrImpr"
#define LEN2_VTEMPLATES 15
#define LEN_VTEMPLATES "\017"
@@ -355,10 +358,12 @@
#define TR_BACK "Back"
#define TR_MINLIMIT "Min Limit"
#define TR_MAXLIMIT "Max Limit"
#define STR_LIMIT (STR_MINLIMIT+4)
#define TR_MINRSSI "Min Rssi"
#define TR_LATITUDE "Latitude"
#define TR_LONGITUDE "Longitude"
#define TR_GPSCOORD "Gps Coords"
#define TR_VARIO "Vario"
#define TR_UNITSFORMAT "Units Format"
#define TR_SHUTDOWN "ARRET EN COURS"
#define TR_BATT_CALIB "Calib. Batterie"
+12 -7
View File
@@ -80,9 +80,9 @@
#define LEN_VFSWFUNC "\015"
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
#define TR_VARIO "Vario "
#define TR_VVARIO "Vario "
#else
#define TR_VARIO
#define TR_VVARIO
#endif
#ifdef SDCARD
#define TR_SDCLOGGS "SDCARD Logs "
@@ -104,7 +104,7 @@
#else
#define TR_TEST
#endif
#define TR_VFSWFUNC "S\201kerhet \0 ""Trainer \0 ""Instant Trim " TR_SOUND TR_SOMO "Reset\0 " TR_VARIO TR_SDCLOGGS TR_TEST
#define TR_VFSWFUNC "S\201kerhet \0 ""Trainer \0 ""Instant Trim " TR_SOUND TR_SOMO "Reset\0 " TR_VVARIO TR_SDCLOGGS TR_TEST
#define LEN_VFSWRESET "\006"
#define TR_VFSWRESET "Timer1""Timer2""All ""Telem."
@@ -143,11 +143,14 @@
#define TR_VTELPROTO ""
#endif
#define LEN_GPSFORMAT "\004"
#define TR_GPSFORMAT "HMS NMEA"
#define LEN_VARIOSRC "\004"
#define TR_VARIOSRC "None""Baro""GPS ""A1 ""A2 "
#define LEN_VUNITSFORMAT "\004"
#define TR_VUNITSFORMAT "MetrImpr"
#define LEN_GPSFORMAT "\004"
#define TR_GPSFORMAT "HMS NMEA"
#define LEN_VUNITSFORMAT "\004"
#define TR_VUNITSFORMAT "MetrImpr"
#define LEN2_VTEMPLATES 13
#define LEN_VTEMPLATES "\015"
@@ -354,11 +357,13 @@
#define TR_SYNCMENU "Synk [MENU]"
#define TR_BACK "EXIT"
#define TR_MINLIMIT "Mininiv\200"
#define STR_LIMIT (STR_MINLIMIT)
#define TR_MAXLIMIT "Maxiniv\200"
#define TR_MINRSSI "Min Rssi"
#define TR_LATITUDE "Breddgrad"
#define TR_LONGITUDE "L\201ngdgrad"
#define TR_GPSCOORD "GPS-Koord."
#define TR_VARIO "Vario"
#define TR_UNITSFORMAT "Units Format"
#define TR_SHUTDOWN "ST\204NGER AV"
#define TR_BATT_CALIB "Battery Calib"