AMT630A OSD: Arduino/ESP32 Bibliotheek

Versie: 0.7.0

Overzicht

De bibliotheek stelt de vijf hardwarematige OSD-vensters van de AMT630A beschikbaar via een praktische Arduino API. Hiermee kunnen tekst, aangepaste glyphs, 16-kleur 4bpp bitmaps, paletanimaties, opaciteit/videomenging, schaling, knipperregio's en vensterbewegingen worden beheerd.

Daarnaast bevat het project een Python-beeldconverter en optionele automatisering om toegang te krijgen tot het verborgen fabrieksmenu op specifieke, hardware-geteste monitor-firmwares met drie knoppen.

Hardwarestatus: Dit project is gebaseerd op hardwaretests en reverse engineering van echte AMT630A-monitorborden. Het is niet gegarandeerd dat alle AMT630A-producten dezelfde firmware, paneeltiming, toetsenbordcircuits of blootgestelde I2C-verbindingen gebruiken. Functies die als hardware- of firmware-specifiek zijn gemarkeerd, dienen als zodanig te worden behandeld.

Functionaliteiten

  • Vijf onafhankelijk positioneerbare AMT630A OSD-vensters.
  • Ondersteuning voor LargeFont (16x22 celgeometrie) en SmallFont (10x16 celgeometrie).
  • Tekenfuncties voor tekst, voorgrond-/achtergrondkleuren, gecentreerde strings, balken, rechthoeken en ruwe glyph-ID's.
  • Gedeelde 512-cel Index RAM-allocatie inclusief inspectiehulpmiddelen.
  • Aangepaste glyphs voor LargeFont opgeslagen in het Font RAM.
  • 4bpp bitmap-bronnen met gebruik van 16x22 LargeFont-compatibele tegels.
  • Een bitmap-allocator voor het Font RAM van 4096 woorden / 8192 bytes.
  • Wereldwijd 16-stuks bitmap-palet, RGB-hulpmiddelen, transparantie voor palet-0 en paletanimatie.
  • Wereldwijde OSD/video-menging, opaciteit en helderheidsregelingen.
  • Horizontale en verticale schaling (1x-4x) per venster.
  • Ondersteuning voor hardwarematige knipperregio's (blink-regions).
  • Lichtgewicht API's voor vensterbewegingen en batch-updates.
  • Python-converter voor GIF/PNG/JPEG/BMP naar Arduino-bitmaps met RGB444-bewuste kwantisering, gedeelde paletten, geheugenlimieten en preview-output.
  • Voorbeeldprogramma's om karaktersets van LargeFont en SmallFont te doorzoeken.
  • Optionele GPIO-gestuurde automatisering van het fabrieksmenu-toetsenbord voor compatibele stock-firmware.

Installatie

Via de Arduino Library Manager

Zodra deze repository is geaccepteerd in het Arduino Library Manager-register:

  1. Open de Arduino IDE.
  2. Ga naar Sketch > Include Library > Manage Libraries... (of open de Library Manager in Arduino IDE 2.x).
  3. Zoek naar AMT630A OSD.
  4. Selecteer de gewenste versie en klik op Install.

Installatie via ZIP

Download de release ZIP en kies in de Arduino IDE voor Sketch > Include Library > Add .ZIP Library... en selecteer het bestand.

Installatie vanuit broncode

Kloon of kopieer de repository naar de libraries map van je Arduino sketchbook. Start de Arduino IDE opnieuw op als deze al open was.

Basisbekabeling

De bibliotheek communiceert met de AMT630A via I2C. De standaard ESP32-pinnen die door begin() worden gebruikt zijn:

SignaalStandaard ESP32 pin
SDAGPIO 21
SCLGPIO 22

Belangrijk: Verbind altijd de massa (ground) tussen de ESP32 en de monitorelektronica. Ga er niet vanuit dat elke AMT630A-monitor dezelfde testpads, spanningsniveaus, voedingsingang of toetsenbordindeling heeft; verifieer je eigen printplaat voordat je verbinding maakt.

