Sierra digitale camera's op de Apple II

Op basis van de broncode van libgphoto2 heb ik besloten om nader te kijken naar wat ik (en zij) de "Sierra-klasse" camera's noemen. Er zijn veel camera's die hetzelfde protocol delen; er worden meer dan 80 modellen vermeld. Niet alle camera's zullen bruikbaar zijn op de Apple II, aangezien mijn JPEG-decoder hardcoded is ingesteld op afbeeldingen van 640×480 pixels. Het zou mogelijk zijn om dit aan te passen, maar dat is kostbaar in termen van geheugen en CPU-kracht. Bovendien is het proces al traag genoeg, waardoor ik (voorlopig) niet wil proberen om afbeeldingen van 800×600 of 1024×768 te decoderen en te schalen. Zelfs beperkt tot camera's met 640×480, opent dit een aantal mogelijkheden.

Ik heb een paar zeer goedkope Sanyo-camera's gekocht op eBay (een VPC-G1 uit 1995, ook verkocht als Epson PhotoPC PCDC001 en Sierra Imaging SD640, en een VPC-G200 uit 1997) en ben tijdens mijn zomervakantie in 2026 begonnen met het implementeren van mijn driver. Tijdens de vorige releasecyclus, die leidde tot de Kodak DC50-ondersteuning, heb ik mijn code herschreven zodat cameradrivers nu modules zijn met een gedefinieerde interface. Hierdoor kan mijn programma alleen de relevante driver in het geheugen laden, waardoor Quicktake voor Apple II uitbreidbaar is met een willekeurig aantal drivers, zolang ze maar op de diskette passen.

De Driver Structuur

Hieronder volgt mijn "skeleton" driver die niets anders doet dan de boilerplate-code. In essentie definieert het een bitveld van ondersteunde functies en 16 "API-methoden", waarvan de meeste optioneel zijn. De enige vereiste endpoints zijn wakeup, setspeed, getinformation en get_picture.

#define sierra_features 0b0000000011011111
//                                ||||||||_ SET_CAMERA_NAME
//                                |||||||__ SET_CAMERA_TIME
//                                ||||||___ SET_QUALITY,
//                                |||||____ SET_FLASH,
//                                ||||_____ TAKE_PICTURE,
//                                |||______ GET_THUMBNAIL,
//                                ||_______ DELETE_PICTURES,
//                                |________ RESERVED,

/* Camera callbacks */
void *sierra_callbacks[] = {
/* FEATURES */        (void *)sierra_features,
/* WAKEUP */          sierra_wakeup,
/* SET_SPEED */       sierra_set_speed,
/* SET_CAMERA_NAME */ sierra_set_camera_name,
/* SET_CAMERA_TIME */ sierra_set_camera_time,
/* GET_INFORMATION */ sierra_get_information,
/* SET_QUALITY */     sierra_set_quality,
/* SET_FLASH */       sierra_set_flash,
/* TAKE_PICTURE */    sierra_take_picture,
/* GET_PICTURE */     sierra_get_picture,
/* GET_THUMBNAIL */   NULL,
/* DELETE_PICTURES */ sierra_delete_pictures,
/* GET_FILENAME */    sierra_get_filename,
/* THUMB_HISTOGRAM */ NULL,
/* THUMB_LOAD_DATA */ NULL,
/* GET_QUALITY_STR */ sierra_get_quality_str,
/* GET_FLASH_STR */   sierra_get_flash_str,
};

Uiteindelijk implementeert mijn Sierra-driver bijna alles wat mijn programma ondersteunt: alle informatievelden (cameranaam, cameratijd, kwaliteitsmodus, flitsmodus, aantal gemaakte foto's, resterende foto's, batterijstatus) zijn leesbaar, de flits- en kwaliteitsmodi kunnen worden ingesteld, we kunnen een foto maken, enzovoort.

De Sierra-driver van libgphoto2 heeft het proces zeer eenvoudig gemaakt, omdat deze functioneel en gemakkelijk te begrijpen is. Er staan hier en daar enkele "magic numbers" in, maar deze waren eenvoudig te verklaren en te definiëren met #define.

De enige functie die niet beschikbaar is, is sierragetthumbnail. Deze is technisch gezien wel geïmplementeerd, omdat het eenvoudig is om een thumbnail van de camera op te halen: het is dezelfde procedure als bij het ophalen van een foto, maar met gebruik van twee verschillende camerapregisters. Echter, het is niet gekoppeld aan de gebruikersinterface (UI), omdat de thumbnails JPEGs zijn. Er is geen ruimte om de JPEG-decoder te laden in het UI-programma waar de thumbnails worden weergegeven, dus heb ik dit weggelaten.

Seriële Communicatie en Hardwarebeperkingen

Een andere kleine irritatie bij de Sierra-camera's (althans bij de twee Sanyo's die ik heb) is dat er blijkbaar is bespaard op de seriële chip. Op een PC kan ik met ze communiceren op 115200bps, maar niet op de Apple II. Sigrok-opnames van de signalen laten zien dat de startbits te vroeg beginnen na de stopbits, wat de ACIA 6551 van de Apple II in verwarring brengt en framing-fouten veroorzaakt. Hierdoor is de snelheid beperkt tot 19200bps – zelfs op de IIgs.

Ondersteunde Camera's

Op basis van de camera's die ik heb getest, is er nu ondersteuning voor:

  • Sanyo VPC-G1
  • Epson PhotoPC PCDC001
  • Sierra Imaging SD640
  • Sanyo VPC-G200

Ik vermoed sterk dat de volgende camera's direct ("out-of-the-box") zullen werken, maar dit is nog niet getest:

  • Agfa ePhoto 307
  • Agfa ePhoto 780
  • Epson PhotoPC 500
  • Epson PhotoPC 550
  • Olympus C-400
  • Olympus C-400L / D-200L
  • Olympus C-410L
  • Olympus C-420L / D-220L
  • Polaroid PDC-640
  • Sanyo VPC-G210
  • Sanyo VPC-G250

Refactoring en Volgende Stappen

Nu de Sierra-driver is geschreven, hield ik slechts 6kB over op de diskette van het programma, zelfs terwijl de cameradrivers zelf gecomprimeerd (met zx02) op de diskette staan. Dit is niet echt genoeg om iets belangrijks toe te voegen, en ik ben van plan om meer cameradrivers toe te voegen.

Daarom ben ik verder gegaan met het comprimeren van zaken, inclusief de binaries van de UI en de image decoders zelf. Ik had ze zelf-decomprimerend kunnen maken, maar dat had betekend dat er meerdere kopieën van de decompressor nodig waren (één per binary). In plaats daarvan heb ik de LOADER.SYSTEM van Oliver Schmidt uitgebreid om zx02-gecomprimeerde binaries te kunnen verwerken.

De volgende stap is het vinden van een nieuwe cameradriver om te implementeren. Dat wordt de Canon PowerShot 350, een camera uit 1998 (18 jaar jonger dan de Apple II), die blijkbaar een zeer complex protocol heeft.

Ik vraag me af of ik het project "Quicktake for Apple II" moet hernoemen om te weerspiegelen dat het steeds meer camera's ondersteunt. Maar ik hou van de huidige naam en ik heb geen beter idee.