Char innerhalb einer Funktion in PROGMEM ablegen

Gast #1279309
Lesenswert?

Hi,

super danke. Habe ich glatt übersehen. Habe folgende Lösung 
implementiert

#define lcd_print_p(__s, __a, __b, __c, __d, __e) lcd_print_P(PSTR(__s), 
__a, __b, __c, __d, __e)

void lcd_print_P( const char* pgmString, int x,int y,int size,unsigned 
char fc,unsigned char bc )
{
  char string[40];

  strcpy_P( string, pgmString );

  lcd_print(string,x,y,size,fc,bc);

}

...

lcd_print_p( " === Neuer Timer ===",2,5,0,Rot,Blau);
...

Wenn einer eine bessere Lösung kennt, immer raus damit.

Wenn nicht schon mal danke

Gruß

Frank
Persönliche Seite #1279324
Lesenswert?

Frank schrieb:
> Hi,
>
> super danke. Habe ich glatt übersehen. Habe folgende Lösung
> implementiert
>
> #define lcd_print_p(__s, __a, __b, __c, __d, __e) lcd_print_P(PSTR(__s),
> __a, __b, __c, __d, __e)
>
> void lcd_print_P( const char* pgmString, int x,int y,int size,unsigned
> char fc,unsigned char bc )
> {
>   char string[40];
>
>   strcpy_P( string, pgmString );
>
>   lcd_print(string,x,y,size,fc,bc);
>
> }
>
> ...
>
> lcd_print_p( " === Neuer Timer ===",2,5,0,Rot,Blau);
> ...
>
> Wenn einer eine bessere Lösung kennt, immer raus damit.

Ich fände hier besser, die Ausgabe von Flash-Strings direkt zu 
unterstützen in lcd_print. Die Funktion bräuchte dann allerdings nen 
weiteren Parameter, der angibt, ob die übergebene String-Adresse sich 
auf den RAM bezieht oder auf's Flash. Das würde die Rumkopiererei 
sparen:
1
void lcd_print (const char * str, uint8_t in_flash, ...)
2
{
3
    char c;
4
    ...
5
    if (in_flash)
6
        c = pgm_read_byte (str++);
7
    else
8
        c = *str++;
9
    ...
10
}
Darauf könntest du dann Makros legen, etwa
1
#define LCD_PRINT_RAM(STR,X,Y) lcd_print (STR, 0, X, Y)
2
#define LCD_PRINT_FLASH(STR,X,Y) lcd_print (PSTR(STR), 1, X, Y)

Ist aber auch Geschmackssache.

Schliesslich böte sich noch an, ne eigene, printf-ähnliche Funktion zu 
schreiben, in der per %-Kommando die print-Koordinaten gesetzt werden 
könnten. %K würde z.B. zwei Koordinaten erfordern:
1
lcd_printf ("%KHallo%KBingo", 0, 0, 10, 3);

Johann
Gast #1279434
Lesenswert?

Hallo Johann,

auch nicht schlecht die Idee. Ich muss aber gestehen, ich habe etwas 
gesucht was einfach zu ändern ist. Mir ist einfach der Speicherbedarf zu 
hoch gegangen.

Jetzt suche ich auch noch eine einfache Möglichkeit die folgende 
Struktur ins Progmem zu schieben und wieder drauf zu zu greifen.

typedef void FUNC(void);
typedef FUNC *func;

void MenuSetzeTimer( void )
{
  ....
}

struct stMenu
{
  const char szOut[20];
  func funktion;
};

struct stMenu  PROGMEM stMenuStart[] =
{ {"  ===== Menu =====", NULL},
  {"Timer", MenuSetzeTimer },
  { "" }};


Aufruf :

lcd_print_P( Menu[i].szOut,5,25,0,Blau,Gelb); <--- Geht nicht

Menu[i].funktion(); <--- Geht nicht

Danke und Gruß

Frank

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren