FabGL
ESP32 Display Controller and Graphics Library
fabgl::VGAController Class Reference

Represents the VGA controller. More...

#include <vgacontroller.h>

Inheritance diagram for fabgl::VGAController:
Collaboration diagram for fabgl::VGAController:

Public Member Functions

void begin (gpio_num_t redGPIO, gpio_num_t greenGPIO, gpio_num_t blueGPIO, gpio_num_t HSyncGPIO, gpio_num_t VSyncGPIO)
 This is the 8 colors (5 GPIOs) initializer. More...
 
void begin (gpio_num_t red1GPIO, gpio_num_t red0GPIO, gpio_num_t green1GPIO, gpio_num_t green0GPIO, gpio_num_t blue1GPIO, gpio_num_t blue0GPIO, gpio_num_t HSyncGPIO, gpio_num_t VSyncGPIO)
 This is the 64 colors (8 GPIOs) initializer. More...
 
void begin ()
 This is the 64 colors (8 GPIOs) initializer using default pinout. More...
 
uint8_t createRawPixel (RGB222 rgb)
 Creates a raw pixel to use with VGAController.setRawPixel. More...
 
void enableBackgroundPrimitiveExecution (bool value)
 Enables or disables drawings inside vertical retracing time. More...
 
void enableBackgroundPrimitiveTimeout (bool value)
 Enables or disables execution time limitation inside vertical retracing interrupt. More...
 
uint8_t getBitsPerChannel ()
 Gets number of bits allocated for each channel. More...
 
uint8_t * getScanline (int y)
 Gets a raw scanline pointer. More...
 
int getScreenHeight ()
 Determines the screen height in pixels. More...
 
int getScreenWidth ()
 Determines the screen width in pixels. More...
 
int getViewPortCol ()
 Determines horizontal position of the viewport. More...
 
int getViewPortHeight ()
 Determines vertical size of the viewport. More...
 
int getViewPortRow ()
 Determines vertical position of the viewport. More...
 
int getViewPortWidth ()
 Determines horizontal size of the viewport. More...
 
bool isDoubleBuffered ()
 Determines whether DisplayController is on double buffered mode. More...
 
void moveScreen (int offsetX, int offsetY)
 Moves screen by specified horizontal and vertical offset. More...
 
NativePixelFormat nativePixelFormat ()
 Represents the native pixel format used by this display. More...
 
void processPrimitives ()
 Draws immediately all primitives in the queue. More...
 
void readScreen (Rect const &rect, RGB222 *destBuf)
 Reads pixels inside the specified rectangle. More...
 
void refreshSprites ()
 Forces the sprites to be updated. More...
 
void removeSprites ()
 Empties the list of active sprites. More...
 
void resumeBackgroundPrimitiveExecution ()
 Resumes drawings after suspendBackgroundPrimitiveExecution(). More...
 
void setMouseCursor (Cursor *cursor)
 Sets mouse cursor and make it visible. More...
 
void setMouseCursor (CursorName cursorName)
 Sets mouse cursor from a set of predefined cursors. More...
 
void setMouseCursorPos (int X, int Y)
 Sets mouse cursor position. More...
 
void setRawPixel (int x, int y, uint8_t rgb)
 Sets a raw pixel prepared using VGAController.createRawPixel. More...
 
void setResolution (char const *modeline, int viewPortWidth=-1, int viewPortHeight=-1, bool doubleBuffered=false)
 Sets current resolution using linux-like modeline. More...
 
template<typename T >
void setSprites (T *sprites, int count)
 Sets the list of active sprites. More...
 
void shrinkScreen (int shrinkX, int shrinkY)
 Reduces or expands screen size by the specified horizontal and vertical offset. More...
 
void suspendBackgroundPrimitiveExecution ()
 Suspends drawings. More...
 
void writeScreen (Rect const &rect, RGB222 *srcBuf)
 Writes pixels inside the specified rectangle. More...
 

Static Public Member Functions

static VGAControllerinstance ()
 Returns the singleton instance of VGAController class. More...
 

Detailed Description

Represents the VGA controller.

Use this class to set screen resolution and to associate VGA signals to ESP32 GPIO outputs.

