]> rtime.felk.cvut.cz Git - mf6xx.git/blobdiff - src/HuLinux-2.4.3/generic.c
Merge branch 'hudaqlib_mf614_uio'
[mf6xx.git] / src / HuLinux-2.4.3 / generic.c
diff --git a/src/HuLinux-2.4.3/generic.c b/src/HuLinux-2.4.3/generic.c
new file mode 100644 (file)
index 0000000..6748966
--- /dev/null
@@ -0,0 +1,400 @@
+/****************************************************************/\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