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

Commit before revert to a previous version. The async eeprom write doesn't work any more.

This commit is contained in:
bsongis 2011-09-20 18:56:53 +00:00
parent c6925989ed
commit baa8c58813
9 changed files with 369 additions and 128 deletions

View file

@ -60,7 +60,7 @@ USART1 = FREED
# Values = STD, MOD1
PPMIN = STD
BATT voltage algorithm. Values = BANDGAP, UNSTABLE_BANDGAP
# BATT voltage algorithm. Values = BANDGAP, UNSTABLE_BANDGAP
BATT = BANDGAP
# Decimals display in the main view (PPM calibration,

View file

@ -320,7 +320,7 @@ void per10ms()
g_tmr10ms++;
g_blinkTmr10ms++;
#if defined (PCBV3) && !defined (PCBV4)
#if defined (PCBV3)
/* Update gloabal Date/Time every 100 per10ms cycles */
if (++g_ms100 == 100)
{
@ -470,7 +470,6 @@ void per10ms()
#if defined (FRSKY)
// TODO why sending only every 50ms
// Attempt to transmit any waiting Fr-Sky alarm set packets every 50ms (subject to packet buffer availability)
static uint8_t FrskyDelay = 5;
if (FrskyAlarmSendState && (--FrskyDelay == 0))

View file

@ -36,12 +36,14 @@
#define BYTESTUFF 0x7d
#define STUFF_MASK 0x20
uint8_t frskyRxBuffer[19]; // Receive buffer. 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1)
uint8_t frskyTxBuffer[19]; // Ditto for transmit buffer
#define FRSKY_RX_PACKET_SIZE 19
#define FRSKY_TX_PACKET_SIZE 12
uint8_t frskyRxBuffer[FRSKY_RX_PACKET_SIZE]; // Receive buffer. 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1)
uint8_t frskyTxBuffer[FRSKY_TX_PACKET_SIZE]; // Ditto for transmit buffer
uint8_t frskyTxBufferCount = 0;
uint8_t FrskyRxBufferReady = 0;
uint8_t frskyStreaming = 0;
uint8_t frskyTxISRIndex = 0;
FrskyData frskyTelemetry[2];
FrskyData frskyRSSI[2];
@ -51,25 +53,99 @@ struct FrskyAlarm {
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];
void frskyPushValue(uint8_t & i, uint8_t value);
#ifdef FRSKY_HUB
struct FrskyHubData frskyHubData;
#endif
void frskyPushValue(uint8_t *&ptr, uint8_t value)
{
// byte stuff the only byte than might need it
if (value == START_STOP) {
*ptr++ = 0x5e;
*ptr++ = BYTESTUFF;
}
else if (value == BYTESTUFF) {
*ptr++ = 0x5d;
*ptr++ = BYTESTUFF;
}
else {
*ptr++ = value;
}
}
#ifdef FRSKY_HUB
int8_t parseTelemHubIndex(uint8_t index)
{
if (index > 0x26)
index = 0; // invalid index
if (index > 0x21)
index -= 5;
if (index > 0x0f)
index -= 6;
if (index > 0x08)
index -= 2;
return 2*(index-1);
}
typedef enum {
TS_IDLE = 0, // waiting for 0x5e frame marker
TS_DATA_ID, // waiting for dataID
TS_DATA_LOW, // waiting for data low byte
TS_DATA_HIGH, // waiting for data high byte
TS_XOR = 0x80 // decode stuffed byte
} TS_STATE;
void parseTelemHubByte(uint8_t byte)
{
static int8_t structPos;
static TS_STATE state = TS_IDLE;
if (byte == 0x5e) {
state = TS_DATA_ID;
return;
}
if (state == TS_IDLE) {
return;
}
if (state & TS_XOR) {
byte = byte ^ 0x60;
state = (TS_STATE)(state - TS_XOR);
}
if (byte == 0x5d) {
state = (TS_STATE)(state | TS_XOR);
return;
}
if (state == TS_DATA_ID) {
structPos = parseTelemHubIndex(byte);
state = TS_DATA_LOW;
if (structPos < 0)
state = TS_IDLE;
return;
}
if (state == TS_DATA_LOW) {
((uint8_t*)&frskyHubData)[structPos] = byte;
state = TS_DATA_HIGH;
return;
}
((uint8_t*)&frskyHubData)[structPos+1] = byte;
state = TS_IDLE;
}
#endif
/*
Called from somewhere in the main loop or a low prioirty interrupt
routine perhaps. This funtcion processes Fr-Sky telemetry data packets
assembled byt he USART0_RX_vect) ISR function (below) and stores
Called from somewhere in the main loop or a low priority interrupt
routine perhaps. This function processes FrSky telemetry data packets
assembled by he USART0_RX_vect) ISR function (below) and stores
extracted data in global variables for use by other parts of the program.
Packets can be any of the following:
- A1/A2/RSSI telemtry data
- A1/A2/RSSI telemetry data
- Alarm level/mode/threshold settings for Ch1A, Ch1B, Ch2A, Ch2B
- User Data packets
User Data packets are not yet implementedi (they are simply ignored),
but will likely one day contain the likes of GPS long/lat/alt/speed,
AoA, airspeed, etc.
*/
void processFrskyPacket(uint8_t *packet)
@ -96,7 +172,14 @@ void processFrskyPacket(uint8_t *packet)
frskyRSSI[1].set(packet[4] / 2);
break;
case USRPKT: // User Data packet -- not yet implemented
case USRPKT: // User Data packet
#ifdef FRSKY_HUB
uint8_t numBytes = 3 + (packet[1] & 0x07); // sanitize in case of data corruption leading to buffer overflow
for (uint8_t i=3; i<numBytes; i++) {
parseTelemHubByte(packet[i]);
}
// TODO frskyUsrStreaming = FRSKY_TIMEOUT10ms*3; // reset counter only if valid frsky packets are being detected
#endif
break;
}
@ -134,6 +217,7 @@ ISR(USART0_RX_vect)
UCSR0B &= ~(1 << RXCIE0); // disable Interrupt
sei() ;
stat = UCSR0A; // USART control and Status Register 0 A
/*
@ -181,7 +265,7 @@ ISR(USART0_RX_vect)
case frskyDataStart:
if (data == START_STOP) break; // Remain in userDataStart if possible 0x7e,0x7e doublet found.
if (numPktBytes < 19)
if (numPktBytes < FRSKY_RX_PACKET_SIZE)
frskyRxBuffer[numPktBytes++] = data;
dataState = frskyDataInFrame;
break;
@ -198,11 +282,12 @@ ISR(USART0_RX_vect)
dataState = frskyDataIdle;
break;
}
if (numPktBytes < FRSKY_RX_PACKET_SIZE)
frskyRxBuffer[numPktBytes++] = data;
break;
case frskyDataXOR:
if (numPktBytes < 19)
if (numPktBytes < FRSKY_RX_PACKET_SIZE)
frskyRxBuffer[numPktBytes++] = data ^ STUFF_MASK;
dataState = frskyDataInFrame;
break;
@ -230,8 +315,7 @@ ISR(USART0_RX_vect)
ISR(USART0_UDRE_vect)
{
if (frskyTxBufferCount > 0) {
UDR0 = frskyTxBuffer[frskyTxISRIndex++];
frskyTxBufferCount--;
UDR0 = frskyTxBuffer[--frskyTxBufferCount];
}
else {
UCSR0B &= ~(1 << UDRIE0); // disable UDRE0 interrupt
@ -243,84 +327,46 @@ ISR(USART0_UDRE_vect)
void frskyTransmitBuffer()
{
frskyTxISRIndex = 0;
UCSR0B |= (1 << UDRIE0); // enable UDRE0 interrupt
}
uint8_t FrskyAlarmSendState = 0 ;
uint8_t FrskyDelay = 0 ;
void FRSKY10mspoll(void)
{
if (FrskyDelay)
{
FrskyDelay -= 1 ;
return ;
}
if (frskyTxBufferCount)
{
return; // we only have one buffer. If it's in use, then we can't send yet.
}
uint8_t *ptr = &frskyTxBuffer[0];
*ptr++ = START_STOP; // End of packet
*ptr++ = 0x00;
*ptr++ = 0x00;
*ptr++ = 0x00;
*ptr++ = 0x00;
*ptr++ = 0x00;
// Now send a packet
{
FrskyAlarmSendState -= 1 ;
uint8_t channel = 1 - (FrskyAlarmSendState / 2);
uint8_t alarm = 1 - (FrskyAlarmSendState % 2);
uint8_t i = 0;
frskyTxBuffer[i++] = START_STOP; // Start of packet
frskyTxBuffer[i++] = (A22PKT + FrskyAlarmSendState); // fc - fb - fa - f9
frskyPushValue(i, g_model.frsky.channels[channel].alarms_value[alarm]);
{
uint8_t *ptr ;
ptr = &frskyTxBuffer[i] ;
*ptr++ = ALARM_GREATER(channel, alarm);
if (FrskyAlarmSendState < SEND_MODEL_ALARMS) {
uint8_t channel = 1 - (FrskyAlarmSendState / 2);
*ptr++ = ALARM_LEVEL(channel, alarm);
*ptr++ = 0x00 ;
*ptr++ = 0x00 ;
*ptr++ = 0x00 ;
*ptr++ = 0x00 ;
*ptr++ = 0x00 ;
*ptr++ = START_STOP; // End of packet
i += 8 ;
*ptr++ = ALARM_GREATER(channel, alarm);
frskyPushValue(ptr, g_model.frsky.channels[channel].alarms_value[alarm]);
*ptr++ = (A22PKT + FrskyAlarmSendState); // fc - fb - fa - f9
}
FrskyDelay = 5 ; // 50mS
frskyTxBufferCount = i;
frskyTransmitBuffer();
}
}
// Send packet requesting all alarm settings be sent back to us
void FRSKY_setRSSIAlarms(void)
{
if (frskyTxBufferCount) return; // we only have one buffer. If it's in use, then we can't send. Sorry.
uint8_t i = 0;
for (int alarm=0; alarm<2; alarm++) {
frskyTxBuffer[i++] = START_STOP; // Start of packet
frskyTxBuffer[i++] = (RSSI1PKT-alarm); // f7 - f6
frskyPushValue(i, g_eeGeneral.frskyRssiAlarms[alarm].value+50-(10*i));
{
uint8_t *ptr ;
ptr = &frskyTxBuffer[i] ;
*ptr++ = 0x00 ;
else {
if (FrskyAlarmSendState == SEND_MODEL_ALARMS)
FrskyAlarmSendState = 0;
*ptr++ = g_eeGeneral.frskyRssiAlarms[alarm].level;
*ptr++ = 0x00 ;
*ptr++ = 0x00 ;
*ptr++ = 0x00 ;
*ptr++ = 0x00 ;
*ptr++ = 0x00 ;
*ptr++ = START_STOP; // End of packet
i += 8 ;
}
frskyPushValue(ptr, g_eeGeneral.frskyRssiAlarms[alarm].value+50-(10*alarm));
*ptr++ = (RSSI1PKT-alarm); // f7 - f6
}
frskyTxBufferCount = i;
*ptr++ = START_STOP; // Start of packet
frskyTxBufferCount = ptr - &frskyTxBuffer[0];
frskyTransmitBuffer();
}
@ -344,7 +390,7 @@ bool FRSKY_alarmRaised(uint8_t idx)
inline void FRSKY_EnableTXD(void)
{
frskyTxBufferCount = 0;
UCSR0B |= (1 << TXEN0) | (1 << UDRIE0); // enable TX and TX interrupt
UCSR0B |= (1 << TXEN0); // enable TX
}
inline void FRSKY_EnableRXD(void)
@ -427,22 +473,6 @@ void frskyAlarmsRefresh()
}
#endif
void frskyPushValue(uint8_t & i, uint8_t value)
{
// byte stuff the only byte than might need it
if (value == START_STOP) {
frskyTxBuffer[i++] = BYTESTUFF;
frskyTxBuffer[i++] = 0x5e;
}
else if (value == BYTESTUFF) {
frskyTxBuffer[i++] = BYTESTUFF;
frskyTxBuffer[i++] = 0x5d;
}
else {
frskyTxBuffer[i++] = value;
}
}
void FrskyData::set(uint8_t value)
{
this->value = value;

View file

@ -40,9 +40,47 @@ struct FrskyData {
void set(uint8_t value);
};
#ifdef FRSKY_HUB
struct FrskyHubData {
int16_t gpsAltitude_bp; // before punct
int16_t temperature1; // -20 .. 250 deg. celcius
uint16_t rpm; // 0..60,000 revs. per minute
uint16_t fuelLevel; // 0, 25, 50, 75, 100 percent
int16_t temperature2; // -20 .. 250 deg. celcius
uint16_t volts; // 1/500V increments (0..4.2V)
int16_t gpsAltitude_ap; // after punct
uint16_t baroAltitude; // 0..9,999 meters
uint16_t gpsSpeed_bp; // before punct
uint16_t gpsLongitude_bp; // before punct
uint16_t gpsLatitude_bp; // before punct
uint16_t gpsCourse_bp; // before punct (0..359.99 deg. -- seemingly 2-decimal precision)
uint8_t day;
uint8_t month;
uint16_t year;
uint8_t hour;
uint8_t min;
uint16_t sec;
uint16_t gpsSpeed_ap;
uint16_t gpsLongitude_ap;
uint16_t gpsLatitude_ap;
uint16_t gpsCourse_ap;
uint16_t gpsLongitudeEW; // East/West
uint16_t gpsLatitudeNS; // North/South
int16_t accelX; // 1/256th gram (-8g ~ +8g)
int16_t accelY; // 1/256th gram (-8g ~ +8g)
int16_t accelZ; // 1/256th gram (-8g ~ +8g)
};
extern struct FrskyHubData frskyHubData;
#endif
// Global Fr-Sky telemetry data variables
extern uint8_t frskyStreaming; // >0 (true) == data is streaming in. 0 = nodata detected for some time
#define SEND_MODEL_ALARMS 4
#define SEND_RSSI_ALARMS (SEND_MODEL_ALARMS + 2)
extern uint8_t FrskyAlarmSendState;
extern FrskyData frskyTelemetry[2];
extern FrskyData frskyRSSI[2];
@ -51,7 +89,12 @@ void FRSKY10mspoll(void);
inline void FRSKY_setModelAlarms(void)
{
FrskyAlarmSendState = 4 ;
FrskyAlarmSendState = SEND_MODEL_ALARMS;
}
inline void FRSKY_setRSSIAlarms(void)
{
FrskyAlarmSendState = SEND_RSSI_ALARMS;
}
bool FRSKY_alarmRaised(uint8_t idx);

View file

@ -2009,20 +2009,6 @@ uint16_t DEBUG1 = 0;
uint16_t DEBUG2 = 0;
#endif
extern unsigned char __bss_end ;
unsigned int stack_free()
{
unsigned char *p ;
p = &__bss_end + 1 ;
while ( *p == 0x55 )
{
p+= 1 ;
}
return p - &__bss_end ;
}
#endif
@ -2078,6 +2064,21 @@ void moveTrimsToOffsets() // copy state of 3 primary to subtrim
}
#ifndef SIMU
extern unsigned char __bss_end ;
uint16_t stack_free()
{
unsigned char *p ;
p = &__bss_end + 1 ;
while ( *p == 0x55 )
{
p+= 1 ;
}
return p - &__bss_end ;
}
int main(void)
{
// Set up I/O port data directions and initial states
@ -2174,6 +2175,21 @@ int main(void)
ETIMSK |= (1<<TICIE3);
#endif
// Init Stack while interrupts are disabled
#define STACKPTR _SFR_IO16(0x3D)
{
unsigned char *p ;
unsigned char *q ;
p = (unsigned char *) STACKPTR ;
q = &__bss_end ;
p -= 2 ;
while ( p > q )
{
*p-- = 0x55 ;
}
}
sei(); // interrupts needed for eeReadAll function (soon).
g_menuStack[0] = menuMainView;

View file

@ -192,6 +192,48 @@ TEST(EEPROM, rm) {
EXPECT_EQ(sz, 0);
}
extern void processFrskyPacket(uint8_t *packet);
TEST(FrSky, gpsNfuel) {
uint8_t pkt1[] = { 0xfd, 0x07, 0x00, 0x5e, 0x14, 0x2c, 0x00, 0x5e, 0x1c, 0x03 };
uint8_t pkt2[] = { 0xfd, 0x07, 0x00, 0x00, 0x5e, 0x13, 0x38, 0x0c, 0x5e, 0x1b };
uint8_t pkt3[] = { 0xfd, 0x07, 0x00, 0xc9, 0x06, 0x5e, 0x23, 0x4e, 0x00, 0x5e };
uint8_t pkt4[] = { 0xfd, 0x07, 0x00, 0x12, 0xef, 0x2e, 0x5e, 0x1a, 0x98, 0x26 };
uint8_t pkt5[] = { 0xfd, 0x07, 0x00, 0x5e, 0x22, 0x45, 0x00, 0x5e, 0x11, 0x02 };
uint8_t pkt6[] = { 0xfd, 0x07, 0x00, 0x00, 0x5e, 0x19, 0x93, 0x00, 0x5e, 0x04 };
uint8_t pkt7[] = { 0xfd, 0x03, 0x00, 0x64, 0x00, 0x5e };
processFrskyPacket(pkt1);
processFrskyPacket(pkt2);
processFrskyPacket(pkt3);
processFrskyPacket(pkt4);
processFrskyPacket(pkt5);
processFrskyPacket(pkt6);
processFrskyPacket(pkt7);
EXPECT_EQ(frskyHubData.gpsCourse_bp, 44);
EXPECT_EQ(frskyHubData.gpsCourse_ap, 03);
EXPECT_EQ(frskyHubData.gpsLongitude_bp / 100, 120);
EXPECT_EQ(frskyHubData.gpsLongitude_bp % 100, 15);
EXPECT_EQ(frskyHubData.gpsLongitude_ap, 0x2698);
EXPECT_EQ(frskyHubData.gpsLatitudeNS, 'N');
EXPECT_EQ(frskyHubData.gpsLongitudeEW, 'E');
EXPECT_EQ(frskyHubData.fuelLevel, 100);
}
TEST(FrSky, dateNtime) {
uint8_t pkt1[] = { 0xfd, 0x07, 0x00, 0x5e, 0x15, 0x0f, 0x07, 0x5e, 0x16, 0x0b };
uint8_t pkt2[] = { 0xfd, 0x07, 0x00, 0x00, 0x5e, 0x17, 0x06, 0x12, 0x5e, 0x18 };
uint8_t pkt3[] = { 0xfd, 0x03, 0x00, 0x32, 0x00, 0x5e };
processFrskyPacket(pkt1);
processFrskyPacket(pkt2);
processFrskyPacket(pkt3);
EXPECT_EQ(frskyHubData.day, 15);
EXPECT_EQ(frskyHubData.month, 07);
EXPECT_EQ(frskyHubData.year, 11);
EXPECT_EQ(frskyHubData.hour, 06);
EXPECT_EQ(frskyHubData.min, 18);
EXPECT_EQ(frskyHubData.sec, 50);
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();

View file

@ -62,7 +62,7 @@
/* other flags */
#define NO_UNIT UNSIGN
#define SHRT_TM_MODE 0x10
#define SHRT_TM_MODE LEFT
extern uint8_t displayBuf[DISPLAY_W*DISPLAY_H/8];

View file

@ -40,7 +40,7 @@ uint8_t tabViews[] = {
3, /*e_inputs*/
1, /*e_timer2*/
#ifdef FRSKY
2, /*e_telemetry*/
4, /*e_telemetry*/
#endif
};
@ -152,7 +152,7 @@ void menuMainView(uint8_t event)
if (!instantTrimSwLock && trimSw) instantTrim();
instantTrimSwLock = trimSw;
if (view == e_telemetry+ALTERNATE) {
if (view_base == e_telemetry && view > ALTERNATE) {
putsModelName(0, 0, g_model.name, g_eeGeneral.currModel, 0);
uint8_t att = (g_vbat100mV < g_eeGeneral.vBatWarn ? BLINK : 0);
putsVBat(14*FW,0,att);
@ -276,7 +276,7 @@ void menuMainView(uint8_t event)
}
}
displayCount = (displayCount+1) % 50;
if (view & ALTERNATE) {
if (view == e_telemetry+ALTERNATE) {
if (g_model.frsky.channels[0].ratio || g_model.frsky.channels[1].ratio) {
x0 = 0;
for (int i=0; i<2; i++) {
@ -340,6 +340,117 @@ void menuMainView(uint8_t event)
lcd_outdezAtt(15 * FW - 2, 7*FH, frskyRSSI[1].min, 0);
lcd_outdezAtt(17 * FW - 2, 7*FH, frskyRSSI[1].max, LEFT);
}
#ifdef FRSKY_HUB
else if (g_eeGeneral.view == e_telemetry+2*ALTERNATE) { // if on second alternate telemetry view
// date
lcd_outdezNAtt(1*FW, 1*FH, frskyHubData.year+2000, LEFT, 4);
lcd_putc(lcd_lastPos, 1*FH, '-');
lcd_outdezNAtt(lcd_lastPos+FW, 1*FH, frskyHubData.month, LEFT|LEADING0, 2);
lcd_putc(lcd_lastPos, 1*FH, '-');
lcd_outdezNAtt(lcd_lastPos+FW, 1*FH, frskyHubData.day, LEFT|LEADING0, 2);
// time
lcd_outdezNAtt(FW*10+8, 1*FH, frskyHubData.hour, LEFT|LEADING0, 2);
lcd_putc(lcd_lastPos, 1*FH, ':');
lcd_outdezNAtt(lcd_lastPos+FW, 1*FH, frskyHubData.min, LEFT|LEADING0, 2);
lcd_putc(lcd_lastPos, 1*FH, ':');
lcd_outdezNAtt(lcd_lastPos+FW, 1*FH, frskyHubData.sec, LEFT|LEADING0, 2);
// Longitude
lcd_outdezAtt(FW*3-2, 3*FH, frskyHubData.gpsLongitude_bp / 100, 0); // ddd before '.'
lcd_putc(lcd_lastPos, 3*FH, '@');
uint8_t mn = frskyHubData.gpsLongitude_bp % 100;
lcd_outdezNAtt(lcd_lastPos+FW, 3*FH, mn, LEFT|LEADING0, 2); // mm before '.'
lcd_plot(lcd_lastPos, 4*FH-2, 0); // small decimal point
lcd_outdezNAtt(lcd_lastPos+2, 3*FH, frskyHubData.gpsLongitude_ap, LEFT|UNSIGN|LEADING0, 4); // after '.'
lcd_putc(lcd_lastPos+1, 3*FH, frskyHubData.gpsLongitudeEW ? frskyHubData.gpsLongitudeEW : '-');
// Latitude
lcd_outdezAtt(lcd_lastPos+3*FW+3, 3*FH, frskyHubData.gpsLatitude_bp / 100, 0); // ddd before '.'
lcd_putc(lcd_lastPos, 3*FH, '@');
mn = frskyHubData.gpsLatitude_bp % 100;
lcd_outdezNAtt(lcd_lastPos+FW, 3*FH, mn, LEFT|LEADING0, 2); // mm before '.'
lcd_plot(lcd_lastPos, 4*FH-2, 0); // small decimal point
lcd_outdezNAtt(lcd_lastPos+2, 3*FH, frskyHubData.gpsLatitude_ap, LEFT|UNSIGN|LEADING0, 4); // after '.'
lcd_putc(lcd_lastPos+1, 3*FH, frskyHubData.gpsLatitudeNS ? frskyHubData.gpsLatitudeNS : '-');
// Course / Heading
lcd_puts_P(5, 5*FH, PSTR("Hdg:"));
lcd_outdezNAtt(lcd_lastPos, 5*FH, frskyHubData.gpsCourse_bp, LEFT|LEADING0, 3); // before '.'
lcd_plot(lcd_lastPos, 6*FH-2, 0); // small decimal point
lcd_outdezAtt(lcd_lastPos+2, 5*FH, frskyHubData.gpsCourse_ap, LEFT); // after '.'
lcd_putc(lcd_lastPos, 5*FH, '@');
// Speed
lcd_puts_P(76, 5*FH, PSTR("Spd:"));
lcd_outdezAtt(lcd_lastPos, 5*FH, frskyHubData.gpsSpeed_bp, LEFT); // before '.'
lcd_plot(lcd_lastPos, 6*FH-2, 0); // small decimal point
lcd_outdezAtt(lcd_lastPos+2, 5*FH, frskyHubData.gpsSpeed_ap, LEFT|UNSIGN); // after '.'
// Altitude
lcd_puts_P(7*FW, 7*FH, PSTR("Alt:"));
lcd_outdezNAtt(lcd_lastPos, 7*FH, frskyHubData.gpsAltitude_bp, LEFT|LEADING0, 3); // before '.'
lcd_plot(lcd_lastPos, 8*FH-2, 0); // small decimal point
lcd_outdezAtt(lcd_lastPos+2, 7*FH, frskyHubData.gpsAltitude_ap, LEFT|UNSIGN); // after '.'
lcd_putc(lcd_lastPos, 7*FH, 'm');
}
else if (g_eeGeneral.view == e_telemetry+3*ALTERNATE) { // if on second alternate telemetry view
uint8_t y = 2*FH;
// Temperature 1
lcd_puts_P(0, y, PSTR("Temp1:"));
lcd_outdezNAtt(lcd_lastPos, y, frskyHubData.temperature1, LEFT);
lcd_puts_P(lcd_lastPos, y, PSTR("@C"));
y += FH;
// Temperature 2
lcd_puts_P(0, y, PSTR("Temp2:"));
lcd_outdezNAtt(lcd_lastPos, y, frskyHubData.temperature2, LEFT);
lcd_puts_P(lcd_lastPos, y, PSTR("@C"));
y += 2*FH;
// RPM
lcd_puts_P(0, y, PSTR("RPM:"));
lcd_outdezNAtt(lcd_lastPos, y, frskyHubData.rpm, LEFT);
y += FH;
// Fuel
lcd_puts_P(0, y, PSTR("Fuel:"));
lcd_outdezNAtt(lcd_lastPos, y, frskyHubData.fuelLevel, LEFT);
lcd_putc(lcd_lastPos, y, '%');
y += FH;
// Volts
lcd_puts_P(0, y, PSTR("Volts:"));
lcd_outdezNAtt(lcd_lastPos, y, frskyHubData.volts, LEFT);
lcd_putc(lcd_lastPos, y, 'V');
y = 2*FH;
// Altitude (barometric)
lcd_puts_P(12*FW, y, PSTR("Alt:"));
lcd_outdezNAtt(lcd_lastPos, y, frskyHubData.baroAltitude, LEFT|UNSIGN);
lcd_putc(lcd_lastPos, y, 'm');
y += 2*FH;
// Acceleromter
lcd_puts_P(11*FW, y, PSTR("Accel"));
y += FH;
lcd_puts_P(11*FW, y, PSTR("x="));
lcd_outdezNAtt(FW*17, y, (int32_t)frskyHubData.accelX * 100 / 256, PREC2);
lcd_putc(lcd_lastPos, y, 'g');
y += FH;
lcd_puts_P(11*FW, y, PSTR("y="));
lcd_outdezNAtt(FW*17, y, (int32_t)frskyHubData.accelY * 100 / 256, PREC2);
lcd_putc(lcd_lastPos, y, 'g');
y += FH;
lcd_puts_P(11*FW, y, PSTR("z="));
lcd_outdezNAtt(FW*17, y, (int32_t)frskyHubData.accelZ * 100 / 256, PREC2);
lcd_putc(lcd_lastPos, y, 'g');
}
#endif
else {
y0 = 5*FH;
//lcd_puts_P(2*FW-3, y0, PSTR("Tele:"));

View file

@ -99,7 +99,7 @@ void menuProcStatistic2(uint8_t event)
lcd_outdez8(15*FW , 5*FH, g_time_per10/2 );
#ifndef SIMU
lcd_puts_P( 0*FW, 6*FH, PSTR("Free Stack min b"));
lcd_outdezAtt(18*FW-1, 6*FH, stack_free() ) ;
lcd_outdezAtt(18*FW-1, 6*FH, stack_free(), UNSIGN) ;
#endif
lcd_puts_P( 3*FW, 7*FH, PSTR("[MENU] to reset"));
}