Annotation of libaitpelco/src/get.c, revision 1.1.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>