TiLDA MK3/ugfx: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
The badge makes use of uGFX for providing drawing functions on the LCD. Most of this functionality is available through the micropython interface, and you may wish to browse the [https://wiki.ugfx.io/index.php/Main_Page uGFX documentation] for more details | The badge makes use of uGFX for providing drawing functions on the LCD. Most of this functionality is available through the micropython interface, and you may wish to browse the [https://wiki.ugfx.io/index.php/Main_Page uGFX documentation] for more details | ||
== | == Basic usage == | ||
uGFX is comprised of 'widgets,' such as buttons and labels, and 'containers' which are used to group widgets. | |||
To create a button on the screen, use <code>ugfx.Button(x,y,width,height,text)</code>, and a button will be drawn on the screen. | |||
As well as widgets, there are 'primitives' such as drawing circles and lines, which can be drawn anywhere on the screen or in a container. | |||
For example <code>ugfx.circle(50,50,20,ugfx.RED)</code> will draw a circle. | |||
== Detailed documentation == | == Detailed documentation == | ||
Line 41: | Line 26: | ||
=== Containers === | === Containers === | ||
==== ugfx.circle(<x>,<y>,<diameter>,<colour>) | === Primitives === | ||
All primitives can be drawn anywhere on the screen with, for example <code>ugfx.circle(..)</code>, or anywhere within a container, with <code>c=ugfx.Container(30,30,100,100); c.circle(..)</code> | |||
==== Circle ==== | |||
<code>.circle(<x>,<y>,<diameter>,<colour>)</code> | |||
<code>.fill_circle(<x>,<y>,<diameter>,<colour>)</code> | |||
Draws a circle at <x>,<y> of <diameter> with a 1 pixel border | Draws a circle at <x>,<y> of <diameter> using <colour>, either with a 1 pixel border or filling the area. | ||
eg. ''ugfx.circle(180,150,40,ugfx.RED)'' | eg. ''ugfx.circle(180,150,40,ugfx.RED)'' | ||
=== Widgets === | === Widgets === | ||
Line 56: | Line 50: | ||
=== Styles === | === Styles === | ||
== Tips and tricks == | |||
=== Tearing === | |||
When writing large areas of the screen, a 'tearing' [https://en.wikipedia.org/wiki/Screen_tearing] effect may be observed. | |||
The screen module is comprised of a large memory, with one memory location to store the RGB data for each pixel. The LCD driver continuously updates the LCD pixels, by reading the memory in a sequential, line-by-line manner, and updating the LCD with the data from the memory. This 'read line-pointer' moves from the top to the bottom of the screen (when viewed in portrait), at about 70Hz (the refresh rate of the screen) | |||
This large memory as part of the screen means it can be driven by a microcontroller which may have a considerably smaller memory. The microcontroller therefore only needs to update the memory when it whats the content to change. | |||
Consider the scenario where the microcontroller wants to set the screen from one colour to another. The microcontroller needs to update the entire memory (320x240x2 = 153kB) with the new colour. At the same time the 'read line-pointer' is reading the same memory to update the LCD. In this case, tearing occurs if the 'read line-pointer' reads the top half of the memory containing the new colour, but then catches up with microcontroller writing to the memory, then the 'read line-pointer' starts reading the old colour in the bottom half of the memory. | |||
To avoid tearing the 'read line-pointer' should not cross the region the microcontroller is updating. Since the microcontroller writes to the screen slightly slower than the LCD reads it, providing the microntroller starts writes to the top of the memory just after the LCD starts reading from the top, the read and write pointers will not overlap, and tearing will not occur. To sync the microcontroller with the LCD 'read line-pointer,' there is a vsync/tear output (connected to pin named 'TEAR') which is pulled high when the 'read line-pointer' reaches a given line (default is line 0). This can be turned on and off with '''ugfx.enable_tear()''' and '''ugfx.disable_tear()'''. To change the line at which the tear output is generated, use '''ugfx.set_tear_line(0..319)'''. | |||
=== Reducing power consumption === | |||
Use the following to dim the backlight, which uses about 80mA at full brightness | |||
<pre> | |||
ugfx.backlight(b) # sets the backlight. Range is 0-100 | |||
b = ugfx.backlight() # reads the current backlight | |||
</pre> |
Revision as of 11:27, 4 August 2016
The badge makes use of uGFX for providing drawing functions on the LCD. Most of this functionality is available through the micropython interface, and you may wish to browse the uGFX documentation for more details
Basic usage
uGFX is comprised of 'widgets,' such as buttons and labels, and 'containers' which are used to group widgets.
To create a button on the screen, use ugfx.Button(x,y,width,height,text)
, and a button will be drawn on the screen.
As well as widgets, there are 'primitives' such as drawing circles and lines, which can be drawn anywhere on the screen or in a container.
For example ugfx.circle(50,50,20,ugfx.RED)
will draw a circle.
Detailed documentation
Note. all co-ordinates are from the top left (battery symbol) corner.
Colour format
Internally, ugfx uses 565 format (5 bits for red and blue, 6 for green). Preset colours are available, for example ugfx.RED, ugfx.ORANGE, etc. To convert from 24 bit RGB format, use ugfx.html_color(0xRRGGBB) to return the 16 bit 565 format.
Styles and Fonts
Use ugfx.set_default_font("c*") to change the font. Note that widgets use the font which was default when they were created, while the container.text() primitive uses the font that was default when the container was created
Containers
Primitives
All primitives can be drawn anywhere on the screen with, for example ugfx.circle(..)
, or anywhere within a container, with c=ugfx.Container(30,30,100,100); c.circle(..)
Circle
.circle(<x>,<y>,<diameter>,<colour>)
.fill_circle(<x>,<y>,<diameter>,<colour>)
Draws a circle at <x>,<y> of <diameter> using <colour>, either with a 1 pixel border or filling the area.
eg. ugfx.circle(180,150,40,ugfx.RED)
Widgets
ugfx.text(<x>,<y>,<text>,<colour>)
Draws a text string <text> at <x>,<y> in <colour>.
eg. ugfx.text(40,40,"My name is...",ugfx.BLUE)
Styles
Tips and tricks
Tearing
When writing large areas of the screen, a 'tearing' [1] effect may be observed.
The screen module is comprised of a large memory, with one memory location to store the RGB data for each pixel. The LCD driver continuously updates the LCD pixels, by reading the memory in a sequential, line-by-line manner, and updating the LCD with the data from the memory. This 'read line-pointer' moves from the top to the bottom of the screen (when viewed in portrait), at about 70Hz (the refresh rate of the screen)
This large memory as part of the screen means it can be driven by a microcontroller which may have a considerably smaller memory. The microcontroller therefore only needs to update the memory when it whats the content to change.
Consider the scenario where the microcontroller wants to set the screen from one colour to another. The microcontroller needs to update the entire memory (320x240x2 = 153kB) with the new colour. At the same time the 'read line-pointer' is reading the same memory to update the LCD. In this case, tearing occurs if the 'read line-pointer' reads the top half of the memory containing the new colour, but then catches up with microcontroller writing to the memory, then the 'read line-pointer' starts reading the old colour in the bottom half of the memory.
To avoid tearing the 'read line-pointer' should not cross the region the microcontroller is updating. Since the microcontroller writes to the screen slightly slower than the LCD reads it, providing the microntroller starts writes to the top of the memory just after the LCD starts reading from the top, the read and write pointers will not overlap, and tearing will not occur. To sync the microcontroller with the LCD 'read line-pointer,' there is a vsync/tear output (connected to pin named 'TEAR') which is pulled high when the 'read line-pointer' reaches a given line (default is line 0). This can be turned on and off with ugfx.enable_tear() and ugfx.disable_tear(). To change the line at which the tear output is generated, use ugfx.set_tear_line(0..319).
Reducing power consumption
Use the following to dim the backlight, which uses about 80mA at full brightness
ugfx.backlight(b) # sets the backlight. Range is 0-100 b = ugfx.backlight() # reads the current backlight