Marten83
25.10.2009, 10:20
Hallo Zusammen,
ich habe ein Problem mit mehreren Strings in einer Zeile eines Grafikdisplays mit T6963C Controller.
Ich benutze die Routinen von Nico Sachs (im Anhang).
Folgendes Verhalten:
Ich habe eine Menüebene in der ich Werte anzeige.
Diese Werte sind aus mehreren Strings zusammengesetzt, weil ich möglichst wenig Zeit für die Datenübertragung zum Display opfern will.
Bei erstmaligem Eintritt in diese Menüebene funktioniert die Anzeige auch Problemlos, aber bei Wiedereintritt aus einer anderen Menüebene heraus werden anscheinend die Startpositionen verschoben und es kommt nur Murks auf dem Display an.
Hier mal mein Menüteil:
void screen_gps(void)
{
/*Variablendeklaration für Menüebene*/
static char cog_comp [7];
static char sog_comp [7];
static char lat_deg_comp [4];
static char lat_min0_comp [4];
static char lat_min1_comp [5];
static char lon_deg_comp [5];
static char lon_min0_comp [4];
static char lon_min1_comp [5];
if(menu.do_once == 0)
{
glcd_clear_text();
glcd_clear_graph();
glcd_line(0, 9, 239, 9, 1);
glcd_print2_P(0,80, "Kurs:", &Arial__10, 0);
glcd_print2_P(0,98, "Geschw.:", &Arial__10, 0);
/*Funktionsanzeige der Tasten*/
glcd_line(0, 118, 239, 118, 1);
glcd_print(35, 15, "Menü");
}
//gpsdaten auswerten
if(rmc.status == 1)
{
/*Display time*/
if ((rmc.utc_time [2] == '0' && rmc.utc_time [3] == '0') || menu.do_once == 0)
{
char hr_temp [4];
char date_temp [9];
int8_t hr_calc;
hr_temp [0] = rmc.utc_time [0];
hr_temp [1] = rmc.utc_time [1];
hr_temp [2] = '\0';
hr_calc = atoi (&hr_temp [0]);
hr_calc += menu.timezone;
hr_calc += menu.summer;
if (hr_calc < 0)
{
hr_calc += 24;
}
else if (hr_calc >= 24)
{
hr_calc -= 24;
//inc date
}
if (hr_calc <= 9)
{
hr_temp [0] = '0';
menu.temp = 1;
}
else
{
menu.temp = 0;
}
utoa (hr_calc, &hr_temp [menu.temp], 10);
hr_temp [2] = ':';
hr_temp [3] = '\0';
date_temp [0] = rmc.date [0];
date_temp [1] = rmc.date [1];
date_temp [2] = '.';
date_temp [3] = rmc.date [2];
date_temp [4] = rmc.date [3];
date_temp [5] = '.';
date_temp [6] = rmc.date [4];
date_temp [7] = rmc.date [5];
date_temp [8] = '\0';
glcd_print (32, 0, &hr_temp [0]);
glcd_print (0, 0, &date_temp [0]);
}
if ((rmc.utc_time [4] == '0' && rmc.utc_time [5] == '0') || menu.do_once == 0)
{
char min_temp [4];
min_temp [0] = rmc.utc_time [2];
min_temp [1] = rmc.utc_time [3];
min_temp [2] = ':';
min_temp [3] = '\0';
glcd_print (35, 0, &min_temp [0]);
}
glcd_print (38, 0, &rmc.utc_time[4]);
/**/
if (strcmp (rmc.cog, cog_comp) != 0)
{
uint8_t len_cog = (6 - strlen (rmc.cog));
uint8_t i;
for (i = 0; i <= len_cog; i++)
{
glcd_print2_P (80 + (i * 12), 80, " ", &Arial__10N, 0);
}
glcd_print2 ((80 + (len_cog * 12)), 80, &rmc.cog [0], &Arial__10N, 0);
glcd_print2 (200, 80, "°", &Arial__10N, 0);
strcpy (&cog_comp [0], &rmc.cog [0]);
}
if (strcmp (rmc.sog, sog_comp) != 0)
{
uint8_t len_sog = (6 - strlen (rmc.sog));
uint8_t i;
for (i = 0; i <= len_sog; i++)
{
glcd_print2_P (80 + (i * 12), 98, " ", &Arial__10N, 0);
}
if (rmc.sog [0] == 0)
{
glcd_print2_P (116, 98, "-.--", &Arial__10N, 0);
}
else
{
glcd_print2 ((80 + (len_sog * 12)), 98, &rmc.sog [0], &Arial__10N, 0);
}
glcd_print2 (200, 98, "kn", &Arial__10, 0);
strcpy (&sog_comp [0], &rmc.sog [0]);
}
/*print latitude if changed*/
if (strncmp (rmc.lat, lat_deg_comp, 2) != 0 || menu.do_once == 0)
{
strncat (&lat_deg_comp [0], &rmc.lat [0], 2);
strcat (&lat_deg_comp [2], "°");
glcd_print2 (18, 12, &lat_deg_comp [0], &Arial__10N, 0);
}
if (strncmp (&rmc.lat [2], &lat_min0_comp [0], 2) != 0 || menu.do_once == 0)
{
strncat (&lat_min0_comp [0], &rmc.lat [2], 3);
glcd_print2 (71, 12, &lat_min0_comp [0], &Arial__10N, 0);
}
if (strncmp (&rmc.lat [5], &lat_min1_comp [0], 4) != 0 || menu.do_once == 0)
{
strncat (&lat_min1_comp [0], &rmc.lat [5], 4);
glcd_print2 (125,12, &lat_min1_comp [0], &Arial__10N, 0);
}
/*print longitude if changed*/
if (strncmp (rmc.lon, &lon_deg_comp [0], 3) != 0 || menu.do_once == 0)
{
strncat (&lon_deg_comp [0], &rmc.lon [0], 3);
lon_deg_comp [3] = '°';
lon_deg_comp [4] = '\0';
glcd_print2 (0, 38, &lon_deg_comp [0], &Arial__10N, 0);
}
if (strncmp (&rmc.lon [3], &lon_min0_comp [0], 2) != 0 || menu.do_once == 0)
{
strncat (&lon_min0_comp [0], &rmc.lon [3], 3);
glcd_print2 (71, 38, &lon_min0_comp [0], &Arial__10N, 0);
}
if (strncmp (&rmc.lon [6], &lon_min1_comp [0], 4) != 0 || menu.do_once == 0)
{
strncat (&lon_min1_comp [0], &rmc.lon [6], 4);
glcd_print2 (125,38, &lon_min1_comp [0], &Arial__10N, 0);
}
}
else
{
//keine Navigation möglich!
}
//glcd_print2((120-(strlen(rmc.cog)*11)),90, rmc.cog, &Arial__12, 0);
//glcd_print2_P(112, 90, "°", &Arial__12, 0);
//glcd_print2(175,90, rmc.sog, &Arial__12, 0);
menu.do_once = 1;
switch (get_key(CLR))
{
case MENU:
menu.index = 60;
menu.do_once = 0;
break;
}
}//screen_gps
Hat jemand eine Idee woran das liegen kann?
Vielen Dank!
MfG, Marten83
ich habe ein Problem mit mehreren Strings in einer Zeile eines Grafikdisplays mit T6963C Controller.
Ich benutze die Routinen von Nico Sachs (im Anhang).
Folgendes Verhalten:
Ich habe eine Menüebene in der ich Werte anzeige.
Diese Werte sind aus mehreren Strings zusammengesetzt, weil ich möglichst wenig Zeit für die Datenübertragung zum Display opfern will.
Bei erstmaligem Eintritt in diese Menüebene funktioniert die Anzeige auch Problemlos, aber bei Wiedereintritt aus einer anderen Menüebene heraus werden anscheinend die Startpositionen verschoben und es kommt nur Murks auf dem Display an.
Hier mal mein Menüteil:
void screen_gps(void)
{
/*Variablendeklaration für Menüebene*/
static char cog_comp [7];
static char sog_comp [7];
static char lat_deg_comp [4];
static char lat_min0_comp [4];
static char lat_min1_comp [5];
static char lon_deg_comp [5];
static char lon_min0_comp [4];
static char lon_min1_comp [5];
if(menu.do_once == 0)
{
glcd_clear_text();
glcd_clear_graph();
glcd_line(0, 9, 239, 9, 1);
glcd_print2_P(0,80, "Kurs:", &Arial__10, 0);
glcd_print2_P(0,98, "Geschw.:", &Arial__10, 0);
/*Funktionsanzeige der Tasten*/
glcd_line(0, 118, 239, 118, 1);
glcd_print(35, 15, "Menü");
}
//gpsdaten auswerten
if(rmc.status == 1)
{
/*Display time*/
if ((rmc.utc_time [2] == '0' && rmc.utc_time [3] == '0') || menu.do_once == 0)
{
char hr_temp [4];
char date_temp [9];
int8_t hr_calc;
hr_temp [0] = rmc.utc_time [0];
hr_temp [1] = rmc.utc_time [1];
hr_temp [2] = '\0';
hr_calc = atoi (&hr_temp [0]);
hr_calc += menu.timezone;
hr_calc += menu.summer;
if (hr_calc < 0)
{
hr_calc += 24;
}
else if (hr_calc >= 24)
{
hr_calc -= 24;
//inc date
}
if (hr_calc <= 9)
{
hr_temp [0] = '0';
menu.temp = 1;
}
else
{
menu.temp = 0;
}
utoa (hr_calc, &hr_temp [menu.temp], 10);
hr_temp [2] = ':';
hr_temp [3] = '\0';
date_temp [0] = rmc.date [0];
date_temp [1] = rmc.date [1];
date_temp [2] = '.';
date_temp [3] = rmc.date [2];
date_temp [4] = rmc.date [3];
date_temp [5] = '.';
date_temp [6] = rmc.date [4];
date_temp [7] = rmc.date [5];
date_temp [8] = '\0';
glcd_print (32, 0, &hr_temp [0]);
glcd_print (0, 0, &date_temp [0]);
}
if ((rmc.utc_time [4] == '0' && rmc.utc_time [5] == '0') || menu.do_once == 0)
{
char min_temp [4];
min_temp [0] = rmc.utc_time [2];
min_temp [1] = rmc.utc_time [3];
min_temp [2] = ':';
min_temp [3] = '\0';
glcd_print (35, 0, &min_temp [0]);
}
glcd_print (38, 0, &rmc.utc_time[4]);
/**/
if (strcmp (rmc.cog, cog_comp) != 0)
{
uint8_t len_cog = (6 - strlen (rmc.cog));
uint8_t i;
for (i = 0; i <= len_cog; i++)
{
glcd_print2_P (80 + (i * 12), 80, " ", &Arial__10N, 0);
}
glcd_print2 ((80 + (len_cog * 12)), 80, &rmc.cog [0], &Arial__10N, 0);
glcd_print2 (200, 80, "°", &Arial__10N, 0);
strcpy (&cog_comp [0], &rmc.cog [0]);
}
if (strcmp (rmc.sog, sog_comp) != 0)
{
uint8_t len_sog = (6 - strlen (rmc.sog));
uint8_t i;
for (i = 0; i <= len_sog; i++)
{
glcd_print2_P (80 + (i * 12), 98, " ", &Arial__10N, 0);
}
if (rmc.sog [0] == 0)
{
glcd_print2_P (116, 98, "-.--", &Arial__10N, 0);
}
else
{
glcd_print2 ((80 + (len_sog * 12)), 98, &rmc.sog [0], &Arial__10N, 0);
}
glcd_print2 (200, 98, "kn", &Arial__10, 0);
strcpy (&sog_comp [0], &rmc.sog [0]);
}
/*print latitude if changed*/
if (strncmp (rmc.lat, lat_deg_comp, 2) != 0 || menu.do_once == 0)
{
strncat (&lat_deg_comp [0], &rmc.lat [0], 2);
strcat (&lat_deg_comp [2], "°");
glcd_print2 (18, 12, &lat_deg_comp [0], &Arial__10N, 0);
}
if (strncmp (&rmc.lat [2], &lat_min0_comp [0], 2) != 0 || menu.do_once == 0)
{
strncat (&lat_min0_comp [0], &rmc.lat [2], 3);
glcd_print2 (71, 12, &lat_min0_comp [0], &Arial__10N, 0);
}
if (strncmp (&rmc.lat [5], &lat_min1_comp [0], 4) != 0 || menu.do_once == 0)
{
strncat (&lat_min1_comp [0], &rmc.lat [5], 4);
glcd_print2 (125,12, &lat_min1_comp [0], &Arial__10N, 0);
}
/*print longitude if changed*/
if (strncmp (rmc.lon, &lon_deg_comp [0], 3) != 0 || menu.do_once == 0)
{
strncat (&lon_deg_comp [0], &rmc.lon [0], 3);
lon_deg_comp [3] = '°';
lon_deg_comp [4] = '\0';
glcd_print2 (0, 38, &lon_deg_comp [0], &Arial__10N, 0);
}
if (strncmp (&rmc.lon [3], &lon_min0_comp [0], 2) != 0 || menu.do_once == 0)
{
strncat (&lon_min0_comp [0], &rmc.lon [3], 3);
glcd_print2 (71, 38, &lon_min0_comp [0], &Arial__10N, 0);
}
if (strncmp (&rmc.lon [6], &lon_min1_comp [0], 4) != 0 || menu.do_once == 0)
{
strncat (&lon_min1_comp [0], &rmc.lon [6], 4);
glcd_print2 (125,38, &lon_min1_comp [0], &Arial__10N, 0);
}
}
else
{
//keine Navigation möglich!
}
//glcd_print2((120-(strlen(rmc.cog)*11)),90, rmc.cog, &Arial__12, 0);
//glcd_print2_P(112, 90, "°", &Arial__12, 0);
//glcd_print2(175,90, rmc.sog, &Arial__12, 0);
menu.do_once = 1;
switch (get_key(CLR))
{
case MENU:
menu.index = 60;
menu.do_once = 0;
break;
}
}//screen_gps
Hat jemand eine Idee woran das liegen kann?
Vielen Dank!
MfG, Marten83