/* Protocol Notes
   ==========================================================

* PC is the host (always)

* 6 images MAXIMUM on the camera, 128k of memory

* Camera has an image counter that designates current image to do something with.
  (yes, there is better wording, but hey... :)

* ACK = 0x06, NAK = 0x15
	- No ack/nak means bad connection/faulty cable/no camera

* Camera always answers ACK to sent command

* Most COMMAND's have a matching RESPONSE

* Command Packet structure is:
	[0x02] [COMMAND] [DATA] [DATA] [...] [0x03]

* Response Packet structure is:
	[0x02] [RESPONSE] [DATA] [DATA] [...] [0x03]

* Image transfer Packet Structure is:
	[0x02] [RESPONSE] [N1] [N2] [N3] [N4] [DATA] [DATA] [...] [0x03]

	N1 = number of columns in the image
	N2 = number of black lines
	N3 = number of visible lines
	N4 = number of status bytes

	Number of data bytes = N1 * (N2 + N3) + N4

* Firmware version transfer Packet Structure is:
	[0x02] [RESPONSE] [SIZE] [CHAR] [CHAR] [...] [NULL] [0x03]

	- On error:
	[0x02] [RESPONSE] [0] [0x03]

* Camera sends response packets to host after it sends ACK.
  (NAK gets no response of course)

	- Command/Response codes
	  (note: COMMAND is upper case, RESPONSE is lower case of same letter)

	CMD	CMD DATA BYTES			RESP DATA BYTES		Description
	---     -----------------------         ---------------------   -----------------------
	A	1 (index #)			1 (0)			move to image index #
	B	2 (duration, num times)		1 (0)			beep (duration*50ms)
	E	1 (test char)			1 (test char)		echo (test or wake up camera)
	G	1 (delay & retry flags)		1 (0, use grab image	grab image - increments counter,
						  result for error	lower nibble = self timer delay,
									upper nibble = retry numbers
										0,16,32,64(force),112
	I	1 (0)				1 (image index)		get image counter
									(use reset first to get # pics)
	J	2 (value: LSB, MSB)		2 (error, value)	increment counter
									(0 lets current ram be read)
	K	1 (value)			1 (error)		write rambyte
									(counter incremented after)
	L	1 (0)				1 (0)			go idle
	M	1 (0)				hdr+pixel data+info	upload thumbnail (increments
									image counter & image index)
	P	1 (new port value)		1 (old port value)	set port value
	Q	1 (video mode)			1 (0)			video mode (!!)
									(requires capture card)
	R	1 (register index)		1 (register value)	read register value
						  (error = 0xFF)
	T	2 (min, max)			1 (0)			set exposure threshold
	U	1 (0)				hdr+pixel data+info	upload image
	V	1 (0)				version string		get version information
	W	2 (register index, value)	1 (0 = OK, 0xFF = ERR)	write register value
	X	1 (0)				2 (min, max)		get exposure threshold
	Y	1 (0)				1 (grab result code)	get grab result code
						0x00 = successful
						0x80 = memory full
						0x81 = failed exposure
	Z	1 (0)				1 (0)			quit self test

* If camera is busy when command is issued, camera responds with a BUSY packet
	[0x02] [BUSY] [BUSYCODE] [0x03]

	- BUSY = '!'
	- Busy codes:
		0x20	BUSY_TIMER 	camera waiting
		0x21	BUSY_EXPOSURE	waiting for exposure after grab started
		0x22	BUSY_VIDEO	camera in continuous video mode (self test)(yummy!!!!) :)
		0x23	BUSY_SHUTTER	waiting for shutter to come up
		0x24	BUSY_COMMAND	waiting for command completion
		0x25	BUSY_COUNTER	counter being reset (to nonzero value)

*/