Aangepaste pinnen en een I2C-kloksnelheid kunnen worden meegegeven aan begin(): display.begin(21, 22, 100000);

Minimaal tekstvoorbeeld

#include <AMT630A_OSD.h>
AMT630A_OSD display;

void setup() {
  Serial.begin(115200);
  if (!display.begin()) return;
  if (!display.setFontMode(AMT630A_OSD::LargeFont)) return;
  if (!display.configureWindow(0, 160, 44)) return;
  display.setDisplayOrigin(0, 40, 40);
  display.writeString(0, 0, 0, "HELLO", AMT630A_OSD::White);
  display.setVisible(0, true);
  display.forceUpdate();
}

void loop() {
  display.service();
}

Belangrijke opmerking over stock-firmware en C6-eigendom

De AMT630A gebruikt het SYS-register C6 om te bepalen of de interne 8051 MCU of een externe I2C-controller de interne registers beheert. Op de geteste monitor heeft de stock-firmware periodiek toegang tot interne video/decoder-registers en verwacht deze normaal gesproken het eigenaarschap.

Uit onderzoek bleek dat het herhaaldelijk claimen van extern eigenaarschap tijdens de normale werking van de stock-firmware uiteindelijk de volledige display-pipeline kan bevriezen, inclusief zowel de OSD als de live composiet-video.

De bibliotheek gebruikt nog steeds het externe I2C-mechanisme, omdat dit de enige manier is om de OSD te besturen. Op de geteste monitor met drie knoppen voorkwam het betreden van het verborgen fabrieksmenu vóór aanhoudende externe OSD-activiteit dat deze bevriezing optrad tijdens langdurige tests. Het voorbeeld EnterFactoryMode automatiseert deze procedure met behulp van een 74HC4066 die over de bestaande toetsenbord-schakelaars is geplaatst.

Deze procedure voor het fabrieksmenu is firmware-specifiek. Het wordt niet automatisch aangeroepen door begin() en is niet opgenomen in de andere voorbeelden. Als jouw monitor een andere firmware heeft, valideer dan het gedrag onafhankelijk.

Automatisering van het fabrieksmenu

De geteste monitor heeft drie fysieke knoppen (Menu, +, en -), geïmplementeerd als een passieve weerstandsladder. Drie kanalen van een 74HC4066 kunnen over deze contacten worden geplaatst, zodat een ESP32 ze elektronisch kan indrukken terwijl de fysieke knoppen bruikbaar blijven.

Geteste 74HC4066 mapping:

Knop4066 schakel-pinnen4066 controleVoorbeeld ESP32 GPIO
+1, 2135
Menu3, 4518
-8, 9619
VoedingVCC 14, GND 73.3 V / GND

De standaard sequentie van de bibliotheek is: Menu, Menu, Menu, -, Menu, +, -, -, +, +, Menu

Op de geteste firmware moet de sequentie eindigen terwijl "Brightness" actief is; de laatste Menu-druk opent vervolgens het Factory-scherm. Hardwaretests wezen uit dat 100 ms indrukken / 150 ms pauze de kortste reproduceerbare timing is; het voorbeeld gebruikt 150 ms / 200 ms voor extra marge.

display.configureFactoryMenuControl(18, 5, 19); // Menu, Plus, Minus
display.setFactoryMenuTiming(150, 200);
display.enterFactoryMode();

Een aangepaste sequentie kan worden opgegeven met FactoryMenuStep en setFactoryMenuSequence(). setFactoryOSDCoexistence(true) instrueert het zichtbaarheidsbeheer om de OSD-enable/blink-bits die al door de stock-firmware zijn ingesteld te behouden in plaats van ze te overschrijven. Dit voert zelf geen fabrieksmodus uit.

Zie examples/EnterFactoryMode voor meer informatie.

Lettertypen en karaktersets

De lettertypmodus is globaal: display.setFontMode(AMT630AOSD::LargeFont); display.setFontMode(AMT630AOSD::SmallFont);

geverifieerde celgeometrie:

ModusCelgrootte
LargeFont16 x 22 pixels
SmallFont10 x 16 pixels

writeString() koppelt gangbare ASCII-tekens aan de ingebouwde ROM van de AMT630A. writeGlyph() omzeilt de ASCII-mapping en schrijft een ruwe 10-bit glyph-ID. De meegeleverde voorbeelden LargeFontCharacterSetBrowser en SmallFontCharacterSetBrowser maken het mogelijk om de ROM van de monitor via de Serial Monitor te verkennen. De geverifieerde SmallFont ROM-mapping voor normale ASCII begint rond 0x1C0; cijfers beginnen bij 0x1C1 en letters bij 0x1CB.

Vensters en Index RAM

Er zijn vijf hardwarematige OSD-vensters, maar deze delen alle vijf 512 Index RAM-cellen. Vensters kunnen visueel overlappen, maar hun Index RAM-allocaties moeten passen binnen de gedeelde pool van 512 cellen.

display.configureWindow(0, 160, 66); // pixels; wordt omgezet naar cellen display.setDisplayOrigin(0, 30, 30);

Inspectiehulpmiddelen:

  • display.getWindowWidth(0);
  • display.getWindowHeight(0);
  • display.getColumns(0);
  • display.getRows(0);
  • display.getWindowIndexStart(0);
  • display.getWindowIndexCells(0);
  • display.getIndexRAMUsed();
  • display.getIndexRAMFree();

releaseWindow() geeft een venster vrij, waardoor de bibliotheek de resterende Index RAM-regio's opnieuw kan toewijzen.

Tekst en cellen tekenen

  • display.clearWindow(0);
  • display.clearRegion(0, 2, 1, 4, 2);
  • display.fillRect(0, 0, 0, 8, 1, AMT630A_OSD::Blue);
  • display.setCell(0, 0, 0, glyph, AMT630AOSD::White, AMT630AOSD::Blue);
  • display.writeGlyph(0, 1, 0, 0x123, AMT630AOSD::White, AMT630AOSD::Transparent);
  • display.writeString(0, 0, 1, "READY", AMT630AOSD::Green, AMT630AOSD::Transparent);
  • display.writeStringCentered(0, 2, "CENTERED");
  • display.writeBar(0, 0, 3, 75, 100, 10, AMT630A_OSD::Green);

Beschikbare tekstkleuren zijn: Transparent, White, Red, Green, Blue, Cyan, Yellow en Black.

Tekenacties wijzigen de RAM-kopie van de bibliotheek en markeren de getroffen cellen als "dirty". updateDisplay() verstuurt de dirty cellen; forceUpdate() verstuurt alle cellen in de gevraagde vensters.

Zichtbaarheid en service

  • display.setVisible(0, true);
  • display.setOSDVisible(true);
  • display.updateDisplay();

Normale voorbeelden roepen display.service() aan in de loop(). Dit synchroniseert periodiek de door de bibliotheek beheerde zichtbaarheidsstatus met de hardware. Het interval kan worden gewijzigd met setServiceInterval(milliseconds).

Vensters verplaatsen

Gebruik setDisplayOrigin() voor de initiële plaatsing. Voor animaties werkt moveWindow() alleen de positie-bytes bij die zijn gewijzigd, terwijl de venstergeometrie en Index RAM-allocatie intact blijven: display.moveWindow(0, x, y);

Batch-updates

if (display.beginBatchUpdate()) {
  display.moveWindow(0, x0, y0);
  display.moveWindow(1, x1, y1);
  display.endBatchUpdate();
}

Batch-aanroepen kunnen genest worden. Ze verminderen het aantal herhaalde eigendomsovergangen tijdens een groep operaties, maar batching elimineert het eerder beschreven eigendomsprobleem van de stock-firmware niet.

Schaling

Alle vijf de vensters maken gebruik van dezelfde publieke 1x-4x schaal-API:

  • display.setWindowScale(0, 2); // 2x X en Y
  • display.setWindowScale(1, 3, 2); // 3x X, 2x Y
  • display.getWindowScaleX(0);
  • display.getWindowScaleY(0);

