summaryrefslogtreecommitdiff
path: root/camlibs/dimera/mesalib.h
blob: a1c945665be9905e03902902e68f67127f4a106e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
/*
 * Copyright 2000-2001, Brian Beattie <beattie@aracnet.com>, et. al.
 *
 *	This software was created with the help of proprietary
 *      information belonging to StarDot Technologies
 *
 * Permission to copy and use and modify this file is granted
 * provided the above notices are retained, intact.
 *
 */

#ifndef CAMLIBS_DIMERA_MESALIB_H
#define CAMLIBS_DIMERA_MESALIB_H

#include <stdint.h>
#include <gphoto2/gphoto2-port.h>

#define CHECK(result) {int res = (result); if (res < 0) return (res);}

/* MESA commands */
#define	NOP		0x01	/* No operation */
#define MESA_VERSION		0x05	/* Send Version command */
#define XMIT_TEST	0x09	/* Send test sequent */
#define RAM_TEST	0x0d	/* Test Camera RAM */
#define SEND_RAM	0x15	/* Send Ram contents */
#define SNAP_IMAGE	0x19	/* Snap an Image (no flash or shutter) */
#define SND_BLACK	0x1d	/* Send Black level bytes */
#define SNAP_VIEW	0x21	/* Snap (and Send) viewfinder image */
#define XTRA_STP_BIT	0x25	/* Stop bits (extra time between bytes */
#define SND_VIEW	0x29	/* Send viewfinder image */
#define SNAP_PICTURE	0x2d	/* Snap a picture */
#define	SND_ID		0x35	/* Send Manufacture/year/week of manufacture */
#define AT_COMMAND	0x41	/* Modem Detect command */
#define SND_IMAGE	0x49	/* Send image stored in RAM */
#define	RCV_TEST	0x4d	/* Echo six bytes */
#define IMAGE_CNT	0x55	/* Send count of images */
#define	LD_IMAGE	0x59	/* Load Image from EEPROM into RAM */
#define EEPROM_INFO	0x5d	/* Send information about EEPROM */
#define SND_THUMB	0x61	/* Send Thumbnail of image */
#define SET_SPEED	0x69	/* Set serial link speed */
#define FEATURES	0x6d	/* Send features */
#define SND_IMG_INFO	0x71	/* Send Image Info */

#define	CMD_ACK		0x21	/* Command ACK */

#define RAM_IMAGE_NUM	0x10000	/* image number for image in RAM */

/* RAM Test results */
#define RAM_GOOD	0x2a	/* RAM tests good */
#define RAM_ERROR	0x2d	/* RAM error detected */
#define EE_ERROR	0x45	/* Failure to restore EEPROM dir */

/* DownLoad ViewFinder */
#define ALL_LOWRES	0xff	/* Send all of a LowRES 64x48 viewfinder */
#define EVEN_LOWRES	0xfe	/* Send even rows of LowRES */
#define ODD_LOWRES	0xfd	/* Send odd rows of LowRES */
#define NONE		0xfc	/* Send nothing (for Snap Viewfinder) */
#define ALL_HIRES	0xfb	/* Send All of a HighRES 128x96 viewfinder */
#define EVEN_HIRES	0xfa	/* Send even rows of HiRES */
#define ODD_HIRES	0xf9	/* Send odd rows of HiRES */

/* Feature bits */
struct mesa_feature {
	uint8_t	feature_bits_lo;
#define HAVE_FLASH	0x01		/* Flash present */
#define HAVE_RES_SW	0x02		/* Resolution switch present */
#define FLASH_FILL	0x04		/* Flash is in Fill mode */
#define FLASH_READY	0x08		/* Flash is charged and ready */
#define LOW_RES		0x10		/* Switch is in low res position */
#define DUAL_IRIS	0x20		/* Dual Iris is present */
#define AC_PRESENT	0x40		/* AC Adapter is connected */
#define FLASH_ON	0x80		/* Flash is on */
	uint8_t	feature_bits_hi;
#define	IRIS_ADJUST	0x1f
#define BAT_VALID	0x20		/* Battery level valid */
#define NO_PWR_LIGHT	0x40		/* No power light */
#define	BAT_DIGITAL	0x80		/* Battery level is binary */
	uint8_t	battery_level;	/* Battery level */
	uint8_t	battery_zero;	/* Battery dead level */
	uint8_t	battery_full;	/* Battery full level */
};

