/*************************************************************************
* (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>