Host Interface Spec, 1.0, November 10, 1998 p 5: Comm Flag Pod Receive Mode and Host Receive Mode bit fields in Comm Flag are undocumented, except that if Comm Flag is 0x00, then polled transport mode is used. p 5: Checksum "Checksum is calculated on all bytes, using bytewise modulo-2 addition." The checksum is actually modulo-256 -- it's the lower 8 bits of the sum of the bytes. A mod-2 sum would be the lower 1 bit. p 10: CPD message structure. A checksum field is indicated, but does not appear to be transmitted except in the Beacon phase. p 22: PNameTypeValueStruct. The typedef PNameType is used to declare the Type field, but PNameType is never defined; probably ValueType (p 21) is what was meant. p 27: GetProductInfo "...you can request all product information by sending a PName value of NULL, in which case all ProductInfo parameters are returned." This is incorrect -- sending a pname of NULL causes the camera to return an empty list. To request all parameters, omit the pname parameter entirely. The same treatment of NULL applies to some other commands such as GetFileList: don't send zeros, omit the parameter entirely. On other commands, such as GetFileTag, the opposite is true, and the literal NULL must be sent. Go figure. pp 42-48: FileNameStruct In the File Commands section, a FileNameStruct is described as being "the DOSName and path" specifying a file. This is incomplete, as FileNameStruct should include the drive number as well. In other words, a FileNameStruct is the first three members of the ResFileItem structure: typedef struct { SInteger DriveNo; String PathName; DOSName DOSName; } FileNameStruct; p 42: GetFileList If a ListOrder of 1 (ascending) or 2 (descending) is specified, the entire list of images is returned, regardless of whether a FileNameStruct was specified. GetFileList will not return files in the SYSTEM directory. p 46: EraseFile Discovered this one while implementing the USB delall command: in sending parameters to the EraseFile command, the FileNameStruct must be followed by a UInteger (I send zeros -- don't know what other values will work). This is required only on USB; the NSS version will work without the extra UInteger. Happily, though, if you send the extra UInteger across the NSS protocol, the command still works. Undefined (but probably defined in the Digita Scripting SDK doco): * Interpretations of GetProductInfo fields, p 27. * Meanings of bits in VendorStatus (3rd) field of GetCameraStatus, p 30. * Interpretations of GetCameraState fields, p 35. (Same as GetCameraCapabilities?) * How to capture an image. Specifically, how does the camera need to be set up in order for the BeginCapture command to take a photo? -- answer: Capture mode must be set first: single, burst, or time lapse. This is done with SetCameraState(mcap,flag); Where flag is 0 for single, 1 for burst, and 2 for time lapse. After that StartCapture() starts the sequence. In HIS it's stated that StartCapture() doesn't require any parameters. This is wrong, without giving any parameters the camera returns error code 5, invalid parameters. According to the data dumps of Windows software, 4 bytes (value of 0x00) are sent along with the StartCapture(). By adding those other bytes it _finally_ works. Oddities: * The camera sometimes sends more data than is required by its response to the message, even if it means sending an extra poll packet. I have observed this in my camera weth the GetFileData command. When asked for a particular thumbnail, the camera sends 9636 bytes even though the thumbnail size is only 8640. The extra data following the thumbnail is zeros. The camera sends 9 packets of length 1021 followed by a packet of length 451. The last packet consists entirely of zeros. * On the GetFileData command, the path and filename can be converted to lower-case and the command still succeeds. However, on the GetFileTag command, if the path and filename are converted to lower-case, the command fails with a kODSInvalidFileType error.