Fragen zu CLCDDisplay

the_moon
Einsteiger
Einsteiger
Beiträge: 223
Registriert: Samstag 25. Januar 2003, 11:18

Fragen zu CLCDDisplay

Beitrag von the_moon »

Momentan exprementiere mit CLCDDisplay Klasse und eine Sache ist mir irgendwie unklar. Ich benutze CLCD Klasse aus Neutrino als Beispiel.

Ich möchte ein Satz über LCD Display laufen lassen. Dafuer mache ich so:

Code: Alles auswählen

/* clear text area */
display.draw_fill_rect ( 0, 8 , 120, 30, CLCDDisplay::PIXEL_OFF );
/* draw shifted text on new place */
fonts.menutitle->RenderString( 1 - _frame , 20, 120 + _frame, _filename.c_str() , CLCDDisplay::PIXEL_ON, 0, true ); 	
/* show changes */
displayUpdate();
Wie man sieht ich rufe displayUpdate(); nur ein Mal. Aber trotzdem der Text flimmert so zusagen. Man kann fast sehen wie der Text gelöscht und neu aufgebaut wird. Wie kann ich das richtig machen? Vielleicht weisst es jemand.

Danke
ChakaZulu
Developer
Beiträge: 457
Registriert: Sonntag 23. März 2003, 00:39

Beitrag von ChakaZulu »

hi,

vielleicht zeigst Du noch den Code aussenrum? Wenn die komplette Routine sehr oft aufgerufen wird, hast Du ja das gleiche Problem. Du kannst ja auch mal ein printf reinpacken :)

ciao,

ChakaZulu
the_moon
Einsteiger
Einsteiger
Beiträge: 223
Registriert: Samstag 25. Januar 2003, 11:18

Beitrag von the_moon »

ChakaZulu hat geschrieben:Wenn die komplette Routine sehr oft aufgerufen wird, hast Du ja das gleiche Problem.
Ja, das wird sehr oft aufgerufen_ das ist der Sinn der Sache. Aber ich dachte durch updateDisplay wird so "backbuffer" realisiert und solche Probleme sollten nicht da sein.

hier ist alles, die Routine sollte ein Text (filename) zeigen und wenn der Text zu gross ist, dann wird er dürch das Display gescrollt. Die Routine ist noch nicht fertig und nicht perfekt. :roll:

Code: Alles auswählen

unsigned long CLCD::ShowPlayingFile( const std::string _filename, const char _percentover, unsigned long _frame )
{
	static int x = 0;
	static int y = 0;

	if( 0 == _frame )
	{
		
		x = 0;
		y = 0;

		// clear screen
		display.draw_fill_rect ( 0, 0 , 120, 70, CLCDDisplay::PIXEL_OFF );
	}

	int title_width = fonts.menutitle->getRenderWidth( _filename.c_str(), true );


	if( _frame == title_width )
	{
		_frame = 1;
	} 

	if( 120 < title_width )
	{
		display.draw_fill_rect ( 0, 8 , 120, 30, CLCDDisplay::PIXEL_OFF );

		fonts.menutitle->RenderString( 1 - _frame , 20, 120 + _frame, _filename.c_str() , CLCDDisplay::PIXEL_ON, 0, false ); // UTF-8
	
		if( title_width - _frame < 120 )
		{
			fonts.menutitle->RenderString( 120 - title_width - _frame + 5 , 20, title_width - _frame + 5, _filename.c_str() , CLCDDisplay::PIXEL_ON, 0, false ); // UTF-8
		}
	}
	else
		fonts.menutitle->RenderString( 1, 20, 120, _filename.c_str() , CLCDDisplay::PIXEL_ON, 0, true ); // UTF-8
	
	
	showPercentOver( _percentover, false );
	displayUpdate();
	return _frame+1;

}
Und so wird es aufgerufen, 10 mal in der sekunde.

Code: Alles auswählen

frame = CLCD::getInstance()->ShowPlayingFile( "some text",  44, frame );

frame ist ein Zähler. Es wird erstmal auf null gesetzt und dann vorwards gezählt.