This example initializes VGA Controller with 64 colors at 640x350:

fabgl::VGAController VGAController;
// the default assigns GPIO22 and GPIO21 to Red, GPIO19 and GPIO18 to Green, GPIO5 and GPIO4 to Blue, GPIO23 to HSync and GPIO15 to VSync
VGAController.begin();
VGAController.setResolution(VGA_640x350_70Hz);

This example initializes VGA Controller with 8 colors (5 GPIOs used) and 640x350 resolution:

// Assign GPIO22 to Red, GPIO21 to Green, GPIO19 to Blue, GPIO18 to HSync and GPIO5 to VSync
VGAController.begin(GPIO_NUM_22, GPIO_NUM_21, GPIO_NUM_19, GPIO_NUM_18, GPIO_NUM_5);

// Set 640x350@70Hz resolution
VGAController.setResolution(VGA_640x350_70Hz);

This example initializes VGA Controller with 64 colors (8 GPIOs used) and 640x350 resolution:

// Assign GPIO22 and GPIO21 to Red, GPIO19 and GPIO18 to Green, GPIO5 and GPIO4 to Blue, GPIO23 to HSync and GPIO15 to VSync
VGAController.begin(GPIO_NUM_22, GPIO_NUM_21, GPIO_NUM_19, GPIO_NUM_18, GPIO_NUM_5, GPIO_NUM_4, GPIO_NUM_23, GPIO_NUM_15);

// Set 640x350@70Hz resolution
VGAController.setResolution(VGA_640x350_70Hz);
Examples:
VGA/Altair8800/Altair8800.ino, VGA/AnsiTerminal/AnsiTerminal.ino, VGA/Audio/Audio.ino, VGA/CollisionDetection/CollisionDetection.ino, VGA/DoubleBuffer/DoubleBuffer.ino, VGA/GraphicalUserInterface/GraphicalUserInterface.ino, VGA/LoopbackTerminal/LoopbackTerminal.ino, VGA/ModelineStudio/ModelineStudio.ino, VGA/MouseOnScreen/MouseOnScreen.ino, VGA/NetworkTerminal/NetworkTerminal.ino, VGA/SimpleTerminalOut/SimpleTerminalOut.ino, VGA/SpaceInvaders/SpaceInvaders.ino, and VGA/VIC20/VIC20.ino.

Member Function Documentation

◆ begin() [1/3]

void fabgl::VGAController::begin ( gpio_num_t  redGPIO,
gpio_num_t  greenGPIO,
gpio_num_t  blueGPIO,
gpio_num_t  HSyncGPIO,
gpio_num_t  VSyncGPIO 
)

This is the 8 colors (5 GPIOs) initializer.

One GPIO per channel, plus horizontal and vertical sync signals.

Parameters
redGPIOGPIO to use for red channel.
greenGPIOGPIO to use for green channel.
blueGPIOGPIO to use for blue channel.
HSyncGPIOGPIO to use for horizontal sync signal.
VSyncGPIOGPIO to use for vertical sync signal.

Example:

// Use GPIO 22 for red, GPIO 21 for green, GPIO 19 for blue, GPIO 18 for HSync and GPIO 5 for VSync
VGAController.begin(GPIO_NUM_22, GPIO_NUM_21, GPIO_NUM_19, GPIO_NUM_18, GPIO_NUM_5);
Examples:
VGA/Altair8800/Altair8800.ino, VGA/AnsiTerminal/AnsiTerminal.ino, VGA/Audio/Audio.ino, VGA/CollisionDetection/CollisionDetection.ino, VGA/DoubleBuffer/DoubleBuffer.ino, VGA/GraphicalUserInterface/GraphicalUserInterface.ino, VGA/LoopbackTerminal/LoopbackTerminal.ino, VGA/ModelineStudio/ModelineStudio.ino, VGA/MouseOnScreen/MouseOnScreen.ino, VGA/NetworkTerminal/NetworkTerminal.ino, VGA/SimpleTerminalOut/SimpleTerminalOut.ino, VGA/SpaceInvaders/SpaceInvaders.ino, and VGA/VIC20/VIC20.ino.

◆ begin() [2/3]

