File:  [ELWIX - Embedded LightWeight unIX -] / libaitpelco / inc / aitpelco.h
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Fri Jan 22 00:57:32 2010 UTC (14 years, 4 months ago) by misho
Branches: MAIN
CVS tags: HEAD
Initial revision

/*************************************************************************
* (C) 2010 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
*  by Michael Pounov <misho@openbsd-bg.org>
*
* $Author: misho $
* $Id: aitpelco.h,v 1.1 2010/01/22 00:57:32 misho Exp $
*
*************************************************************************/
#ifndef __AITPELCO_H
#define __AITPELCO_H


#include <sys/types.h>


#define PELCO_D_LEN	7
#define PELCO_P_LEN	8

#define FIXED_ZERO	0

#define VER_D_SYNC	0xFF
#define VER_P_STX	0xA0
#define VER_P_ETX	0xAF

#define FIRST_CAM_D	1
#define FIRST_CAM_P	0

#define SPEED_MIN	0x00
#define SPEED_HI	0x3F
#define SPEED_MAX	0x40

#define PAN_STOP	SPEED_MIN
#define PAN_FAST	SPEED_HI
#define PAN_TURBO	SPEED_MAX
#define TILT_STOP	SPEED_MIN
#define TILT_FAST	SPEED_HI


/* Pelco-D protocol */

// Helper Command bitField structures

struct bitD_Cmd1 {
	u_char focus_near:1;
	u_char iris_open:1;
	u_char iris_close:1;
	u_char cam_on:1;
	u_char auto_scan:1;
	u_char reserved:2;
	u_char sense:1;
};

struct bitD_Cmd2 {
	u_char fixed:1;
	u_char pan_right:1;
	u_char pan_left:1;
	u_char tilt_up:1;
	u_char tilt_down:1;
	u_char zoom_tele:1;
	u_char zoom_wide:1;
	u_char focus_far:1;
};

typedef struct tagPelcoD {
	u_char d_sync;
	u_char d_cam;
	struct bitD_Cmd1 d_cmd1;
	struct bitD_Cmd2 d_cmd2;
	u_char d_data[2];
	u_char d_crc;
} pelco_d_t;	// 7 bytes packet


/* Pelco-P protocol */

// Helper Data bitField structures

struct bitP_Cmd1 {
	u_char focus_far:1;
	u_char focus_near:1;
	u_char iris_open:1;
	u_char iris_close:1;
	u_char cam_on:1;
	u_char auto_scan:1;
	u_char camera:1;
	u_char fixed:1;
};

struct bitP_Cmd2 {
	u_char for_pan_tilt:1;
	u_char pan_right:1;
	u_char pan_left:1;
	u_char tilt_up:1;
	u_char tilt_down:1;
	u_char zoom_tele:1;
	u_char zoom_wide:1;
	u_char fixed:1;
};

typedef struct tagPelcoP {
	u_char p_stx;
	u_char p_cam;
	struct bitP_Cmd1 p_cmd1;
	struct bitP_Cmd2 p_cmd2;
	u_char p_data[2];
	u_char p_etx;
	u_char p_crc;
} pelco_p_t;	// 8 bytes packet


// -------------------------------------------------------
// pelco_GetErrno() Get error code of last operation
inline int pelco_GetErrno();
// pelco_GetError() Get error text of last operation
inline const char *pelco_GetError();
// -------------------------------------------------------


/*
 * pelcoOpen() Open packet record for camera number with Pelco version D/P
 * @pelcoVer = Pelco protocol version Dd | Pp
 * @camNo = Packet for camera number address
 * return: NULL error, !=NULL ok, allocated memory for packet
 */
inline void *pelcoOpen(u_char pelcoVer, u_char camNo);

/*
 * pelcoClose() Close packet record and free memory
 * @p = Packet structure for close
 */
inline void pelcoClose(void * __restrict p);

/*
 * pelcoAddCmdData() Add commands and datas for already opened packet
 * @p = Input Packet structure
 * @cmd[2] = Input Commands 1 & 2
 * @data[2] = Input Data for commands 1 & 2
 * return: 0xFF - error, 0 - ok
 */
inline u_char pelcoAddCmdData(void * __restrict p, u_char * __restrict cmd, u_char * __restrict data);


/*
 * pelco_GetVersion() Return Pelco protocol version
 * @p = Packet structure
 * return: 'd' - PelcoD, 'p' - PelcoP, 0 - unknown or bad packet
 */
inline u_char pelco_GetVersion(void * __restrict p);

/*
 * pelco_GetCamNo() Get Camera number and check for valid packet
 * @p = Packet structure
 * return: 0xFF and pelco_GetErrno() == ENOEXEC - error, 
 	any number is camera address
 */
inline u_char pelco_GetCamNo(void * __restrict p);

/*
 * pelco_GetCamCmdData() Get from Camera commands and datas with verify packet
 * @p = Input Packet structure
 * @cam = Output camera number
 * @cmd[2] = Output Commands 1 & 2
 * @data[2] = Output Data for commands 1 & 2
 * return: 'd' - PelcoD, 'p' - PelcoP, 0 - unknown or bad packet
 */
inline u_char pelco_GetCamCmdData(void * __restrict p, u_char * __restrict cam, 
		u_char * __restrict cmd, u_char * __restrict data);


/*
 * pelco_D_toCmd() Convert to Pelco D commands
 * @cmd[2] = Input Commands 1 & 2
 * @cmd1 = Output typecasted commands 1
 * @cmd2 = Output typecasted commands 2
 * return: 0xFF - error, !=0 return number arguments
 */
inline u_char pelco_D_toCmd(u_char * __restrict cmd, 
		struct bitD_Cmd1 * __restrict cmd1, struct bitD_Cmd2 * __restrict cmd2);

/*
 * pelco_P_toCmd() Convert to Pelco P commands
 * @cmd[2] = Input Commands 1 & 2
 * @cmd1 = Output typecasted commands 1
 * @cmd2 = Output typecasted commands 2
 * return: 0xFF - error, !=0 return number arguments
 */
inline u_char pelco_P_toCmd(u_char * __restrict cmd, 
		struct bitP_Cmd1 * __restrict cmd1, struct bitP_Cmd2 * __restrict cmd2);

/*
 * pelco_D_fromCmd() Convert from Pelco D commands
 * @cmd1 = Input typecasted commands 1
 * @cmd2 = Input typecasted commands 2
 * @cmd[2] = Output Commands 1 & 2
 * return: 0xFF - error, 0 - ok
 */
inline u_char pelco_D_fromCmd(struct bitD_Cmd1 cmd1, struct bitD_Cmd2 cmd2, 
		u_char * __restrict cmd);

/*
 * pelco_P_fromCmd() Convert from Pelco P commands
 * @cmd1 = Input typecasted commands 1
 * @cmd2 = Input typecasted commands 2
 * @cmd[2] = Output Commands 1 & 2
 * return: 0xFF - error, 0 - ok
 */
inline u_char pelco_P_fromCmd(struct bitP_Cmd1 cmd1, struct bitP_Cmd2 cmd2, 
		u_char * __restrict cmd);

/*
 * pelco_SetCamCmdData() Set Camera commands and datas
 * @ver = Input Pelco (d | p) version
 * @cam = Input camera number
 * @cmd[2] = Input Commands 1 & 2
 * @data[2] = Input Data for commands 1 & 2
 * @p = Output Packet structure
 * return: 0xFF - error, 0 - ok
 */
inline u_char pelco_SetCamCmdData(u_char ver, u_char __restrict cam, 
		u_char * __restrict cmd, u_char * __restrict data, void * __restrict p);


#endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>