Forum: Compiler & IDEs Char innerhalb einer Funktion in PROGMEM ablegen


von Frank (Gast)


Lesenswert?

Hallo zusammen,

kann ich den nachfolgenden Ausdruck irgendwie innerhalb dieser Funktion 
so umschreiben, dass der String im Progmem abgelegt wird? (Geht um das " 
== Setze Uhrzeit ==")

lcd_print( " == Setze Uhrzeit ==",2,5,0,Rot,Blau);

Danke vorab und Gruß

Frank

von Oliver (Gast)


Lesenswert?


von Frank (Gast)


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

von Johann L. (gjlayde) Benutzerseite


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

von Frank (Gast)


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

von Falk B. (falk)


Lesenswert?

@  Frank (Gast)

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


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

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

Weil Klammern fehlen.
1
typedef void (*state_func)(void);  // define a function pointer

MfG
Falk

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.