Schaling is van toepassing op zowel tekst- als bitmap-vensters. Venster 0 gebruikt intern andere AMT630A-scalerhardware; de bibliotheek maskeert dit verschil.

Knipperregio's (Blink regions)

De geteste primaire blink-engine richt zich op één rechthoekige regio in één geselecteerd OSD-venster. Coördinaten zijn 1-gebaseerde celcoördinaten.

display.configureBlink(0, 1, 1, 3, 1, 0x10); display.setBlinkEnabled(true);

Individuele controles:

  • display.setBlinkWindow(0);
  • display.setBlinkRegion(1, 1, 3, 1);
  • display.setBlinkRateRaw(0x10);
  • display.setBlinkEnabled(true);

De ruwe blink-rate bestaat uit zes bits (0x00-0x3F). Hardwaretests wezen uit dat kleinere waarden sneller knipperen; een exacte tijdconversie is niet gekalibreerd.

Opaciteit, helderheid en videomenging

Dit zijn globale OSD-instellingen die door alle vijf de vensters worden gedeeld:

  • display.setBlendingEnabled(true);
  • display.setOpacity(4); // 0 transparant, 7 maximale OSD-opaciteit
  • display.setBrightness(16); // 0..31
  • display.setBlendingEnabled(false);

Getters zijn isBlendingEnabled(), getOpacity() en getBrightness().

Aangepaste LargeFont glyphs

Het Font RAM kan worden verdeeld tussen aangepaste LargeFont glyph-slots en bitmap-opslag: display.configureFontRAM(10); // reserveer eerst 10 custom-glyph slots

Een aangepaste glyph bevat 16 rij-woorden:

uint16_t icon[AMT630A_OSD::CUSTOM_GLYPH_ROWS] = {
  // 16 rijwaarden...
};
display.loadCustomGlyph(0, icon);
display.writeCustomGlyph(0, 0, 0, 0, AMT630A_OSD::White);

Aangepaste glyphs worden alleen ondersteund in de LargeFont modus. De huidige bibliotheek weigert bewust het gelijktijdig laden van aangepaste glyphs en bitmaps met een CustomGlyphBitmapConflict.

Bitmaps

De bitmap-modus gebruikt het Font RAM van de AMT630A als 4bpp-beeldopslag. De ondersteuning is bewust gekoppeld aan de 16x22 tegelgeometrie van LargeFont, zodat bitmap- en tekstvensters kunnen co-existeren zonder de globale karaktergeometrie te wijzigen.

Een bronafbeelding wordt aangevuld tot een geheel aantal van 16x22 tegels. De originele breedte en hoogte blijven bewaard in de gegenereerde resource, maar de opslag is gebaseerd op het aangevulde tegelraster.

#include <AMT630A_OSD.h>
#include "MyLogo.h"
AMT630A_OSD display;
AMT630A_OSD::BitmapHandle logo = AMT630A_OSD::INVALID_BITMAP_HANDLE;

void setup() {
  display.begin();
  display.setFontMode(AMT630A_OSD::LargeFont);
  display.configureFontRAM(0);  // alle 8192 bytes beschikbaar voor bitmaps
  if (!display.loadBitmap(MyLogo, logo)) return;
  if (!display.configureBitmapWindow(0, logo)) return;
  display.setDisplayOrigin(0, 100, 60);
  display.setVisible(0, true);
  display.forceUpdate();
}

void loop() {
  display.service();
}

Font RAM boekhouding

  • display.getBitmapMemoryTotal(); // 16-bit woorden
  • display.getBitmapMemoryUsed();
  • display.getBitmapMemoryFree();
  • display.getBitmapMemoryTotalBytes();
  • display.getBitmapMemoryUsedBytes();
  • display.getBitmapMemoryFreeBytes();
  • display.getBitmapCount();

clearBitmaps() wist de boekhouding van geladen bitmap-resources wanneer geen geconfigureerd venster deze resources gebruikt.

4bpp packing

Hardwaretests bevestigden vier palet-index pixels per 16-bit Font RAM woord in deze volgorde:

  • bits 15..12 = meest linkse pixel P0
  • bits 11..8 = P1
  • bits 7..4 = P2
  • bits 3..0 = meest rechtse pixel P3

Equivalente packing: (P0 << 12) | (P1 << 8) | (P2 << 4) | P3

Bitmap palet

Alle bitmap-vensters delen één globaal hardwarepalet van 16 vermeldingen.

  • display.setBitmapPaletteColor(1, 255, 0, 0);
  • display.setBitmapPaletteColor(2, 255, 128, 0);
  • display.setBitmapPaletteColorRaw(3, 0x0F0);
  • display.setBitmapPalette0Transparent(true);

Ruwe paletwaarden gebruiken de nominale 12-bit BBBB GGGG RRRR lay-out van de AMT. rgbToBitmapColor() converteert normale 8-bit RGB-waarden naar deze ruwe representatie.

loadBitmap(bitmap, handle) past standaard het resourcepalet toe. Omdat het palet globaal is, kan het laden van een tweede bitmap met een ander palet een reeds zichtbare bitmap herkleuren. Voor gelijktijdige resources moeten deze worden geconverteerd tegen hetzelfde gedeelde palet, of moet loadBitmap(bitmap, handle, false) worden aangeroepen om het palet expliciet te beheren.

Paletcycli kunnen een afbeelding animeren zonder het Font RAM opnieuw te schrijven. Zie AnimationPaletteDemo1 en AnimationPaletteDemo2.

Bitmap Converter

De converter bevindt zich in: tools/bitmapconverter/amt630abitmapconverter.py. Het converteert het eerste frame van GIF-bestanden, of PNG/JPEG/BMP-afbeeldingen, naar een C++ header die een AMT630AOSD::Bitmap definieert.

Vereisten

  • Python 3
  • Pillow

Installeer de afhankelijkheid via: python -m pip install Pillow

Basisconversie

python tools/bitmapconverter/amt630abitmap_converter.py input.png output.h --name MyLogo

Plaats output.h in de Arduino sketch-map en voeg deze toe: #include "output.h".

Converter Command Line

amt630abitmapconverter.py INPUT OUTPUT [opties]

Positionele argumenten:

  • INPUT: GIF, PNG, JPEG of BMP bron. Bij GIF wordt het eerste frame gebruikt.
  • OUTPUT: Gegenereerd Arduino/C++ .h bestand.

Opties:

  • --name NAME: C/C++ bitmap symboolnaam.
  • --font large: Doelgeometrie (momenteel is alleen large ondersteund; 16x22 tegels).
  • --max-bytes N: Weigert output als de gepakte Font RAM data N bytes overschrijdt (standaard 8192).
  • --max-colors N: Maximaal totaal aantal paletvermeldingen, inclusief transparante index 0 (bereik 2-16; standaard 16).
  • --opaque: Als de bron geen transparantie heeft, mag paletindex 0 een ondoorzichtige kleur zijn.
  • --palette FILE.json: Map de afbeelding naar een bestaand gedeeld JSON-palet.
  • --export-palette FILE.json: Sla het uiteindelijke palet op als JSON.
  • --preview FILE.png: Schrijf een PNG-preview gebaseerd op de gemeten AMT/display kalibratie.

Geheugenbepaling

Het AMT630A Font RAM bevat 4096 16-bit woorden = 8192 bytes. Een bitmap gebruikt 4 bits/pixel en wordt aangevuld tot complete 16x22 tegels. De converter rapporteert de brondimensies, het tegelraster, de aangevulde hardware-dimensies en het verbruik in woorden en bytes.

Transparantie

Standaard is paletindex 0 gereserveerd voor transparante bronpixels en transparante tegelvulling. Een pixel wordt als transparant beschouwd als de alpha-waarde lager is dan 128. Bij een volledig ondoorzichtige bron staat --opaque toe dat index 0 als zichtbare kleur wordt gebruikt.

Kleurkwantisering en AMT-display kalibratie

De converter kwantiseert niet simpelweg naar 24-bit RGB. Hij werkt eerst met kleuren die representeerbaar zijn door het AMT RGB444-palet en gebruikt een perceptuele CIE Lab-afstandmetriek.

De converter bevat ook een gemeten transferkalibratie voor de geteste AMT630A/LCD-combinatie. De waargenomen neutrale helderheidsrelatie was ongeveer:

Beoogde helderheidAMT nibble code
0%0
25%2.5
50%3.5
75%5.5
100%15

Deze kalibratie wordt onafhankelijk geïnterpoleerd voor rood, groen en blauw. --preview past de inverse kalibratie toe om de voorspelde resultaten op het display te tonen. Let op: dit is gebaseerd op de geteste display en kan verschillen per paneel.

Gedeelde paletten voor meerdere bitmaps

Omdat elk bitmap-venster één hardwarepalet deelt, moeten meerdere gelijktijdige afbeeldingen worden geconverteerd tegen één gedeeld palet.

  1. Maak de eerste afbeelding en exporteer het palet: --export-palette hud_palette.json.
  2. Map een andere afbeelding naar dat exacte palet: --palette hud_palette.json.

API Referentie

Initialisatie en globale configuratie

  • begin(sdaPin=21, sclPin=22, i2cClock=100000): Initialiseert Wire/I2C, legt de AMT-status vast en configureert globale OSD-instellingen.
  • setDisplaySize(width, height): Stelt de nominale displaygrenzen in.
  • setFontMode(mode): Selecteert globale LargeFont of SmallFont.
  • getFontMode(): Geeft de huidige font-modus terug.
  • getDisplayWidth(), getDisplayHeight(): Geeft de geconfigureerde dimensies terug.

Vensterbeheer

  • configureWindow(window, width, height, mode=TextMode): Configureert een tekst/algemeen venster.
  • configureBitmapWindow(window, bitmapHandle): Configureert een bitmap-venster op basis van de tegelgrid.
  • releaseWindow(window): Geeft een venster en de Index RAM-allocatie vrij.
  • isWindowConfigured(window): Controleert of een venster is geconfigureerd.
  • getWindowMode(window): Geeft TextMode of BitmapMode terug.
  • getWindowBitmap(window): Geeft de bijbehorende bitmap-handle terug.
  • setDisplayOrigin(window, x, y): Stelt de initiële statische pixelpositie in.
  • moveWindow(window, x, y): Efficiënte update van enkel de positie.
  • getWindowX/Y/Width/Height(): Inspecteert positie en dimensies.
  • getColumns(), getRows(): Inspecteert cel/tegel dimensies.
  • getCharacterWidth/Height(): Inspecteert actieve celgeometrie.
  • getWindowIndexStart/Cells(): Inspecteert Index RAM-allocatie.
  • getIndexRAMUsed/Free(): Inspecteert gedeeld 512-cel Index RAM gebruik.

Tekenen

  • clearWindow(window): Wis alle cellen in een venster.
  • clearRegion(window, x, y, w, h): Wis een rechthoekige celregio.
  • fillRect(window, x, y, w, h, color): Vul celachtergronden in een regio.
  • setCell(...): Stel ruwe glyph en tekstattributen in voor één cel.
  • writeGlyph(...): Schrijf een ruwe glyph-ID.
  • writeString(...): Schrijf een C-string of Arduino String met kleuren.
  • writeStringCentered(...): Centreer tekst op een vensterrij.
  • getTextWidth(...): Geeft tekstbreedte in pixels terug.
  • writeBar(...): Teken een cel-gebaseerde waardebalk.
  • updateDisplay([window]): Verstuurt dirty cells naar hardware.
  • forceUpdate([window]): Forceert alle cellen naar hardware.

Zichtbaarheid en onderhoud

  • setVisible(window, enabled): Toon/verberg een geconfigureerd venster.
  • isVisible(window): Geeft de zichtbaarheidsstatus terug.
  • setOSDVisible(enabled): Globale OSD zichtbaarheid.
  • isOSDVisible(): Geeft globale zichtbaarheidsstatus terug.
  • service(): Periodieke synchronisatie van zichtbaarheidsstatus.
  • setServiceInterval(ms): Wijzig het service-interval.
  • setFactoryOSDCoexistence(enabled): Behoudt door fabriek beheerde zichtbaarheids/blink-bits.

Batch-updates en beweging

  • beginBatchUpdate(): Start een groep registeroperaties onder één eigendomsinterval.
  • endBatchUpdate(): Beëindigt een batch; herstelt eigenaarschap.
  • isBatchUpdateActive(): Controleert batch-status.
  • moveWindow(...): Update efficiënt enkel gewijzigde positie-bytes.

Custom glyph / Font RAM

  • configureFontRAM(customGlyphCount): Reserveer slots voor custom glyphs; rest is voor bitmaps.
  • getCustomGlyphCapacity(): Aantal gereserveerde custom-glyph slots.
  • getCustomGlyphCount(): Aantal geladen custom glyphs.
  • loadCustomGlyph(slot, rows): Laad een 16-rijige LargeFont custom glyph.
  • getCustomGlyphId(slot): Geeft de hardware glyph-ID terug.
  • writeCustomGlyph(...): Teken een geladen custom glyph in een tekstvenster.

Bitmap resources

  • loadBitmap(bitmap, handle, applyPalette=true): Alloceer/schrijf een gegenereerde bitmap resource.
  • clearBitmaps(): Wis bitmap-boekhouding.
  • getBitmapCount(): Aantal geladen resources.
  • isBitmapLoaded(handle): Valideer een bitmap-handle.
  • getBitmapWidth/Height(handle): Bronafbeeldingsdimensies.
  • getBitmapStorageBytes(handle): Gebruikte Font RAM opslag per resource.
  • getBitmapMemoryTotal/Used/Free(): Bitmap-allocatie in 16-bit woorden.
  • getBitmapMemoryTotalBytes/UsedBytes/FreeBytes(): Bitmap-allocatie in bytes.

Bitmap palet

  • setBitmapPaletteColor(index, r, g, b): Stel één paletvermelding in via RGB888.
  • setBitmapPaletteColorRaw(index, bgr12): Stel één ruwe 12-bit AMT paletvermelding in.
  • getBitmapPaletteColorRaw(index): Lees de paletstatus.
  • applyBitmapPalette(bitmap): Pas het in de bitmap ingebedde palet toe.
  • setBitmapPalette0Transparent(bool): Beheer transparantie van paletindex 0.
  • isBitmapPalette0Transparent(): Controleer transparantie-status.
  • rgbToBitmapColor(r, g, b): Converteert RGB888 naar ruwe AMT bitmap-kleur.

Blend, opaciteit, helderheid

  • setBlendingEnabled(bool) / isBlendingEnabled(): Activeer/inspecteer globale OSD/video blending.
  • setOpacity(0..7) / getOpacity(): Globale OSD opaciteit.
  • setBrightness(0..31) / getBrightness(): Globale OSD helderheid.

Schaling

  • setWindowScale(window, scale): Stel gelijke X/Y schaal in (1-4).
  • setWindowScale(window, scaleX, scaleY): Stel onafhankelijke X/Y schalen in (1-4).
  • getWindowScaleX/Y(window): Inspecteer huidige schaal.

Blink (Knipperen)

  • configureBlink(window, x, y, w, h, rawRate): Configureer venster, 1-gebaseerde regio en snelheid.
  • setBlinkWindow(window): Wijzig het doelvenster voor knipperen.
  • setBlinkRegion(x, y, w, h): Wijzig de 1-gebaseerde knipperregio.
  • setBlinkRateRaw(rawRate): Stel de zes-bit ruwe knippersnelheid in.
  • setBlinkEnabled(bool): Activeer/deactiveer knipperen.
  • getBlinkWindow/X/Y/Width/Height/RateRaw(): Inspecteer blink-configuratie.
  • isBlinkEnabled(): Controleer of knipperen is geactiveerd.

