cphidgetmacros.h
Go to the documentation of this file.
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 //Versions for Deprecation
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 /* used in csocketevents.c */
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


pedal_monitor
Author(s): Pedro Mendes
autogenerated on Fri Jun 6 2014 18:37:20