diff options
author | Hans Ulrich Niedermann <gp@n-dimensional.de> | 2001-10-11 15:00:05 +0000 |
---|---|---|
committer | Hans Ulrich Niedermann <gp@n-dimensional.de> | 2001-10-11 15:00:05 +0000 |
commit | 2c801c35bbae83351f7aa5f3a32927ebbe1339e9 (patch) | |
tree | b8562aba9ca7561bfc75620e976fff0a587b9239 /doc | |
parent | bf36dc9fd49526bb598d5b894e9226e2211c92c2 (diff) | |
download | libgphoto2-2c801c35bbae83351f7aa5f3a32927ebbe1339e9.tar.gz |
moved doc files from docs/ to doc/
git-svn-id: https://svn.code.sf.net/p/gphoto/code/trunk/libgphoto2@2481 67ed7778-7388-44ab-90cf-0a291f65f57c
Diffstat (limited to 'doc')
-rw-r--r-- | doc/build_OS2.txt | 19 | ||||
-rw-r--r-- | doc/camlib_devel-portmon.eps | 458 | ||||
-rw-r--r-- | doc/camlib_devel-repeater.eps | 515 | ||||
-rw-r--r-- | doc/camlib_devel-y.eps | 464 | ||||
-rw-r--r-- | doc/camlib_devel.lyx | 1096 | ||||
-rw-r--r-- | doc/camlib_devel.sgml | 620 | ||||
-rw-r--r-- | doc/camlib_devel.txt | 507 | ||||
-rw-r--r-- | doc/frontend_devel.lyx | 64 | ||||
-rw-r--r-- | doc/frontend_devel.sgml | 30 | ||||
-rw-r--r-- | doc/frontend_devel.txt | 23 |
10 files changed, 3796 insertions, 0 deletions
diff --git a/doc/build_OS2.txt b/doc/build_OS2.txt new file mode 100644 index 000000000..2afb2b4c5 --- /dev/null +++ b/doc/build_OS2.txt @@ -0,0 +1,19 @@ +30-7-2000 +bvl: initial release +about this Document: + +This document is a summary of what is needed to build gphoto2 on OS/2 + +make : nmake v3 available on hobbes, + http://hobbes.nmsu.edu/pub/os2/dev/util/nmakew.zip + +compile : gcc version 2.8.1 + http://hobbes.nmsu.edu/cgi-bin/h-browse?sh=1&dir=/pub/os2/dev/emx/v0.9d + +libraries : pthreads + unfortunatly I don't know whih version I use here but the one from netlabs should be working + ftp://ftp.netlabs.org/pub/pthreads/ + +make sure the emx\lib directory is added to your lib environment 'SET LIB=x:\EMX\LIB' +alse the pthreads DLL's and LIB's should be in the EMX tree + diff --git a/doc/camlib_devel-portmon.eps b/doc/camlib_devel-portmon.eps new file mode 100644 index 000000000..c2ce65327 --- /dev/null +++ b/doc/camlib_devel-portmon.eps @@ -0,0 +1,458 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: Untitled-1 +%%Creator: Dia v0.83 +%%CreationDate: Thu Apr 13 18:39:05 2000 +%%For: a user +%%Magnification: 1.0000 +%%Orientation: Portrait +%%BoundingBox: 0 0 320 208 +%%Pages: 1 +%%BeginSetup +%%EndSetup +%%EndComments +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/Times-Roman-latin1 + /Times-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-Italic-latin1 + /Times-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-Bold-latin1 + /Times-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-BoldItalic-latin1 + /Times-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-Book-latin1 + /AvantGarde-Book findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-BookOblique-latin1 + /AvantGarde-BookOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-Demi-latin1 + /AvantGarde-Demi findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-DemiOblique-latin1 + /AvantGarde-DemiOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-Light-latin1 + /Bookman-Light findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-LightItalic-latin1 + /Bookman-LightItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-Demi-latin1 + /Bookman-Demi findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-DemiItalic-latin1 + /Bookman-DemiItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-latin1 + /Courier findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-Oblique-latin1 + /Courier-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-Bold-latin1 + /Courier-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-BoldOblique-latin1 + /Courier-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-latin1 + /Helvetica findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Oblique-latin1 + /Helvetica-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Bold-latin1 + /Helvetica-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-BoldOblique-latin1 + /Helvetica-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-latin1 + /Helvetica-Narrow findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-Oblique-latin1 + /Helvetica-Narrow-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-Bold-latin1 + /Helvetica-Narrow-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-BoldOblique-latin1 + /Helvetica-Narrow-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Roman-latin1 + /NewCenturySchoolbook-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Italic-latin1 + /NewCenturySchoolbook-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Bold-latin1 + /NewCenturySchoolbook-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-BoldItalic-latin1 + /NewCenturySchoolbook-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Roman-latin1 + /Palatino-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Italic-latin1 + /Palatino-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Bold-latin1 + /Palatino-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-BoldItalic-latin1 + /Palatino-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Symbol-latin1 + /Symbol findfont +definefont pop +/ZapfChancery-MediumItalic-latin1 + /ZapfChancery-MediumItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/ZapfDingbats-latin1 + /ZapfDingbats findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/colortogray { +/rgbdata exch store +rgbdata length 3 idiv +/npixls exch store +/rgbindx 0 store +0 1 npixls 1 sub { +grays exch +rgbdata rgbindx get 20 mul +rgbdata rgbindx 1 add get 32 mul +rgbdata rgbindx 2 add get 12 mul +add add 64 idiv +put +/rgbindx rgbindx 3 add store +} for +grays 0 npixls getinterval +} bind def +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +/colorimage { +pop pop +{colortogray} mergeprocs +image +} bind def + +28.346000 -28.346000 scale +-5.950000 -11.256637 translate +%%EndProlog + + +1.000000 1.000000 1.000000 srgb +n 6.000000 4.000000 m 6.000000 6.000000 l 10.000000 6.000000 l 10.000000 4.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.000000 4.000000 m 6.000000 6.000000 l 10.000000 6.000000 l 10.000000 4.000000 l cp s +/Courier-latin1 ff 1.000000 scf sf +0.000000 0.000000 0.000000 srgb +() dup sw 2 div 6.000000 ex sub 5.000000 m gs 1 -1 sc sh gr +/Courier-latin1 ff 1.000000 scf sf +0.000000 0.000000 0.000000 srgb +(Camera) dup sw 2 div 8.000000 ex sub 5.000000 m gs 1 -1 sc sh gr +/Courier-latin1 ff 1.000000 scf sf +0.000000 0.000000 0.000000 srgb +() dup sw 2 div 8.000000 ex sub 5.000000 m gs 1 -1 sc sh gr +/Courier-latin1 ff 1.000000 scf sf +0.000000 0.000000 0.000000 srgb +() dup sw 2 div 7.000000 ex sub 5.000000 m gs 1 -1 sc sh gr +/Courier-latin1 ff 1.000000 scf sf +0.000000 0.000000 0.000000 srgb +() dup sw 2 div 10.000000 ex sub 7.000000 m gs 1 -1 sc sh gr +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0.000000 0.000000 0.000000 srgb +n 10.000000 5.000000 m 14.000000 5.000000 l s +0 slj +0.000000 0.000000 0.000000 srgb +n 10.800000 4.600000 m 10.000000 5.000000 l 10.800000 5.400000 l f +0 slj +0.000000 0.000000 0.000000 srgb +n 13.200000 5.400000 m 14.000000 5.000000 l 13.200000 4.600000 l f +0.080000 slw +0 slj +[] 0 sd +0.700000 0.700000 0.700000 srgb +n 14.250000 4.200000 m 14.250000 7.700000 l 15.750000 7.700000 l 15.750000 4.200000 l f +0.000000 0.000000 0.000000 srgb +n 14.250000 4.200000 m 14.250000 7.700000 l 15.750000 7.700000 l 15.750000 4.200000 l cp s +0.010000 slw +0.000000 0.000000 0.000000 srgb +n 14.400000 4.410000 m 14.400000 4.810000 l 15.600000 4.810000 l 15.600000 4.410000 l cp s +0.000000 0.000000 0.000000 srgb +n 14.400000 4.810000 m 14.400000 5.210000 l 15.600000 5.210000 l 15.600000 4.810000 l cp s +0.000000 0.000000 0.000000 srgb +n 14.400000 5.210000 m 14.400000 5.610000 l 15.600000 5.610000 l 15.600000 5.210000 l cp s +0.000000 0.000000 0.000000 srgb +n 14.400000 5.610000 m 14.400000 6.010000 l 15.600000 6.010000 l 15.600000 5.610000 l cp s +0.000000 0.000000 0.000000 srgb +n 14.400000 6.090000 m 14.400000 6.330000 l 15.150000 6.330000 l 15.150000 6.090000 l cp s +0.000000 1.000000 0.000000 srgb +n 15.525000 6.130000 0.052500 0.052500 0 360 ellipse f +0.000000 0.000000 0.000000 srgb +n 15.525000 6.130000 0.052500 0.052500 0 360 ellipse cp s +1.000000 1.000000 0.000000 srgb +n 15.525000 6.290000 0.052500 0.052500 0 360 ellipse f +0.000000 0.000000 0.000000 srgb +n 15.525000 6.290000 0.052500 0.052500 0 360 ellipse cp s +1.000000 1.000000 1.000000 srgb +n 15.225000 6.170000 m 15.225000 6.330000 l 15.405000 6.330000 l 15.405000 6.170000 l f +0.000000 0.000000 0.000000 srgb +n 15.225000 6.170000 m 15.225000 6.330000 l 15.405000 6.330000 l 15.405000 6.170000 l cp s +0.080000 slw +0 slc +0.000000 0.000000 0.000000 srgb +n 14.500000 6.650000 m 14.500000 7.525000 l s +0.000000 0.000000 0.000000 srgb +n 14.750000 6.650000 m 14.750000 7.525000 l s +0.000000 0.000000 0.000000 srgb +n 15.000000 6.650000 m 15.000000 7.525000 l s +0.000000 0.000000 0.000000 srgb +n 15.250000 6.650000 m 15.250000 7.525000 l s +0.000000 0.000000 0.000000 srgb +n 15.500000 6.650000 m 15.500000 7.525000 l s +0.600000 0.600000 0.600000 srgb +n 13.950000 8.000000 m 14.250000 7.400000 l 14.250000 7.700000 l 15.750000 7.700000 l 15.750000 7.400000 l 16.050000 8.000000 l f +0.000000 0.000000 0.000000 srgb +n 13.950000 8.000000 m 14.250000 7.400000 l 14.250000 7.700000 l 15.750000 7.700000 l 15.750000 7.400000 l 16.050000 8.000000 l cp s +/Courier-latin1 ff 1.000000 scf sf +0.000000 0.000000 0.000000 srgb +(Host) dup sw 2 div 15.000000 ex sub 9.000000 m gs 1 -1 sc sh gr +0.000000 0.000000 0.000000 srgb +(running) dup sw 2 div 15.000000 ex sub 10.000000 m gs 1 -1 sc sh gr +0.000000 0.000000 0.000000 srgb +(PortMon) dup sw 2 div 15.000000 ex sub 11.000000 m gs 1 -1 sc sh gr +showpage diff --git a/doc/camlib_devel-repeater.eps b/doc/camlib_devel-repeater.eps new file mode 100644 index 000000000..efe1e3d5a --- /dev/null +++ b/doc/camlib_devel-repeater.eps @@ -0,0 +1,515 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: Untitled-1 +%%Creator: Dia v0.83 +%%CreationDate: Thu Apr 13 18:17:06 2000 +%%For: a user +%%Magnification: 1.0000 +%%Orientation: Portrait +%%BoundingBox: 0 0 408 151 +%%Pages: 1 +%%BeginSetup +%%EndSetup +%%EndComments +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/Times-Roman-latin1 + /Times-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-Italic-latin1 + /Times-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-Bold-latin1 + /Times-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-BoldItalic-latin1 + /Times-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-Book-latin1 + /AvantGarde-Book findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-BookOblique-latin1 + /AvantGarde-BookOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-Demi-latin1 + /AvantGarde-Demi findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-DemiOblique-latin1 + /AvantGarde-DemiOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-Light-latin1 + /Bookman-Light findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-LightItalic-latin1 + /Bookman-LightItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-Demi-latin1 + /Bookman-Demi findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-DemiItalic-latin1 + /Bookman-DemiItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-latin1 + /Courier findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-Oblique-latin1 + /Courier-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-Bold-latin1 + /Courier-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-BoldOblique-latin1 + /Courier-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-latin1 + /Helvetica findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Oblique-latin1 + /Helvetica-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Bold-latin1 + /Helvetica-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-BoldOblique-latin1 + /Helvetica-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-latin1 + /Helvetica-Narrow findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-Oblique-latin1 + /Helvetica-Narrow-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-Bold-latin1 + /Helvetica-Narrow-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-BoldOblique-latin1 + /Helvetica-Narrow-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Roman-latin1 + /NewCenturySchoolbook-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Italic-latin1 + /NewCenturySchoolbook-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Bold-latin1 + /NewCenturySchoolbook-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-BoldItalic-latin1 + /NewCenturySchoolbook-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Roman-latin1 + /Palatino-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Italic-latin1 + /Palatino-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Bold-latin1 + /Palatino-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-BoldItalic-latin1 + /Palatino-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Symbol-latin1 + /Symbol findfont +definefont pop +/ZapfChancery-MediumItalic-latin1 + /ZapfChancery-MediumItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/ZapfDingbats-latin1 + /ZapfDingbats findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/colortogray { +/rgbdata exch store +rgbdata length 3 idiv +/npixls exch store +/rgbindx 0 store +0 1 npixls 1 sub { +grays exch +rgbdata rgbindx get 20 mul +rgbdata rgbindx 1 add get 32 mul +rgbdata rgbindx 2 add get 12 mul +add add 64 idiv +put +/rgbindx rgbindx 3 add store +} for +grays 0 npixls getinterval +} bind def +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +/colorimage { +pop pop +{colortogray} mergeprocs +image +} bind def + +28.346000 -28.346000 scale +-5.950000 -9.256637 translate +%%EndProlog + + +1.000000 1.000000 1.000000 srgb +n 6.000000 4.000000 m 6.000000 6.000000 l 10.000000 6.000000 l 10.000000 4.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.000000 4.000000 m 6.000000 6.000000 l 10.000000 6.000000 l 10.000000 4.000000 l cp s +/Courier-latin1 ff 1.000000 scf sf +0.000000 0.000000 0.000000 srgb +() dup sw 2 div 6.000000 ex sub 5.000000 m gs 1 -1 sc sh gr +/Courier-latin1 ff 1.000000 scf sf +0.000000 0.000000 0.000000 srgb +(Camera) dup sw 2 div 8.000000 ex sub 5.000000 m gs 1 -1 sc sh gr +/Courier-latin1 ff 1.000000 scf sf +0.000000 0.000000 0.000000 srgb +() dup sw 2 div 8.000000 ex sub 5.000000 m gs 1 -1 sc sh gr +/Courier-latin1 ff 1.000000 scf sf +0.000000 0.000000 0.000000 srgb +() dup sw 2 div 7.000000 ex sub 5.000000 m gs 1 -1 sc sh gr +/Courier-latin1 ff 1.000000 scf sf +0.000000 0.000000 0.000000 srgb +() dup sw 2 div 10.000000 ex sub 7.000000 m gs 1 -1 sc sh gr +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0.000000 0.000000 0.000000 srgb +n 10.000000 5.000000 m 13.000000 5.000000 l s +0 slj +0.000000 0.000000 0.000000 srgb +n 10.800000 4.600000 m 10.000000 5.000000 l 10.800000 5.400000 l f +0 slj +0.000000 0.000000 0.000000 srgb +n 12.200000 5.400000 m 13.000000 5.000000 l 12.200000 4.600000 l f +0.080000 slw +0 slj +[] 0 sd +0.700000 0.700000 0.700000 srgb +n 13.250000 4.200000 m 13.250000 7.700000 l 14.750000 7.700000 l 14.750000 4.200000 l f +0.000000 0.000000 0.000000 srgb +n 13.250000 4.200000 m 13.250000 7.700000 l 14.750000 7.700000 l 14.750000 4.200000 l cp s +0.010000 slw +0.000000 0.000000 0.000000 srgb +n 13.400000 4.410000 m 13.400000 4.810000 l 14.600000 4.810000 l 14.600000 4.410000 l cp s +0.000000 0.000000 0.000000 srgb +n 13.400000 4.810000 m 13.400000 5.210000 l 14.600000 5.210000 l 14.600000 4.810000 l cp s +0.000000 0.000000 0.000000 srgb +n 13.400000 5.210000 m 13.400000 5.610000 l 14.600000 5.610000 l 14.600000 5.210000 l cp s +0.000000 0.000000 0.000000 srgb +n 13.400000 5.610000 m 13.400000 6.010000 l 14.600000 6.010000 l 14.600000 5.610000 l cp s +0.000000 0.000000 0.000000 srgb +n 13.400000 6.090000 m 13.400000 6.330000 l 14.150000 6.330000 l 14.150000 6.090000 l cp s +0.000000 1.000000 0.000000 srgb +n 14.525000 6.130000 0.052500 0.052500 0 360 ellipse f +0.000000 0.000000 0.000000 srgb +n 14.525000 6.130000 0.052500 0.052500 0 360 ellipse cp s +1.000000 1.000000 0.000000 srgb +n 14.525000 6.290000 0.052500 0.052500 0 360 ellipse f +0.000000 0.000000 0.000000 srgb +n 14.525000 6.290000 0.052500 0.052500 0 360 ellipse cp s +1.000000 1.000000 1.000000 srgb +n 14.225000 6.170000 m 14.225000 6.330000 l 14.405000 6.330000 l 14.405000 6.170000 l f +0.000000 0.000000 0.000000 srgb +n 14.225000 6.170000 m 14.225000 6.330000 l 14.405000 6.330000 l 14.405000 6.170000 l cp s +0.080000 slw +0 slc +0.000000 0.000000 0.000000 srgb +n 13.500000 6.650000 m 13.500000 7.525000 l s +0.000000 0.000000 0.000000 srgb +n 13.750000 6.650000 m 13.750000 7.525000 l s +0.000000 0.000000 0.000000 srgb +n 14.000000 6.650000 m 14.000000 7.525000 l s +0.000000 0.000000 0.000000 srgb +n 14.250000 6.650000 m 14.250000 7.525000 l s +0.000000 0.000000 0.000000 srgb +n 14.500000 6.650000 m 14.500000 7.525000 l s +0.600000 0.600000 0.600000 srgb +n 12.950000 8.000000 m 13.250000 7.400000 l 13.250000 7.700000 l 14.750000 7.700000 l 14.750000 7.400000 l 15.050000 8.000000 l f +0.000000 0.000000 0.000000 srgb +n 12.950000 8.000000 m 13.250000 7.400000 l 13.250000 7.700000 l 14.750000 7.700000 l 14.750000 7.400000 l 15.050000 8.000000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0.000000 0.000000 0.000000 srgb +n 15.000000 5.000000 m 18.000000 5.000000 l s +0 slj +0.000000 0.000000 0.000000 srgb +n 15.800000 4.600000 m 15.000000 5.000000 l 15.800000 5.400000 l f +0 slj +0.000000 0.000000 0.000000 srgb +n 17.200000 5.400000 m 18.000000 5.000000 l 17.200000 4.600000 l f +0.080000 slw +0 slj +[] 0 sd +0.700000 0.700000 0.700000 srgb +n 18.250000 4.200000 m 18.250000 7.700000 l 19.750000 7.700000 l 19.750000 4.200000 l f +0.000000 0.000000 0.000000 srgb +n 18.250000 4.200000 m 18.250000 7.700000 l 19.750000 7.700000 l 19.750000 4.200000 l cp s +0.010000 slw +0.000000 0.000000 0.000000 srgb +n 18.400000 4.410000 m 18.400000 4.810000 l 19.600000 4.810000 l 19.600000 4.410000 l cp s +0.000000 0.000000 0.000000 srgb +n 18.400000 4.810000 m 18.400000 5.210000 l 19.600000 5.210000 l 19.600000 4.810000 l cp s +0.000000 0.000000 0.000000 srgb +n 18.400000 5.210000 m 18.400000 5.610000 l 19.600000 5.610000 l 19.600000 5.210000 l cp s +0.000000 0.000000 0.000000 srgb +n 18.400000 5.610000 m 18.400000 6.010000 l 19.600000 6.010000 l 19.600000 5.610000 l cp s +0.000000 0.000000 0.000000 srgb +n 18.400000 6.090000 m 18.400000 6.330000 l 19.150000 6.330000 l 19.150000 6.090000 l cp s +0.000000 1.000000 0.000000 srgb +n 19.525000 6.130000 0.052500 0.052500 0 360 ellipse f +0.000000 0.000000 0.000000 srgb +n 19.525000 6.130000 0.052500 0.052500 0 360 ellipse cp s +1.000000 1.000000 0.000000 srgb +n 19.525000 6.290000 0.052500 0.052500 0 360 ellipse f +0.000000 0.000000 0.000000 srgb +n 19.525000 6.290000 0.052500 0.052500 0 360 ellipse cp s +1.000000 1.000000 1.000000 srgb +n 19.225000 6.170000 m 19.225000 6.330000 l 19.405000 6.330000 l 19.405000 6.170000 l f +0.000000 0.000000 0.000000 srgb +n 19.225000 6.170000 m 19.225000 6.330000 l 19.405000 6.330000 l 19.405000 6.170000 l cp s +0.080000 slw +0 slc +0.000000 0.000000 0.000000 srgb +n 18.500000 6.650000 m 18.500000 7.525000 l s +0.000000 0.000000 0.000000 srgb +n 18.750000 6.650000 m 18.750000 7.525000 l s +0.000000 0.000000 0.000000 srgb +n 19.000000 6.650000 m 19.000000 7.525000 l s +0.000000 0.000000 0.000000 srgb +n 19.250000 6.650000 m 19.250000 7.525000 l s +0.000000 0.000000 0.000000 srgb +n 19.500000 6.650000 m 19.500000 7.525000 l s +0.600000 0.600000 0.600000 srgb +n 17.950000 8.000000 m 18.250000 7.400000 l 18.250000 7.700000 l 19.750000 7.700000 l 19.750000 7.400000 l 20.050000 8.000000 l f +0.000000 0.000000 0.000000 srgb +n 17.950000 8.000000 m 18.250000 7.400000 l 18.250000 7.700000 l 19.750000 7.700000 l 19.750000 7.400000 l 20.050000 8.000000 l cp s +/Courier-latin1 ff 1.000000 scf sf +0.000000 0.000000 0.000000 srgb +(Repeater) dup sw 2 div 14.000000 ex sub 9.000000 m gs 1 -1 sc sh gr +/Courier-latin1 ff 1.000000 scf sf +0.000000 0.000000 0.000000 srgb +(Host) dup sw 2 div 19.000000 ex sub 9.000000 m gs 1 -1 sc sh gr +showpage diff --git a/doc/camlib_devel-y.eps b/doc/camlib_devel-y.eps new file mode 100644 index 000000000..ff3760aee --- /dev/null +++ b/doc/camlib_devel-y.eps @@ -0,0 +1,464 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: Untitled-1 +%%Creator: Dia v0.83 +%%CreationDate: Thu Apr 13 18:51:15 2000 +%%For: a user +%%Magnification: 1.0000 +%%Orientation: Portrait +%%BoundingBox: 0 0 294 151 +%%Pages: 1 +%%BeginSetup +%%EndSetup +%%EndComments +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/Times-Roman-latin1 + /Times-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-Italic-latin1 + /Times-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-Bold-latin1 + /Times-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-BoldItalic-latin1 + /Times-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-Book-latin1 + /AvantGarde-Book findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-BookOblique-latin1 + /AvantGarde-BookOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-Demi-latin1 + /AvantGarde-Demi findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-DemiOblique-latin1 + /AvantGarde-DemiOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-Light-latin1 + /Bookman-Light findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-LightItalic-latin1 + /Bookman-LightItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-Demi-latin1 + /Bookman-Demi findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-DemiItalic-latin1 + /Bookman-DemiItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-latin1 + /Courier findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-Oblique-latin1 + /Courier-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-Bold-latin1 + /Courier-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-BoldOblique-latin1 + /Courier-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-latin1 + /Helvetica findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Oblique-latin1 + /Helvetica-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Bold-latin1 + /Helvetica-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-BoldOblique-latin1 + /Helvetica-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-latin1 + /Helvetica-Narrow findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-Oblique-latin1 + /Helvetica-Narrow-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-Bold-latin1 + /Helvetica-Narrow-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-BoldOblique-latin1 + /Helvetica-Narrow-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Roman-latin1 + /NewCenturySchoolbook-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Italic-latin1 + /NewCenturySchoolbook-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Bold-latin1 + /NewCenturySchoolbook-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-BoldItalic-latin1 + /NewCenturySchoolbook-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Roman-latin1 + /Palatino-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Italic-latin1 + /Palatino-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Bold-latin1 + /Palatino-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-BoldItalic-latin1 + /Palatino-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Symbol-latin1 + /Symbol findfont +definefont pop +/ZapfChancery-MediumItalic-latin1 + /ZapfChancery-MediumItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/ZapfDingbats-latin1 + /ZapfDingbats findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/colortogray { +/rgbdata exch store +rgbdata length 3 idiv +/npixls exch store +/rgbindx 0 store +0 1 npixls 1 sub { +grays exch +rgbdata rgbindx get 20 mul +rgbdata rgbindx 1 add get 32 mul +rgbdata rgbindx 2 add get 12 mul +add add 64 idiv +put +/rgbindx rgbindx 3 add store +} for +grays 0 npixls getinterval +} bind def +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +/colorimage { +pop pop +{colortogray} mergeprocs +image +} bind def + +28.346000 -28.346000 scale +-5.950000 -9.256637 translate +%%EndProlog + + +1.000000 1.000000 1.000000 srgb +n 6.000000 4.000000 m 6.000000 6.000000 l 10.000000 6.000000 l 10.000000 4.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.000000 4.000000 m 6.000000 6.000000 l 10.000000 6.000000 l 10.000000 4.000000 l cp s +/Courier-latin1 ff 1.000000 scf sf +0.000000 0.000000 0.000000 srgb +() dup sw 2 div 6.000000 ex sub 5.000000 m gs 1 -1 sc sh gr +/Courier-latin1 ff 1.000000 scf sf +0.000000 0.000000 0.000000 srgb +(Camera) dup sw 2 div 8.000000 ex sub 5.000000 m gs 1 -1 sc sh gr +/Courier-latin1 ff 1.000000 scf sf +0.000000 0.000000 0.000000 srgb +() dup sw 2 div 8.000000 ex sub 5.000000 m gs 1 -1 sc sh gr +/Courier-latin1 ff 1.000000 scf sf +0.000000 0.000000 0.000000 srgb +() dup sw 2 div 7.000000 ex sub 5.000000 m gs 1 -1 sc sh gr +/Courier-latin1 ff 1.000000 scf sf +0.000000 0.000000 0.000000 srgb +() dup sw 2 div 10.000000 ex sub 7.000000 m gs 1 -1 sc sh gr +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0.000000 0.000000 0.000000 srgb +n 10.000000 5.000000 m 14.000000 5.000000 l s +0 slj +0.000000 0.000000 0.000000 srgb +n 10.800000 4.600000 m 10.000000 5.000000 l 10.800000 5.400000 l f +0 slj +0.000000 0.000000 0.000000 srgb +n 13.200000 5.400000 m 14.000000 5.000000 l 13.200000 4.600000 l f +0.080000 slw +0 slj +[] 0 sd +0.700000 0.700000 0.700000 srgb +n 14.250000 4.200000 m 14.250000 7.700000 l 15.750000 7.700000 l 15.750000 4.200000 l f +0.000000 0.000000 0.000000 srgb +n 14.250000 4.200000 m 14.250000 7.700000 l 15.750000 7.700000 l 15.750000 4.200000 l cp s +0.010000 slw +0.000000 0.000000 0.000000 srgb +n 14.400000 4.410000 m 14.400000 4.810000 l 15.600000 4.810000 l 15.600000 4.410000 l cp s +0.000000 0.000000 0.000000 srgb +n 14.400000 4.810000 m 14.400000 5.210000 l 15.600000 5.210000 l 15.600000 4.810000 l cp s +0.000000 0.000000 0.000000 srgb +n 14.400000 5.210000 m 14.400000 5.610000 l 15.600000 5.610000 l 15.600000 5.210000 l cp s +0.000000 0.000000 0.000000 srgb +n 14.400000 5.610000 m 14.400000 6.010000 l 15.600000 6.010000 l 15.600000 5.610000 l cp s +0.000000 0.000000 0.000000 srgb +n 14.400000 6.090000 m 14.400000 6.330000 l 15.150000 6.330000 l 15.150000 6.090000 l cp s +0.000000 1.000000 0.000000 srgb +n 15.525000 6.130000 0.052500 0.052500 0 360 ellipse f +0.000000 0.000000 0.000000 srgb +n 15.525000 6.130000 0.052500 0.052500 0 360 ellipse cp s +1.000000 1.000000 0.000000 srgb +n 15.525000 6.290000 0.052500 0.052500 0 360 ellipse f +0.000000 0.000000 0.000000 srgb +n 15.525000 6.290000 0.052500 0.052500 0 360 ellipse cp s +1.000000 1.000000 1.000000 srgb +n 15.225000 6.170000 m 15.225000 6.330000 l 15.405000 6.330000 l 15.405000 6.170000 l f +0.000000 0.000000 0.000000 srgb +n 15.225000 6.170000 m 15.225000 6.330000 l 15.405000 6.330000 l 15.405000 6.170000 l cp s +0.080000 slw +0 slc +0.000000 0.000000 0.000000 srgb +n 14.500000 6.650000 m 14.500000 7.525000 l s +0.000000 0.000000 0.000000 srgb +n 14.750000 6.650000 m 14.750000 7.525000 l s +0.000000 0.000000 0.000000 srgb +n 15.000000 6.650000 m 15.000000 7.525000 l s +0.000000 0.000000 0.000000 srgb +n 15.250000 6.650000 m 15.250000 7.525000 l s +0.000000 0.000000 0.000000 srgb +n 15.500000 6.650000 m 15.500000 7.525000 l s +0.600000 0.600000 0.600000 srgb +n 13.950000 8.000000 m 14.250000 7.400000 l 14.250000 7.700000 l 15.750000 7.700000 l 15.750000 7.400000 l 16.050000 8.000000 l f +0.000000 0.000000 0.000000 srgb +n 13.950000 8.000000 m 14.250000 7.400000 l 14.250000 7.700000 l 15.750000 7.700000 l 15.750000 7.400000 l 16.050000 8.000000 l cp s +/Courier-latin1 ff 1.000000 scf sf +0.000000 0.000000 0.000000 srgb +(Host) dup sw 2 div 15.000000 ex sub 9.000000 m gs 1 -1 sc sh gr +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.000000 0.000000 0.000000 srgb +n 12.000000 5.000000 m 12.000000 6.000000 l 14.000000 6.000000 l 14.000000 6.000000 l s +0 slj +0.000000 0.000000 0.000000 srgb +n 13.200000 6.400000 m 14.000000 6.000000 l 13.200000 5.600000 l f +showpage diff --git a/doc/camlib_devel.lyx b/doc/camlib_devel.lyx new file mode 100644 index 000000000..b1e8fc2fe --- /dev/null +++ b/doc/camlib_devel.lyx @@ -0,0 +1,1096 @@ +#LyX 1.1 created this file. For more info see http://www.lyx.org/ +\lyxformat 2.15 +\textclass linuxdoc +\language default +\inputencoding latin1 +\fontscheme default +\graphics default +\paperfontsize default +\spacing single +\papersize Default +\paperpackage a4 +\use_geometry 0 +\use_amsmath 0 +\paperorientation portrait +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation indent +\defskip medskip +\quotes_language english +\quotes_times 2 +\papercolumns 1 +\papersides 1 +\paperpagestyle default + +\layout Title +\added_space_top vfill \added_space_bottom vfill +gPhoto2 Camera Library Developer's Guide +\layout Author + +Scott Fritzinger +\newline +2000-07-26 +\newline +Revision 1 +\layout Standard + + +\begin_inset LatexCommand \tableofcontents{} + +\end_inset + + +\layout Section + +Reverse Engineering the Camera Protocol +\layout Standard + +The most difficult part for most developers is obtaining the transfer protocol. + If the OEM's are lucky enough, they will simply provide us with the protocol + specifications for their cameras and the drivers will be written at no + cost to them. + Most OEM's refuse to do so though, citing trade secrets or company policy; + this is truly unfortunate in that they have effectively told their own + customers who use operating systems other than Windows and the Mac that + they don't want their future business and that they aren't valued customer + to begin with. +\layout Standard + +When OEM's do not cooperate, the developer is left to determine the protocol + him/herself through reverse engineering. + +\layout Subsection + +Sniffing the Protocol +\layout Standard + +What follows are the most common setups for sniffing camera protocol traffic. + In all setups, a host computer runs the native camera drivers.; typically, + the Windows serial port drivers are used for reverse engineering. + The drivers are run through a series of functions that include getting + a picture index, downloading thumbnails, download full images, deleting + images, camera configuration options, in addition to any other features + a camera might have. + During these operations, one or more of the following methods are used + to capture the communication between the host computer and the camera. +\layout Subsubsection + +Serial Repeater +\layout Standard + +A serial repeater consists of the host computer, a computer used as a repeater, + and the camera. + The setup is shown in figure . +\layout Standard + +The repeater runs special software which reads data from one serial port, + logs the communication, and then outputs the data to the other serial port. + Data that is from the host computer to the camera and from the camera to + the host computer is logged sequentially in a single log file. + Information logged includes hexadecimal data values, direction of the communica +tion, as well as time stamps for synchronization. + An example sniffer to use for this configuration is +\begin_inset Quotes eld +\end_inset + +sersniff +\begin_inset Quotes erd +\end_inset + +. +\layout Subsubsection + + +\begin_inset Quotes eld +\end_inset + +Y +\begin_inset Quotes erd +\end_inset + + Serial Cable +\layout Standard + +To avoid using two computers, a Y serial cable can be used. + The +\begin_inset Quotes eld +\end_inset + +trunk +\begin_inset Quotes erd +\end_inset + + end of the serial cable attaches to the camera's serial transfer cable, + while the two +\begin_inset Quotes eld +\end_inset + +branches +\begin_inset Quotes erd +\end_inset + + plug in to two serial ports on the host computer. + Figure shows this setup. +\layout Standard + +The camera drivers use one of the serial ports on the host computer, while + the other port is opened with a hexadecimal monitor application that dumps + all communications on the port to a file. + The downside to this approach is the developer would have to determine + which sets of data was generated by the camera or the host computer. + Also, a Y cable would have to be either built or purchased from an electronics + supply store. +\layout Subsubsection + +Virtual Device Driver Hooks +\layout Standard + +The Windows platform allows virtual device drivers to +\begin_inset Quotes eld +\end_inset + +hook +\begin_inset Quotes erd +\end_inset + + into other drivers to provide additional functionality or feature enhancements. + A combination GUI and device driver named PortMon by Systems Internals + is a communications debugging utility that hooks into the existing Windows + serial device driver (vcomm.vxd) and logs communications. + Figure shows this equipment arrangement. +\layout Standard + +This setup allows the developer to not use any extra hardware by simply + relying on software. + This is perhaps the easiest method for capturing camera data. +\layout Subsection + +Making Sense Out of the Protocol +\layout Standard + +What follows are some pointers on decoding camera protocols. + It uses a protocol that isn't really any camera protocol in particular, + but should demonstrate some commonalities between most camera protocols. +\layout Enumerate + +Cameras like to ping. + This is the in the form of an "ACK"" command that is different for different + cameras. + Basically, it is usually a short packet (probably 1 byte) that is sent + both ways in order for the camera to know the computer is there or vice + versa. + It is also sometimes used to wake up a camera that has gone into power-save + mode. + It usually starts out the communications, as well as confirms each packet + in any sort of "mass" transfer. + The opposite, a "NAK", is sent to basically say the last packet was not + received, or an error has occured. + Again, this is usually just a single byte as well. +\newline + +\newline +Example: +\newline +Computer: 01 +\newline +Camera : 01 +\newline + +\newline +The Camera sent an ACK ("01") and the Computer responded with an ACK as + well. +\layout Enumerate + +Transfers are usually in "reverse network order", meaning least significant + bytes come before most significant bytes. + For example, +\begin_inset Quotes eld +\end_inset + +00 08 +\begin_inset Quotes erd +\end_inset + + should actually be reassembled as +\begin_inset Quotes eld +\end_inset + +08 00 +\begin_inset Quotes erd +\end_inset + +. + +\layout Enumerate + +Most protocols use starting and stopping bytes. + +\newline + +\newline +Example: +\newline +Computer: 03 50 00 0f e0 04 +\newline +Camera : 03 03 00 3f 03 04 +\newline +Computer: 01 +\newline + +\newline +For this example, notice the packets begin with "03" and end with "04" (don't + pay attention to what is between them). + Also notice the Computer sent an "ACK" to confirm it got the packet. +\layout Enumerate + +Packets usually have a "command" byte, which tells either the computer or + the camera what to do. + Let's say you told the software to retrieve the number of pictures, which + at the time happened to be "8", and you got the following: +\newline + +\newline +Computer: 03 01 00 00 00 04 +\newline +Camera : 03 01 00 00 08 04 +\newline +Computer: 01 +\newline + +\newline +In this example, you notice the "03" and "04" specifying the start and stop + of the packet. + Also, you notice the second byte in the Computer packet is "01". + The camera responds with the above packet, and low and behold, you see + the number 8 in the same packet. + It would appear, initially, that the second byte is used as a command byte, + and that "01" specifies the camera to return the number of pictures. + This may very well be right, but don't jump into it yet. + Make sure you look at a bunch of similar situations to confirm this. + (Again, notice the "ACK" sent by the computer). +\layout Enumerate + +Most protocols have a "data size" byte(s) in data packets. + Let's say that you told the camera to retrieve thumbnail 8 and you get + the following: +\newline + +\newline +Computer: 03 02 00 00 08 04 +\newline +Camera : 03 02 00 0F (15 bytes) 04 +\newline +Computer: 01 +\newline + +\newline +OK, here's a brief breakdown of this transaction: +\newline + +\newline +-Looks like the command to retrieve a thumbnail is "02" (2nd byte in the + computer packet), and that the byte that is "08" specifies which thumbnail + to return. +\newline +-The camera responds with a "02" in the command field, specifying it is + returning a thumbnail, and then sends "0F", and 15 bytes of data. + +\newline +-It looks like the byte "0F" specifies how many bytes are after it in the + same packet. + This is a data size byte. + +\newline +(Note: this is a simplistic example. + No thumbnail will only be 15 bytes :) this leads up to the next thing to + consider) +\layout Enumerate + +Most protocols have an "order" or "counter" byte. + This is used so that, in large data transfers where the picture may be + split up into several different packets, the computer knows how to reassemble + all the data. + The entire thumbnail more than likely will not be contained in a single + packet for logistical reasons, so they break up the data into many different + packets and give each packet a unique number (or +\begin_inset Quotes eld +\end_inset + +order +\begin_inset Quotes erd +\end_inset + + byte). + Let's say you told your camera to return thumbnail 8 (which is, as mentioned, + pretty big), and you get the following: +\newline + +\newline +Computer: 02 03 00 00 08 03 +\newline +Camera : 02 03 00 0F (15 bytes) 03 +\newline +Computer: 01 +\newline +Camera : 02 03 01 0F (15 bytes) 03 +\newline +Computer: 01 +\newline +Camera : 02 03 02 0F (15 bytes) 03 +\newline +Computer: 01 +\newline +... + 5 more packets and ACKs ... +\newline +Camera : 02 03 08 09 (9 bytes) 03 +\newline +Computer: 01 +\newline + +\newline +You notice that the 3rd byte of each of the camera packets increments with + each packet sent from the camera. + This looks like it is an order (counter) byte. + the computer can then reassemble the data from all the packets in order + to reproduce the image. +\layout Enumerate + +Most protocols have some sort of error detection byte(s) at the end of the + packet. + This is usually a simple checksum (summation of bytes), or a CRC (a somewhat + complex algorithm that reduces the probability of mis-diagnosing a packet + with errors by magnitudes). + These bytes can take into account only the data, or maybe the entire packet + excluding those error detection bytes. + If this isn't a known scheme, this winds up being the hardest part of reimpleme +nting the protocol. + Lets take the above example again, this time we'll add a couple bytes on + the end for error detection: +\newline + +\newline +Computer: 02 03 00 00 08 03 +\newline +Camera : 02 03 00 0F (15 bytes) 0f 02 03 +\newline +Computer: 01 +\newline +Camera : 02 03 01 0F (15 bytes) 0e 00 03 +\newline +Computer: 02 +\newline +Camera : 02 03 01 0F (15 bytes) fa d0 03 +\newline +Computer: 01 +\newline +Camera : 02 03 02 0F (15 bytes) fa d0 03 +\newline +Computer: 01 +\newline +... + 5 more packets and ACKs +\newline +Camera : 02 03 08 09 (9 bytes) d7 38 03 +\newline +Computer: 01 +\newline + +\newline +Notice how the error detection bytes are usually different for each packet. + These may be checksums, or CRC's, or something else. + Only way to find out really is to try each one, on different combinations + of packet parts (data, order byte, command byte, etc...) and see if you get + the same thing. + Try this on the shorter packets to make life easier. +\newline + +\newline +Look at one more thing that sticks out in this transaction: for packet with + order byte +\begin_inset Quotes eld +\end_inset + +01 +\begin_inset Quotes erd +\end_inset + +, the Computer responded with a "02 +\begin_inset Quotes erd +\end_inset + +. + and the Camera then resent the same packet it just did. + This shows that the NAK byte is "02", and this could happen because maybe + the error detection bytes didn't match with the data, or maybe something + else happened. + either way, the camera resent the last packet, and now you know how the + camera can recover from transfer errors. + If you didn't get the packet you were expecting, send the camera a NAK + and it will resend the same packet again. +\layout Section + +Understanding the gPhoto2 Design +\layout Standard + +The gPhoto2 design is the same three-tiered structure that has worked extremely + well in the past with other software packages. + Here is a listing of the 3 tiers: +\layout Itemize + +the camera library +\layout Itemize + +the I/O library +\layout Itemize + +the front-end +\layout Itemize + +the +\begin_inset Quotes eld +\end_inset + +core +\begin_inset Quotes erd +\end_inset + + +\layout Subsection + +Role of the Camera Library +\layout Standard + +The camera library is in charge of talking directly with the camera. + The library uses the gPhoto2 Camera API in order to provide a common access-met +hod for the library itself. + Being dynamically linked, the libraries are loaded at run-time depending + on the camera model the end-user would like to access. + +\layout Standard + +In order to provide flexilibity with variations in camera design, there + are camera +\begin_inset Quotes eld +\end_inset + +abilities +\begin_inset Quotes erd +\end_inset + + which list, well, the abilities of each camera model. + Some camera may support serial port connections only, while others may + be able to use USB and a serial port. + We've run into cameras that don't support thumbnailing on the camera so + there is an +\begin_inset Quotes eld +\end_inset + +abilities +\begin_inset Quotes erd +\end_inset + + field to specify whether or not the camera supports thumbnailing. + The +\begin_inset Quotes eld +\end_inset + +abilities +\begin_inset Quotes erd +\end_inset + + also list other things such as supported serial transfer speeds, file deletion, + and other functionality. +\layout Standard + +The camera libraries only make functions calls to the I/O library and to + the gPhoto2 core. +\layout Standard + +There is more information on the specifics of the camera library in section + 3 of this document. +\layout Subsection + +Role of the I/O Library +\layout Standard + +The gPhoto2 I/O library is a platform-independent communications library + that support serial, parallel, USB, firewire, and network connections. + It is a work-in-progress with a constantly expanding list of supported + platforms. + This library uses the gPhoto2 I/O library API for accessing communications + devices. + It enumerates the devices available on a system, and provides read/write + access. +\layout Standard + +The camera libraries all use the I/O library for communications with the + cameras. + By doing having all communications go through a single library, the camera + libraries become as portable as the I/O library. + Porting gPhoto2 to other platforms become extremely easy. +\layout Standard + +There is more information on the specifics of the I/O library in section + 3 of this document. +\layout Subsection + +Role of the Front-end +\layout Standard + +The front-end is the application that the user interacts with. + It is usually a command-line program, or a graphical point-and-click interface. + The front-end talks only with the gPhoto2 core in order to retrieve pictures + and perform other functions with the camera. +\layout Subsection + +Role of the gPhoto2 Core +\layout Standard + +The gPhoto2 +\begin_inset Quotes eld +\end_inset + +core +\begin_inset Quotes erd +\end_inset + + is the heart of gPhoto2. + It provides services to both the camera libraries and the front-ends. + Most of the services deal with error-checking and enumeration of devices + (cameras, I/O devices, etc...). + The core performs validity checking on data passed to/from the front-end + or the camera library. +\layout Standard + +You could consider the core a translator/interpreter/spell-checker/army-general + in the +\begin_inset Quotes eld +\end_inset + +big picture +\begin_inset Quotes erd +\end_inset + + of gPhoto2. + It does the grunt-work and performs the coordination of the other parts. +\layout Section + +Implementing the Library +\layout Standard + +gPhoto2 camera libraries use the gPhoto2 Camera API (CAPI) for implementation. + Here is a listing of the CAPI functions: +\layout Standard + +camera_id +\layout Standard + +camera_abilities +\layout Standard + +camera_init +\layout Standard + +camera_exit +\layout Standard + +camera_folder_list +\layout Standard + +camera_file_list +\protected_separator + +\layout Standard + +camera_file_get +\layout Standard + +camera_file_get_preview +\layout Standard + +camera_file_put +\layout Standard + +camera_file_delete +\layout Standard + +camera_config_get +\layout Standard + +camera_config_set +\layout Standard + +camera_capture +\layout Standard + +camera_summary +\layout Standard + +camera_manual +\layout Standard + +camera_about +\newline + +\layout Standard + +Section 3.1 details the purpose of each of these functions, while Section + 3.2 discusses how to use the I/O library. +\layout Subsection + +Camera API +\layout Standard + +The CAPI provides the full set of functions for doing various tasks with + the camera. + All CAPI functions return either GP_OK for succesful execution , or GP_ERROR + for a failure of execution +\layout Standard + +What follows is a listing of the functions, including prototypes and data + exchange: +\layout Subsubsection + +camera_id +\layout Standard + + +\series bold +Purpose: +\series default +Retrieve the unique id for the camera library. +\layout Standard + + +\series bold +Prototype: +\series default +int camera_id (CameraText *id); +\layout Standard + + +\series bold +Arguments: +\layout Standard + +CameraText *id : unique string to represent the camera library +\newline + +\layout Standard + +In order to guarantee that only once instance of the camera library is loaded + for each instance of the core, the camera library must copy a unique string + into the +\begin_inset Quotes eld +\end_inset + +id +\begin_inset Quotes erd +\end_inset + +. + Please consult the gPhoto developers to determine which string you should + use. +\newline + +\layout Standard + + +\series bold +Example: +\layout Standard + +int camera_id(CameraText *id) { +\layout Standard + +strcpy(id->text, +\begin_inset Quotes eld +\end_inset + +my-unique-string +\begin_inset Quotes erd +\end_inset + +); +\layout Standard + +return (GP_OK); +\layout Standard + +} +\layout Subsubsection + +camera_abilities +\layout Standard + + +\series bold +Purpose: +\series default +Retrieve the list of supported cameras and the abilities for each camera +\layout Standard + + +\series bold +Prototype: +\series default +int camera_abilities (CameraAbilitiesList *list); +\layout Standard + + +\series bold +Arguments: +\series default +d +\layout Standard + +CameraAbilities *abilities : the list of abilities for the supported cameras +\layout Standard + +int *count : the number of +\layout Subsubsection + +camera_init +\layout Standard + + +\series bold +Purpose: +\series default +Initialize the camera +\layout Standard + + +\series bold +Prototype: +\series default +int camera_init (Camera *camera, CameraInit *init); +\layout Standard + + +\series bold +Arguments: +\series default +d +\layout Subsubsection + +camera_exit +\layout Standard + + +\series bold +Purpose: +\series default +Close the camera +\layout Standard + + +\series bold +Prototype: +\series default +int camera_exit (Camera *camera); +\layout Standard + + +\series bold +Arguments: +\series default +d +\layout Subsubsection + +camera_file_list +\layout Standard + + +\series bold +Purpose: +\series default +List the files in a particular folder on the camera +\layout Standard + + +\series bold +Prototype: +\series default +int camera_file_list(Camera *camera, CameraList *list, char *folder); +\layout Standard + + +\series bold +Arguments: +\series default +d +\layout Subsubsection + +camera_folder_list +\layout Standard + + +\series bold +Purpose: +\series default +List the subfolders in a particular folder on the camera +\layout Standard + + +\series bold +Prototype: +\series default +int camera_folder_list(Camera *camera, CameraList *list, char *folder); + +\layout Standard + + +\series bold +Arguments: +\series default +d +\layout Subsubsection + +camera_file_get +\layout Standard + + +\series bold +Purpose: +\series default +Retrieve a file from the camera +\layout Standard + + +\series bold +Prototype: +\series default +int camera_file_get (Camera *camera, CameraFile *file, char *folder, char + *filename); +\layout Standard + + +\series bold +Arguments: +\series default +d +\layout Subsubsection + +camera_file_get_preview +\layout Standard + + +\series bold +Purpose: +\series default +Retrieve a file's preview from the camera +\layout Standard + + +\series bold +Prototype: +\series default +int camera_file_get_preview (Camera *camera, CameraFile *file, char *folder, + char *filename); +\layout Standard + + +\series bold +Arguments: +\series default +d +\layout Subsubsection + +camera_file_put +\layout Standard + + +\series bold +Purpose: +\series default +Place (upload) a file to the camera +\layout Standard + + +\series bold +Prototype: +\series default +int camera_file_put (Camera *camera, CameraFile *file, char *folder); +\layout Standard + + +\series bold +Arguments: +\series default +d +\layout Subsubsection + +camera_file_delete +\layout Standard + + +\series bold +Purpose: +\series default +Delete a file from the camera +\layout Standard + + +\series bold +Prototype: +\series default +int camera_file_delete (Camera *camera, char *folder, char *filename); +\layout Standard + + +\series bold +Arguments: +\series default +d +\layout Subsubsection + +camera_config_get +\layout Standard + + +\series bold +Purpose: +\series default +Retrieve the configuration window. +\layout Standard + + +\series bold +Prototype: +\series default +int camera_config_get (Camera *camera, CameraWidget *window); +\layout Standard + + +\series bold +Arguments: +\series default +d +\layout Subsubsection + +camera_config_set +\layout Standard + + +\series bold +Purpose: +\series default +Set camera configuration +\layout Standard + + +\series bold +Prototype: +\series default +int camera_config_set (Camera *camera, CameraSetting *setting, int count); + +\layout Standard + + +\series bold +Arguments: +\series default +d +\layout Subsubsection + +camera_capture +\layout Standard + + +\series bold +Purpose: +\series default +Retrieve live data from the camera +\layout Standard + + +\series bold +Prototype: +\series default +int camera_capture (Camera *camera, CameraFile *file, CameraCaptureInfo + *info); +\layout Standard + + +\series bold +Arguments: +\series default +d +\layout Subsubsection + +camera_summary +\layout Standard + + +\series bold +Purpose: +\series default +Retrieve the camera summary information +\layout Standard + + +\series bold +Prototype: +\series default +int camera_summary (Camera *camera, CameraText *summary); +\layout Standard + + +\series bold +Arguments: +\series default +d +\layout Subsubsection + +camera_manual +\layout Standard + + +\series bold +Purpose: +\series default +Retrieve the camera user's guide (manual) +\layout Standard + + +\series bold +Prototype: +\series default +int camera_manual (Camera *camera, CameraText *manual); +\layout Standard + + +\series bold +Arguments: +\series default +d +\layout Subsubsection + +camera_about +\layout Standard + + +\series bold +Purpose: +\series default +Retrieve information about the camera library +\layout Standard + + +\series bold +Prototype: +\series default +int camera_about (Camera *camera, CameraText *about); +\layout Standard + + +\series bold +Arguments: +\series default +d +\layout Subsection + +The gPhoto2 I/O Library +\the_end diff --git a/doc/camlib_devel.sgml b/doc/camlib_devel.sgml new file mode 100644 index 000000000..505f19352 --- /dev/null +++ b/doc/camlib_devel.sgml @@ -0,0 +1,620 @@ +<!doctype linuxdoc system> + +<!-- LyX 1.1 created this file. For more info see http://www.lyx.org/ --> +<article> +<title> +gPhoto2 Camera Library Developer's Guide +</title> +<author> +Scott Fritzinger +2000-07-26 +Revision 1 +</author> +<toc> +<sect> +Reverse Engineering the Camera Protocol +<p> +The most difficult part for most developers is obtaining the transfer protocol. + If the OEM's are lucky enough, they will simply provide us with the protocol + specifications for their cameras and the drivers will be written at no cost + to them. Most OEM's refuse to do so though, citing trade secrets or company + policy; this is truly unfortunate in that they have effectively told their + own customers who use operating systems other than Windows and the Mac that + they don't want their future business and that they aren't valued customer + to begin with. +</p> +<p> +When OEM's do not cooperate, the developer is left to determine the protocol + him/herself through reverse engineering. +</p> +<sect1> +Sniffing the Protocol +<p> +What follows are the most common setups for sniffing camera protocol traffic. + In all setups, a host computer runs the native camera drivers.; typically, + the Windows serial port drivers are used for reverse engineering. The drivers + are run through a series of functions that include getting a picture index, + downloading thumbnails, download full images, deleting images, camera configuration + options, in addition to any other features a camera might have. During these + operations, one or more of the following methods are used to capture the communication + between the host computer and the camera. +</p> +<sect2> +Serial Repeater +<p> +A serial repeater consists of the host computer, a computer used as a repeater, + and the camera. The setup is shown in figure . +</p> +<p> +The repeater runs special software which reads data from one serial port, + logs the communication, and then outputs the data to the other serial port. + Data that is from the host computer to the camera and from the camera to the + host computer is logged sequentially in a single log file. Information logged + includes hexadecimal data values, direction of the communication, as well as + time stamps for synchronization. An example sniffer to use for this configuration + is "sersniff". +</p> +<sect2> +"Y" Serial Cable +<p> +To avoid using two computers, a Y serial cable can be used. The "trunk" end + of the serial cable attaches to the camera's serial transfer cable, while the + two "branches" plug in to two serial ports on the host computer. Figure shows + this setup. +</p> +<p> +The camera drivers use one of the serial ports on the host computer, while + the other port is opened with a hexadecimal monitor application that dumps + all communications on the port to a file. The downside to this approach is + the developer would have to determine which sets of data was generated by the + camera or the host computer. Also, a Y cable would have to be either built + or purchased from an electronics supply store. +</p> +<sect2> +Virtual Device Driver Hooks +<p> +The Windows platform allows virtual device drivers to "hook" into other drivers + to provide additional functionality or feature enhancements. A combination + GUI and device driver named PortMon by Systems Internals is a communications + debugging utility that hooks into the existing Windows serial device driver + (vcomm.vxd) and logs communications. Figure shows this equipment arrangement. +</p> +<p> +This setup allows the developer to not use any extra hardware by simply + relying on software. This is perhaps the easiest method for capturing camera + data. +</p> +<sect1> +Making Sense Out of the Protocol +<p> +What follows are some pointers on decoding camera protocols. It uses a + protocol that isn't really any camera protocol in particular, but should demonstrate + some commonalities between most camera protocols. +</p> +<p> +<enum> + <item> +Cameras like to ping. This is the in the form of an "ACK"" + command that is different for different cameras. Basically, it is usually a + short packet (probably 1 byte) that is sent both ways in order for the camera + to know the computer is there or vice versa. It is also sometimes used to wake + up a camera that has gone into power-save mode. It usually starts out the communications, + as well as confirms each packet in any sort of "mass" transfer. The + opposite, a "NAK", is sent to basically say the last packet was not + received, or an error has occured. Again, this is usually just a single byte + as well. + +Example: +Computer: 01 +Camera : 01 + +The Camera sent an ACK ("01") + and the Computer responded with an ACK as well. + <item> +Transfers are usually in "reverse network order", meaning least + significant bytes come before most significant bytes. For example, "00 08" should + actually be reassembled as "08 00". + <item> +Most protocols use starting and stopping bytes. + +Example: +Computer: 03 + 50 00 0f e0 04 +Camera : 03 03 00 3f 03 04 +Computer: 01 + +For this example, + notice the packets begin with "03" and end with "04" (don't + pay attention to what is between them). Also notice the Computer sent an "ACK" + to confirm it got the packet. + <item> +Packets usually have a "command" byte, which tells either the + computer or the camera what to do. Let's say you told the software to retrieve + the number of pictures, which at the time happened to be "8", and + you got the following: + +Computer: 03 01 00 00 00 04 +Camera : 03 01 00 00 08 + 04 +Computer: 01 + +In this example, you notice the "03" and "04" + specifying the start and stop of the packet. Also, you notice the second byte + in the Computer packet is "01". The camera responds with the above + packet, and low and behold, you see the number 8 in the same packet. It would + appear, initially, that the second byte is used as a command byte, and that + "01" specifies the camera to return the number of pictures. This + may very well be right, but don't jump into it yet. Make sure you look at a + bunch of similar situations to confirm this. (Again, notice the "ACK" + sent by the computer). + <item> +Most protocols have a "data size" byte(s) in data packets. Let's + say that you told the camera to retrieve thumbnail 8 and you get the following: + +Computer: + 03 02 00 00 08 04 +Camera : 03 02 00 0F (15 bytes) 04 +Computer: 01 + +OK, here's + a brief breakdown of this transaction: + +-Looks like the command to retrieve + a thumbnail is "02" (2nd byte in the computer packet), and that the + byte that is "08" specifies which thumbnail to return. +-The camera + responds with a "02" in the command field, specifying it is returning + a thumbnail, and then sends "0F", and 15 bytes of data. +-It looks + like the byte "0F" specifies how many bytes are after it in the same + packet. This is a data size byte. +(Note: this is a simplistic example. No + thumbnail will only be 15 bytes :) this leads up to the next thing to consider) + <item> +Most protocols have an "order" or "counter" byte. This + is used so that, in large data transfers where the picture may be split up + into several different packets, the computer knows how to reassemble all the + data. The entire thumbnail more than likely will not be contained in a single + packet for logistical reasons, so they break up the data into many different + packets and give each packet a unique number (or "order" byte). Let's say you + told your camera to return thumbnail 8 (which is, as mentioned, pretty big), + and you get the following: + +Computer: 02 03 00 00 08 03 +Camera : 02 03 00 + 0F (15 bytes) 03 +Computer: 01 +Camera : 02 03 01 0F (15 bytes) 03 +Computer: + 01 +Camera : 02 03 02 0F (15 bytes) 03 +Computer: 01 +... 5 more packets and ACKs + ... +Camera : 02 03 08 09 (9 bytes) 03 +Computer: 01 + +You notice that the 3rd + byte of each of the camera packets increments with each packet sent from the + camera. This looks like it is an order (counter) byte. the computer can then + reassemble the data from all the packets in order to reproduce the image. + <item> +Most protocols have some sort of error detection byte(s) at the end of + the packet. This is usually a simple checksum (summation of bytes), or a CRC + (a somewhat complex algorithm that reduces the probability of mis-diagnosing + a packet with errors by magnitudes). These bytes can take into account only + the data, or maybe the entire packet excluding those error detection bytes. + If this isn't a known scheme, this winds up being the hardest part of reimplementing + the protocol. Lets take the above example again, this time we'll add a couple + bytes on the end for error detection: + +Computer: 02 03 00 00 08 03 +Camera : + 02 03 00 0F (15 bytes) 0f 02 03 +Computer: 01 +Camera : 02 03 01 0F (15 bytes) + 0e 00 03 +Computer: 02 +Camera : 02 03 01 0F (15 bytes) fa d0 03 +Computer: 01 +Camera + : 02 03 02 0F (15 bytes) fa d0 03 +Computer: 01 +... 5 more packets and ACKs +Camera + : 02 03 08 09 (9 bytes) d7 38 03 +Computer: 01 + +Notice how the error detection + bytes are usually different for each packet. These may be checksums, or CRC's, + or something else. Only way to find out really is to try each one, on different + combinations of packet parts (data, order byte, command byte, etc...) and see + if you get the same thing. Try this on the shorter packets to make life easier. + +Look + at one more thing that sticks out in this transaction: for packet with order + byte "01", the Computer responded with a "02". and the Camera then resent + the same packet it just did. This shows that the NAK byte is "02", + and this could happen because maybe the error detection bytes didn't match + with the data, or maybe something else happened. either way, the camera resent + the last packet, and now you know how the camera can recover from transfer + errors. If you didn't get the packet you were expecting, send the camera a + NAK and it will resend the same packet again. +</enum> +</p><sect> +Understanding the gPhoto2 Design +<p> +The gPhoto2 design is the same three-tiered structure that has worked extremely + well in the past with other software packages. Here is a listing of the 3 tiers: +</p> +<p> +<itemize> + <item> +the camera library + <item> +the I/O library + <item> +the front-end + <item> +the "core" +</itemize> +</p><sect1> +Role of the Camera Library +<p> +The camera library is in charge of talking directly with the camera. The + library uses the gPhoto2 Camera API in order to provide a common access-method + for the library itself. Being dynamically linked, the libraries are loaded + at run-time depending on the camera model the end-user would like to access. + +</p> +<p> +In order to provide flexilibity with variations in camera design, there + are camera "abilities" which list, well, the abilities of each camera model. + Some camera may support serial port connections only, while others may be able + to use USB and a serial port. We've run into cameras that don't support thumbnailing + on the camera so there is an "abilities" field to specify whether or not the + camera supports thumbnailing. The "abilities" also list other things such as + supported serial transfer speeds, file deletion, and other functionality. +</p> +<p> +The camera libraries only make functions calls to the I/O library and to + the gPhoto2 core. +</p> +<p> +There is more information on the specifics of the camera library in section + 3 of this document. +</p> +<sect1> +Role of the I/O Library +<p> +The gPhoto2 I/O library is a platform-independent communications library + that support serial, parallel, USB, firewire, and network connections. It is + a work-in-progress with a constantly expanding list of supported platforms. + This library uses the gPhoto2 I/O library API for accessing communications + devices. It enumerates the devices available on a system, and provides read/write + access. +</p> +<p> +The camera libraries all use the I/O library for communications with the + cameras. By doing having all communications go through a single library, the + camera libraries become as portable as the I/O library. Porting gPhoto2 to + other platforms become extremely easy. +</p> +<p> +There is more information on the specifics of the I/O library in section + 3 of this document. +</p> +<sect1> +Role of the Front-end +<p> +The front-end is the application that the user interacts with. It is usually + a command-line program, or a graphical point-and-click interface. The front-end + talks only with the gPhoto2 core in order to retrieve pictures and perform + other functions with the camera. +</p> +<sect1> +Role of the gPhoto2 Core +<p> +The gPhoto2 "core" is the heart of gPhoto2. It provides services to both + the camera libraries and the front-ends. Most of the services deal with error-checking + and enumeration of devices (cameras, I/O devices, etc...). The core performs + validity checking on data passed to/from the front-end or the camera library. +</p> +<p> +You could consider the core a translator/interpreter/spell-checker/army-general + in the "big picture" of gPhoto2. It does the grunt-work and performs the coordination + of the other parts. +</p> +<sect> +Implementing the Library +<p> +gPhoto2 camera libraries use the gPhoto2 Camera API (CAPI) for implementation. + Here is a listing of the CAPI functions: +</p> +<p> +camera_id +</p> +<p> +camera_abilities +</p> +<p> +camera_init +</p> +<p> +camera_exit +</p> +<p> +camera_folder_list +</p> +<p> +camera_file_list +</p> +<p> +camera_file_get +</p> +<p> +camera_file_get_preview +</p> +<p> +camera_file_put +</p> +<p> +camera_file_delete +</p> +<p> +camera_config_get +</p> +<p> +camera_config_set +</p> +<p> +camera_capture +</p> +<p> +camera_summary +</p> +<p> +camera_manual +</p> +<p> +camera_about + +</p> +<p> +Section 3.1 details the purpose of each of these functions, while Section + 3.2 discusses how to use the I/O library. +</p> +<sect1> +Camera API +<p> +The CAPI provides the full set of functions for doing various tasks with + the camera. All CAPI functions return either GP_OK for succesful execution + , or GP_ERROR for a failure of execution +</p> +<p> +What follows is a listing of the functions, including prototypes and data + exchange: +</p> +<sect2> +camera_id +<p> +<bf>Purpose: </bf>Retrieve the unique id for the camera library. +</p> +<p> +<bf>Prototype: </bf>int camera_id (CameraText *id); +</p> +<p> +<bf>Arguments: </bf> +</p> +<p> +CameraText *id : unique string to represent the camera library + +</p> +<p> +In order to guarantee that only once instance of the camera library is + loaded for each instance of the core, the camera library must copy a unique + string into the "id". Please consult the gPhoto developers to determine which + string you should use. + +</p> +<p> +<bf>Example:</bf> +</p> +<p> +int camera_id(CameraText *id) { +</p> +<p> +strcpy(id->text, "my-unique-string"); +</p> +<p> +return (GP_OK); +</p> +<p> +} +</p> +<sect2> +camera_abilities +<p> +<bf>Purpose: </bf>Retrieve the list of supported cameras and the abilities for each + camera +</p> +<p> +<bf>Prototype: </bf>int camera_abilities (CameraAbilitiesList *list); +</p> +<p> +<bf>Arguments: </bf>d +</p> +<p> +CameraAbilities *abilities : the list of abilities for the supported cameras +</p> +<p> +int *count : the number of +</p> +<sect2> +camera_init +<p> +<bf>Purpose: </bf>Initialize the camera +</p> +<p> +<bf>Prototype: </bf>int camera_init (Camera *camera, CameraInit *init); +</p> +<p> +<bf>Arguments: </bf>d +</p> +<sect2> +camera_exit +<p> +<bf>Purpose: </bf>Close the camera +</p> +<p> +<bf>Prototype: </bf>int camera_exit (Camera *camera); +</p> +<p> +<bf>Arguments: </bf>d +</p> +<sect2> +camera_file_list +<p> +<bf>Purpose: </bf>List the files in a particular folder on the camera +</p> +<p> +<bf>Prototype: </bf>int camera_file_list(Camera *camera, CameraList *list, char + *folder); +</p> +<p> +<bf>Arguments: </bf>d +</p> +<sect2> +camera_folder_list +<p> +<bf>Purpose: </bf>List the subfolders in a particular folder on the camera +</p> +<p> +<bf>Prototype: </bf>int camera_folder_list(Camera *camera, CameraList *list, char + *folder); +</p> +<p> +<bf>Arguments: </bf>d +</p> +<sect2> +camera_file_get +<p> +<bf>Purpose: </bf>Retrieve a file from the camera +</p> +<p> +<bf>Prototype: </bf>int camera_file_get (Camera *camera, CameraFile *file, char + *folder, char *filename); +</p> +<p> +<bf>Arguments: </bf>d +</p> +<sect2> +camera_file_get_preview +<p> +<bf>Purpose: </bf>Retrieve a file's preview from the camera +</p> +<p> +<bf>Prototype: </bf>int camera_file_get_preview (Camera *camera, CameraFile *file, + char *folder, char *filename); +</p> +<p> +<bf>Arguments: </bf>d +</p> +<sect2> +camera_file_put +<p> +<bf>Purpose: </bf>Place (upload) a file to the camera +</p> +<p> +<bf>Prototype: </bf>int camera_file_put (Camera *camera, CameraFile *file, char + *folder); +</p> +<p> +<bf>Arguments: </bf>d +</p> +<sect2> +camera_file_delete +<p> +<bf>Purpose: </bf>Delete a file from the camera +</p> +<p> +<bf>Prototype: </bf>int camera_file_delete (Camera *camera, char *folder, char *filename); + +</p> +<p> +<bf>Arguments: </bf>d +</p> +<sect2> +camera_config_get +<p> +<bf>Purpose: </bf>Retrieve the configuration window. +</p> +<p> +<bf>Prototype: </bf>int camera_config_get (Camera *camera, CameraWidget *window); + +</p> +<p> +<bf>Arguments: </bf>d +</p> +<sect2> +camera_config_set +<p> +<bf>Purpose: </bf>Set camera configuration +</p> +<p> +<bf>Prototype: </bf>int camera_config_set (Camera *camera, CameraSetting *setting, + int count); +</p> +<p> +<bf>Arguments: </bf>d +</p> +<sect2> +camera_capture +<p> +<bf>Purpose: </bf>Retrieve live data from the camera +</p> +<p> +<bf>Prototype: </bf>int camera_capture (Camera *camera, CameraFile *file, CameraCaptureInfo + *info); +</p> +<p> +<bf>Arguments: </bf>d +</p> +<sect2> +camera_summary +<p> +<bf>Purpose: </bf>Retrieve the camera summary information +</p> +<p> +<bf>Prototype: </bf>int camera_summary (Camera *camera, CameraText *summary); +</p> +<p> +<bf>Arguments: </bf>d +</p> +<sect2> +camera_manual +<p> +<bf>Purpose: </bf>Retrieve the camera user's guide (manual) +</p> +<p> +<bf>Prototype: </bf>int camera_manual (Camera *camera, CameraText *manual); +</p> +<p> +<bf>Arguments: </bf>d +</p> +<sect2> +camera_about +<p> +<bf>Purpose: </bf>Retrieve information about the camera library +</p> +<p> +<bf>Prototype: </bf>int camera_about (Camera *camera, CameraText *about); +</p> +<p> +<bf>Arguments: </bf>d +</p> +<sect1> +The gPhoto2 I/O Library + + +</article> diff --git a/doc/camlib_devel.txt b/doc/camlib_devel.txt new file mode 100644 index 000000000..e875d03e3 --- /dev/null +++ b/doc/camlib_devel.txt @@ -0,0 +1,507 @@ + + +gPhoto2 Camera Library Developer's Guide + +Scott Fritzinger +2000-07-26 +Revision 1 + +\tableofcontents{} + +1 Reverse Engineering the Camera Protocol + +The most difficult part for most developers is obtaining the transfer +protocol. If the OEM's are lucky enough, they will simply provide +us with the protocol specifications for their cameras and the drivers +will be written at no cost to them. Most OEM's refuse to do so though, +citing trade secrets or company policy; this is truly unfortunate +in that they have effectively told their own customers who use operating +systems other than Windows and the Mac that they don't want their +future business and that they aren't valued customer to begin with. + +When OEM's do not cooperate, the developer is left to determine the +protocol him/herself through reverse engineering. + +1.1 Sniffing the Protocol + +What follows are the most common setups for sniffing camera protocol +traffic. In all setups, a host computer runs the native camera drivers.; +typically, the Windows serial port drivers are used for reverse engineering. +The drivers are run through a series of functions that include getting +a picture index, downloading thumbnails, download full images, deleting +images, camera configuration options, in addition to any other features +a camera might have. During these operations, one or more of the following +methods are used to capture the communication between the host computer +and the camera. + +1.1.1 Serial Repeater + +A serial repeater consists of the host computer, a computer used as +a repeater, and the camera. The setup is shown in figure . + +The repeater runs special software which reads data from one serial +port, logs the communication, and then outputs the data to the other +serial port. Data that is from the host computer to the camera and +from the camera to the host computer is logged sequentially in a single +log file. Information logged includes hexadecimal data values, direction +of the communication, as well as time stamps for synchronization. +An example sniffer to use for this configuration is ``sersniff''. + +1.1.2 ``Y'' Serial Cable + +To avoid using two computers, a Y serial cable can be used. The ``trunk'' +end of the serial cable attaches to the camera's serial transfer cable, +while the two ``branches'' plug in to two serial ports on the host +computer. Figure shows this setup. + +The camera drivers use one of the serial ports on the host computer, +while the other port is opened with a hexadecimal monitor application +that dumps all communications on the port to a file. The downside +to this approach is the developer would have to determine which sets +of data was generated by the camera or the host computer. Also, a +Y cable would have to be either built or purchased from an electronics +supply store. + +1.1.3 Virtual Device Driver Hooks + +The Windows platform allows virtual device drivers to ``hook'' into +other drivers to provide additional functionality or feature enhancements. +A combination GUI and device driver named PortMon by Systems Internals +is a communications debugging utility that hooks into the existing +Windows serial device driver (vcomm.vxd) and logs communications. +Figure shows this equipment arrangement. + +This setup allows the developer to not use any extra hardware by simply +relying on software. This is perhaps the easiest method for capturing +camera data. + +1.2 Making Sense Out of the Protocol + +What follows are some pointers on decoding camera protocols. It uses +a protocol that isn't really any camera protocol in particular, but +should demonstrate some commonalities between most camera protocols. + +1. Cameras like to ping. This is the in the form of an "ACK"" command + that is different for different cameras. Basically, it is usually + a short packet (probably 1 byte) that is sent both ways in order + for the camera to know the computer is there or vice versa. It is + also sometimes used to wake up a camera that has gone into power-save + mode. It usually starts out the communications, as well as confirms + each packet in any sort of "mass" transfer. The opposite, a "NAK", + is sent to basically say the last packet was not received, or an + error has occured. Again, this is usually just a single byte as + well. + + Example: + Computer: 01 + Camera : 01 + + The Camera sent an ACK ("01") and the Computer responded with an + ACK as well. + +2. Transfers are usually in "reverse network order", meaning least significant + bytes come before most significant bytes. For example, ``00 08'' + should actually be reassembled as ``08 00''. + +3. Most protocols use starting and stopping bytes. + + Example: + Computer: 03 50 00 0f e0 04 + Camera : 03 03 00 3f 03 04 + Computer: 01 + + For this example, notice the packets begin with "03" and end with + "04" (don't pay attention to what is between them). Also notice + the Computer sent an "ACK" to confirm it got the packet. + +4. Packets usually have a "command" byte, which tells either the computer + or the camera what to do. Let's say you told the software to retrieve + the number of pictures, which at the time happened to be "8", and + you got the following: + + Computer: 03 01 00 00 00 04 + Camera : 03 01 00 00 08 04 + Computer: 01 + + In this example, you notice the "03" and "04" specifying the start + and stop of the packet. Also, you notice the second byte in the + Computer packet is "01". The camera responds with the above packet, + and low and behold, you see the number 8 in the same packet. It + would appear, initially, that the second byte is used as a command + byte, and that "01" specifies the camera to return the number of + pictures. This may very well be right, but don't jump into it yet. + Make sure you look at a bunch of similar situations to confirm this. + (Again, notice the "ACK" sent by the computer). + +5. Most protocols have a "data size" byte(s) in data packets. Let's + say that you told the camera to retrieve thumbnail 8 and you get + the following: + + Computer: 03 02 00 00 08 04 + Camera : 03 02 00 0F (15 bytes) 04 + Computer: 01 + + OK, here's a brief breakdown of this transaction: + + -Looks like the command to retrieve a thumbnail is "02" (2nd byte + in the computer packet), and that the byte that is "08" specifies + which thumbnail to return. + -The camera responds with a "02" in the command field, specifying + it is returning a thumbnail, and then sends "0F", and 15 bytes of + data. + -It looks like the byte "0F" specifies how many bytes are after it + in the same packet. This is a data size byte. + (Note: this is a simplistic example. No thumbnail will only be 15 + bytes :) this leads up to the next thing to consider) + +6. Most protocols have an "order" or "counter" byte. This is used so + that, in large data transfers where the picture may be split up + into several different packets, the computer knows how to reassemble + all the data. The entire thumbnail more than likely will not be + contained in a single packet for logistical reasons, so they break + up the data into many different packets and give each packet a unique + number (or ``order'' byte). Let's say you told your camera to return + thumbnail 8 (which is, as mentioned, pretty big), and you get the + following: + + Computer: 02 03 00 00 08 03 + Camera : 02 03 00 0F (15 bytes) 03 + Computer: 01 + Camera : 02 03 01 0F (15 bytes) 03 + Computer: 01 + Camera : 02 03 02 0F (15 bytes) 03 + Computer: 01 + ... 5 more packets and ACKs ... + Camera : 02 03 08 09 (9 bytes) 03 + Computer: 01 + + You notice that the 3rd byte of each of the camera packets increments + with each packet sent from the camera. This looks like it is an + order (counter) byte. the computer can then reassemble the data + from all the packets in order to reproduce the image. + +7. Most protocols have some sort of error detection byte(s) at the end + of the packet. This is usually a simple checksum (summation of bytes), + or a CRC (a somewhat complex algorithm that reduces the probability + of mis-diagnosing a packet with errors by magnitudes). These bytes + can take into account only the data, or maybe the entire packet + excluding those error detection bytes. If this isn't a known scheme, + this winds up being the hardest part of reimplementing the protocol. + Lets take the above example again, this time we'll add a couple + bytes on the end for error detection: + + Computer: 02 03 00 00 08 03 + Camera : 02 03 00 0F (15 bytes) 0f 02 03 + Computer: 01 + Camera : 02 03 01 0F (15 bytes) 0e 00 03 + Computer: 02 + Camera : 02 03 01 0F (15 bytes) fa d0 03 + Computer: 01 + Camera : 02 03 02 0F (15 bytes) fa d0 03 + Computer: 01 + ... 5 more packets and ACKs + Camera : 02 03 08 09 (9 bytes) d7 38 03 + Computer: 01 + + Notice how the error detection bytes are usually different for each + packet. These may be checksums, or CRC's, or something else. Only + way to find out really is to try each one, on different combinations + of packet parts (data, order byte, command byte, etc...) and see + if you get the same thing. Try this on the shorter packets to make + life easier. + + Look at one more thing that sticks out in this transaction: for packet + with order byte ``01'', the Computer responded with a "02''. and + the Camera then resent the same packet it just did. This shows that + the NAK byte is "02", and this could happen because maybe the error + detection bytes didn't match with the data, or maybe something else + happened. either way, the camera resent the last packet, and now + you know how the camera can recover from transfer errors. If you + didn't get the packet you were expecting, send the camera a NAK + and it will resend the same packet again. + +2 Understanding the gPhoto2 Design + +The gPhoto2 design is the same three-tiered structure that has worked +extremely well in the past with other software packages. Here is a +listing of the 3 tiers: + +* the camera library + +* the I/O library + +* the front-end + +* the ``core'' + +2.1 Role of the Camera Library + +The camera library is in charge of talking directly with the camera. +The library uses the gPhoto2 Camera API in order to provide a common +access-method for the library itself. Being dynamically linked, the +libraries are loaded at run-time depending on the camera model the +end-user would like to access. + +In order to provide flexilibity with variations in camera design, there +are camera ``abilities'' which list, well, the abilities of each camera +model. Some camera may support serial port connections only, while +others may be able to use USB and a serial port. We've run into cameras +that don't support thumbnailing on the camera so there is an ``abilities'' +field to specify whether or not the camera supports thumbnailing. +The ``abilities'' also list other things such as supported serial +transfer speeds, file deletion, and other functionality. + +The camera libraries only make functions calls to the I/O library and +to the gPhoto2 core. + +There is more information on the specifics of the camera library in +section 3 of this document. + +2.2 Role of the I/O Library + +The gPhoto2 I/O library is a platform-independent communications library +that support serial, parallel, USB, firewire, and network connections. +It is a work-in-progress with a constantly expanding list of supported +platforms. This library uses the gPhoto2 I/O library API for accessing +communications devices. It enumerates the devices available on a system, +and provides read/write access. + +The camera libraries all use the I/O library for communications with +the cameras. By doing having all communications go through a single +library, the camera libraries become as portable as the I/O library. +Porting gPhoto2 to other platforms become extremely easy. + +There is more information on the specifics of the I/O library in section +3 of this document. + +2.3 Role of the Front-end + +The front-end is the application that the user interacts with. It is +usually a command-line program, or a graphical point-and-click interface. +The front-end talks only with the gPhoto2 core in order to retrieve +pictures and perform other functions with the camera. + +2.4 Role of the gPhoto2 Core + +The gPhoto2 ``core'' is the heart of gPhoto2. It provides services +to both the camera libraries and the front-ends. Most of the services +deal with error-checking and enumeration of devices (cameras, I/O +devices, etc...). The core performs validity checking on data passed +to/from the front-end or the camera library. + +You could consider the core a translator/interpreter/spell-checker/army-general +in the ``big picture'' of gPhoto2. It does the grunt-work and performs +the coordination of the other parts. + +3 Implementing the Library + +gPhoto2 camera libraries use the gPhoto2 Camera API (CAPI) for implementation. +Here is a listing of the CAPI functions: + +camera_id + +camera_abilities + +camera_init + +camera_exit + +camera_folder_list + +camera_file_list + +camera_file_get + +camera_file_get_preview + +camera_file_put + +camera_file_delete + +camera_config_get + +camera_config_set + +camera_capture + +camera_summary + +camera_manual + +camera_about + + +Section 3.1 details the purpose of each of these functions, while Section +3.2 discusses how to use the I/O library. + +3.1 Camera API + +The CAPI provides the full set of functions for doing various tasks +with the camera. All CAPI functions return either GP_OK for succesful +execution , or GP_ERROR for a failure of execution + +What follows is a listing of the functions, including prototypes and +data exchange: + +3.1.1 camera_id + +Purpose: Retrieve the unique id for the camera library. + +Prototype: int camera_id (CameraText *id); + +Arguments: + +CameraText *id : unique string to represent the camera library + + +In order to guarantee that only once instance of the camera library +is loaded for each instance of the core, the camera library must copy +a unique string into the ``id''. Please consult the gPhoto developers +to determine which string you should use. + + +Example: + +int camera_id(CameraText *id) { + +strcpy(id->text, ``my-unique-string''); + +return (GP_OK); + +} + +3.1.2 camera_abilities + +Purpose: Retrieve the list of supported cameras and the abilities for +each camera + +Prototype: int camera_abilities (CameraAbilitiesList *list); + +Arguments: d + +CameraAbilities *abilities : the list of abilities for the supported +cameras + +int *count : the number of + +3.1.3 camera_init + +Purpose: Initialize the camera + +Prototype: int camera_init (Camera *camera, CameraInit *init); + +Arguments: d + +3.1.4 camera_exit + +Purpose: Close the camera + +Prototype: int camera_exit (Camera *camera); + +Arguments: d + +3.1.5 camera_file_list + +Purpose: List the files in a particular folder on the camera + +Prototype: int camera_file_list(Camera *camera, CameraList *list, char +*folder); + +Arguments: d + +3.1.6 camera_folder_list + +Purpose: List the subfolders in a particular folder on the camera + +Prototype: int camera_folder_list(Camera *camera, CameraList *list, +char *folder); + +Arguments: d + +3.1.7 camera_file_get + +Purpose: Retrieve a file from the camera + +Prototype: int camera_file_get (Camera *camera, CameraFile *file, char +*folder, char *filename); + +Arguments: d + +3.1.8 camera_file_get_preview + +Purpose: Retrieve a file's preview from the camera + +Prototype: int camera_file_get_preview (Camera *camera, CameraFile +*file, char *folder, char *filename); + +Arguments: d + +3.1.9 camera_file_put + +Purpose: Place (upload) a file to the camera + +Prototype: int camera_file_put (Camera *camera, CameraFile *file, char +*folder); + +Arguments: d + +3.1.10 camera_file_delete + +Purpose: Delete a file from the camera + +Prototype: int camera_file_delete (Camera *camera, char *folder, char +*filename); + +Arguments: d + +3.1.11 camera_config_get + +Purpose: Retrieve the configuration window. + +Prototype: int camera_config_get (Camera *camera, CameraWidget *window); + +Arguments: d + +3.1.12 camera_config_set + +Purpose: Set camera configuration + +Prototype: int camera_config_set (Camera *camera, CameraSetting *setting, +int count); + +Arguments: d + +3.1.13 camera_capture + +Purpose: Retrieve live data from the camera + +Prototype: int camera_capture (Camera *camera, CameraFile *file, CameraCaptureInfo +*info); + +Arguments: d + +3.1.14 camera_summary + +Purpose: Retrieve the camera summary information + +Prototype: int camera_summary (Camera *camera, CameraText *summary); + +Arguments: d + +3.1.15 camera_manual + +Purpose: Retrieve the camera user's guide (manual) + +Prototype: int camera_manual (Camera *camera, CameraText *manual); + +Arguments: d + +3.1.16 camera_about + +Purpose: Retrieve information about the camera library + +Prototype: int camera_about (Camera *camera, CameraText *about); + +Arguments: d + +3.2 The gPhoto2 I/O Library diff --git a/doc/frontend_devel.lyx b/doc/frontend_devel.lyx new file mode 100644 index 000000000..dbbb6068d --- /dev/null +++ b/doc/frontend_devel.lyx @@ -0,0 +1,64 @@ +#LyX 1.1 created this file. For more info see http://www.lyx.org/ +\lyxformat 2.15 +\textclass linuxdoc +\language default +\inputencoding latin1 +\fontscheme default +\graphics default +\paperfontsize default +\spacing single +\papersize Default +\paperpackage a4 +\use_geometry 0 +\use_amsmath 0 +\paperorientation portrait +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation indent +\defskip medskip +\quotes_language english +\quotes_times 2 +\papercolumns 1 +\papersides 1 +\paperpagestyle default + +\layout Title +\added_space_top vfill \added_space_bottom vfill +gPhoto Front-end Developer's Guide +\layout Author + +Scott Fritzinger +\newline +2000-07-26 +\newline +Revision 1 +\layout Standard + + +\begin_inset LatexCommand \tableofcontents{} + +\end_inset + + +\layout Section + +Understanding the gPhoto2 Structure +\layout Subsection + +Role of the gPhoto2 Core +\layout Subsection + +Role of the Camera Library +\layout Subsection + +Role of the Front-end +\layout Section + +Implementing the Front-end +\layout Subsection + +gPhoto2 Core API +\layout Subsection + +Functions Required By the Front-end +\the_end diff --git a/doc/frontend_devel.sgml b/doc/frontend_devel.sgml new file mode 100644 index 000000000..554f4cb1e --- /dev/null +++ b/doc/frontend_devel.sgml @@ -0,0 +1,30 @@ +<!doctype linuxdoc system> + +<!-- LyX 1.1 created this file. For more info see http://www.lyx.org/ --> +<article> +<title> +gPhoto Front-end Developer's Guide +</title> +<author> +Scott Fritzinger +2000-07-26 +Revision 1 +</author> +<toc> +<sect> +Understanding the gPhoto2 Structure +<sect1> +Role of the gPhoto2 Core +<sect1> +Role of the Camera Library +<sect1> +Role of the Front-end +<sect> +Implementing the Front-end +<sect1> +gPhoto2 Core API +<sect1> +Functions Required By the Front-end + + +</article> diff --git a/doc/frontend_devel.txt b/doc/frontend_devel.txt new file mode 100644 index 000000000..bf3369736 --- /dev/null +++ b/doc/frontend_devel.txt @@ -0,0 +1,23 @@ + + +gPhoto Front-end Developer's Guide + +Scott Fritzinger +2000-07-26 +Revision 1 + +\tableofcontents{} + +1 Understanding the gPhoto2 Structure + +1.1 Role of the gPhoto2 Core + +1.2 Role of the Camera Library + +1.3 Role of the Front-end + +2 Implementing the Front-end + +2.1 gPhoto2 Core API + +2.2 Functions Required By the Front-end |