/************************************************************************* * (C) 2010 AITNET ltd - Sofia/Bulgaria - * by Michael Pounov * * $Author: misho $ * $Id: aitpelco.h,v 1.1 2010/01/22 00:57:32 misho Exp $ * *************************************************************************/ #ifndef __AITPELCO_H #define __AITPELCO_H #include #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