void fabgl::VGAController::begin ( gpio_num_t  red1GPIO,
gpio_num_t  red0GPIO,
gpio_num_t  green1GPIO,
gpio_num_t  green0GPIO,
gpio_num_t  blue1GPIO,
gpio_num_t  blue0GPIO,
gpio_num_t  HSyncGPIO,
gpio_num_t  VSyncGPIO 
)

This is the 64 colors (8 GPIOs) initializer.

Two GPIOs per channel, plus horizontal and vertical sync signals.

Parameters
red1GPIOGPIO to use for red channel, MSB bit.
red0GPIOGPIO to use for red channel, LSB bit.
green1GPIOGPIO to use for green channel, MSB bit.
green0GPIOGPIO to use for green channel, LSB bit.
blue1GPIOGPIO to use for blue channel, MSB bit.
blue0GPIOGPIO to use for blue channel, LSB bit.
HSyncGPIOGPIO to use for horizontal sync signal.
VSyncGPIOGPIO to use for vertical sync signal.

Example:

// Use GPIO 22-21 for red, GPIO 19-18 for green, GPIO 5-4 for blue, GPIO 23 for HSync and GPIO 15 for VSync
VGAController.begin(GPIO_NUM_22, GPIO_NUM_21, GPIO_NUM_19, GPIO_NUM_18, GPIO_NUM_5, GPIO_NUM_4, GPIO_NUM_23, GPIO_NUM_15);

◆ begin() [3/3]

void fabgl::VGAController::begin ( )

This is the 64 colors (8 GPIOs) initializer using default pinout.

Two GPIOs per channel, plus horizontal and vertical sync signals. Use GPIO 22-21 for red, GPIO 19-18 for green, GPIO 5-4 for blue, GPIO 23 for HSync and GPIO 15 for VSync

Example:

VGAController.begin();

◆ createRawPixel()

uint8_t fabgl::VGAController::createRawPixel ( RGB222  rgb)
inline

Creates a raw pixel to use with VGAController.setRawPixel.

A raw pixel (or raw color) is a byte (uint8_t) that contains color information and synchronization signals.

Parameters
rgbPixel RGB222 color

Example:

// Set color of pixel at 100, 100
VGAController.setRawPixel(100, 100, VGAController.createRawPixel(RGB222(3, 0, 0));

◆ enableBackgroundPrimitiveExecution()

void fabgl::DisplayController::enableBackgroundPrimitiveExecution ( bool  value)
inherited

Enables or disables drawings inside vertical retracing time.

Primitives are processed in background (for example in vertical retracing for VGA or in a separated task for SPI/I2C displays). This method can disable (or reenable) this behavior, making drawing instantaneous. Flickering may occur when drawings are executed out of retracing time.
When background executing is disabled the queue is emptied executing all pending primitives. Some displays (SPI/I2C) may be not updated at all when enableBackgroundPrimitiveExecution is False.

Parameters
valueWhen true drawings are done on background, when false drawings are executed instantly.

◆ enableBackgroundPrimitiveTimeout()

void fabgl::DisplayController::enableBackgroundPrimitiveTimeout ( bool  value)
inlineinherited

Enables or disables execution time limitation inside vertical retracing interrupt.

Disabling interrupt execution timeout may generate flickering but speedup drawing operations.

Parameters
valueTrue enables timeout (default), False disables timeout

◆ getBitsPerChannel()

uint8_t fabgl::VGAController::getBitsPerChannel ( )
inline

Gets number of bits allocated for each channel.

Number of bits depends by which begin() initializer has been called.

Returns
1 (8 colors) or 2 (64 colors).

◆ getScanline()

uint8_t* fabgl::VGAController::getScanline ( int  y)
inline

Gets a raw scanline pointer.

A raw scanline must be filled with raw pixel colors. Use VGAController.createRawPixel to create raw pixel colors. A raw pixel (or raw color) is a byte (uint8_t) that contains color information and synchronization signals. Pixels are arranged in 32 bit packes as follows: pixel 0 = byte 2, pixel 1 = byte 3, pixel 2 = byte 0, pixel 3 = byte 1 : pixel : 0 1 2 3 4 5 6 7 8 9 10 11 ...etc... byte : 2 3 0 1 6 7 4 5 10 11 8 9 ...etc... dword : 0 1 2 ...etc...

Parameters
yVertical scanline position (0 = top row)

◆ getScreenHeight()

int fabgl::VGAController::getScreenHeight ( )
inlinevirtual

◆ getScreenWidth()

int fabgl::VGAController::getScreenWidth ( )
inlinevirtual

◆ getViewPortCol()

int fabgl::VGAController::getViewPortCol ( )
inline

Determines horizontal position of the viewport.

Returns
Horizontal position of the viewport (in case viewport width is less than screen width).

◆ getViewPortHeight()

int fabgl::VGAController::getViewPortHeight ( )
inlinevirtual

Determines vertical size of the viewport.

Returns
Vertical size of the viewport.

Implements fabgl::DisplayController.

Examples:
VGA/AnsiTerminal/AnsiTerminal.ino, VGA/CollisionDetection/CollisionDetection.ino, and VGA/ModelineStudio/ModelineStudio.ino.

◆ getViewPortRow()

int fabgl::VGAController::getViewPortRow ( )
inline

Determines vertical position of the viewport.

Returns
Vertical position of the viewport (in case viewport height is less than screen height).

◆ getViewPortWidth()

int fabgl::VGAController::getViewPortWidth ( )
inlinevirtual

Determines horizontal size of the viewport.

Returns
Horizontal size of the viewport.

Implements fabgl::DisplayController.

Examples:
VGA/AnsiTerminal/AnsiTerminal.ino, VGA/CollisionDetection/CollisionDetection.ino, and VGA/ModelineStudio/ModelineStudio.ino.

◆ instance()

static VGAController* fabgl::VGAController::instance ( )
inlinestatic

Returns the singleton instance of VGAController class.

Returns
A pointer to VGAController singleton object

◆ isDoubleBuffered()

bool fabgl::DisplayController::isDoubleBuffered ( )
inlineinherited

Determines whether DisplayController is on double buffered mode.

Returns
True if DisplayController is on double buffered mode.

◆ moveScreen()

void fabgl::VGAController::moveScreen ( int  offsetX,
int  offsetY 
)

Moves screen by specified horizontal and vertical offset.

Screen moving is performed moving horizontal and vertical Front and Back porchs.

Parameters
offsetXHorizontal offset in pixels. < 0 goes left, > 0 goes right.
offsetYVertical offset in pixels. < 0 goes up, > 0 goes down.

Example:

// Move screen 4 pixels right, 1 pixel left
VGAController.moveScreen(4, -1);
Examples:
VGA/Audio/Audio.ino, VGA/CollisionDetection/CollisionDetection.ino, VGA/ModelineStudio/ModelineStudio.ino, and VGA/SpaceInvaders/SpaceInvaders.ino.

◆ nativePixelFormat()

NativePixelFormat fabgl::VGAController::nativePixelFormat ( )
inlinevirtual

Represents the native pixel format used by this display.

Returns
Display native pixel format

Implements fabgl::DisplayController.

◆ processPrimitives()

void IRAM_ATTR fabgl::DisplayController::processPrimitives ( )
inherited

Draws immediately all primitives in the queue.

Draws all primitives before they are processed in the vertical sync interrupt.
May generate flickering because don't care of vertical sync.

◆ readScreen()

void fabgl::VGAController::readScreen ( Rect const &  rect,
RGB222 destBuf 
)

Reads pixels inside the specified rectangle.

Screen reading may occur while other drawings are in progress, so the result may be not updated.

Parameters
rectScreen rectangle to read. To improve performance rectangle is not checked.
destBufDestination buffer. Buffer size must be at least rect.width() * rect.height.

Example:

// paint a red rectangle
Canvas.setBrushColor(Color::BrightRed);
Rect rect = Rect(10, 10, 100, 100);
Canvas.fillRectangle(rect);

// wait for vsync (hence actual drawing)
VGAController.processPrimitives();

// read rectangle pixels into "buf"
auto buf = new RGB222[rect.width() * rect.height()];
VGAController.readScreen(rect, buf);

// write buf 110 pixels to the reight
VGAController.writeScreen(rect.translate(110, 0), buf);
delete buf;

◆ refreshSprites()

void fabgl::DisplayController::refreshSprites ( )
inherited

Forces the sprites to be updated.

Screen is automatically updated whenever a primitive is painted (look at Canvas).
When a sprite updates its image or its position (or any other property) it is required to force a refresh using this method.
DisplayController.refreshSprites() is required also when using the double buffered mode, to paint sprites.

Examples:
SSD1306_OLED/128x32/CollisionDetection/CollisionDetection.ino, SSD1306_OLED/128x64/CollisionDetection/CollisionDetection.ino, VGA/CollisionDetection/CollisionDetection.ino, and VGA/SpaceInvaders/SpaceInvaders.ino.

◆ removeSprites()

void fabgl::DisplayController::removeSprites ( )
inlineinherited

Empties the list of active sprites.

Call this method when you don't need active sprites anymore.

Examples:
VGA/SpaceInvaders/SpaceInvaders.ino.

◆ resumeBackgroundPrimitiveExecution()

void fabgl::VGAController::resumeBackgroundPrimitiveExecution ( )
virtual

Resumes drawings after suspendBackgroundPrimitiveExecution().

Resumes drawings enabling vertical sync interrupt.

Implements fabgl::DisplayController.

◆ setMouseCursor() [1/2]

void fabgl::DisplayController::setMouseCursor ( Cursor cursor)
inherited

Sets mouse cursor and make it visible.

Parameters
cursorCursor to use when mouse pointer need to be painted. nullptr = disable mouse pointer.
Examples:
VGA/MouseOnScreen/MouseOnScreen.ino.

◆ setMouseCursor() [2/2]

void fabgl::DisplayController::setMouseCursor ( CursorName  cursorName)
inherited

Sets mouse cursor from a set of predefined cursors.

Parameters
cursorNameName (enum) of predefined cursor.

Example:

VGAController.setMouseCursor(CursorName::CursorPointerShadowed);

◆ setMouseCursorPos()

void fabgl::DisplayController::setMouseCursorPos ( int  X,
int  Y 
)
inherited

Sets mouse cursor position.

Parameters
XMouse cursor horizontal position.
YMouse cursor vertical position.

◆ setRawPixel()

void fabgl::VGAController::setRawPixel ( int  x,
int  y,
uint8_t  rgb 
)
inline

Sets a raw pixel prepared using VGAController.createRawPixel.

A raw pixel (or raw color) is a byte (uint8_t) that contains color information and synchronization signals.

Parameters
xHorizontal pixel position
yVertical pixel position
rgbRaw pixel color

Example:

// Set color of pixel at 100, 100
VGAController.setRawPixel(100, 100, VGAController.createRawPixel(RGB222(3, 0, 0));

◆ setResolution()

void fabgl::VGAController::setResolution ( char const *  modeline,
int  viewPortWidth = -1,
int  viewPortHeight = -1,
bool  doubleBuffered = false 
)

Sets current resolution using linux-like modeline.

Modeline must have following syntax (non case sensitive):

"label" clock_mhz hdisp hsyncstart hsyncend htotal vdisp vsyncstart vsyncend vtotal (+HSync | -HSync) (+VSync | -VSync) [DoubleScan | QuadScan] [FrontPorchBegins | SyncBegins | BackPorchBegins | VisibleBegins] [MultiScanBlank]

In fabglconf.h there are macros with some predefined modelines for common resolutions. When MultiScanBlank and DoubleScan is specified then additional rows are not repeated, but just filled with blank lines.

Parameters
modelineLinux-like modeline as specified above.
viewPortWidthHorizontal viewport size in pixels. If less than zero (-1) it is sized to modeline visible area width.
viewPortHeightVertical viewport size in pixels. If less then zero (-1) it is sized to maximum allocable.
doubleBufferedif True allocates another viewport of the same size to use as back buffer. Make sure there is enough free memory.

Example:

// Use predefined modeline for 640x480@60Hz
VGAController.setResolution(VGA_640x480_60Hz);

// The same of above using modeline string
VGAController.setResolution("\"640x480@60Hz\" 25.175 640 656 752 800 480 490 492 525 -HSync -VSync");

// Set 640x382@60Hz but limit the viewport to 640x350
VGAController.setResolution(VGA_640x382_60Hz, 640, 350);
Examples:
VGA/Altair8800/Altair8800.ino, VGA/AnsiTerminal/AnsiTerminal.ino, VGA/Audio/Audio.ino, VGA/CollisionDetection/CollisionDetection.ino, VGA/DoubleBuffer/DoubleBuffer.ino, VGA/GraphicalUserInterface/GraphicalUserInterface.ino, VGA/LoopbackTerminal/LoopbackTerminal.ino, VGA/ModelineStudio/ModelineStudio.ino, VGA/MouseOnScreen/MouseOnScreen.ino, VGA/NetworkTerminal/NetworkTerminal.ino, VGA/SimpleTerminalOut/SimpleTerminalOut.ino, VGA/SpaceInvaders/SpaceInvaders.ino, and VGA/VIC20/VIC20.ino.

◆ setSprites()

template<typename T >
void fabgl::DisplayController::setSprites ( T *  sprites,
int  count 
)
inlineinherited

Sets the list of active sprites.

A sprite is an image that keeps background unchanged.
There is no limit to the number of active sprites, but flickering and slow refresh happens when a lot of sprites (or large sprites) are visible.
To empty the list of active sprites call DisplayController.removeSprites().

Parameters
spritesThe list of sprites to make currently active.
countNumber of sprites in the list.

Example:

// define a sprite with user data (velX and velY)
struct MySprite : Sprite {
  int  velX;
  int  velY;
};

static MySprite sprites[10];

VGAController.setSprites(sprites, 10);
Examples:
SSD1306_OLED/128x32/CollisionDetection/CollisionDetection.ino, SSD1306_OLED/128x64/CollisionDetection/CollisionDetection.ino, VGA/CollisionDetection/CollisionDetection.ino, and VGA/SpaceInvaders/SpaceInvaders.ino.

◆ shrinkScreen()

void fabgl::VGAController::shrinkScreen ( int  shrinkX,
int  shrinkY 
)

Reduces or expands screen size by the specified horizontal and vertical offset.

Screen shrinking is performed changing horizontal and vertical Front and Back porchs.

Parameters
shrinkXHorizontal offset in pixels. > 0 shrinks, < 0 expands.
shrinkYVertical offset in pixels. > 0 shrinks, < 0 expands.

Example:

// Shrink screen by 8 pixels and move by 8 pixels to the left
VGAController.shrinkScreen(8, 0);
VGAController.moveScreen(8, 0);
Examples:
VGA/ModelineStudio/ModelineStudio.ino.

◆ suspendBackgroundPrimitiveExecution()

void fabgl::VGAController::suspendBackgroundPrimitiveExecution ( )
virtual

Suspends drawings.

Suspends drawings disabling vertical sync interrupt.
After call to suspendBackgroundPrimitiveExecution() adding new primitives may cause a deadlock.
To avoid it a call to "processPrimitives()" should be performed very often.
This method maintains a counter so can be nested.

Implements fabgl::DisplayController.

◆ writeScreen()

void fabgl::VGAController::writeScreen ( Rect const &  rect,
RGB222 srcBuf 
)

Writes pixels inside the specified rectangle.

Screen writing may occur while other drawings are in progress, so written pixels may be overlapped or mixed.

Parameters
rectScreen rectangle to write. To improve performance rectangle is not checked.
srcBufSource buffer. Buffer size must be at least rect.width() * rect.height.

Example:

// paint a red rectangle
Canvas.setBrushColor(Color::BrightRed);
Rect rect = Rect(10, 10, 100, 100);
Canvas.fillRectangle(rect);

// wait for vsync (hence actual drawing)
VGAController.processPrimitives();

// read rectangle pixels into "buf"
auto buf = new RGB222[rect.width() * rect.height()];
VGAController.readScreen(rect, buf);

// write buf 110 pixels to the reight
VGAController.writeScreen(rect.translate(110, 0), buf);
delete buf;

The documentation for this class was generated from the following files: