--- /dev/null
+/****************************************************************/\r
+/**@file generic.c:\r
+ * Description: Empty implementation of API layer. *\r
+ * Dependency: --- *\r
+ * Copyright 2006-2007 Humusoft s.r.o. *\r
+ ****************************************************************/\r
+#if defined(_WIN32) || defined(_WIN64)\r
+#include <windows.h>\r
+#endif\r
+#include <malloc.h>\r
+#include <math.h>\r
+\r
+#include "hudaqlib.h"\r
+#include "hudaq_internal.h"\r
+\r
+\r
+\r
+/////////////EMPTY/DUMMY IMPLEMENTATION STUBS///////////////////\r
+\r
+/** Prototype for any Get Parameter function */\r
+\r
+int DummyInit(DeviceRecord *DevRecord, int IniOptions)\r
+{\r
+ return -1;\r
+}\r
+\r
+\r
+void DummyDone(DeviceRecord *DevRecord)\r
+{\r
+ return;\r
+}\r
+\r
+\r
+//////////////////GENERIC PROCEDURES//////////////////////////////\r
+\r
+\r
+/** Device independent implementation for all devices. */\r
+int GenericDIReadBit(const DeviceRecord *DevRecord, unsigned channel, unsigned bit)\r
+{\r
+ if((DevRecord->pCT->HudaqDIRead(DevRecord,channel) & (1<<bit)) == 0)\r
+ return 0;\r
+ return 1;\r
+}\r
+\r
+\r
+/** Get data from multiple digital input channels from devices that supports only one channel. */\r
+HUDAQSTATUS GenericOneDIReadMultiple(const DeviceRecord *DevRecord, unsigned number, const unsigned* channels, unsigned* values)\r
+{\r
+ unsigned InWord;\r
+ char Flag = 0;\r
+\r
+ if (number==0 || channels==NULL || values==NULL) return HUDAQBADARG;\r
+ if(DevRecord->pCT->HudaqDIRead==NULL) return HUDAQFAILURE;\r
+\r
+ InWord = DevRecord->pCT->HudaqDIRead(DevRecord,0);\r
+ while(number-->0)\r
+ {\r
+ if (*channels==0)\r
+ {\r
+ *values=InWord;\r
+ Flag |= 1;\r
+ }\r
+ else\r
+ {\r
+ *values=0;\r
+ Flag |= 2;\r
+ }\r
+ values++;\r
+ channels++;\r
+ }\r
+\r
+ if(Flag==3) return HUDAQPARTIAL; //several values are valid and several are not\r
+ if(Flag==2) return HUDAQFAILURE; //no valid value returned\r
+ return HUDAQSUCCESS; //all values are valid (or no channel asked)\r
+}\r
+\r
+\r
+/** Device independent implementation for all devices.\r
+ If at least one call succeeds, HUDAQPARTIAL is returned. */\r
+HUDAQSTATUS GenericDOWriteMultiple(const DeviceRecord *DevRecord, unsigned number, const unsigned* channels, const unsigned* values)\r
+{\r
+\r
+ HUDAQSTATUS r2, ret=HUDAQSUCCESS;\r
+ int success=0;\r
+\r
+ if(DevRecord==NULL) return HUDAQBADARG;\r
+ if(DevRecord->pCT->HudaqDOWrite==NULL) return HUDAQFAILURE;\r
+\r
+ if(number==0 || channels==NULL || values==NULL) return HUDAQBADARG;\r
+\r
+ while(number-->0)\r
+ {\r
+ r2 = DevRecord->pCT->HudaqDOWrite(DevRecord,*channels,*values);\r
+ if (r2==HUDAQSUCCESS)\r
+ success++;\r
+ else\r
+ ret=r2; // store last failure in ret\r
+\r
+ channels++; values++;\r
+ }\r
+\r
+ if (ret==HUDAQSUCCESS || success==0) return ret;\r
+ return HUDAQPARTIAL;\r
+}\r
+\r
+\r
+/** Multiple AI reads for devices that do not support this feature. */\r
+HUDAQSTATUS GenericAIReadMultiple(const DeviceRecord *DevRecord, unsigned number, const unsigned *channels, double *values)\r
+{\r
+ unsigned MaxChannels;\r
+ char Flag = 0;\r
+\r
+ if (channels==NULL || values==NULL || number==0) return HUDAQBADARG;\r
+ if (DevRecord->pCT->HudaqAIRead==NULL) return HUDAQFAILURE; //Wrong internal table, should not occur.\r
+\r
+ MaxChannels = (unsigned)DevRecord->pCT->HudaqGetParameter(DevRecord,0,HudaqAINUMCHANNELS);\r
+ while(number-->0)\r
+ {\r
+ if(MaxChannels>*channels)\r
+ {\r
+ Flag |= 1;\r
+ *values = DevRecord->pCT->HudaqAIRead(DevRecord,*channels);\r
+ }\r
+ else\r
+ {\r
+ *values = UNDEFINED_VALUE;\r
+ Flag |= 2;\r
+ }\r
+ values++;\r
+ channels++;\r
+ }\r
+\r
+ if(Flag==3) return HUDAQPARTIAL; //several values are valid and several are not\r
+ if(Flag==2) return HUDAQFAILURE; //no valid value returned\r
+ return HUDAQSUCCESS; //all values are valid (or no channel asked)\r
+}\r
+\r
+\r
+/** Encoder reset generic caller. */\r
+void HUDAQAPI HudaqEncReset(HUDAQHANDLE handle, unsigned channel)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return;\r
+ if(DevRecord->pCT->HudaqEncReset==NULL) return;\r
+ DevRecord->pCT->HudaqEncReset(DevRecord,channel);\r
+}\r
+\r
+\r
+/** Counter reset generic caller. */\r
+void HUDAQAPI HudaqCtrReset(HUDAQHANDLE handle, unsigned channel)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return;\r
+ if(DevRecord->pCT->HudaqCtrReset==NULL) return;\r
+ DevRecord->pCT->HudaqCtrReset(DevRecord,channel);\r
+}\r
+\r
+\r
+//////////////////////////////////////////////////////////////////////////\r
+/** Generic function callers for all supported devices. */\r
+\r
+double HUDAQAPI HudaqGetParameter(HUDAQHANDLE handle, unsigned channel, HudaqParameter param)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return 0;\r
+ if(DevRecord->pCT->HudaqGetParameter==NULL) return 0;\r
+ return DevRecord->pCT->HudaqGetParameter(DevRecord,channel,param);\r
+}\r
+\r
+HUDAQSTATUS HUDAQAPI HudaqSetParameter(HUDAQHANDLE handle, unsigned channel, HudaqParameter param, double value)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return HUDAQBADARG;\r
+ if(DevRecord->pCT->HudaqSetParameter==NULL) return HUDAQFAILURE;\r
+ return DevRecord->pCT->HudaqSetParameter(DevRecord,channel,param,value);\r
+}\r
+\r
+const HudaqRange* HUDAQAPI HudaqQueryRange(HUDAQHANDLE handle, HudaqSubsystem S, unsigned item)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return NULL;\r
+ if(DevRecord->pCT->HudaqQueryRange==NULL) return NULL;\r
+ return DevRecord->pCT->HudaqQueryRange(DevRecord,S,item);\r
+}\r
+\r
+//////////////////////////////////////////////\r
+\r
+int HUDAQAPI HudaqDIRead(HUDAQHANDLE handle, unsigned channel)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return HUDAQBADARG;\r
+ if(DevRecord->pCT->HudaqDIRead==NULL) return 0;\r
+ return DevRecord->pCT->HudaqDIRead(DevRecord,channel);\r
+}\r
+\r
+int HUDAQAPI HudaqDIReadBit(HUDAQHANDLE handle, unsigned channel, unsigned bit)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return 0;\r
+ if(DevRecord->pCT->HudaqDIReadBit==NULL) return 0;\r
+ return DevRecord->pCT->HudaqDIReadBit(DevRecord,channel,bit);\r
+}\r
+\r
+HUDAQSTATUS HUDAQAPI HudaqDIReadMultiple(HUDAQHANDLE handle, unsigned number, const unsigned* channels, unsigned* values)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return HUDAQBADARG;\r
+ if(DevRecord->pCT->HudaqDIReadMultiple==NULL) return HUDAQNOTSUPPORTED;\r
+ return DevRecord->pCT->HudaqDIReadMultiple(DevRecord,number,channels,values);\r
+}\r
+\r
+\r
+HUDAQSTATUS HUDAQAPI HudaqDOWriteMultiple(HUDAQHANDLE handle, unsigned number, const unsigned* channels, const unsigned* values)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return HUDAQBADARG;\r
+ if(DevRecord->pCT->HudaqDOWrite==NULL) return HUDAQNOTSUPPORTED;\r
+ return DevRecord->pCT->HudaqDOWriteMultiple(DevRecord,number,channels,values);\r
+}\r
+\r
+HUDAQSTATUS HUDAQAPI HudaqDOWrite(HUDAQHANDLE handle, unsigned channel, unsigned value)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return HUDAQBADARG;\r
+ if(DevRecord->pCT->HudaqDOWrite==NULL) return HUDAQFAILURE;\r
+ return DevRecord->pCT->HudaqDOWrite(DevRecord,channel,value);\r
+}\r
+\r
+void HUDAQAPI HudaqDOWriteBit(HUDAQHANDLE handle, unsigned channel, unsigned bit, int value)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return;\r
+ if(DevRecord->pCT->HudaqDOWriteBit==NULL) return;\r
+ DevRecord->pCT->HudaqDOWriteBit(DevRecord,channel,bit,value);\r
+}\r
+\r
+void HUDAQAPI HudaqDOWriteMultipleBits(HUDAQHANDLE handle, unsigned channel, unsigned mask, unsigned value)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return;\r
+ if(DevRecord->pCT->HudaqDOWriteMultipleBits==NULL) return; // HUDAQNOTSUPPORTED;\r
+ DevRecord->pCT->HudaqDOWriteMultipleBits(DevRecord,channel,mask,value);\r
+}\r
+\r
+\r
+double HUDAQAPI HudaqAIRead(HUDAQHANDLE handle, unsigned channel)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return UNDEFINED_VALUE;\r
+ if(DevRecord->pCT->HudaqAIRead==NULL) return UNDEFINED_VALUE;\r
+ return DevRecord->pCT->HudaqAIRead(DevRecord,channel);\r
+}\r
+\r
+HUDAQSTATUS HUDAQAPI HudaqAIReadMultiple(HUDAQHANDLE handle, unsigned number, const unsigned *channels, double *values)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return HUDAQBADARG;\r
+ if(DevRecord->pCT->HudaqAIReadMultiple==NULL) return HUDAQNOTSUPPORTED;\r
+ return DevRecord->pCT->HudaqAIReadMultiple(DevRecord,number,channels,values);\r
+}\r
+\r
+\r
+void HUDAQAPI HudaqAOWrite(HUDAQHANDLE handle, unsigned channel, double value)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return;\r
+ if(DevRecord->pCT->HudaqAOWrite==NULL) return;\r
+ DevRecord->pCT->HudaqAOWrite(DevRecord,channel,value);\r
+}\r
+\r
+HUDAQSTATUS HUDAQAPI HudaqAOWriteMultiple(HUDAQHANDLE handle, unsigned number, const unsigned* channels, const double* values)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return HUDAQBADARG;\r
+ if(DevRecord->pCT->HudaqAOWriteMultiple==NULL) return HUDAQNOTSUPPORTED;\r
+ return DevRecord->pCT->HudaqAOWriteMultiple(DevRecord,number,channels,values);\r
+}\r
+\r
+\r
+int HUDAQAPI HudaqEncRead(HUDAQHANDLE handle, unsigned channel)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return 0;\r
+ if(DevRecord->pCT->HudaqEncRead==NULL) return 0;\r
+ return DevRecord->pCT->HudaqEncRead(DevRecord,channel);\r
+}\r
+\r
+\r
+int HUDAQAPI HudaqCtrRead(HUDAQHANDLE handle, unsigned channel)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return 0;\r
+ if(DevRecord->pCT->HudaqCtrRead==NULL) return 0;\r
+ return DevRecord->pCT->HudaqCtrRead(DevRecord,channel);\r
+}\r
+\r
+\r
+HUDAQSTATUS HUDAQAPI HudaqPWMWrite(HUDAQHANDLE handle, unsigned channel, double frequency, double dutycycle)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return HUDAQBADARG;\r
+ if(DevRecord->pCT->HudaqPWMWrite==NULL) return HUDAQNOTSUPPORTED;\r
+ return DevRecord->pCT->HudaqPWMWrite(DevRecord,channel,frequency,dutycycle);\r
+}\r
+\r
+\r
+HUDAQSTATUS HUDAQAPI HudaqPWM3Write(HUDAQHANDLE handle, unsigned channel, double frequency, double duty1, double duty2, double duty3)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return HUDAQBADARG;\r
+ if(DevRecord->pCT->HudaqPWM3Write==NULL) return HUDAQNOTSUPPORTED;\r
+ return DevRecord->pCT->HudaqPWM3Write(DevRecord,channel,frequency,duty1,duty2,duty3);\r
+}\r
+\r
+\r
+HUDAQSTATUS HudaqPWMWriteMultiphase(HUDAQHANDLE handle, unsigned channel, unsigned phasenum, const unsigned *phases, double frequency, const double *duties)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return HUDAQBADARG;\r
+ if(DevRecord->pCT->HudaqPWMWriteMultiphase==NULL) return HUDAQNOTSUPPORTED;\r
+ return DevRecord->pCT->HudaqPWMWriteMultiphase(DevRecord,channel,phasenum,phases,frequency,duties);\r
+}\r
+\r
+\r
+HUDAQSTATUS HUDAQAPI HudaqStepWrite(HUDAQHANDLE handle, unsigned channel, int position)\r
+{\r
+ const DeviceRecord *DevRecord = HudaqGetDeviceRecord(handle);\r
+ if(DevRecord==NULL) return HUDAQBADARG;\r
+ if(DevRecord->pCT->HudaqStepWrite==NULL) return HUDAQNOTSUPPORTED;\r
+ return DevRecord->pCT->HudaqStepWrite(DevRecord,channel,position);\r
+}\r
+\r
+\r
+static double GenericGetParameter(const DeviceRecord *DevRecord, unsigned channel, HudaqParameter param)\r
+{\r
+ switch(param & HudaqSubsystemMASK)\r
+ {\r
+ //case HudaqDI:\r
+ //case HudaqDO:\r
+ //case HudaqAI: \r
+ //case HudaqAO: \r
+ //case HudaqEnc:\r
+ //case HudaqPWM:\r
+ //case HudaqCtr:\r
+ //case HudaqStep:\r
+ case HudaqIRQ:\r
+ switch((int)param)\r
+ {\r
+ case HudaqIRQ+0: \r
+ return ((UserDataHeader *)DevRecord->DrvRes.DriverData)->IRQcounter;\r
+ }\r
+ break;\r
+ }\r
+ return WRONG_VALUE;\r
+}\r
+\r
+\r
+\r
+/** Empty call table. */\r
+const CallTable CtDummy =\r
+{\r
+ "", 0, 0,\r
+ DummyInit,\r
+ DummyDone,\r
+\r
+ NULL, // Not available\r
+ GenericGetParameter,\r
+ NULL, // Not available\r
+\r
+ // INITIALIZE DI callers\r
+ NULL,\r
+ NULL,\r
+ NULL,\r
+ // INITIALIZE DO callers\r
+ NULL,\r
+ NULL,\r
+ NULL,\r
+ NULL,\r
+ // INITIALIZE AI callers\r
+ NULL,\r
+ NULL,\r
+ // INITIALIZE AO callers\r
+ NULL,\r
+ NULL,\r
+ // INITIALIZE Enc callers\r
+ NULL, // Not available\r
+ NULL,\r
+ // INITIALIZE Ctr callers\r
+ NULL, // Not available\r
+ NULL,\r
+ // INITIALIZE PWM callers\r
+ NULL, // Not available\r
+ NULL,\r
+ NULL,\r
+ // INITIALIZE Step callers\r
+ NULL, // Not available\r
+};\r
+\r
+\r
+\r