/* Send Image */
struct mesa_image_arg {
	uint16_t	row;		/* row to start sending */
	uint16_t	start;		/* 0x1e */
	uint8_t	send;		/* 0x04 */
	uint8_t	skip;		/* 0x00 */
	uint16_t	repeat;		/* 0xA0 */
	uint8_t	row_cnt;	/* 0x20 */
	uint8_t	inc1;		/* 0x01 */
	uint8_t	inc2;		/* 0x80 */
	uint8_t	inc3;		/* 0x00 */
	uint8_t	inc4;		/* 0x00 */
};

struct mesa_id {
	uint16_t	man;	/* 12bit manufacturer ID */
	uint16_t	year;	/* year of manufacture - 1996 */
	uint8_t	ver;	/* 4bit version */
	uint8_t	week;	/* week of manufacture 0 - 51 */
};

#define MESA_THUMB_SZ	(64*60)	/* (64x60x4)/8 */

struct mesa_image_info {
	uint32_t	num_bytes;	/* size of image in eeprom */
	uint8_t	standard_res;	/* image is standard res */
};

#define MESA_VERSION_SZ 7	/* min. buffer length needed for mesa_version */
#define MESA_EEPROM_SZ 49	/* min. buffer length needed for mesa_eeprom_info */

void
mesa_flush( GPPort *port, int timeout );
unsigned int
mesa_read( GPPort *port, uint8_t *b, int s, int timeout2, int timeout1 );
int
mesa_send_command( GPPort *port, uint8_t *cmd, int n, int ackTimeout );
int
mesa_port_open( GPPort *port );
int
mesa_port_close( GPPort *port );
int
mesa_reset( GPPort *port );
int
mesa_set_speed( GPPort *port, int speed );
int
mesa_version( GPPort *port,char *version_string);
int
mesa_transmit_test( GPPort *port );
int
mesa_ram_test( GPPort *port );
int
mesa_read_row( GPPort *port, uint8_t *r, struct mesa_image_arg *s );
int
mesa_snap_image( GPPort *port, uint16_t exposure );
int
mesa_black_levels( GPPort *port, uint8_t r[2] );
int
mesa_snap_view( GPPort *port, uint8_t *r, unsigned int hi_res, unsigned int zoom,
	unsigned int row, unsigned int col, uint16_t exposure,
	uint8_t download );
int
mesa_set_stopbits( GPPort *port, unsigned int bits );
int
mesa_download_view( GPPort *port, uint8_t *r, uint8_t download );
int
mesa_snap_picture( GPPort *port, uint16_t exposure );
int
mesa_send_id( GPPort *port, struct mesa_id *id );
int
mesa_modem_check( GPPort *port );
int
mesa_read_image( GPPort *port, uint8_t *r, struct mesa_image_arg *s );
int
mesa_recv_test( GPPort *port, uint8_t r[6] );
int
mesa_get_image_count( GPPort *port );
int
mesa_load_image( GPPort *port, int image);
int
mesa_eeprom_info( GPPort *port, int long_read, uint8_t info[MESA_EEPROM_SZ] );
int32_t
mesa_read_thumbnail( GPPort *port, int picture, uint8_t *image );
int
mesa_read_features( GPPort *port, struct mesa_feature *f );
int
mesa_battery_check( GPPort *port );
int32_t
mesa_read_image_info( GPPort *port, int i, struct mesa_image_info *info );
uint8_t *
mesa_get_image( GPPort *port, int image );

#endif /* !defined(CAMLIBS_DIMERA_MESALIB_H) */