#define OK 1
#define ERROR -1
#define TIMEOUT_ERROR -2
#define RETRY_ERROR -3
#define READ_TOO_FEW_ERROR -4
#define NULL_PTR_ERROR -5

enum Resolution {
	Unknown_Resolution=-1,
	Standard_Resolution=1,
	High_Resolution,
	Extended_Resoltion};
	
enum Aperture {
	Unknown_Aperture=-1,
	Low_Aperture=1,
	Midium_Aperture,
	High_Aperture};
	
enum Color_Mode {
	Unknown_Color_Mode=-1,
	Color_Color_Mode=1,
	BAW_Color_Mode=2};
	
enum Flash_Mode {
	Unknown_Flash_Mode=-1,
	Auto_Flash_Mode=0,
	Force_Flash_Mode,
	Off_Flash_Mode,
	Anti_Red_Eye_Flash_Mode,
	Slow_Sync_Flash_Mode};

enum Camera_Speed {
	CAMERA_SPEED_Unknown=-1,
	CAMERA_SPEED_INIT=0x0,
	CAMERA_SPEED_9600=0x1,
	CAMERA_SPEED_19200=0x2,
	CAMERA_SPEED_38400=0x3,
	CAMERA_SPEED_57600=0x4,
	CAMERA_SPEED_115200=0x5};

enum Bright_Contrast {
	Unknown_Bright_Contrast=-1,
	Normal_Bright_Contrast=0,
	More_Bright_Bright_Contrast,
	Less_Bright_Bright_Contrast,
	More_Contrast_Bright_Contrast,
	Less_Contrast_Bright_Contrast};

enum White_Balance {
	Unknown_White_Balance=-1,
	Auto_White_Balance=0,
	Skylight_White_Balance=1,
	Fluoresent_White_Balance=2,
	Thungsten_White_Balance=3,
	Cloudy_White_Balance=255};

enum Lens_Mode {
	Unknown_Lens_Mode=-1,
	Macro_Lens_Mode=1,
	Normal,
	Infinity_Fisheye};

enum Date_Format {
	Unknown_Date_Format=-1,
	YY_MM_DD_Date_Format=1,
	DD_MM_HH_Date_Format};
	
enum Exp_Meter {
	Unknown_Exp_Meter=-1,
	Center_weighted_Exp_Meter=1,
	Spot_Exp_Meter,
	Multi_Element_Matrix_Exp_Meter=5};

enum LED_Mode {
	Off_LED_Mode=0,
	On_LED_Mode,
	Blink_LED_Mode};


int bootstrap(char *serial_device, int unit);
void clean(int entrypoint);
int init(enum Camera_Speed cs);
int SetSerialSpeed(enum Camera_Speed);

/* SetInteger functions */
int Set_Resolution(enum Resolution re);
int Set_Clock(time_t c);
int Set_Shutter_Speed(long ss);
/* Set_Current_Frame_Number doesn't make sense on this level */
int Set_Aperture(enum Aperture a);
int Set_Color_Mode(enum Color_Mode cm);
int Set_Flash_Mode(enum Flash_Mode fm);
int Set_Comm_Speed(enum Camera_Speed cs);
int Set_Bright_And_Contrast(enum Bright_Contrast bc);
int Set_White_Balance(enum White_Balance wb);
int Set_Autoshut_on_Host_Timer(int aoht);
int Set_Autoshut_on_Field_Timer(int asoft);
int Set_LED(enum LED_Mode lm);
int Set_Lens_Mode(enum Lens_Mode lm);
int Set_Date_Format(enum Date_Format df);
int Set_Exp_Meter(enum Exp_Meter em);
int Set_Optical_Mode(int AEL_WBL, int Fisheye, int Wide, int Digital_Zoom, int BAW);
 

/* GetInteger functions */
int Get_Resolution(enum Resolution *re);
int Get_Clock(time_t *c);
int Get_Shutter_Speed(long *ss);
int Get_Aperture(enum Aperture *a);
int Get_Color_Mode(enum Color_Mode *cm);
int Get_Flash_Mode(enum Flash_Mode *fm);
int Get_Num_of_Frames_Taken(int *noft);
int Get_Num_of_Frames_Left(int *nofl);
int Get_Length_of_Frame(int framenumber, long *locf);
int Get_Length_of_Thumbnail(int framenumber, long *loct);
int Get_Battery_Capacity(int *bc);
int Get_Comm_Speed(enum Camera_Speed *cs);
int Get_Bright_And_Contrast(enum Bright_Contrast *bc);
int Get_White_Balance(enum White_Balance *wb);
int Get_Autoshut_on_Host_Timer(int *aoht);
int Get_Autoshut_on_Field_Timer(int *asoft);
int Get_Available_Memory_Left(long *aml);
int Get_Lens_Mode(enum Lens_Mode *lm);
int Get_LCD_Brightness(int *lb);
int Get_LCD_Autoshut_Timer(int *lat);
int Get_Protect_State_of_Frame(int framenumber, int *psof);
int Get_Date_Format(enum Date_Format *df);
int Get_Exp_Meter(enum Exp_Meter *em);
int Get_Optical_Mode(int *AEL_WBL, int *Fisheye, int *Wide, int *Digital_Zoom, int *BAW);


/* GetVData functions */
int Get_Frame(int framenumber, UBYTE *buffer, long *size);
int Get_Thumbnail(int framenumber, UBYTE *buffer, long *size);
int Get_Camera_ID(UBYTE *buffer, long *size);
int Get_Serial_Number(UBYTE *buffer, long *size);
int Get_Version(UBYTE *buffer, long *size);
int Get_Model(char *string, long *size);
int Get_Audio_Data(UBYTE *buffer, long *size); /* not supported by many cameras */
int Get_Camera_Summery_Data(enum Resolution *re, int *LCD_Brightness, int *Frames_Taken);
int Get_Picture_Summery_Data(int framenumber, long *AudioDataLength, enum Resolution *re, int *ProtectionState, time_t *TimeDate);
int Get_Manufacturer(char *string, long *size);

int Get_Preview(UBYTE *buffer, long *size);

int save(char *, UBYTE *, long, char *);