00001 #ifndef _CPHIDGET_MACROS
00002 #define _CPHIDGET_MACROS
00003
00004 #define PHANDLE(pname) CPhidget##pname##Handle
00005
00006 #define DPHANDLE(pname) typedef struct _CPhidget##pname *CPhidget##pname##Handle;
00008 //Regular Versions
00009 #define CHDRSTANDARD(pname) \
00010 \
00011 PHIDGET21_API int CCONV CPhidget##pname##_create(CPhidget##pname##Handle *phid);
00012
00013 #define CHDREVENTINDEX(pname,param,...) PHIDGET21_API int CCONV CPhidget##pname##_set_On##param##_Handler(PHANDLE(pname) phid, int (CCONV *fptr)(PHANDLE(pname) phid, void *userPtr, int index, __VA_ARGS__), void *userPtr);
00014 #define CHDREVENT(pname,param,...) PHIDGET21_API int CCONV CPhidget##pname##_set_On##param##_Handler(PHANDLE(pname) phid, int (CCONV *fptr)(PHANDLE(pname) phid, void *userPtr, __VA_ARGS__), void *userPtr);
00015
00016 #define CHDRGET(pname,propname,...) PHIDGET21_API int CCONV CPhidget##pname##_get##propname(PHANDLE(pname) phid, __VA_ARGS__);
00017 #define CHDRSET(pname,propname,...) PHIDGET21_API int CCONV CPhidget##pname##_set##propname(PHANDLE(pname) phid, __VA_ARGS__);
00018
00019 #define CHDRGETINDEX(pname,propname,...) PHIDGET21_API int CCONV CPhidget##pname##_get##propname(PHANDLE(pname) phid, int index, __VA_ARGS__);
00020 #define CHDRSETINDEX(pname,propname,...) PHIDGET21_API int CCONV CPhidget##pname##_set##propname(PHANDLE(pname) phid, int index, __VA_ARGS__);
00021
00022
00023
00024 #define DEP_CHDREVENTINDEX(depmsg,pname,param,...) DEPRECATE_WIN(depmsg) PHIDGET21_API int CCONV CPhidget##pname##_set_On##param##_Handler(PHANDLE(pname), int (CCONV *fptr)(PHANDLE(pname), void *userPtr, int index, __VA_ARGS__), void *userPtr) DEPRECATE_GCC ;
00025 #define DEP_CHDREVENT(depmsg,pname,param,...) DEPRECATE_WIN(depmsg) PHIDGET21_API int CCONV CPhidget##pname##_set_On##param##_Handler(PHANDLE(pname), int (CCONV *fptr)(PHANDLE(pname), void *userPtr, __VA_ARGS__), void *userPtr) DEPRECATE_GCC ;
00026
00027 #define DEP_CHDRGET(depmsg,pname,propname,...) DEPRECATE_WIN(depmsg) PHIDGET21_API int CCONV CPhidget##pname##_get##propname(PHANDLE(pname),__VA_ARGS__) DEPRECATE_GCC ;
00028 #define DEP_CHDRSET(depmsg,pname,propname,...) DEPRECATE_WIN(depmsg) PHIDGET21_API int CCONV CPhidget##pname##_set##propname(PHANDLE(pname), __VA_ARGS__) DEPRECATE_GCC ;
00029
00030 #define DEP_CHDRGETINDEX(depmsg,pname,propname,...) DEPRECATE_WIN(depmsg) PHIDGET21_API int CCONV CPhidget##pname##_get##propname(PHANDLE(pname), int index, __VA_ARGS__) DEPRECATE_GCC ;
00031 #define DEP_CHDRSETINDEX(depmsg,pname,propname,...) DEPRECATE_WIN(depmsg) PHIDGET21_API int CCONV CPhidget##pname##_set##propname(PHANDLE(pname), int index, __VA_ARGS__) DEPRECATE_GCC ;
00032
00033
00034 #define TESTPTR(phidname) if (!phidname) return EPHIDGET_INVALIDARG;
00035 #define TESTPTRS(vname1,vname2) if ((!vname1) || (!vname2)) return EPHIDGET_INVALIDARG;
00036 #define TESTINDEX(vname1) if (Index >= phid->vname1 || Index < 0) return EPHIDGET_OUTOFBOUNDS;
00037 #define TESTMASGN(vname1, check) if(phid->vname1 == check) { *pVal = check; return EPHIDGET_UNKNOWNVAL; }
00038 #define TESTRANGE(min, max) if(newVal < (min) || newVal > (max)) return EPHIDGET_INVALIDARG;
00039 #define TESTDEVICETYPE(def) if (phid->phid.deviceID != def) return EPHIDGET_WRONGDEVICE;
00040 #define TESTATTACHED if (!CPhidget_statusFlagIsSet(phid->phid.status, PHIDGET_ATTACHED_FLAG)) return EPHIDGET_NOTATTACHED;
00041 #define MASGN(vname1) { *pVal = phid->vname1; return EPHIDGET_OK; }
00042
00043 #define CFHANDLE(pname,param, ...) \
00044 PHIDGET21_API int CCONV CPhidget##pname##_set_On##param##_Handler(CPhidget##pname##Handle phidA, int (CCONV *fptr)(CPhidget##pname##Handle, void *userPtr, __VA_ARGS__ ), void *userPtr) \
00045 { \
00046 CPhidget##pname##Info *phid = (CPhidget##pname##Info *)phidA; \
00047 TESTPTR(phid); \
00048 phid->fptr##param = fptr; \
00049 phid->fptr##param##ptr = userPtr; \
00050 return EPHIDGET_OK; \
00051 }
00052
00053 #define CPHIDGETDATA(pname) static int CPhidget##pname##_dataInput(CPhidgetHandle phidG, unsigned char *buffer, int length) \
00054 { \
00055 CPhidget##pname##Handle phid = (CPhidget##pname##Handle)phidG;
00056
00057 #define FIRE(ename, ...) \
00058 if (phid->fptr##ename) \
00059 if(CPhidget_statusFlagIsSet(phid->phid.status, PHIDGET_ATTACHED_FLAG)) \
00060 phid->fptr##ename(phid, phid->fptr##ename##ptr, __VA_ARGS__)
00061
00062 #define QUEUE_ERROR_EVENT(ecode, buf) \
00063 else \
00064 { \
00065 void **args = malloc(sizeof(void *)*2); \
00066 if(args) \
00067 { \
00068 args[0] = strdup(buf); \
00069 args[1] = (void *)(size_t)ecode; \
00070 if(args[0]) \
00071 { \
00072 if(CList_addToList((CListHandle *)&((CPhidgetHandle)phid)->errEventList, args, CPhidgetHandle_areEqual)!=EPHIDGET_OK) \
00073 { \
00074 free(args[0]); \
00075 free(args); \
00076 } \
00077 } \
00078 else \
00079 free(args); \
00080 } \
00081 }
00082
00083 #define FIRE_ERROR_BUF_INT(ecode, buf) \
00084 if(CPhidget_statusFlagIsSet(((CPhidgetHandle)phid)->status, PHIDGET_ATTACHED_FLAG)) \
00085 { \
00086 if (((CPhidgetHandle)phid)->fptrError) \
00087 ((CPhidgetHandle)phid)->fptrError((CPhidgetHandle)phid, ((CPhidgetHandle)phid)->fptrErrorptr, ecode, buf); \
00088 } \
00089
00090 #define FIRE_ERROR_BUF(ecode, buf) \
00091 FIRE_ERROR_BUF_INT(ecode, buf) \
00092 QUEUE_ERROR_EVENT(ecode, buf)
00093
00094 #define FIRE_ERROR(ecode, ...) \
00095 snprintf(error_buffer,sizeof(error_buffer), __VA_ARGS__); \
00096 FIRE_ERROR_BUF_INT(ecode, error_buffer) \
00097 QUEUE_ERROR_EVENT(ecode, error_buffer)
00098
00099 #define FIRE_ERROR_NOQUEUE(ecode, ...) \
00100 snprintf(error_buffer,sizeof(error_buffer), __VA_ARGS__); \
00101 FIRE_ERROR_BUF_INT(ecode, error_buffer)
00102
00103 #define CGETINDEX(pname,propname,proptype) \
00104 PHIDGET21_API int CCONV CPhidget##pname##_get##propname(CPhidget##pname##Handle phid, int Index, proptype *pVal) {
00105
00106 #define CGET(pname,propname,proptype) \
00107 PHIDGET21_API int CCONV CPhidget##pname##_get##propname(CPhidget##pname##Handle phid, proptype *pVal) {
00108
00109 #define CSETINDEX(pname,propname,proptype) \
00110 PHIDGET21_API int CCONV CPhidget##pname##_set##propname(CPhidget##pname##Handle phid, int Index, proptype newVal) {
00111
00112 #define CSET(pname,propname,proptype) \
00113 PHIDGET21_API int CCONV CPhidget##pname##_set##propname(CPhidget##pname##Handle phid, proptype newVal) {
00114
00115 #define CPHIDGETCLEARVARS(pname) \
00116 static int CPhidget##pname##_clearVars(CPhidgetHandle phidG) \
00117 { \
00118 CPhidget##pname##Handle phid = (CPhidget##pname##Handle)phidG;
00119
00120 #define CPHIDGETINIT(pname) \
00121 static int CPhidget##pname##_initAfterOpen(CPhidgetHandle phidG) \
00122 { \
00123 CPhidget##pname##Handle phid = (CPhidget##pname##Handle)phidG;
00124
00125 #define CPHIDGETINITEVENTS(pname) \
00126 static int CPhidget##pname##_eventsAfterOpen(CPhidgetHandle phidG) \
00127 { \
00128 CPhidget##pname##Handle phid = (CPhidget##pname##Handle)phidG; \
00129 int i = 0; \
00130 CListHandle traverse = phidG->errEventList; \
00131 for (; traverse; traverse = traverse->next) { \
00132 if (phidG->fptrError) \
00133 phidG->fptrError(phidG, phidG->fptrErrorptr, (int)*(int *)(&((void **)traverse->element)[1]), (char *)((void **)traverse->element)[0]); \
00134 } \
00135 CList_emptyList((CListHandle *)&phidG->errEventList, PTRUE, CPhidgetErrorEvent_free); \
00136 i = 0;
00137
00138 #define CSENDPACKET_BUF(pname) \
00139 static int CPhidget##pname##_sendpacket(CPhidget##pname##Handle phid, \
00140 const unsigned char *buf) \
00141 { \
00142 int waitReturn; \
00143 TESTPTRS(phid, buf) \
00144 again: \
00145 if (!CPhidget_statusFlagIsSet(phid->phid.status, PHIDGET_ATTACHED_FLAG)) \
00146 return EPHIDGET_NOTATTACHED; \
00147 CThread_mutex_lock(&phid->phid.outputLock); \
00148 if (phid->outputPacketLen) { \
00149 CThread_mutex_unlock(&phid->phid.outputLock); \
00150 waitReturn = CThread_wait_on_event(&phid->phid.writtenEvent, 1500); \
00151 switch(waitReturn) \
00152 { \
00153 case WAIT_OBJECT_0: \
00154 break; \
00155 case WAIT_ABANDONED: \
00156 return EPHIDGET_UNEXPECTED; \
00157 case WAIT_TIMEOUT: \
00158 return EPHIDGET_TIMEOUT; \
00159 } \
00160 goto again; \
00161 } \
00162 memcpy(phid->outputPacket, buf, phid->phid.outputReportByteLength); \
00163 phid->outputPacketLen = phid->phid.outputReportByteLength; \
00164 CThread_reset_event(&phid->phid.writtenEvent); \
00165 CThread_mutex_unlock(&phid->phid.outputLock); \
00166 CThread_set_event(&phid->phid.writeAvailableEvent); \
00167 return 0; \
00168 }
00169
00170 #define CMAKEPACKET(pname) \
00171 static int CPhidget##pname##_makePacket(CPhidget##pname##Handle phid, \
00172 unsigned char *buffer) \
00173 {
00174
00175 #define SENDPACKET(pname, propname) \
00176 do{ \
00177 unsigned char *buffer; \
00178 int ret = 0; \
00179 if(!(buffer = malloc(phid->phid.outputReportByteLength))) return EPHIDGET_NOMEMORY; \
00180 ZEROMEM(buffer, phid->phid.outputReportByteLength); \
00181 CThread_mutex_lock(&phid->phid.writelock); \
00182 phid->propname = newVal; \
00183 if((ret = CPhidget##pname##_makePacket(phid, buffer))) goto done; \
00184 if((ret = CPhidget##pname##_sendpacket(phid, buffer))) goto done; \
00185 done: \
00186 CThread_mutex_unlock(&phid->phid.writelock); \
00187 free(buffer); \
00188 if(ret) return ret; \
00189 }while(0)
00190
00191 #define CMAKEPACKETINDEXED(pname) \
00192 static int CPhidget##pname##_makePacket(CPhidget##pname##Handle phid, \
00193 unsigned char *buffer, int Index) \
00194 {
00195
00196 #define SENDPACKETINDEXED(pname, propname, index) \
00197 do{ \
00198 unsigned char *buffer; \
00199 int ret = 0; \
00200 if(!(buffer = malloc(phid->phid.outputReportByteLength))) return EPHIDGET_NOMEMORY; \
00201 ZEROMEM(buffer, phid->phid.outputReportByteLength); \
00202 CThread_mutex_lock(&phid->phid.writelock); \
00203 phid->propname = newVal; \
00204 if((ret = CPhidget##pname##_makePacket(phid, buffer, index))) goto done; \
00205 if((ret = CPhidget##pname##_sendpacket(phid, buffer))) goto done; \
00206 done: \
00207 CThread_mutex_unlock(&phid->phid.writelock); \
00208 free(buffer); \
00209 if(ret) return ret; \
00210 }while(0)
00211
00212
00213 #define CGETPACKET(pname) \
00214 static int CPhidget##pname##_getPacket(CPhidgetHandle phidG, \
00215 unsigned char *buf, unsigned int *lenp) \
00216 {
00217
00218 #define CGETPACKET_BUF(pname) \
00219 static int CPhidget##pname##_getPacket(CPhidgetHandle phidG, \
00220 unsigned char *buf, unsigned int *lenp) \
00221 { \
00222 CPhidget##pname##Handle phid = (CPhidget##pname##Handle)phidG; \
00223 TESTPTRS(phid, buf) \
00224 TESTPTR(lenp) \
00225 CThread_mutex_lock(&phid->phid.outputLock); \
00226 if (*lenp < phid->outputPacketLen) { \
00227 CThread_mutex_unlock(&phid->phid.outputLock); \
00228 return EPHIDGET_INVALIDARG; \
00229 } \
00230 memcpy(buf, phid->outputPacket, *lenp = phid->outputPacketLen); \
00231 phid->outputPacketLen = 0; \
00232 CThread_mutex_unlock(&phid->phid.outputLock); \
00233 return EPHIDGET_OK; \
00234 }
00235
00236 #define CCREATE_INT(pname,pdef) \
00237 CPhidget##pname##Handle phid; \
00238 TESTPTR(phidp) \
00239 if (!(phid = (CPhidget##pname##Handle)malloc(sizeof (*phid)))) \
00240 return EPHIDGET_NOMEMORY; \
00241 ZEROMEM(phid, sizeof(*phid)); \
00242 phid->phid.deviceID = pdef; \
00243 phid->phid.fptrInit = CPhidget##pname##_initAfterOpen; \
00244 phid->phid.fptrClear = CPhidget##pname##_clearVars; \
00245 phid->phid.fptrEvents = CPhidget##pname##_eventsAfterOpen; \
00246 phid->phid.fptrData = CPhidget##pname##_dataInput; \
00247 phid->phid.fptrGetPacket = CPhidget##pname##_getPacket; \
00248 CThread_mutex_init(&phid->phid.lock); \
00249 CThread_mutex_init(&phid->phid.openCloseLock); \
00250 CThread_mutex_init(&phid->phid.writelock); \
00251 CThread_mutex_init(&phid->phid.outputLock); \
00252 CPhidget_clearStatusFlag(&phid->phid.status, PHIDGET_ATTACHED_FLAG, &(&phid->phid)->lock); \
00253 CThread_create_event(&phid->phid.writeAvailableEvent); \
00254 CThread_create_event(&phid->phid.writtenEvent); \
00255 *phidp = phid;
00256
00257 #define CCREATE(pname,pdef) int CCONV CPhidget##pname##_create(CPhidget##pname##Handle *phidp) \
00258 { \
00259 CCREATE_INT(pname,pdef) \
00260 return EPHIDGET_OK; \
00261 }
00262
00263 #define CCREATE_EXTRA(pname,pdef) int CCONV CPhidget##pname##_create(CPhidget##pname##Handle *phidp) \
00264 { \
00265 CCREATE_INT(pname,pdef)
00266
00267 #define ADDNETWORKKEYINDEXED(kname, valType, propname) \
00268 do{ \
00269 char key[1024], val[1024]; \
00270 CThread_mutex_lock(&phid->phid.lock); \
00271 phid->propname[Index] = newVal; \
00272 if(!CPhidget_statusFlagIsSet(phid->phid.status, PHIDGET_SERVER_CONNECTED_FLAG)) { \
00273 CThread_mutex_unlock(&phid->phid.lock); \
00274 return EPHIDGET_NETWORK_NOTCONNECTED; } \
00275 snprintf(key, (unsigned int)sizeof(key), "/PCK/%s/%d/" #kname "/%d", phid->phid.deviceType, phid->phid.serialNumber, Index); \
00276 snprintf(val, (int)sizeof(val), valType, newVal); \
00277 pdc_async_set(phid->phid.networkInfo->server->pdcs, key, val, (int)strlen(val), PFALSE, internal_async_network_error_handler, &phid->phid); \
00278 CThread_mutex_unlock(&phid->phid.lock); \
00279 }while(0)
00280
00281 #define ADDNETWORKKEY(kname, valType, propname) \
00282 do{ \
00283 char key[1024], val[1024]; \
00284 CThread_mutex_lock(&phid->phid.lock); \
00285 phid->propname = newVal; \
00286 if(!CPhidget_statusFlagIsSet(phid->phid.status, PHIDGET_SERVER_CONNECTED_FLAG)) { \
00287 CThread_mutex_unlock(&phid->phid.lock); \
00288 return EPHIDGET_NETWORK_NOTCONNECTED; } \
00289 snprintf(key, sizeof(key), "/PCK/%s/%d/" #kname , phid->phid.deviceType, phid->phid.serialNumber); \
00290 snprintf(val, sizeof(val), valType, newVal); \
00291 pdc_async_set(phid->phid.networkInfo->server->pdcs, key, val, (int)strlen(val), PFALSE, internal_async_network_error_handler, &phid->phid); \
00292 CThread_mutex_unlock(&phid->phid.lock); \
00293 }while(0)
00294
00295
00296 #define PWC_SETKEYS(pname) \
00297 int phidget##pname##_set(CPhidgetHandle arg, const char *setThing, int index, const char *state, pdict_reason_t reason) \
00298 { \
00299 int ret = EPHIDGET_OK; \
00300 CPhidget##pname##Handle phid = (CPhidget##pname##Handle)arg;
00301
00302 #define GET_DOUBLE_VAL double value = strtod(state, NULL)
00303 #define GET_INT_VAL int value = strtol(state, NULL, 10)
00304 #define GET_INT64_VAL __int64 value = strtoll(state, NULL, 10)
00305
00306 #define INC_KEYCOUNT(var, unktype) if(phid->var == unktype) phid->phid.keyCount++;
00307 #define KEYNAME(name) !strncmp(setThing, name, sizeof(name))
00308 #define CHKINDEX(atr, def) (index < phid->phid.attr.atr?phid->phid.attr.atr:def)
00309
00310 #define PWC_BAD_SETTYPE(pname) \
00311 do { \
00312 ret = EPHIDGET_INVALIDARG; \
00313 LOG(PHIDGET_LOG_DEBUG,"Bad setType for " #pname ": %s", setThing); \
00314 }while(0)
00315
00316 #endif