Fabrieksmenu-controle

  • configureFactoryMenuControl(menuPin, plusPin, minusPin): Configureer drie active-high GPIO-controles.
  • setFactoryMenuTiming(pressMs, gapMs): Stel standaard timing in voor indrukken/pauze.
  • setFactoryMenuSequence(steps, count): Installeer een aangepaste knopsequentie.
  • useDefaultFactoryMenuSequence(): Herstel de geteste standaardsequentie.
  • enterFactoryMode(): Voer de geconfigureerde sequentie uit.

Foutenafhandeling

Gebruik de volgende structuur om fouten op te vangen:

if (!display.someOperation()) {
  Serial.println(AMT630A_OSD::errorToString(display.getLastError()));
}

De Error enum bevat fouten met betrekking tot initialisatie, vensters, Index RAM, glyphs, Font RAM, bitmaps, paletten, schaling, I2C, allocatie en het fabrieksmenu. clearError() wist de opgeslagen foutstatus.

Voorbeelden

VoorbeeldDoel
LargeFontHUDVijf-venster LargeFont HUD in Robby-stijl.
SmallFontHUDVijf-venster SmallFont versie van de HUD.
LargeFontCharacterSetBrowserDoorzoek ruwe LargeFont glyph-ID's via Serial.
SmallFontCharacterSetBrowserDoorzoek ruwe SmallFont glyph-ID's in het geverifieerde ROM-bereik.
EnterFactoryModeAutomatiseer de verborgen fabrieksmenu-sequentie via een 74HC4066.
LargeCustomGlyphLaad en toon een LargeFont custom glyph.
MultipleWindowsOnafhankelijk gepositioneerde tekstvensters.
AnimatedWindowsBewegende tekstvensters.
MultipleWindowBatchTestTesten van batch-update gedrag.
BitmapWindowGegenereerde bitmap gecombineerd met LargeFont ROM-tekst.
RobotBitmapTestBewegende bitmap met gebruik van robot.h.
AnimatedBitmapsMeerdere bewegende vensters die één bitmap resource delen.
MixedAnimatedWindowsCombinatie van tekst- en bitmap-vensters.
HousePaletteBitmapsMeerdere resources die één gedeeld palet gebruiken.
AnimationPaletteDemo1Bitmap-animatie via paletwijzigingen.
AnimationPaletteDemo2Radar-stijl paletanimatie met transparante achtergrond.
BitmapOpacityTestBitmap/video blending en opaciteit.
FiveWindowAlphaTestGlobale blending over vijf tekstvensters.
BitmapScalingTestSchaling van bitmaps.
FiveWindowScalingTestSchaling over alle vijf de tekstvensters.
BlinkDemoControle over hardwarematige knipperregio's.

Let op: Sommige bitmap-voorbeelden vereisen headers die je zelf genereert uit eigen afbeeldingen en bevatten daarom geen specifieke bron-headers.

Publicatie in Arduino Library Manager

Deze repository is opgezet volgens het Arduino 1.5 bibliotheekformaat. Voor publicatie is een compliant repository, een Git tag/release en registratie bij de Arduino Library Registry vereist. De repository bevat .github/workflows/arduino-lint.yml om te controleren of de bibliotheek voldoet aan de strikte eisen van de Library Manager.

Credits

AMT630A_OSD is ontwikkeld door Mike Ogrinz in samenwerking met OpenAI, door middel van uitgebreide hardware-experimenten, registeranalyse, reverse engineering van firmware en iteratieve tests.

Het onderzoek naar het verborgen fabrieksmenu en de hypothese dat de fabrieksmodus conflict tussen de stock-MCU en externe I2C kan voorkomen, is afkomstig van Mike Ogrinz; de firmware-analyse en ontwikkeling van testprogramma's werden collaboratief uitgevoerd.

Speciale dank aan nocash voor zijn werk aan de AMT630A custom firmware.