Add some useful #define's. Eliminate redundant buffer copies and initializations.
[hai:hai.git] / hai_comm.h
1 /*******************************************************************************/
2 /* Copyright (C) 2004-2005  Chuck Cannon                                       */
3 /*                                                                             */
4 /* This program is free software; you can redistribute it and/or               */
5 /* modify it under the terms of the GNU General Public License                 */
6 /* as published by the Free Software Foundation; either version 2              */
7 /* of the License, or (at your option) any later version.                      */
8 /*                                                                             */
9 /* This program is distributed in the hope that it will be useful,             */
10 /* but WITHOUT ANY WARRANTY; without even the implied warranty of              */
11 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               */
12 /* GNU General Public License for more details.                                */
13 /*                                                                             */
14 /* You should have received a copy of the GNU General Public License           */
15 /* along with this program; if not, write to the Free Software                 */
16 /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. */
17 /*******************************************************************************/
18
19 /**
20  * @file  hai_comm.h
21  *
22  * @brief HAI Communication Header File
23  *    
24  * Header file containing definitions for generic HAI communication functions.
25  */
26
27 /**
28  * \example hai.c
29  *
30  * This file contains example usage for all of the HAI lib functions.
31  */
32
33 #ifndef _HAI_COMM_H_
34 #define _HAI_COMM_H_
35
36 #ifdef __cplusplus
37 extern "C" {            /* Assume C declarations for C++ */
38 #endif  /* __cplusplus */
39
40 /* Includes */
41
42 #ifdef WIN32
43 #include <winsock2.h>
44 #else
45 #include <netinet/in.h>
46 #endif
47 #include <errno.h>
48
49 /* Defines */
50
51 /** Define HAIEXPORT for MSVC DLL building */
52 #ifdef WIN32
53 #ifdef _USRDLL
54 #define HAIEXPORT __declspec(dllexport)
55 #define HAIIMPORT __declspec(dllexport)
56 #else
57 #define HAIEXPORT
58 #define HAIIMPORT
59 #endif
60 #else
61 #define HAIEXPORT
62 #define HAIIMPORT
63 #endif
64
65 /** Define max system error code (if not defined) */
66 #ifndef __ELASTERROR
67 #define __ELASTERROR    2000
68 #endif
69
70 /**
71  * @name HAI Communication Error Codes
72  * @anchor CommErrs
73  *
74  * These defines are used to report network/serial errors.
75  *
76  * @{
77  */
78
79 /** Error code for invalid argument */
80 #define EHAIARGUMENT    __ELASTERROR + 1
81 /** Error code for unexpected response */
82 #define EHAIRESPONSE    __ELASTERROR + 2
83 /** Error code for invalid session ID */
84 #define EHAISESSION     __ELASTERROR + 3
85 /** Error code for netowrk time-out */
86 #define EHAITIMEOUT     __ELASTERROR + 4
87 /** Define for max HAI comm error code */
88 #define __ELASTHAI      __ELASTERROR + 10
89 /** @} */
90
91 /**
92  * @name Omni Packet Access Macros
93  *
94  * These macros are used to access omni data elements.
95  *
96  * @{
97  */
98
99 /** Macro to read a \a val8. */
100 #define GET8(a)         (a)
101 /** Macro to write a \a val8. */
102 #define SET8(a,b)       (a) = ((b) & 0xFF)
103 /** Macro to read a \a val16. */
104 #define GET16(a)        (((a)[0] << 8) | (a)[1])
105 /** Macro to write a \a val16. */
106 #define SET16(a,b)      {(a)[0] = ((b) >> 8) & 0xFF; \
107                         (a)[1] = (b) & 0xFF;}
108 /** Macro to read a \a val24. */
109 #define GET24(a)        (((a)[0] << 16) | ((a)[1] << 8) | (a)[2])
110 /** Macro to write a \a val24. */
111 #define SET24(a,b)      {(a)[0] = ((b) >> 16) & 0xFF; \
112                         (a)[1] = ((b) >> 8) & 0xFF; \
113                         (a)[2] = (b) & 0xFF;}
114 /** Macro to read a \a val32. */
115 #define GET32(a)        (((a)[0] << 24) | ((a)[1] << 16) \
116                         | ((a)[2] << 8) | (a)[3])
117 /** Macro to write a \a val32. */
118 #define SET32(a,b)      {(a)[0] = ((b) >> 24) & 0xFF; \
119                         (a)[1] = ((b) >> 16) & 0xFF; \
120                         (a)[2] = ((b) >> 8) & 0xFF; \
121                         (a)[3] = (b) & 0xFF;}
122 /** @} */
123
124 /* Defines */
125
126 #define HAI_KEY_LEN     16
127 #define HAI_BLOCK_SIZE  16
128
129 /* Typedefs */
130
131 /**
132  * @name Omni Data Typedefs
133  *
134  * These types are used to store omni data elements. Access should
135  * only be via the omni packet access macros.
136  *
137  * @{
138  */
139
140 /** Type used to contain single-byte omni data */
141 typedef unsigned char val8;
142 /** Type used to contain 2-byte omni data */
143 typedef unsigned char val16[2];
144 /** Type used to contain 3-byte omni data */
145 typedef unsigned char val24[3];
146 /** Type used to contain 4-byte omni data */
147 typedef unsigned char val32[4];
148 /** Type used to contain 5-byte omni data */
149 typedef unsigned char val40[5];
150 /** @} */
151
152 /**
153  * Structure for HAI communication handle. Do not access elements directly.
154  *
155  * @brief HAI Communication Handle
156  */
157 typedef struct
158 {
159     /** Open socket or serial device handle */
160     int s;
161     /** Structure containing network address of Omni */
162     struct sockaddr_in omni;
163     /** Next transmit sequence number */
164     int tx_sequence;
165     /** Next expected receive sequence number */
166     int rx_sequence;
167     /** Session ID */
168     unsigned char session_id[5];
169     /** Private key */
170     unsigned char private_key[HAI_KEY_LEN];
171     /** Flag to indicate serial mode */
172     int serial_mode;
173 } hai_comm_id;
174
175 #ifdef __cplusplus
176 }                       /* End of extern "C" { */
177 #endif  /* __cplusplus */
178
179 #endif /* _HAI_COMM_H_ */
180