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.
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.