From 97723c5732ac967a3e74e863fee82730bae909fd Mon Sep 17 00:00:00 2001 From: bsongis Date: Mon, 20 Feb 2012 22:33:12 +0000 Subject: [PATCH] GPS last coords always displayed even if fix lost (in case model crashed) --- src/frsky.cpp | 164 ++++++++++++++++++++------------------- src/frsky.h | 86 ++++++++++---------- src/main_views.cpp | 19 +---- src/myeeprom.h | 12 +++ src/open9x.cpp | 8 +- src/open9x.h | 4 +- src/pers.cpp | 1 + src/simpgmspace.cpp | 2 +- src/statistics_views.cpp | 6 +- 9 files changed, 154 insertions(+), 148 deletions(-) diff --git a/src/frsky.cpp b/src/frsky.cpp index 217fda60f..b1398c380 100644 --- a/src/frsky.cpp +++ b/src/frsky.cpp @@ -105,13 +105,45 @@ uint8_t frskyGetUserData(char *buffer, uint8_t bufSize) #endif #ifdef FRSKY_HUB -int8_t parseTelemHubIndex(int8_t index) +inline void getGpsPilotPosition() +{ + frskyHubData.pilotLatitude = (((uint32_t)frskyHubData.gpsLatitude_bp / 100) * 1000000) + (((frskyHubData.gpsLatitude_bp % 100) * 10000 + frskyHubData.gpsLatitude_ap) * 5) / 3; + frskyHubData.pilotLongitude = (((uint32_t)frskyHubData.gpsLongitude_bp / 100) * 1000000) + (((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; + 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); +} + +inline void getGpsDistance() +{ + uint32_t lat = (((uint32_t)frskyHubData.gpsLatitude_bp / 100) * 1000000) + (((frskyHubData.gpsLatitude_bp % 100) * 10000 + frskyHubData.gpsLatitude_ap) * 5) / 3; + uint32_t lng = (((uint32_t)frskyHubData.gpsLongitude_bp / 100) * 1000000) + (((frskyHubData.gpsLongitude_bp % 100) * 10000 + frskyHubData.gpsLongitude_ap) * 5) / 3; + + // printf("lat=%d (%d), long=%d (%d)\n", lat, abs(lat - frskyHubData.pilotLatitude), lng, abs(lng - frskyHubData.pilotLongitude)); + + uint32_t angle = (lat > frskyHubData.pilotLatitude) ? lat - frskyHubData.pilotLatitude : 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; + result += dist*dist; + + dist = frskyHubData.baroAltitude_bp + frskyHubData.baroAltitudeOffset; + result += dist*dist; + + frskyHubData.gpsDistance = isqrt32(result); +} + +inline int8_t parseTelemHubIndex(uint8_t index) { if (index > 0x3b) - index = -1; // invalid index + index = 255; // invalid index if (index > 0x39) index -= 17; - return 2*index; + return index*2; } typedef enum { @@ -125,6 +157,7 @@ typedef enum { void parseTelemHubByte(uint8_t byte) { static int8_t structPos; + static uint8_t lowByte; static TS_STATE state = TS_IDLE; if (byte == 0x5e) { @@ -150,28 +183,55 @@ void parseTelemHubByte(uint8_t byte) return; } if (state == TS_DATA_LOW) { - ((uint8_t*)&frskyHubData)[structPos] = byte; + lowByte = byte; state = TS_DATA_HIGH; return; } + + 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; + } + 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; + } + + 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) { + state = TS_IDLE; + return; + } + } + + ((uint8_t*)&frskyHubData)[structPos] = lowByte; ((uint8_t*)&frskyHubData)[structPos+1] = byte; - if ((uint8_t)structPos == offsetof(FrskyHubData, baroAltitude) && !frskyHubData.baroAltitudeOffset) { + if ((uint8_t)structPos == offsetof(FrskyHubData, baroAltitude_bp) && !frskyHubData.baroAltitudeOffset) { // First received altitude => Altitude offset - frskyHubData.baroAltitudeOffset = -frskyHubData.baroAltitude; + frskyHubData.baroAltitudeOffset = -frskyHubData.baroAltitude_bp; } - if ((uint8_t)structPos == offsetof(FrskyHubData, gpsLatitudeNS/*TODO check that it is received at last!*/) && !frskyHubData.pilotLatitude) { - // First received GPS position => Pilot GPS position - getGpsPilotPosition(); + if ((uint8_t)structPos == offsetof(FrskyHubData, gpsAltitude_ap)) { + if (!frskyHubData.pilotLatitude && !frskyHubData.pilotLongitude) { + // First received GPS position => Pilot GPS position + getGpsPilotPosition(); + } + else if (frskyHubData.gpsDistNeeded || g_eeGeneral.view == e_telemetry+4*ALTERNATE_VIEW) { + getGpsDistance(); + } } if ((uint8_t)structPos == offsetof(FrskyHubData, gpsSpeed_bp)) { // Speed => Max speed - if (frskyHubData.gpsLatitude_bp && frskyHubData.gpsLongitude_bp) { - if (frskyHubData.maxGpsSpeed < frskyHubData.gpsSpeed_bp) - frskyHubData.maxGpsSpeed = frskyHubData.gpsSpeed_bp; - } + if (frskyHubData.maxGpsSpeed < frskyHubData.gpsSpeed_bp) + frskyHubData.maxGpsSpeed = frskyHubData.gpsSpeed_bp; } if ((uint8_t)structPos == offsetof(FrskyHubData, volts)) { @@ -196,9 +256,9 @@ void parseTelemHubByte(uint8_t byte) void parseTelemWSHowHighByte(uint8_t byte) { if (frskyUsrStreaming < (FRSKY_TIMEOUT10ms*3 - 10)) // At least 100mS passed since last data received - ((uint8_t*)&frskyHubData)[offsetof(FrskyHubData, baroAltitude)] = byte; + ((uint8_t*)&frskyHubData)[offsetof(FrskyHubData, baroAltitude_bp)] = byte; else - ((uint8_t*)&frskyHubData)[offsetof(FrskyHubData, baroAltitude)+1] = byte; + ((uint8_t*)&frskyHubData)[offsetof(FrskyHubData, baroAltitude_bp)+1] = byte; frskyUsrStreaming = FRSKY_TIMEOUT10ms*3; // reset counter } #endif @@ -238,6 +298,7 @@ void processFrskyPacket(uint8_t *packet) frskyTelemetry[1].set(packet[2]); frskyRSSI[0].set(packet[3]); frskyRSSI[1].set(packet[4] / 2); + frskyStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected break; #if defined(FRSKY_HUB) || defined (WS_HOW_HIGH) case USRPKT: // User Data packet @@ -257,7 +318,6 @@ void processFrskyPacket(uint8_t *packet) } FrskyRxBufferReady = 0; - frskyStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected } // Receive buffer state machine state defs @@ -405,7 +465,7 @@ void FRSKY10mspoll(void) *ptr++ = 0x00; // Now send a packet - FrskyAlarmSendState -= 1 ; + FrskyAlarmSendState -= 1; uint8_t alarm = 1 - (FrskyAlarmSendState % 2); if (FrskyAlarmSendState < 4) { uint8_t channel = 1 - (FrskyAlarmSendState / 2); @@ -547,7 +607,7 @@ void resetTelemetry() #endif #if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) - frskyHubData.baroAltitudeOffset = -frskyHubData.baroAltitude; + frskyHubData.baroAltitudeOffset = -frskyHubData.baroAltitude_bp; #endif @@ -555,7 +615,13 @@ void resetTelemetry() frskyHubData.maxGpsSpeed = 0; frskyHubData.cellsCount = 0; frskyHubData.minCellVolts = 0; - getGpsPilotPosition(); + frskyHubData.pilotLatitude = 0; + frskyHubData.pilotLongitude = 0; + frskyHubData.gpsLatitude_bp = 2; + frskyHubData.gpsLongitude_bp = 2; + frskyHubData.gpsFix = -1; + frskyHubData.gpsDistNeeded = 0; + frskyHubData.gpsDistance = 0; #endif #ifdef SIMU @@ -569,63 +635,3 @@ void resetTelemetry() #endif } -#ifdef FRSKY_HUB -uint16_t sqrt32(uint32_t n) -{ - uint16_t c = 0x8000; - uint32_t g = 0x8000; - - for(;;) { - if(g*g > n) - g ^= c; - c >>= 1; - if(c == 0) - return g; - g |= c; - } -} - -void getGpsPilotPosition() -{ - if (frskyHubData.gpsLatitude_bp && frskyHubData.gpsLongitude_bp) { - frskyHubData.pilotLatitude = (((uint32_t)frskyHubData.gpsLatitude_bp / 100) * 1000000) + (((frskyHubData.gpsLatitude_bp % 100) * 10000 + frskyHubData.gpsLatitude_ap) * 5) / 3; - frskyHubData.pilotLongitude = (((uint32_t)frskyHubData.gpsLongitude_bp / 100) * 1000000) + (((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; - 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); -} - -uint32_t getGpsDistanceX2() -{ - if (frskyHubData.gpsLatitude_bp && frskyHubData.gpsLongitude_bp) { - uint32_t lat = (((uint32_t)frskyHubData.gpsLatitude_bp / 100) * 1000000) + (((frskyHubData.gpsLatitude_bp % 100) * 10000 + frskyHubData.gpsLatitude_ap) * 5) / 3; - uint32_t lng = (((uint32_t)frskyHubData.gpsLongitude_bp / 100) * 1000000) + (((frskyHubData.gpsLongitude_bp % 100) * 10000 + frskyHubData.gpsLongitude_ap) * 5) / 3; - - // printf("lat=%d (%d), long=%d (%d)\n", lat, abs(lat - frskyHubData.pilotLatitude), lng, abs(lng - frskyHubData.pilotLongitude)); - - uint32_t angle = (lat > frskyHubData.pilotLatitude) ? lat - frskyHubData.pilotLatitude : 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; - result += dist*dist; - - dist = frskyHubData.baroAltitude + frskyHubData.baroAltitudeOffset; - result += dist*dist; - - return result; - } - else { - return 0; - } -} - -uint16_t getGpsDistance() -{ - return (frskyHubData.pilotLatitude ? sqrt32(getGpsDistanceX2()) : 0); -} -#endif diff --git a/src/frsky.h b/src/frsky.h index ff69e09b4..1273cb439 100644 --- a/src/frsky.h +++ b/src/frsky.h @@ -70,46 +70,50 @@ class FrskyData: public FrskyRSSI { #if defined(FRSKY_HUB) struct FrskyHubData { - int16_t baroAltitudeOffset; // spare reused - 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) - uint32_t distFromEarthAxis; // 2 spares reused - int16_t gpsAltitude_ap; // after punct - uint8_t cellVolts[12]; // 6 spares reused - 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; - uint32_t pilotLatitude; // 2 spares reused - uint32_t pilotLongitude; // 2 spares reused - uint16_t baroAltitude_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) - uint8_t cellsCount; // 1/2 spare reused - uint8_t minCellVolts; // 1/2 spare reused - uint16_t current; + int16_t baroAltitudeOffset;// spare reused + int16_t gpsAltitude_bp; // 0x01 before punct + int16_t temperature1; // 0x02 -20 .. 250 deg. celcius + uint16_t rpm; // 0x03 0..60,000 revs. per minute + uint16_t fuelLevel; // 0x04 0, 25, 50, 75, 100 percent + int16_t temperature2; // 0x05 -20 .. 250 deg. celcius + uint16_t volts; // 0x06 1/500V increments (0..4.2V) + uint32_t distFromEarthAxis;// 2 spares reused + int16_t gpsAltitude_ap; // 0x01+8 after punct + uint8_t cellVolts[12]; // 6 spares reused + uint16_t baroAltitude_bp; // 0x10 0..9,999 meters + uint16_t gpsSpeed_bp; // 0x11 before punct + uint16_t gpsLongitude_bp; // 0x12 before punct + uint16_t gpsLatitude_bp; // 0x13 before punct + uint16_t gpsCourse_bp; // 0x14 before punct (0..359.99 deg. -- seemingly 2-decimal precision) + uint8_t day; // 0x15 + uint8_t month; // 0x15 + uint16_t year; // 0x16 + uint8_t hour; // 0x17 + uint8_t min; // 0x17 + uint16_t sec; // 0x18 + uint16_t gpsSpeed_ap; // 0x11+8 + uint16_t gpsLongitude_ap; // 0x12+8 + uint16_t gpsLatitude_ap; // 0x13+8 + uint16_t gpsCourse_ap; // 0x14+8 + uint32_t pilotLatitude; // 2 spares reused + uint32_t pilotLongitude; // 2 spares reused + uint16_t baroAltitude_ap; // 0x21 after punct + uint16_t gpsLongitudeEW; // 0x1A+8 East/West + uint16_t gpsLatitudeNS; // 0x1B+8 North/South + int16_t accelX; // 0x24 1/256th gram (-8g ~ +8g) + int16_t accelY; // 0x25 1/256th gram (-8g ~ +8g) + int16_t accelZ; // 0x26 1/256th gram (-8g ~ +8g) + uint8_t gpsDistNeeded:1; // 1bits out of 16bits spare reused + int8_t gpsFix:2; // 2bits out of 16bits spare reused: -1=never fixed, 0=not fixed now, 1=fixed + uint8_t spare:1; // + uint8_t cellsCount:4; // 4bits out of 16bits spare reused + uint8_t minCellVolts; // 8bits out of 16bits spare reused + uint16_t current; // 0x28 Current // 17 spares - uint16_t volts_bp; - uint16_t volts_ap; + uint16_t volts_bp; // 0x3A + uint16_t volts_ap; // 0x3B // end of FrSky Hub data + uint16_t gpsDistance; uint16_t maxGpsSpeed; }; @@ -151,11 +155,5 @@ bool FRSKY_alarmRaised(uint8_t idx); void resetTelemetry(); -#ifdef FRSKY_HUB -void getGpsPilotPosition(); -uint32_t getGpsDistanceX2(); -uint16_t getGpsDistance(); -#endif - #endif diff --git a/src/main_views.cpp b/src/main_views.cpp index d2ec0d779..6d056f9a1 100644 --- a/src/main_views.cpp +++ b/src/main_views.cpp @@ -32,19 +32,6 @@ #include "menus.h" -#define ALTERNATE_VIEW 0x10 - -enum MainViews { - e_outputValues, - e_outputBars, - e_inputs, - e_timer2, -#ifdef FRSKY - e_telemetry, -#endif - MAX_VIEWS -}; - uint8_t tabViews[] = { 1, /*e_outputValues*/ 1, /*e_outputBars*/ @@ -110,7 +97,7 @@ void displayRssiLine() void displayAltitudeLine(uint8_t x, uint8_t y, uint8_t flags) { lcd_putsn(x, y, STR_ALTnDST, 4); - int16_t value = frskyHubData.baroAltitude + frskyHubData.baroAltitudeOffset; + int16_t value = frskyHubData.baroAltitude_bp + frskyHubData.baroAltitudeOffset; putsTelemetryValue(lcd_lastPos, y, value, UNIT_METERS, flags|LEFT); } #endif @@ -141,7 +128,7 @@ void menuMainView(uint8_t event) case EVT_KEY_BREAK(KEY_LEFT): #if defined(FRSKY) #if defined(FRSKY_HUB) && defined(WS_HOW_HIGH) - tabViews[e_telemetry] = (g_model.frsky.usrProto == 0 ? 3 : (g_model.frsky.usrProto == 1 ? 5 : 4)); + tabViews[e_telemetry] = (g_model.frsky.usrProto == 0 ? 3 : ((g_model.frsky.usrProto == 1 && frskyHubData.gpsFix >= 0) ? 5 : 4)); #elif defined(FRSKY_HUB) tabViews[e_telemetry] = (g_model.frsky.usrProto == 1 ? 5 : 3); #elif defined(WS_HOW_HIGH) @@ -529,7 +516,7 @@ void menuMainView(uint8_t event) #define ALTITUDE_LINE (4*FH-1) lcd_putsLeft(ALTITUDE_LINE, STR_ALTnDST); putsTelemetryValue(4*FW, ALTITUDE_LINE, frskyHubData.gpsAltitude_bp, UNIT_METERS, LEFT); // before '.' - putsTelemetryValue(16*FW, ALTITUDE_LINE, getGpsDistance(), UNIT_METERS, LEFT); // before '.' + putsTelemetryValue(16*FW, ALTITUDE_LINE, frskyHubData.gpsDistance, UNIT_METERS, LEFT); // before '.' } else if (g_model.frsky.usrProto == PROTO_FRSKY_HUB && view == e_telemetry+3*ALTERNATE_VIEW) { // Temperature 1 diff --git a/src/myeeprom.h b/src/myeeprom.h index 94b779b29..645925652 100644 --- a/src/myeeprom.h +++ b/src/myeeprom.h @@ -69,6 +69,18 @@ PACK(typedef struct t_FrSkyRSSIAlarm { int8_t value:6; }) FrSkyRSSIAlarm; +enum MainViews { + e_outputValues, + e_outputBars, + e_inputs, + e_timer2, +#ifdef FRSKY + e_telemetry, +#endif + MAX_VIEWS +}; + +#define ALTERNATE_VIEW 0x10 PACK(typedef struct t_EEGeneral { uint8_t myVers; int16_t calibMid[7]; diff --git a/src/open9x.cpp b/src/open9x.cpp index aa2c704d3..9ddfb2f35 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -301,7 +301,7 @@ int16_t getValue(uint8_t i) #if defined(FRSKY) else if(i= MAXTRACE) s_traceWr = 0; - if (s_traceCnt >= 0) s_traceCnt++; + if (s_traceCnt >= 0) s_traceCnt++; // TODO to be checked } } // Throttle trace end diff --git a/src/open9x.h b/src/open9x.h index 818f6fd21..9cc021ca8 100644 --- a/src/open9x.h +++ b/src/open9x.h @@ -474,7 +474,7 @@ extern uint16_t g_time_per10; #define MAXTRACE 120 extern uint8_t s_traceBuf[MAXTRACE]; -extern uint16_t s_traceWr; +extern uint8_t s_traceWr; extern int8_t s_traceCnt; extern int8_t *s_trimPtr[NUM_STICKS]; @@ -552,6 +552,8 @@ template FORCEINLINE t max(t a, t b) { return a>b?a:b; } template FORCEINLINE t sgn(t a) { return a>0 ? 1 : (a < 0 ? -1 : 0); } template FORCEINLINE t limit(t mi, t x, t ma) { return min(max(mi,x),ma); } +uint16_t isqrt32(uint32_t n); + /// Markiert einen EEPROM-Bereich als dirty. der Bereich wird dann in /// eeCheck ins EEPROM zurueckgeschrieben. void eeWriteBlockCmp(const void *i_pointer_ram, uint16_t i_pointer_eeprom, size_t size); diff --git a/src/pers.cpp b/src/pers.cpp index 1f75b3278..d51619c5e 100644 --- a/src/pers.cpp +++ b/src/pers.cpp @@ -128,6 +128,7 @@ void eeLoadModel(uint8_t id) } // TODO optim: resetAll() + // TODO s_traceCnt to be reset? resetTimer(0); resetTimer(1); resetProto(); diff --git a/src/simpgmspace.cpp b/src/simpgmspace.cpp index 41025594f..6cda4df09 100644 --- a/src/simpgmspace.cpp +++ b/src/simpgmspace.cpp @@ -130,7 +130,7 @@ void *main_thread(void *) perMain(); #if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) - frskyHubData.baroAltitude = 500; + frskyHubData.baroAltitude_bp = 500; #endif sleep(1/*ms*/); diff --git a/src/statistics_views.cpp b/src/statistics_views.cpp index 5f1a06dbc..0f0a6e46a 100644 --- a/src/statistics_views.cpp +++ b/src/statistics_views.cpp @@ -57,9 +57,9 @@ void menuProcStatistic(uint8_t event) lcd_puts( 17*FW, FH*0, STR_TOT); putsTime( 12*FW, FH*0, s_timeCumTot, 0, 0); - uint16_t traceRd = s_traceCnt>MAXTRACE ? s_traceWr : 0; - uint8_t x=5; - uint8_t y=60; + uint8_t traceRd = (s_traceCnt < 0 ? s_traceWr : 0); + const uint8_t x=5; + const uint8_t y=60; lcd_hline(x-3,y,120+3+3); lcd_vline(x,y-32,32+3);