Jump to content

Information menu


Alan Chang

Recommended Posts

I'm not really sure whether I understand what you want to achieve, but in general: Use a GTimer inside  your custom widget to implement things like animations, flashing and stuff like that. But keep in mind that you are only allowed to draw in the one drawing/rendering function. So use the GTimer only to change an internal flag and draw based on the state of the flag.

Link to comment
Share on other sites

Hi Joel,

Thanks for your information.

 

I used one gdispFillStringBox() to display the clock in my widget.

The time format is "hr : min : sec".

When I set the clock, it will start in hours and then minutes.

I want to let the number be ticking.

It means now it is setting the "hours".

Should I use Gtimer ?

 

If I use Gtimer, do I need to separate the time format?

For example, use five gdispFillStringBox() to display on screen.

First gdispFillStringBox() is for hours.

Second gdispFillStringBox() is for ":".

Tried gdispFillStringBox() is for minutes.

Fourth gdispFillStringBox() is for ":".

Fifth gdispFillStringBox() is for Second.

 

Finally I use Gimer to control each to make ticking style when set the time for hours and minute.

 Is it correct?

Hope you can understand.

 

Thanks.

 

Link to comment
Share on other sites

Hello Alan,

Using a GTimer inside the custom widget to make the digits flash is definitely the (only) right approach.

You can either separate the gdispFillStringBox() into multiple ones or (and this should be fast), simply use gdispFillArea() to render a rectangle over the portion of the string you want to hide momentarily (to make it look like it flashes). You can use gdispGetStringWidth() to find the correct width of the rectangle.

Link to comment
Share on other sites

Hi Joel,

 

Very thanks for your information.

 

I have another question.

When I set the digits, the value will be increased by press hardware button.

At this moment should I stop the Gtimer?

And then use gdispGFillString() to cover and show the increased digits.

After no change, update new value to clock immediately and re-start Gtimer.

Is that ok?

 

Or is there other way to process this display?

 

Thanks.

 

Link to comment
Share on other sites

Whether that is okay or not is something you need to decide yourself. You have to implement the widget the way you like it :) 

The GTimer should definitely only run while you're editing the numbers. I'd add API for that, something like:

mywidgetHoursSet(GHandle gh, uint8_t value);
mywidgetMinutesSet(GHandle gh, uint8_t value);

mywidgetHoursFlash(GHandle gh, bool_t enabled);
mywidgetMinutesFlash(GHandle gh, bool_t enabled);

So when you want to start changing the hours, you'd do this:

// Start flashing the hours digits
mywidgetHoursFlash(ghWidget, TRUE);

// Some code that allows the user to modify the hours
while (...) {
  // ...
  mywidgetHoursSet(ghWidget, <newValue>);
  // ...
}

// Done changing the hours - stop flashing
mywidgetHoursFlash(ghWidget, FALSE);

 

Link to comment
Share on other sites

I'm pretty sure that you're using gdispDrawString() instead of gdispFillString() or gdispFillStringBox(). The gdispDrawString() only renders (changes) the pixel of the actual new string. Everything else remains the same. gdispFillString() and gdispFillStringBox() will clear the pixels not occupied by the string with the corresponding background color. Use those.

Link to comment
Share on other sites

Hi Joel,

O.o I am really using the gdispFillString() to display the time.

Here is the part of my code.

			sprintf((char*)MODEDATABUFFER, "%0.2d",newhours);
			gdispFillString(u_x+INFO_PADDING_LEFT_X+76, 
										u_y+INFO_PADDING_LEFT_Y+30, 
										MODEDATABUFFER, 
										u_font, 
										colors->text, 
										Orange);
		sprintf((char*)MODEDATABUFFER, "%0.2d",newminutes);
		gdispFillString(u_x+INFO_PADDING_LEFT_X+108, 
										u_y+INFO_PADDING_LEFT_Y+30, 
										MODEDATABUFFER, 
										u_font, 
										colors->text, 
										Orange);
		sprintf((char*)MODEDATABUFFER, "%0.2d",newseconds);
		gdispFillString(u_x+INFO_PADDING_LEFT_X+145, 
										u_y+INFO_PADDING_LEFT_Y+30, 
										MODEDATABUFFER, 
										u_font, 
										colors->text, 
										Orange);

 

Then I used the gtimer to update the time.

 

However, when I changed to use gdispFillStringBox, every thing is fine.

The digits is well on the screen.

So now I change gdispFillStringBox to display the time.

 

Thanks.

 

 

Link to comment
Share on other sites

gdispFillString() does only fill the bounding rectangle of the string. The bounding rectangle depends on the string you are rendering - although you use the same font you'll have different rectangles based on the string.

gdispFillStringBox() allows you to specify the size of the box. Hence that is the correct one to use in this case.

Link to comment
Share on other sites

Hi Joel,

 

Thanks for your explanation.

Now I totally use the gdispFillStringBox() to show the string.

 

Unfortunately, I found some issue again.

When I change the page to next, there is sometimes remained the ghost picture from last page.

DSC_0397.thumb.JPG.ba59813a2884317f66c1213c673e260e.JPG

 

I tried to use gdispFillArea() to clear the string box area.

It still can not be solved.

 

Here is my code to show page.

void modeIconDisplay(uint8_t modePage){
...
		gdispFillArea(0, u_y+INFO_PADDING_LEFT_Y, dispwidth, u_fheight, Black);			
		sprintf((char*)MODEICONBUFFER, " Time");
		DATAWIDTH = gdispGetStringWidth(MODEICONBUFFER, u_font);
		gdispFillStringBox(0, 
											 u_y+INFO_PADDING_LEFT_Y, 
											 dispwidth, 
											 u_fheight, 
											 MODEICONBUFFER, 
											 u_font, 
											 colors->text, 
											 SkyBlue, 
											 justifyLeft);	
...}

void modeDataDisplay(uint8_t modePage){
...
			sprintf((char*)MODEDATATIME_HOURSEBUFFER, "%0.2d",newModeitemInfo.hours);			
			gdispFillStringBox(u_x+INFO_PADDING_LEFT_X+80, 
												 u_y+INFO_PADDING_LEFT_Y, 
												34, 
												u_fheight, 
												MODEDATATIME_HOURSBUFFER, 
												u_font, 
												colors->text, 
												SkyBlue, 
												justifyCenter);
		
		printf((char*)MODEDATATIME_MINUTESBUFFER, "%0.2d",newModeitemInfo.minutes);
		gdispFillStringBox(u_x+INFO_PADDING_LEFT_X+128, 
											 u_y+INFO_PADDING_LEFT_Y, 
											 34, 
											 u_fheight, 
											 MODEDATATIME_MINUTESBUFFER, 
											 u_font, 
											 colors->text, 
											 SkyBlue, 
											 justifyCenter);
											 
		sprintf((char*)MODEDATATIME_SECONDSBUFFER, "%0.2d",newModeitemInfo.seconds);	
		gdispFillStringBox(u_x+INFO_PADDING_LEFT_X+185, 
											u_y+INFO_PADDING_LEFT_Y, 
											34, 
											u_fheight,
											MODEDATATIME_SECONDSBUFFER, 
											u_font, 
											colors->text, 
											Silver, 
											justifyCenter);
...
}

 

How cam I fix it?

 

Thanks.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...