Annotation of libaitpelco/src/get.c, revision 1.1
1.1 ! misho 1: /*************************************************************************
! 2: * (C) 2010 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
! 3: * by Michael Pounov <misho@openbsd-bg.org>
! 4: *
! 5: * $Author: misho $
! 6: * $Id: aitcrc.h,v 1.1.1.1.2.1 2008/11/05 17:29:19 misho Exp $
! 7: *
! 8: *************************************************************************/
! 9: #include "global.h"
! 10:
! 11:
! 12: /*
! 13: * pelco_GetVersion() Return Pelco protocol version
! 14: * @p = Packet structure
! 15: * return: 'd' - PelcoD, 'p' - PelcoP, 0 - unknown or bad packet
! 16: */
! 17: inline u_char pelco_GetVersion(void * __restrict p)
! 18: {
! 19: u_char *ptr = (u_char *) p;
! 20:
! 21: if (!p) {
! 22: pelcoSetErr(EINVAL, "Error:: invalid argument!\n");
! 23: return 0;
! 24: }
! 25:
! 26: switch (*ptr) {
! 27: case VER_D_SYNC:
! 28: return 'd';
! 29: case VER_P_STX:
! 30: if (VER_P_ETX == ptr[6])
! 31: return 'p';
! 32: pelcoSetErr(ENOEXEC, "Error:: broken Pelco P packet ...\n");
! 33: break;
! 34: default:
! 35: pelcoSetErr(ENOEXEC, "Error:: unsupported Pelco protocol version!\n");
! 36: }
! 37:
! 38: return 0;
! 39: }
! 40:
! 41: /*
! 42: * pelco_GetCamNo() Get Camera number and check for valid packet
! 43: * @p = Packet structure
! 44: * return: 0xFF and pelco_GetErrno() == ENOEXEC - error,
! 45: any number is camera address
! 46: */
! 47: inline u_char pelco_GetCamNo(void * __restrict p)
! 48: {
! 49: u_char ver;
! 50: u_char *ptr = (u_char *) p;
! 51:
! 52: if (!p) {
! 53: pelcoSetErr(EINVAL, "Error:: invalid argument!\n");
! 54: return 0;
! 55: }
! 56:
! 57: ver = pelco_GetVersion(p);
! 58: switch (ver) {
! 59: case 'd':
! 60: if (crcPelco(ver, p) == ptr[6])
! 61: return ptr[1];
! 62:
! 63: pelcoSetErr(ENOEXEC, "Error:: broken Pelco D packet!!!\n");
! 64: break;
! 65: case 'p':
! 66: if (crcPelco(ver, p) == ptr[7])
! 67: return ptr[1] + 1;
! 68:
! 69: pelcoSetErr(ENOEXEC, "Error:: broken Pelco P packet!!!\n");
! 70: break;
! 71: }
! 72:
! 73: return 0xFF;
! 74: }
! 75:
! 76: /*
! 77: * pelco_GetCamCmdData() Get from Camera commands and datas with verify packet
! 78: * @p = Input Packet structure
! 79: * @cam = Output camera number
! 80: * @cmd[2] = Output Commands 1 & 2
! 81: * @data[2] = Output Data for commands 1 & 2
! 82: * return: 'd' - PelcoD, 'p' - PelcoP, 0 - unknown or bad packet
! 83: */
! 84: inline u_char pelco_GetCamCmdData(void * __restrict p, u_char * __restrict cam,
! 85: u_char * __restrict cmd, u_char * __restrict data)
! 86: {
! 87: u_char ret;
! 88: u_char *ptr = (u_char *) p;
! 89:
! 90: if (!p) {
! 91: pelcoSetErr(EINVAL, "Error:: invalid argument!\n");
! 92: return 0;
! 93: }
! 94:
! 95: ret = pelco_GetVersion(p);
! 96: switch (ret) {
! 97: case 'd':
! 98: if (crcPelco(ret, p) != ptr[6]) {
! 99: pelcoSetErr(ENOEXEC, "Error:: broken Pelco D packet!!!\n");
! 100: return 0;
! 101: }
! 102:
! 103: if (cam)
! 104: *cam = ptr[1];
! 105: break;
! 106: case 'p':
! 107: if (crcPelco(ret, p) != ptr[7]) {
! 108: pelcoSetErr(ENOEXEC, "Error:: broken Pelco P packet!!!\n");
! 109: return 0;
! 110: }
! 111:
! 112: if (cam)
! 113: *cam = ptr[1] + 1;
! 114: break;
! 115: }
! 116:
! 117: if (cmd)
! 118: memcpy(cmd, ptr + 2, 2);
! 119: if (data)
! 120: memcpy(data, ptr + 4, 2);
! 121: return ret;
! 122: }
! 123:
! 124: /*
! 125: * pelco_D_toCmd() Convert to Pelco D commands
! 126: * @cmd[2] = Input Commands 1 & 2
! 127: * @cmd1 = Output typecasted commands 1
! 128: * @cmd2 = Output typecasted commands 2
! 129: * return: 0xFF - error, !=0 return number arguments
! 130: */
! 131: inline u_char pelco_D_toCmd(u_char * __restrict cmd,
! 132: struct bitD_Cmd1 * __restrict cmd1, struct bitD_Cmd2 * __restrict cmd2)
! 133: {
! 134: u_char ret = 0;
! 135:
! 136: if (!cmd) {
! 137: pelcoSetErr(EINVAL, "Error:: invalid argument!\n");
! 138: return 0xFF;
! 139: }
! 140:
! 141: if (cmd1) {
! 142: cmd1 = (struct bitD_Cmd1*) &cmd[0];
! 143: ret++;
! 144: }
! 145: if (cmd2) {
! 146: cmd2 = (struct bitD_Cmd2*) &cmd[1];
! 147: ret++;
! 148: }
! 149:
! 150: return ret;
! 151: }
! 152:
! 153: /*
! 154: * pelco_P_toCmd() Convert to Pelco P commands
! 155: * @cmd[2] = Input Commands 1 & 2
! 156: * @cmd1 = Output typecasted commands 1
! 157: * @cmd2 = Output typecasted commands 2
! 158: * return: 0xFF - error, !=0 return number arguments
! 159: */
! 160: inline u_char pelco_P_toCmd(u_char * __restrict cmd,
! 161: struct bitP_Cmd1 * __restrict cmd1, struct bitP_Cmd2 * __restrict cmd2)
! 162: {
! 163: u_char ret = 0;
! 164:
! 165: if (!cmd) {
! 166: pelcoSetErr(EINVAL, "Error:: invalid argument!\n");
! 167: return 0xFF;
! 168: }
! 169:
! 170: if (cmd1) {
! 171: cmd1 = (struct bitP_Cmd1*) &cmd[0];
! 172: ret++;
! 173: }
! 174: if (cmd2) {
! 175: cmd2 = (struct bitP_Cmd2*) &cmd[1];
! 176: ret++;
! 177: }
! 178:
! 179: return ret;
! 180: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>