From a37de7d8f865bbfe40df9755c7c4795c9d53ee1e Mon Sep 17 00:00:00 2001 From: "Hood, Jonathan D" Date: Tue, 26 Jan 2021 17:39:37 -0500 Subject: [PATCH] added awg dependencies --- AWGDependencies/AWG.ini | 31 + .../Spectrum/c_header/SpcStdNT.lib | Bin 0 -> 3646 bytes AWGDependencies/Spectrum/c_header/dlltyp.h | 387 ++ AWGDependencies/Spectrum/c_header/errors.h | 12 + AWGDependencies/Spectrum/c_header/readme.txt | 71 + AWGDependencies/Spectrum/c_header/regs.h | 3450 +++++++++++++++++ AWGDependencies/Spectrum/c_header/spcerr.h | 100 + .../Spectrum/c_header/spcioctl.inc | 93 + .../Spectrum/c_header/spclib_bcc.lib | Bin 0 -> 1536 bytes AWGDependencies/Spectrum/c_header/spcm_drv.h | 276 ++ .../Spectrum/c_header/spcm_win32_bcppb.lib | Bin 0 -> 2560 bytes .../Spectrum/c_header/spcm_win32_cvi.lib | Bin 0 -> 11472 bytes .../Spectrum/c_header/spcm_win32_msvcpp.lib | Bin 0 -> 6622 bytes .../Spectrum/c_header/spcm_win64_msvcpp.lib | Bin 0 -> 6232 bytes AWGDependencies/Spectrum/c_header/spectrum.h | 11 + .../Spectrum/c_header/spectrum.lib | Bin 0 -> 3528 bytes .../Spectrum/c_header/spectrum_comp.lib | Bin 0 -> 3242 bytes .../Spectrum/common/ostools/spcm_md5.cpp | 265 ++ .../Spectrum/common/ostools/spcm_md5.h | 32 + .../common/ostools/spcm_network_winLin.cpp | 777 ++++ .../common/ostools/spcm_network_winLin.h | 108 + .../Spectrum/common/ostools/spcm_ostools.h | 172 + .../common/ostools/spcm_ostools_linux.cpp | 363 ++ .../common/ostools/spcm_ostools_qnx.cpp | 375 ++ .../common/ostools/spcm_ostools_win.cpp | 259 ++ .../Spectrum/common/ostools/spcm_oswrap.h | 71 + .../Spectrum/common/spcm_lib_card.cpp | 1787 +++++++++ .../Spectrum/common/spcm_lib_card.h | 589 +++ .../Spectrum/common/spcm_lib_data.cpp | 674 ++++ .../Spectrum/common/spcm_lib_data.h | 321 ++ .../Spectrum/common/spcm_lib_thread.cpp | 723 ++++ .../Spectrum/common/spcm_lib_thread.h | 231 ++ .../Spectrum/common/spcm_netbox_sendmail.cpp | 365 ++ .../Spectrum/common/spcm_netbox_sendmail.h | 15 + .../Spectrum/sb5_file/sb5_file.cpp | 455 +++ AWGDependencies/Spectrum/sb5_file/sb5_file.h | 162 + AWGDependencies/pthreadVC3d.dll | Bin 0 -> 101888 bytes AWGDependencies/pthreadVCE3d.dll | Bin 0 -> 106496 bytes AWGDependencies/pthreadVSE3d.dll | Bin 0 -> 103424 bytes .../vcpkg-export-pthreads/.vcpkg-root | 0 .../info/pthreads_3.0.0-6_x64-windows.list | 32 + .../installed/x64-windows/bin/pthreadVC3.dll | Bin 0 -> 103424 bytes .../installed/x64-windows/bin/pthreadVCE3.dll | Bin 0 -> 107520 bytes .../installed/x64-windows/bin/pthreadVSE3.dll | Bin 0 -> 104960 bytes .../x64-windows/debug/bin/pthreadVC3d.dll | Bin 0 -> 101888 bytes .../x64-windows/debug/bin/pthreadVCE3d.dll | Bin 0 -> 106496 bytes .../x64-windows/debug/bin/pthreadVSE3d.dll | Bin 0 -> 103424 bytes .../x64-windows/debug/lib/pthreadVC3d.lib | Bin 0 -> 34898 bytes .../x64-windows/debug/lib/pthreadVCE3d.lib | Bin 0 -> 35132 bytes .../x64-windows/debug/lib/pthreadVSE3d.lib | Bin 0 -> 35132 bytes .../installed/x64-windows/include/_ptw32.h | 215 + .../installed/x64-windows/include/pthread.h | 1228 ++++++ .../installed/x64-windows/include/sched.h | 235 ++ .../installed/x64-windows/include/semaphore.h | 116 + .../installed/x64-windows/lib/pthreadVC3.lib | Bin 0 -> 34750 bytes .../installed/x64-windows/lib/pthreadVCE3.lib | Bin 0 -> 34898 bytes .../installed/x64-windows/lib/pthreadVSE3.lib | Bin 0 -> 34898 bytes .../share/pthread/vcpkg-cmake-wrapper.cmake | 224 ++ .../x64-windows/share/pthreads/copyright | 202 + .../share/pthreads/vcpkg-cmake-wrapper.cmake | 224 ++ .../share/pthreads/vcpkg_abi_info.txt | 12 + .../vcpkg-cmake-wrapper.cmake | 224 ++ .../scripts/buildsystems/msbuild/applocal.ps1 | 152 + .../buildsystems/msbuild/vcpkg-general.xml | 77 + .../scripts/buildsystems/msbuild/vcpkg.props | 34 + .../buildsystems/msbuild/vcpkg.targets | 119 + .../scripts/buildsystems/vcpkg.cmake | 673 ++++ .../scripts/cmake/vcpkg_get_windows_sdk.cmake | 16 + 68 files changed, 15958 insertions(+) create mode 100644 AWGDependencies/AWG.ini create mode 100644 AWGDependencies/Spectrum/c_header/SpcStdNT.lib create mode 100644 AWGDependencies/Spectrum/c_header/dlltyp.h create mode 100644 AWGDependencies/Spectrum/c_header/errors.h create mode 100644 AWGDependencies/Spectrum/c_header/readme.txt create mode 100644 AWGDependencies/Spectrum/c_header/regs.h create mode 100644 AWGDependencies/Spectrum/c_header/spcerr.h create mode 100644 AWGDependencies/Spectrum/c_header/spcioctl.inc create mode 100644 AWGDependencies/Spectrum/c_header/spclib_bcc.lib create mode 100644 AWGDependencies/Spectrum/c_header/spcm_drv.h create mode 100644 AWGDependencies/Spectrum/c_header/spcm_win32_bcppb.lib create mode 100644 AWGDependencies/Spectrum/c_header/spcm_win32_cvi.lib create mode 100644 AWGDependencies/Spectrum/c_header/spcm_win32_msvcpp.lib create mode 100644 AWGDependencies/Spectrum/c_header/spcm_win64_msvcpp.lib create mode 100644 AWGDependencies/Spectrum/c_header/spectrum.h create mode 100644 AWGDependencies/Spectrum/c_header/spectrum.lib create mode 100644 AWGDependencies/Spectrum/c_header/spectrum_comp.lib create mode 100644 AWGDependencies/Spectrum/common/ostools/spcm_md5.cpp create mode 100644 AWGDependencies/Spectrum/common/ostools/spcm_md5.h create mode 100644 AWGDependencies/Spectrum/common/ostools/spcm_network_winLin.cpp create mode 100644 AWGDependencies/Spectrum/common/ostools/spcm_network_winLin.h create mode 100644 AWGDependencies/Spectrum/common/ostools/spcm_ostools.h create mode 100644 AWGDependencies/Spectrum/common/ostools/spcm_ostools_linux.cpp create mode 100644 AWGDependencies/Spectrum/common/ostools/spcm_ostools_qnx.cpp create mode 100644 AWGDependencies/Spectrum/common/ostools/spcm_ostools_win.cpp create mode 100644 AWGDependencies/Spectrum/common/ostools/spcm_oswrap.h create mode 100644 AWGDependencies/Spectrum/common/spcm_lib_card.cpp create mode 100644 AWGDependencies/Spectrum/common/spcm_lib_card.h create mode 100644 AWGDependencies/Spectrum/common/spcm_lib_data.cpp create mode 100644 AWGDependencies/Spectrum/common/spcm_lib_data.h create mode 100644 AWGDependencies/Spectrum/common/spcm_lib_thread.cpp create mode 100644 AWGDependencies/Spectrum/common/spcm_lib_thread.h create mode 100644 AWGDependencies/Spectrum/common/spcm_netbox_sendmail.cpp create mode 100644 AWGDependencies/Spectrum/common/spcm_netbox_sendmail.h create mode 100644 AWGDependencies/Spectrum/sb5_file/sb5_file.cpp create mode 100644 AWGDependencies/Spectrum/sb5_file/sb5_file.h create mode 100644 AWGDependencies/pthreadVC3d.dll create mode 100644 AWGDependencies/pthreadVCE3d.dll create mode 100644 AWGDependencies/pthreadVSE3d.dll create mode 100644 AWGDependencies/vcpkg-export-pthreads/.vcpkg-root create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/vcpkg/info/pthreads_3.0.0-6_x64-windows.list create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/bin/pthreadVC3.dll create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/bin/pthreadVCE3.dll create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/bin/pthreadVSE3.dll create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/debug/bin/pthreadVC3d.dll create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/debug/bin/pthreadVCE3d.dll create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/debug/bin/pthreadVSE3d.dll create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/debug/lib/pthreadVC3d.lib create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/debug/lib/pthreadVCE3d.lib create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/debug/lib/pthreadVSE3d.lib create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/include/_ptw32.h create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/include/pthread.h create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/include/sched.h create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/include/semaphore.h create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/lib/pthreadVC3.lib create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/lib/pthreadVCE3.lib create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/lib/pthreadVSE3.lib create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/share/pthread/vcpkg-cmake-wrapper.cmake create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/share/pthreads/copyright create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/share/pthreads/vcpkg-cmake-wrapper.cmake create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/share/pthreads/vcpkg_abi_info.txt create mode 100644 AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/share/pthreads_windows/vcpkg-cmake-wrapper.cmake create mode 100644 AWGDependencies/vcpkg-export-pthreads/scripts/buildsystems/msbuild/applocal.ps1 create mode 100644 AWGDependencies/vcpkg-export-pthreads/scripts/buildsystems/msbuild/vcpkg-general.xml create mode 100644 AWGDependencies/vcpkg-export-pthreads/scripts/buildsystems/msbuild/vcpkg.props create mode 100644 AWGDependencies/vcpkg-export-pthreads/scripts/buildsystems/msbuild/vcpkg.targets create mode 100644 AWGDependencies/vcpkg-export-pthreads/scripts/buildsystems/vcpkg.cmake create mode 100644 AWGDependencies/vcpkg-export-pthreads/scripts/cmake/vcpkg_get_windows_sdk.cmake diff --git a/AWGDependencies/AWG.ini b/AWGDependencies/AWG.ini new file mode 100644 index 0000000..cfef22a --- /dev/null +++ b/AWGDependencies/AWG.ini @@ -0,0 +1,31 @@ +[server] +# listen to all interfaces or just specified host +interface=all +# listen to this interface if interface is specified as host +host=localhost +port=999 +# the higher the log number is the more is output to the server log +log=4 +# timeout allows for blocking read in comm thread to check for cancellation (seconds) +timeout=5 +[awg] +#null device is simulation, see manual to determine real device name +device=spcm0 +# channel number to output signal on +channel=0 +#to override default sample rate (in Mhz) +rate=1250 +# number of milliseconds allowed to switch frequency set (determines awg memory used and re-calculation time available) +# actual latency will be less because on-board memory boundary conditions are rounded down +latency=300 +# size in 4K blocks of buffers to be copied to transfer buffer (determines how quickly they can be computed) +fifo=1 +# number of fifo buffers contained in DMA transfer buffer +transfer=16 +# maximum amplitude of card in millivolts +amplitude=480 +[frequency] +# fraction of sample period that is tolerable so that adjusted signal periods are commensurate (smaller increases frequency table size) +tolerance=0.0001 +# number of calculation threads to create to add signal tables, more than actual # of cores does not help +threads=4 \ No newline at end of file diff --git a/AWGDependencies/Spectrum/c_header/SpcStdNT.lib b/AWGDependencies/Spectrum/c_header/SpcStdNT.lib new file mode 100644 index 0000000000000000000000000000000000000000..50f6693e5246032570317a8b12db430d42499262 GIT binary patch literal 3646 zcmcgu&u7iaKY@t$P4EXNyHw zV#```MT}0+T)zY@F{m)PjBV6^F@8*d0{=D&K0-wdf}*2XjQXC=z8{5CezJ<4}!&HD877^-PAW$ zi>u(D)Ad>_x1L^Wl$+J#RFcHh4v%!t9gEvw?c%hltZlcID>uuBshB3ob5M!vg(sJT zD#=RMTi)Wth9pstY*U0#v0?IVlw0ML7L|@jd^XY4Z7*$EWQI*N<-Fc)9@iT6bbYVk za0^LuZVip8cn4Dv0@YanxC{cmN#KMCv(!sdzy%@hibgFA?9lv%=%+L%5F&&iCK16H z0tjOq6Hwsup!y9oxEvt-W_aGi!JhULkwGN`q6=ii=KEvd_Fdq*~2CiY1i>o~o$nSIKYV6l2|z)1U3#d@qQ*%d3J z`0@UFdi7cXAq4mdC}CxsW_{W;?NMzbQ1)zoV}}@-mp{g64?X|;9~+C+-8b*v&KHEP zb($QI{c=lTdTp^*r9v@JRoQG*zVVs(zFNF&V+zr8i*MOt!!4TplK7aOf_hFa!wlsl zw}>3H19SK|V~f3gHKC_%&9V+Kvu zL&vBz4v*-(Z8d;)TWA!4d%0sQGPKvlnw7sagDqD x$wil6eH=aaOXTk~_QU45rBQm}IF!kYL88|Wo57AQ`{5+ZA1yW~T-v;_`5Pxg1(*N; literal 0 HcmV?d00001 diff --git a/AWGDependencies/Spectrum/c_header/dlltyp.h b/AWGDependencies/Spectrum/c_header/dlltyp.h new file mode 100644 index 0000000..4614e4a --- /dev/null +++ b/AWGDependencies/Spectrum/c_header/dlltyp.h @@ -0,0 +1,387 @@ +#ifndef DLLTYP_H +#define DLLTYP_H + + + +/* +************************************************************************** + +dlltyp.h (c) Spectrum GmbH, 2006 + +************************************************************************** + +definitions common for all Spectrum drivers and card types. This header +tries to examine the type of compiler and then defines common data types +that have the same length under all compilers and operating systems. + +This header should be the first header to include in all C/C++ projects + +************************************************************************** + +Please do not change this file as it's continuously updated with new +driver versions. If you need other settings for your special compiler +type please add these settings in an extra header file + +************************************************************************** +*/ + +// ----- some global definitions for the drivers ----- +#define MAXBRD 64 +#define SPCM_MAXDEMO 100 + + + +/* +************************************************************************** +this part now tries to examine the compiler type and sets one of the +defines that is used later for the type definition +************************************************************************** +*/ + +// ----- Borland C+ compiler. If the version is > 0x410 it's the C++ Builder and the same types can be used as for Visual C++ ----- +#ifdef __BORLANDC__ +# if (__BCPLUSPLUS__>0x410) +# define VC_WINNT +# elif defined(_Windows) +# define BC_WIN31 +# else +# define BC_DOS +# endif +#endif + +// ----- Microsoft Visual C++ compiler, either as std_call or as c_call ----- +#ifdef _WINSTDCALL +# ifdef _MSC_VER +# ifdef _WINNT +# define VC_STDCALLNT +# else +# define VC_STDCALL95 +# endif +# endif +#elif defined(_MSC_VER) +# ifdef _WIN32 +# ifdef _WINNT +# define VC_WINNT +# else +# define VC_WIN95 +# endif +# else +# define VC_WIN31 +# endif +#endif +#if defined (_WIN32) || defined (_WIN64) +# define _WIN // analog to _LINUX +#endif + +// ----- GCC in various environments +#if defined (__GNUC__) +# if defined (__MINGW32__) +# define _GCCWIN +# elif defined (__CYGWIN__) +# define _GCCWIN +# elif defined (__QNX__) +# define _QNX +# elif !defined(__vxworks) +# define _LINUX +# endif +#endif + +// VxWorks +#ifdef __vxworks +# define _VXWORKS +#endif + + +// ----- LabWindows/CVI +#ifdef _CVI_ +# define _LWCVI +#endif + +// ----- 64 Bit Linux (in addition to _LINUX) ----- +#if defined (__x86_64__) || defined (__amd64__) +# if defined (_LINUX) +# define _LINUX64 +# endif +#endif + + + +/* +************************************************************************** +now we hopefully know the compiler type and define all the types matching +this compiler and the platform +************************************************************************** +*/ + +// ----- Borland C++ for DOS (only used with older drivers) ----- +#ifdef BC_DOS +# define int16 int +# define uint16 unsigned int +# define int8 char +# define uint8 unsigned char +# define int32 long int +# define uint32 unsigned long int +# define dataptr void huge* +# define ptr8 char huge* +# define uptr8 unsigned char huge* +# define ptr16 int huge* +# define uptr16 unsigned int huge* +# define ptr32 long int huge* +# define uptr32 unsigned long int huge* +# define bool int8 +# define true 1 +# define false 0 +# define EXP extern "C" _export int16 +# define EXPC extern _export int16 +# define IMP extern "C" _import int16 +# define HEAD extern "C" int16 +#endif + +// ----- Borland C++ for Windows 3.1/3.11 (only used with older drivers) ----- +#ifdef BC_WIN31 +# define int16 int +# define uint16 unsigned int +# define int8 char +# define uint8 unsigned char +# define int32 long int +# define uint32 unsigned long int +# define dataptr void huge* +# define ptr8 char huge* +# define uptr8 unsigned char huge* +# define ptr16 int huge* +# define uptr16 unsigned int huge* +# define ptr32 long int huge* +# define uptr32 unsigned long int huge* +# ifdef _EasyWin +# define EXP extern "C" _export int16 +# define IMP extern "C" _import int16 +# define HEAD extern "C" int16 +# else +# define EXP extern "C" _export int16 FAR PASCAL +# define EXPC extern _export int16 FAR PASCAL +# define IMP extern "C" _import int16 FAR PASCAL +# define HEAD extern "C" int16 FAR PASCAL +# endif +#endif + +// ----- Visual C++ for Windows 3.1/3.11 (only used with older drivers) ----- +#ifdef VC_WIN31 +# define int8 char +# define uint8 unsigned char +# define int16 short int +# define uint16 unsigned short int +# define int32 long int +# define uint32 unsigned long int +# define dataptr void huge* +# define ptr8 char* +# define uptr8 unsigned char* +# define ptr16 short int* +# define uptr16 unsigned short int* +# define ptr32 long int* +# define uptr32 unsigned long int* +# define EXP extern "C" __declspec (dllexport) int16 +# define IMP extern "C" __declspec (dllimport) int16 +# define HEAD extern "C" __declspec (dllexport) int16 +#endif + +// ----- Visual C++ / Borland C++ Builder for Windows 32 bit starting with Windows 95 ----- +#if defined(VC_WIN95) || defined(VC_WINNT) +# ifndef NO_WTYPES_IN_DLLTYP +# include +# endif +# define int8 char +# define uint8 unsigned char +# define int16 short int +# define uint16 unsigned short int +# define int32 long int +# define uint32 unsigned long int +# define int64 __int64 +# define uint64 unsigned int64 +# define dataptr void* +# define ptr8 char* +# define uptr8 unsigned char* +# define ptr16 short int* +# define uptr16 unsigned short int* +# define ptr32 long int* +# define uptr32 unsigned long int* +# ifndef __cplusplus +# define bool int8 +# define true 1 +# define false 0 +# endif +# define drv_handle void* + +# ifdef __cplusplus +# define EXP extern "C" __declspec (dllexport) int16 +# define EXPC extern __declspec (dllexport) int16 +# define IMP extern "C" __declspec (dllimport) int16 +# define HEAD extern "C" __declspec (dllexport) int16 + +# define SPCM_EXPORT extern "C" __declspec (dllexport) +# define SPCM_IMPORT extern "C" __declspec (dllimport) +# else +# define EXP extern __declspec (dllexport) int16 +# define EXPC extern __declspec (dllexport) int16 +# define IMP extern __declspec (dllimport) int16 +# define HEAD extern __declspec (dllexport) int16 + +# define SPCM_EXPORT extern __declspec (dllexport) +# define SPCM_IMPORT extern __declspec (dllimport) +# endif +#endif + +// ----- Visual C++ using standard calls for all windows 32 bit platforms ----- +#if defined(VC_STDCALL95) || defined(VC_STDCALLNT) +# ifndef NO_WTYPES_IN_DLLTYP +# include +# endif +# define int8 char +# define uint8 unsigned char +# define int16 short int +# define uint16 unsigned short int +# define int32 long int +# define uint32 unsigned long int +# define int64 __int64 +# define uint64 unsigned __int64 +# define dataptr void* +# define ptr8 char* +# define uptr8 unsigned char* +# define ptr16 short int* +# define uptr16 unsigned short int* +# define ptr32 long int* +# define uptr32 unsigned long int* +# ifndef __cplusplus +# define bool int8 +# define true 1 +# define false 0 +# endif +# define drv_handle void* +# define EXP extern "C" __declspec (dllexport) int16 _stdcall +# define EXPC extern __declspec (dllexport) int16 _stdcall +# define IMP extern "C" __declspec (dllimport) int16 _stdcall +# define HEAD extern "C" __declspec (dllexport) int16 _stdcall + +# define SPCM_EXPORT extern "C" __declspec (dllexport) +# define SPCM_IMPORT extern "C" __declspec (dllimport) +#endif + +// ----- Linux ----- +#if defined (_LINUX) || defined (_QNX) +# define int8 char +# define int16 short int +# define int32 int +# define int64 long long +# define uint8 unsigned char +# define uint16 unsigned short int +# define uint32 unsigned int +# define uint64 unsigned long long +# define dataptr void * +# define ptr8 int8* +# define ptr16 int16* +# define ptr32 int32* +# define uptr8 uint8* +# define uptr16 uint16* +# define uptr32 uint32* +# if !defined(bool) && !defined(__cplusplus) +# define bool int8 +# define true 1 +# define false 0 +# endif +# define drv_handle void* +# define EXPC int16 +# define HEAD int16 +# define SPEC_IOC_MAGIC 's' +# define SPEC_IOC_MAXNR 6 +# define GETPARAM _IOR(SPEC_IOC_MAGIC,1,int32[2]) +# define SETPARAM _IOW(SPEC_IOC_MAGIC,2,int32[2]) +# define GETCH _IOR(SPEC_IOC_MAGIC,3,int32[1]) +# define SETCH _IOW(SPEC_IOC_MAGIC,4,int32[1]) + typedef struct {int32 lReg; void* pvAdr;} _SETGETADR ; +# define SETADR _IOW(SPEC_IOC_MAGIC,5,_SETGETADR) +# define GETADR _IOR(SPEC_IOC_MAGIC,6,_SETGETADR) + +# ifdef __cplusplus +# define SPCM_IMPORT extern "C" +# if __GNUC__ >= 4 +# define SPCM_EXPORT extern "C" __attribute__ ((visibility ("default"))) +# else +# define SPCM_EXPORT extern "C" +# endif +# else +# define SPCM_IMPORT +# define SPCM_EXPORT extern "C" +# endif +# define _stdcall +#endif + +// ----- LabWindows/CVI ----- +#if defined(_LWCVI) +# define int8 char +# define uint8 unsigned char +# define int16 short int +# define uint16 unsigned short int +# define int32 long int +# define uint32 unsigned long int +# define int64 __int64 +# define uint64 unsigned int64 +# define dataptr void* +# define ptr8 char* +# define uptr8 unsigned char* +# define ptr16 short int* +# define uptr16 unsigned short int* +# define ptr32 long int* +# define uptr32 unsigned long int* +# define drv_handle void* +# define bool int8 +# define true 1 +# define false 0 +# define SPCM_EXPORT extern "C" __declspec (dllexport) +# define SPCM_IMPORT +# define _stdcall __stdcall +#endif + +// ----- Gnu C Windows ----- +#if defined (_GCCWIN) +# define int8 char +# define int16 short int +# define int32 int +# define int64 long long +# define uint8 unsigned char +# define uint16 unsigned short int +# define uint32 unsigned int +# define uint64 unsigned long long +# define dataptr void * +# define ptr8 int8* +# define ptr16 int16* +# define ptr32 int32* +# define uptr8 uint8* +# define uptr16 uint16* +# define uptr32 uint32* +# if !defined(bool) && !defined(__cplusplus) +# define bool int8 +# define true 1 +# define false 0 +# endif +# define drv_handle void* +# define EXPC int16 +# define HEAD int16 +# ifdef __cplusplus +# define SPCM_IMPORT extern "C" +# else +# define SPCM_IMPORT +# endif +#endif + +// --- define data structure for segment statistic mode +typedef struct + { + int64 llAvrg: 64; + int16 nMin: 16; + int16 nMax: 16; + uint32 dwMinPos: 32; + uint32 dwMaxPos: 32; + uint32 _Unused: 32; + uint64 qw_Timestamp: 64; + } SPCM_SEGSTAT_STRUCT_CHx; + +#endif diff --git a/AWGDependencies/Spectrum/c_header/errors.h b/AWGDependencies/Spectrum/c_header/errors.h new file mode 100644 index 0000000..6a733be --- /dev/null +++ b/AWGDependencies/Spectrum/c_header/errors.h @@ -0,0 +1,12 @@ +// *********************************************************************** +// errors.h: Old Spectrum error code header file. Has been changed in may +// 2004 to spcerr.h because errors.h has already been in use by +// windows. +// Please change the include section of your project to include +// spcerr.h directly. +// *********************************************************************** + + +#pragma message ("*** Please change include path from errors.h to spcerr.h ***") + +#include "spcerr.h" diff --git a/AWGDependencies/Spectrum/c_header/readme.txt b/AWGDependencies/Spectrum/c_header/readme.txt new file mode 100644 index 0000000..0f2ebce --- /dev/null +++ b/AWGDependencies/Spectrum/c_header/readme.txt @@ -0,0 +1,71 @@ +************************************************************************** +c_header directory (c) Spectrum GmbH +************************************************************************** + +The directory contains all header and library files for all Spectrum +drivers for ISA, PCI, PCI-X, PCIe, cPCI and PXI cards. + +************************************************************************** + + + +Common header files used by all drivers +--------------------------------------- + +dlltyp.h: definitions common for all Spectrum drivers and card types. This + header tries to examine the type of compiler and then defines common + data types that have the same length under all compilers and all + operating systems. + +regs.h: software register and constants definition for all Spectrum + drivers. + +spcerr.h: error codes of all Spectrum drivers. Until may 2004 this file was + errors.h. Name has been changed because errors.h has been already in + use by windows. + + + +Library and Header files of driver for ISA/PCI/MI/MC/MX cards +------------------------------------------------------------- + +spcioctl.inc: linux include file to access driver functions via kernel + calls. Is needed by all linux based programs that access one of the + ISA/PCI/MI/MC/MX Spectrum cards + +errors.h: former error file. Thsi file is just included because of + compatibility reasons with old projects. Please use spcerr.h + +spectrum.h: header file that contains all the prototypes of the driver + functions + +spectrum.lib: library file for Microsoft Visual C++ for the spectrum + driver DLL. Calling type is c-call. + +SpcStdNT.lib: library file for other compilers for the spectrum + driver DLL. Calling type is stdcall. + +spclib_bcc.lib: library for Borland C++ Builder for the spectrum + driver DLL. + + + +Library and Header files of driver for SPCM driver based cards +------------------------------------------------------------- + +spcm_drv.h: header file that contains all the prototypes of the + driver functions of the spcm driver + +spcm_win32_msvcpp.lib: library file for the Microsoft Visual C++ + compiler. Calling type is stdcall. + +spcm_win32_bcppb.lib: library file for the Borland C++ Builder + compiler + +spcm_win32_cvi.lib: library file for National Instruments + LabWindows/CVI compiler + +spectrum_comp.lib: library file of the compatibility DLL that + simulates MI cards when findng M2i cards. Please include + this file instead of spectrum.lib for all projects that + should use M2i cards with the MI software interface diff --git a/AWGDependencies/Spectrum/c_header/regs.h b/AWGDependencies/Spectrum/c_header/regs.h new file mode 100644 index 0000000..023f987 --- /dev/null +++ b/AWGDependencies/Spectrum/c_header/regs.h @@ -0,0 +1,3450 @@ +// *********************************************************************** +// +// regs.h (c) Spectrum GmbH, 2006 +// +// *********************************************************************** +// +// software register and constants definition for all Spectrum drivers. +// Please stick to the card manual to see which of the inhere defined +// registers are used on your hardware. +// +// *********************************************************************** + + + +// *********************************************************************** +// macros for kilo, Mega or Giga as standard version or binary (_B) (2^x) +// *********************************************************************** + +#define KILO(k) ((uint64) 1000 * (k)) +#define MEGA(m) ((uint64) 1000 * 1000 * (m)) +#define GIGA(g) ((uint64) 1000 * 1000 * 1000 * (g)) +#define KILO_B(k) ((uint64) 1024 * (k)) +#define MEGA_B(m) ((uint64) 1024 * 1024 * (m)) +#define GIGA_B(g) ((uint64) 1024 * 1024 * 1024 * (g)) + + + + +// *********************************************************************** +// card types +// *********************************************************************** + +#define TYP_PCIDEVICEID 0x00000000l + +// ***** Board Types *************** +#define TYP_EVAL 0x00000010l +#define TYP_RSDLGA 0x00000014l +#define TYP_GMG 0x00000018l +#define TYP_VAN8 0x00000020l +#define TYP_VAC 0x00000028l + +#define TYP_PCIAUTOINSTALL 0x000000FFl + +#define TYP_DAP116 0x00000100l +#define TYP_PAD82 0x00000200l +#define TYP_PAD82a 0x00000210l +#define TYP_PAD82b 0x00000220l +#define TYP_PCI212 0x00000300l +#define TYP_PAD1232a 0x00000400l +#define TYP_PAD1232b 0x00000410l +#define TYP_PAD1232c 0x00000420l +#define TYP_PAD1616a 0x00000500l +#define TYP_PAD1616b 0x00000510l +#define TYP_PAD1616c 0x00000520l +#define TYP_PAD1616d 0x00000530l +#define TYP_PAD52 0x00000600l +#define TYP_PAD242 0x00000700l +#define TYP_PCK400 0x00000800l +#define TYP_PAD164_2M 0x00000900l +#define TYP_PAD164_5M 0x00000910l +#define TYP_PCI208 0x00001000l +#define TYP_CPCI208 0x00001001l +#define TYP_PCI412 0x00001100l +#define TYP_PCIDIO32 0x00001200l +#define TYP_PCI248 0x00001300l +#define TYP_PADCO 0x00001400l +#define TYP_TRS582 0x00001500l +#define TYP_PCI258 0x00001600l + + +// ------ series and familiy identifiers ----- +#define TYP_SERIESMASK 0x00FF0000l // the series (= type of base card), e.g. MI.xxxx +#define TYP_VERSIONMASK 0x0000FFFFl // the version, e.g. XX.3012 +#define TYP_FAMILYMASK 0x0000FF00l // the family, e.g. XX.30xx +#define TYP_TYPEMASK 0x000000FFl // the type, e.g. XX.xx12 +#define TYP_SPEEDMASK 0x000000F0l // the speed grade, e.g. XX.xx1x +#define TYP_CHMASK 0x0000000Fl // the channel/modules, e.g. XX.xxx2 + +#define TYP_MISERIES 0x00000000l +#define TYP_MCSERIES 0x00010000l +#define TYP_MXSERIES 0x00020000l +#define TYP_M2ISERIES 0x00030000l +#define TYP_M2IEXPSERIES 0x00040000l +#define TYP_M3ISERIES 0x00050000l +#define TYP_M3IEXPSERIES 0x00060000l +#define TYP_M4IEXPSERIES 0x00070000l +#define TYP_M4XEXPSERIES 0x00080000l +#define TYP_M2PEXPSERIES 0x00090000l + + + +// ----- MI.20xx, MC.20xx, MX.20xx ----- +#define TYP_MI2020 0x00002020l +#define TYP_MI2021 0x00002021l +#define TYP_MI2025 0x00002025l +#define TYP_MI2030 0x00002030l +#define TYP_MI2031 0x00002031l + +#define TYP_M2I2020 0x00032020l +#define TYP_M2I2021 0x00032021l +#define TYP_M2I2025 0x00032025l +#define TYP_M2I2030 0x00032030l +#define TYP_M2I2031 0x00032031l + +#define TYP_M2I2020EXP 0x00042020l +#define TYP_M2I2021EXP 0x00042021l +#define TYP_M2I2025EXP 0x00042025l +#define TYP_M2I2030EXP 0x00042030l +#define TYP_M2I2031EXP 0x00042031l + +#define TYP_MC2020 0x00012020l +#define TYP_MC2021 0x00012021l +#define TYP_MC2025 0x00012025l +#define TYP_MC2030 0x00012030l +#define TYP_MC2031 0x00012031l + +#define TYP_MX2020 0x00022020l +#define TYP_MX2025 0x00022025l +#define TYP_MX2030 0x00022030l + +// ----- M3i.21xx, M3i.21xx-Exp (8 bit A/D) ----- +#define TYP_M3I2120 0x00052120l // 1x500M +#define TYP_M3I2122 0x00052122l // 1x500M & 2x250M +#define TYP_M3I2130 0x00052130l // 1x1G +#define TYP_M3I2132 0x00052132l // 1x1G & 2x500M + +#define TYP_M3I2120EXP 0x00062120l // 1x500M +#define TYP_M3I2122EXP 0x00062122l // 1x500M & 2x250M +#define TYP_M3I2130EXP 0x00062130l // 1x1G +#define TYP_M3I2132EXP 0x00062132l // 1x1G & 2x500M + +// ----- M4i.22xx-x8 (8 bit A/D) ----- +#define TYP_M4I22XX_X8 0x00072200l +#define TYP_M4I2210_X8 0x00072210l // 1x1.25G +#define TYP_M4I2211_X8 0x00072211l // 2x1.25G +#define TYP_M4I2212_X8 0x00072212l // 4x1.25G +#define TYP_M4I2220_X8 0x00072220l // 1x2.5G +#define TYP_M4I2221_X8 0x00072221l // 2x2.5G +#define TYP_M4I2223_X8 0x00072223l // 1x2.5G & 2x1.25G +#define TYP_M4I2230_X8 0x00072230l // 1x5G +#define TYP_M4I2233_X8 0x00072233l // 1x5G & 2x2.5G +#define TYP_M4I2234_X8 0x00072234l // 1x5G & 2x2.5G & 4x1.25G +#define TYP_M4I2290_X8 0x00072290l // customer specific variant +#define TYP_M4I2293_X8 0x00072293l // customer specific variant +#define TYP_M4I2294_X8 0x00072294l // customer specific variant + +// ----- M4x.22xx-x8 (8 bit A/D) ----- +#define TYP_M4X22XX_X4 0x00082200l +#define TYP_M4X2210_X4 0x00082210l // 1x1.25G +#define TYP_M4X2211_X4 0x00082211l // 2x1.25G +#define TYP_M4X2212_X4 0x00082212l // 4x1.25G +#define TYP_M4X2220_X4 0x00082220l // 1x2.5G +#define TYP_M4X2221_X4 0x00082221l // 2x2.5G +#define TYP_M4X2223_X4 0x00082223l // 1x2.5G & 2x1.25G +#define TYP_M4X2230_X4 0x00082230l // 1x5G +#define TYP_M4X2233_X4 0x00082233l // 1x5G & 2x2.5G +#define TYP_M4X2234_X4 0x00082234l // 1x5G & 2x2.5G & 4x1.25G + +// ----- MI.30xx, MC.30xx, MX.30xx ----- +#define TYP_MI3010 0x00003010l +#define TYP_MI3011 0x00003011l +#define TYP_MI3012 0x00003012l +#define TYP_MI3013 0x00003013l +#define TYP_MI3014 0x00003014l +#define TYP_MI3015 0x00003015l +#define TYP_MI3016 0x00003016l +#define TYP_MI3020 0x00003020l +#define TYP_MI3021 0x00003021l +#define TYP_MI3022 0x00003022l +#define TYP_MI3023 0x00003023l +#define TYP_MI3024 0x00003024l +#define TYP_MI3025 0x00003025l +#define TYP_MI3026 0x00003026l +#define TYP_MI3027 0x00003027l +#define TYP_MI3031 0x00003031l +#define TYP_MI3033 0x00003033l + +#define TYP_M2I3010 0x00033010l +#define TYP_M2I3011 0x00033011l +#define TYP_M2I3012 0x00033012l +#define TYP_M2I3013 0x00033013l +#define TYP_M2I3014 0x00033014l +#define TYP_M2I3015 0x00033015l +#define TYP_M2I3016 0x00033016l +#define TYP_M2I3020 0x00033020l +#define TYP_M2I3021 0x00033021l +#define TYP_M2I3022 0x00033022l +#define TYP_M2I3023 0x00033023l +#define TYP_M2I3024 0x00033024l +#define TYP_M2I3025 0x00033025l +#define TYP_M2I3026 0x00033026l +#define TYP_M2I3027 0x00033027l +#define TYP_M2I3031 0x00033031l +#define TYP_M2I3033 0x00033033l + +#define TYP_M2I3010EXP 0x00043010l +#define TYP_M2I3011EXP 0x00043011l +#define TYP_M2I3012EXP 0x00043012l +#define TYP_M2I3013EXP 0x00043013l +#define TYP_M2I3014EXP 0x00043014l +#define TYP_M2I3015EXP 0x00043015l +#define TYP_M2I3016EXP 0x00043016l +#define TYP_M2I3020EXP 0x00043020l +#define TYP_M2I3021EXP 0x00043021l +#define TYP_M2I3022EXP 0x00043022l +#define TYP_M2I3023EXP 0x00043023l +#define TYP_M2I3024EXP 0x00043024l +#define TYP_M2I3025EXP 0x00043025l +#define TYP_M2I3026EXP 0x00043026l +#define TYP_M2I3027EXP 0x00043027l +#define TYP_M2I3031EXP 0x00043031l +#define TYP_M2I3033EXP 0x00043033l + +#define TYP_MC3010 0x00013010l +#define TYP_MC3011 0x00013011l +#define TYP_MC3012 0x00013012l +#define TYP_MC3013 0x00013013l +#define TYP_MC3014 0x00013014l +#define TYP_MC3015 0x00013015l +#define TYP_MC3016 0x00013016l +#define TYP_MC3020 0x00013020l +#define TYP_MC3021 0x00013021l +#define TYP_MC3022 0x00013022l +#define TYP_MC3023 0x00013023l +#define TYP_MC3024 0x00013024l +#define TYP_MC3025 0x00013025l +#define TYP_MC3026 0x00013026l +#define TYP_MC3027 0x00013027l +#define TYP_MC3031 0x00013031l +#define TYP_MC3033 0x00013033l + +#define TYP_MX3010 0x00023010l +#define TYP_MX3011 0x00023011l +#define TYP_MX3012 0x00023012l +#define TYP_MX3020 0x00023020l +#define TYP_MX3021 0x00023021l +#define TYP_MX3022 0x00023022l +#define TYP_MX3031 0x00023031l + + + +// ----- MI.31xx, MC.31xx, MX.31xx ----- +#define TYP_MI3110 0x00003110l +#define TYP_MI3111 0x00003111l +#define TYP_MI3112 0x00003112l +#define TYP_MI3120 0x00003120l +#define TYP_MI3121 0x00003121l +#define TYP_MI3122 0x00003122l +#define TYP_MI3130 0x00003130l +#define TYP_MI3131 0x00003131l +#define TYP_MI3132 0x00003132l +#define TYP_MI3140 0x00003140l + +#define TYP_M2I3110 0x00033110l +#define TYP_M2I3111 0x00033111l +#define TYP_M2I3112 0x00033112l +#define TYP_M2I3120 0x00033120l +#define TYP_M2I3121 0x00033121l +#define TYP_M2I3122 0x00033122l +#define TYP_M2I3130 0x00033130l +#define TYP_M2I3131 0x00033131l +#define TYP_M2I3132 0x00033132l + +#define TYP_M2I3110EXP 0x00043110l +#define TYP_M2I3111EXP 0x00043111l +#define TYP_M2I3112EXP 0x00043112l +#define TYP_M2I3120EXP 0x00043120l +#define TYP_M2I3121EXP 0x00043121l +#define TYP_M2I3122EXP 0x00043122l +#define TYP_M2I3130EXP 0x00043130l +#define TYP_M2I3131EXP 0x00043131l +#define TYP_M2I3132EXP 0x00043132l + +#define TYP_MC3110 0x00013110l +#define TYP_MC3111 0x00013111l +#define TYP_MC3112 0x00013112l +#define TYP_MC3120 0x00013120l +#define TYP_MC3121 0x00013121l +#define TYP_MC3122 0x00013122l +#define TYP_MC3130 0x00013130l +#define TYP_MC3131 0x00013131l +#define TYP_MC3132 0x00013132l + +#define TYP_MX3110 0x00023110l +#define TYP_MX3111 0x00023111l +#define TYP_MX3120 0x00023120l +#define TYP_MX3121 0x00023121l +#define TYP_MX3130 0x00023130l +#define TYP_MX3131 0x00023131l + + + +// ----- M3i.32xx, M3i.32xx-Exp (12 bit A/D) ----- +#define TYP_M3I3220 0x00053220l // 1x250M +#define TYP_M3I3221 0x00053221l // 2x250M +#define TYP_M3I3240 0x00053240l // 1x500M +#define TYP_M3I3242 0x00053242l // 1x500M & 2x250M + +#define TYP_M3I3220EXP 0x00063220l // 1x250M +#define TYP_M3I3221EXP 0x00063221l // 2x250M +#define TYP_M3I3240EXP 0x00063240l // 1x500M +#define TYP_M3I3242EXP 0x00063242l // 1x500M & 2x250M + + + +// ----- MI.40xx, MC.40xx, MX.40xx ----- +#define TYP_MI4020 0x00004020l +#define TYP_MI4021 0x00004021l +#define TYP_MI4022 0x00004022l +#define TYP_MI4030 0x00004030l +#define TYP_MI4031 0x00004031l +#define TYP_MI4032 0x00004032l + +#define TYP_M2I4020 0x00034020l +#define TYP_M2I4021 0x00034021l +#define TYP_M2I4022 0x00034022l +#define TYP_M2I4028 0x00034028l +#define TYP_M2I4030 0x00034030l +#define TYP_M2I4031 0x00034031l +#define TYP_M2I4032 0x00034032l +#define TYP_M2I4038 0x00034038l + +#define TYP_M2I4020EXP 0x00044020l +#define TYP_M2I4021EXP 0x00044021l +#define TYP_M2I4022EXP 0x00044022l +#define TYP_M2I4028EXP 0x00044028l +#define TYP_M2I4030EXP 0x00044030l +#define TYP_M2I4031EXP 0x00044031l +#define TYP_M2I4032EXP 0x00044032l +#define TYP_M2I4038EXP 0x00044038l + +#define TYP_MC4020 0x00014020l +#define TYP_MC4021 0x00014021l +#define TYP_MC4022 0x00014022l +#define TYP_MC4030 0x00014030l +#define TYP_MC4031 0x00014031l +#define TYP_MC4032 0x00014032l + +#define TYP_MX4020 0x00024020l +#define TYP_MX4021 0x00024021l +#define TYP_MX4030 0x00024030l +#define TYP_MX4031 0x00024031l + + + +// ----- M3i.41xx, M3i.41xx-Exp (14 bit A/D) ----- +#define TYP_M3I4110 0x00054110l // 1x100M +#define TYP_M3I4111 0x00054111l // 2x100M +#define TYP_M3I4120 0x00054120l // 1x250M +#define TYP_M3I4121 0x00054121l // 2x250M +#define TYP_M3I4140 0x00054140l // 1x400M +#define TYP_M3I4142 0x00054142l // 1x400M & 2x250M + +#define TYP_M3I4110EXP 0x00064110l // 1x100M +#define TYP_M3I4111EXP 0x00064111l // 2x100M +#define TYP_M3I4120EXP 0x00064120l // 1x250M +#define TYP_M3I4121EXP 0x00064121l // 2x250M +#define TYP_M3I4140EXP 0x00064140l // 1x400M +#define TYP_M3I4142EXP 0x00064142l // 1x400M & 2x250M + +// ----- M4i.44xx-x8 (generic) ----- +#define TYP_M4I44XX_X8 0x00074400 // + +#define TYP_M4I4410_X8 0x00074410 // 2x130M 16bit +#define TYP_M4I4411_X8 0x00074411 // 4x130M 16bit +#define TYP_M4I4420_X8 0x00074420 // 2x250M 16bit +#define TYP_M4I4421_X8 0x00074421 // 4x250M 16bit +#define TYP_M4I4450_X8 0x00074450 // 2x500M 14bit +#define TYP_M4I4451_X8 0x00074451 // 4x500M 14bit +#define TYP_M4I4470_X8 0x00074470 // 2x180M 16bit +#define TYP_M4I4471_X8 0x00074471 // 4x180M 16bit +#define TYP_M4I4480_X8 0x00074480 // 2x400M 14bit +#define TYP_M4I4481_X8 0x00074481 // 4x400M 14bit + +// ----- M4x.44xx-x4 (14/16 bit A/D) ----- +#define TYP_M4X44XX_X4 0x00084400 // generic +#define TYP_M4X4410_X4 0x00084410 // 2x130M 16bit +#define TYP_M4X4411_X4 0x00084411 // 4x130M 16bit +#define TYP_M4X4420_X4 0x00084420 // 2x250M 16bit +#define TYP_M4X4421_X4 0x00084421 // 4x250M 16bit +#define TYP_M4X4450_X4 0x00084450 // 2x500M 14bit +#define TYP_M4X4451_X4 0x00084451 // 4x500M 14bit +#define TYP_M4X4470_X4 0x00084470 // 2x180M 16bit +#define TYP_M4X4471_X4 0x00084471 // 4x180M 16bit +#define TYP_M4X4480_X4 0x00084480 // 2x400M 14bit +#define TYP_M4X4481_X4 0x00084481 // 4x400M 14bit + + +// ----- MI.45xx, MC.45xx, MX.45xx ----- +#define TYP_MI4520 0x00004520l +#define TYP_MI4521 0x00004521l +#define TYP_MI4530 0x00004530l +#define TYP_MI4531 0x00004531l +#define TYP_MI4540 0x00004540l +#define TYP_MI4541 0x00004541l + +#define TYP_M2I4520 0x00034520l +#define TYP_M2I4521 0x00034521l +#define TYP_M2I4530 0x00034530l +#define TYP_M2I4531 0x00034531l +#define TYP_M2I4540 0x00034540l +#define TYP_M2I4541 0x00034541l + +#define TYP_MC4520 0x00014520l +#define TYP_MC4521 0x00014521l +#define TYP_MC4530 0x00014530l +#define TYP_MC4531 0x00014531l +#define TYP_MC4540 0x00014540l +#define TYP_MC4541 0x00014541l + +#define TYP_MX4520 0x00024520l +#define TYP_MX4530 0x00024530l +#define TYP_MX4540 0x00024540l + + + +// ----- MI.46xx, MC.46xx, MX.46xx ----- +#define TYP_MI4620 0x00004620l +#define TYP_MI4621 0x00004621l +#define TYP_MI4622 0x00004622l +#define TYP_MI4630 0x00004630l +#define TYP_MI4631 0x00004631l +#define TYP_MI4632 0x00004632l +#define TYP_MI4640 0x00004640l +#define TYP_MI4641 0x00004641l +#define TYP_MI4642 0x00004642l +#define TYP_MI4650 0x00004650l +#define TYP_MI4651 0x00004651l +#define TYP_MI4652 0x00004652l + +#define TYP_M2I4620 0x00034620l +#define TYP_M2I4621 0x00034621l +#define TYP_M2I4622 0x00034622l +#define TYP_M2I4630 0x00034630l +#define TYP_M2I4631 0x00034631l +#define TYP_M2I4632 0x00034632l +#define TYP_M2I4640 0x00034640l +#define TYP_M2I4641 0x00034641l +#define TYP_M2I4642 0x00034642l +#define TYP_M2I4650 0x00034650l +#define TYP_M2I4651 0x00034651l +#define TYP_M2I4652 0x00034652l + +#define TYP_M2I4620EXP 0x00044620l +#define TYP_M2I4621EXP 0x00044621l +#define TYP_M2I4622EXP 0x00044622l +#define TYP_M2I4630EXP 0x00044630l +#define TYP_M2I4631EXP 0x00044631l +#define TYP_M2I4632EXP 0x00044632l +#define TYP_M2I4640EXP 0x00044640l +#define TYP_M2I4641EXP 0x00044641l +#define TYP_M2I4642EXP 0x00044642l +#define TYP_M2I4650EXP 0x00044650l +#define TYP_M2I4651EXP 0x00044651l +#define TYP_M2I4652EXP 0x00044652l + +#define TYP_MC4620 0x00014620l +#define TYP_MC4621 0x00014621l +#define TYP_MC4622 0x00014622l +#define TYP_MC4630 0x00014630l +#define TYP_MC4631 0x00014631l +#define TYP_MC4632 0x00014632l +#define TYP_MC4640 0x00014640l +#define TYP_MC4641 0x00014641l +#define TYP_MC4642 0x00014642l +#define TYP_MC4650 0x00014650l +#define TYP_MC4651 0x00014651l +#define TYP_MC4652 0x00014652l + +#define TYP_MX4620 0x00024620l +#define TYP_MX4621 0x00024621l +#define TYP_MX4630 0x00024630l +#define TYP_MX4631 0x00024631l +#define TYP_MX4640 0x00024640l +#define TYP_MX4641 0x00024641l +#define TYP_MX4650 0x00024650l +#define TYP_MX4651 0x00024651l + + + +// ----- MI.47xx, MC.47xx, MX.47xx ----- +#define TYP_MI4710 0x00004710l +#define TYP_MI4711 0x00004711l +#define TYP_MI4720 0x00004720l +#define TYP_MI4721 0x00004721l +#define TYP_MI4730 0x00004730l +#define TYP_MI4731 0x00004731l +#define TYP_MI4740 0x00004740l +#define TYP_MI4741 0x00004741l + +#define TYP_M2I4710 0x00034710l +#define TYP_M2I4711 0x00034711l +#define TYP_M2I4720 0x00034720l +#define TYP_M2I4721 0x00034721l +#define TYP_M2I4730 0x00034730l +#define TYP_M2I4731 0x00034731l +#define TYP_M2I4740 0x00034740l +#define TYP_M2I4741 0x00034741l + +#define TYP_M2I4710EXP 0x00044710l +#define TYP_M2I4711EXP 0x00044711l +#define TYP_M2I4720EXP 0x00044720l +#define TYP_M2I4721EXP 0x00044721l +#define TYP_M2I4730EXP 0x00044730l +#define TYP_M2I4731EXP 0x00044731l +#define TYP_M2I4740EXP 0x00044740l +#define TYP_M2I4741EXP 0x00044741l + +#define TYP_MC4710 0x00014710l +#define TYP_MC4711 0x00014711l +#define TYP_MC4720 0x00014720l +#define TYP_MC4721 0x00014721l +#define TYP_MC4730 0x00014730l +#define TYP_MC4731 0x00014731l + +#define TYP_MX4710 0x00024710l +#define TYP_MX4720 0x00024720l +#define TYP_MX4730 0x00024730l + + + +// ----- M3i.48xx, M3i.48xx-Exp (16 bit A/D) ----- +#define TYP_M3I4830 0x00054830l +#define TYP_M3I4831 0x00054831l +#define TYP_M3I4840 0x00054840l +#define TYP_M3I4841 0x00054841l +#define TYP_M3I4860 0x00054860l +#define TYP_M3I4861 0x00054861l + +#define TYP_M3I4830EXP 0x00064830l +#define TYP_M3I4831EXP 0x00064831l +#define TYP_M3I4840EXP 0x00064840l +#define TYP_M3I4841EXP 0x00064841l +#define TYP_M3I4860EXP 0x00064860l +#define TYP_M3I4861EXP 0x00064861l + + + +// ----- MI.46xx, MC.46xx, MX.46xx ----- +#define TYP_MI4911 0x00004911l +#define TYP_MI4912 0x00004912l +#define TYP_MI4931 0x00004931l +#define TYP_MI4932 0x00004932l +#define TYP_MI4960 0x00004960l +#define TYP_MI4961 0x00004961l +#define TYP_MI4963 0x00004963l +#define TYP_MI4964 0x00004964l + +#define TYP_MC4911 0x00014911l +#define TYP_MC4912 0x00014912l +#define TYP_MC4931 0x00014931l +#define TYP_MC4932 0x00014932l +#define TYP_MC4960 0x00014960l +#define TYP_MC4961 0x00014961l +#define TYP_MC4963 0x00014963l +#define TYP_MC4964 0x00014964l + +#define TYP_MX4911 0x00024911l +#define TYP_MX4931 0x00024931l +#define TYP_MX4960 0x00024960l +#define TYP_MX4963 0x00024963l + +#define TYP_M2I4911 0x00034911l +#define TYP_M2I4912 0x00034912l +#define TYP_M2I4931 0x00034931l +#define TYP_M2I4932 0x00034932l +#define TYP_M2I4960 0x00034960l +#define TYP_M2I4961 0x00034961l +#define TYP_M2I4963 0x00034963l +#define TYP_M2I4964 0x00034964l + +#define TYP_M2I4911EXP 0x00044911l +#define TYP_M2I4912EXP 0x00044912l +#define TYP_M2I4931EXP 0x00044931l +#define TYP_M2I4932EXP 0x00044932l +#define TYP_M2I4960EXP 0x00044960l +#define TYP_M2I4961EXP 0x00044961l +#define TYP_M2I4963EXP 0x00044963l +#define TYP_M2I4964EXP 0x00044964l + +// ----- M2p.59xx-x4 ----- +#define TYP_M2P59XX_X4 0x00095900l // generic +#define TYP_M2P5911_X4 0x00095911l +#define TYP_M2P5912_X4 0x00095912l +#define TYP_M2P5913_X4 0x00095913l +#define TYP_M2P5916_X4 0x00095916l +#define TYP_M2P5920_X4 0x00095920l +#define TYP_M2P5921_X4 0x00095921l +#define TYP_M2P5922_X4 0x00095922l +#define TYP_M2P5923_X4 0x00095923l +#define TYP_M2P5926_X4 0x00095926l +#define TYP_M2P5930_X4 0x00095930l +#define TYP_M2P5931_X4 0x00095931l +#define TYP_M2P5932_X4 0x00095932l +#define TYP_M2P5933_X4 0x00095933l +#define TYP_M2P5936_X4 0x00095936l +#define TYP_M2P5940_X4 0x00095940l +#define TYP_M2P5941_X4 0x00095941l +#define TYP_M2P5942_X4 0x00095942l +#define TYP_M2P5943_X4 0x00095943l +#define TYP_M2P5946_X4 0x00095946l +#define TYP_M2P5960_X4 0x00095960l +#define TYP_M2P5961_X4 0x00095961l +#define TYP_M2P5962_X4 0x00095962l +#define TYP_M2P5966_X4 0x00095966l +#define TYP_M2P5968_X4 0x00095968l + + +// ----- MI.60xx, MC.60xx, MX.60xx ----- +#define TYP_MI6010 0x00006010l +#define TYP_MI6011 0x00006011l +#define TYP_MI6012 0x00006012l +#define TYP_MI6021 0x00006021l +#define TYP_MI6022 0x00006022l +#define TYP_MI6030 0x00006030l +#define TYP_MI6031 0x00006031l +#define TYP_MI6033 0x00006033l +#define TYP_MI6034 0x00006034l + +#define TYP_M2I6010 0x00036010l +#define TYP_M2I6011 0x00036011l +#define TYP_M2I6012 0x00036012l +#define TYP_M2I6021 0x00036021l +#define TYP_M2I6022 0x00036022l +#define TYP_M2I6030 0x00036030l +#define TYP_M2I6031 0x00036031l +#define TYP_M2I6033 0x00036033l +#define TYP_M2I6034 0x00036034l + +#define TYP_M2I6010EXP 0x00046010l +#define TYP_M2I6011EXP 0x00046011l +#define TYP_M2I6012EXP 0x00046012l +#define TYP_M2I6021EXP 0x00046021l +#define TYP_M2I6022EXP 0x00046022l +#define TYP_M2I6030EXP 0x00046030l +#define TYP_M2I6031EXP 0x00046031l +#define TYP_M2I6033EXP 0x00046033l +#define TYP_M2I6034EXP 0x00046034l + +#define TYP_MC6010 0x00016010l +#define TYP_MC6011 0x00016011l +#define TYP_MC6012 0x00016012l +#define TYP_MC6021 0x00016021l +#define TYP_MC6022 0x00016022l +#define TYP_MC6030 0x00016030l +#define TYP_MC6031 0x00016031l +#define TYP_MC6033 0x00016033l +#define TYP_MC6034 0x00016034l + +#define TYP_MX6010 0x00026010l +#define TYP_MX6011 0x00026011l +#define TYP_MX6021 0x00026021l +#define TYP_MX6030 0x00026030l +#define TYP_MX6033 0x00026033l + + + +// ----- MI.61xx, MC.61xx, MX.61xx ----- +#define TYP_MI6105 0x00006105l +#define TYP_MI6110 0x00006110l +#define TYP_MI6111 0x00006111l + +#define TYP_M2I6105 0x00036105l +#define TYP_M2I6110 0x00036110l +#define TYP_M2I6111 0x00036111l + +#define TYP_M2I6105EXP 0x00046105l +#define TYP_M2I6110EXP 0x00046110l +#define TYP_M2I6111EXP 0x00046111l + +#define TYP_MC6110 0x00016110l +#define TYP_MC6111 0x00016111l + +#define TYP_MX6110 0x00026110l + +// ----- M2p.65xx-x4 ----- +#define TYP_M2P65XX_X4 0x00096500l // generic +#define TYP_M2P6522_X4 0x00096522l // 4 ch @ 40 MS/s (1x4) (low voltage) +#define TYP_M2P6523_X4 0x00096523l // 8 ch @ 40 MS/s (low voltage) +#define TYP_M2P6530_X4 0x00096530l // 1 ch @ 40 MS/s +#define TYP_M2P6531_X4 0x00096531l // 2 ch @ 40 MS/s +#define TYP_M2P6532_X4 0x00096532l // 4 ch @ 40 MS/s (1x4) +#define TYP_M2P6536_X4 0x00096536l // 4 ch @ 40 MS/s (2x2) +#define TYP_M2P6533_X4 0x00096533l // 8 ch @ 40 MS/s +#define TYP_M2P6540_X4 0x00096540l // 1 ch @ 40 MS/s (high voltage) +#define TYP_M2P6541_X4 0x00096541l // 2 ch @ 40 MS/s (high voltage) +#define TYP_M2P6546_X4 0x00096546l // 4 ch @ 40 MS/s (2x2) (high voltage) +#define TYP_M2P6560_X4 0x00096560l // 1 ch @ 125 MS/s +#define TYP_M2P6561_X4 0x00096561l // 2 ch @ 125 MS/s +#define TYP_M2P6562_X4 0x00096562l // 4 ch @ 125 MS/s (1x4) +#define TYP_M2P6566_X4 0x00096566l // 4 ch @ 125 MS/s (2x2) +#define TYP_M2P6568_X4 0x00096568l // 8 ch @ 125/80 MS/s +#define TYP_M2P6570_X4 0x00096570l // 1 ch @ 125 MS/s (high voltage) +#define TYP_M2P6571_X4 0x00096571l // 2 ch @ 125 MS/s (high voltage) +#define TYP_M2P6576_X4 0x00096576l // 4 ch @ 125 MS/s (2x2) (high voltage) + +// ----- M4i.66xx-x8 (16 bit D/A) ----- +// ----- M4i.66xx-x8 (generic) ----- +#define TYP_M4I66XX_X8 0x00076600 + +#define TYP_M4I6620_X8 0x00076620 // 1 ch @ 625 MS/s +#define TYP_M4I6621_X8 0x00076621 // 2 ch @ 625 MS/s +#define TYP_M4I6622_X8 0x00076622 // 4 ch @ 625 MS/s +#define TYP_M4I6630_X8 0x00076630 // 1 ch @ 1250 MS/s +#define TYP_M4I6631_X8 0x00076631 // 2 ch @ 1250 MS/s + +// ----- M4x.66xx-x8 (16 bit D/A) ----- +// ----- M4x.66xx-x8 (generic) ----- +#define TYP_M4X66XX_X4 0x00086600 + +#define TYP_M4X6620_X4 0x00086620 // 1 ch @ 625 MS/s +#define TYP_M4X6621_X4 0x00086621 // 2 ch @ 625 MS/s +#define TYP_M4X6622_X4 0x00086622 // 4 ch @ 625 MS/s +#define TYP_M4X6630_X4 0x00086630 // 1 ch @ 1250 MS/s +#define TYP_M4X6631_X4 0x00086631 // 2 ch @ 1250 MS/s + +// ----- MI.70xx, MC.70xx, MX.70xx ----- +#define TYP_MI7005 0x00007005l +#define TYP_MI7010 0x00007010l +#define TYP_MI7011 0x00007011l +#define TYP_MI7020 0x00007020l +#define TYP_MI7021 0x00007021l + +#define TYP_M2I7005 0x00037005l +#define TYP_M2I7010 0x00037010l +#define TYP_M2I7011 0x00037011l +#define TYP_M2I7020 0x00037020l +#define TYP_M2I7021 0x00037021l + +#define TYP_M2I7005EXP 0x00047005l +#define TYP_M2I7010EXP 0x00047010l +#define TYP_M2I7011EXP 0x00047011l +#define TYP_M2I7020EXP 0x00047020l +#define TYP_M2I7021EXP 0x00047021l + +#define TYP_MC7005 0x00017005l +#define TYP_MC7010 0x00017010l +#define TYP_MC7011 0x00017011l +#define TYP_MC7020 0x00017020l +#define TYP_MC7021 0x00017021l + +#define TYP_MX7005 0x00027005l +#define TYP_MX7010 0x00027010l +#define TYP_MX7011 0x00027011l + + + +// ----- MI.72xx, MC.72xx, MX.72xx ----- +#define TYP_MI7210 0x00007210l +#define TYP_MI7211 0x00007211l +#define TYP_MI7220 0x00007220l +#define TYP_MI7221 0x00007221l + +#define TYP_M2I7210 0x00037210l +#define TYP_M2I7211 0x00037211l +#define TYP_M2I7220 0x00037220l +#define TYP_M2I7221 0x00037221l + +#define TYP_M2I7210EXP 0x00047210l +#define TYP_M2I7211EXP 0x00047211l +#define TYP_M2I7220EXP 0x00047220l +#define TYP_M2I7221EXP 0x00047221l + +#define TYP_MC7210 0x00017210l +#define TYP_MC7211 0x00017211l +#define TYP_MC7220 0x00017220l +#define TYP_MC7221 0x00017221l + +#define TYP_MX7210 0x00027210l +#define TYP_MX7220 0x00027220l + +// ----- M4i.77xx-x8 ----- +#define TYP_M4I77XX_X8 0x00077700 // generic +#define TYP_M4I7710_X8 0x00077710 // single-ended +#define TYP_M4I7720_X8 0x00077720 // single-ended +#define TYP_M4I7730_X8 0x00077730 // single-ended +#define TYP_M4I7725_X8 0x00077725 // differential +#define TYP_M4I7735_X8 0x00077735 // differential + +// ----- M4x.77xx-x8 ----- +#define TYP_M4X77XX_X4 0x00087700 // generic +#define TYP_M4X7710_X4 0x00087710 // single-ended +#define TYP_M4X7720_X4 0x00087720 // single-ended +#define TYP_M4X7730_X4 0x00087730 // single-ended +#define TYP_M4X7725_X4 0x00087725 // differential +#define TYP_M4X7735_X4 0x00087735 // differential + +// ----- MX.90xx ----- +#define TYP_MX9010 0x00029010l + + + +// *********************************************************************** +// software registers +// *********************************************************************** + + +// ***** PCI Features Bits (MI/MC/MX and prior cards) ********* +#define PCIBIT_MULTI 0x00000001 +#define PCIBIT_DIGITAL 0x00000002 +#define PCIBIT_CH0DIGI 0x00000004 +#define PCIBIT_EXTSAM 0x00000008 +#define PCIBIT_3CHANNEL 0x00000010 +#define PCIBIT_GATE 0x00000020 +#define PCIBIT_SLAVE 0x00000040 +#define PCIBIT_MASTER 0x00000080 +#define PCIBIT_DOUBLEMEM 0x00000100 +#define PCIBIT_SYNC 0x00000200 +#define PCIBIT_TIMESTAMP 0x00000400 +#define PCIBIT_STARHUB 0x00000800 +#define PCIBIT_CA 0x00001000 +#define PCIBIT_XIO 0x00002000 +#define PCIBIT_AMPLIFIER 0x00004000 +#define PCIBIT_DIFFMODE 0x00008000 + +#define PCIBIT_ELISA 0x10000000 + + +// ***** PCI features starting with M2i card series ***** +#define SPCM_FEAT_MULTI 0x00000001 // multiple recording +#define SPCM_FEAT_GATE 0x00000002 // gated sampling +#define SPCM_FEAT_DIGITAL 0x00000004 // additional synchronous digital inputs or outputs +#define SPCM_FEAT_TIMESTAMP 0x00000008 // timestamp +#define SPCM_FEAT_STARHUB5 0x00000020 // starhub for 5 cards installed (M2i + M2i-Exp) +#define SPCM_FEAT_STARHUB4 0x00000020 // starhub for 4 cards installed (M3i + M3i-Exp) +#define SPCM_FEAT_STARHUB6_EXTM 0x00000020 // starhub for 6 cards installed as card extension or piggy back (M2p) +#define SPCM_FEAT_STARHUB8_EXTM 0x00000020 // starhub for 8 cards installed as card extension or piggy back (M4i-Exp) +#define SPCM_FEAT_STARHUB16 0x00000040 // starhub for 16 cards installed (M2i, M2i-exp) +#define SPCM_FEAT_STARHUB16_EXTM 0x00000040 // starhub for 16 cards installed as card extension or piggy back (M2p) +#define SPCM_FEAT_STARHUB8 0x00000040 // starhub for 8 cards installed (M3i + M3i-Exp) +#define SPCM_FEAT_STARHUBXX_MASK 0x00000060 // mask to detect one of the above installed starhub +#define SPCM_FEAT_ABA 0x00000080 // ABA mode installed +#define SPCM_FEAT_BASEXIO 0x00000100 // extra I/O on base card installed +#define SPCM_FEAT_AMPLIFIER_10V 0x00000200 // external amplifier for 60/61 +#define SPCM_FEAT_STARHUBSYSMASTER 0x00000400 // system starhub master installed +#define SPCM_FEAT_DIFFMODE 0x00000800 // Differential mode installed +#define SPCM_FEAT_SEQUENCE 0x00001000 // Sequence programming mode for generator cards +#define SPCM_FEAT_AMPMODULE_10V 0x00002000 // amplifier module for 60/61 +#define SPCM_FEAT_STARHUBSYSSLAVE 0x00004000 // system starhub slave installed +#define SPCM_FEAT_NETBOX 0x00008000 // card is part of netbox +#define SPCM_FEAT_REMOTESERVER 0x00010000 // remote server can be used with this card +#define SPCM_FEAT_SCAPP 0x00020000 // SCAPP option (CUDA RDMA) +#define SPCM_FEAT_DIG16_SMB 0x00040000 // M2p: 16 additional digital inputs or outputs (via SMB connectors) +#define SPCM_FEAT_DIG16_FX2 0x00080000 // M2p: 16 additional digital inputs or outputs (via FX2 connector) +#define SPCM_FEAT_DIGITALBWFILTER 0x00100000 // Digital BW filter is available +#define SPCM_FEAT_CUSTOMMOD_MASK 0xF0000000 // mask for custom modification code, meaning of code depends on type and customer + + +// ***** Extended Features starting with M4i ***** +#define SPCM_FEAT_EXTFW_SEGSTAT 0x00000001 // segment (Multiple Recording, ABA) statistics like average, min/max +#define SPCM_FEAT_EXTFW_SEGAVERAGE 0x00000002 // average of multiple segments (Multiple Recording, ABA) +#define SPCM_FEAT_EXTFW_BOXCAR 0x00000004 // boxcar averaging (high-res mode) + + +// ***** Error Request ************* +#define ERRORTEXTLEN 200 +#define SPC_LASTERRORTEXT 999996l +#define SPC_LASTERRORVALUE 999997l +#define SPC_LASTERRORREG 999998l +#define SPC_LASTERRORCODE 999999l // Reading this reset the internal error-memory. + +// ***** constants to use with the various _ACDC registers ***** +#define COUPLING_DC 0 +#define COUPLING_AC 1 + + +// ***** Register and Command Structure +#define SPC_COMMAND 0l +#define SPC_RESET 0l +#define SPC_SOFTRESET 1l +#define SPC_WRITESETUP 2l +#define SPC_START 10l +#define SPC_STARTANDWAIT 11l +#define SPC_FIFOSTART 12l +#define SPC_FIFOWAIT 13l +#define SPC_FIFOSTARTNOWAIT 14l +#define SPC_FORCETRIGGER 16l +#define SPC_STOP 20l +#define SPC_FLUSHFIFOBUFFER 21l +#define SPC_POWERDOWN 30l +#define SPC_SYNCMASTER 100l +#define SPC_SYNCTRIGGERMASTER 101l +#define SPC_SYNCMASTERFIFO 102l +#define SPC_SYNCSLAVE 110l +#define SPC_SYNCTRIGGERSLAVE 111l +#define SPC_SYNCSLAVEFIFO 112l +#define SPC_NOSYNC 120l +#define SPC_SYNCSTART 130l +#define SPC_SYNCCALCMASTER 140l +#define SPC_SYNCCALCMASTERFIFO 141l +#define SPC_PXIDIVIDERRESET 150l +#define SPC_RELAISON 200l +#define SPC_RELAISOFF 210l +#define SPC_ADJUSTSTART 300l +#define SPC_FIFO_BUFREADY0 400l +#define SPC_FIFO_BUFREADY1 401l +#define SPC_FIFO_BUFREADY2 402l +#define SPC_FIFO_BUFREADY3 403l +#define SPC_FIFO_BUFREADY4 404l +#define SPC_FIFO_BUFREADY5 405l +#define SPC_FIFO_BUFREADY6 406l +#define SPC_FIFO_BUFREADY7 407l +#define SPC_FIFO_BUFREADY8 408l +#define SPC_FIFO_BUFREADY9 409l +#define SPC_FIFO_BUFREADY10 410l +#define SPC_FIFO_BUFREADY11 411l +#define SPC_FIFO_BUFREADY12 412l +#define SPC_FIFO_BUFREADY13 413l +#define SPC_FIFO_BUFREADY14 414l +#define SPC_FIFO_BUFREADY15 415l +#define SPC_FIFO_AUTOBUFSTART 500l +#define SPC_FIFO_AUTOBUFEND 510l + +#define SPC_STATUS 10l +#define SPC_RUN 0l +#define SPC_TRIGGER 10l +#define SPC_READY 20l + + + +// commands for M2 cards +#define SPC_M2CMD 100l // write a command +#define M2CMD_CARD_RESET 0x00000001l // hardware reset +#define M2CMD_CARD_WRITESETUP 0x00000002l // write setup only +#define M2CMD_CARD_START 0x00000004l // start of card (including writesetup) +#define M2CMD_CARD_ENABLETRIGGER 0x00000008l // enable trigger engine +#define M2CMD_CARD_FORCETRIGGER 0x00000010l // force trigger +#define M2CMD_CARD_DISABLETRIGGER 0x00000020l // disable trigger engine again (multi or gate) +#define M2CMD_CARD_STOP 0x00000040l // stop run +#define M2CMD_CARD_FLUSHFIFO 0x00000080l // flush fifos to memory +#define M2CMD_CARD_INVALIDATEDATA 0x00000100l // current data in memory is invalidated, next data transfer start will wait until new data is available +#define M2CMD_CARD_INTERNALRESET 0x00000200l // INTERNAL reset command + +#define M2CMD_ALL_STOP 0x00440060l // stops card and all running transfers + +#define M2CMD_CARD_WAITPREFULL 0x00001000l // wait until pretrigger is full +#define M2CMD_CARD_WAITTRIGGER 0x00002000l // wait for trigger recognition +#define M2CMD_CARD_WAITREADY 0x00004000l // wait for card ready + +#define M2CMD_DATA_STARTDMA 0x00010000l // start of DMA transfer for data +#define M2CMD_DATA_WAITDMA 0x00020000l // wait for end of data transfer / next block ready +#define M2CMD_DATA_STOPDMA 0x00040000l // abort the data transfer +#define M2CMD_DATA_POLL 0x00080000l // transfer data using single access and polling + +#define M2CMD_EXTRA_STARTDMA 0x00100000l // start of DMA transfer for extra (ABA + timestamp) data +#define M2CMD_EXTRA_WAITDMA 0x00200000l // wait for end of extra (ABA + timestamp) data transfer / next block ready +#define M2CMD_EXTRA_STOPDMA 0x00400000l // abort the extra (ABA + timestamp) data transfer +#define M2CMD_EXTRA_POLL 0x00800000l // transfer data using single access and polling + +#define M2CMD_DATA_SGFLUSH 0x01000000l // flush incomplete pages from sg list + + +// status for M2 cards (bitmask) +#define SPC_M2STATUS 110l // read the current status +#define M2STAT_NONE 0x00000000l // status empty +#define M2STAT_CARD_PRETRIGGER 0x00000001l // pretrigger area is full +#define M2STAT_CARD_TRIGGER 0x00000002l // trigger recognized +#define M2STAT_CARD_READY 0x00000004l // card is ready, run finished +#define M2STAT_CARD_SEGMENT_PRETRG 0x00000008l // since M4i: at muliple-recording: pretrigger area of a segment is full + +#define M2STAT_DATA_BLOCKREADY 0x00000100l // next data block is available +#define M2STAT_DATA_END 0x00000200l // data transfer has ended +#define M2STAT_DATA_OVERRUN 0x00000400l // FIFO overrun (record) or underrun (replay) +#define M2STAT_DATA_ERROR 0x00000800l // internal error + +#define M2STAT_EXTRA_BLOCKREADY 0x00001000l // next extra data (ABA and timestamp) block is available +#define M2STAT_EXTRA_END 0x00002000l // extra data (ABA and timestamp) transfer has ended +#define M2STAT_EXTRA_OVERRUN 0x00004000l // FIFO overrun +#define M2STAT_EXTRA_ERROR 0x00008000l // internal error + +#define M2STAT_TSCNT_OVERRUN 0x00010000l // timestamp counter overrun + +#define M2STAT_INTERNALMASK 0xff000000l // mask for internal status signals +#define M2STAT_INTERNAL_SYSLOCK 0x02000000l + + + +// buffer control registers for samples data +#define SPC_DATA_AVAIL_USER_LEN 200l // number of bytes available for user (valid data if READ, free buffer if WRITE) +#define SPC_DATA_AVAIL_USER_POS 201l // the current byte position where the available user data starts +#define SPC_DATA_AVAIL_CARD_LEN 202l // number of bytes available for card (free buffer if READ, filled data if WRITE) +#define SPC_DATA_OUTBUFSIZE 209l // output buffer size in bytes + +// buffer control registers for extra data (ABA slow data, timestamps) +#define SPC_ABA_AVAIL_USER_LEN 210l // number of bytes available for user (valid data if READ, free buffer if WRITE) +#define SPC_ABA_AVAIL_USER_POS 211l // the current byte position where the available user data starts +#define SPC_ABA_AVAIL_CARD_LEN 212l // number of bytes available for card (free buffer if READ, filled data if WRITE) + +#define SPC_TS_AVAIL_USER_LEN 220l // number of bytes available for user (valid data if READ, free buffer if WRITE) +#define SPC_TS_AVAIL_USER_POS 221l // the current byte position where the available user data starts +#define SPC_TS_AVAIL_CARD_LEN 222l // number of bytes available for card (free buffer if READ, filled data if WRITE) + + + +// Installation +#define SPC_VERSION 1000l +#define SPC_ISAADR 1010l +#define SPC_INSTMEM 1020l +#define SPC_INSTSAMPLERATE 1030l +#define SPC_BRDTYP 1040l + +// MI/MC/MX type information (internal use) +#define SPC_MIINST_MODULES 1100l +#define SPC_MIINST_CHPERMODULE 1110l +#define SPC_MIINST_BYTESPERSAMPLE 1120l +#define SPC_MIINST_BITSPERSAMPLE 1125l +#define SPC_MIINST_MAXADCVALUE 1126l +#define SPC_MIINST_MINADCLOCK 1130l +#define SPC_MIINST_MAXADCLOCK 1140l +#define SPC_MIINST_MINEXTCLOCK 1145l +#define SPC_MIINST_MAXEXTCLOCK 1146l +#define SPC_MIINST_MINSYNCCLOCK 1147l +#define SPC_MIINST_MINEXTREFCLOCK 1148l +#define SPC_MIINST_MAXEXTREFCLOCK 1149l +#define SPC_MIINST_QUARZ 1150l +#define SPC_MIINST_QUARZ2 1151l +#define SPC_MIINST_MINEXTCLOCK1 1152l +#define SPC_MIINST_FLAGS 1160l +#define SPC_MIINST_FIFOSUPPORT 1170l +#define SPC_MIINST_ISDEMOCARD 1175l + +// Driver information +#define SPC_GETDRVVERSION 1200l +#define SPC_GETKERNELVERSION 1210l +#define SPC_GETDRVTYPE 1220l +#define DRVTYP_DOS 0l +#define DRVTYP_LINUX32 1l +#define DRVTYP_VXD 2l +#define DRVTYP_NTLEGACY 3l +#define DRVTYP_WDM32 4l +#define DRVTYP_WDM64 5l +#define DRVTYP_WOW64 6l +#define DRVTYP_LINUX64 7l +#define DRVTYP_QNX32 8l +#define DRVTYP_QNX64 9l +#define SPC_GETCOMPATIBILITYVERSION 1230l +#define SPC_GETMINDRVVERSION 1240l + +// PCI, CompactPCI and PXI Installation Information +#define SPC_PCITYP 2000l + +// ***** available card function types ***** +#define SPC_FNCTYPE 2001l +#define SPCM_TYPE_AI 0x01 +#define SPCM_TYPE_AO 0x02 +#define SPCM_TYPE_DI 0x04 +#define SPCM_TYPE_DO 0x08 +#define SPCM_TYPE_DIO 0x10 + +#define SPC_PCIVERSION 2010l +#define SPC_PCIEXTVERSION 2011l +#define SPC_PCIMODULEVERSION 2012l +#define SPC_PCIMODULEBVERSION 2013l +#define SPC_BASEPCBVERSION 2014l +#define SPC_MODULEPCBVERSION 2015l +#define SPC_MODULEAPCBVERSION 2015l +#define SPC_MODULEBPCBVERSION 2016l +#define SPC_EXTPCBVERSION 2017l +#define SPC_PCIDIGVERSION 2018l +#define SPC_DIGPCBVERSION 2019l +#define SPC_PCIDATE 2020l +#define SPC_CALIBDATE 2025l +#define SPC_CALIBDATEONBOARD 2026l +#define SPC_PCISERIALNR 2030l +#define SPC_PCISERIALNO 2030l +#define SPC_PCIHWBUSNO 2040l +#define SPC_PCIHWDEVNO 2041l +#define SPC_PCIHWFNCNO 2042l +#define SPC_PCIHWSLOTNO 2043l +#define SPC_PCIEXPGENERATION 2050l +#define SPC_PCIEXPLANES 2051l +#define SPC_PCIEXPPAYLOAD 2052l +#define SPC_PCIEXPREADREQUESTSIZE 2053l +#define SPC_PCIEXPREADCOMPLBOUNDARY 2054l +#define SPC_PXIHWSLOTNO 2055l +#define SPC_PCISAMPLERATE 2100l +#define SPC_PCIMEMSIZE 2110l +#define SPC_PCIFEATURES 2120l +#define SPC_PCIEXTFEATURES 2121l +#define SPC_PCIINFOADR 2200l +#define SPC_PCIINTERRUPT 2300l +#define SPC_PCIBASEADR0 2400l +#define SPC_PCIBASEADR1 2401l +#define SPC_PCIREGION0 2410l +#define SPC_PCIREGION1 2411l +#define SPC_READTRGLVLCOUNT 2500l +#define SPC_READIRCOUNT 3000l +#define SPC_READUNIPOLAR0 3010l +#define SPC_READUNIPOLAR1 3020l +#define SPC_READUNIPOLAR2 3030l +#define SPC_READUNIPOLAR3 3040l +#define SPC_READMAXOFFSET 3100l + +#define SPC_READAIFEATURES 3101l +#define SPCM_AI_TERM 0x00000001 // input termination available +#define SPCM_AI_SE 0x00000002 // single-ended mode available +#define SPCM_AI_DIFF 0x00000004 // differential mode available +#define SPCM_AI_OFFSPERCENT 0x00000008 // offset programming is done in percent of input range +#define SPCM_AI_OFFSMV 0x00000010 // offset programming is done in mV absolut +#define SPCM_AI_OVERRANGEDETECT 0x00000020 // overrange detection is programmable +#define SPCM_AI_DCCOUPLING 0x00000040 // DC coupling available +#define SPCM_AI_ACCOUPLING 0x00000080 // AC coupling available +#define SPCM_AI_LOWPASS 0x00000100 // selectable low pass +#define SPCM_AI_ACDC_OFFS_COMP 0x00000200 // AC/DC offset compensation +#define SPCM_AI_DIFFMUX 0x00000400 // differential mode (two channels combined to one) available +#define SPCM_AI_GLOBALLOWPASS 0x00000800 // globally selectable low pass (all channels same setting) +#define SPCM_AI_AUTOCALOFFS 0x00001000 // automatic offset calibration in hardware +#define SPCM_AI_AUTOCALGAIN 0x00002000 // automatic gain calibration in hardware +#define SPCM_AI_AUTOCALOFFSNOIN 0x00004000 // automatic offset calibration with open inputs +#define SPCM_AI_HIGHIMP 0x00008000 // high impedance available +#define SPCM_AI_LOWIMP 0x00010000 // low impedance available (50 ohm) +#define SPCM_AI_DIGITALLOWPASS 0x00020000 // selectable digital low pass filter +#define SPCM_AI_INDIVPULSEWIDTH 0x00100000 // individual pulsewidth per channel available + +#define SPC_READAOFEATURES 3102l +#define SPCM_AO_SE 0x00000002 // single-ended mode available +#define SPCM_AO_DIFF 0x00000004 // differential mode available +#define SPCM_AO_PROGFILTER 0x00000008 // programmable filters available +#define SPCM_AO_PROGOFFSET 0x00000010 // programmable offset available +#define SPCM_AO_PROGGAIN 0x00000020 // programmable gain available +#define SPCM_AO_PROGSTOPLEVEL 0x00000040 // programmable stop level available +#define SPCM_AO_DOUBLEOUT 0x00000080 // double out mode available +#define SPCM_AO_ENABLEOUT 0x00000100 // outputs can be disabled/enabled + +#define SPC_READDIFEATURES 3103l +#define SPCM_DI_TERM 0x00000001 // input termination available +#define SPCM_DI_SE 0x00000002 // single-ended mode available +#define SPCM_DI_DIFF 0x00000004 // differential mode available +#define SPCM_DI_PROGTHRESHOLD 0x00000008 // programmable threshold available +#define SPCM_DI_HIGHIMP 0x00000010 // high impedance available +#define SPCM_DI_LOWIMP 0x00000020 // low impedance available +#define SPCM_DI_INDIVPULSEWIDTH 0x00100000 // individual pulsewidth per channel available +#define SPCM_DI_IOCHANNEL 0x00200000 // connected with DO channel + +#define SPC_READDOFEATURES 3104l +#define SPCM_DO_SE 0x00000002 // single-ended mode available +#define SPCM_DO_DIFF 0x00000004 // differential mode available +#define SPCM_DO_PROGSTOPLEVEL 0x00000008 // programmable stop level available +#define SPCM_DO_PROGOUTLEVELS 0x00000010 // programmable output levels (low + high) available +#define SPCM_DO_ENABLEMASK 0x00000020 // individual enable mask for each output channel +#define SPCM_DO_IOCHANNEL 0x00200000 // connected with DI channel + +#define SPC_READCHGROUPING 3110l +#define SPC_READAIPATHCOUNT 3120l // number of available analog input paths +#define SPC_READAIPATH 3121l // the current path for which all the settings are read + +#define SPCM_CUSTOMMOD 3130l +#define SPCM_CUSTOMMOD_BASE_MASK 0x000000FF +#define SPCM_CUSTOMMOD_MODULE_MASK 0x0000FF00 +#define SPCM_CUSTOMMOD_STARHUB_MASK 0x00FF0000 + +#define SPC_READRANGECH0_0 3200l +#define SPC_READRANGECH0_1 3201l +#define SPC_READRANGECH0_2 3202l +#define SPC_READRANGECH0_3 3203l +#define SPC_READRANGECH0_4 3204l +#define SPC_READRANGECH0_5 3205l +#define SPC_READRANGECH0_6 3206l +#define SPC_READRANGECH0_7 3207l +#define SPC_READRANGECH0_8 3208l +#define SPC_READRANGECH0_9 3209l +#define SPC_READRANGECH1_0 3300l +#define SPC_READRANGECH1_1 3301l +#define SPC_READRANGECH1_2 3302l +#define SPC_READRANGECH1_3 3303l +#define SPC_READRANGECH1_4 3304l +#define SPC_READRANGECH1_5 3305l +#define SPC_READRANGECH1_6 3306l +#define SPC_READRANGECH1_7 3307l +#define SPC_READRANGECH1_8 3308l +#define SPC_READRANGECH1_9 3309l +#define SPC_READRANGECH2_0 3400l +#define SPC_READRANGECH2_1 3401l +#define SPC_READRANGECH2_2 3402l +#define SPC_READRANGECH2_3 3403l +#define SPC_READRANGECH3_0 3500l +#define SPC_READRANGECH3_1 3501l +#define SPC_READRANGECH3_2 3502l +#define SPC_READRANGECH3_3 3503l + +#define SPC_READRANGEMIN0 4000l +#define SPC_READRANGEMIN99 4099l +#define SPC_READRANGEMAX0 4100l +#define SPC_READRANGEMAX99 4199l +#define SPC_READOFFSMIN0 4200l +#define SPC_READOFFSMIN99 4299l +#define SPC_READOFFSMAX0 4300l +#define SPC_READOFFSMAX99 4399l +#define SPC_PCICOUNTER 9000l +#define SPC_BUFFERPOS 9010l + +#define SPC_READAOGAINMIN 9100l +#define SPC_READAOGAINMAX 9110l +#define SPC_READAOOFFSETMIN 9120l +#define SPC_READAOOFFSETMAX 9130l + +#define SPC_CARDMODE 9500l // card modes as listed below +#define SPC_AVAILCARDMODES 9501l // list with available card modes + +// card modes +#define SPC_REC_STD_SINGLE 0x00000001 // singleshot recording to memory +#define SPC_REC_STD_MULTI 0x00000002 // multiple records to memory on each trigger event +#define SPC_REC_STD_GATE 0x00000004 // gated recording to memory on gate signal +#define SPC_REC_STD_ABA 0x00000008 // ABA: A slowly to extra FIFO, B to memory on each trigger event +#define SPC_REC_STD_SEGSTATS 0x00010000 // segment information stored on each trigger segment -> stored in on-board memory +#define SPC_REC_STD_AVERAGE 0x00020000 // multiple records summed to average memory on each trigger event -> stored in on-board memory +#define SPC_REC_STD_AVERAGE_16BIT 0x00080000 // multiple records summed to average memory on each trigger event -> stored in on-board memory +#define SPC_REC_STD_BOXCAR 0x00800000 // boxcar averaging + +#define SPC_REC_FIFO_SINGLE 0x00000010 // singleshot to FIFO on trigger event +#define SPC_REC_FIFO_MULTI 0x00000020 // multiple records to FIFO on each trigger event +#define SPC_REC_FIFO_GATE 0x00000040 // gated sampling to FIFO on gate signal +#define SPC_REC_FIFO_ABA 0x00000080 // ABA: A slowly to extra FIFO, B to FIFO on each trigger event +#define SPC_REC_FIFO_SEGSTATS 0x00100000 // segment information stored on each trigger segment -> streamed to host +#define SPC_REC_FIFO_AVERAGE 0x00200000 // multiple records summed to average memory on each trigger event -> streamed to host +#define SPC_REC_FIFO_AVERAGE_16BIT 0x00400000 // multiple records summed to average memory on each trigger event -> streamed to host +#define SPC_REC_FIFO_BOXCAR 0x01000000 // boxcar averaging FIFO mode +#define SPC_REC_FIFO_SINGLE_MONITOR 0x02000000 // like SPC_REC_FIFO_SINGLE but with additional slow A data stream for monitoring + +#define SPC_REP_STD_SINGLE 0x00000100 // single replay from memory on trigger event +#define SPC_REP_STD_MULTI 0x00000200 // multiple replay from memory on each trigger event +#define SPC_REP_STD_GATE 0x00000400 // gated replay from memory on gate signal + +#define SPC_REP_FIFO_SINGLE 0x00000800 // single replay from FIFO on trigger event +#define SPC_REP_FIFO_MULTI 0x00001000 // multiple replay from FIFO on each trigger event +#define SPC_REP_FIFO_GATE 0x00002000 // gated replay from FIFO on gate signal + +#define SPC_REP_STD_CONTINUOUS 0x00004000 // continuous replay started by one trigger event +#define SPC_REP_STD_SINGLERESTART 0x00008000 // single replays on every detected trigger event +#define SPC_REP_STD_SEQUENCE 0x00040000 // sequence mode replay + +// Waveforms for demo cards +#define SPC_DEMOWAVEFORM 9600l +#define SPC_AVAILDEMOWAVEFORMS 9601l +#define SPCM_DEMOWAVEFORM_SINE 0x00000001 +#define SPCM_DEMOWAVEFORM_RECT 0x00000002 +#define SPCM_DEMOWAVEFORM_TRIANGLE 0x00000004 + + +// Memory +#define SPC_MEMSIZE 10000l +#define SPC_SEGMENTSIZE 10010l +#define SPC_LOOPS 10020l +#define SPC_PRETRIGGER 10030l +#define SPC_ABADIVIDER 10040l +#define SPC_AVERAGES 10050l +#define SPC_BOX_AVERAGES 10060l +#define SPC_SEGSPLIT_START 10070l +#define SPC_SEGSPLIT_PAUSE 10071l +#define SPC_POSTTRIGGER 10100l +#define SPC_STARTOFFSET 10200l + +// Memory info (depends on mode and channelenable) +#define SPC_AVAILMEMSIZE_MIN 10201l +#define SPC_AVAILMEMSIZE_MAX 10202l +#define SPC_AVAILMEMSIZE_STEP 10203l +#define SPC_AVAILPOSTTRIGGER_MIN 10204l +#define SPC_AVAILPOSTTRIGGER_MAX 10205l +#define SPC_AVAILPOSTTRIGGER_STEP 10206l + +#define SPC_AVAILABADIVIDER_MIN 10207l +#define SPC_AVAILABADIVIDER_MAX 10208l +#define SPC_AVAILABADIVIDER_STEP 10209l + +#define SPC_AVAILLOOPS_MIN 10210l +#define SPC_AVAILLOOPS_MAX 10211l +#define SPC_AVAILLOOPS_STEP 10212l + +#define SPC_AVAILAVERAGES_MIN 10220l +#define SPC_AVAILAVERAGES_MAX 10221l +#define SPC_AVAILAVERAGES_STEP 10222l + +#define SPC_AVAILAVRGSEGSIZE_MIN 10223l +#define SPC_AVAILAVRGSEGSIZE_MAX 10224l +#define SPC_AVAILAVRGSEGSIZE_STEP 10225l + +#define SPC_AVAILAVERAGES16BIT_MIN 10226l +#define SPC_AVAILAVERAGES16BIT_MAX 10227l +#define SPC_AVAILAVERAGES16BIT_STEP 10228l + +#define SPC_AVAILAVRG16BITSEGSIZE_MIN 10229l +#define SPC_AVAILAVRG16BITSEGSIZE_MAX 10230l +#define SPC_AVAILAVRG16BITSEGSIZE_STEP 10231l + +#define SPC_AVAILBOXCARAVERAGES_MIN 10232l +#define SPC_AVAILBOXCARAVERAGES_MAX 10233l +#define SPC_AVAILBOXCARAVERAGES_STEPFACTOR 10234l + + +// Channels +#define SPC_CHENABLE 11000l +#define SPC_CHCOUNT 11001l +#define SPC_CHMODACOUNT 11100l +#define SPC_CHMODBCOUNT 11101l + + +// ----- channel enable flags for A/D and D/A boards (MI/MC/MX series) ----- +// and all cards on M2i series +#define CHANNEL0 0x00000001 +#define CHANNEL1 0x00000002 +#define CHANNEL2 0x00000004 +#define CHANNEL3 0x00000008 +#define CHANNEL4 0x00000010 +#define CHANNEL5 0x00000020 +#define CHANNEL6 0x00000040 +#define CHANNEL7 0x00000080 +#define CHANNEL8 0x00000100 +#define CHANNEL9 0x00000200 +#define CHANNEL10 0x00000400 +#define CHANNEL11 0x00000800 +#define CHANNEL12 0x00001000 +#define CHANNEL13 0x00002000 +#define CHANNEL14 0x00004000 +#define CHANNEL15 0x00008000 +#define CHANNEL16 0x00010000 +#define CHANNEL17 0x00020000 +#define CHANNEL18 0x00040000 +#define CHANNEL19 0x00080000 +#define CHANNEL20 0x00100000 +#define CHANNEL21 0x00200000 +#define CHANNEL22 0x00400000 +#define CHANNEL23 0x00800000 +#define CHANNEL24 0x01000000 +#define CHANNEL25 0x02000000 +#define CHANNEL26 0x04000000 +#define CHANNEL27 0x08000000 +#define CHANNEL28 0x10000000 +#define CHANNEL29 0x20000000 +#define CHANNEL30 0x40000000 +#define CHANNEL31 0x80000000 +// CHANNEL32 up to CHANNEL63 are placed in the upper 32 bit of a 64 bit word (M2i only) + + +// ----- old digital i/o settings for 16 bit implementation (MI/MC/MX series) ----- +#define CH0_8BITMODE 65536l // for MI.70xx only +#define CH0_16BIT 1l +#define CH0_32BIT 3l +#define CH1_16BIT 4l +#define CH1_32BIT 12l + +// ----- new digital i/o settings for 8 bit implementation (MI/MC/MX series) ----- +#define MOD0_8BIT 1l +#define MOD0_16BIT 3l +#define MOD0_32BIT 15l +#define MOD1_8BIT 16l +#define MOD1_16BIT 48l +#define MOD1_32BIT 240l + +#define SPC_CHROUTE0 11010l +#define SPC_CHROUTE1 11020l + +#define SPC_BITENABLE 11030l + + + +// ----- Clock Settings ----- +#define SPC_SAMPLERATE 20000l +#define SPC_SYNCCLOCK 20005l +#define SPC_SAMPLERATE2 20010l +#define SPC_SR2 20020l +#define SPC_PLL_ENABLE 20030l +#define SPC_PLL_ISLOCKED 20031l +#define SPC_CLOCKDIV 20040l +#define SPC_INTCLOCKDIV 20041l +#define SPC_PXICLOCKDIV 20042l +#define SPC_PLL_R 20060l +#define SPC_PLL_F 20061l +#define SPC_PLL_S 20062l +#define SPC_PLL_DIV 20063l +#define SPC_PXI_CLK_OUT 20090l +#define SPC_EXTERNALCLOCK 20100l +#define SPC_EXTERNOUT 20110l +#define SPC_CLOCKOUT 20110l +#define SPC_CLOCKOUTFREQUENCY 20111l +#define SPC_CLOCK50OHM 20120l +#define SPC_CLOCK110OHM 20120l +#define SPC_CLOCK75OHM 20120l +#define SPC_STROBE75OHM 20121l +#define SPC_EXTERNRANGE 20130l +#define SPC_EXTRANGESHDIRECT 20131l +#define EXRANGE_NONE 0l +#define EXRANGE_NOPLL 1l +#define EXRANGE_SINGLE 2l +#define EXRANGE_BURST_S 4l +#define EXRANGE_BURST_M 8l +#define EXRANGE_BURST_L 16l +#define EXRANGE_BURST_XL 32l +#define EXRANGE_LOW 64l +#define EXRANGE_HIGH 128l +#define EXRANGE_LOW_DPS 256l // digital phase synchronization +#define SPC_REFERENCECLOCK 20140l +#define REFCLOCK_PXI -1l + +// ----- new clock registers starting with M2i cards ----- +#define SPC_CLOCKMODE 20200l // clock mode as listed below +#define SPC_AVAILCLOCKMODES 20201l // returns all available clock modes +#define SPC_CM_INTPLL 0x00000001 // use internal PLL +#define SPC_CM_QUARTZ1 0x00000002 // use plain quartz1 (with divider) +#define SPC_CM_QUARTZ2 0x00000004 // use plain quartz2 (with divider) +#define SPC_CM_EXTERNAL 0x00000008 // use external clock directly +#define SPC_CM_EXTERNAL0 0x00000008 // use external clock0 directly (identical value to SPC_CM_EXTERNAL) +#define SPC_CM_EXTDIVIDER 0x00000010 // use external clock with programmed divider +#define SPC_CM_EXTREFCLOCK 0x00000020 // external reference clock fed in (defined with SPC_REFERENCECLOCK) +#define SPC_CM_PXIREFCLOCK 0x00000040 // PXI reference clock +#define SPC_CM_SHDIRECT 0x00000080 // Star-hub direct clock (not synchronised) +#define SPC_CM_QUARTZ2_DIRSYNC 0x00000100 // use plain quartz2 (with divider) and put the Q2 clock on the star-hub module +#define SPC_CM_QUARTZ1_DIRSYNC 0x00000200 // use plain quartz1 (with divider) and put the Q1 clock on the star-hub module +#define SPC_CM_EXTERNAL1 0x00000400 // use external clock1 directly + +#define SPC_CLOCK_READFEATURES 20205l +#define SPC_CLOCK_READFEATURES0 20205l +#define SPC_CLOCK_READFEATURES1 20206l +#define SPCM_CKFEAT_TERM 0x00000001 +#define SPCM_CKFEAT_HIGHIMP 0x00000002 +#define SPCM_CKFEAT_DCCOUPLING 0x00000004 +#define SPCM_CKFEAT_ACCOUPLING 0x00000008 +#define SPCM_CKFEAT_SE 0x00000010 +#define SPCM_CKFEAT_DIFF 0x00000020 +#define SPCM_CKFEAT_PROGEDGE 0x00000040 +#define SPCM_CKFEAT_LEVELPROG 0x00000100 +#define SPCM_CKFEAT_PROGTHRESHOLD 0x00000200 +#define SPCM_CKFEAT_PROGDELAY 0x00000400 + +// ----- internal use only! ----- +#define SPC_CM_SYNCINT 0x01000000 +#define SPC_CM_SYNCEXT 0x02000000 +#define SPC_BURSTSYSCLOCKMODE 20210l +#define SPC_SYNCMASTERSYSCLOCKMODE 20211l +#define SPC_CLOCK_SETUP_CHANGED 20212l + +// clock delay if available +#define SPC_CLOCK_AVAILDELAY_MIN 20220l +#define SPC_CLOCK_AVAILDELAY_MAX 20221l +#define SPC_CLOCK_AVAILDELAY_STEP 20222l +#define SPC_CLOCK_DELAY 20223l + +// clock edges +#define SPC_AVAILCLOCKEDGES 20224l +#define SPCM_RISING_EDGE 0x00000001 +#define SPCM_FALLING_EDGE 0x00000002 +#define SPCM_BOTH_EDGES 0x00000004 +#define SPC_CLOCK_EDGE 20225l + +// mux definitions for channel routing +#define SPC_CHANNELMUXINFO 20300l +#define SPCM_MUX_NONE 0x00000000 // nothing is interlaced +#define SPCM_MUX_MUXONMOD 0x00000001 // data on module is multiplexed, only one channel can have full speed +#define SPCM_MUX_INVERTCLKONMOD 0x00000002 // two channels on one module run with inverted clock +#define SPCM_MUX_DLY 0x00000003 // delay cable between modules, one channel can have full interlace speed +#define SPCM_MUX_DLYANDMUXONMOD 0x00000004 // delay cable between modules and multplexing on module +#define SPCM_MUX_MUXBETWEENMODS 0x00000005 // multiplexed between modules (fastest sampling rate only with one module) +#define SPCM_MUX_MUXONMOD2CH 0x00000006 // data on module is multiplexed, only two channel can have full speed +#define SPCM_MUX_MAX4CH 0x00000007 // only four channels can have full speed, independent of distribution on modules + + +// ----- In/Out Range ----- +#define SPC_OFFS0 30000l +#define SPC_AMP0 30010l +#define SPC_ACDC0 30020l +#define SPC_ACDC_OFFS_COMPENSATION0 30021l +#define SPC_50OHM0 30030l +#define SPC_DIFF0 30040l +#define SPC_DOUBLEOUT0 30041l +#define SPC_DIGITAL0 30050l +#define SPC_110OHM0 30060l +#define SPC_110OHM0L 30060l +#define SPC_75OHM0 30060l +#define SPC_INOUT0 30070l +#define SPC_FILTER0 30080l +#define SPC_BANKSWITCH0 30081l +#define SPC_PATH0 30090l +#define SPC_ENABLEOUT0 30091l + +#define SPC_OFFS1 30100l +#define SPC_AMP1 30110l +#define SPC_ACDC1 30120l +#define SPC_ACDC_OFFS_COMPENSATION1 30121l +#define SPC_50OHM1 30130l +#define SPC_DIFF1 30140l +#define SPC_DOUBLEOUT1 30141l +#define SPC_DIGITAL1 30150l +#define SPC_110OHM1 30160l +#define SPC_110OHM0H 30160l +#define SPC_75OHM1 30160l +#define SPC_INOUT1 30170l +#define SPC_FILTER1 30180l +#define SPC_BANKSWITCH1 30181l +#define SPC_PATH1 30190l +#define SPC_ENABLEOUT1 30191l + +#define SPC_OFFS2 30200l +#define SPC_AMP2 30210l +#define SPC_ACDC2 30220l +#define SPC_ACDC_OFFS_COMPENSATION2 30221l +#define SPC_50OHM2 30230l +#define SPC_DIFF2 30240l +#define SPC_DOUBLEOUT2 30241l +#define SPC_110OHM2 30260l +#define SPC_110OHM1L 30260l +#define SPC_75OHM2 30260l +#define SPC_INOUT2 30270l +#define SPC_FILTER2 30280l +#define SPC_BANKSWITCH2 30281l +#define SPC_PATH2 30290l +#define SPC_ENABLEOUT2 30291l + +#define SPC_OFFS3 30300l +#define SPC_AMP3 30310l +#define SPC_ACDC3 30320l +#define SPC_ACDC_OFFS_COMPENSATION3 30321l +#define SPC_50OHM3 30330l +#define SPC_DIFF3 30340l +#define SPC_DOUBLEOUT3 30341l +#define SPC_110OHM3 30360l +#define SPC_110OHM1H 30360l +#define SPC_75OHM3 30360l +#define SPC_INOUT3 30370l +#define SPC_FILTER3 30380l +#define SPC_BANKSWITCH3 30381l +#define SPC_PATH3 30390l +#define SPC_ENABLEOUT3 30391l + +#define SPC_OFFS4 30400l +#define SPC_AMP4 30410l +#define SPC_ACDC4 30420l +#define SPC_50OHM4 30430l +#define SPC_DIFF4 30440l +#define SPC_DOUBLEOUT4 30441l +#define SPC_FILTER4 30480l +#define SPC_ENABLEOUT4 30491l +#define SPC_PATH4 30490l + +#define SPC_OFFS5 30500l +#define SPC_AMP5 30510l +#define SPC_ACDC5 30520l +#define SPC_50OHM5 30530l +#define SPC_DIFF5 30540l +#define SPC_DOUBLEOUT5 30541l +#define SPC_FILTER5 30580l +#define SPC_ENABLEOUT5 30591l +#define SPC_PATH5 30590l + +#define SPC_OFFS6 30600l +#define SPC_AMP6 30610l +#define SPC_ACDC6 30620l +#define SPC_50OHM6 30630l +#define SPC_DIFF6 30640l +#define SPC_DOUBLEOUT6 30641l +#define SPC_FILTER6 30680l +#define SPC_ENABLEOUT6 30691l +#define SPC_PATH6 30690l + +#define SPC_OFFS7 30700l +#define SPC_AMP7 30710l +#define SPC_ACDC7 30720l +#define SPC_50OHM7 30730l +#define SPC_DIFF7 30740l +#define SPC_DOUBLEOUT7 30741l +#define SPC_FILTER7 30780l +#define SPC_ENABLEOUT7 30791l +#define SPC_PATH7 30790l + +#define SPC_OFFS8 30800l +#define SPC_AMP8 30810l +#define SPC_ACDC8 30820l +#define SPC_50OHM8 30830l +#define SPC_DIFF8 30840l +#define SPC_PATH8 30890l + +#define SPC_OFFS9 30900l +#define SPC_AMP9 30910l +#define SPC_ACDC9 30920l +#define SPC_50OHM9 30930l +#define SPC_DIFF9 30940l +#define SPC_PATH9 30990l + +#define SPC_OFFS10 31000l +#define SPC_AMP10 31010l +#define SPC_ACDC10 31020l +#define SPC_50OHM10 31030l +#define SPC_DIFF10 31040l +#define SPC_PATH10 31090l + +#define SPC_OFFS11 31100l +#define SPC_AMP11 31110l +#define SPC_ACDC11 31120l +#define SPC_50OHM11 31130l +#define SPC_DIFF11 31140l +#define SPC_PATH11 31190l + +#define SPC_OFFS12 31200l +#define SPC_AMP12 31210l +#define SPC_ACDC12 31220l +#define SPC_50OHM12 31230l +#define SPC_DIFF12 31240l +#define SPC_PATH12 31290l + +#define SPC_OFFS13 31300l +#define SPC_AMP13 31310l +#define SPC_ACDC13 31320l +#define SPC_50OHM13 31330l +#define SPC_DIFF13 31340l +#define SPC_PATH13 31390l + +#define SPC_OFFS14 31400l +#define SPC_AMP14 31410l +#define SPC_ACDC14 31420l +#define SPC_50OHM14 31430l +#define SPC_DIFF14 31440l +#define SPC_PATH14 31490l + +#define SPC_OFFS15 31500l +#define SPC_AMP15 31510l +#define SPC_ACDC15 31520l +#define SPC_50OHM15 31530l +#define SPC_DIFF15 31540l +#define SPC_PATH15 31590l + +#define SPC_110OHMTRIGGER 30400l +#define SPC_110OHMCLOCK 30410l + + +#define AMP_BI200 200l +#define AMP_BI500 500l +#define AMP_BI1000 1000l +#define AMP_BI2000 2000l +#define AMP_BI2500 2500l +#define AMP_BI4000 4000l +#define AMP_BI5000 5000l +#define AMP_BI10000 10000l +#define AMP_UNI400 100400l +#define AMP_UNI1000 101000l +#define AMP_UNI2000 102000l + + +// ----- Trigger Settings ----- +#define SPC_TRIGGERMODE 40000l +#define SPC_TRIG_OUTPUT 40100l +#define SPC_TRIGGEROUT 40100l +#define SPC_TRIG_TERM 40110l +#define SPC_TRIG_TERM0 40110l +#define SPC_TRIGGER50OHM 40110l +#define SPC_TRIGGER110OHM0 40110l +#define SPC_TRIGGER75OHM0 40110l +#define SPC_TRIG_TERM1 40111l +#define SPC_TRIGGER110OHM1 40111l +#define SPC_TRIG_EXT0_ACDC 40120l +#define SPC_TRIG_EXT1_ACDC 40121l +#define SPC_TRIG_EXT2_ACDC 40122l + +#define SPC_TRIGGERMODE0 40200l +#define SPC_TRIGGERMODE1 40201l +#define SPC_TRIGGERMODE2 40202l +#define SPC_TRIGGERMODE3 40203l +#define SPC_TRIGGERMODE4 40204l +#define SPC_TRIGGERMODE5 40205l +#define SPC_TRIGGERMODE6 40206l +#define SPC_TRIGGERMODE7 40207l +#define SPC_TRIGGERMODE8 40208l +#define SPC_TRIGGERMODE9 40209l +#define SPC_TRIGGERMODE10 40210l +#define SPC_TRIGGERMODE11 40211l +#define SPC_TRIGGERMODE12 40212l +#define SPC_TRIGGERMODE13 40213l +#define SPC_TRIGGERMODE14 40214l +#define SPC_TRIGGERMODE15 40215l + +#define TM_SOFTWARE 0l +#define TM_NOTRIGGER 10l +#define TM_CHXPOS 10000l +#define TM_CHXPOS_LP 10001l +#define TM_CHXPOS_SP 10002l +#define TM_CHXPOS_GS 10003l +#define TM_CHXPOS_SS 10004l +#define TM_CHXNEG 10010l +#define TM_CHXNEG_LP 10011l +#define TM_CHXNEG_SP 10012l +#define TM_CHXNEG_GS 10013l +#define TM_CHXNEG_SS 10014l +#define TM_CHXOFF 10020l +#define TM_CHXBOTH 10030l +#define TM_CHXWINENTER 10040l +#define TM_CHXWINENTER_LP 10041l +#define TM_CHXWINENTER_SP 10042l +#define TM_CHXWINLEAVE 10050l +#define TM_CHXWINLEAVE_LP 10051l +#define TM_CHXWINLEAVE_SP 10052l +#define TM_CHXLOW 10060l +#define TM_CHXHIGH 10061l +#define TM_CHXINWIN 10062l +#define TM_CHXOUTWIN 10063l +#define TM_CHXSPIKE 10064l + + +#define TM_CH0POS 10000l +#define TM_CH0NEG 10010l +#define TM_CH0OFF 10020l +#define TM_CH0BOTH 10030l +#define TM_CH1POS 10100l +#define TM_CH1NEG 10110l +#define TM_CH1OFF 10120l +#define TM_CH1BOTH 10130l +#define TM_CH2POS 10200l +#define TM_CH2NEG 10210l +#define TM_CH2OFF 10220l +#define TM_CH2BOTH 10230l +#define TM_CH3POS 10300l +#define TM_CH3NEG 10310l +#define TM_CH3OFF 10320l +#define TM_CH3BOTH 10330l + +#define TM_TTLPOS 20000l +#define TM_TTLHIGH_LP 20001l +#define TM_TTLHIGH_SP 20002l +#define TM_TTLNEG 20010l +#define TM_TTLLOW_LP 20011l +#define TM_TTLLOW_SP 20012l +#define TM_TTL 20020l +#define TM_TTLBOTH 20030l +#define TM_TTLBOTH_LP 20031l +#define TM_TTLBOTH_SP 20032l +#define TM_CHANNEL 20040l +#define TM_TTLHIGH 20050l +#define TM_TTLLOW 20051l +#define TM_PATTERN 21000l +#define TM_PATTERN_LP 21001l +#define TM_PATTERN_SP 21002l +#define TM_PATTERNANDEDGE 22000l +#define TM_PATTERNANDEDGE_LP 22001l +#define TM_PATTERNANDEDGE_SP 22002l +#define TM_GATELOW 30000l +#define TM_GATEHIGH 30010l +#define TM_GATEPATTERN 30020l +#define TM_CHOR 35000l +#define TM_CHAND 35010l +#define TM_CHORTTLPOS 35020l +#define TM_CHORTTLNEG 35021l + +#define SPC_PXITRGOUT 40300l +#define PTO_OFF 0l +#define PTO_LINE0 1l +#define PTO_LINE1 2l +#define PTO_LINE2 3l +#define PTO_LINE3 4l +#define PTO_LINE4 5l +#define PTO_LINE5 6l +#define PTO_LINE6 7l +#define PTO_LINE7 8l +#define PTO_LINESTAR 9l +#define SPC_PXITRGOUT_AVAILABLE 40301l // bitmap register + +#define SPC_PXISTARTRG_DIVRST_OUT 40302l // bitmap register +#define SPC_PXISTARTRG_DIVRST_OUT_AVAILABLE 40303l +#define SPC_PXISTARTRG_OUT 40304l // bitmap register +#define PSTO_LINESTAR0 0x00000001 +#define PSTO_LINESTAR1 0x00000002 +#define PSTO_LINESTAR2 0x00000004 +#define PSTO_LINESTAR3 0x00000008 +#define PSTO_LINESTAR4 0x00000010 +#define PSTO_LINESTAR5 0x00000020 +#define PSTO_LINESTAR6 0x00000040 +#define PSTO_LINESTAR7 0x00000080 +#define PSTO_LINESTAR8 0x00000100 +#define PSTO_LINESTAR9 0x00000200 +#define PSTO_LINESTAR10 0x00000400 +#define PSTO_LINESTAR11 0x00000800 +#define PSTO_LINESTAR12 0x00001000 +#define PSTO_LINE0 0x00010000 +#define PSTO_LINE1 0x00020000 +#define PSTO_LINE2 0x00040000 +#define PSTO_LINE3 0x00080000 +#define PSTO_LINE4 0x00100000 +#define PSTO_LINE5 0x00200000 +#define PSTO_LINE6 0x00400000 +#define PSTO_LINE7 0x00800000 +#define SPC_PXISTARTRG_OUT_AVAILABLE 40305l + +#define SPC_PXITRGIN 40310l // bitmap register +#define PTI_OFF 0l +#define PTI_LINE0 1l +#define PTI_LINE1 2l +#define PTI_LINE2 4l +#define PTI_LINE3 8l +#define PTI_LINE4 16l +#define PTI_LINE5 32l +#define PTI_LINE6 64l +#define PTI_LINE7 128l +#define PTI_LINESTAR 256l +#define SPC_PXITRGIN_AVAILABLE 40311l // bitmap register +#define SPC_PXI_DIVIDER_RESET_IN 40320l +#define SPC_PXI_DIVIDER_RESET_IN_AVAILABLE 40321l + + +// new registers of M2i driver +#define SPC_TRIG_AVAILORMASK 40400l +#define SPC_TRIG_ORMASK 40410l +#define SPC_TRIG_AVAILANDMASK 40420l +#define SPC_TRIG_ANDMASK 40430l +#define SPC_TMASK_NONE 0x00000000 +#define SPC_TMASK_SOFTWARE 0x00000001 +#define SPC_TMASK_EXT0 0x00000002 +#define SPC_TMASK_EXT1 0x00000004 +#define SPC_TMASK_EXT2 0x00000008 +#define SPC_TMASK_EXT3 0x00000010 +#define SPC_TMASK_XIO0 0x00000100 +#define SPC_TMASK_XIO1 0x00000200 +#define SPC_TMASK_XIO2 0x00000400 +#define SPC_TMASK_XIO3 0x00000800 +#define SPC_TMASK_XIO4 0x00001000 +#define SPC_TMASK_XIO5 0x00002000 +#define SPC_TMASK_XIO6 0x00004000 +#define SPC_TMASK_XIO7 0x00008000 +#define SPC_TMASK_PXI0 0x00100000 +#define SPC_TMASK_PXI1 0x00200000 +#define SPC_TMASK_PXI2 0x00400000 +#define SPC_TMASK_PXI3 0x00800000 +#define SPC_TMASK_PXI4 0x01000000 +#define SPC_TMASK_PXI5 0x02000000 +#define SPC_TMASK_PXI6 0x04000000 +#define SPC_TMASK_PXI7 0x08000000 +#define SPC_TMASK_PXISTAR 0x10000000 +#define SPC_TMASK_PXIDSTARB 0x20000000 + +#define SPC_TRIG_CH_AVAILORMASK0 40450l +#define SPC_TRIG_CH_AVAILORMASK1 40451l +#define SPC_TRIG_CH_ORMASK0 40460l +#define SPC_TRIG_CH_ORMASK1 40461l +#define SPC_TRIG_CH_AVAILANDMASK0 40470l +#define SPC_TRIG_CH_AVAILANDMASK1 40471l +#define SPC_TRIG_CH_ANDMASK0 40480l +#define SPC_TRIG_CH_ANDMASK1 40481l +#define SPC_TMASK0_NONE 0x00000000 +#define SPC_TMASK0_CH0 0x00000001 +#define SPC_TMASK0_CH1 0x00000002 +#define SPC_TMASK0_CH2 0x00000004 +#define SPC_TMASK0_CH3 0x00000008 +#define SPC_TMASK0_CH4 0x00000010 +#define SPC_TMASK0_CH5 0x00000020 +#define SPC_TMASK0_CH6 0x00000040 +#define SPC_TMASK0_CH7 0x00000080 +#define SPC_TMASK0_CH8 0x00000100 +#define SPC_TMASK0_CH9 0x00000200 +#define SPC_TMASK0_CH10 0x00000400 +#define SPC_TMASK0_CH11 0x00000800 +#define SPC_TMASK0_CH12 0x00001000 +#define SPC_TMASK0_CH13 0x00002000 +#define SPC_TMASK0_CH14 0x00004000 +#define SPC_TMASK0_CH15 0x00008000 +#define SPC_TMASK0_CH16 0x00010000 +#define SPC_TMASK0_CH17 0x00020000 +#define SPC_TMASK0_CH18 0x00040000 +#define SPC_TMASK0_CH19 0x00080000 +#define SPC_TMASK0_CH20 0x00100000 +#define SPC_TMASK0_CH21 0x00200000 +#define SPC_TMASK0_CH22 0x00400000 +#define SPC_TMASK0_CH23 0x00800000 +#define SPC_TMASK0_CH24 0x01000000 +#define SPC_TMASK0_CH25 0x02000000 +#define SPC_TMASK0_CH26 0x04000000 +#define SPC_TMASK0_CH27 0x08000000 +#define SPC_TMASK0_CH28 0x10000000 +#define SPC_TMASK0_CH29 0x20000000 +#define SPC_TMASK0_CH30 0x40000000 +#define SPC_TMASK0_CH31 0x80000000 + +#define SPC_TMASK1_NONE 0x00000000 +#define SPC_TMASK1_CH32 0x00000001 +#define SPC_TMASK1_CH33 0x00000002 +#define SPC_TMASK1_CH34 0x00000004 +#define SPC_TMASK1_CH35 0x00000008 +#define SPC_TMASK1_CH36 0x00000010 +#define SPC_TMASK1_CH37 0x00000020 +#define SPC_TMASK1_CH38 0x00000040 +#define SPC_TMASK1_CH39 0x00000080 +#define SPC_TMASK1_CH40 0x00000100 +#define SPC_TMASK1_CH41 0x00000200 +#define SPC_TMASK1_CH42 0x00000400 +#define SPC_TMASK1_CH43 0x00000800 +#define SPC_TMASK1_CH44 0x00001000 +#define SPC_TMASK1_CH45 0x00002000 +#define SPC_TMASK1_CH46 0x00004000 +#define SPC_TMASK1_CH47 0x00008000 +#define SPC_TMASK1_CH48 0x00010000 +#define SPC_TMASK1_CH49 0x00020000 +#define SPC_TMASK1_CH50 0x00040000 +#define SPC_TMASK1_CH51 0x00080000 +#define SPC_TMASK1_CH52 0x00100000 +#define SPC_TMASK1_CH53 0x00200000 +#define SPC_TMASK1_CH54 0x00400000 +#define SPC_TMASK1_CH55 0x00800000 +#define SPC_TMASK1_CH56 0x01000000 +#define SPC_TMASK1_CH57 0x02000000 +#define SPC_TMASK1_CH58 0x04000000 +#define SPC_TMASK1_CH59 0x08000000 +#define SPC_TMASK1_CH60 0x10000000 +#define SPC_TMASK1_CH61 0x20000000 +#define SPC_TMASK1_CH62 0x40000000 +#define SPC_TMASK1_CH63 0x80000000 + +#define SPC_TRIG_EXT_AVAILMODES 40500l +#define SPC_TRIG_EXT0_AVAILMODES 40500l +#define SPC_TRIG_EXT1_AVAILMODES 40501l +#define SPC_TRIG_EXT2_AVAILMODES 40502l +#define SPC_TRIG_EXT0_AVAILMODESOR 40503l +#define SPC_TRIG_EXT1_AVAILMODESOR 40504l +#define SPC_TRIG_EXT2_AVAILMODESOR 40505l +#define SPC_TRIG_EXT0_AVAILMODESAND 40506l +#define SPC_TRIG_EXT1_AVAILMODESAND 40507l +#define SPC_TRIG_EXT2_AVAILMODESAND 40508l +#define SPC_TRIG_EXT3_AVAILMODESAND 40509l +#define SPC_TRIG_EXT0_MODE 40510l +#define SPC_TRIG_EXT1_MODE 40511l +#define SPC_TRIG_EXT2_MODE 40512l +#define SPC_TRIG_EXT3_MODE 40513l +#define SPC_TRIG_EXT3_AVAILMODES 40514l +#define SPC_TRIG_EXT3_AVAILMODESOR 40515l + +#define SPC_TRIG_EXT0_READFEATURES 40520l +#define SPC_TRIG_EXT1_READFEATURES 40521l +#define SPC_TRIG_EXT2_READFEATURES 40522l +#define SPC_TRIG_EXT3_READFEATURES 40523l +#define SPCM_TRFEAT_TERM 0x00000001 +#define SPCM_TRFEAT_HIGHIMP 0x00000002 +#define SPCM_TRFEAT_DCCOUPLING 0x00000004 +#define SPCM_TRFEAT_ACCOUPLING 0x00000008 +#define SPCM_TRFEAT_SE 0x00000010 +#define SPCM_TRFEAT_DIFF 0x00000020 +#define SPCM_TRFEAT_LEVELPROG 0x00000100 +#define SPCM_TRFEAT_PROGTHRESHOLD 0x00000200 + +// legacy constants: not enough contiguous constants possible for X4..X19 +#define SPC_LEGACY_X0_READFEATURES 40530l +#define SPC_LEGACY_X1_READFEATURES 40531l +#define SPC_LEGACY_X2_READFEATURES 40532l +#define SPC_LEGACY_X3_READFEATURES 40533l + +// legacy constants: not enough contiguous constants possible for X4..X19 +#define SPC_LEGACY_X0_TERM 40535l +#define SPC_LEGACY_X1_TERM 40536l +#define SPC_LEGACY_X2_TERM 40537l +#define SPC_LEGACY_X3_TERM 40538l + +#define SPC_TRIG_XIO_AVAILMODES 40550l +#define SPC_TRIG_XIO_AVAILMODESOR 40551l +#define SPC_TRIG_XIO_AVAILMODESAND 40552l +#define SPC_TRIG_XIO0_MODE 40560l +#define SPC_TRIG_XIO1_MODE 40561l +#define SPC_TM_MODEMASK 0x00FFFFFF +#define SPC_TM_NONE 0x00000000 +#define SPC_TM_POS 0x00000001 +#define SPC_TM_NEG 0x00000002 +#define SPC_TM_BOTH 0x00000004 +#define SPC_TM_HIGH 0x00000008 +#define SPC_TM_LOW 0x00000010 +#define SPC_TM_WINENTER 0x00000020 +#define SPC_TM_WINLEAVE 0x00000040 +#define SPC_TM_INWIN 0x00000080 +#define SPC_TM_OUTSIDEWIN 0x00000100 +#define SPC_TM_SPIKE 0x00000200 +#define SPC_TM_PATTERN 0x00000400 +#define SPC_TM_STEEPPOS 0x00000800 +#define SPC_TM_STEEPNEG 0x00001000 +#define SPC_TM_EXTRAMASK 0xFF000000 +#define SPC_TM_REARM 0x01000000 +#define SPC_TM_PW_SMALLER 0x02000000 +#define SPC_TM_PW_GREATER 0x04000000 +#define SPC_TM_DOUBLEEDGE 0x08000000 +#define SPC_TM_PULSESTRETCH 0x10000000 +#define SPC_TM_HYSTERESIS 0x20000000 + +#define SPC_TRIG_PATTERN_AVAILMODES 40580l +#define SPC_TRIG_PATTERN_MODE 40590l + +#define SPC_TRIG_CH_AVAILMODES 40600l +#define SPC_TRIG_CH_AVAILMODESOR 40601l +#define SPC_TRIG_CH_AVAILMODESAND 40602l +#define SPC_TRIG_CH0_MODE 40610l +#define SPC_TRIG_CH1_MODE 40611l +#define SPC_TRIG_CH2_MODE 40612l +#define SPC_TRIG_CH3_MODE 40613l +#define SPC_TRIG_CH4_MODE 40614l +#define SPC_TRIG_CH5_MODE 40615l +#define SPC_TRIG_CH6_MODE 40616l +#define SPC_TRIG_CH7_MODE 40617l +#define SPC_TRIG_CH8_MODE 40618l +#define SPC_TRIG_CH9_MODE 40619l +#define SPC_TRIG_CH10_MODE 40620l +#define SPC_TRIG_CH11_MODE 40621l +#define SPC_TRIG_CH12_MODE 40622l +#define SPC_TRIG_CH13_MODE 40623l +#define SPC_TRIG_CH14_MODE 40624l +#define SPC_TRIG_CH15_MODE 40625l +#define SPC_TRIG_CH16_MODE 40626l +#define SPC_TRIG_CH17_MODE 40627l +#define SPC_TRIG_CH18_MODE 40628l +#define SPC_TRIG_CH19_MODE 40629l +#define SPC_TRIG_CH20_MODE 40630l +#define SPC_TRIG_CH21_MODE 40631l +#define SPC_TRIG_CH22_MODE 40632l +#define SPC_TRIG_CH23_MODE 40633l +#define SPC_TRIG_CH24_MODE 40634l +#define SPC_TRIG_CH25_MODE 40635l +#define SPC_TRIG_CH26_MODE 40636l +#define SPC_TRIG_CH27_MODE 40637l +#define SPC_TRIG_CH28_MODE 40638l +#define SPC_TRIG_CH29_MODE 40639l +#define SPC_TRIG_CH30_MODE 40640l +#define SPC_TRIG_CH31_MODE 40641l + +#define SPC_TRIG_CH32_MODE 40642l +#define SPC_TRIG_CH33_MODE 40643l +#define SPC_TRIG_CH34_MODE 40644l +#define SPC_TRIG_CH35_MODE 40645l +#define SPC_TRIG_CH36_MODE 40646l +#define SPC_TRIG_CH37_MODE 40647l +#define SPC_TRIG_CH38_MODE 40648l +#define SPC_TRIG_CH39_MODE 40649l +#define SPC_TRIG_CH40_MODE 40650l +#define SPC_TRIG_CH41_MODE 40651l +#define SPC_TRIG_CH42_MODE 40652l +#define SPC_TRIG_CH43_MODE 40653l +#define SPC_TRIG_CH44_MODE 40654l +#define SPC_TRIG_CH45_MODE 40655l +#define SPC_TRIG_CH46_MODE 40656l +#define SPC_TRIG_CH47_MODE 40657l +#define SPC_TRIG_CH48_MODE 40658l +#define SPC_TRIG_CH49_MODE 40659l +#define SPC_TRIG_CH50_MODE 40660l +#define SPC_TRIG_CH51_MODE 40661l +#define SPC_TRIG_CH52_MODE 40662l +#define SPC_TRIG_CH53_MODE 40663l +#define SPC_TRIG_CH54_MODE 40664l +#define SPC_TRIG_CH55_MODE 40665l +#define SPC_TRIG_CH56_MODE 40666l +#define SPC_TRIG_CH57_MODE 40667l +#define SPC_TRIG_CH58_MODE 40668l +#define SPC_TRIG_CH59_MODE 40669l +#define SPC_TRIG_CH60_MODE 40670l +#define SPC_TRIG_CH61_MODE 40671l +#define SPC_TRIG_CH62_MODE 40672l +#define SPC_TRIG_CH63_MODE 40673l + + +#define SPC_TRIG_AVAILDELAY 40800l +#define SPC_TRIG_AVAILDELAY_STEP 40801l +#define SPC_TRIG_DELAY 40810l + +#define SPC_TRIG_AVAILHOLDOFF 40802l +#define SPC_TRIG_AVAILHOLDOFF_STEP 40803l +#define SPC_TRIG_HOLDOFF 40811l + +#define SPC_SINGLESHOT 41000l +#define SPC_OUTONTRIGGER 41100l +#define SPC_RESTARTCONT 41200l +#define SPC_SINGLERESTART 41300l + +#define SPC_TRIGGERLEVEL 42000l +#define SPC_TRIGGERLEVEL0 42000l +#define SPC_TRIGGERLEVEL1 42001l +#define SPC_TRIGGERLEVEL2 42002l +#define SPC_TRIGGERLEVEL3 42003l +#define SPC_TRIGGERLEVEL4 42004l +#define SPC_TRIGGERLEVEL5 42005l +#define SPC_TRIGGERLEVEL6 42006l +#define SPC_TRIGGERLEVEL7 42007l +#define SPC_TRIGGERLEVEL8 42008l +#define SPC_TRIGGERLEVEL9 42009l +#define SPC_TRIGGERLEVEL10 42010l +#define SPC_TRIGGERLEVEL11 42011l +#define SPC_TRIGGERLEVEL12 42012l +#define SPC_TRIGGERLEVEL13 42013l +#define SPC_TRIGGERLEVEL14 42014l +#define SPC_TRIGGERLEVEL15 42015l + +#define SPC_AVAILHIGHLEVEL_MIN 41997l +#define SPC_AVAILHIGHLEVEL_MAX 41998l +#define SPC_AVAILHIGHLEVEL_STEP 41999l + +#define SPC_HIGHLEVEL0 42000l +#define SPC_HIGHLEVEL1 42001l +#define SPC_HIGHLEVEL2 42002l +#define SPC_HIGHLEVEL3 42003l +#define SPC_HIGHLEVEL4 42004l +#define SPC_HIGHLEVEL5 42005l +#define SPC_HIGHLEVEL6 42006l +#define SPC_HIGHLEVEL7 42007l +#define SPC_HIGHLEVEL8 42008l +#define SPC_HIGHLEVEL9 42009l +#define SPC_HIGHLEVEL10 42010l +#define SPC_HIGHLEVEL11 42011l +#define SPC_HIGHLEVEL12 42012l +#define SPC_HIGHLEVEL13 42013l +#define SPC_HIGHLEVEL14 42014l +#define SPC_HIGHLEVEL15 42015l + +#define SPC_AVAILLOWLEVEL_MIN 42097l +#define SPC_AVAILLOWLEVEL_MAX 42098l +#define SPC_AVAILLOWLEVEL_STEP 42099l + +#define SPC_LOWLEVEL0 42100l +#define SPC_LOWLEVEL1 42101l +#define SPC_LOWLEVEL2 42102l +#define SPC_LOWLEVEL3 42103l +#define SPC_LOWLEVEL4 42104l +#define SPC_LOWLEVEL5 42105l +#define SPC_LOWLEVEL6 42106l +#define SPC_LOWLEVEL7 42107l +#define SPC_LOWLEVEL8 42108l +#define SPC_LOWLEVEL9 42109l +#define SPC_LOWLEVEL10 42110l +#define SPC_LOWLEVEL11 42111l +#define SPC_LOWLEVEL12 42112l +#define SPC_LOWLEVEL13 42113l +#define SPC_LOWLEVEL14 42114l +#define SPC_LOWLEVEL15 42115l + +#define SPC_TRIG_CH0_LEVEL0 42200l +#define SPC_TRIG_CH1_LEVEL0 42201l +#define SPC_TRIG_CH2_LEVEL0 42202l +#define SPC_TRIG_CH3_LEVEL0 42203l +#define SPC_TRIG_CH4_LEVEL0 42204l +#define SPC_TRIG_CH5_LEVEL0 42205l +#define SPC_TRIG_CH6_LEVEL0 42206l +#define SPC_TRIG_CH7_LEVEL0 42207l +#define SPC_TRIG_CH8_LEVEL0 42208l +#define SPC_TRIG_CH9_LEVEL0 42209l +#define SPC_TRIG_CH10_LEVEL0 42210l +#define SPC_TRIG_CH11_LEVEL0 42211l +#define SPC_TRIG_CH12_LEVEL0 42212l +#define SPC_TRIG_CH13_LEVEL0 42213l +#define SPC_TRIG_CH14_LEVEL0 42214l +#define SPC_TRIG_CH15_LEVEL0 42215l + +#define SPC_TRIG_CH0_LEVEL1 42300l +#define SPC_TRIG_CH1_LEVEL1 42301l +#define SPC_TRIG_CH2_LEVEL1 42302l +#define SPC_TRIG_CH3_LEVEL1 42303l +#define SPC_TRIG_CH4_LEVEL1 42304l +#define SPC_TRIG_CH5_LEVEL1 42305l +#define SPC_TRIG_CH6_LEVEL1 42306l +#define SPC_TRIG_CH7_LEVEL1 42307l +#define SPC_TRIG_CH8_LEVEL1 42308l +#define SPC_TRIG_CH9_LEVEL1 42309l +#define SPC_TRIG_CH10_LEVEL1 42310l +#define SPC_TRIG_CH11_LEVEL1 42311l +#define SPC_TRIG_CH12_LEVEL1 42312l +#define SPC_TRIG_CH13_LEVEL1 42313l +#define SPC_TRIG_CH14_LEVEL1 42314l +#define SPC_TRIG_CH15_LEVEL1 42315l + +#define SPC_TRIG_EXT0_LEVEL0 42320l +#define SPC_TRIG_EXT1_LEVEL0 42321l +#define SPC_TRIG_EXT2_LEVEL0 42322l + +#define SPC_TRIG_EXT0_LEVEL1 42330l +#define SPC_TRIG_EXT1_LEVEL1 42331l +#define SPC_TRIG_EXT2_LEVEL1 42332l + +#define SPC_TRIG_EXT_AVAIL0_MIN 42340l +#define SPC_TRIG_EXT_AVAIL0_MAX 42341l +#define SPC_TRIG_EXT_AVAIL0_STEP 42342l + +#define SPC_TRIG_EXT_AVAIL1_MIN 42345l +#define SPC_TRIG_EXT_AVAIL1_MAX 42346l +#define SPC_TRIG_EXT_AVAIL1_STEP 42347l + +// threshold levels (for 77xx) +#define SPC_THRESHOLD0 42400l // threshold level for channel group 0 +#define SPC_THRESHOLD1 42401l // threshold level for channel group 1 +#define SPC_THRESHOLD2 42402l // threshold level for channel group 2 +#define SPC_THRESHOLD3 42403l // threshold level for channel group 3 +#define SPC_CLOCK_THRESHOLD 42410l // threshold level for clock input +#define SPC_TRIG_THRESHOLD 42411l // threshold level for trigger input +#define SPC_X0X1_THRESHOLD 42412l // threshold level for X0/X1 input +#define SPC_STROBE_THRESHOLD 42413l // threshold level for strobe input + +#define SPC_AVAILTHRESHOLD_MIN 42420l +#define SPC_AVAILTHRESHOLD_MAX 42421l +#define SPC_AVAILTHRESHOLD_STEP 42422l + +#define SPC_CLOCK_AVAILTHRESHOLD_MIN 42423l +#define SPC_CLOCK_AVAILTHRESHOLD_MAX 42424l +#define SPC_CLOCK_AVAILTHRESHOLD_STEP 42425l + +#define SPC_TRIG_AVAILTHRESHOLD_MIN 42426l +#define SPC_TRIG_AVAILTHRESHOLD_MAX 42427l +#define SPC_TRIG_AVAILTHRESHOLD_STEP 42428l + +#define SPC_TRIGGERPATTERN 43000l +#define SPC_TRIGGERPATTERN0 43000l +#define SPC_TRIGGERPATTERN1 43001l +#define SPC_TRIGGERMASK 43100l +#define SPC_TRIGGERMASK0 43100l +#define SPC_TRIGGERMASK1 43101l + +#define SPC_PULSEWIDTH 44000l +#define SPC_PULSEWIDTH0 44000l +#define SPC_PULSEWIDTH1 44001l + +#define SPC_TRIG_CH_AVAILPULSEWIDTH 44100l +#define SPC_TRIG_CH_PULSEWIDTH 44101l +#define SPC_TRIG_CH0_PULSEWIDTH 44101l +#define SPC_TRIG_CH1_PULSEWIDTH 44102l +#define SPC_TRIG_CH2_PULSEWIDTH 44103l +#define SPC_TRIG_CH3_PULSEWIDTH 44104l +#define SPC_TRIG_CH4_PULSEWIDTH 44105l +#define SPC_TRIG_CH5_PULSEWIDTH 44106l +#define SPC_TRIG_CH6_PULSEWIDTH 44107l +#define SPC_TRIG_CH7_PULSEWIDTH 44108l +#define SPC_TRIG_CH8_PULSEWIDTH 44109l +#define SPC_TRIG_CH9_PULSEWIDTH 44110l +#define SPC_TRIG_CH10_PULSEWIDTH 44111l +#define SPC_TRIG_CH11_PULSEWIDTH 44112l +#define SPC_TRIG_CH12_PULSEWIDTH 44113l +#define SPC_TRIG_CH13_PULSEWIDTH 44114l +#define SPC_TRIG_CH14_PULSEWIDTH 44115l +#define SPC_TRIG_CH15_PULSEWIDTH 44116l + +#define SPC_TRIG_EXT_AVAILPULSEWIDTH 44200l +#define SPC_TRIG_EXT0_PULSEWIDTH 44210l +#define SPC_TRIG_EXT1_PULSEWIDTH 44211l +#define SPC_TRIG_EXT2_PULSEWIDTH 44212l +#define SPC_TRIG_EXT3_PULSEWIDTH 44213l + +// available dividers for MICX +#define SPC_READCLOCKDIVCOUNT 44300l +#define SPC_CLOCKDIV0 44301l +#define SPC_CLOCKDIV1 44302l +#define SPC_CLOCKDIV2 44303l +#define SPC_CLOCKDIV3 44304l +#define SPC_CLOCKDIV4 44305l +#define SPC_CLOCKDIV5 44306l +#define SPC_CLOCKDIV6 44307l +#define SPC_CLOCKDIV7 44308l +#define SPC_CLOCKDIV8 44309l +#define SPC_CLOCKDIV9 44310l +#define SPC_CLOCKDIV10 44311l +#define SPC_CLOCKDIV11 44312l +#define SPC_CLOCKDIV12 44313l +#define SPC_CLOCKDIV13 44314l +#define SPC_CLOCKDIV14 44315l +#define SPC_CLOCKDIV15 44316l +#define SPC_CLOCKDIV16 44317l + +#define SPC_READTROFFSET 45000l +#define SPC_TRIGGEREDGE 46000l +#define SPC_TRIGGEREDGE0 46000l +#define SPC_TRIGGEREDGE1 46001l +#define TE_POS 10000l +#define TE_NEG 10010l +#define TE_BOTH 10020l +#define TE_NONE 10030l + + +// ----- Timestamp ----- +#define CH_TIMESTAMP 9999l + +#define SPC_TIMESTAMP_CMD 47000l +#define TS_RESET 0l +#define TS_MODE_DISABLE 10l +#define TS_MODE_STARTRESET 11l +#define TS_MODE_STANDARD 12l +#define TS_MODE_REFCLOCK 13l +#define TS_MODE_TEST5555 90l +#define TS_MODE_TESTAAAA 91l +#define TS_MODE_ZHTEST 92l + +// ----- modes for M2i, M3i, M4i, M4x, M2p hardware (bitmap) ----- +#define SPC_TIMESTAMP_AVAILMODES 47001l +#define SPC_TSMODE_DISABLE 0x00000000 +#define SPC_TS_RESET 0x00000001 +#define SPC_TSMODE_STANDARD 0x00000002 +#define SPC_TSMODE_STARTRESET 0x00000004 +#define SPC_TS_RESET_WAITREFCLK 0x00000008 +#define SPC_TSCNT_INTERNAL 0x00000100 +#define SPC_TSCNT_REFCLOCKPOS 0x00000200 +#define SPC_TSCNT_REFCLOCKNEG 0x00000400 +#define SPC_TSFEAT_NONE 0x00000000 +#define SPC_TSFEAT_STORE1STABA 0x00010000 +#define SPC_TSFEAT_INCRMODE 0x00020000 +#define SPC_TSFEAT_INCRMODE12 0x00040000 +#define SPC_TSFEAT_TRGSRC 0x00080000 + +#define SPC_TSXIOACQ_DISABLE 0x00000000 +#define SPC_TSXIOACQ_ENABLE 0x00001000 +#define SPC_TSXIOINC_ENABLE 0x00002000 +#define SPC_TSXIOINC12_ENABLE 0x00004000 + +#define SPC_TSMODE_MASK 0x000000FF +#define SPC_TSCNT_MASK 0x00000F00 +#define SPC_TSFEAT_MASK 0x000F0000 + +#define SPC_TRGSRC_MASK_CH0 0x00000001 +#define SPC_TRGSRC_MASK_CH1 0x00000002 +#define SPC_TRGSRC_MASK_CH2 0x00000004 +#define SPC_TRGSRC_MASK_CH3 0x00000008 +#define SPC_TRGSRC_MASK_CH4 0x00000010 +#define SPC_TRGSRC_MASK_CH5 0x00000020 +#define SPC_TRGSRC_MASK_CH6 0x00000040 +#define SPC_TRGSRC_MASK_CH7 0x00000080 +#define SPC_TRGSRC_MASK_EXT0 0x00000100 +#define SPC_TRGSRC_MASK_EXT1 0x00000200 +#define SPC_TRGSRC_MASK_FORCE 0x00000400 +// space for TSIOXACQ_ENABLE +#define SPC_TRGSRC_MASK_PXI0 0x00010000 +#define SPC_TRGSRC_MASK_PXI1 0x00020000 +#define SPC_TRGSRC_MASK_PXI2 0x00040000 +#define SPC_TRGSRC_MASK_PXI3 0x00080000 +#define SPC_TRGSRC_MASK_PXI4 0x00108000 +#define SPC_TRGSRC_MASK_PXI5 0x00200000 +#define SPC_TRGSRC_MASK_PXI6 0x00400000 +#define SPC_TRGSRC_MASK_PXI7 0x00800000 +#define SPC_TRGSRC_MASK_PXISTAR 0x01000000 +#define SPC_TRGSRC_MASK_PXIDSTARB 0x02000000 +#define SPC_TRGSRC_MASK_X1 0x20000000 +#define SPC_TRGSRC_MASK_X2 0x40000000 +#define SPC_TRGSRC_MASK_X3 0x80000000 + + +#define SPC_TIMESTAMP_STATUS 47010l +#define TS_FIFO_EMPTY 0l +#define TS_FIFO_LESSHALF 1l +#define TS_FIFO_MOREHALF 2l +#define TS_FIFO_OVERFLOW 3l + +#define SPC_TIMESTAMP_COUNT 47020l +#define SPC_TIMESTAMP_STARTTIME 47030l +#define SPC_TIMESTAMP_STARTDATE 47031l +#define SPC_TIMESTAMP_FIFO 47040l +#define SPC_TIMESTAMP_TIMEOUT 47045l + +#define SPC_TIMESTAMP_RESETMODE 47050l +#define TS_RESET_POS 10l +#define TS_RESET_NEG 20l + + + +// ----- Extra I/O module ----- +#define SPC_XIO_DIRECTION 47100l +#define XD_CH0_INPUT 0l +#define XD_CH0_OUTPUT 1l +#define XD_CH1_INPUT 0l +#define XD_CH1_OUTPUT 2l +#define XD_CH2_INPUT 0l +#define XD_CH2_OUTPUT 4l +#define SPC_XIO_DIGITALIO 47110l +#define SPC_XIO_ANALOGOUT0 47120l +#define SPC_XIO_ANALOGOUT1 47121l +#define SPC_XIO_ANALOGOUT2 47122l +#define SPC_XIO_ANALOGOUT3 47123l +#define SPC_XIO_WRITEDACS 47130l + + + +// ----- M3i multi purpose lines (X0, X1 ) +// ----- M4i + M4x multi purpose lines (X0, X1, X2 ) +// ----- M2p multi purpose lines (X0, X1, X2, X3) and with installed option also (X4 .. X19) + +// legacy constants: not enough contiguous constants possible for X4..X19 +#define SPCM_LEGACY_X0_MODE 47200l +#define SPCM_LEGACY_X1_MODE 47201l +#define SPCM_LEGACY_X2_MODE 47202l +#define SPCM_LEGACY_X3_MODE 47203l +#define SPCM_LEGACY_X0_AVAILMODES 47210l +#define SPCM_LEGACY_X1_AVAILMODES 47211l +#define SPCM_LEGACY_X2_AVAILMODES 47212l +#define SPCM_LEGACY_X3_AVAILMODES 47213l + +#define SPCM_XX_ASYNCIO 47220l // asynchronous in/out register +#define SPCM_XMODE_DISABLE 0x00000000 +#define SPCM_XMODE_ASYNCIN 0x00000001 // used as asynchronous input +#define SPCM_XMODE_ASYNCOUT 0x00000002 // used as asynchronous output +#define SPCM_XMODE_DIGIN 0x00000004 // used as synchronous digital input +#define SPCM_XMODE_DIGOUT 0x00000008 // used as synchronous digital output +#define SPCM_XMODE_TRIGIN 0x00000010 // used as trigger input +#define SPCM_XMODE_TRIGOUT 0x00000020 // used as trigger output +#define SPCM_XMODE_OVROUT 0x00000040 // used as ADC overrange output +#define SPCM_XMODE_DIGIN2BIT 0x00000080 // used as synchronous digital input, 2bits per channel +#define SPCM_XMODE_RUNSTATE 0x00000100 // shows the run state of the card (high = run) +#define SPCM_XMODE_ARMSTATE 0x00000200 // shows the arm state (high = armed for trigger of one single card) +#define SPCM_XMODE_DIRECTTRIGOUT 0x00000400 // used as direct trigger output (safe mode) +#define SPCM_XMODE_DIRECTTRIGOUT_LR 0x00000800 // used as direct trigger output (low re-arm) +#define SPCM_XMODE_REFCLKOUT 0x00001000 // outputs internal or fed in external refclock +#define SPCM_XMODE_CONTOUTMARK 0x00002000 // outputs a half posttrigger long HIGH pulse on replay +#define SPCM_XMODE_SYSCLKOUT 0x00004000 // outputs internal system clock +#define SPCM_XMODE_CLKOUT 0x00008000 // clock output +#define SPCM_XMODE_SYNCARMSTATE 0x00010000 // shows the arm state (high = armed for trigger when all cards connected to a Star-Hub are armed) +#define SPCM_XMODE_MODEMASK 0x000FFFFF + +// additional constants to be combined together with SPCM_XMODE_DIGOUT to select analog channel containing digital data +#define SPCM_XMODE_DIGOUTSRC_CH0 0x01000000 // Select Ch0 as source +#define SPCM_XMODE_DIGOUTSRC_CH1 0x02000000 // Select Ch1 as source +#define SPCM_XMODE_DIGOUTSRC_CH2 0x04000000 // Select Ch2 as source +#define SPCM_XMODE_DIGOUTSRC_CH3 0x08000000 // Select Ch3 as source +#define SPCM_XMODE_DIGOUTSRC_CH4 0x10000000 // Select Ch4 as source +#define SPCM_XMODE_DIGOUTSRC_CH5 0x20000000 // Select Ch5 as source +#define SPCM_XMODE_DIGOUTSRC_CH6 0x40000000 // Select Ch6 as source +#define SPCM_XMODE_DIGOUTSRC_CH7 0x80000000 // Select Ch7 as source +#define SPCM_XMODE_DIGOUTSRC_CHMASK 0xFF000000 + +// additional constants to be combined together with SPCM_XMODE_DIGOUT to select digital signal source +#define SPCM_XMODE_DIGOUTSRC_BIT15 0x00100000 // Use Bit15 (MSB ) of selected channel: channel resolution will be reduced to 15 bit +#define SPCM_XMODE_DIGOUTSRC_BIT14 0x00200000 // Use Bit14 (MSB - 1) of selected channel: channel resolution will be reduced to 14 bit +#define SPCM_XMODE_DIGOUTSRC_BIT13 0x00400000 // Use Bit13 (MSB - 2) of selected channel: channel resolution will be reduced to 13 bit +#define SPCM_XMODE_DIGOUTSRC_BIT12 0x00800000 // Use Bit12 (MSB - 3) of selected channel: channel resolution will be reduced to 12 bit +#define SPCM_XMODE_DIGOUTSRC_BITMASK 0x00F00000 + +#define SPC_DIGMODE0 47250l +#define SPC_DIGMODE1 47251l +#define SPC_DIGMODE2 47252l +#define SPC_DIGMODE3 47253l +#define SPC_DIGMODE4 47254l +#define SPC_DIGMODE5 47255l +#define SPC_DIGMODE6 47256l +#define SPC_DIGMODE7 47257l +#define SPCM_DIGMODE_OFF 0x00000000 + +#define SPCM_DIGMODE_X1 0x294A5000 // (M2P_DIGMODE_X1 << (32 - 5)) | (M2P_DIGMODE_X1 << (32 - 10)) ... etc +#define SPCM_DIGMODE_X2 0x318C6000 // (M2P_DIGMODE_X2 << (32 - 5)) | (M2P_DIGMODE_X2 << (32 - 10)) ... etc +#define SPCM_DIGMODE_X3 0x39CE7000 // (M2P_DIGMODE_X3 << (32 - 5)) | (M2P_DIGMODE_X3 << (32 - 10)) ... etc +#define SPCM_DIGMODE_X4 0x84210001 +#define SPCM_DIGMODE_X5 0x8c631002 +#define SPCM_DIGMODE_X6 0x94a52004 +#define SPCM_DIGMODE_X7 0x9ce73008 +#define SPCM_DIGMODE_X8 0xa5294010 +#define SPCM_DIGMODE_X9 0xad6b5020 +#define SPCM_DIGMODE_X10 0xb5ad6040 +#define SPCM_DIGMODE_X11 0xbdef7080 +#define SPCM_DIGMODE_X12 0xc6318100 +#define SPCM_DIGMODE_X13 0xce739200 +#define SPCM_DIGMODE_X14 0xd6b5a400 +#define SPCM_DIGMODE_X15 0xdef7b800 +#define SPCM_DIGMODE_X16 0xe739c000 +#define SPCM_DIGMODE_X17 0xef7bd000 +#define SPCM_DIGMODE_X18 0xf7bde000 +#define SPCM_DIGMODE_X19 0xfffff000 + +#define DIGMODEMASK_BIT15 0xF8000000 +#define DIGMODEMASK_BIT14 0x07C00000 +#define DIGMODEMASK_BIT13 0x003E0000 +#define DIGMODEMASK_BIT12 0x0001F000 +#define DIGMODEMASK_BIT11 0x00000800 // one bit only for bit 11 downto 0 +#define DIGMODEMASK_BIT10 0x00000400 +#define DIGMODEMASK_BIT9 0x00000200 +#define DIGMODEMASK_BIT8 0x00000100 +#define DIGMODEMASK_BIT7 0x00000080 +#define DIGMODEMASK_BIT6 0x00000040 +#define DIGMODEMASK_BIT5 0x00000020 +#define DIGMODEMASK_BIT4 0x00000010 +#define DIGMODEMASK_BIT3 0x00000008 +#define DIGMODEMASK_BIT2 0x00000004 +#define DIGMODEMASK_BIT1 0x00000002 +#define DIGMODEMASK_BIT0 0x00000001 + +// provided for convenience +#define SPCM_DIGMODE_CHREPLACE 0xFFBBCFFF +//#define SPCM_DIGMODE_CHREPLACE ( (DIGMODEMASK_BIT15 & SPCM_DIGMODE_X19) +// | (DIGMODEMASK_BIT14 & SPCM_DIGMODE_X18) +// | (DIGMODEMASK_BIT13 & SPCM_DIGMODE_X17) +// | (DIGMODEMASK_BIT12 & SPCM_DIGMODE_X16) +// | (DIGMODEMASK_BIT11 & SPCM_DIGMODE_X15) +// | (DIGMODEMASK_BIT10 & SPCM_DIGMODE_X14) +// | (DIGMODEMASK_BIT9 & SPCM_DIGMODE_X13) +// | (DIGMODEMASK_BIT8 & SPCM_DIGMODE_X12) +// | (DIGMODEMASK_BIT7 & SPCM_DIGMODE_X11) +// | (DIGMODEMASK_BIT6 & SPCM_DIGMODE_X10) +// | (DIGMODEMASK_BIT5 & SPCM_DIGMODE_X9 ) +// | (DIGMODEMASK_BIT4 & SPCM_DIGMODE_X8 ) +// | (DIGMODEMASK_BIT3 & SPCM_DIGMODE_X7 ) +// | (DIGMODEMASK_BIT2 & SPCM_DIGMODE_X6 ) +// | (DIGMODEMASK_BIT1 & SPCM_DIGMODE_X5 ) +// | (DIGMODEMASK_BIT0 & SPCM_DIGMODE_X4 ) ) +// + + +// ----- M4x PXI Trigger lines ----- +#define SPC_PXITRG0_MODE 47300l +#define SPC_PXITRG1_MODE 47301l +#define SPC_PXITRG2_MODE 47302l +#define SPC_PXITRG3_MODE 47303l +#define SPC_PXITRG4_MODE 47304l +#define SPC_PXITRG5_MODE 47305l +#define SPC_PXITRG6_MODE 47306l +#define SPC_PXITRG7_MODE 47307l +#define SPC_PXISTAR_MODE 47308l +#define SPC_PXIDSTARC_MODE 47309l +#define SPC_PXITRG0_AVAILMODES 47310l +#define SPC_PXITRG1_AVAILMODES 47311l +#define SPC_PXITRG2_AVAILMODES 47312l +#define SPC_PXITRG3_AVAILMODES 47313l +#define SPC_PXITRG4_AVAILMODES 47314l +#define SPC_PXITRG5_AVAILMODES 47315l +#define SPC_PXITRG6_AVAILMODES 47316l +#define SPC_PXITRG7_AVAILMODES 47317l +#define SPC_PXISTAR_AVAILMODES 47318l +#define SPC_PXIDSTARC_AVAILMODES 47319l +#define SPC_PXITRG_ASYNCIO 47320l // asynchronous in/out register +#define SPCM_PXITRGMODE_DISABLE 0x00000000 +#define SPCM_PXITRGMODE_IN 0x00000001 // used as input +#define SPCM_PXITRGMODE_ASYNCOUT 0x00000002 // used as asynchronous output +#define SPCM_PXITRGMODE_RUNSTATE 0x00000004 // shows the run state of the card (high = run) +#define SPCM_PXITRGMODE_ARMSTATE 0x00000008 // shows the arm state (high = armed for trigger) +#define SPCM_PXITRGMODE_TRIGOUT 0x00000010 // used as trigger output +#define SPCM_PXITRGMODE_REFCLKOUT 0x00000020 // outputs PXI refclock (10 MHz) +#define SPCM_PXITRGMODE_CONTOUTMARK 0x00000040 // outputs a half posttrigger long HIGH pulse on replay + + +// ----- Star-Hub ----- +#define SPC_STARHUB_CMD 48000l +#define SH_INIT 0l // Internal use: Initialisation of Starhub +#define SH_AUTOROUTE 1l // Internal use: Routing of Starhub +#define SH_INITDONE 2l // Internal use: End of Init +#define SH_SYNCSTART 3l // Internal use: Synchronisation + +#define SPC_STARHUB_STATUS 48010l + +#define SPC_STARHUB_ROUTE0 48100l // Routing Information for Test +#define SPC_STARHUB_ROUTE99 48199l // ... + + +// Spcm driver (M2i, M3i, M4i, M4x, M2p) sync setup registers +#define SPC_SYNC_READ_SYNCCOUNT 48990l // number of sync'd cards +#define SPC_SYNC_READ_NUMCONNECTORS 48991l // number of connectors on starhub + +#define SPC_SYNC_READ_CARDIDX0 49000l // read index of card at location 0 of sync +#define SPC_SYNC_READ_CARDIDX1 49001l // ... +#define SPC_SYNC_READ_CARDIDX2 49002l // ... +#define SPC_SYNC_READ_CARDIDX3 49003l // ... +#define SPC_SYNC_READ_CARDIDX4 49004l // ... +#define SPC_SYNC_READ_CARDIDX5 49005l // ... +#define SPC_SYNC_READ_CARDIDX6 49006l // ... +#define SPC_SYNC_READ_CARDIDX7 49007l // ... +#define SPC_SYNC_READ_CARDIDX8 49008l // ... +#define SPC_SYNC_READ_CARDIDX9 49009l // ... +#define SPC_SYNC_READ_CARDIDX10 49010l // ... +#define SPC_SYNC_READ_CARDIDX11 49011l // ... +#define SPC_SYNC_READ_CARDIDX12 49012l // ... +#define SPC_SYNC_READ_CARDIDX13 49013l // ... +#define SPC_SYNC_READ_CARDIDX14 49014l // ... +#define SPC_SYNC_READ_CARDIDX15 49015l // ... + +#define SPC_SYNC_READ_CABLECON0 49100l // read cable connection of card at location 0 of sync +#define SPC_SYNC_READ_CABLECON1 49101l // ... +#define SPC_SYNC_READ_CABLECON2 49102l // ... +#define SPC_SYNC_READ_CABLECON3 49103l // ... +#define SPC_SYNC_READ_CABLECON4 49104l // ... +#define SPC_SYNC_READ_CABLECON5 49105l // ... +#define SPC_SYNC_READ_CABLECON6 49106l // ... +#define SPC_SYNC_READ_CABLECON7 49107l // ... +#define SPC_SYNC_READ_CABLECON8 49108l // ... +#define SPC_SYNC_READ_CABLECON9 49109l // ... +#define SPC_SYNC_READ_CABLECON10 49110l // ... +#define SPC_SYNC_READ_CABLECON11 49111l // ... +#define SPC_SYNC_READ_CABLECON12 49112l // ... +#define SPC_SYNC_READ_CABLECON13 49113l // ... +#define SPC_SYNC_READ_CABLECON14 49114l // ... +#define SPC_SYNC_READ_CABLECON15 49115l // ... + +#define SPC_SYNC_ENABLEMASK 49200l // synchronisation enable (mask) +#define SPC_SYNC_NOTRIGSYNCMASK 49210l // trigger disabled for sync (mask) +#define SPC_SYNC_CLKMASK 49220l // clock master (mask) +#define SPC_SYNC_MODE 49230l // synchronization mode +#define SPC_AVAILSYNC_MODES 49231l // available synchronization modes +#define SPC_SYNC_STANDARD 0x00000001 // starhub uses its own clock and trigger sources +#define SPC_SYNC_SYSTEMCLOCK 0x00000002 // starhub uses own trigger sources and takes clock from system starhub +#define SPC_SYNC_SYSTEMCLOCKTRIG 0x00000004 // starhub takes clock and trigger from system starhub (trigger sampled on rising clock edge) +#define SPC_SYNC_SYSTEMCLOCKTRIGN 0x00000008 // starhub takes clock and trigger from system starhub (trigger sampled on falling clock edge) +#define SPC_SYNC_SYSTEM_TRIGADJUST 49240l // Delay value for adjusting trigger position using system starhub + + +// ----- Gain and Offset Adjust DAC's ----- +#define SPC_ADJ_START 50000l + +#define SPC_ADJ_LOAD 50000l +#define SPC_ADJ_SAVE 50010l +#define ADJ_DEFAULT 0l +#define ADJ_USER0 1l +#define ADJ_USER1 2l +#define ADJ_USER2 3l +#define ADJ_USER3 4l +#define ADJ_USER4 5l +#define ADJ_USER5 6l +#define ADJ_USER6 7l +#define ADJ_USER7 8l + +#define SPC_ADJ_AUTOADJ 50020l +#define ADJ_ALL 0l +#define ADJ_CURRENT 1l +#define ADJ_EXTERNAL 2l +#define ADJ_1MOHM 3l + +#define ADJ_CURRENT_CLOCK 4l +#define ADJ_CURRENT_IR 8l +#define ADJ_OFFSET_ONLY 16l +#define ADJ_SPECIAL_CLOCK 32l + +#define SPC_ADJ_SOURCE_CALLBACK 50021l +#define SPC_ADJ_PROGRESS_CALLBACK 50022l + +#define SPC_ADJ_SET 50030l +#define SPC_ADJ_FAILMASK 50040l + +#define SPC_ADJ_CALIBSOURCE 50050l +#define ADJ_CALSRC_GAIN 1l +#define ADJ_CALSRC_OFF 0l +#define ADJ_CALSRC_GND -1l +#define ADJ_CALSRC_GNDOFFS -2l +#define ADJ_CALSRC_AC 10l + +#define SPC_ADJ_CALIBVALUE0 50060l +#define SPC_ADJ_CALIBVALUE1 50061l +#define SPC_ADJ_CALIBVALUE2 50062l +#define SPC_ADJ_CALIBVALUE3 50063l +#define SPC_ADJ_CALIBVALUE4 50064l +#define SPC_ADJ_CALIBVALUE5 50065l +#define SPC_ADJ_CALIBVALUE6 50066l +#define SPC_ADJ_CALIBVALUE7 50067l + +#define SPC_ADJ_OFFSET_CH0 50900l +#define SPC_ADJ_OFFSET_CH1 50901l +#define SPC_ADJ_OFFSET_CH2 50902l +#define SPC_ADJ_OFFSET_CH3 50903l +#define SPC_ADJ_OFFSET_CH4 50904l +#define SPC_ADJ_OFFSET_CH5 50905l +#define SPC_ADJ_OFFSET_CH6 50906l +#define SPC_ADJ_OFFSET_CH7 50907l +#define SPC_ADJ_OFFSET_CH8 50908l +#define SPC_ADJ_OFFSET_CH9 50909l +#define SPC_ADJ_OFFSET_CH10 50910l +#define SPC_ADJ_OFFSET_CH11 50911l +#define SPC_ADJ_OFFSET_CH12 50912l +#define SPC_ADJ_OFFSET_CH13 50913l +#define SPC_ADJ_OFFSET_CH14 50914l +#define SPC_ADJ_OFFSET_CH15 50915l + +#define SPC_ADJ_GAIN_CH0 50916l +#define SPC_ADJ_GAIN_CH1 50917l +#define SPC_ADJ_GAIN_CH2 50918l +#define SPC_ADJ_GAIN_CH3 50919l +#define SPC_ADJ_GAIN_CH4 50920l +#define SPC_ADJ_GAIN_CH5 50921l +#define SPC_ADJ_GAIN_CH6 50922l +#define SPC_ADJ_GAIN_CH7 50923l +#define SPC_ADJ_GAIN_CH8 50924l +#define SPC_ADJ_GAIN_CH9 50925l +#define SPC_ADJ_GAIN_CH10 50926l +#define SPC_ADJ_GAIN_CH11 50927l +#define SPC_ADJ_GAIN_CH12 50928l +#define SPC_ADJ_GAIN_CH13 50929l +#define SPC_ADJ_GAIN_CH14 50930l +#define SPC_ADJ_GAIN_CH15 50931l + +#define SPC_ADJ_OFFSET0 51000l +#define SPC_ADJ_OFFSET999 51999l + +#define SPC_ADJ_GAIN0 52000l +#define SPC_ADJ_GAIN999 52999l + +#define SPC_ADJ_CORRECT0 53000l +#define SPC_ADJ_OFFS_CORRECT0 53000l +#define SPC_ADJ_CORRECT999 53999l +#define SPC_ADJ_OFFS_CORRECT999 53999l + +#define SPC_ADJ_XIOOFFS0 54000l +#define SPC_ADJ_XIOOFFS1 54001l +#define SPC_ADJ_XIOOFFS2 54002l +#define SPC_ADJ_XIOOFFS3 54003l + +#define SPC_ADJ_XIOGAIN0 54010l +#define SPC_ADJ_XIOGAIN1 54011l +#define SPC_ADJ_XIOGAIN2 54012l +#define SPC_ADJ_XIOGAIN3 54013l + +#define SPC_ADJ_GAIN_CORRECT0 55000l +#define SPC_ADJ_GAIN_CORRECT999 55999l + +#define SPC_ADJ_OFFSCALIBCORRECT0 56000l +#define SPC_ADJ_OFFSCALIBCORRECT999 56999l + +#define SPC_ADJ_GAINCALIBCORRECT0 57000l +#define SPC_ADJ_GAINCALIBCORRECT999 57999l + +#define SPC_ADJ_ANALOGTRIGGER0 58000l +#define SPC_ADJ_ANALOGTRIGGER99 58099l + +#define SPC_ADJ_CALIBSAMPLERATE0 58100l +#define SPC_ADJ_CALIBSAMPLERATE99 58199l + +#define SPC_ADJ_CALIBSAMPLERATE_GAIN0 58200l +#define SPC_ADJ_CALIBSAMPLERATE_GAIN99 58299l + +#define SPC_ADJ_REFCLOCK 58300l +#define SPC_ADJ_STARHUB_REFCLOCK 58301l + +#define SPC_ADJ_END 59999l + + + +// ----- FIFO Control ----- +#define SPC_FIFO_BUFFERS 60000l // number of FIFO buffers +#define SPC_FIFO_BUFLEN 60010l // len of each FIFO buffer +#define SPC_FIFO_BUFCOUNT 60020l // number of FIFO buffers tranfered until now +#define SPC_FIFO_BUFMAXCNT 60030l // number of FIFO buffers to be transfered (0=continuous) +#define SPC_FIFO_BUFADRCNT 60040l // number of FIFO buffers allowed +#define SPC_FIFO_BUFREADY 60050l // fifo buffer ready register (same as SPC_COMMAND + SPC_FIFO_BUFREADY0...) +#define SPC_FIFO_BUFFILLCNT 60060l // number of currently filled buffers +#define SPC_FIFO_BUFADR0 60100l // adress of FIFO buffer no. 0 +#define SPC_FIFO_BUFADR1 60101l // ... +#define SPC_FIFO_BUFADR2 60102l // ... +#define SPC_FIFO_BUFADR3 60103l // ... +#define SPC_FIFO_BUFADR4 60104l // ... +#define SPC_FIFO_BUFADR5 60105l // ... +#define SPC_FIFO_BUFADR6 60106l // ... +#define SPC_FIFO_BUFADR7 60107l // ... +#define SPC_FIFO_BUFADR8 60108l // ... +#define SPC_FIFO_BUFADR9 60109l // ... +#define SPC_FIFO_BUFADR10 60110l // ... +#define SPC_FIFO_BUFADR11 60111l // ... +#define SPC_FIFO_BUFADR12 60112l // ... +#define SPC_FIFO_BUFADR13 60113l // ... +#define SPC_FIFO_BUFADR14 60114l // ... +#define SPC_FIFO_BUFADR15 60115l // ... +#define SPC_FIFO_BUFADR255 60355l // last + + + +// ----- Filter ----- +#define SPC_FILTER 100000l +#define SPC_READNUMFILTERS 100001l // number of programable filters +#define SPC_FILTERFREQUENCY0 100002l // frequency of filter 0 (bypass) +#define SPC_FILTERFREQUENCY1 100003l // frequency of filter 1 +#define SPC_FILTERFREQUENCY2 100004l // frequency of filter 2 +#define SPC_FILTERFREQUENCY3 100005l // frequency of filter 3 +#define SPC_DIGITALBWFILTER 100100l // enable/disable digital bandwith filter + + +// ----- Pattern ----- +#define SPC_PATTERNENABLE 110000l +#define SPC_READDIGITAL 110100l + +#define SPC_DIGITALMODE0 110200l +#define SPC_DIGITALMODE1 110201l +#define SPC_DIGITALMODE2 110202l +#define SPC_DIGITALMODE3 110203l +#define SPC_DIGITALMODE4 110204l +#define SPC_DIGITALMODE5 110205l +#define SPC_DIGITALMODE6 110206l +#define SPC_DIGITALMODE7 110207l +#define SPC_DIGITALMODE_OFF 0l +#define SPC_DIGITALMODE_2BIT 1l +#define SPC_DIGITALMODE_4BIT 2l +#define SPC_DIGITALMODE_CHREPLACE 3l + + +// ----- Miscellanous ----- +#define SPC_MISCDAC0 200000l +#define SPC_MISCDAC1 200010l +#define SPC_FACTORYMODE 200020l +#define SPC_DIRECTDAC 200030l +#define SPC_NOTRIGSYNC 200040l +#define SPC_DSPDIRECT 200100l +#define SPC_DMAPHYSICALADR 200110l +#define SPC_MICXCOMP_CLOSEBOARD 200119l +#define SPC_MICXCOMPATIBILITYMODE 200120l +#define SPC_TEST_FIFOSPEED 200121l +#define SPC_RELOADDEMO 200122l +#define SPC_OVERSAMPLINGFACTOR 200123l +#define SPC_ISMAPPEDCARD 200124l +#define SPCM_NOT_MAPPED 0l +#define SPCM_LOCAL_MAPPED 1l +#define SPCM_REMOTE_MAPPED 2l +#define SPC_GETTHREADHANDLE 200130l +#define SPC_GETKERNELHANDLE 200131l +#define SPC_XYZMODE 200200l +#define SPC_INVERTDATA 200300l +#define SPC_GATEMARKENABLE 200400l +#define SPC_GATE_LEN_ALIGNMENT 200401l +#define SPC_CONTOUTMARK 200450l +#define SPC_EXPANDINT32 200500l +#define SPC_NOPRETRIGGER 200600l +#define SPC_RELAISWAITTIME 200700l +#define SPC_DACWAITTIME 200710l +#define SPC_DELAY_US 200720l +#define SPC_ILAMODE 200800l +#define SPC_NMDGMODE 200810l +#define SPC_CKADHALF_OUTPUT 200820l +#define SPC_LONGTRIG_OUTPUT 200830l +#define SPC_STOREMODAENDOFSEGMENT 200840l +#define SPC_COUNTERMODE 200850l +#define SPC_CNTMOD_MASK 0x0000000F +#define SPC_CNTMOD_PARALLELDATA 0x00000000 +#define SPC_CNTMOD_8BITCNT 0x00000001 +#define SPC_CNTMOD_2x8BITCNT 0x00000002 +#define SPC_CNTMOD_16BITCNT 0x00000003 +#define SPC_CNT0_MASK 0x000000F0 +#define SPC_CNT0_CNTONPOSEDGE 0x00000000 +#define SPC_CNT0_CNTONNEGEDGE 0x00000010 +#define SPC_CNT0_RESETHIGHLVL 0x00000000 +#define SPC_CNT0_RESETLOWLVL 0x00000020 +#define SPC_CNT0_STOPATMAX 0x00000000 +#define SPC_CNT0_ROLLOVER 0x00000040 +#define SPC_CNT1_MASK 0x00000F00 +#define SPC_CNT1_CNTONPOSEDGE 0x00000000 +#define SPC_CNT1_CNTONNEGEDGE 0x00000100 +#define SPC_CNT1_RESETHIGHLVL 0x00000000 +#define SPC_CNT1_RESETLOWLVL 0x00000200 +#define SPC_CNT1_STOPATMAX 0x00000000 +#define SPC_CNT1_ROLLOVER 0x00000400 +#define SPC_CNTCMD_MASK 0x0000F000 +#define SPC_CNTCMD_RESETCNT0 0x00001000 +#define SPC_CNTCMD_RESETCNT1 0x00002000 +#define SPC_ENHANCEDSTATUS 200900l +#define SPC_ENHSTAT_OVERRANGE0 0x00000001 +#define SPC_ENHSTAT_OVERRANGE1 0x00000002 +#define SPC_ENHSTAT_OVERRANGE2 0x00000004 +#define SPC_ENHSTAT_OVERRANGE3 0x00000008 +#define SPC_ENHSTAT_OVERRANGE4 0x00000010 +#define SPC_ENHSTAT_OVERRANGE5 0x00000020 +#define SPC_ENHSTAT_OVERRANGE6 0x00000040 +#define SPC_ENHSTAT_OVERRANGE7 0x00000080 +#define SPC_ENHSTAT_COMPARATOR0 0x40000000 +#define SPC_ENHSTAT_COMPARATOR1 0x80000000 +#define SPC_ENHSTAT_COMPARATOR2 0x20000000 +#define SPC_ENHSTAT_TRGCOMPARATOR 0x40000000 +#define SPC_ENHSTAT_CLKCOMPARATOR 0x80000000 +#define SPC_TRIGGERCOUNTER 200905l +#define SPC_FILLSIZEPROMILLE 200910l +#define SPC_OVERRANGEBIT 201000l +#define SPC_2CH8BITMODE 201100l +#define SPC_12BITMODE 201200l +#define SPC_HOLDLASTSAMPLE 201300l + +#define SPC_DATACONVERSION 201400l +#define SPC_AVAILDATACONVERSION 201401l +#define SPCM_DC_NONE 0x00000000 +#define SPCM_DC_12BIT_TO_14BIT 0x00000001 +#define SPCM_DC_16BIT_TO_14BIT 0x00000002 +#define SPCM_DC_12BIT_TO_16BIT 0x00000004 +#define SPCM_DC_14BIT_TO_16BIT 0x00000008 +#define SPCM_DC_15BIT_TO_16BIT 0x00000010 +#define SPCM_DC_13BIT_TO_16BIT 0x00000020 +#define SPCM_DC_14BIT_TO_8BIT 0x00000100 +#define SPCM_DC_16BIT_TO_8BIT 0x00000200 +#define SPCM_DC_16BIT_TO_12BIT 0x00000400 +#define SPCM_DC_TO_OFFSETBINARY 0x00000800 + +#define SPC_CARDIDENTIFICATION 201500l + +#define SPC_HANDSHAKE 201600l + +#define SPC_CKSYNC0 202000l +#define SPC_CKSYNC1 202001l +#define SPC_DISABLEMOD0 203000l +#define SPC_DISABLEMOD1 203010l +#define SPC_ENABLEOVERRANGECHECK 204000l +#define SPC_OVERRANGESTATUS 204010l +#define SPC_BITMODE 205000l + +#define SPC_READBACK 206000l +#define SPC_AVAILSTOPLEVEL 206009l +#define SPC_STOPLEVEL1 206010l +#define SPC_STOPLEVEL0 206020l +#define SPC_CH0_STOPLEVEL 206020l +#define SPC_CH1_STOPLEVEL 206021l +#define SPC_CH2_STOPLEVEL 206022l +#define SPC_CH3_STOPLEVEL 206023l +#define SPC_CH4_STOPLEVEL 206024l +#define SPC_CH5_STOPLEVEL 206025l +#define SPC_CH6_STOPLEVEL 206026l +#define SPC_CH7_STOPLEVEL 206027l +#define SPCM_STOPLVL_TRISTATE 0x00000001 +#define SPCM_STOPLVL_LOW 0x00000002 +#define SPCM_STOPLVL_HIGH 0x00000004 +#define SPCM_STOPLVL_HOLDLAST 0x00000008 +#define SPCM_STOPLVL_ZERO 0x00000010 + +#define SPC_DIFFMODE 206030l +#define SPC_DACADJUST 206040l + +#define SPC_AMP_MODE 207000l + +#define SPCM_FW_CTRL 210000l +#define SPCM_FW_CTRL_GOLDEN 210001l +#define SPCM_FW_CTRL_ACTIVE 210002l +#define SPCM_FW_CLOCK 210010l +#define SPCM_FW_CONFIG 210020l +#define SPCM_FW_MODULEA 210030l +#define SPCM_FW_MODULEB 210031l +#define SPCM_FW_MODULEA_ACTIVE 210032l +#define SPCM_FW_MODULEB_ACTIVE 210033l +#define SPCM_FW_MODEXTRA 210050l +#define SPCM_FW_MODEXTRA_ACTIVE 210052l +#define SPCM_FW_POWER 210060l +#define SPCM_FW_POWER_ACTIVE 210062l + +#define SPC_MULTI 220000l +#define SPC_DOUBLEMEM 220100l +#define SPC_MULTIMEMVALID 220200l +#define SPC_BANK 220300l +#define SPC_GATE 220400l +#define SPC_RELOAD 230000l +#define SPC_USEROUT 230010l +#define SPC_WRITEUSER0 230100l +#define SPC_WRITEUSER1 230110l +#define SPC_READUSER0 230200l +#define SPC_READUSER1 230210l +#define SPC_MUX 240000l +#define SPC_ADJADC 241000l +#define SPC_ADJOFFS0 242000l +#define SPC_ADJOFFS1 243000l +#define SPC_ADJGAIN0 244000l +#define SPC_ADJGAIN1 245000l +#define SPC_READEPROM 250000l +#define SPC_WRITEEPROM 250010l +#define SPC_DIRECTIO 260000l +#define SPC_DIRECT_MODA 260010l +#define SPC_DIRECT_MODB 260020l +#define SPC_DIRECT_EXT0 260030l +#define SPC_DIRECT_EXT1 260031l +#define SPC_DIRECT_EXT2 260032l +#define SPC_DIRECT_EXT3 260033l +#define SPC_DIRECT_EXT4 260034l +#define SPC_DIRECT_EXT5 260035l +#define SPC_DIRECT_EXT6 260036l +#define SPC_DIRECT_EXT7 260037l +#define SPC_MEMTEST 270000l +#define SPC_NODMA 275000l +#define SPC_NOCOUNTER 275010l +#define SPC_NOSCATTERGATHER 275020l +#define SPC_USER_RELAIS_OVERWRITE 275030l +#define SPCM_URO_ENABLE 0x80000000 +#define SPCM_URO_INVERT_10TO1REL 0x00000001 +#define SPC_RUNINTENABLE 290000l +#define SPC_XFERBUFSIZE 295000l +#define SPC_CHLX 295010l +#define SPC_SPECIALCLOCK 295100l +#define SPC_PLL0_ICP 295105l +#define SPCM_ICP0 0x00000000 +// ... +#define SPCM_ICP7 0x00000007 +#define SPC_STARTDELAY 295110l +#define SPC_BASISTTLTRIG 295120l +#define SPC_TIMEOUT 295130l +#define SPC_SWL_INFO 295140l +#define SPC_SWD_INFO 295141l +#define SPC_SWD_DOWN 295142l +#define SPC_SWL_EXTRAINFO 295143l +#define SPC_SPECIALCLOCK_ADJUST0 295150l +#define SPC_SPECIALCLOCK_ADJUST1 295151l +#define SPC_SPECIALCLOCK_ADJUST2 295152l +#define SPC_SPECIALCLOCK_ADJUST3 295153l +#define SPCM_SPECIALCLOCK_ADJUST_SHIFT 1000000 +#define SPC_REGACC_CONTMEM 299000l +#define SPC_REGACC_MEMORYUSAGE 299001l +#define SPC_REINITLOGSETTINGS 299998l +#define SPC_LOGDLLCALLS 299999l + + + + + + +// ----- PCK400 ----- +#define SPC_FREQUENCE 300000l +#define SPC_DELTAFREQUENCE 300010l +#define SPC_PINHIGH 300100l +#define SPC_PINLOW 300110l +#define SPC_PINDELTA 300120l +#define SPC_STOPLEVEL 300200l +#define SPC_PINRELAIS 300210l +#define SPC_EXTERNLEVEL 300300l + + + +// ----- PADCO ----- +#define SPC_COUNTER0 310000l +#define SPC_COUNTER1 310001l +#define SPC_COUNTER2 310002l +#define SPC_COUNTER3 310003l +#define SPC_COUNTER4 310004l +#define SPC_COUNTER5 310005l +#define SPC_MODE0 310100l +#define SPC_MODE1 310101l +#define SPC_MODE2 310102l +#define SPC_MODE3 310103l +#define SPC_MODE4 310104l +#define SPC_MODE5 310105l +#define CM_SINGLE 1l +#define CM_MULTI 2l +#define CM_POSEDGE 4l +#define CM_NEGEDGE 8l +#define CM_HIGHPULSE 16l +#define CM_LOWPULSE 32l + + + +// ----- PAD1616 ----- +#define SPC_SEQUENCERESET 320000l +#define SPC_SEQUENCEADD 320010l +#define SEQ_IR_10000MV 0l +#define SEQ_IR_5000MV 1l +#define SEQ_IR_2000MV 2l +#define SEQ_IR_1000MV 3l +#define SEQ_IR_500MV 4l +#define SEQ_CH0 0l +#define SEQ_CH1 8l +#define SEQ_CH2 16l +#define SEQ_CH3 24l +#define SEQ_CH4 32l +#define SEQ_CH5 40l +#define SEQ_CH6 48l +#define SEQ_CH7 56l +#define SEQ_CH8 64l +#define SEQ_CH9 72l +#define SEQ_CH10 80l +#define SEQ_CH11 88l +#define SEQ_CH12 96l +#define SEQ_CH13 104l +#define SEQ_CH14 112l +#define SEQ_CH15 120l +#define SEQ_TRIGGER 128l +#define SEQ_START 256l + + + +// ----- Option CA ----- +#define SPC_CA_MODE 330000l +#define CAMODE_OFF 0l +#define CAMODE_CDM 1l +#define CAMODE_KW 2l +#define CAMODE_OT 3l +#define CAMODE_CDMMUL 4l +#define SPC_CA_TRIGDELAY 330010l +#define SPC_CA_CKDIV 330020l +#define SPC_CA_PULS 330030l +#define SPC_CA_CKMUL 330040l +#define SPC_CA_DREHZAHLFORMAT 330050l +#define CADREH_4X4 0l +#define CADREH_1X16 1l +#define SPC_CA_KWINVERT 330060l +#define SPC_CA_OUTA 330100l +#define SPC_CA_OUTB 330110l +#define CAOUT_TRISTATE 0l +#define CAOUT_LOW 1l +#define CAOUT_HIGH 2l +#define CAOUT_CDM 3l +#define CAOUT_OT 4l +#define CAOUT_KW 5l +#define CAOUT_TRIG 6l +#define CAOUT_CLK 7l +#define CAOUT_KW60 8l +#define CAOUT_KWGAP 9l +#define CAOUT_TRDLY 10l +#define CAOUT_INVERT 16l + + +// ----- Option Sequence Mode (output cards) ----- +#define SPC_SEQMODE_STEPMEM0 340000l +// ... +#define SPC_SEQMODE_STEPMEM8191 348191l + +// low part of 64 bit entry +#define SPCSEQ_SEGMENTMASK 0x0000FFFF +#define SPCSEQ_NEXTSTEPMASK 0xFFFF0000 + +// high part of 64 bit entry +#define SPCSEQ_LOOPMASK 0x000FFFFF +#define SPCSEQ_ENDLOOPALWAYS 0x00000000 +#define SPCSEQ_ENDLOOPONTRIG 0x40000000 +#define SPCSEQ_END 0x80000000 + +#define SPC_SEQMODE_AVAILMAXSEGMENT 349900l +#define SPC_SEQMODE_AVAILMAXSTEPS 349901l +#define SPC_SEQMODE_AVAILMAXLOOP 349902l +#define SPC_SEQMODE_AVAILFEATURES 349903l + +#define SPC_SEQMODE_MAXSEGMENTS 349910l +#define SPC_SEQMODE_WRITESEGMENT 349920l +#define SPC_SEQMODE_STARTSTEP 349930l +#define SPC_SEQMODE_SEGMENTSIZE 349940l + +#define SPC_SEQMODE_STATUS 349950l +#define SEQSTAT_STEPCHANGE 0x80000000l + + +// ----- netbox registers ----- +#define SPC_NETBOX_TYPE 400000l +#define NETBOX_SERIES_MASK 0xFF000000 +#define NETBOX_FAMILY_MASK 0x00FF0000 +#define NETBOX_SPEED_MASK 0x0000FF00 +#define NETBOX_CHANNEL_MASK 0x000000FF + +#define NETBOX_SERIES_DN2 0x02000000 +#define NETBOX_SERIES_DN6 0x06000000 + +#define NETBOX_FAMILY_20 0x00200000 +#define NETBOX_FAMILY_22 0x00220000 +#define NETBOX_FAMILY_44 0x00440000 +#define NETBOX_FAMILY_46 0x00460000 +#define NETBOX_FAMILY_47 0x00470000 +#define NETBOX_FAMILY_48 0x00480000 +#define NETBOX_FAMILY_49 0x00490000 +#define NETBOX_FAMILY_59 0x00590000 +#define NETBOX_FAMILY_60 0x00600000 +#define NETBOX_FAMILY_65 0x00650000 +#define NETBOX_FAMILY_66 0x00660000 + +#define NETBOX_SPEED_1 0x00000100 +#define NETBOX_SPEED_2 0x00000200 +#define NETBOX_SPEED_3 0x00000300 +#define NETBOX_SPEED_4 0x00000400 +#define NETBOX_SPEED_5 0x00000500 +#define NETBOX_SPEED_6 0x00000600 +#define NETBOX_SPEED_7 0x00000700 +#define NETBOX_SPEED_8 0x00000800 + +#define NETBOX_CHANNELS_2 0x00000002 +#define NETBOX_CHANNELS_4 0x00000004 +#define NETBOX_CHANNELS_6 0x00000006 +#define NETBOX_CHANNELS_8 0x00000008 +#define NETBOX_CHANNELS_10 0x0000000A +#define NETBOX_CHANNELS_12 0x0000000C +#define NETBOX_CHANNELS_16 0x00000010 +#define NETBOX_CHANNELS_20 0x00000014 +#define NETBOX_CHANNELS_24 0x00000018 +#define NETBOX_CHANNELS_32 0x00000020 +#define NETBOX_CHANNELS_40 0x00000028 +#define NETBOX_CHANNELS_48 0x00000030 + +#define SPC_NETBOX_SERIALNO 400001l +#define SPC_NETBOX_PRODUCTIONDATE 400002l +#define SPC_NETBOX_HWVERSION 400003l +#define SPC_NETBOX_SWVERSION 400004l + +#define SPC_NETBOX_FEATURES 400005l +#define NETBOX_FEAT_DCPOWER 0x1 +#define NETBOX_FEAT_BOOTATPOWERON 0x2 +#define NETBOX_FEAT_EMBEDDEDSERVER 0x4 + +#define SPC_NETBOX_CUSTOM 400006l + +#define SPC_NETBOX_WAKEONLAN 400007l +#define SPC_NETBOX_MACADDRESS 400008l +#define SPC_NETBOX_LANIDFLASH 400009l +#define SPC_NETBOX_TEMPERATURE 400010l +#define SPC_NETBOX_SHUTDOWN 400011l +#define SPC_NETBOX_RESTART 400012l + +// ----- hardware monitor registers ----- +#define SPC_MON_V_PCIE_BUS 500000l +#define SPC_MON_V_CONNECTOR 500001l +#define SPC_MON_CARD_PWRSOURCE 500002l +#define CARD_PWRSOURCE_BUS 0l +#define CARD_PWRSOURCE_CONNECTOR 1l +#define SPC_MON_V_CARD_IN 500003l +#define SPC_MON_I_CARD_IN 500004l +#define SPC_MON_P_CARD_IN 500005l +#define SPC_MON_V_3V3 500006l +#define SPC_MON_V_2V5 500007l +#define SPC_MON_V_CORE 500008l +#define SPC_MON_V_AVTT 500009l +#define SPC_MON_V_AVCC 500010l +#define SPC_MON_V_MEMVCC 500011l +#define SPC_MON_V_MEMVTT 500012l +#define SPC_MON_V_CP_POS 500013l +#define SPC_MON_V_CP_NEG 500014l + +#define SPC_MON_V_5VA 500015l +#define SPC_MON_V_ADCA 500016l +#define SPC_MON_V_ADCD 500017l +#define SPC_MON_V_OP_POS 500018l +#define SPC_MON_V_OP_NEG 500019l +#define SPC_MON_V_COMP_NEG 500020l +#define SPC_MON_V_COMP_POS 500021l + +// legacy temperature registers (Kelvin) +#define SPC_MON_T_BASE_CTRL 500022l +#define SPC_MON_T_MODULE_0 500023l +#define SPC_MON_T_MODULE_1 500024l + +// new temperature registers for Kelvin (TK), Celsius (TC) or Fahrenheit (TF) +#define SPC_MON_TK_BASE_CTRL 500022l +#define SPC_MON_TK_MODULE_0 500023l +#define SPC_MON_TK_MODULE_1 500024l + +#define SPC_MON_TC_BASE_CTRL 500025l +#define SPC_MON_TC_MODULE_0 500026l +#define SPC_MON_TC_MODULE_1 500027l + +#define SPC_MON_TF_BASE_CTRL 500028l +#define SPC_MON_TF_MODULE_0 500029l +#define SPC_MON_TF_MODULE_1 500030l + +// some more voltages (used on M2p) +#define SPC_MON_V_1V8_BASE 500031l +#define SPC_MON_V_1V8_MOD 500032l +#define SPC_MON_V_MODA_0 500033l +#define SPC_MON_V_MODA_1 500034l +#define SPC_MON_V_MODB_0 500035l +#define SPC_MON_V_MODB_1 500037l + +// some more voltages and temperatures (used on M2p.65xx-hv) +#define SPC_MON_TK_MODA_0 500023l // same as SPC_MON_TK_MODULE_0 +#define SPC_MON_TK_MODA_1 500038l +#define SPC_MON_TK_MODA_2 500039l +#define SPC_MON_TK_MODA_3 500040l +#define SPC_MON_TK_MODA_4 500041l +#define SPC_MON_TK_MODB_0 500024l // same as SPC_MON_TK_MODULE_1 +#define SPC_MON_TK_MODB_1 500042l +#define SPC_MON_TK_MODB_2 500043l +#define SPC_MON_TK_MODB_3 500044l +#define SPC_MON_TK_MODB_4 500045l + +#define SPC_MON_TC_MODA_0 500026l // same as SPC_MON_TC_MODULE_0 +#define SPC_MON_TC_MODA_1 500046l +#define SPC_MON_TC_MODA_2 500047l +#define SPC_MON_TC_MODA_3 500048l +#define SPC_MON_TC_MODA_4 500049l +#define SPC_MON_TC_MODB_0 500027l // same as SPC_MON_TC_MODULE_1 +#define SPC_MON_TC_MODB_1 500050l +#define SPC_MON_TC_MODB_2 500051l +#define SPC_MON_TC_MODB_3 500052l +#define SPC_MON_TC_MODB_4 500053l + +#define SPC_MON_TF_MODA_0 500029l // same as SPC_MON_TF_MODULE_0 +#define SPC_MON_TF_MODA_1 500054l +#define SPC_MON_TF_MODA_2 500055l +#define SPC_MON_TF_MODA_3 500056l +#define SPC_MON_TF_MODA_4 500057l +#define SPC_MON_TF_MODB_0 500030l // same as SPC_MON_TF_MODULE_1 +#define SPC_MON_TF_MODB_1 500058l +#define SPC_MON_TF_MODB_2 500059l +#define SPC_MON_TF_MODB_3 500060l +#define SPC_MON_TF_MODB_4 500061l + +#define SPC_MON_I_MODA_0 500062l +#define SPC_MON_I_MODA_1 500063l +#define SPC_MON_I_MODA_2 500064l +#define SPC_MON_I_MODA_3 500065l +#define SPC_MON_I_MODB_0 500066l +#define SPC_MON_I_MODB_1 500067l +#define SPC_MON_I_MODB_2 500068l +#define SPC_MON_I_MODB_3 500069l + +#define SPC_MON_MOD_FAULT 500070l +#define SPC_CLR_MOD_FAULT 500071l + +// power section temperature registers for Kelvin (TK), Celsius (TC) or Fahrenheit (TF) +#define SPC_MON_TK_MODA_5 500072l +#define SPC_MON_TK_MODB_5 500073l + +#define SPC_MON_TC_MODA_5 500074l +#define SPC_MON_TC_MODB_5 500075l + +#define SPC_MON_TF_MODA_5 500076l +#define SPC_MON_TF_MODB_5 500077l + +// mask with available monitor registers +#define SPC_AVAILMONITORS 510000l +#define SPCM_MON_T_BASE_CTRL 0x0000000000000001ULL +#define SPCM_MON_T_MODULE_0 0x0000000000000002ULL +#define SPCM_MON_T_MODULE_1 0x0000000000000004ULL + +#define SPCM_MON_V_PCIE_BUS 0x0000000000000010ULL +#define SPCM_MON_V_CONNECTOR 0x0000000000000020ULL +#define SPCM_MON_CARD_PWRSOURCE 0x0000000000000040ULL +#define SPCM_MON_V_CARD_IN 0x0000000000000080ULL +#define SPCM_MON_I_CARD_IN 0x0000000000000100ULL +#define SPCM_MON_P_CARD_IN 0x0000000000000200ULL +#define SPCM_MON_V_3V3 0x0000000000000400ULL +#define SPCM_MON_V_2V5 0x0000000000000800ULL +#define SPCM_MON_V_CORE 0x0000000000001000ULL +#define SPCM_MON_V_AVTT 0x0000000000002000ULL +#define SPCM_MON_V_AVCC 0x0000000000004000ULL +#define SPCM_MON_V_MEMVCC 0x0000000000008000ULL +#define SPCM_MON_V_MEMVTT 0x0000000000010000ULL +#define SPCM_MON_V_CP_POS 0x0000000000020000ULL +#define SPCM_MON_V_CP_NEG 0x0000000000040000ULL +#define SPCM_MON_V_5VA 0x0000000000080000ULL +#define SPCM_MON_V_ADCA 0x0000000000100000ULL +#define SPCM_MON_V_ADCD 0x0000000000200000ULL +#define SPCM_MON_V_OP_POS 0x0000000000400000ULL +#define SPCM_MON_V_OP_NEG 0x0000000000800000ULL +#define SPCM_MON_V_COMP_NEG 0x0000000001000000ULL +#define SPCM_MON_V_COMP_POS 0x0000000002000000ULL +#define SPCM_MON_V_1V8_BASE 0x0000000004000000ULL +#define SPCM_MON_V_1V8_MOD 0x0000000008000000ULL + +#define SPCM_MON_V_MODA_0 0x0000000010000000ULL +#define SPCM_MON_V_MODA_1 0x0000000020000000ULL +#define SPCM_MON_V_MODB_0 0x0000000040000000ULL +#define SPCM_MON_V_MODB_1 0x0000000080000000ULL + +#define SPCM_MON_T_MODA_0 0x0000000000000002ULL // same as SPCM_MON_T_MODULE_0 +#define SPCM_MON_T_MODA_1 0x0000000100000000ULL +#define SPCM_MON_T_MODA_2 0x0000000200000000ULL +#define SPCM_MON_T_MODA_3 0x0000000400000000ULL +#define SPCM_MON_T_MODA_4 0x0000000800000000ULL +#define SPCM_MON_T_MODB_0 0x0000000000000004ULL // same as SPCM_MON_T_MODULE_1 +#define SPCM_MON_T_MODB_1 0x0000001000000000ULL +#define SPCM_MON_T_MODB_2 0x0000002000000000ULL +#define SPCM_MON_T_MODB_3 0x0000004000000000ULL +#define SPCM_MON_T_MODB_4 0x0000008000000000ULL + +#define SPCM_MON_I_MODA_0 0x0000010000000000ULL +#define SPCM_MON_I_MODA_1 0x0000020000000000ULL +#define SPCM_MON_I_MODA_2 0x0000040000000000ULL +#define SPCM_MON_I_MODA_3 0x0000080000000000ULL +#define SPCM_MON_I_MODB_0 0x0000100000000000ULL +#define SPCM_MON_I_MODB_1 0x0000200000000000ULL +#define SPCM_MON_I_MODB_2 0x0000300000000000ULL +#define SPCM_MON_I_MODB_3 0x0000400000000000ULL + +#define SPCM_MON_T_MODA_5 0x0000800000000000ULL +#define SPCM_MON_T_MODB_5 0x0001000000000000ULL + + +// ----- re-located multi-purpose i/o related registers ----- +#define SPC_X0_READFEATURES 600000l +#define SPC_X1_READFEATURES 600001l +#define SPC_X2_READFEATURES 600002l +#define SPC_X3_READFEATURES 600003l +#define SPC_X4_READFEATURES 600004l +#define SPC_X5_READFEATURES 600005l +#define SPC_X6_READFEATURES 600006l +#define SPC_X7_READFEATURES 600007l +#define SPC_X8_READFEATURES 600008l +#define SPC_X9_READFEATURES 600009l +#define SPC_X10_READFEATURES 600010l +#define SPC_X11_READFEATURES 600011l +#define SPC_X12_READFEATURES 600012l +#define SPC_X13_READFEATURES 600013l +#define SPC_X14_READFEATURES 600014l +#define SPC_X15_READFEATURES 600015l +#define SPC_X16_READFEATURES 600016l +#define SPC_X17_READFEATURES 600017l +#define SPC_X18_READFEATURES 600018l +#define SPC_X19_READFEATURES 600019l +#define SPCM_XFEAT_TERM 0x00000001 +#define SPCM_XFEAT_HIGHIMP 0x00000002 +#define SPCM_XFEAT_DCCOUPLING 0x00000004 +#define SPCM_XFEAT_ACCOUPLING 0x00000008 +#define SPCM_XFEAT_SE 0x00000010 +#define SPCM_XFEAT_DIFF 0x00000020 +#define SPCM_XFEAT_PROGTHRESHOLD 0x00000040 + +#define SPC_X0_TERM 600100l +#define SPC_X1_TERM 600101l +#define SPC_X2_TERM 600102l +#define SPC_X3_TERM 600103l +#define SPC_X4_TERM 600104l +#define SPC_X5_TERM 600105l +#define SPC_X6_TERM 600106l +#define SPC_X7_TERM 600107l +#define SPC_X8_TERM 600108l +#define SPC_X9_TERM 600109l +#define SPC_X10_TERM 600110l +#define SPC_X11_TERM 600111l +#define SPC_X12_TERM 600112l +#define SPC_X13_TERM 600113l +#define SPC_X14_TERM 600114l +#define SPC_X15_TERM 600115l +#define SPC_X16_TERM 600116l +#define SPC_X17_TERM 600117l +#define SPC_X18_TERM 600118l +#define SPC_X19_TERM 600119l + +#define SPCM_X0_MODE 600200l +#define SPCM_X1_MODE 600201l +#define SPCM_X2_MODE 600202l +#define SPCM_X3_MODE 600203l +#define SPCM_X4_MODE 600204l +#define SPCM_X5_MODE 600205l +#define SPCM_X6_MODE 600206l +#define SPCM_X7_MODE 600207l +#define SPCM_X8_MODE 600208l +#define SPCM_X9_MODE 600209l +#define SPCM_X10_MODE 600210l +#define SPCM_X11_MODE 600211l +#define SPCM_X12_MODE 600212l +#define SPCM_X13_MODE 600213l +#define SPCM_X14_MODE 600214l +#define SPCM_X15_MODE 600215l +#define SPCM_X16_MODE 600216l +#define SPCM_X17_MODE 600217l +#define SPCM_X18_MODE 600218l +#define SPCM_X19_MODE 600219l + +#define SPCM_X0_AVAILMODES 600300l +#define SPCM_X1_AVAILMODES 600301l +#define SPCM_X2_AVAILMODES 600302l +#define SPCM_X3_AVAILMODES 600303l +#define SPCM_X4_AVAILMODES 600304l +#define SPCM_X5_AVAILMODES 600305l +#define SPCM_X6_AVAILMODES 600306l +#define SPCM_X7_AVAILMODES 600307l +#define SPCM_X8_AVAILMODES 600308l +#define SPCM_X9_AVAILMODES 600309l +#define SPCM_X10_AVAILMODES 600310l +#define SPCM_X11_AVAILMODES 600311l +#define SPCM_X12_AVAILMODES 600312l +#define SPCM_X13_AVAILMODES 600313l +#define SPCM_X14_AVAILMODES 600314l +#define SPCM_X15_AVAILMODES 600315l +#define SPCM_X16_AVAILMODES 600316l +#define SPCM_X17_AVAILMODES 600317l +#define SPCM_X18_AVAILMODES 600318l +#define SPCM_X19_AVAILMODES 600319l + + +// ----- Hardware registers (debug use only) ----- +#define SPC_REG0x00 900000l +#define SPC_REG0x02 900010l +#define SPC_REG0x04 900020l +#define SPC_REG0x06 900030l +#define SPC_REG0x08 900040l +#define SPC_REG0x0A 900050l +#define SPC_REG0x0C 900060l +#define SPC_REG0x0E 900070l + +#define SPC_DEBUGREG0 900100l +#define SPC_DEBUGREG15 900115l +#define SPC_DEBUGVALUE0 900200l +#define SPC_DEBUGVALUE15 900215l + +#define SPC_MI_ISP 901000l +#define ISP_TMS_0 0l +#define ISP_TMS_1 1l +#define ISP_TDO_0 0l +#define ISP_TDO_1 2l + + +#define SPC_EE_RWAUTH 901100l +#define SPC_EE_REG 901110l +#define SPC_EE_RESETCOUNTER 901120l + +// ----- Test Registers ----- +#define SPC_TEST_BASE 902000l +#define SPC_TEST_LOCAL_START 902100l +#define SPC_TEST_LOCAL_END 902356l +#define SPC_TEST_PLX_START 902400l +#define SPC_TEST_PLX_END 902656l + +// 9012xx not usable +// 901900 not usable +// 903000 not usable +// 91xxxx not usable + +// ----- used by GetErrorInfo to mark errors in other functions than SetParam/GetParam ----- +#define SPC_FUNCTION_DEFTRANSFER 100000000l diff --git a/AWGDependencies/Spectrum/c_header/spcerr.h b/AWGDependencies/Spectrum/c_header/spcerr.h new file mode 100644 index 0000000..71cb7ab --- /dev/null +++ b/AWGDependencies/Spectrum/c_header/spcerr.h @@ -0,0 +1,100 @@ + +// *********************************************************************** +// +// SpcErr.h (c) Spectrum GmbH, 2006 +// +// *********************************************************************** +// +// error codes of the Spectrum drivers. Until may 2004 this file was +// errors.h. Name has been changed because errors.h has been already in +// use by windows. +// +// *********************************************************************** + +#define SPCM_ERROR_ORIGIN_MASK 0x80000000 // this bit marks the origin of the error +#define SPCM_ERROR_ORIGIN_LOCAL 0x00000000 // error occured on local system +#define SPCM_ERROR_ORIGIN_REMOTE 0x80000000 // error occured on remote system (netbox) + +#define ERR_OK 0x0000 // 0 No Error +#define ERR_INIT 0x0001 // 1 Initialisation error +#define ERR_NR 0x0002 // 2 Board number out of range +#define ERR_TYP 0x0003 // 3 Unknown board Typ +#define ERR_FNCNOTSUPPORTED 0x0004 // 4 This function is not supported by the hardware +#define ERR_BRDREMAP 0x0005 // 5 The Board Index Remap table is wrong +#define ERR_KERNELVERSION 0x0006 // 6 The kernel version and the dll version are mismatching +#define ERR_HWDRVVERSION 0x0007 // 7 The driver version doesn't match the minimum requirements of the board +#define ERR_ADRRANGE 0x0008 // 8 The address range is disabled (fatal error) +#define ERR_INVALIDHANDLE 0x0009 // 9 Handle not valid +#define ERR_BOARDNOTFOUND 0x000A // 10 Card with given name hasn't been found +#define ERR_BOARDINUSE 0x000B // 11 Card with given name is already in use by another application +#define ERR_EXPHW64BITADR 0x000C // 12 Express hardware version not able to handle 64 bit addressing -> update needed +#define ERR_FWVERSION 0x000D // 13 Firmware versions of synchronized cards or for this driver do not match -> update needed +#define ERR_SYNCPROTOCOL 0x000E // 14 Synchronization protocol of synchronized cards does not match -> update needed +#define ERR_LASTERR 0x0010 // 16 Old Error waiting to be read +#define ERR_ABORT 0x0020 // 32 Abort of wait function +#define ERR_BOARDLOCKED 0x0030 // 48 Board acess already locked by another process. it's not possible to acess one board through multiple processes +#define ERR_DEVICE_MAPPING 0x0032 // 50 Device is mapped to an invalid device +#define ERR_NETWORKSETUP 0x0040 // 64 Network setup failed +#define ERR_NETWORKTRANSFER 0x0041 // 65 Network data transfer failed +#define ERR_FWPOWERCYCLE 0x0042 // 66 Power cycle needed to update card's firmware (simple PC reboot not sufficient !) +#define ERR_NETWORKTIMEOUT 0x0043 // 67 Network timeout +#define ERR_BUFFERSIZE 0x0044 // 68 Buffer too small +#define ERR_RESTRICTEDACCESS 0x0045 // 69 access to card has been restricted +#define ERR_INVALIDPARAM 0x0046 // 70 invalid parameter for function +#define ERR_TEMPERATURE 0x0047 // 71 card temperature too high + +#define ERR_REG 0x0100 // 256 unknown Register for this Board +#define ERR_VALUE 0x0101 // 257 Not a possible value in this state +#define ERR_FEATURE 0x0102 // 258 Feature of the board not installed +#define ERR_SEQUENCE 0x0103 // 259 Channel sequence not allowed +#define ERR_READABORT 0x0104 // 260 Read not allowed after abort +#define ERR_NOACCESS 0x0105 // 261 Access to this register denied +#define ERR_POWERDOWN 0x0106 // 262 not allowed in Powerdown mode +#define ERR_TIMEOUT 0x0107 // 263 timeout occured while waiting for interrupt +#define ERR_CALLTYPE 0x0108 // 264 call type (int32 mux) is not allowed for this register +#define ERR_EXCEEDSINT32 0x0109 // 265 return value is int32 but software register exceeds the 32 bit integer range -> use 2x32 or 64 +#define ERR_NOWRITEALLOWED 0x010A // 266 register cannot be written, read only +#define ERR_SETUP 0x010B // 267 the setup isn't valid +#define ERR_CLOCKNOTLOCKED 0x010C // 268 clock section not locked: perhaps no external clock signal connected or not stable +#define ERR_MEMINIT 0x010D // 269 on-board memory initialization error +#define ERR_POWERSUPPLY 0x010E // 270 on-board power supply error +#define ERR_ADCCOMMUNICATION 0x010F // 271 communication with ADC failed +#define ERR_CHANNEL 0x0110 // 272 Wrong number of Channel to be read out +#define ERR_NOTIFYSIZE 0x0111 // 273 Notify block size isn't valid +#define ERR_RUNNING 0x0120 // 288 Board is running, changes not allowed +#define ERR_ADJUST 0x0130 // 304 Auto Adjust has an error +#define ERR_PRETRIGGERLEN 0x0140 // 320 pretrigger length exceeds allowed values +#define ERR_DIRMISMATCH 0x0141 // 321 direction of card and memory transfer mismatch +#define ERR_POSTEXCDSEGMENT 0x0142 // 322 posttrigger exceeds segment size in multiple recording mode +#define ERR_SEGMENTINMEM 0x0143 // 323 memsize is not a multiple of segmentsize, last segment hasn't full length +#define ERR_MULTIPLEPW 0x0144 // 324 multiple pulsewidth counters used but card only supports one at the time +#define ERR_NOCHANNELPWOR 0x0145 // 325 channel pulsewidth can't be OR'd +#define ERR_ANDORMASKOVRLAP 0x0146 // 326 AND mask and OR mask overlap in at least one channel -> not possible +#define ERR_ANDMASKEDGE 0x0147 // 327 AND mask together with edge trigger mode is not allowed +#define ERR_ORMASKLEVEL 0x0148 // 328 OR mask together with level trigger mode is not allowed +#define ERR_EDGEPERMOD 0x0149 // 329 All trigger edges must be simular on one module +#define ERR_DOLEVELMINDIFF 0x014A // 330 minimum difference between low output level and high output level not reached +#define ERR_STARHUBENABLE 0x014B // 331 card holding the star-hub must be active for sync +#define ERR_PATPWSMALLEDGE 0x014C // 332 Combination of pattern with pulsewidht smaller and edge is not allowed + +#define ERR_NOPCI 0x0200 // 512 No PCI bus found +#define ERR_PCIVERSION 0x0201 // 513 Wrong PCI bus version +#define ERR_PCINOBOARDS 0x0202 // 514 No Spectrum PCI boards found +#define ERR_PCICHECKSUM 0x0203 // 515 Checksum error on PCI board +#define ERR_DMALOCKED 0x0204 // 516 DMA buffer in use, try later +#define ERR_MEMALLOC 0x0205 // 517 Memory Allocation error +#define ERR_EEPROMLOAD 0x0206 // 518 EEProm load error +#define ERR_CARDNOSUPPORT 0x0207 // 519 no support for that card in the library +#define ERR_CONFIGACCESS 0x0208 // 520 error occured during config write or read + +#define ERR_FIFOBUFOVERRUN 0x0300 // 768 Buffer overrun in FIFO mode +#define ERR_FIFOHWOVERRUN 0x0301 // 769 Hardware buffer overrun in FIFO mode +#define ERR_FIFOFINISHED 0x0302 // 770 FIFO transfer hs been finished. Number of buffers has been transferred +#define ERR_FIFOSETUP 0x0309 // 777 FIFO setup not possible, transfer rate to high (max 250 MB/s) + +#define ERR_TIMESTAMP_SYNC 0x0310 // 784 Synchronisation to ref clock failed +#define ERR_STARHUB 0x0320 // 800 Autorouting of Starhub failed + +#define ERR_INTERNAL_ERROR 0xFFFF // 65535 Internal hardware error detected, please check for update + + diff --git a/AWGDependencies/Spectrum/c_header/spcioctl.inc b/AWGDependencies/Spectrum/c_header/spcioctl.inc new file mode 100644 index 0000000..cf7db32 --- /dev/null +++ b/AWGDependencies/Spectrum/c_header/spcioctl.inc @@ -0,0 +1,93 @@ +// **************************************************************************** +// spcioctl.inc +// **************************************************************************** +// include source code for easy access of the ioctl and data transfer commands +// of the spectrum driver. +// **************************************************************************** + + + +// ----- ioctl_GetParam ----------------------------------- +int16 SpcGetParam (int hDrv, int32 lReg, int32 *plValue) + { + int32 lData[2]; + int16 nRet; + + lData[0] = lReg; + nRet = ioctl (hDrv, GETPARAM, lData); + *plValue = lData[1]; + + return nRet; + } + +// ----- ioctl_SetParam ----------------------------------- +int16 SpcSetParam (int hDrv, int32 lReg, int32 lValue) + { + int32 lData[2]; + + lData[0] = lReg; + lData[1] = lValue; + + return ioctl(hDrv, SETPARAM, lData); + } + + + +// ----- ioctl_GetAdr ----------------------------------- +int16 SpcGetAdr (int hDrv, int32 lReg, void** ppvAdr) + { + int16 nRet; + _SETGETADR stSetGetAdr; + + stSetGetAdr.lReg = lReg; + nRet = ioctl (hDrv, GETADR, &stSetGetAdr); + (*ppvAdr) = stSetGetAdr.pvAdr; + + return nRet; + } + +// ----- ioctl_SetAdr ----------------------------------- +int16 SpcSetAdr (int hDrv, int32 lReg, void* pvAdr) + { + int16 nRet; + _SETGETADR stSetGetAdr; + + stSetGetAdr.lReg = lReg; + stSetGetAdr.pvAdr = pvAdr; + nRet = ioctl (hDrv, SETADR, &stSetGetAdr); + + return nRet; + } + + + +// ----- ioctl_GetData ------------------------------------ +int32 SpcGetData (int hDrv, int32 lCh, int32 lStart, int32 lLen, int16 nBytesPerSample, dataptr pvData) + { + int32 lRet; + int32 lData[1]; + lData[0] = lCh; + + ioctl (hDrv, SETCH, lData); + + lseek (hDrv, lStart * nBytesPerSample, SEEK_SET); + lRet = read (hDrv, pvData, nBytesPerSample * lLen); + + return lRet; + } + +// ----- ioctl_SetData ------------------------------------ +int32 SpcSetData (int hDrv, int32 lCh, int32 lStart, int32 lLen, int16 nBytesPerSample, dataptr pvData) + { + int32 lRet; + int32 lData[1]; + + lData[0] = lCh; + + ioctl (hDrv, SETCH, lData); + + lseek (hDrv, lStart * nBytesPerSample, SEEK_SET); + lRet = write (hDrv, pvData, nBytesPerSample * lLen); + + return lRet; + } diff --git a/AWGDependencies/Spectrum/c_header/spclib_bcc.lib b/AWGDependencies/Spectrum/c_header/spclib_bcc.lib new file mode 100644 index 0000000000000000000000000000000000000000..fe98a9d8b0a8f32f9a7d839251502e2fb362778a GIT binary patch literal 1536 zcmeys%fP_Gz`)1=0sk6!8Mxzv3zFSaOI#955W5L1zK9)%eU z4S)uI240Z)o_U!iPWg#NDajqWV53n*QB37QR?muRV1qD&Ak4e~XHT$^#XKFRU^B7E zAjg#e)Lgi}a8$EFPKL#QFeLtMk>ejKhT>LG{6oceVwwgt4;ueKHQ*RMf*k)aK@<}~ z@eh+Yj$tG${$VPBaXA?|{*lB{Oa;Y1l3Xgx;E#V{DRo5BLP)+2b7f!v=5`41H4(Oj zGL@tgz_}F`d}<7k;sD486%mRkg##nD>?FVd$+R#NfRUz+S}d?Jpk)&=jBL)0CE-iM KoI6UB83F*^{Sx~C literal 0 HcmV?d00001 diff --git a/AWGDependencies/Spectrum/c_header/spcm_drv.h b/AWGDependencies/Spectrum/c_header/spcm_drv.h new file mode 100644 index 0000000..a7e17a9 --- /dev/null +++ b/AWGDependencies/Spectrum/c_header/spcm_drv.h @@ -0,0 +1,276 @@ +/* +************************************************************************** + +spcm_interface.h (c) Spectrum GmbH , 08/2005 + +************************************************************************** + +Interface of the spectrum driver for all M2I cards. + +************************************************************************** +*/ + + + +/* +************************************************************************** + +open/close: +opens and closes the specified board. The returned handle is used by all +function calls. The device name is operating system specific. Under +linux it's normally "/dev/spcm0" for card#0 and under windows it's "spc0" +In a synchronized system the starhub has it's own handle, received under +the device name "starhub" + +*************************************************************************** +*/ + +// tries to open the device and returns handle or error code +SPCM_IMPORT drv_handle _stdcall spcm_hOpen ( + const char* szDeviceName); // name of the device to be opened + +//************************************************************************* + +// closes the device +SPCM_IMPORT void _stdcall spcm_vClose ( + drv_handle hDevice); // handle to an already opened device + + + + + +/* +************************************************************************** + +SetParam and GetParam: +handles the register based access to the driver. Each functionality is +programmed by accessing one of the software registers of the driver + +Functions are declared as i32 for single 32 bit integer access, i64 for +single 64 bit integer access or 64m for multiplexed 64 bit integer access +consisting one 32 bit integer high-part and one 32 bit unsigned integer +low part. + +Most software registers are only handled by the i32 or i64 function and +are then not allowed to be accessed by i64m functions. Some registers +can be more than 32 bit wide. They can be accessed by any of the +functions. If accessed by the i32 function the value is limited to the +32 bit signed integer area. + +*************************************************************************** +*/ + +// Sets a software register using 1 x 32 bit integer value. Return value is an error code +SPCM_IMPORT uint32 _stdcall spcm_dwSetParam_i32 ( + drv_handle hDevice, // handle to an already opened device + int32 lRegister, // software register to be modified + int32 lValue); // the value to be set + +//************************************************************************* + +// Sets a software register using 2 x 32 bit integer value. Return value is an error code +SPCM_IMPORT uint32 _stdcall spcm_dwSetParam_i64m ( + drv_handle hDevice, // handle to an already opened device + int32 lRegister, // software register to be modified + int32 lValueHigh, // upper 32 bit of the value. Containing the sign bit ! + uint32 dwValueLow); // lower 32 bit of the value. + +//************************************************************************* + +// Sets a software register using 1 x 64 bit integer value. Return value is an error code +SPCM_IMPORT uint32 _stdcall spcm_dwSetParam_i64 ( + drv_handle hDevice, // handle to an already opened device + int32 lRegister, // software register to be modified + int64 llValue); // the value to be set + + + +//************************************************************************* +//************************************************************************* + +// Reads out a software register using 1 x 32 bit integer value. Return value is an error code +SPCM_IMPORT uint32 _stdcall spcm_dwGetParam_i32 ( + drv_handle hDevice, // handle to an already opened device + int32 lRegister, // software register to be read out + int32* plValue); // pointer for the return value + +//************************************************************************* + +// Reads out a software register using 2 x 32 bit integer value. Return value is an error code +SPCM_IMPORT uint32 _stdcall spcm_dwGetParam_i64m ( + drv_handle hDevice, // handle to an already opened device + int32 lRegister, // software register to be read out + int32* plValueHigh, // pointer for the upper part of the return value + uint32* pdwValueLow); // pointer for the lower part of the return value + +//************************************************************************* + +// Reads out a software register using 1 x 64 bit integer value. Return value is an error code +SPCM_IMPORT uint32 _stdcall spcm_dwGetParam_i64 ( + drv_handle hDevice, // handle to an already opened device + int32 lRegister, // software register to be read out + int64* pllValue); // pointer for the return value + + + + +/* +************************************************************************** + +DefTransfer: +sets up all needed information for the next data transfer. Data transfer +itself is started by an extra register command. + +The function needs 64 bit unsigned integer values. Therefore it is +available as an i64m type, consisting of one upper 32 bit uint and one +lower 32 bit uint value. And it is availabl as a true 64 bit version. + +Offset and length are both given in samples. As data is multiplexed the +transfer buffer in PC memory must be large enough to handle +[length x channels] entries + +*************************************************************************** +*/ + +// defintions of the transfer direction +#define SPCM_DIR_PCTOCARD 0 // transfer from PC memory to card memory +#define SPCM_DIR_CARDTOPC 1 // transfer from card memory to PC memory +#define SPCM_DIR_CARDTOGPU 2 // RDMA transfer from card memory to GPU memory +#define SPCM_DIR_GPUTOCARD 3 // RDMA transfer from GPU memory to card memory + +// defintions of the different data buffers +#define SPCM_BUF_DATA 1000 // main data buffer for acquired or generated samples +#define SPCM_BUF_ABA 2000 // buffer for ABA data, holds the A-DATA (slow samples) +#define SPCM_BUF_TIMESTAMP 3000 // buffer for timestamps +#define SPCM_BUF_LOG 4000 // write content of buffer to log file + +//************************************************************************* + +// Defines the transer buffer by using 2 x 32 bit unsigned integer values for each 64 bit value +SPCM_IMPORT uint32 _stdcall spcm_dwDefTransfer_i64m( + drv_handle hDevice, // handle to an already opened device + uint32 dwBufType, // type of the buffer to define as listed above under SPCM_BUF_XXXX + uint32 dwDirection, // the transfer direction as defined above + uint32 dwNotifySize, // amount of bytes after which i want do receive an event (0=end of transfer) + void* pvDataBuffer, // pointer to the data buffer + uint32 dwBrdOffsH, // high part of offset in board memory + uint32 dwBrdOffsL, // low part of offset in board memory + uint32 dwTransferLenH, // high part of transfer buffer length + uint32 dwTransferLenL); // low part of transfer buffer length + +//************************************************************************* + +// Defines the transer buffer by using 64 bit unsigned integer values +SPCM_IMPORT uint32 _stdcall spcm_dwDefTransfer_i64 ( + drv_handle hDevice, // handle to an already opened device + uint32 dwBufType, // type of the buffer to define as listed above under SPCM_BUF_XXXX + uint32 dwDirection, // the transfer direction as defined above + uint32 dwNotifySize, // amount of bytes after which i want do receive an event (0=end of transfer) + void* pvDataBuffer, // pointer to the data buffer + uint64 qwBrdOffs, // offset for transfer in board memory + uint64 qwTransferLen); // buffer length + +//************************************************************************* + +// invalidate the transfer buffer (is automatically performed if new transfer buffer is defined with DefTransfer) +SPCM_IMPORT uint32 _stdcall spcm_dwInvalidateBuf ( + drv_handle hDevice, // handle to an already opened device + uint32 dwBufType); // type of the buffer to invalidate as listed above under SPCM_BUF_XXXX + + + +/* +************************************************************************** + +GetContBuf +reads out the internal continuous memory buffer if one has been allocated +this continuous buffer allows faster data transfer especially on Express cards + +*************************************************************************** +*/ + +SPCM_IMPORT uint32 _stdcall spcm_dwGetContBuf_i64 ( + drv_handle hDevice, // handle to an already opened device + uint32 dwBufType, // type of the buffer to read as listed above under SPCM_BUF_XXXX + void** ppvDataBuffer, // address of available data buffer + uint64* pqwContBufLen); // length of available continuous buffer + +//************************************************************************* + +SPCM_IMPORT uint32 _stdcall spcm_dwGetContBuf_i64m ( + drv_handle hDevice, // handle to an already opened device + uint32 dwBufType, // type of the buffer to read as listed above under SPCM_BUF_XXXX + void** ppvDataBuffer, // address of available data buffer + uint32* pdwContBufLenH, // high part of length of available continuous buffer + uint32* pdwContBufLenL); // low part of length of available continuous buffer + + + +/* +************************************************************************** + +GetErrorInfo: +reads out the complete error information that is stored in the driver. +internal error locking is afterwards reset. +If hDevice is zero the last open error is returned. + +*************************************************************************** +*/ + +SPCM_IMPORT uint32 _stdcall spcm_dwGetErrorInfo_i32 ( + drv_handle hDevice, // handle to an already opened device + uint32* pdwErrorReg, // adress of the error register (can zero if not of interest) + int32* plErrorValue, // adress of the error value (can zero if not of interest) + char pszErrorTextBuffer[ERRORTEXTLEN]); // text buffer for text error + + + +/* +************************************************************************** + +StartEBox: +starts the ethernet box by instanciate the kernelhandle_lan_ebox. +The ethernet box is the server with a card with is waiting for +request by lan-client (host pc). + +*************************************************************************** +*/ + +SPCM_IMPORT uint32 _stdcall spcm_dwStartEBox (); + + + +/* +************************************************************************** + +dwDiscovery: +the lan-client (host pc) starts a broadcast request and wait for a answer +with the VISA string. +A VISA string contains the ip address of the ethernet box. + +*************************************************************************** +*/ + +SPCM_IMPORT uint32 _stdcall spcm_dwDiscovery ( + char** pszVisaString, // user-allocated array of C-strings to return the VISA strings + uint32 dwMaxNoOfDevices, // the maximum number of devices to be returned + uint32 dwMaxVisaLen, // maximum length of one entry in pszVisaString + uint32 dwTimeout); // time in milli seconds that the function will wait until each device has answered. + + + +/* +************************************************************************** + +dwWriteIDNRequest: +the lan-client (host pc) sends a "IDN" request to the ethernet box. +So the ethernet box will send a message which contains the manufacturer, +the model, the serial number and the firmware version + +*************************************************************************** +*/ + +SPCM_IMPORT uint32 _stdcall spcm_dwSendIDNRequest ( + char** szIdnString, //the IDN string looks like that: ,,, + uint32 dwNoOfDevices, + uint32 dwIdnStringLen); //string which contains manufacturer, the model, the serial number and the firmware version diff --git a/AWGDependencies/Spectrum/c_header/spcm_win32_bcppb.lib b/AWGDependencies/Spectrum/c_header/spcm_win32_bcppb.lib new file mode 100644 index 0000000000000000000000000000000000000000..2f022cdce6c5c1bb719ffbe9b8aca3821eba47f1 GIT binary patch literal 2560 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 RkrlthF-}^j*5y=y`yZuY#u5Mk literal 0 HcmV?d00001 diff --git a/AWGDependencies/Spectrum/c_header/spcm_win64_msvcpp.lib b/AWGDependencies/Spectrum/c_header/spcm_win64_msvcpp.lib new file mode 100644 index 0000000000000000000000000000000000000000..07dee37fde851192cad0f13cb88f61af9a7d26bd GIT binary patch literal 6232 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 qk6UgC%y-J%QBoXrq z(ztx>jOLXN;?5xE5oKI)wn;RE&oNhUhh=MGRb=s@+LtMdwUZOXL{eLzVY96y9j4?J zKYm4*vpt0}pP29yP{PV2{oPPzNJpmt5$xLHH#7ufEPssFZmu2oKNO3#`n$9D(UP#W zNea?%t!&|kHnZIA!WvV5*@2$#*C8*w~6e1 zvVHB{tB&lgm9*q7^ZcL(0Y%j)1HJXp)Y)IjTWKL=HhvQwtCjLAB~*<2E;1!@o5*=bjKSs& ZyqU0UiZ{v_tlhwyNynP`((;;9e*-vsge3p~ literal 0 HcmV?d00001 diff --git a/AWGDependencies/Spectrum/common/ostools/spcm_md5.cpp b/AWGDependencies/Spectrum/common/ostools/spcm_md5.cpp new file mode 100644 index 0000000..59696a0 --- /dev/null +++ b/AWGDependencies/Spectrum/common/ostools/spcm_md5.cpp @@ -0,0 +1,265 @@ +#include "spcm_md5.h" + +#include + + +#define PUINT8_TO_UINT32(dwOut, pcIn) (dwOut = (pcIn[3] << 24) | (pcIn[2] << 16) | (pcIn[1] << 8) | pcIn[0]) + +#define UINT32_TO_PUINT8(pcOut, dwIn) { \ + pcOut[0] = (uint8) ((dwIn >> 0) & 0x000000ff); \ + pcOut[1] = (uint8) ((dwIn >> 8) & 0x000000ff); \ + pcOut[2] = (uint8) ((dwIn >> 16) & 0x000000ff); \ + pcOut[3] = (uint8) ((dwIn >> 24) & 0x000000ff); \ +} + +#define SIZEOF_UINT32 sizeof (uint32) +#define SIZEOF_ORIGIN_MSG_LEN 8 //always 64 Bit->8Bytes +#define SHIFT3 3 +#define MASK_63BIT 0x3F +#define SMALLEST_RESULT_MSG 64 //after padding with the message len, the result ist a multiple of SMALLEST_RESULT_MSG (in Bytes) +#define MSG_WITHOUT_MSGLEN SMALLEST_RESULT_MSG - SIZEOF_ORIGIN_MSG_LEN + +//max 64 Bytes = 512 Bits, in any case there will be pad the 1 +//the message is padding while the message len % 512 (bits) is 64 (bits). +//The 64 bit will be used for the len of the origin message +static uint8 PADDING_BYTES_TO_MESSAGE [64] = + { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + +//this values are given by the algorithm +static uint32 r [64] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, //round 1 + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, //round 2 + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, //round 3 + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 //round 4 + }; + +//hard coded sin values - this is for timing +static uint32 k [64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, //sin table entries for round 1 + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, //sin table entries for round 2 + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, //sin table entries for round 3 + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, //sin table entries for round 4 + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + + + +//the four functions for the MD5 algorithm +#define CALC_F1(dwState1, dwState2, dwState3) (((dwState1) & (dwState2)) | ((~dwState1) & (dwState3))) +#define CALC_F2(dwState1, dwState2, dwState3) (((dwState1) & (dwState3)) | ((dwState2) & (~dwState3))) +#define CALC_F3(dwState1, dwState2, dwState3) ((dwState1) ^ (dwState2) ^ (dwState3)) +#define CALC_F4(dwState1, dwState2, dwState3) ((dwState2) ^ ((dwState1) | (~dwState3))) + +//every bit will be shift. if the bit would fall out of the integer it will be set as lsb +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) + +// functions for round 1-4 +#define CALC_STATE_ROUND1(dwState0, dwState1, dwState2, dwState3, x, s, ac) { \ +(dwState0) = ROTATE_LEFT (((dwState0) + CALC_F1 ((dwState1), (dwState2), (dwState3)) + (x) + (uint32)(ac)), (s)) + (dwState1); \ +} +#define CALC_STATE_ROUND2(dwState0, dwState1, dwState2, dwState3, x, s, ac) { \ +(dwState0) = ROTATE_LEFT (((dwState0) + CALC_F2 ((dwState1), (dwState2), (dwState3)) + (x) + (uint32)(ac)), (s)) + (dwState1); \ +} +#define CALC_STATE_ROUND3(dwState0, dwState1, dwState2, dwState3, x, s, ac) { \ +(dwState0) = ROTATE_LEFT (((dwState0) + CALC_F3 ((dwState1), (dwState2), (dwState3)) + (x) + (uint32)(ac)), (s)) + (dwState1); \ +} +#define CALC_STATE_ROUND4(dwState0, dwState1, dwState2, dwState3, x, s, ac) { \ +(dwState0) = ROTATE_LEFT (((dwState0) + CALC_F4 ((dwState1), (dwState2), (dwState3)) + (x) + (uint32)(ac)), (s)) + (dwState1); \ +} + + + +//makes the padding of the message. On a message will pad a '1' and so much '0' until the length of the message modulo 512 (bits) is 448 (512-64 bits). +//The last 64 bit are for the origin len of the message. +//Here the calculation of the algorith is done too. +void vMD5_Calculation (uint8 pbyCheckSum [16], MD5_STATES* pstStates, MD5_COUNTS* pstCounts, MD5_BUF* pstBuf) + { + uint32 i = 0; + uint8 pcBits[8]; + uint8 pcOut[4]; + uint32 dwIn = 0; + uint32 dwIndex = 0; + uint32 dwPaddingLen = 0; + uint32 dwPartLen = 0; + + + // Save number of bits + dwIn = pstCounts->dwCount0; + UINT32_TO_PUINT8 (pcOut, dwIn); + memcpy (pcBits, pcOut, SIZEOF_UINT32); + dwIn = pstCounts->dwCount1; + UINT32_TO_PUINT8 (pcOut, dwIn); + memcpy (pcBits+4, pcOut, SIZEOF_UINT32); + + + // Pad out to 56 mod 64. + dwIndex = (uint32)((pstCounts->dwCount0 >> SHIFT3) &MASK_63BIT); //runterrechnung auf bytes + dwPaddingLen = (dwIndex < MSG_WITHOUT_MSGLEN) ? (MSG_WITHOUT_MSGLEN - dwIndex) : ((MSG_WITHOUT_MSGLEN + SMALLEST_RESULT_MSG) - dwIndex); //länge die erweitert werden soll + + + //Update number of bits + pstCounts->dwCount0 += ((uint32)dwPaddingLen << SHIFT3); + dwPartLen = SMALLEST_RESULT_MSG - dwIndex; + + //Transform as many times as possible. + if (dwPaddingLen >= dwPartLen) + { + memcpy ((uint8*)&pstBuf->pcBuffer[dwIndex], (uint8*)PADDING_BYTES_TO_MESSAGE, dwPartLen); + vStartCalc (pstStates, pstBuf->pcBuffer); + for (i = dwPartLen; i + (SMALLEST_RESULT_MSG - 1) < dwPaddingLen; i += SMALLEST_RESULT_MSG) + vStartCalc (pstStates, &PADDING_BYTES_TO_MESSAGE[i]); + dwIndex = 0; + } + else + i = 0; + + //pad the bits (1 [0 ... 0]) + memcpy ((uint8*)&pstBuf->pcBuffer[dwIndex], (uint8*)&PADDING_BYTES_TO_MESSAGE[i], dwPaddingLen-i); + + //recalculate the Index and the count values + dwIndex = (uint8)((pstCounts->dwCount0 >> SHIFT3) & MASK_63BIT); + + if ((pstCounts->dwCount0 += ((uint32)SIZEOF_ORIGIN_MSG_LEN << SHIFT3)) < ((uint32)8 << SHIFT3)) + pstCounts->dwCount1++; + pstCounts->dwCount1 += ((uint32)SIZEOF_ORIGIN_MSG_LEN >> 29); + dwPartLen = 64 - dwIndex; + + memcpy ((uint8*)&pstBuf->pcBuffer[dwIndex], (uint8*)pcBits, dwPartLen); + vStartCalc (pstStates, pstBuf->pcBuffer); + for (i = dwPartLen; i + (SMALLEST_RESULT_MSG - 1) < SIZEOF_ORIGIN_MSG_LEN; i += SMALLEST_RESULT_MSG) + vStartCalc (pstStates, &pcBits[i]); + dwIndex = 0; + + memcpy ((uint8*)&pstBuf->pcBuffer[dwIndex], (uint8*)&pcBits[i], SIZEOF_ORIGIN_MSG_LEN); + + dwIn = pstStates->dwState0; + UINT32_TO_PUINT8 (pcOut, dwIn); + memcpy (pbyCheckSum, pcOut, SIZEOF_UINT32); + dwIn = pstStates->dwState1; + UINT32_TO_PUINT8 (pcOut, dwIn); + memcpy (pbyCheckSum+4, pcOut, SIZEOF_UINT32); + dwIn = pstStates->dwState2; + UINT32_TO_PUINT8 (pcOut, dwIn); + memcpy (pbyCheckSum+8, pcOut, SIZEOF_UINT32); + dwIn = pstStates->dwState3; + UINT32_TO_PUINT8 (pcOut, dwIn); + memcpy (pbyCheckSum+12, pcOut, SIZEOF_UINT32); + + //reset structs + dwPartLen = sizeof (*pstStates); + memset ((uint8*)pstStates, 0, dwPartLen); + dwPartLen = sizeof (*pstCounts); + memset ((uint8*)pstCounts, 0, dwPartLen); + dwPartLen = sizeof (*pstBuf); + memset ((uint8*)pstBuf, 0, dwPartLen); + } + +//main calculation of this algorithm +void vStartCalc (MD5_STATES* pstStates, uint8 pcBuf[64]) + { + uint32 dwState0 = pstStates->dwState0; + uint32 dwState1 = pstStates->dwState1; + uint32 dwState2 = pstStates->dwState2; + uint32 dwState3 = pstStates->dwState3; + uint32 x[16]; + uint32 i = 0; + uint8 pcIn[4]; + uint32 dwOut = 0; + + + for (i = 0; i < 16; i++) + { + memcpy (pcIn, pcBuf + i*SIZEOF_UINT32, SIZEOF_UINT32); + PUINT8_TO_UINT32 (dwOut, pcIn); + x[i] = dwOut; + } + + CALC_STATE_ROUND1 (dwState0, dwState1, dwState2, dwState3, x[ 0], r[ 0], k[ 0]); + CALC_STATE_ROUND1 (dwState3, dwState0, dwState1, dwState2, x[ 1], r[ 1], k[ 1]); + CALC_STATE_ROUND1 (dwState2, dwState3, dwState0, dwState1, x[ 2], r[ 2], k[ 2]); + CALC_STATE_ROUND1 (dwState1, dwState2, dwState3, dwState0, x[ 3], r[ 3], k[ 3]); + CALC_STATE_ROUND1 (dwState0, dwState1, dwState2, dwState3, x[ 4], r[ 4], k[ 4]); + CALC_STATE_ROUND1 (dwState3, dwState0, dwState1, dwState2, x[ 5], r[ 5], k[ 5]); + CALC_STATE_ROUND1 (dwState2, dwState3, dwState0, dwState1, x[ 6], r[ 6], k[ 6]); + CALC_STATE_ROUND1 (dwState1, dwState2, dwState3, dwState0, x[ 7], r[ 7], k[ 7]); + CALC_STATE_ROUND1 (dwState0, dwState1, dwState2, dwState3, x[ 8], r[ 8], k[ 8]); + CALC_STATE_ROUND1 (dwState3, dwState0, dwState1, dwState2, x[ 9], r[ 9], k[ 9]); + CALC_STATE_ROUND1 (dwState2, dwState3, dwState0, dwState1, x[10], r[10], k[10]); + CALC_STATE_ROUND1 (dwState1, dwState2, dwState3, dwState0, x[11], r[11], k[11]); + CALC_STATE_ROUND1 (dwState0, dwState1, dwState2, dwState3, x[12], r[12], k[12]); + CALC_STATE_ROUND1 (dwState3, dwState0, dwState1, dwState2, x[13], r[13], k[13]); + CALC_STATE_ROUND1 (dwState2, dwState3, dwState0, dwState1, x[14], r[14], k[14]); + CALC_STATE_ROUND1 (dwState1, dwState2, dwState3, dwState0, x[15], r[15], k[15]); + + //2nd round + CALC_STATE_ROUND2 (dwState0, dwState1, dwState2, dwState3, x[ 1], r[16], k[16]); + CALC_STATE_ROUND2 (dwState3, dwState0, dwState1, dwState2, x[ 6], r[17], k[17]); + CALC_STATE_ROUND2 (dwState2, dwState3, dwState0, dwState1, x[11], r[18], k[18]); + CALC_STATE_ROUND2 (dwState1, dwState2, dwState3, dwState0, x[ 0], r[19], k[19]); + CALC_STATE_ROUND2 (dwState0, dwState1, dwState2, dwState3, x[ 5], r[20], k[20]); + CALC_STATE_ROUND2 (dwState3, dwState0, dwState1, dwState2, x[10], r[21], k[21]); + CALC_STATE_ROUND2 (dwState2, dwState3, dwState0, dwState1, x[15], r[22], k[22]); + CALC_STATE_ROUND2 (dwState1, dwState2, dwState3, dwState0, x[ 4], r[23], k[23]); + CALC_STATE_ROUND2 (dwState0, dwState1, dwState2, dwState3, x[ 9], r[24], k[24]); + CALC_STATE_ROUND2 (dwState3, dwState0, dwState1, dwState2, x[14], r[25], k[25]); + CALC_STATE_ROUND2 (dwState2, dwState3, dwState0, dwState1, x[ 3], r[26], k[26]); + CALC_STATE_ROUND2 (dwState1, dwState2, dwState3, dwState0, x[ 8], r[27], k[27]); + CALC_STATE_ROUND2 (dwState0, dwState1, dwState2, dwState3, x[13], r[28], k[28]); + CALC_STATE_ROUND2 (dwState3, dwState0, dwState1, dwState2, x[ 2], r[29], k[29]); + CALC_STATE_ROUND2 (dwState2, dwState3, dwState0, dwState1, x[ 7], r[30], k[30]); + CALC_STATE_ROUND2 (dwState1, dwState2, dwState3, dwState0, x[12], r[31], k[31]); + + //3rd round + CALC_STATE_ROUND3 (dwState0, dwState1, dwState2, dwState3, x[ 5], r[32], k[32]); + CALC_STATE_ROUND3 (dwState3, dwState0, dwState1, dwState2, x[ 8], r[33], k[33]); + CALC_STATE_ROUND3 (dwState2, dwState3, dwState0, dwState1, x[11], r[34], k[34]); + CALC_STATE_ROUND3 (dwState1, dwState2, dwState3, dwState0, x[14], r[35], k[35]); + CALC_STATE_ROUND3 (dwState0, dwState1, dwState2, dwState3, x[ 1], r[36], k[36]); + CALC_STATE_ROUND3 (dwState3, dwState0, dwState1, dwState2, x[ 4], r[37], k[37]); + CALC_STATE_ROUND3 (dwState2, dwState3, dwState0, dwState1, x[ 7], r[38], k[38]); + CALC_STATE_ROUND3 (dwState1, dwState2, dwState3, dwState0, x[10], r[39], k[39]); + CALC_STATE_ROUND3 (dwState0, dwState1, dwState2, dwState3, x[13], r[40], k[40]); + CALC_STATE_ROUND3 (dwState3, dwState0, dwState1, dwState2, x[ 0], r[41], k[41]); + CALC_STATE_ROUND3 (dwState2, dwState3, dwState0, dwState1, x[ 3], r[42], k[42]); + CALC_STATE_ROUND3 (dwState1, dwState2, dwState3, dwState0, x[ 6], r[43], k[43]); + CALC_STATE_ROUND3 (dwState0, dwState1, dwState2, dwState3, x[ 9], r[44], k[44]); + CALC_STATE_ROUND3 (dwState3, dwState0, dwState1, dwState2, x[12], r[45], k[45]); + CALC_STATE_ROUND3 (dwState2, dwState3, dwState0, dwState1, x[15], r[46], k[46]); + CALC_STATE_ROUND3 (dwState1, dwState2, dwState3, dwState0, x[ 2], r[47], k[47]); + + //4th round + CALC_STATE_ROUND4 (dwState0, dwState1, dwState2, dwState3, x[ 0], r[48], k[48]); + CALC_STATE_ROUND4 (dwState3, dwState0, dwState1, dwState2, x[ 7], r[49], k[49]); + CALC_STATE_ROUND4 (dwState2, dwState3, dwState0, dwState1, x[14], r[50], k[50]); + CALC_STATE_ROUND4 (dwState1, dwState2, dwState3, dwState0, x[ 5], r[51], k[51]); + CALC_STATE_ROUND4 (dwState0, dwState1, dwState2, dwState3, x[12], r[52], k[52]); + CALC_STATE_ROUND4 (dwState3, dwState0, dwState1, dwState2, x[ 3], r[53], k[53]); + CALC_STATE_ROUND4 (dwState2, dwState3, dwState0, dwState1, x[10], r[54], k[54]); + CALC_STATE_ROUND4 (dwState1, dwState2, dwState3, dwState0, x[ 1], r[55], k[55]); + CALC_STATE_ROUND4 (dwState0, dwState1, dwState2, dwState3, x[ 8], r[56], k[56]); + CALC_STATE_ROUND4 (dwState3, dwState0, dwState1, dwState2, x[15], r[57], k[57]); + CALC_STATE_ROUND4 (dwState2, dwState3, dwState0, dwState1, x[ 6], r[58], k[58]); + CALC_STATE_ROUND4 (dwState1, dwState2, dwState3, dwState0, x[13], r[59], k[59]); + CALC_STATE_ROUND4 (dwState0, dwState1, dwState2, dwState3, x[ 4], r[60], k[60]); + CALC_STATE_ROUND4 (dwState3, dwState0, dwState1, dwState2, x[11], r[61], k[61]); + CALC_STATE_ROUND4 (dwState2, dwState3, dwState0, dwState1, x[ 2], r[62], k[62]); + CALC_STATE_ROUND4 (dwState1, dwState2, dwState3, dwState0, x[ 9], r[63], k[63]); + + //save calculated states + pstStates->dwState0 += dwState0; + pstStates->dwState1 += dwState1; + pstStates->dwState2 += dwState2; + pstStates->dwState3 += dwState3; + + } + diff --git a/AWGDependencies/Spectrum/common/ostools/spcm_md5.h b/AWGDependencies/Spectrum/common/ostools/spcm_md5.h new file mode 100644 index 0000000..542d06d --- /dev/null +++ b/AWGDependencies/Spectrum/common/ostools/spcm_md5.h @@ -0,0 +1,32 @@ +#ifndef MD5_H +#define MD5_H +#include "../../c_header/dlltyp.h" +#include "../../c_header/regs.h" +#include "../../c_header/spcerr.h" + + +typedef struct + { + uint32 dwState0; + uint32 dwState1; + uint32 dwState2; + uint32 dwState3; + } MD5_STATES; + +typedef struct + { + uint32 dwCount0; + uint32 dwCount1; + } MD5_COUNTS; + +typedef struct + { + uint8 pcBuffer[64]; + } MD5_BUF; + + + +void vMD5_Calculation (uint8 pbyCheckSum [16], MD5_STATES* pstStates, MD5_COUNTS* pstCounts, MD5_BUF* pstBuf); +void vStartCalc (MD5_STATES* pstStates, uint8 pcBuf[64]); + +#endif diff --git a/AWGDependencies/Spectrum/common/ostools/spcm_network_winLin.cpp b/AWGDependencies/Spectrum/common/ostools/spcm_network_winLin.cpp new file mode 100644 index 0000000..a2c6dc9 --- /dev/null +++ b/AWGDependencies/Spectrum/common/ostools/spcm_network_winLin.cpp @@ -0,0 +1,777 @@ +/******************************************************************************/ +/* File name : spcm_network_winLin.cpp */ +/* Description: API for windows and linux */ +/* This file contains the most needed function for using network */ +/******************************************************************************/ +#include "spcm_network_winLin.h" +#include +#include +#include +#ifdef _LINUX +# include +# include +# include +#endif + +#ifdef _QNX +# include +# include +#endif + +#ifdef WIN32 +# undef max +# undef min +#endif + +#define SPCM_MAX_BYTES_TO_COPY (1024*1024)/*64*1024*/ + +// we're using this namespace in our program +namespace SPCM_NAMESPACE { + +/* + Initialize network. +*/ +uint32 dwInitNetwork () + { +#ifdef WIN32 + WSADATA wsa; + if (WSAStartup (MAKEWORD (2,0), &wsa) != 0) + { + return WSANOTINITIALISED; + } +#else + // nothing +#endif + return ERR_OK; + } + +void vShutdownNetwork () + { +#ifdef WIN32 + WSACleanup (); +#else + // nothing +#endif + } + + +/* + Create a socket. + lDomain = An address format specification. The only format currently supported is PF_INET, which is the ARPA Internet address format. + lType = A type specification for the new socket. + lProtocol = A particular protocol to be used with the socket, or 0 if the caller does not wish to specify a protocol. +*/ +SOCKET lSocket (int32 lDomain, int32 lType, int32 lProtocol) + { + return socket (lDomain, lType, lProtocol); + } + + +/* + Close a socket. + lSockfd = A (file) descriptor identifying a socket. +*/ +int32 lClose (SOCKET lSockfd) + { +#ifdef WIN32 + return closesocket (lSockfd); +#else + return close (lSockfd); +#endif + } + +/* + Establish a connection to a peer. + lSockfd = A socket (file) descriptor identifying an unconnected socket. + pstAddr = The address to assign to the socket. The address have to be casted to "struct sockaddr *". + lAddrlen = The length of the name. +*/ +int32 lConnect (SOCKET lSockfd, const struct sockaddr* pstAddr, socklen_t lAddrlen) + { + return connect (lSockfd, pstAddr, lAddrlen); + } + +/* + Read data from a socket. + lSockfd = A socket (file) descriptor identifying a connected socket. + pvBuf = A buffer for the incoming data. + lLen = The length of buf. +*/ +ssize_t dwRead (SOCKET lSockfd, void* pvBuf, size_t dwLen) + { +#ifdef WIN32 + return recv (lSockfd, (char*)pvBuf, (int)dwLen, 0); +#else + return read (lSockfd, pvBuf, dwLen); +#endif + } + +/* + Receive data from a socket. + lSockfd = A socket (file) descriptor identifying a connected socket. + pvBuf = A buffer for the incoming data. + lLen = The length of buf. + lFlags = Specifies the way in which the call is made. +*/ +ssize_t dwRecv (SOCKET lSockfd, void* pvBuf, size_t dwLen, int32 lFlags) + { +#ifdef WIN32 + return recv (lSockfd, (char*)pvBuf, (int)dwLen, lFlags); +#else + return recv (lSockfd, (char*)pvBuf, dwLen, lFlags); +#endif + } + +/* + Receive a datagram and store the source address. + lSockfd = A socket (file) descriptor identifying a bound socket. + pvBuf = A buffer for the incoming data. + lLen = The length of buf. + lFlags = Specifies the way in which the call is made. + pstSrc_addr = An optional pointer to a buffer which will hold the source address upon return. + plAddrlen = An optional pointer to the size of the from buffer. +*/ +ssize_t dwRecvfrom (SOCKET lSockfd, void* pvBuf, size_t dwLen, int32 lFlags, struct sockaddr *pstSrc_addr, socklen_t* plAddrlen) + { +#ifdef WIN32 + return recvfrom (lSockfd, (char*)pvBuf, (int)dwLen, lFlags, pstSrc_addr, plAddrlen); +#else + return recvfrom (lSockfd, (char*)pvBuf, dwLen, lFlags, pstSrc_addr, plAddrlen); +#endif + } + +/* + Send data on a connected socket. + lSockfd = A socket (file) descriptor identifying a connected socket. + pvBuf = A buffer containing the data to be transmitted. + lLen = The length of the data in buf. +*/ +ssize_t dwWrite (SOCKET lSockfd, const void* pvBuf, size_t dwLen) + { +#ifdef WIN32 + return send (lSockfd, (char*)pvBuf, (int)dwLen, 0); +#else + return write (lSockfd, pvBuf, dwLen); +#endif + } + +/* + Send data on a connected socket. + lSockfd = A socket (file) descriptor identifying a connected socket. + pvBuf = A buffer containing the data to be transmitted. + lLen = The length of the data in buf. + lFlags = Specifies the way in which the call is made. +*/ +ssize_t dwSend (SOCKET lSockfd, const void* pvBuf, size_t dwLen, int32 lFlags) + { +#ifdef WIN32 + return send (lSockfd, (char*)pvBuf, (int)dwLen, lFlags); +#else + return send (lSockfd, (char*)pvBuf, dwLen, lFlags); +#endif + } + + +/* + Send data to a specific destination. + lSockfd = A socket (file) descriptor identifying a socket. + pvBuf = A buffer containing the data to be transmitted. + lLen = The length of the data in buf. + lFlags = Specifies the way in which the call is made. + pstDest_addr = A optional pointer to the address of the target socket. + lAddrlen = The size of the address in to. +*/ +ssize_t dwSendto (SOCKET lSockfd, const void* pvBuf, size_t dwLen, int32 lFlags, const struct sockaddr* pstDest_addr, socklen_t lAddrlen) + { +#ifdef WIN32 + return sendto (lSockfd, (char*)pvBuf, (int)dwLen, lFlags, pstDest_addr, lAddrlen); +#else + return sendto (lSockfd, (char*)pvBuf, dwLen, lFlags, pstDest_addr, lAddrlen); +#endif + } + +int lSelect (SOCKET lSockfd, fd_set* pstReadFds, fd_set* pstWriteFds, fd_set* pstExceptFds, struct timeval* pstTimeout) + { +#ifdef WIN32 + return select (0/*unused*/, pstReadFds, pstWriteFds, pstExceptFds, pstTimeout); +#else + return select (lSockfd, pstReadFds, pstWriteFds, pstExceptFds, pstTimeout); +#endif + } + +/* + Accept a connection on a socket + lSockfd = A socket (file) descriptor identifying a socket which is listening for connections after a listen(). + pstAddr = An optional pointer to a buffer which receives the address of the connecting entity, as known to the communications layer. + The exact format of the addr argument is determined by the address family established when the socket was created. + plAddrlen = A optional pointer to an integer which contains the length of the address addr. +*/ + +SOCKET lAccept (SOCKET lSockfd, struct sockaddr* pstAddr, socklen_t* plAddrlen) + { + return accept (lSockfd, pstAddr, plAddrlen); + } + + +/* + Associate a local address with a socket. + lSockfd = A socket (file) descriptor identifying an unbound socket. + pstAddr = The address to assign to the socket. The address have to be casted to "struct sockaddr *". + lAddrlen = The length of the name. +*/ +int32 lBind (SOCKET lSockfd, const struct sockaddr* pstAddr, socklen_t lAddrlen) + { + return bind (lSockfd, pstAddr, lAddrlen); + } + + +/* + Establish a socket to listen for incoming connection. + lSockfd = A socket (file) descriptor identifying a bound, unconnected socket. + lBacklog = The maximum length to which the queue of pending connections may grow. +*/ +int32 lListen (SOCKET lSockfd, int32 lBacklog) + { + return listen (lSockfd, lBacklog); + } + +/* + Set options on sockets. + lSockfd = A socket (file) descriptor identifying a bound, unconnected socket. + lLevel = The level at which the option is defined (for example, SOL_SOCKET). + lOptname = The socket option for which the value is to be set (for example, SO_BROADCAST). + The optname parameter must be a socket option defined within the specified level, or behavior is undefined. + pvOptval = A pointer to the buffer in which the value for the requested option is specified. + lOptlen = The size, in bytes, of the buffer pointed to by the optval parameter. +*/ +int32 lSetsockopt (SOCKET lSockfd, int32 lLevel, int32 lOptname, const void* pvOptval, socklen_t lOptlen) + { +#ifdef WIN32 + return setsockopt (lSockfd, lLevel, lOptname, (const char*) pvOptval, lOptlen); +#else + return setsockopt (lSockfd, lLevel, lOptname, pvOptval, lOptlen); +#endif + } + +/* + provides protocol-independent translation from an ANSI host name to an address. + cpNode = A pointer to a NULL-terminated ANSI string that contains a host (node) name or a numeric host address string. + For the Internet protocol, the numeric host address string is a dotted-decimal IPv4 address or an IPv6 hex address. + cpService = A pointer to a NULL-terminated ANSI string that contains either a service name or port number represented as a string. + A service name is a string alias for a port number. + pstHints = A pointer to an addrinfo structure that provides hints about the type of socket the caller supports. + ppstRes = A pointer to a linked list of one or more addrinfo structures that contains repstonse information about the host. +*/ + +int32 lGetaddrinfo (const char* pcNode, const char* pcService, const struct addrinfo* pstHints, struct addrinfo** ppstRes) + { + return getaddrinfo (pcNode, pcService, pstHints, ppstRes); + } + +/* + retrieves the address of the peer to which a socket is connected. + dwSockfd = A descriptor identifying a connected socket. + sAddr = The SOCKADDR structure that receives the address of the peer. + lAddrlen = A pointer to the size, in bytes, of the name parameter. +*/ +int32 lGetpeername (SOCKET lSockfd, struct sockaddr* pstAddr, socklen_t* plAddrlen) + { + return getpeername (lSockfd, pstAddr, plAddrlen); + } + +/* + address-to-name translation in protocol-independent manner + pstSa = A pointer to a socket address structure that contains the address and port number of the socket. + For IPv4, the sa parameter points to a sockaddr_in structure. For IPv6, the sa parameter points to a sockaddr_in6 structure. + lSaLen = The length, in bytes, of the structure pointed to by the sa parameter. + pcHost = A pointer to an ANSI string used to hold the host name. + On success, the host name is returned as a Fully Qualified Domain Name (FQDN) by default. + If the host parameter is NULL, this indicates the caller does not want to receive a host name string. + sHostlen = The length, in bytes, of the buffer pointed to by the pcHost parameter. + The caller must provide a buffer large enough to hold the host name, including the terminating NULL character. + pcServ = A pointer to an ANSI string to hold the service name. + On success, an ANSI string that represents the service name associated with the port number is returned. + If the serv parameter is NULL, this indicates the caller does not want to receive a service name string. + lServLen = The length, in bytes, of the buffer pointed to by the pcServ parameter. + The caller must provide a buffer large enough to hold the service name, including the terminating NULL character. + lFlags = A value used to customize processing of the getnameinfo function. See the Remarks section. +*/ +int32 lGetnameinfo (const struct sockaddr* pstSa, socklen_t lSaLen, char* pcHost, size_t dwHostlen, char* pcServ, size_t dwServLen, int32 lFlags) + { +#ifdef WIN32 + return getnameinfo (pstSa, lSaLen, pcHost, static_cast < DWORD > (dwHostlen), pcServ, static_cast < DWORD > (dwServLen), lFlags); +#else + return getnameinfo (pstSa, lSaLen, pcHost, dwHostlen, pcServ, dwServLen, lFlags); +#endif + } + + +// **************************************************************************** +// ***** set blocking mode of socket +// **************************************************************************** +int32 lSetSocketBlocking (SOCKET lSockfd, bool bBlock) + { +#ifdef WIN32 + uint32 dwNonblockMode = (bBlock? 0 : 1); + return ioctlsocket (lSockfd, FIONBIO, &dwNonblockMode); +#else + int lArg = fcntl (lSockfd, F_GETFL, NULL); + if (lArg == -1) + return SOCKET_ERROR; + if (bBlock) + lArg &= ~O_NONBLOCK; + else + lArg |= O_NONBLOCK; + if (fcntl (lSockfd, F_SETFL, lArg) == -1) + return SOCKET_ERROR; + return 0; +#endif + } + +// ----- get the number of available network interfaces from the system ----- +uint32 dwGetNumNICs () + { +#if defined (_LINUX) || defined (_QNX) + // ----- create temp socket for request ----- + int32 lTmpSock = socket (AF_INET, SOCK_STREAM, 0); + if (lTmpSock == SOCKET_ERROR) + return 0; + + // ----- point ifconf's ifc_buf to our array of interface ifreqs ----- + struct ifconf stIfconf; + struct ifreq astIfreq[20]; // random maximum of interfaces + stIfconf.ifc_buf = (char *) astIfreq; + + // Set ifconf's ifc_len to the length of our array of interface ifreqs. + stIfconf.ifc_len = sizeof (astIfreq); + + // Populate ifconf.ifc_buf (ifreq) with a list of interface names and addresses. + if (ioctl (lTmpSock, SIOCGIFCONF, &stIfconf) == -1) + return 0; + + close (lTmpSock); + + // Divide the length of the interface list by the size of each entry. + // This gives us the number of interfaces on the system. + return stIfconf.ifc_len / sizeof (struct ifreq); +#else + uint32 dwBufLen = 0; + GetInterfaceInfo (NULL, &dwBufLen); // get necessary buffer length + char* acBuf = new char[dwBufLen]; + IP_INTERFACE_INFO* pstIPInterfaceInfo = reinterpret_cast < IP_INTERFACE_INFO* > (acBuf); + GetInterfaceInfo (pstIPInterfaceInfo, &dwBufLen); // get infos + + uint32 dwNumNICs = pstIPInterfaceInfo->NumAdapters; + delete [] acBuf; + return dwNumNICs; +#endif + } + +uint32 szFindOwnIpAdr (int32 lNICIdx, SOCKET lSockfd, char* szOwnIpAddress) + { +#ifdef _LINUX + // ----- request info structure from kernel ----- + struct ifconf stIfconf; + struct ifreq astIfreq[20]; // random maximum of interfaces + stIfconf.ifc_buf = (char *) astIfreq; + stIfconf.ifc_len = sizeof (astIfreq); + if (ioctl (lSockfd, SIOCGIFCONF, &stIfconf) == -1) + return ERR_ABORT; + + const uint32 dwNumInterfaces = stIfconf.ifc_len / sizeof (struct ifreq); + if (static_cast < uint32 > (lNICIdx) >= dwNumInterfaces) + return ERR_ABORT; + + struct sockaddr_in *pstAddress = (struct sockaddr_in *) &astIfreq[lNICIdx].ifr_addr; + if (pstAddress == NULL) + return ERR_ABORT; + + // Convert the binary IP address into a readable string. + if (inet_ntop (AF_INET, &pstAddress->sin_addr, szOwnIpAddress, SIZEOF_IPADDR) == NULL) + return ERR_ABORT; + +#else + char szBuf[255]; + if (gethostname (szBuf, 255) != SOCKET_ERROR) + { +# if defined(_MSC_VER) && (_MSC_VER < 1900) // 1900 = VS2015 + struct hostent* pstHostend = gethostbyname (szBuf); + if (pstHostend != NULL) + { + for (int32 lCnt = 0; lCnt < lNICIdx + 1; ++lCnt) + { + if (pstHostend->h_addr_list[lCnt] == NULL) + { + return ERR_ABORT; // no valid address found + } + } + + if (pstHostend->h_addr_list[lNICIdx]) + { + struct in_addr* pstAddr = reinterpret_cast < struct in_addr* > (pstHostend->h_addr_list[lNICIdx]); + + char* szIP = inet_ntoa (*pstAddr); + if (szIP == NULL) + return ERR_ABORT; // TODO + + memcpy (szOwnIpAddress, szIP, SIZEOF_IPADDR); + } + } +# else + struct addrinfo stHints; + memset (&stHints, 0, sizeof (stHints)); + stHints.ai_family = AF_INET; // do not show IPv6 for now + + struct addrinfo* pstAddrInfo = NULL; + getaddrinfo (szBuf, NULL, &stHints, &pstAddrInfo); + struct addrinfo* pstCurAddrInfo = pstAddrInfo; + + // ----- find struct for NIC ----- + for (int32 lCnt = 0; lCnt < lNICIdx && pstCurAddrInfo; ++lCnt) + { + if (pstCurAddrInfo->ai_next == NULL) + return ERR_ABORT; + pstCurAddrInfo = pstCurAddrInfo->ai_next; + } + + // ----- convert binary IP to string ----- + switch (pstCurAddrInfo->ai_family) + { + case AF_INET: + InetNtopA (AF_INET, &((struct sockaddr_in*)pstCurAddrInfo->ai_addr)->sin_addr, szOwnIpAddress, SIZEOF_IPADDR); + break; + case AF_INET6: + InetNtopA (AF_INET6, &((struct sockaddr_in6*)pstCurAddrInfo->ai_addr)->sin6_addr, szOwnIpAddress, SIZEOF_IPADDR6); // should not happen with stHints set above + break; + } + freeaddrinfo (pstAddrInfo); +# endif + } + +#endif + + return ERR_OK; + } + +void vGetIPAndSubnetMask (int32 lNICIdx, SOCKET lSockfd, char* szIPAddress, char* szSubNetMask) + { + if (szIPAddress != NULL) + memset (szIPAddress, 0, SIZEOF_IPADDR); + if (szSubNetMask != NULL) + memset (szSubNetMask, 0, SIZEOF_IPADDR); + + #ifdef WIN32 + + // get list of network adapters + IP_ADAPTER_INFO* pstFirstAdapterInfo = NULL; + bool bDelete = false; + ULONG dwLen = 0; + DWORD dwErr = GetAdaptersInfo (pstFirstAdapterInfo, &dwLen); + if (dwErr == ERROR_BUFFER_OVERFLOW) + { + pstFirstAdapterInfo = (IP_ADAPTER_INFO*)malloc (dwLen); // use malloc because of heap corruption when using new + dwErr = GetAdaptersInfo (pstFirstAdapterInfo, &dwLen); + bDelete = true; + } + if (dwErr != ERROR_SUCCESS) + { + if (bDelete) + free (pstFirstAdapterInfo); + return; + } + + // find the requested adapter + IP_ADAPTER_INFO* pstCurrAdapterInfo = pstFirstAdapterInfo; + for (uint32 dwIdx = 0; dwIdx < static_cast < uint32 > (lNICIdx) && pstCurrAdapterInfo->Next; ++dwIdx) + { + pstCurrAdapterInfo = pstCurrAdapterInfo->Next; + } + + if (szIPAddress != NULL) + memcpy (szIPAddress, &pstCurrAdapterInfo->IpAddressList.IpAddress, SIZEOF_IPADDR); + if (szSubNetMask != NULL) + memcpy (szSubNetMask, &pstCurrAdapterInfo->IpAddressList.IpMask, SIZEOF_IPADDR); + + free (pstFirstAdapterInfo); + + #else + // using getifaddrs to get subnet mask did not work for unknown reasons, so we use ioctl calls + + // ----- request info structure from kernel ----- + struct ifconf stIfconf; + struct ifreq astIfreq[20]; // random maximum of interfaces + stIfconf.ifc_buf = (char *) astIfreq; + stIfconf.ifc_len = sizeof (astIfreq); + if (ioctl (lSockfd, SIOCGIFCONF, &stIfconf) == -1) + return; + + const uint32 dwNumInterfaces = stIfconf.ifc_len / sizeof (struct ifreq); + if (static_cast < uint32 > (lNICIdx) >= dwNumInterfaces) + return; + + struct sockaddr_in* pstAddress = (struct sockaddr_in *) &astIfreq[lNICIdx].ifr_addr; + if (pstAddress == NULL) + return; + + // Convert the binary IP address into a readable string. + if (inet_ntop (AF_INET, &pstAddress->sin_addr, szIPAddress, SIZEOF_IPADDR) == NULL) + return; + + // ----- Subnetmask ----- + if (ioctl (lSockfd, SIOCGIFNETMASK, astIfreq + lNICIdx) == -1) + return; + + pstAddress = (struct sockaddr_in *) &astIfreq[lNICIdx].ifr_addr; + + // Convert the binary subnet mask into a readable string. + if (inet_ntop (AF_INET, &pstAddress->sin_addr, szSubNetMask, SIZEOF_IPADDR) == NULL) + return; + + #endif + } + +void vGetAdapterName (uint32 dwNICIdx, char* szName, uint32 dwBufLen) + { + memset (szName, '\0', dwBufLen); +#if defined (_LINUX) || defined (_QNX) + // ----- create temp socket for request ----- + int32 lTmpSock = socket (AF_INET, SOCK_STREAM, 0); + if (lTmpSock == SOCKET_ERROR) + return; + + // ----- point ifconf's ifc_buf to our array of interface ifreqs ----- + struct ifconf stIfconf; + struct ifreq astIfreq[20]; // random maximum of interfaces + stIfconf.ifc_buf = (char *) astIfreq; + + // Set ifconf's ifc_len to the length of our array of interface ifreqs. + stIfconf.ifc_len = sizeof (astIfreq); + + // Populate ifconf.ifc_buf (ifreq) with a list of interface names and addresses. + if (ioctl (lTmpSock, SIOCGIFCONF, &stIfconf) == -1) + return; + + close (lTmpSock); + + const uint32 dwNumAdapters = stIfconf.ifc_len / sizeof (struct ifreq); + if (dwNICIdx >= dwNumAdapters) + return; + + strncpy (szName, stIfconf.ifc_req[dwNICIdx].ifr_name, dwBufLen - 1); +#else + IP_ADAPTER_INFO* pstFirstAdapterInfo = NULL; + IP_ADAPTER_INFO* pstCurrAdapterInfo = NULL; + bool bDelete = false; + ULONG dwLen = 0; + DWORD dwErr = GetAdaptersInfo (pstFirstAdapterInfo, &dwLen); + if (dwErr == ERROR_BUFFER_OVERFLOW) + { + pstFirstAdapterInfo = (IP_ADAPTER_INFO*)malloc (dwLen); // use malloc because of heap corruption when using new + dwErr = GetAdaptersInfo (pstFirstAdapterInfo, &dwLen); + bDelete = true; + } + if (dwErr != ERROR_SUCCESS) + { + if (bDelete) + free (pstFirstAdapterInfo); + return; + } + + pstCurrAdapterInfo = pstFirstAdapterInfo; + for (uint32 dwIdx = 0; dwIdx < dwNICIdx && pstCurrAdapterInfo->Next; ++dwIdx) + { + pstCurrAdapterInfo = pstCurrAdapterInfo->Next; + } + + strncpy (szName, pstCurrAdapterInfo->Description, dwBufLen - 1); + + if (bDelete) + free (pstFirstAdapterInfo); +#endif + } + + +int32 lGetMacAddress (uint64* pqwMacAddress) + { + *pqwMacAddress = 0; + +#ifdef WIN32 + /* Declare and initialize variables */ + uint32 dwError = 0; + + // Set the flags to pass to GetAdaptersAddresses + uint32 dwFlags = GAA_FLAG_INCLUDE_PREFIX; + + // default to unspecified address family (both) + uint32 dwFamily = AF_UNSPEC; + PIP_ADAPTER_ADDRESSES pstAddresses = NULL; + uint32 dwBufLen = 0; + + dwFamily = AF_INET; + + dwBufLen = sizeof (IP_ADAPTER_ADDRESSES); + pstAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC (dwBufLen); + + // Make an initial call to GetAdaptersAddresses to get the + // size needed into the outBufLen variable + if (GetAdaptersAddresses (dwFamily, dwFlags, NULL, pstAddresses, &dwBufLen) == ERROR_BUFFER_OVERFLOW) + { + FREE (pstAddresses); + pstAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC (dwBufLen); + } + + if (pstAddresses == NULL) + { + printf("Memory allocation failed for IP_ADAPTER_ADDRESSES struct\n"); + exit(1); + } + + // Make a second call to GetAdapters Addresses to get the + // actual data we want + dwError = GetAdaptersAddresses (dwFamily, dwFlags, NULL, pstAddresses, &dwBufLen); + + // take first adapter + memcpy (pqwMacAddress, pstAddresses->PhysicalAddress, SIZEOF_MACADDR - 1); + FREE(pstAddresses); + +#else + FILE* pFile = fopen ("/sys/class/net/eth0/address", "r"); + + char szMAC[18]; // 00:03:2D:21:AE:AE\0 + char* szTmp __attribute__((unused)) = fgets (szMAC, sizeof (szMAC), pFile); + fclose (pFile); + + char* pcPos = szMAC; + uint32 dwShift = 40; + for (int lIdx = 0; lIdx < 6; ++lIdx) + { + *pqwMacAddress |= static_cast < uint64 > (strtoul (pcPos, NULL, 16)) << dwShift; + dwShift -= 8; + pcPos += 3; + } +#endif + + return ERR_OK; + } + +int32 lGetMacAddress (char* szMacAddress) + { + uint64 qwMacAddress = 0; + lGetMacAddress (&qwMacAddress); + +#ifdef WIN32 + sprintf (szMacAddress, "%2lX:%2lX:%2lX:%2lX:%2lX:%2lX", +#else + sprintf (szMacAddress, "%2X:%2X:%2X:%2X:%2X:%2X", +#endif + static_cast < uint32 > ((qwMacAddress >> 40) & 0xFF), + static_cast < uint32 > ((qwMacAddress >> 32) & 0xFF), + static_cast < uint32 > ((qwMacAddress >> 24) & 0xFF), + static_cast < uint32 > ((qwMacAddress >> 16) & 0xFF), + static_cast < uint32 > ((qwMacAddress >> 8) & 0xFF), + static_cast < uint32 > ((qwMacAddress >> 0) & 0xFF)); + + return ERR_OK; + } + + + +int32 lGetNetworkErrorCode () + { +#ifdef WIN32 + return WSAGetLastError (); +#else + return errno; +#endif + } + + +// ----- Returns a string with the last network error message ----- +char* szNetworkErrorMessage (int32 lErrorCode) + { +#ifdef WIN32 + static char s_szErrMsgBuffer[200]; + + LPSTR szErrorText = NULL; + FormatMessageA (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, lErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), (LPSTR)&szErrorText, 0, NULL); + + // convert to char* + _snprintf_s (s_szErrMsgBuffer, 100, _TRUNCATE, "%s", szErrorText); + + // release memory allocated by FormatMessage() + LocalFree (szErrorText); + + return s_szErrMsgBuffer; +#else + return strerror (lErrorCode); +#endif + } + + +// ----- converts an IP representation to string ----- +const char* szIPFromSockAddr (const struct sockaddr_in* pstIP) + { + static char s_szIPBuffer[16]; + +#ifdef WIN32 + sprintf (s_szIPBuffer, "%u.%u.%u.%u", pstIP->sin_addr.S_un.S_un_b.s_b1, pstIP->sin_addr.S_un.S_un_b.s_b2, pstIP->sin_addr.S_un.S_un_b.s_b3, pstIP->sin_addr.S_un.S_un_b.s_b4); +#else + uint32 dwIP = ntohl (pstIP->sin_addr.s_addr); + sprintf (s_szIPBuffer, "%u.%u.%u.%u", (dwIP & 0xFF000000)>>24, (dwIP & 0xFF0000)>>16, (dwIP & 0xFF00)>>8, (dwIP & 0xFF)); +#endif + return s_szIPBuffer; + } + +char* szIPFromName (const char* szName) + { + static char szIPBuffer[16]; //123.123.123.123\0 + + struct addrinfo* pstResult = NULL; + + int lErr = getaddrinfo (szName, NULL, NULL, &pstResult); + if (lErr != 0) + { + szIPBuffer[0] = '\0'; + return szIPBuffer; + } + + struct sockaddr_in *ipv = (struct sockaddr_in *)pstResult->ai_addr; + + // Convert the binary IP address into a readable string. + if (lInet_ntop (ipv, szIPBuffer) == SOCKET_ERROR) + { + freeaddrinfo (pstResult); + return NULL; + } + freeaddrinfo (pstResult); + + return szIPBuffer; + } + +int lInet_pton (const char* szHostname, struct sockaddr_in* pstSockAddr) + { +#if defined(_MSC_VER) && (_MSC_VER < 1900) // for compilation with older VS. 1900 = VS2015 + pstSockAddr->sin_addr.s_addr = inet_addr (szHostname); +#else + if (inet_pton (AF_INET, szIPFromName (szHostname), &(pstSockAddr->sin_addr)) <= 0) + { + return SOCKET_ERROR; + } +#endif + return 0; + } + +int lInet_ntop (const struct sockaddr_in* pstSockAddr, char* szIP) + { +#if defined(_MSC_VER) && (_MSC_VER < 1900) // for compilation with older VS. 1900 = VS2015 + strncpy (szIP, inet_ntoa (pstSockAddr->sin_addr), SIZEOF_IPADDR); +#else + if (inet_ntop (AF_INET, &(const_cast < struct sockaddr_in* > (pstSockAddr)->sin_addr), szIP, SIZEOF_IPADDR) == NULL) + { + return SOCKET_ERROR; + } +#endif + return 0; + } + +} // /SPCM_NAMESPACE diff --git a/AWGDependencies/Spectrum/common/ostools/spcm_network_winLin.h b/AWGDependencies/Spectrum/common/ostools/spcm_network_winLin.h new file mode 100644 index 0000000..83e08ff --- /dev/null +++ b/AWGDependencies/Spectrum/common/ostools/spcm_network_winLin.h @@ -0,0 +1,108 @@ +/******************************************************************************/ +/* File name : socketAPI.c */ +/* Description: API for windows and linux */ +/* This file contains the most needed function for using network */ +/******************************************************************************/ +#ifndef NETWORKWINLIN_H +#define NETWORKWINLIN_H + +#if defined(WIN32) || defined (WIN64) +# include +# include +# include +# include + +# pragma comment(lib, "IPHLPAPI.lib") +# define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x)) +# define FREE(x) HeapFree(GetProcessHeap(), 0, (x)) + +typedef int ssize_t; +#else +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include + +typedef int SOCKET; +# define SOCKET_ERROR -1 +# define INVALID_SOCKET -1 + +#endif + +#define MAX_CONN 16 // TODO: 16 guter Wert? + +#define SIZEOF_IPADDR 16 //xxx.xxx.xxx.xxx +#define SIZEOF_IPADDR6 46 //xxx.xxx.xxx.xxx +#define SIZEOF_MACADDR 7 //xx xx xx xx + +// ----- driver dll includes ----- +#include "../../c_header/dlltyp.h" +#include "../../c_header/regs.h" +#include "../../c_header/spcerr.h" + +#include +#include + +// our own namespace +namespace SPCM_NAMESPACE { + +uint32 dwInitNetwork (); +void vShutdownNetwork (); + +// ----- functions for connecting ----- +SOCKET lSocket (int32 lDomain, int32 lType, int32 lProtocol); +int32 lBind (SOCKET lSockfd, const struct sockaddr* pstAddr, socklen_t plAddrlen); +int32 lListen (SOCKET lSockfd, int32 lBacklog); +int32 lConnect (SOCKET lSockfd, const struct sockaddr* pstAddr, socklen_t plAddrlen); +SOCKET lAccept (SOCKET lSockfd, struct sockaddr* pstAddr, socklen_t* plAddrlen); +int32 lClose (SOCKET lSockfd); + +//receiving data +ssize_t dwRead (SOCKET lSockfd, void* pvBuf, size_t dwLen); +ssize_t dwRecv (SOCKET lSockfd, void* pvBuf, size_t dwLen, int32 lFlags); +ssize_t dwRecvfrom (SOCKET lSockfd, void* pvBuf, size_t dwLen, int32 lFlags, struct sockaddr* pstSrcAddr, socklen_t* plAddrlen); + +//sending data +ssize_t dwWrite (SOCKET lSockfd, const void* pvBuf, size_t dwLen); +ssize_t dwSend (SOCKET lSockfd, const void* pvBuf, size_t dwLen, int32 lFlags); +ssize_t dwSendto (SOCKET lSockfd, const void* pvBuf, size_t dwLen, int32 lFlags, const struct sockaddr* pstDestAddr, socklen_t lAddrlen); + +int lSelect (SOCKET lSockfd, fd_set* pstReadFds, fd_set* pstWriteFds, fd_set* pstExceptFds, struct timeval* pstTimeout); + +//info functions +int32 lSetsockopt (SOCKET lSockfd, int32 lLevel, int32 lOptname, const void* pvOptval, socklen_t lOptlen); +int32 lGetaddrinfo (const char* pcNode, const char* pcService, const struct addrinfo* pstHints, struct addrinfo** ppstRes); +int32 lGetpeername (SOCKET lSockfd, struct sockaddr* pstAddr, socklen_t* plAddrlen ); +int32 lGetnameinfo (const struct sockaddr* pstSa, socklen_t lSalen, char* pcHost, size_t lHostlen, char* pcServ, size_t lServlen, int32 lFlags); +int32 lSetSocketBlocking (SOCKET lSockfd, bool bBlock); +const char* pcInet_ntop (int32 lAf, const void* pvSrc, char* pcDst, socklen_t lSize); +int lInet_pton (const char* szHostname, struct sockaddr_in* pstSockAddr); +int lInet_ntop (const struct sockaddr_in* pstSockAddr, char* szIP); + +uint32 dwGetNumNICs (); +uint32 szFindOwnIpAdr (int32 lNICIdx, SOCKET lSockfd, char* szOwnIpAddress); +void vGetIPAndSubnetMask (int32 lNICIdx, SOCKET lSockfd, char* szIPAddress, char* szSubNetMask); + +void vGetAdapterName (uint32 dwNICIdx, char* szName, uint32 dwBufLen); +int32 lGetMacAddress (char* szMacAddress); +int32 lGetMacAddress (uint64* pqwMacAddress); + +int32 lGetNetworkErrorCode (); +char* szNetworkErrorMessage (int32 lErrorCode); + +char* szIPFromName (const char* szName); + +// used by netbox state monitor +const char* szIPFromSockAddr (const struct sockaddr_in* pstIP); +uint32 dwGetNetboxState (const char* szIP, uint32 dwTimeout_ms, char* szNetboxType, uint32* pdwState); + +} // /SPCM_NAMESPACE + +#endif //NETWORKWINLIN_H diff --git a/AWGDependencies/Spectrum/common/ostools/spcm_ostools.h b/AWGDependencies/Spectrum/common/ostools/spcm_ostools.h new file mode 100644 index 0000000..8f7cba9 --- /dev/null +++ b/AWGDependencies/Spectrum/common/ostools/spcm_ostools.h @@ -0,0 +1,172 @@ +/* +************************************************************************** + +spcm_ostools.h (c) Spectrum GmbH , 09/2005 + +************************************************************************** + +tools functions that differ from OS to OS: +- min/max macros +- Keyboard +- Threads +- Events +- Mutex +- Page aligned memory allocation + +************************************************************************** +*/ + + +#ifndef SPCM_OSTOOLS_H +#define SPCM_OSTOOLS_H + +#include "../../c_header/dlltyp.h" +#include "spcm_oswrap.h" + + +/* +************************************************************************** +define our own namespace if it isn't defined yet. This is necessary to +avoid name conflicts as this file is also used inside the driver +************************************************************************** +*/ + +#ifndef SPCM_NAMESPACE +# define SPCM_NAMESPACE spcmdrv +#endif + +namespace SPCM_NAMESPACE { + +/* +************************************************************************** +misc helper functions +************************************************************************** +*/ +uint32 dwGetTickCount(); + +void vSleep_ms (unsigned int dwMS); + + +/* +************************************************************************** +Keyboard functions +************************************************************************** +*/ + +// check for key pressed +int bKbhit(void); + +// get one character from keyboard +int cGetch(); + + + +/* +************************************************************************** +thread functions +************************************************************************** +*/ + +// define the thread function +typedef SPCM_THREAD_RETURN (SPCM_THREAD_CALLTYPE SPCM_THREADFUNCTION) (void* pvArguments); + +// define the thread priority settings +enum SPCM_THREADPRIO {ePrioMin, ePrioNormal, ePrioMax}; + + + +// creates a thread with the given function name, returns false if creation failed +bool spcm_bCreateThread (SPCM_THREADFUNCTION* pfnThread, SPCM_THREAD_HANDLE* phThread, void* pvArguments); + +// joins (waits for termination) +void spcm_vJoinThread (SPCM_THREAD_HANDLE* phThread, uint32 dwTimeout_ms); + +// closes the thread handle +void spcm_vCloseThread (SPCM_THREAD_HANDLE* phThread); + +// suspend the thread for xx milli seconds +void spcm_vSuspendThread (uint32 dwMS); + +// sets the priority of the thread +void spcm_vSetThreadPriority (SPCM_THREAD_HANDLE* phThread, SPCM_THREADPRIO ePriority); + + + +/* +************************************************************************** +event (linux: condition) functions +************************************************************************** +*/ + +// create an event +bool spcm_bCreateEvent (SPCM_EVENT_HANDLE* phEvent); + +// close an event +void spcm_vCloseEvent (SPCM_EVENT_HANDLE* phEvent); + +// wait for one event with timeout, true if event was received, false if timeout occurs, timeout zero means that we wait forever +bool spcm_bWaitEventWithMutex (SPCM_EVENT_HANDLE* phEvent, SPCM_MUTEX_HANDLE* phMutex, uint32 dwTimeoutMS = 0); + +// wait for one event without timeout and mutex +void spcm_vWaitEvent (SPCM_EVENT_HANDLE* phEvent); + +// signal an event +void spcm_vSignalEvent (SPCM_EVENT_HANDLE* phEvent); + + + +/* +************************************************************************** +mutex functions +************************************************************************** +*/ + +// create a mutex +bool spcm_bCreateMutex (SPCM_MUTEX_HANDLE* phMutex); + +// close the mutex +void spcm_vCloseMutex (SPCM_MUTEX_HANDLE* phMutex); + +// get the mutex +void spcm_vGetMutex (SPCM_MUTEX_HANDLE* phMutex); + +// release the mutex +void spcm_vReleaseMutex (SPCM_MUTEX_HANDLE* phMutex); + + + +/* +************************************************************************** +memory allocation functions for page aligned allocation +************************************************************************** +*/ + +// allocate a memory region of the given size in bytes, data is page aligned +void* pvAllocMemPageAligned (uint64 qwBytes); + +// free this data +void vFreeMemPageAligned (void* pvMemory, uint64 qwBytes); + + + +/* +************************************************************************** +system information functions +It is not possible to compile this function with the default SDK of +Visual Studio 6.0. +************************************************************************** +*/ + +#if (defined (_MSC_VER) && (_MSC_VER >= 1300)) || defined (__GNUC__) + uint64 qwGetTotalPhysicalMemory (); + uint64 qwGetTotalVirtualMemory (); +#endif + +} // end of namespace SPCM_NAMESPACE + + +// our namespace that we use inside the ostools functions +using namespace SPCM_NAMESPACE; + + +#endif diff --git a/AWGDependencies/Spectrum/common/ostools/spcm_ostools_linux.cpp b/AWGDependencies/Spectrum/common/ostools/spcm_ostools_linux.cpp new file mode 100644 index 0000000..96f0d19 --- /dev/null +++ b/AWGDependencies/Spectrum/common/ostools/spcm_ostools_linux.cpp @@ -0,0 +1,363 @@ +/* +************************************************************************** + +spcm_ostools.cpp (c) Spectrum GmbH + +************************************************************************** + +toosl functions that differ from OS to OS: +- Threads +- Events + +************************************************************************** +*/ + +#include "../../c_header/dlltyp.h" + +#include "spcm_oswrap.h" +#include "spcm_ostools.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + +// we're using this namespace in our program +namespace SPCM_NAMESPACE { + + +/* +************************************************************************** +dwGetTickCount: fake windows GetTickCount function for linux +************************************************************************** +*/ + +uint32 dwGetTickCount () + { + struct timespec ts; + clock_gettime (0, &ts); + return (uint32) 1000 * ts.tv_sec + ts.tv_nsec / 1000000; + } + + +/* +************************************************************************** +Sleep: suspend the thread for the number of ms + On some systems is the usleep parameter limited to 1000000. +************************************************************************** +*/ + +void vSleep_ms (uint32 dwMS) + { + uint32 dwRest_us, dwActual_us; + + dwRest_us = dwMS * 1000; + + // do/while construct to call usleep with zero delay too + do + { + dwActual_us = dwRest_us; + if (dwActual_us > 500000) + dwActual_us = 500000; + + dwRest_us -= dwActual_us; + + usleep (dwActual_us); + } + while (dwRest_us); + } + + +/* +************************************************************************** +Keyboard workaround functions +************************************************************************** +*/ + + + int cGetch() + { + static int ch = -1, fd = 0; + struct termios stTerm, stOldTerm; + + fd = fileno(stdin); + tcgetattr(fd, &stOldTerm); + stTerm = stOldTerm; + stTerm.c_lflag &= ~(ICANON|ECHO); + tcsetattr(fd, TCSANOW, &stTerm); + ch = getchar(); + tcsetattr(fd, TCSANOW, &stOldTerm); + + return ch; + } + +// *********************************************************************** + +int bKbhit(void) + { + struct termios stTerm, stOldTerm; + int fd = 0; + int c = 0; + + tcgetattr(fd, &stOldTerm); + memcpy(&stTerm, &stOldTerm, sizeof (stOldTerm)); + stTerm.c_lflag = stTerm.c_lflag & (!ICANON); + stTerm.c_cc[VMIN] = 0; + stTerm.c_cc[VTIME] = 1; + tcsetattr(fd, TCSANOW, &stTerm); + c = getchar(); + tcsetattr(fd, TCSANOW, &stOldTerm); + if (c != -1) + ungetc (c, stdin); + + return ((c != -1) ? 1 : 0); + } + + + +/* +************************************************************************** +memory allocation (page aligned) +************************************************************************** +*/ + +void* pvAllocMemPageAligned (uint64 qwBytes) + { + void* pvTmp; + int fd = open ("/dev/zero", O_RDONLY); + pvTmp = (void*) mmap (NULL, qwBytes, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); + + // set everything to zero to get memory allocated in physical mem + if (pvTmp != MAP_FAILED) + memset (pvTmp, 0, qwBytes); + else + pvTmp = NULL; + + close (fd); + return (pvTmp); + } + +// *********************************************************************** + +void vFreeMemPageAligned (void* pvAdr, uint64 qwBytes) + { + munmap (pvAdr, qwBytes); + } + + + +/* +************************************************************************** +Thread functions +************************************************************************** +*/ + +bool spcm_bCreateThread (SPCM_THREADFUNCTION* pfnThread, SPCM_THREAD_HANDLE* phThread, void* pvArguments) + { + pthread_create (phThread, NULL, pfnThread, pvArguments); + + return ((*phThread) != 0); + } + +// *********************************************************************** + +void spcm_vCloseThread (SPCM_THREAD_HANDLE* phThread) + { + pthread_detach (*phThread); + } + +// *********************************************************************** + +void spcm_vSetThreadPriority (SPCM_THREAD_HANDLE* phThread, SPCM_THREADPRIO ePriority) + { + struct sched_param stSchedParams; + int32 lPolicy; + pthread_getschedparam (*phThread, &lPolicy, &stSchedParams); + if (lPolicy == SCHED_OTHER) + { + switch (ePriority) + { + case ePrioMin: + stSchedParams.sched_priority = 5; // we are nice + break; + case ePrioNormal: + stSchedParams.sched_priority = 0; // we are normally nice + break; + case ePrioMax: + stSchedParams.sched_priority = -5; // we are not so nice + break; + } + } + else + { + int lPrioMin = sched_get_priority_min (lPolicy); + int lPrioMax = sched_get_priority_max (lPolicy); + switch (ePriority) + { + case ePrioMin: + stSchedParams.sched_priority = (lPrioMax - lPrioMin) / 4; + break; + case ePrioNormal: + stSchedParams.sched_priority = (lPrioMax - lPrioMin) / 2; + break; + case ePrioMax: + stSchedParams.sched_priority = 3 * (lPrioMax - lPrioMin) / 4; + break; + } + } + + pthread_setschedparam (*phThread, lPolicy, &stSchedParams); + } + +// *********************************************************************** + +void spcm_vJoinThread (SPCM_THREAD_HANDLE* phThread, uint32 /*dwTimeout_ms*/) + { + pthread_join (*phThread, NULL); + } + +// *********************************************************************** + +void spcm_vSuspendThread (uint32) + { + pthread_yield(); + } + + + +/* +************************************************************************** +Event functions +************************************************************************** +*/ + +bool spcm_bCreateEvent (SPCM_EVENT_HANDLE* phEvent) + { + return (pthread_cond_init (phEvent, NULL) == 0); + } + +// *********************************************************************** + +void spcm_vCloseEvent (SPCM_EVENT_HANDLE* phEvent) + { + pthread_cond_destroy (phEvent); + } + +// *********************************************************************** + +bool spcm_bWaitEventWithMutex (SPCM_EVENT_HANDLE* phEvent, SPCM_MUTEX_HANDLE* phMutex, uint32 dwTimeoutMS) + { + struct timespec ts; + struct timeval tp; + bool bRet; + + // get the current time and convert from timeval to timespec + if (dwTimeoutMS) + { + gettimeofday(&tp, NULL); + ts.tv_sec = tp.tv_sec; + ts.tv_nsec = tp.tv_usec * 1000; + + // add my wait time + ts.tv_sec += ((ts.tv_nsec / 1000 / 1000) + dwTimeoutMS) / 1000; + ts.tv_nsec = (((ts.tv_nsec / 1000 / 1000) + dwTimeoutMS) % 1000) * 1000 * 1000; + + bRet = (pthread_cond_timedwait (phEvent, phMutex, &ts) == 0); + } + + // no timeout specified, we wait forever + else + bRet = (pthread_cond_wait (phEvent, phMutex) == 0); + + return bRet; + } + +// *********************************************************************** + +void spcm_vWaitEvent (SPCM_EVENT_HANDLE* phEvent) + { + pthread_mutex_t hTmpMutex; + + pthread_mutex_init (&hTmpMutex, NULL); + pthread_mutex_lock (&hTmpMutex); + pthread_cond_wait (phEvent, &hTmpMutex); + pthread_mutex_destroy (&hTmpMutex); + } + +// *********************************************************************** + +void spcm_vSignalEvent (SPCM_EVENT_HANDLE* phEvent) + { + pthread_cond_signal (phEvent); + } + + + +/* +************************************************************************** +mutex functions +************************************************************************** +*/ + +bool spcm_bCreateMutex (SPCM_MUTEX_HANDLE* phMutex) + { + // as default Mutexes are recursive on Windows, but not on Linux, + // so to avoid different behaviour we also use recursive mutexes here + pthread_mutexattr_t ma; + pthread_mutexattr_init (&ma); + pthread_mutexattr_settype (&ma, PTHREAD_MUTEX_RECURSIVE); + return (pthread_mutex_init (phMutex, &ma) == 0); + } + +// *********************************************************************** + +void spcm_vCloseMutex (SPCM_MUTEX_HANDLE* phMutex) + { + pthread_mutex_destroy (phMutex); + } + +// *********************************************************************** + +void spcm_vGetMutex (SPCM_MUTEX_HANDLE* phMutex) + { + pthread_mutex_lock (phMutex); + } + +// *********************************************************************** + +void spcm_vReleaseMutex (SPCM_MUTEX_HANDLE* phMutex) + { + pthread_mutex_unlock (phMutex); + } + + + +/* +************************************************************************** +system information functions +************************************************************************** +*/ + +uint64 qwGetTotalPhysicalMemory () + { + struct sysinfo stSysInfo; + sysinfo (&stSysInfo); + return ((uint64)stSysInfo.totalram) * stSysInfo.mem_unit; + } + +uint64 qwGetTotalVirtualMemory () + { +#ifdef _LINUX64 + return (uint64)8 * 1024 * 1024 * 1024 * 1024; // 8TB, value taken from 64-Bit Windows +#else // 32 bit + return (uint64)3 * 1024 * 1024 * 1024; // 3GB for user-space in linux systems +#endif + } +} // end of SPCM_NAMESPACE diff --git a/AWGDependencies/Spectrum/common/ostools/spcm_ostools_qnx.cpp b/AWGDependencies/Spectrum/common/ostools/spcm_ostools_qnx.cpp new file mode 100644 index 0000000..8fd6683 --- /dev/null +++ b/AWGDependencies/Spectrum/common/ostools/spcm_ostools_qnx.cpp @@ -0,0 +1,375 @@ +/* +************************************************************************** + +spcm_ostools_qnx.cpp (c) Spectrum GmbH + +************************************************************************** + +toosl functions that differ from OS to OS: +- Threads +- Events + +************************************************************************** +*/ + +#include "../../c_header/dlltyp.h" + +#include "spcm_oswrap.h" +#include "spcm_ostools.h" + +#include "../kernel/spcm_kernel.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +// we're using this namespace in our program +namespace SPCM_NAMESPACE { + +using namespace std; + +/* +************************************************************************** +GetTickCount: fake windows GetTickCount function for QNX +************************************************************************** +*/ + +uint32 dwGetTickCount () + { + struct timespec ts; + clock_gettime (0, &ts); + return (uint32) 1000 * ts.tv_sec + ts.tv_nsec / 1000000; + } + + +/* +************************************************************************** +Sleep: suspend the thread for the number of ms + On some systems is the usleep parameter limited to 1000000. +************************************************************************** +*/ + +void Sleep (uint32 dwMS) + { + uint32 dwRest_us, dwActual_us; + + dwRest_us = dwMS * 1000; + + // do/while construct to call usleep with zero delay too + do + { + dwActual_us = dwRest_us; + if (dwActual_us > 500000) + dwActual_us = 500000; + + dwRest_us -= dwActual_us; + + usleep (dwActual_us); + } + while (dwRest_us); + } + + +/* +************************************************************************** +Keyboard workaround functions +************************************************************************** +*/ + + + int cGetch () + { + static int ch = -1, fd = 0; + struct termios stTerm, stOldTerm; + + fd = fileno(stdin); + tcgetattr(fd, &stOldTerm); + stTerm = stOldTerm; + stTerm.c_lflag &= ~(ICANON|ECHO); + tcsetattr(fd, TCSANOW, &stTerm); + ch = getchar(); + tcsetattr(fd, TCSANOW, &stOldTerm); + + return ch; + } + +// *********************************************************************** + +int bKbhit () + { + struct termios stTerm, stOldTerm; + int fd = 0; + int c = 0; + + tcgetattr(fd, &stOldTerm); + memcpy(&stTerm, &stOldTerm, sizeof (stOldTerm)); + stTerm.c_lflag = stTerm.c_lflag & (!ICANON); + stTerm.c_cc[VMIN] = 0; + stTerm.c_cc[VTIME] = 1; + tcsetattr(fd, TCSANOW, &stTerm); + c = getchar(); + tcsetattr(fd, TCSANOW, &stOldTerm); + if (c != -1) + ungetc (c, stdin); + + return ((c != -1) ? 1 : 0); + } + + + +/* +************************************************************************** +memory allocation (page aligned) +************************************************************************** +*/ + +void* pvAllocMemPageAligned (uint64 qwBytes) + { + void* pvTmp; + int fd = open ("/dev/zero", O_RDONLY); + pvTmp = (void*) mmap (NULL, qwBytes, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); + + // set everything to zero to get memory allocated in physical mem + if (pvTmp != MAP_FAILED) + memset (pvTmp, 0, qwBytes); + else + pvTmp = NULL; + + close (fd); + return (pvTmp); + } + +// *********************************************************************** + +void vFreeMemPageAligned (void* pvAdr, uint64 qwBytes) + { + munmap (pvAdr, qwBytes); + } + + + +/* +************************************************************************** +Thread functions +************************************************************************** +*/ + +bool spcm_bCreateThread (SPCM_THREADFUNCTION* pfnThread, SPCM_THREAD_HANDLE* phThread, void* pvArguments) + { + return (pthread_create (phThread, NULL, pfnThread, pvArguments) == EOK); + } + +// *********************************************************************** + +void spcm_vCloseThread (SPCM_THREAD_HANDLE* phThread) + { + pthread_detach (*phThread); + } + +// *********************************************************************** + +void spcm_vSetThreadPriority (SPCM_THREAD_HANDLE* phThread, SPCM_THREADPRIO ePriority) + { + struct sched_param stSchedParams; + int32 lPolicy; + pthread_getschedparam (*phThread, &lPolicy, &stSchedParams); + if (lPolicy == SCHED_OTHER) + { + switch (ePriority) + { + case ePrioMin: + stSchedParams.sched_priority = 5; // we are nice + break; + case ePrioNormal: + stSchedParams.sched_priority = 0; // we are normally nice + break; + case ePrioMax: + stSchedParams.sched_priority = -5; // we are not so nice + break; + } + } + else + { + int lPrioMin = sched_get_priority_min (lPolicy); + int lPrioMax = sched_get_priority_max (lPolicy); + switch (ePriority) + { + case ePrioMin: + stSchedParams.sched_priority = (lPrioMax - lPrioMin) / 4; + break; + case ePrioNormal: + stSchedParams.sched_priority = (lPrioMax - lPrioMin) / 2; + break; + case ePrioMax: + stSchedParams.sched_priority = 3 * (lPrioMax - lPrioMin) / 4; + break; + } + } + + pthread_setschedparam (*phThread, lPolicy, &stSchedParams); + } + +// *********************************************************************** + +void spcm_vJoinThread (SPCM_THREAD_HANDLE* phThread, uint32 /*dwTimeout_ms*/) + { + pthread_join (*phThread, NULL); + } + +// *********************************************************************** + +void spcm_vSuspendThread (uint32) + { + //pthread_yield (); + sched_yield (); // TODO: guter Ersatz? + } + + + +/* +************************************************************************** +Event functions +************************************************************************** +*/ + +bool spcm_bCreateEvent (SPCM_EVENT_HANDLE* phEvent) + { + // Set up the condvar attributes to use CLOCK_MONOTONIC + pthread_condattr_t attr; + pthread_condattr_init( &attr); + pthread_condattr_setclock( &attr, CLOCK_MONOTONIC); + + return (pthread_cond_init (phEvent, &attr) == EOK); + } + +// *********************************************************************** + +void spcm_vCloseEvent (SPCM_EVENT_HANDLE* phEvent) + { + pthread_cond_destroy (phEvent); + } + +// *********************************************************************** + +bool spcm_bWaitEventWithMutex (SPCM_EVENT_HANDLE* phEvent, SPCM_MUTEX_HANDLE* phMutex, uint32 dwTimeoutMS) + { + bool bRet; + + if (dwTimeoutMS) + { + struct timespec stTimeSpec; + clock_gettime (CLOCK_MONOTONIC, &stTimeSpec); + + // add my wait time + stTimeSpec.tv_sec += ((stTimeSpec.tv_sec) + dwTimeoutMS) / 1000; + stTimeSpec.tv_nsec = (((stTimeSpec.tv_nsec / 1000 / 1000) + dwTimeoutMS) % 1000) * 1000 * 1000; + + bRet = (pthread_cond_timedwait (phEvent, phMutex, &stTimeSpec) == 0); + } + + // no timeout specified, we wait forever + else + bRet = (pthread_cond_wait (phEvent, phMutex) == 0); + + return bRet; + } + +// *********************************************************************** + +void spcm_vWaitEvent (SPCM_EVENT_HANDLE* phEvent) + { + pthread_mutex_t hTmpMutex; + + pthread_mutex_init (&hTmpMutex, NULL); + pthread_mutex_lock (&hTmpMutex); + pthread_cond_wait (phEvent, &hTmpMutex); + pthread_mutex_destroy (&hTmpMutex); + } + +// *********************************************************************** + +void spcm_vSignalEvent (SPCM_EVENT_HANDLE* phEvent) + { + pthread_cond_signal (phEvent); + } + + + +/* +************************************************************************** +mutex functions +************************************************************************** +*/ + +bool spcm_bCreateMutex (SPCM_MUTEX_HANDLE* phMutex) + { + return (pthread_mutex_init (phMutex, NULL) == EOK); + } + +// *********************************************************************** + +void spcm_vCloseMutex (SPCM_MUTEX_HANDLE* phMutex) + { + pthread_mutex_destroy (phMutex); + } + +// *********************************************************************** + +void spcm_vGetMutex (SPCM_MUTEX_HANDLE* phMutex) + { + pthread_mutex_lock (phMutex); + } + +// *********************************************************************** + +void spcm_vReleaseMutex (SPCM_MUTEX_HANDLE* phMutex) + { + pthread_mutex_unlock (phMutex); + } + + + +/* +************************************************************************** +system information functions +************************************************************************** +*/ + +uint64 qwGetTotalPhysicalMemory () + { + struct asinfo_entry* pstEntries = SYSPAGE_ENTRY(asinfo); + size_t count = SYSPAGE_ENTRY_SIZE(asinfo) / sizeof(struct asinfo_entry); + char* szStrings = SYSPAGE_ENTRY(strings)->data; + + uint64 qwTotal = 0; + for (size_t i = 0; i < count; i++) + { + struct asinfo_entry* pstEntry = &pstEntries[i]; + if (strcmp (szStrings + pstEntry->name, "ram") == 0) + { + qwTotal += pstEntry->end - pstEntry->start + 1; + } + } + + return qwTotal; + } + +uint64 qwGetTotalVirtualMemory () + { +#ifdef _LINUX64 + return (uint64)8 * 1024 * 1024 * 1024 * 1024; // 8TB, value taken from 64-Bit Windows +#else // 32 bit + return (uint64)3 * 1024 * 1024 * 1024; // 3GB for user-space in QNX systems +#endif + } +} // end of SPCM_NAMESPACE diff --git a/AWGDependencies/Spectrum/common/ostools/spcm_ostools_win.cpp b/AWGDependencies/Spectrum/common/ostools/spcm_ostools_win.cpp new file mode 100644 index 0000000..2bf7961 --- /dev/null +++ b/AWGDependencies/Spectrum/common/ostools/spcm_ostools_win.cpp @@ -0,0 +1,259 @@ +/* +************************************************************************** + +spcm_ostools.cpp (c) Spectrum GmbH + +************************************************************************** + +toosl functions that differ from OS to OS: +- Threads +- Events + +************************************************************************** +*/ + +#include "../../c_header/dlltyp.h" + +#include "spcm_oswrap.h" +#include "spcm_ostools.h" + +#include + + +// we're using this namespace in our program +namespace SPCM_NAMESPACE { + + +uint32 dwGetTickCount () + { + return ::GetTickCount (); + } + +void vSleep_ms (unsigned int dwMS) + { + ::Sleep (dwMS); + } + +/* +************************************************************************** +Keyboard functions (wrapped for combined linux/windows use) +************************************************************************** +*/ + +int bKbhit(void) + { + return _kbhit(); + } + +// *********************************************************************** + +int cGetch() + { + return _getch(); + } + + + +/* +************************************************************************** +Thread functions +************************************************************************** +*/ + +bool spcm_bCreateThread (SPCM_THREADFUNCTION* pfnThread, SPCM_THREAD_HANDLE* phThread, void* pvArguments) + { + uint32 dwThreadId; + + (*phThread) = CreateThread (NULL, 0, pfnThread, pvArguments, 0, &dwThreadId); + + return ((*phThread) != NULL); + } + +// *********************************************************************** + +void spcm_vCloseThread (SPCM_THREAD_HANDLE* phThread) + { + if (*phThread) + CloseHandle (*phThread); + } + +// *********************************************************************** + +void spcm_vJoinThread (SPCM_THREAD_HANDLE* phThread, uint32 dwTimeout_ms) + { + WaitForSingleObject (*phThread, dwTimeout_ms ? dwTimeout_ms : INFINITE); + } + +// *********************************************************************** + +void spcm_vSetThreadPriority (SPCM_THREAD_HANDLE* phThread, SPCM_THREADPRIO ePriority) + { + switch (ePriority) + { + case ePrioMin: + SetThreadPriority (*phThread, THREAD_PRIORITY_BELOW_NORMAL); + break; + case ePrioNormal: + SetThreadPriority (*phThread, THREAD_PRIORITY_NORMAL); + break; + case ePrioMax: + SetThreadPriority (*phThread, THREAD_PRIORITY_ABOVE_NORMAL); + break; + } + } + +// *********************************************************************** + +void spcm_vSuspendThread (uint32 dwMS) + { + Sleep (dwMS); + } + + +/* +************************************************************************** +Event functions +************************************************************************** +*/ + +bool spcm_bCreateEvent (SPCM_EVENT_HANDLE* phEvent) + { + (*phEvent) = CreateEvent (NULL, false, false, NULL); + return ((*phEvent) != NULL); + } + +// *********************************************************************** + +void spcm_vCloseEvent (SPCM_EVENT_HANDLE* phEvent) + { + if (*phEvent) + CloseHandle (*phEvent); + } + +// *********************************************************************** + +bool spcm_bWaitEventWithMutex (SPCM_EVENT_HANDLE* phEvent, SPCM_MUTEX_HANDLE* phMutex, uint32 dwTimeoutMS) + { + uint32 dwReturn; + + // release the mutex, wait for the event and get the mutex again + LeaveCriticalSection (phMutex); + dwReturn = WaitForSingleObject ((*phEvent), dwTimeoutMS ? dwTimeoutMS : INFINITE); + EnterCriticalSection (phMutex); + + return (dwReturn != WAIT_TIMEOUT); + } + +// *********************************************************************** + +void spcm_vWaitEvent (SPCM_EVENT_HANDLE* phEvent) + { + WaitForSingleObject ((*phEvent), INFINITE); + } + +// *********************************************************************** + +void spcm_vSignalEvent (SPCM_EVENT_HANDLE* phEvent) + { + SetEvent (*phEvent); + } + + + +/* +************************************************************************** +Mutex functions (we use CriticalSection here to speed it up!) +************************************************************************** +*/ + +bool spcm_bCreateMutex (SPCM_MUTEX_HANDLE* phMutex) + { + InitializeCriticalSection (phMutex); + return true; + } + +// *********************************************************************** + +void spcm_vCloseMutex (SPCM_MUTEX_HANDLE* phMutex) + { + if (phMutex) + DeleteCriticalSection (phMutex); + } + +// *********************************************************************** + +void spcm_vGetMutex (SPCM_MUTEX_HANDLE* phMutex) + { + EnterCriticalSection (phMutex); + } + +// *********************************************************************** + +void spcm_vReleaseMutex (SPCM_MUTEX_HANDLE* phMutex) + { + LeaveCriticalSection (phMutex); + } + + + +/* +************************************************************************** +Data allocation functions +************************************************************************** +*/ + +void* pvAllocMemPageAligned (uint64 qwBytes) + { + // for unknown reasons VirtualAlloc/VirtualFree leaks memory if qwBytes < 4096 (page size) + // therefore use _aligned_malloc () to get small amounts of page aligned memory + if (qwBytes >= 4096) + return VirtualAlloc (NULL, (size_t) qwBytes, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); + else + { + void* pvMem = _aligned_malloc ((size_t) qwBytes, 4096); + if (pvMem == NULL) + return NULL; + memset (pvMem, 0, (size_t) qwBytes); + return pvMem; + } + } + +// *********************************************************************** + +void vFreeMemPageAligned (void* pvMemory, uint64 qwBytes) + { + // for unknown reasons VirtualAlloc/VirtualFree leaks memory if qwBytes < 4096 (page size) + // therefore use _aligned_malloc () to get small amounts of page aligned memory + if (qwBytes >= 4096) + VirtualFree (pvMemory, 0, MEM_RELEASE); + else + _aligned_free (pvMemory); + } + +/* +************************************************************************** +System information functions +It is not possible to compile this function with the default SDK of +Visual Studio 6.0. +************************************************************************** +*/ + +#if defined (_MSC_VER) && (_MSC_VER >= 1300) + uint64 qwGetTotalPhysicalMemory () + { + MEMORYSTATUSEX stMemoryStatus; + stMemoryStatus.dwLength = sizeof (stMemoryStatus); + GlobalMemoryStatusEx (&stMemoryStatus); + return stMemoryStatus.ullTotalPhys; + } + + uint64 qwGetTotalVirtualMemory () + { + MEMORYSTATUSEX stMemoryStatus; + stMemoryStatus.dwLength = sizeof (stMemoryStatus); + GlobalMemoryStatusEx (&stMemoryStatus); + return stMemoryStatus.ullTotalVirtual; + } +#endif + +} // end of namespace SPCM_NAMESPACE diff --git a/AWGDependencies/Spectrum/common/ostools/spcm_oswrap.h b/AWGDependencies/Spectrum/common/ostools/spcm_oswrap.h new file mode 100644 index 0000000..56cad96 --- /dev/null +++ b/AWGDependencies/Spectrum/common/ostools/spcm_oswrap.h @@ -0,0 +1,71 @@ +#ifndef SPCM_OSWRAP_H +#define SPCM_OSWRAP_H + + + +/* +************************************************************************** + +spcm_oswrap.h (c) Spectrum GmbH , 08/2005 + +************************************************************************** + +Contains some wrapper functions, OS specific defines and OS specific +includes to make the source compilable independant of the operating +system + +************************************************************************** +*/ + + + +/* +************************************************************************** +Linux +************************************************************************** +*/ + +#if defined (_LINUX) || defined (_QNX) +# include +# include + +// ----- Linux specific defines ----- +# define NULL_HANDLE 0 +# define _stdcall +# define SPCM_THREAD_RETURN void* +# define SPCM_THREAD_CALLTYPE + +// ----- handles ----- +# define SPCM_THREAD_HANDLE pthread_t +# define SPCM_EVENT_HANDLE pthread_cond_t +# define SPCM_MUTEX_HANDLE pthread_mutex_t + + + +/* +************************************************************************** +Windows +************************************************************************** +*/ + +#else + +// ----- Windows specific includes ----- +# include + +// ----- Windows specific defines +# define NULL_HANDLE NULL +# define SPCM_THREAD_RETURN uint32 +# define SPCM_THREAD_CALLTYPE _stdcall + +// ----- handles ----- +# define SPCM_THREAD_HANDLE HANDLE +# define SPCM_EVENT_HANDLE HANDLE +# define SPCM_MUTEX_HANDLE CRITICAL_SECTION + +# if (_MSC_VER < 1900) // 1900 = VS2015 +# define snprintf _snprintf +# endif +#endif + +#endif //#ifndef SPCM_OSWRAP_H diff --git a/AWGDependencies/Spectrum/common/spcm_lib_card.cpp b/AWGDependencies/Spectrum/common/spcm_lib_card.cpp new file mode 100644 index 0000000..ae72d59 --- /dev/null +++ b/AWGDependencies/Spectrum/common/spcm_lib_card.cpp @@ -0,0 +1,1787 @@ +/* +************************************************************************** + +spcm_lib_card.cpp (c) Spectrum GmbH + +************************************************************************** + +Supplies different common functions for C/C++ programs accessing the +SpcM driver interface. Feel free to use this source for own projects and +modify it in any kind + +Documentation for the API as well as a detailed description of the hardware +can be found in the manual for each device which can be found on our website: +https://www.spectrum-instrumentation.com/en/downloads + +Further information can be found online in the Knowledge Base: +https://www.spectrum-instrumentation.com/en/knowledge-base-overview + +************************************************************************** +*/ + + + +// ----- include of common example librarys ----- +#include "../common/spcm_lib_card.h" + +// ----- standard c include files ----- +#include +#include +#include + + + +/* +************************************************************************** +************************************************************************** +************************************************************************** + Initialisation and error handling +************************************************************************** +************************************************************************** +************************************************************************** +*/ + + + +/* +************************************************************************** +bSpcMInitCardByIdx: + +opens the driver with the given indes, reads out card information and +fills the CARDINFO structure +************************************************************************** +*/ + +bool bSpcMInitCardByName (ST_SPCM_CARDINFO *pstCardInfo, char* szDrvName); + +bool bSpcMInitCardByIdx (ST_SPCM_CARDINFO *pstCardInfo, int32 lCardIdx) + { + if (!pstCardInfo) + return false; + + // open the driver for card. We can use the linux notation here as the windows driver + // only looks for the ending number. Change this line if the linux drivers are named + // different than default + char szDrvName[20]; + sprintf (szDrvName, "/dev/spcm%d", lCardIdx); + return bSpcMInitCardByName (pstCardInfo, szDrvName); + } + +bool bSpcMInitCardByIdx (ST_SPCM_CARDINFO *pstCardInfo, const char* szIP, int32 lCardIdx) + { + if (!pstCardInfo) + return false; + + char szVISA[50]; + sprintf (szVISA, "TCPIP::%s::inst%d::INSTR", szIP, lCardIdx); + return bSpcMInitCardByName (pstCardInfo, szVISA); + } + +bool bSpcMInitCardByName (ST_SPCM_CARDINFO *pstCardInfo, char* szDrvName) + { + int32 lTmp; + + // clear the card info to have defined values + memset ((void*) pstCardInfo, 0, sizeof(ST_SPCM_CARDINFO)); + pstCardInfo->lSetChannels = 1; + pstCardInfo->llSetSamplerate = 1; + + + pstCardInfo->hDrv = spcm_hOpen (szDrvName); + if (!pstCardInfo->hDrv) + { + spcm_dwGetErrorInfo_i32 (pstCardInfo->hDrv, NULL, NULL, pstCardInfo->szError); + return false; + } + + // ----- get index of card from name ----- + if (strncmp (szDrvName, "TCPIP", 5) == 0) + { + // if VISA-String contains instX, we extract the number + // otherwise we default to zero + char* szInst = strstr (szDrvName, "inst"); + if (szInst != NULL) + pstCardInfo->lCardIdx = atoi (strpbrk (szInst, "0123456789")); + else + pstCardInfo->lCardIdx = 0; + + pstCardInfo->bRemote = true; + } + else + { + // name should be /dev/spcmX or just a number, so we locate first number in string + // and convert it to integer + pstCardInfo->lCardIdx = atoi (strpbrk (szDrvName, "0123456789")); + } + + // read out card information and store it in the card info structure + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_PCITYP, &pstCardInfo->lCardType); + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_PCISERIALNO, &pstCardInfo->lSerialNumber); + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_PCIFEATURES, &pstCardInfo->lFeatureMap); + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_PCIEXTFEATURES, &pstCardInfo->lExtFeatureMap); + spcm_dwGetParam_i64 (pstCardInfo->hDrv, SPC_PCIMEMSIZE, &pstCardInfo->llInstMemBytes); + spcm_dwGetParam_i64 (pstCardInfo->hDrv, SPC_MIINST_MINADCLOCK, &pstCardInfo->llMinSamplerate); + spcm_dwGetParam_i64 (pstCardInfo->hDrv, SPC_MIINST_MAXADCLOCK, &pstCardInfo->llMaxSamplerate); + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_MIINST_MODULES, &pstCardInfo->lModulesCount); + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_MIINST_CHPERMODULE, &pstCardInfo->lMaxChannels); + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_MIINST_BYTESPERSAMPLE, &pstCardInfo->lBytesPerSample); + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_GETDRVVERSION, &pstCardInfo->lLibVersion); + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_GETKERNELVERSION, &pstCardInfo->lKernelVersion); + + + // fill in the examples flags + pstCardInfo->bM2i = false; + pstCardInfo->bM3i = false; + pstCardInfo->bM4i = false; + pstCardInfo->bM2p = false; + switch (pstCardInfo->lCardType & TYP_SERIESMASK) + { + case TYP_M2ISERIES: pstCardInfo->bM2i = true; break; + case TYP_M2IEXPSERIES: pstCardInfo->bM2i = true; break; + case TYP_M3ISERIES: pstCardInfo->bM3i = true; break; + case TYP_M3IEXPSERIES: pstCardInfo->bM3i = true; break; + case TYP_M4IEXPSERIES: pstCardInfo->bM4i = true; break; + case TYP_M4XEXPSERIES: pstCardInfo->bM4i = true; break; + case TYP_M2PEXPSERIES: pstCardInfo->bM2p = true; break; + default: break; + } + + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_PCIVERSION, &lTmp); + pstCardInfo->lBaseHwVersion = (lTmp >> 16) & 0xffff; + pstCardInfo->lCtrlFwVersion = lTmp & 0xffff; + + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_PCIMODULEVERSION, &lTmp); + pstCardInfo->lModHwVersion = (lTmp >> 16) & 0xffff; + pstCardInfo->lModFwVersion = lTmp & 0xffff; + + // we need to recalculate the channels value as the driver returns channels per module + pstCardInfo->lMaxChannels *= pstCardInfo->lModulesCount; + + // examin the type of driver + int32 lFncType; + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_FNCTYPE, &lFncType); + + switch (lFncType) + { + case SPCM_TYPE_AI: pstCardInfo->eCardFunction = AnalogIn; break; + case SPCM_TYPE_AO: pstCardInfo->eCardFunction = AnalogOut; break; + case SPCM_TYPE_DI: pstCardInfo->eCardFunction = DigitalIn; break; + case SPCM_TYPE_DO: pstCardInfo->eCardFunction = DigitalOut; break; + case SPCM_TYPE_DIO: pstCardInfo->eCardFunction = DigitalIO; break; + } + + // loading the function dependant part of the CardInfo structure + switch (pstCardInfo->eCardFunction) + { + case AnalogIn: + { + int i; + int32 lAIFeatures; + + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_MIINST_BITSPERSAMPLE, &pstCardInfo->uCfg.stAI.lResolution); + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_READAIPATHCOUNT, &pstCardInfo->uCfg.stAI.lPathCount); + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_READIRCOUNT, &pstCardInfo->uCfg.stAI.lRangeCount); + for (i=0; (iuCfg.stAI.lRangeCount) && (ihDrv, SPC_READRANGEMIN0 + i, &pstCardInfo->uCfg.stAI.lRangeMin[i]); + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_READRANGEMAX0 + i, &pstCardInfo->uCfg.stAI.lRangeMax[i]); + } + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_READAIFEATURES, &lAIFeatures); + + pstCardInfo->uCfg.stAI.bInputTermAvailable = (lAIFeatures & SPCM_AI_TERM) != 0; + pstCardInfo->uCfg.stAI.bDiffModeAvailable = (lAIFeatures & SPCM_AI_DIFF) != 0; + pstCardInfo->uCfg.stAI.bACCouplingAvailable =(lAIFeatures & SPCM_AI_ACCOUPLING) != 0; + pstCardInfo->uCfg.stAI.bBWLimitAvailable = (lAIFeatures & SPCM_AI_LOWPASS) != 0; + pstCardInfo->uCfg.stAI.bOffsPercentMode = (lAIFeatures & SPCM_AI_OFFSPERCENT) != 0; + + // SPC_MIINST_MAXADCVALUE added with driver version 1.34, otherwise we have to calc it from the resolution + if (ERR_OK != spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_MIINST_MAXADCVALUE, &pstCardInfo->uCfg.stAI.lMaxADCValue)) + { + spcm_dwGetErrorInfo_i32 (pstCardInfo->hDrv, NULL, NULL, NULL); + switch (pstCardInfo->uCfg.stAI.lResolution) + { + case 8: pstCardInfo->uCfg.stAI.lMaxADCValue = 128; break; + case 12: pstCardInfo->uCfg.stAI.lMaxADCValue = 2048; break; + case 14: pstCardInfo->uCfg.stAI.lMaxADCValue = 8192; break; + default: + case 16: pstCardInfo->uCfg.stAI.lMaxADCValue = 32768; break; + } + } + + break; + } + + case AnalogOut: + { + int32 lAOFeatures; + + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_READAOFEATURES, &lAOFeatures); + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_MIINST_BITSPERSAMPLE, &pstCardInfo->uCfg.stAO.lResolution); + + pstCardInfo->uCfg.stAO.bGainProgrammable = (lAOFeatures & SPCM_AO_PROGGAIN) != 0; + pstCardInfo->uCfg.stAO.bOffsetProgrammable = (lAOFeatures & SPCM_AO_PROGOFFSET) != 0; + pstCardInfo->uCfg.stAO.bFilterAvailable = (lAOFeatures & SPCM_AO_PROGFILTER) != 0; + pstCardInfo->uCfg.stAO.bStopLevelProgrammable = (lAOFeatures & SPCM_AO_PROGSTOPLEVEL) != 0; + pstCardInfo->uCfg.stAO.bDiffModeAvailable = (lAOFeatures & SPCM_AO_DIFF) != 0; + + // SPC_MIINST_MAXADCVALUE added with driver version 1.34, otherwise we have to calc it from the resolution + if (ERR_OK != spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_MIINST_MAXADCVALUE, &pstCardInfo->uCfg.stAO.lMaxDACValue)) + { + spcm_dwGetErrorInfo_i32 (pstCardInfo->hDrv, NULL, NULL, NULL); + switch (pstCardInfo->uCfg.stAI.lResolution) + { + case 8: pstCardInfo->uCfg.stAO.lMaxDACValue = 127; break; + case 12: pstCardInfo->uCfg.stAO.lMaxDACValue = 2047; break; + case 14: pstCardInfo->uCfg.stAO.lMaxDACValue = 8191; break; + default: + case 16: pstCardInfo->uCfg.stAO.lMaxDACValue = 32767; break; + } + } + else + { + // since driver version build 3738 is the value incremented + if ((pstCardInfo->lLibVersion & 0xffff) >= 3738) + pstCardInfo->uCfg.stAO.lMaxDACValue--; + } + + break; + } + + case DigitalIn: + case DigitalOut: + case DigitalIO: + { + if ((pstCardInfo->eCardFunction == DigitalIn) || (pstCardInfo->eCardFunction == DigitalIO)) + { + int32 lDIFeatures; + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_READDIFEATURES, &lDIFeatures); + + pstCardInfo->uCfg.stDIO.bInputTermAvailable = (lDIFeatures & SPCM_DI_TERM) != 0; + pstCardInfo->uCfg.stDIO.bDiffModeAvailable = (lDIFeatures & SPCM_DI_DIFF) != 0; + } + + if ((pstCardInfo->eCardFunction == DigitalOut) || (pstCardInfo->eCardFunction == DigitalIO)) + { + int32 lDOFeatures; + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_READDOFEATURES, &lDOFeatures); + + pstCardInfo->uCfg.stDIO.bDiffModeAvailable = (lDOFeatures & SPCM_DO_DIFF) != 0; + pstCardInfo->uCfg.stDIO.bStopLevelProgrammable = (lDOFeatures & SPCM_DO_PROGSTOPLEVEL) != 0; + pstCardInfo->uCfg.stDIO.bOutputLevelProgrammable = (lDOFeatures & SPCM_DO_PROGOUTLEVELS) != 0; + } + + // grouping is the number of channels in one group, we recalculate this to the number of groups + spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_READCHGROUPING, &pstCardInfo->uCfg.stDIO.lGroups); + pstCardInfo->uCfg.stDIO.lGroups = pstCardInfo->lMaxChannels / pstCardInfo->uCfg.stDIO.lGroups; + + break; + } + + default: + break; + } + return true; + } + + + +/* +************************************************************************** +vSpcMCloseCard: + +closes the driver +************************************************************************** +*/ + +void vSpcMCloseCard (ST_SPCM_CARDINFO *pstCardInfo) + { + if (!pstCardInfo) + return; + + if (pstCardInfo->hDrv) + { + spcm_vClose (pstCardInfo->hDrv); + pstCardInfo->hDrv = NULL; + } + + } + + + +/* +************************************************************************** +nSpcMErrorMessageStdOut: + +prints the error message to std out and ends the driver if it's active +program can be left with this function +************************************************************************** +*/ + +int nSpcMErrorMessageStdOut (ST_SPCM_CARDINFO *pstCardInfo, const char* pszMessage, bool bPrintCardErr) + { + if (!pstCardInfo) + return -2; + + printf (pszMessage); + + if (bPrintCardErr) + printf (pstCardInfo->szError); + + if (pstCardInfo->hDrv) + vSpcMCloseCard (pstCardInfo); + pstCardInfo->hDrv = NULL; + + return -1; + } + + + +/* +************************************************************************** +pszSpcMTranslateRuntimeError: translates a runtime error code and prints + it to a given buffer +************************************************************************** +*/ + +char* pszSpcMTranslateRuntimeError (uint32 dwErrorCode, char* pszBuffer) + { + if (!pszBuffer) + return NULL; + + switch (dwErrorCode) + { + case ERR_OK: sprintf (pszBuffer, "No Error"); break; + case ERR_ABORT: sprintf (pszBuffer, "Abort of Wait Function by Stop Command"); break; + case ERR_TIMEOUT: sprintf (pszBuffer, "Timeout"); break; + case ERR_FIFOBUFOVERRUN: sprintf (pszBuffer, "FIFO SW Buffer Overrun"); break; + case ERR_FIFOHWOVERRUN: sprintf (pszBuffer, "FIFO HW Buffer Overrun"); break; + case ERR_FIFOFINISHED: sprintf (pszBuffer, "FIFO Mode finished"); break; + default: sprintf (pszBuffer, "Unknown Error Code %d", dwErrorCode); break; + } + + return pszBuffer; + } + + + +/* +************************************************************************** +pszSpcMPrintCardInfo: prints the card information to a string for display. +************************************************************************** +*/ + +void vStrCatWithLen (char* pszDest, char* pszSource, int32 lStrLen) + { + int nPos = 0; + + while ((nPos++ < lStrLen) && (*pszDest)) + pszDest++; + + while (nPos < lStrLen) + { + *pszDest++ = *pszSource++; + if (!(*pszSource)) + { + (*pszDest) = 0; + return; + } + } + } + +// ************************************************************************* + +char* pszSpcMPrintCardInfo (ST_SPCM_CARDINFO *pstCardInfo, char* pszBuffer, int32 lStrLen, bool bExtended) + { + char szTmp[100]; + + if (!pstCardInfo || !pszBuffer) + return NULL; + + memset (pszBuffer, 0, lStrLen); + + // the card type + serial number + switch (pstCardInfo->lCardType & TYP_SERIESMASK) + { + case TYP_M2ISERIES: sprintf (szTmp, "M2i.%04x sn %05d\n", pstCardInfo->lCardType & TYP_VERSIONMASK, pstCardInfo->lSerialNumber); break; + case TYP_M2IEXPSERIES: sprintf (szTmp, "M2i.%04x-Exp sn %05d\n", pstCardInfo->lCardType & TYP_VERSIONMASK, pstCardInfo->lSerialNumber); break; + case TYP_M3ISERIES: sprintf (szTmp, "M3i.%04x sn %05d\n", pstCardInfo->lCardType & TYP_VERSIONMASK, pstCardInfo->lSerialNumber); break; + case TYP_M3IEXPSERIES: sprintf (szTmp, "M3i.%04x-Exp sn %05d\n", pstCardInfo->lCardType & TYP_VERSIONMASK, pstCardInfo->lSerialNumber); break; + case TYP_M4IEXPSERIES: sprintf (szTmp, "M4i.%04x-x8 sn %05d\n", pstCardInfo->lCardType & TYP_VERSIONMASK, pstCardInfo->lSerialNumber); break; + case TYP_M4XEXPSERIES: sprintf (szTmp, "M4x.%04x-x4 sn %05d\n", pstCardInfo->lCardType & TYP_VERSIONMASK, pstCardInfo->lSerialNumber); break; + case TYP_M2PEXPSERIES: sprintf (szTmp, "M2p.%04x-x4 sn %05d\n", pstCardInfo->lCardType & TYP_VERSIONMASK, pstCardInfo->lSerialNumber); break; + default: sprintf (szTmp, "Typ: %x not supported so far\n", pstCardInfo->lCardType); break; + } + vStrCatWithLen (pszBuffer, szTmp, lStrLen); + + // standard details of card + if (bExtended) + { + sprintf (szTmp, " Installed memory: %lld MByte\n", pstCardInfo->llInstMemBytes / 1024 / 1024); + vStrCatWithLen (pszBuffer, szTmp, lStrLen); + sprintf (szTmp, " Max sampling rate: %.1f MS/s\n", (double) pstCardInfo->llMaxSamplerate / 1000000); + vStrCatWithLen (pszBuffer, szTmp, lStrLen); + sprintf (szTmp, " Channels: %d\n", pstCardInfo->lMaxChannels); + vStrCatWithLen (pszBuffer, szTmp, lStrLen); + sprintf (szTmp, " Kernel Version: %d.%02d build %d\n", pstCardInfo->lKernelVersion >> 24, (pstCardInfo->lKernelVersion >> 16) & 0xff, pstCardInfo->lKernelVersion & 0xffff); + vStrCatWithLen (pszBuffer, szTmp, lStrLen); + sprintf (szTmp, " Library Version %d.%02d build %d\n", pstCardInfo->lLibVersion >> 24, (pstCardInfo->lLibVersion >> 16) & 0xff, pstCardInfo->lLibVersion & 0xffff); + vStrCatWithLen (pszBuffer, szTmp, lStrLen); + } + + return pszBuffer; + } + +/* +************************************************************************** +pszSpcMPrintDocumentationLink: builds a link to the download area for the specific card +************************************************************************** +*/ + +char* pszSpcMPrintDocumentationLink (const ST_SPCM_CARDINFO* pstCardInfo, char* pszBuffer, int32 lStrLen) + { + if (!pstCardInfo || !pszBuffer) + return NULL; + + memset (pszBuffer, 0, lStrLen); + + const char* szSeries = NULL; + if (pstCardInfo->bRemote) + szSeries = "DN2"; + else + { + switch (pstCardInfo->lCardType & TYP_SERIESMASK) + { + case TYP_M2ISERIES: szSeries = "M2i"; break; + case TYP_M2IEXPSERIES: szSeries = "\"M2i Express\""; break; + case TYP_M3ISERIES: szSeries = "M3i"; break; + case TYP_M3IEXPSERIES: szSeries = "\"M3i Express\""; break; + case TYP_M4IEXPSERIES: szSeries = "M4i"; break; + case TYP_M4XEXPSERIES: szSeries = "M4x"; break; + case TYP_M2PEXPSERIES: szSeries = "M2p"; break; + } + } + int lOffset = sprintf (pszBuffer, "A detailed description of the API as well as the hardware can be found in the manual:\n"); + lOffset += sprintf (pszBuffer + lOffset, "https://www.spectrum-instrumentation.com/en/downloads/drivers?Series=%s&Families=%xxx&Tab=Documents\n\n", szSeries, ((pstCardInfo->lCardType & TYP_FAMILYMASK) >> 8)); + + lOffset += sprintf (pszBuffer + lOffset, "Further information can be found online in the Knowledge Base:\n"); + lOffset += sprintf (pszBuffer + lOffset, "https://www.spectrum-instrumentation.com/en/knowledge-base-overview\n\n"); + + return pszBuffer; + } + +/* +************************************************************************** +bSpcMCheckSetError: checks for error code and reads out error information +************************************************************************** +*/ + +bool bSpcMCheckSetError (uint32 dwError, ST_SPCM_CARDINFO *pstCardInfo) + { + if (dwError) + { + pstCardInfo->bSetError = true; + spcm_dwGetErrorInfo_i32 (pstCardInfo->hDrv, NULL, NULL, pstCardInfo->szError); + return false; + } + return true; + } + + + + +/* +************************************************************************** +************************************************************************** +************************************************************************** + Mode setup +************************************************************************** +************************************************************************** +************************************************************************** +*/ + + + +/* +************************************************************************** +bSpcMSetupModeRecStdSingle: record standard mode single +************************************************************************** +*/ + +bool bSpcMSetupModeRecStdSingle (ST_SPCM_CARDINFO *pstCardInfo, uint64 qwChEnable, int64 llMemSamples, int64 llPostSamples) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // setup the mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CARDMODE, SPC_REC_STD_SINGLE); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_CHENABLE, qwChEnable); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_MEMSIZE, llMemSamples); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_POSTTRIGGER, llPostSamples); + + // store some information in the structure + pstCardInfo->llSetMemsize = llMemSamples; + pstCardInfo->qwSetChEnableMap = qwChEnable; + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_CHCOUNT, &pstCardInfo->lSetChannels); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupModeRecFIFOSingle: record FIFO mode single run +************************************************************************** +*/ + +bool bSpcMSetupModeRecFIFOSingle (ST_SPCM_CARDINFO *pstCardInfo, uint64 qwChEnable, int64 llPreSamples, int64 llBlockToRec, int64 llLoopToRec) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // check for invalid block/loop combinations + if ((llBlockToRec && !llLoopToRec) || (!llBlockToRec && llLoopToRec)) + { + sprintf (pstCardInfo->szError, "bSpcMSetupModeRecFIFOSingle: Loop and Blocks must be either both zero or both defined to non-zero\n"); + return false; + } + + // segment size can't be zero, we adjust it here + if (!llBlockToRec && !llLoopToRec) + llBlockToRec = 1024; + + // setup the mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CARDMODE, SPC_REC_FIFO_SINGLE); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_CHENABLE, qwChEnable); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_PRETRIGGER, llPreSamples); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_SEGMENTSIZE, llBlockToRec); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_LOOPS, llLoopToRec); + + // store some information in the structure + pstCardInfo->llSetMemsize = 0; + pstCardInfo->qwSetChEnableMap = qwChEnable; + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_CHCOUNT, &pstCardInfo->lSetChannels); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + +/* +************************************************************************** +bSpcMSetupModeRecStdAverage: record standard mode Average +************************************************************************** +*/ + +bool bSpcMSetupModeRecStdAverage (ST_SPCM_CARDINFO *pstCardInfo, uint64 qwChEnable, int64 llMemSamples, int64 llSegmentSize, int64 llPostSamples, int32 lAverages) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // setup the mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CARDMODE, SPC_REC_STD_AVERAGE); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_CHENABLE, qwChEnable); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_MEMSIZE, llMemSamples); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_SEGMENTSIZE, llSegmentSize); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_POSTTRIGGER, llPostSamples); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_AVERAGES, lAverages); + + // store some information in the structure + pstCardInfo->llSetMemsize = llMemSamples; + pstCardInfo->qwSetChEnableMap = qwChEnable; + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_CHCOUNT, &pstCardInfo->lSetChannels); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupModeRecStdMulti: record standard mode Multiple Recording +************************************************************************** +*/ + +bool bSpcMSetupModeRecStdMulti (ST_SPCM_CARDINFO *pstCardInfo, uint64 qwChEnable, int64 llMemSamples, int64 llSegmentSize, int64 llPostSamples) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // setup the mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CARDMODE, SPC_REC_STD_MULTI); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_CHENABLE, qwChEnable); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_MEMSIZE, llMemSamples); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_SEGMENTSIZE, llSegmentSize); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_POSTTRIGGER, llPostSamples); + + // store some information in the structure + pstCardInfo->llSetMemsize = llMemSamples; + pstCardInfo->qwSetChEnableMap = qwChEnable; + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_CHCOUNT, &pstCardInfo->lSetChannels); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupModeRecStdABA: record standard mode ABA +************************************************************************** +*/ + +bool bSpcMSetupModeRecStdABA (ST_SPCM_CARDINFO *pstCardInfo, uint64 qwChEnable, int64 llMemSamples, int64 llSegmentSize, int64 llPostSamples, int32 lABADivider) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // setup the mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CARDMODE, SPC_REC_STD_ABA); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_CHENABLE, qwChEnable); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_MEMSIZE, llMemSamples); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_SEGMENTSIZE, llSegmentSize); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_POSTTRIGGER, llPostSamples); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_ABADIVIDER, lABADivider); + + // store some information in the structure + pstCardInfo->llSetMemsize = llMemSamples; + pstCardInfo->qwSetChEnableMap = qwChEnable; + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_CHCOUNT, &pstCardInfo->lSetChannels); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + +/* +************************************************************************** +bSpcMSetupModeRecFIFOAverage: record FIFO mode Average +************************************************************************** +*/ + +bool bSpcMSetupModeRecFIFOAverage (ST_SPCM_CARDINFO *pstCardInfo, uint64 qwChEnable, int64 llSegmentSize, int64 llPostSamples, int32 lAverages, int64 llSegmentsToRec) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // setup the mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CARDMODE, SPC_REC_FIFO_AVERAGE); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_CHENABLE, qwChEnable); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_SEGMENTSIZE, llSegmentSize); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_POSTTRIGGER, llPostSamples); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_LOOPS, llSegmentsToRec); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_AVERAGES, lAverages); + + // store some information in the structure + pstCardInfo->llSetMemsize = 0; + pstCardInfo->qwSetChEnableMap = qwChEnable; + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_CHCOUNT, &pstCardInfo->lSetChannels); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + +/* +************************************************************************** +bSpcMSetupModeRecFIFOMulti: record FIFO mode Multi +************************************************************************** +*/ + +bool bSpcMSetupModeRecFIFOMulti (ST_SPCM_CARDINFO *pstCardInfo, uint64 qwChEnable, int64 llSegmentSize, int64 llPostSamples, int64 llSegmentsToRec) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // setup the mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CARDMODE, SPC_REC_FIFO_MULTI); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_CHENABLE, qwChEnable); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_SEGMENTSIZE, llSegmentSize); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_POSTTRIGGER, llPostSamples); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_LOOPS, llSegmentsToRec); + + // store some information in the structure + pstCardInfo->llSetMemsize = 0; + pstCardInfo->qwSetChEnableMap = qwChEnable; + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_CHCOUNT, &pstCardInfo->lSetChannels); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupModeRecFIFOABA: record FIFO mode ABA +************************************************************************** +*/ + +bool bSpcMSetupModeRecFIFOABA (ST_SPCM_CARDINFO *pstCardInfo, uint64 qwChEnable, int64 llSegmentSize, int64 llPostSamples, int32 lABADivider, int64 llSegmentsToRec) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // setup the mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CARDMODE, SPC_REC_FIFO_ABA); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_CHENABLE, qwChEnable); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_SEGMENTSIZE, llSegmentSize); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_POSTTRIGGER, llPostSamples); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_LOOPS, llSegmentsToRec); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_ABADIVIDER, lABADivider); + + // store some information in the structure + pstCardInfo->llSetMemsize = 0; + pstCardInfo->qwSetChEnableMap = qwChEnable; + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_CHCOUNT, &pstCardInfo->lSetChannels); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +pvGetSegmentDataPointer: recalculates the segment start address for + Multiple Recording +************************************************************************** +*/ + +void* pvGetSegmentDataPointer (ST_SPCM_CARDINFO *pstCardInfo, void* pvDataBuffer, int32 lSegmentsize, int32 lSegmentIdx, int32 lBytesPerSample) + { + uint8* pcByteAdr = (uint8*) pvDataBuffer; + return (void*) &pcByteAdr[lSegmentIdx * lSegmentsize * pstCardInfo->lSetChannels * lBytesPerSample]; + } + + + +/* +************************************************************************** +bSpcMSetupModeRecStdGate: record standard mode gated sampling +************************************************************************** +*/ + +bool bSpcMSetupModeRecStdGate (ST_SPCM_CARDINFO *pstCardInfo, uint64 qwChEnable, int64 llMemSamples, int64 llPreSamples, int64 llPostSamples) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // setup the mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CARDMODE, SPC_REC_STD_GATE); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_CHENABLE, qwChEnable); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_MEMSIZE, llMemSamples); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_PRETRIGGER, llPreSamples); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_POSTTRIGGER, llPostSamples); + + // store some information in the structure + pstCardInfo->llSetMemsize = llMemSamples; + pstCardInfo->qwSetChEnableMap = qwChEnable; + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_CHCOUNT, &pstCardInfo->lSetChannels); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupModeRecFIFOGate: record FIFO mode gated sampling +************************************************************************** +*/ + +bool bSpcMSetupModeRecFIFOGate (ST_SPCM_CARDINFO *pstCardInfo, uint64 qwChEnable, int64 llPreSamples, int64 llPostSamples, int64 llGatesToRec) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // setup the mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CARDMODE, SPC_REC_FIFO_GATE); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_CHENABLE, qwChEnable); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_PRETRIGGER, llPreSamples); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_POSTTRIGGER, llPostSamples); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_LOOPS, llGatesToRec); + + // store some information in the structure + pstCardInfo->llSetMemsize = 0; + pstCardInfo->qwSetChEnableMap = qwChEnable; + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_CHCOUNT, &pstCardInfo->lSetChannels); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupModeRepStdSingle: replay standard mode single +************************************************************************** +*/ + +bool bSpcMSetupModeRepStdSingle (ST_SPCM_CARDINFO *pstCardInfo, uint64 qwChEnable, int64 llMemSamples) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // setup the mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CARDMODE, SPC_REP_STD_SINGLE); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_CHENABLE, qwChEnable); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_MEMSIZE, llMemSamples); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_LOOPS, 1); + + // store some information in the structure + pstCardInfo->llSetMemsize = llMemSamples; + pstCardInfo->qwSetChEnableMap = qwChEnable; + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_CHCOUNT, &pstCardInfo->lSetChannels); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupModeRepStdLoops: replay standard mode looped +************************************************************************** +*/ + +bool bSpcMSetupModeRepStdLoops (ST_SPCM_CARDINFO *pstCardInfo, uint64 qwChEnable, int64 llMemSamples, int64 llLoops) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // setup the mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CARDMODE, SPC_REP_STD_SINGLE); // with SPC_LOOPS == 0 this will loop continuously + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_LOOPS, llLoops); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_CHENABLE, qwChEnable); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_MEMSIZE, llMemSamples); + + // store some information in the structure + pstCardInfo->llSetMemsize = llMemSamples; + pstCardInfo->qwSetChEnableMap = qwChEnable; + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_CHCOUNT, &pstCardInfo->lSetChannels); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupModeRepStdSingleRestart: replay standard mode Single Restart +************************************************************************** +*/ + +bool bSpcMSetupModeRepStdSingleRestart (ST_SPCM_CARDINFO *pstCardInfo, uint64 qwChEnable, int64 llMemSamples, int64 llLoops) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // setup the mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CARDMODE, SPC_REP_STD_SINGLERESTART); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_CHENABLE, qwChEnable); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_MEMSIZE, llMemSamples); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_LOOPS, llLoops); + + // store some information in the structure + pstCardInfo->llSetMemsize = llMemSamples; + pstCardInfo->qwSetChEnableMap = qwChEnable; + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_CHCOUNT, &pstCardInfo->lSetChannels); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupModeRepFIFOSingle: replay FIFO mode single run +************************************************************************** +*/ + +bool bSpcMSetupModeRepFIFOSingle (ST_SPCM_CARDINFO *pstCardInfo, uint64 qwChEnable, int64 llBlockToRep, int64 llLoopToRep) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // check for invalid block/loop combinations + if ((llBlockToRep && !llLoopToRep) || (!llBlockToRep && llLoopToRep)) + { + sprintf (pstCardInfo->szError, "bSpcMSetupModeRepFIFOSingle: Loop and Blocks must be either both zero or both defined to non-zero\n"); + return false; + } + + // segment size can't be zero, we adjust it here + if (!llBlockToRep && !llLoopToRep) + llBlockToRep = 1024; + + // setup the mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CARDMODE, SPC_REP_FIFO_SINGLE); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_CHENABLE, qwChEnable); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_SEGMENTSIZE, llBlockToRep); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_LOOPS, llLoopToRep); + + // store some information in the structure + pstCardInfo->llSetMemsize = 0; + pstCardInfo->qwSetChEnableMap = qwChEnable; + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_CHCOUNT, &pstCardInfo->lSetChannels); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupModeRepStdMulti: replay standard mode Multiple Replay +************************************************************************** +*/ + +bool bSpcMSetupModeRepStdMulti (ST_SPCM_CARDINFO *pstCardInfo, uint64 qwChEnable, int64 llMemSamples, int64 llSegmentSize, int64 llSegmentsToRep) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // setup the mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CARDMODE, SPC_REP_STD_MULTI); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_CHENABLE, qwChEnable); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_MEMSIZE, llMemSamples); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_SEGMENTSIZE, llSegmentSize); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_LOOPS, llSegmentsToRep); + + // store some information in the structure + pstCardInfo->llSetMemsize = llMemSamples; + pstCardInfo->qwSetChEnableMap = qwChEnable; + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_CHCOUNT, &pstCardInfo->lSetChannels); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupModeRepFIFOMulti: replay FIFO mode Multiple Replay +************************************************************************** +*/ + +bool bSpcMSetupModeRepFIFOMulti (ST_SPCM_CARDINFO *pstCardInfo, uint64 qwChEnable, int64 llSegmentSize, int64 llSegmentsToRep) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // setup the mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CARDMODE, SPC_REP_FIFO_MULTI); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_CHENABLE, qwChEnable); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_SEGMENTSIZE, llSegmentSize); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_LOOPS, llSegmentsToRep); + + // store some information in the structure + pstCardInfo->llSetMemsize = 0; + pstCardInfo->qwSetChEnableMap = qwChEnable; + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_CHCOUNT, &pstCardInfo->lSetChannels); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupModeRepStdGate: replay standard mode Gated Replay +************************************************************************** +*/ + +bool bSpcMSetupModeRepStdGate (ST_SPCM_CARDINFO *pstCardInfo, uint64 qwChEnable, int64 llMemSamples, int64 llGatesToRep) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // setup the mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CARDMODE, SPC_REP_STD_GATE); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_CHENABLE, qwChEnable); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_MEMSIZE, llMemSamples); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_LOOPS, llGatesToRep); + + // store some information in the structure + pstCardInfo->llSetMemsize = llMemSamples; + pstCardInfo->qwSetChEnableMap = qwChEnable; + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_CHCOUNT, &pstCardInfo->lSetChannels); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupModeRepFIFOGate: replay FIFO mode Gated Replay +************************************************************************** +*/ + +bool bSpcMSetupModeRepFIFOGate (ST_SPCM_CARDINFO *pstCardInfo, uint64 qwChEnable, int64 llGatesToRep) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // setup the mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CARDMODE, SPC_REP_FIFO_GATE); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_CHENABLE, qwChEnable); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_LOOPS, llGatesToRep); + + // store some information in the structure + pstCardInfo->llSetMemsize = 0; + pstCardInfo->qwSetChEnableMap = qwChEnable; + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_CHCOUNT, &pstCardInfo->lSetChannels); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupModeRepSequence: replay sequence mode +************************************************************************** +*/ + +bool bSpcMSetupModeRepSequence (ST_SPCM_CARDINFO *pstCardInfo, uint64 qwChEnable, uint32 dwMaxSegments) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // setup the mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CARDMODE, SPC_REP_STD_SEQUENCE); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_CHENABLE, qwChEnable); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_SEQMODE_MAXSEGMENTS, dwMaxSegments); + + // store some information in the structure + pstCardInfo->llSetMemsize = 0; + pstCardInfo->qwSetChEnableMap = qwChEnable; + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_CHCOUNT, &pstCardInfo->lSetChannels); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +************************************************************************** +************************************************************************** + Clock setup +************************************************************************** +************************************************************************** +************************************************************************** +*/ + + + +/* +************************************************************************** +bSpcMSetupClockPLL: internal clock using PLL +************************************************************************** +*/ + +bool bSpcMSetupClockPLL (ST_SPCM_CARDINFO *pstCardInfo, int64 llSamplerate, bool bClockOut) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // check for borders + if (llSamplerate > pstCardInfo->llMaxSamplerate) + llSamplerate = pstCardInfo->llMaxSamplerate; + if (llSamplerate < pstCardInfo->llMinSamplerate) + llSamplerate = pstCardInfo->llMinSamplerate; + + // setup the clock mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CLOCKMODE, SPC_CM_INTPLL); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_SAMPLERATE, llSamplerate); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CLOCKOUT, bClockOut ? 1 : 0); + if (!dwError) dwError = spcm_dwGetParam_i64 (pstCardInfo->hDrv, SPC_SAMPLERATE, &pstCardInfo->llSetSamplerate); + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_OVERSAMPLINGFACTOR, &pstCardInfo->lOversampling); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupClockQuarz: internal clock using high precision quartz +************************************************************************** +*/ + +bool bSpcMSetupClockQuartz (ST_SPCM_CARDINFO *pstCardInfo, int64 llSamplerate, bool bClockOut) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // check for borders + if (llSamplerate > pstCardInfo->llMaxSamplerate) + llSamplerate = pstCardInfo->llMaxSamplerate; + if (llSamplerate < pstCardInfo->llMinSamplerate) + llSamplerate = pstCardInfo->llMinSamplerate; + + // setup the clock mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CLOCKMODE, SPC_CM_QUARTZ1); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_SAMPLERATE, llSamplerate); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CLOCKOUT, bClockOut ? 1 : 0); + if (!dwError) dwError = spcm_dwGetParam_i64 (pstCardInfo->hDrv, SPC_SAMPLERATE, &pstCardInfo->llSetSamplerate); + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_OVERSAMPLINGFACTOR, &pstCardInfo->lOversampling); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupClockExternal: external clock +************************************************************************** +*/ + +bool bSpcMSetupClockExternal (ST_SPCM_CARDINFO *pstCardInfo, int32 lExtRange, bool bClockTerm, int32 lDivider) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + if (lDivider > 1) + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CLOCKMODE, SPC_CM_EXTDIVIDER); + else + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CLOCKMODE, SPC_CM_EXTERNAL); + + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_EXTERNRANGE, lExtRange); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CLOCKDIV, lDivider); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CLOCK50OHM, bClockTerm ? 1 : 0); + + pstCardInfo->llSetSamplerate = 1; + pstCardInfo->lOversampling = 1; + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupClockRefClock: reference clock +************************************************************************** +*/ + +bool bSpcMSetupClockRefClock (ST_SPCM_CARDINFO *pstCardInfo, int32 lRefClock, int64 llSamplerate, bool bClockTerm) + { + if (!pstCardInfo) + return false; + + // check for borders + if (llSamplerate > pstCardInfo->llMaxSamplerate) + llSamplerate = pstCardInfo->llMaxSamplerate; + if (llSamplerate < pstCardInfo->llMinSamplerate) + llSamplerate = pstCardInfo->llMinSamplerate; + + uint32 dwError = ERR_OK; + + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CLOCKMODE, SPC_CM_EXTREFCLOCK); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_REFERENCECLOCK, lRefClock); + if (!dwError) dwError = spcm_dwSetParam_i64 (pstCardInfo->hDrv, SPC_SAMPLERATE, llSamplerate); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CLOCK50OHM, bClockTerm ? 1 : 0); + if (!dwError) dwError = spcm_dwGetParam_i64 (pstCardInfo->hDrv, SPC_SAMPLERATE, &pstCardInfo->llSetSamplerate); + if (!dwError) dwError = spcm_dwGetParam_i32 (pstCardInfo->hDrv, SPC_OVERSAMPLINGFACTOR, &pstCardInfo->lOversampling); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +************************************************************************** +************************************************************************** + Trigger setup +************************************************************************** +************************************************************************** +************************************************************************** +*/ + + +/* +************************************************************************** +bSpcMSetupTrigSoftware: software trigger +************************************************************************** +*/ + +bool bSpcMSetupTrigSoftware (ST_SPCM_CARDINFO *pstCardInfo, bool bTrigOut) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // setup the trigger mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_ORMASK, SPC_TMASK_SOFTWARE); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_ANDMASK, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ORMASK0, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ORMASK1, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ANDMASK0, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ANDMASK1, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIGGEROUT, bTrigOut ? 1 : 0); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupTrigExternal: external trigger + If levels are programmable they'll be set to LVTTL +************************************************************************** +*/ + +bool bSpcMSetupTrigExternal (ST_SPCM_CARDINFO *pstCardInfo, int32 lExtMode, bool bTrigTerm, int32 lPulsewidth, bool bSingleSrc, int32 lExtLine) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // setup the external trigger mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_EXT0_MODE + lExtLine, lExtMode); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_TERM, bTrigTerm ? 1 : 0); + + // we only use trigout on M2i cards as we otherwise would override the multi purpose i/o lines of M3i, M4i, M4x and M2p + if (((pstCardInfo->lCardType & TYP_SERIESMASK) == TYP_M2ISERIES) || ((pstCardInfo->lCardType & TYP_SERIESMASK) == TYP_M2IEXPSERIES)) + { + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_OUTPUT, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_EXT0_PULSEWIDTH + lExtLine, lPulsewidth); + } + + // on bSingleSrc flag no other trigger source is used + if (bSingleSrc) + { + switch (lExtLine) + { + case 0 : if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_ORMASK, SPC_TMASK_EXT0); break; + case 1 : if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_ORMASK, SPC_TMASK_EXT1); break; + case 2 : if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_ORMASK, SPC_TMASK_EXT2); break; + case 3 : if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_ORMASK, SPC_TMASK_EXT3); break; // X3 on M2p + } + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_ANDMASK, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ORMASK0, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ORMASK1, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ANDMASK0, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ANDMASK1, 0); + } + + // M3i cards need trigger level to be programmed for Ext0 = analog trigger + if (((pstCardInfo->lCardType & TYP_SERIESMASK) == TYP_M3ISERIES) || ((pstCardInfo->lCardType & TYP_SERIESMASK) == TYP_M3IEXPSERIES)) + { + if (lExtLine == 0) + { + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_EXT0_LEVEL0, 1500); // 1500 mV + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_EXT0_LEVEL1, 800); // 800 mV (rearm) + } + } + // M4i/M4x cards need trigger level to be programmed for Ext0 or Ext1 + else if (((pstCardInfo->lCardType & TYP_SERIESMASK) == TYP_M4IEXPSERIES) || ((pstCardInfo->lCardType & TYP_SERIESMASK) == TYP_M4XEXPSERIES)) + + { + if (lExtLine == 0) + { + if ((pstCardInfo->lCardType & (TYP_FAMILYMASK | TYP_CHMASK)) == 0x7700) // single ended 77x0 + { + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_THRESHOLD, 1500); // 1500 mV + } + else + { + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_EXT0_LEVEL0, 1500); // 1500 mV + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_EXT0_LEVEL1, 800); // 800 mV (rearm) + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_EXT0_ACDC, COUPLING_DC); // DC coupling + } + } + else if (lExtLine == 1) + { + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_EXT1_LEVEL0, 1500); // 1500 mV + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_EXT1_ACDC, COUPLING_DC); // DC coupling + } + } + // M2p has a single level on Ext0 + else if ((pstCardInfo->lCardType & TYP_SERIESMASK) == TYP_M2PEXPSERIES) + { + if (lExtLine == 0) + { + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_EXT0_LEVEL0, 1500); // 1500 mV + } + } + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + +/* +************************************************************************** +bSpcMSetupTrigExternalLevel: external analog trigger with programmable levels +************************************************************************** +*/ + +bool bSpcMSetupTrigExternalLevel (ST_SPCM_CARDINFO *pstCardInfo, int32 lExtMode, int32 lLevel0, int32 lLevel1, bool bTrigTerm, bool bACCoupling, int32 lPulsewidth, bool bSingleSrc, int32 lExtLine) + { + if (!pstCardInfo) + return false; + + // not supported by M2i and M2i Express cards as they have plain TTL trigger + if (((pstCardInfo->lCardType & TYP_SERIESMASK) == TYP_M2ISERIES) || ((pstCardInfo->lCardType & TYP_SERIESMASK) == TYP_M2IEXPSERIES)) + return false; + + uint32 dwError = ERR_OK; + + // setup the external trigger mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_EXT0_MODE + lExtLine, lExtMode); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_TERM, bTrigTerm ? 1 : 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_EXT0_ACDC + lExtLine, bACCoupling ? COUPLING_AC : COUPLING_DC); + + // on bSingleSrc flag no other trigger source is used + if (bSingleSrc) + { + switch (lExtLine) + { + case 0 : if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_ORMASK, SPC_TMASK_EXT0); break; + case 1 : if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_ORMASK, SPC_TMASK_EXT1); break; + case 2 : if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_ORMASK, SPC_TMASK_EXT2); break; + } + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_ANDMASK, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ORMASK0, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ORMASK1, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ANDMASK0, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ANDMASK1, 0); + } + + // M3i cards need trigger level to be programmed for Ext0 = analog trigger + // M4i/M4x cards need trigger level to be programmed for Ext0 or Ext1 + switch (pstCardInfo->lCardType & TYP_SERIESMASK) + { + case TYP_M3ISERIES: + case TYP_M3IEXPSERIES: + case TYP_M4IEXPSERIES: + case TYP_M4XEXPSERIES: + { + if (lExtLine == 0) + { + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_EXT0_LEVEL0, lLevel0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_EXT0_LEVEL1, lLevel1); + } + else if (lExtLine == 1) + { + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_EXT1_LEVEL0, lLevel0); + } + break; + } + case TYP_M2PEXPSERIES: + { + if (lExtLine == 0) + { + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_EXT0_LEVEL0, lLevel0); + } + break; + } + } + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + +/* +************************************************************************** +bSpcMSetupTrigXIO: additional BaseXIO trigger, needs option installed +************************************************************************** +*/ + +bool bSpcMSetupTrigXIO (ST_SPCM_CARDINFO *pstCardInfo, int32 lXIOMode, bool bSingleSrc, int32 lXIOLine) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + // setup the external trigger mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_XIO0_MODE + lXIOLine, lXIOMode); + + // on bSingleSrc flag no other trigger source is used + if (bSingleSrc) + { + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_ORMASK, lXIOLine == 0 ? SPC_TMASK_XIO0 : SPC_TMASK_XIO1); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_ANDMASK, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ORMASK0, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ORMASK1, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ANDMASK0, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ANDMASK1, 0); + } + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupTrigChannel: channel trigger is set for each channel separately +************************************************************************** +*/ + +bool bSpcMSetupTrigChannel (ST_SPCM_CARDINFO *pstCardInfo, int32 lChannel, int32 lTrigMode, int32 lTrigLevel0, int32 lTrigLevel1, int32 lPulsewidth, bool bTrigOut, bool bSingleSrc) + { + if (!pstCardInfo) + return false; + + if ((lChannel < 0) || (lChannel >= pstCardInfo->lMaxChannels)) + { + sprintf (pstCardInfo->szError, "bSpcMSetupTrigChannel: channel number %d not valid. Channels range from 0 to %d\n", lChannel, pstCardInfo->lMaxChannels); + return false; + } + + uint32 dwError = ERR_OK; + + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH0_MODE + lChannel, lTrigMode); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH0_PULSEWIDTH + lChannel, lPulsewidth); + + if (pstCardInfo->eCardFunction == AnalogIn) + { + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH0_LEVEL0 + lChannel, lTrigLevel0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH0_LEVEL1 + lChannel, lTrigLevel1); + } + + // we only use trigout on M2i cards as we otherwise would override the multi purpose i/o lines of M3i + if (((pstCardInfo->lCardType & TYP_SERIESMASK) == TYP_M2ISERIES) || ((pstCardInfo->lCardType & TYP_SERIESMASK) == TYP_M2IEXPSERIES)) + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_OUTPUT, bTrigOut ? 1 : 0); + + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_TERM, 0); + + // on bSingleSrc flag no other trigger source is used + if (bSingleSrc) + { + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_ORMASK, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_ANDMASK, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ORMASK1, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ANDMASK1, 0); + + // some cards need the and mask to use on pulsewidth mode -> to be sure we set the AND mask for all pulsewidth cards + if ((lTrigMode & SPC_TM_PW_GREATER) || (lTrigMode & SPC_TM_PW_SMALLER)) + { + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ORMASK0, 0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ANDMASK0, 1 << lChannel); + } + else + { + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ORMASK0, 1 << lChannel); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ANDMASK0, 0); + } + } + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupTrigMask: this function sets the trigger masks (bSingleSrc +of other commands must be false to use this) +************************************************************************** +*/ + +bool bSpcMSetupTrigMask (ST_SPCM_CARDINFO *pstCardInfo, uint32 dwChannelOrMask0, uint32 dwChannelOrMask1, uint32 dwChannelAndMask0, uint32 dwChannelAndMask1, uint32 dwTrigOrMask, uint32 dwTrigAndMask) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_ORMASK, dwTrigOrMask); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_ANDMASK, dwTrigAndMask); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ORMASK0, dwChannelOrMask0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ORMASK1, dwChannelOrMask1); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ANDMASK0, dwChannelAndMask0); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TRIG_CH_ANDMASK1, dwChannelAndMask1); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +************************************************************************** +************************************************************************** + Input + Output channel setup +************************************************************************** +************************************************************************** +************************************************************************** +*/ + +/* +************************************************************************** +bSpcMSetupInputChannel: allows all input channel related settings +************************************************************************** +*/ + +bool bSpcMSetupInputChannel (ST_SPCM_CARDINFO *pstCardInfo, int32 lChannel, int32 lInputRange, bool bTerm, int32 lInputOffset, bool bDiffInput) + { + if (!pstCardInfo) + return false; + + if ((lChannel < 0) || (lChannel >= pstCardInfo->lMaxChannels)) + { + sprintf (pstCardInfo->szError, "SpcMSetupInputChannel: channel number %d not valid. Channels range from 0 to %d\n", lChannel, pstCardInfo->lMaxChannels); + return false; + } + + uint32 dwError = ERR_OK; + + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_AMP0 + lChannel * (SPC_AMP1 - SPC_AMP0), lInputRange); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_OFFS0 + lChannel * (SPC_OFFS1 - SPC_OFFS0), lInputOffset); + if (pstCardInfo->uCfg.stAI.bInputTermAvailable) + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_50OHM0 + lChannel * (SPC_50OHM1 - SPC_50OHM0), bTerm ? 1 : 0); + if (pstCardInfo->uCfg.stAI.bDiffModeAvailable) + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_DIFF0 + lChannel * (SPC_DIFF1 - SPC_DIFF0), bDiffInput ? 1 : 0); + + // store some information in the structure + pstCardInfo->uCfg.stAI.lSetRange[lChannel] = lInputRange; + pstCardInfo->uCfg.stAI.lSetOffset[lChannel] = lInputOffset; + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + +/* +************************************************************************** +bSpcMSetupPathInputCh: M3i version with different settings +************************************************************************** +*/ + +bool bSpcMSetupPathInputCh (ST_SPCM_CARDINFO *pstCardInfo, int32 lChannel, int32 lPath, int32 lInputRange, bool bTerm, bool bACCoupling, bool bBWLimit, bool bDiffInput) + { + if (!pstCardInfo) + return false; + + if ((lChannel < 0) || (lChannel >= pstCardInfo->lMaxChannels)) + { + sprintf (pstCardInfo->szError, "SpcMSetupInputChannel: channel number %d not valid. Channels range from 0 to %d\n", lChannel, pstCardInfo->lMaxChannels); + return false; + } + + uint32 dwError = ERR_OK; + + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_PATH0 + lChannel * (SPC_PATH1 - SPC_PATH0), lPath); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_AMP0 + lChannel * (SPC_AMP1 - SPC_AMP0), lInputRange); + if (pstCardInfo->uCfg.stAI.bInputTermAvailable) + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_50OHM0 + lChannel * (SPC_50OHM1 - SPC_50OHM0), bTerm ? 1 : 0); + if (pstCardInfo->uCfg.stAI.bDiffModeAvailable) + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_DIFF0 + lChannel * (SPC_DIFF1 - SPC_DIFF0), bDiffInput ? 1 : 0); + if (pstCardInfo->uCfg.stAI.bACCouplingAvailable) + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_ACDC0 + lChannel * (SPC_ACDC1 - SPC_ACDC0), bACCoupling ? COUPLING_AC : COUPLING_DC); + if (pstCardInfo->uCfg.stAI.bBWLimitAvailable) + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_FILTER0 + lChannel * (SPC_FILTER1 - SPC_FILTER0), bBWLimit ? 1 : 0); + + // store some information in the structure + pstCardInfo->uCfg.stAI.lSetRange[lChannel] = lInputRange; + pstCardInfo->uCfg.stAI.lSetOffset[lChannel] = 0; + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + +/* +************************************************************************** +bSpcMSetupAnalogOutputChannel: allows all output channel related settings +************************************************************************** +*/ + +bool bSpcMSetupAnalogOutputChannel (ST_SPCM_CARDINFO *pstCardInfo, int32 lChannel, int32 lAmplitude, int32 lOutputOffset, int32 lFilter, int32 lStopMode, bool bDoubleOut, bool bDifferential) + { + if (!pstCardInfo) + return false; + + if ((lChannel < 0) || (lChannel >= pstCardInfo->lMaxChannels)) + { + sprintf (pstCardInfo->szError, "SpcMSetupAnalogOutputChannel: channel number %d not valid. Channels range from 0 to %d\n", lChannel, pstCardInfo->lMaxChannels); + return false; + } + + // Enable output (since M4i). + uint32 dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_ENABLEOUT0 + lChannel * (SPC_ENABLEOUT1 - SPC_ENABLEOUT0), 1); + + // Check for programmable gain + if (pstCardInfo->uCfg.stAO.bGainProgrammable) + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_AMP0 + lChannel * (SPC_AMP1 - SPC_AMP0), lAmplitude); + + // Check for programmable offset + if (pstCardInfo->uCfg.stAO.bOffsetProgrammable) + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_OFFS0 + lChannel * (SPC_OFFS1 - SPC_OFFS0), lOutputOffset); + + // Check for programmable filters + if (pstCardInfo->uCfg.stAO.bFilterAvailable) + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_FILTER0 + lChannel * (SPC_FILTER1 - SPC_FILTER0), lFilter); + + // Check for programmable stop levels + if (pstCardInfo->uCfg.stAO.bStopLevelProgrammable) + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CH0_STOPLEVEL + lChannel * (SPC_CH1_STOPLEVEL - SPC_CH0_STOPLEVEL), lStopMode); + + // Check for programmable diffmodes + if (pstCardInfo->uCfg.stAO.bDiffModeAvailable && !bDoubleOut) + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_DIFF0 + lChannel * (SPC_DIFF1 - SPC_DIFF0), bDifferential ? 1 : 0); + + // Check for programmable doublemodes + if (pstCardInfo->uCfg.stAO.bDiffModeAvailable && !bDifferential) + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_DOUBLEOUT0 + lChannel * (SPC_DOUBLEOUT1 - SPC_DOUBLEOUT0), bDoubleOut ? 1 : 0); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupDigitalOutput: digital output settings for one group +************************************************************************** +*/ + +bool bSpcMSetupDigitalOutput (ST_SPCM_CARDINFO *pstCardInfo, int32 lGroup, int32 lStopMode, int32 lLowLevel, int32 lHighLevel, bool bDiffMode) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + int32 lStopLvlMod = (lGroup * (pstCardInfo->lMaxChannels / pstCardInfo->uCfg.stDIO.lGroups)) >= (pstCardInfo->lMaxChannels / pstCardInfo->lModulesCount) ? 1 : 0; + + if (pstCardInfo->uCfg.stDIO.bStopLevelProgrammable) + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_CH0_STOPLEVEL + lStopLvlMod * (SPC_CH1_STOPLEVEL - SPC_CH0_STOPLEVEL), lStopMode); + + if (pstCardInfo->uCfg.stDIO.bOutputLevelProgrammable) + { + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_LOWLEVEL0 + lGroup * (SPC_LOWLEVEL1 - SPC_LOWLEVEL0), lLowLevel); + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_HIGHLEVEL0 + lGroup * (SPC_HIGHLEVEL1 - SPC_HIGHLEVEL0), lHighLevel); + } + + if (pstCardInfo->uCfg.stDIO.bDiffModeAvailable) + {} // to be done + + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +bSpcMSetupDigitalInput: digital input settings for one group +************************************************************************** +*/ + +bool bSpcMSetupDigitalInput (ST_SPCM_CARDINFO *pstCardInfo, int32 lGroup, bool bTerm) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + + if (pstCardInfo->uCfg.stDIO.bInputTermAvailable) + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_110OHM0 + lGroup * (SPC_110OHM1 - SPC_110OHM0), bTerm ? 1 : 0); + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + + + +/* +************************************************************************** +************************************************************************** +************************************************************************** + Miscellaneous setup +************************************************************************** +************************************************************************** +************************************************************************** +*/ + + + +/* +************************************************************************** +bSpcMSetupTimestamp: set up the timestamp mode and performs a +synchronisation with refernce clock if that mode is activated. Checks for +BASEXIO option if one wants to use reference clock mode +************************************************************************** +*/ + +bool bSpcMSetupTimestamp (ST_SPCM_CARDINFO *pstCardInfo, int32 lMode, uint32 dwRefTimeoutMS) + { + if (!pstCardInfo) + return false; + + uint32 dwError = ERR_OK; + bool bRefClockMode = ((lMode & (SPC_TSCNT_REFCLOCKPOS | SPC_TSCNT_REFCLOCKNEG)) != 0); + + // if ref clock is activated for M2i/M3i cards we check for the installation of base xio as this contains the ref clock input + if (bRefClockMode && ((pstCardInfo->lFeatureMap & SPCM_FEAT_BASEXIO) == 0) && ((pstCardInfo->bM2i) || (pstCardInfo->bM3i))) + { + sprintf (pstCardInfo->szError, "Timestamp ref clock mode requires an installed BASEXIO feature!\n"); + return false; + } + + // set the timestamp mode + if (!dwError) dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TIMESTAMP_CMD, lMode); + + // in ref clock mode we now try the synchronisation with external clock + if (bRefClockMode && !dwError) + { + dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TIMESTAMP_TIMEOUT, dwRefTimeoutMS); + if (!dwError) + dwError = spcm_dwSetParam_i32 (pstCardInfo->hDrv, SPC_TIMESTAMP_CMD, SPC_TS_RESET); + + // error = synchronisation failed + if (dwError) + { + sprintf (pstCardInfo->szError, "Timestamp reset: synchronisation with external ref clock failed. Check cabeling and check timeout value\n"); + return false; + } + } + + return bSpcMCheckSetError (dwError, pstCardInfo); + } + diff --git a/AWGDependencies/Spectrum/common/spcm_lib_card.h b/AWGDependencies/Spectrum/common/spcm_lib_card.h new file mode 100644 index 0000000..04d5b1c --- /dev/null +++ b/AWGDependencies/Spectrum/common/spcm_lib_card.h @@ -0,0 +1,589 @@ +/* +************************************************************************** + +spcm_lib_card.h (c) Spectrum GmbH , 01/2006 + +************************************************************************** + +defines the library functions as external to use them with projects where +the lib is directly included (like dll) and where the lib has to be loaded +separately (like LabWindows or unsupported C compiler) + +************************************************************************** +*/ + +#ifndef SPCM_LIB_CARD_H +#define SPCM_LIB_CARD_H + +// ----- include standard driver header from library ----- +#include "../c_header/dlltyp.h" +#include "../c_header/regs.h" +#include "../c_header/spcerr.h" +#include "../c_header/spcm_drv.h" + + + +#define SPCM_MAX_AIRANGE 8 +#define SPCM_MAX_AICHANNEL 16 +#define SPCM_MAX_AOCHANNEL 8 +#define SPCM_MAX_DIOCHANNEL 64 + + +/* +************************************************************************** +structure with different card information and setup information that is +used by the setup and data processing routines +************************************************************************** +*/ + +// different card functionalities +typedef enum E_SPCM_CARDFNC {AnalogIn, AnalogOut, DigitalOut, DigitalIn, DigitalIO} E_SPCM_CARDFNC; + +// card information structure +typedef struct + { + + // information from the card + drv_handle hDrv; // handle to opened card driver + int32 lCardIdx; // index of card (from open), just for display + int32 lCardType; // card type as listed in the manual + E_SPCM_CARDFNC eCardFunction; // function of the card + int32 lSerialNumber; // serial number of card + int64 llInstMemBytes; // installed on-board memory in bytes + int32 lFeatureMap; // bitmap with installed card features + int32 lExtFeatureMap; // bitmap with installed extended features + int32 lMaxChannels; // number of channels (analog or digital) + int32 lModulesCount; // number of installed modules for data sorting algorithm + int32 lBytesPerSample; // number of bytes for each sample (analog data) + int64 llMinSamplerate; // minimum sampling rate + int64 llMaxSamplerate; // maximum sampling rate + + int32 lLibVersion; // version of the library + int32 lKernelVersion; // version of the kernel driver + + int32 lCtrlFwVersion; // version of main control firmware + int32 lBaseHwVersion; // version of base hardware + int32 lModHwVersion; // version of module hardware + int32 lModFwVersion; // version of module firmware + + // current settings + bool bSetError; // one of the functions generated an error + char szError[ERRORTEXTLEN]; // space for the error text + uint64 qwSetChEnableMap; // current channel enable map + int64 llSetMemsize; // programmed memory size + int32 lSetChannels; // number of used channels for this run + int64 llSetSamplerate; // current selected sampling rate (1 for external) + int32 lOversampling; // currently active oversampling factor + + // flags for the examples to determine card family + bool bM2i; // M2i.xxxx or M2i.xxxx-exp + bool bM3i; // M3i.xxxx or M3i.xxxx-exp + bool bM4i; // M4i.xxxx-x8 or M4x.xxxx-x4 + bool bM2p; // M2p.xxxx-x4 + bool bRemote; // Netbox or Remote Server + + // card function dependant details + union + { + + // analog input cards + struct ST_SPCM_AI + { + int32 lResolution; // resolution of analog channels + int32 lMaxADCValue; // maximum range, normally 2^(Resolution-1) but can be limited + int32 lPathCount; // number of input paths + int32 lRangeCount; // number of analog input ranges + int32 lRangeMin[SPCM_MAX_AIRANGE]; // analog input ranges + int32 lRangeMax[SPCM_MAX_AIRANGE]; // ... + bool bInputTermAvailable; // input termination available + bool bDiffModeAvailable; // differential mode available + bool bACCouplingAvailable; // AC/DC coupling softwar selectable + bool bBWLimitAvailable; // bandwidth limit available + bool bOffsPercentMode; // offset programmed in percent of range + + int32 lSetRange[SPCM_MAX_AICHANNEL]; // current used input range for each channel + int32 lSetOffset[SPCM_MAX_AICHANNEL]; // current set input offset + } stAI; + + // analog output cards + struct ST_SPCM_AO + { + int32 lResolution; // resolution of analog channels + int32 lMaxDACValue; // maximum range, normally 2^(Resolution-1) but can be limited + bool bGainProgrammable; // programmable gain available + bool bOffsetProgrammable; // programmable offset available + bool bFilterAvailable; // programmable filters available + bool bStopLevelProgrammable; // programmable stop level available + bool bDiffModeAvailable; // differential mode available + } stAO; + + // digital input, outputs or i/o cards + struct ST_SPCM_DIO + { + int32 lGroups; // number of channel groups that have individual setup + bool bInputTermAvailable; // input termination available + bool bDiffModeAvailable; // differential mode available + bool bStopLevelProgrammable; // programmable stop level available + bool bOutputLevelProgrammable; // low and high output level is programmable + } stDIO; + + } uCfg; + } ST_SPCM_CARDINFO; + + + + + +/* +************************************************************************** +bSpcMInitCardByIdx: + +opens the driver with the given indes, reads out card information and +fills the CARDINFO structure +************************************************************************** +*/ + +bool bSpcMInitCardByIdx ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to an allocated and empty card info structure + int32 lCardIdx); // index of card to open, index starts with zero + +bool bSpcMInitCardByIdx ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to an allocated and empty card info structure + const char* szDrvName, // name of card like /dev/spcm0 (local) or 123.123.123.123 (for digitizerNETBOX only) + int32 lCardIdx); // index of card to open, index starts with zero + + +/* +************************************************************************** +nErrorMessageStdOut: + +prints the error message to std out and ends the driver if it's active +program can be left with this function +************************************************************************** +*/ + +int nSpcMErrorMessageStdOut ( // returns -1 + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + const char* pszMessage, // user error message, + bool bPrintCardErr = true); // add card error message + + + +/* +************************************************************************** +pszSpcMTranslateRuntimeError + +translation of a runtime error code into a text message. The buffer need +to be at least ERRORTEXTLEN long to cover any current or future messages +************************************************************************** +*/ + +char* pszSpcMTranslateRuntimeError ( + uint32 dwErrorCode, + char* pszBuffer); + + +/* +************************************************************************** +vSpcMCloseCard + +closes the driver +************************************************************************** +*/ + +void vSpcMCloseCard ( + ST_SPCM_CARDINFO *pstCardInfo); // pointer to a filled card info structure + + + +/* +************************************************************************** +pszSpcMPrintCardInfo + +prints the card information to a string for display. +************************************************************************** +*/ + +char* pszSpcMPrintCardInfo ( // returns the pointer to the printed string + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + char* pszBuffer, // buffer for printing + int32 lStrLen, // length of the buffer + bool bExtended = true); // extended info, if false only name+sn + +char* pszSpcMPrintDocumentationLink ( + const ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + char* pszBuffer, // buffer for printing + int32 lStrLen); // length of the buffer + + +/* +************************************************************************** +bSpcMSetupModeXXX + +setup one of the card modes +************************************************************************** +*/ + +// record standard mode single +bool bSpcMSetupModeRecStdSingle ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + uint64 qwChEnable, // channel enable mask for the next acquisition + int64 llMemSamples, // recording length in samples per channel + int64 llPostSamples); // samples to record after trigger event + +// record FIFO mode single +bool bSpcMSetupModeRecFIFOSingle ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + uint64 qwChEnable, // channel enable mask for the next acquisition + int64 llPreSamples, // number of samples to be stored before the trigger event + int64 llBlockToRec = 0, // blocks and loops can define the maximum recording length + int64 llLoopToRec = 0); // in FIFO mode as Block * Loop. If zero we run continuously + +// *********************************************************************** + + +// record standard mode average +bool bSpcMSetupModeRecStdAverage ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + uint64 qwChEnable, // channel enable mask for the next acquisition + int64 llMemSamples, // recording length in samples per channel + int64 llSegmentSize, // size of each multiple recording segment + int64 llPostSamples, // samples to record after trigger event for each segment + int32 lAverages // number of triggered segments to average + ); + +// record standard mode multiple recording +bool bSpcMSetupModeRecStdMulti ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + uint64 qwChEnable, // channel enable mask for the next acquisition + int64 llMemSamples, // recording length in samples per channel + int64 llSegmentSize, // size of each multiple recording segment + int64 llPostSamples); // samples to record after trigger event for each segment + +// record standard mode ABA +bool bSpcMSetupModeRecStdABA ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + uint64 qwChEnable, // channel enable mask for the next acquisition + int64 llMemSamples, // recording length in samples per channel + int64 llSegmentSize, // size of each multiple recording segment + int64 llPostSamples, // samples to record after trigger event for each segment + int32 lABADivider); // divider for ABA mode slow samples + +// record FIFO mode average +bool bSpcMSetupModeRecFIFOAverage ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + uint64 qwChEnable, // channel enable mask for the next acquisition + int64 llSegmentSize, // size of each multiple recording segment + int64 llPostSamples, // samples to record after trigger event for each segment + int32 lAverages, + int64 llSegmentsToRec = 0); // number of segments to record in total. If zero we reun continuously + +// record FIFO mode multiple recording +bool bSpcMSetupModeRecFIFOMulti ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + uint64 qwChEnable, // channel enable mask for the next acquisition + int64 llSegmentSize, // size of each multiple recording segment + int64 llPostSamples, // samples to record after trigger event for each segment + int64 llSegmentsToRec = 0); // numbe of segments to record in total. If zero we reun continuously + +// record FIFO mode ABA +bool bSpcMSetupModeRecFIFOABA ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + uint64 qwChEnable, // channel enable mask for the next acquisition + int64 llSegmentSize, // size of each multiple recording segment + int64 llPostSamples, // samples to record after trigger event for each segment + int32 lABADivider, // divider for ABA mode slow samples + int64 llSegmentsToRec = 0); // numbe of segments to record in total. If zero we reun continuously + +// recalculates the data start address of segment no. idx +void* pvGetSegmentDataPointer ( // returns an pointer to the segment start address + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + void* pvDataBuffer, // pointer to the data array that holds all segments + int32 lSegmentsize, // size of one segment + int32 lSegmentIdx, // index of the segment of which we wish to get the pointer + int32 lBytesPerSample); // number of bytes per sample + +// *********************************************************************** + +// record standard mode gated sampling +bool bSpcMSetupModeRecStdGate ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + uint64 qwChEnable, // channel enable mask for the next acquisition + int64 llMemSamples, // recording length in samples per channel + int64 llPreSamples, // number of samples to record before gate starts + int64 llPostSamples); // number of samples to record after gate ends + +// record FIFO mode gated sampling +bool bSpcMSetupModeRecFIFOGate ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + uint64 qwChEnable, // channel enable mask for the next acquisition + int64 llPreSamples, // number of samples to record before gate starts + int64 llPostSamples, // number of samples to record after gate ends + int64 llGatesToRec = 0); // number of gates to record + + +// *********************************************************************** + +// replay standard mode single +bool bSpcMSetupModeRepStdSingle ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + uint64 qwChEnable, // channel enable mask for the next generation + int64 llMemSamples); // samples to replay after trigger event + +// replay standard mode looped +bool bSpcMSetupModeRepStdLoops ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + uint64 qwChEnable, // channel enable mask for the next generation + int64 llMemSamples, // samples to replay after trigger event + int64 llLoops = 0); // loops to replay (0 --> infinite continuous replay) + +// replay standard mode single restart +bool bSpcMSetupModeRepStdSingleRestart ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + uint64 qwChEnable, // channel enable mask for the next generation + int64 llMemSamples, // samples to replay after trigger event + int64 llLoops = 0); // loops to replay (0 --> infinite continuous replay) + +// replay FIFO mode single +bool bSpcMSetupModeRepFIFOSingle ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + uint64 qwChEnable, // channel enable mask for the next acquisition + int64 llBlockToRep = 0, // blocks and loops can define the maximum replay length + int64 llLoopToRep = 0); // in FIFO mode as Block * Loop. If zero we run continuously + +// *********************************************************************** + +// standard mode multiple replay +bool bSpcMSetupModeRepStdMulti ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + uint64 qwChEnable, // channel enable mask for the next generation + int64 llMemSamples, // replay length in samples per channel + int64 llSegmentSize, // size of each segment + int64 llSegmentsToRep = 1); // segments to replay (0 = infinite, 1 = memsize once, N = number of segments) + +// FIFO mode multiple replay +bool bSpcMSetupModeRepFIFOMulti ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + uint64 qwChEnable, // channel enable mask for the next generation + int64 llSegmentSize, // size of each segment + int64 llSegmentsToRep = 0); // segments to replay (0 = infinite, N = number of segments) + +// *********************************************************************** + +// standard mode gated replay +bool bSpcMSetupModeRepStdGate ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + uint64 qwChEnable, // channel enable mask for the next generation + int64 llMemSamples, // recording length in samples per channel + int64 llGatesToRep = 1); // gates to replay (0 = infinte, 1 = memsize once, N = number of gates) + +// FIFO mode gated replay +bool bSpcMSetupModeRepFIFOGate ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + uint64 qwChEnable, // channel enable mask for the next generation + int64 llGatesToRep = 0); // gates to replay (0 = infinte, N = number of gates) + +// *********************************************************************** + +bool bSpcMSetupModeRepSequence ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + uint64 qwChEnable, // channel enable mask for the next generation + uint32 dwMaxSegments); // count of divided main sample memory segments + +// *********************************************************************** + + + +/* +************************************************************************** +bSpcMSetupClockXXX + +setup the clock engine for different modes +************************************************************************** +*/ + +// internal clock using PLL +bool bSpcMSetupClockPLL ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + int64 llSamplerate, // desired sampling rate + bool bClockOut = false); // clock output enable + +// internal clock using high precision quartz +bool bSpcMSetupClockQuartz ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + int64 llSamplerate, // sampling rate if internal clock mode + bool bClockOut = false); // clock output enable + +// external clock +bool bSpcMSetupClockExternal ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + int32 lExtRange, // external clock range if external clock mode is used + bool bClockTerm = true, // enable clock termination (50 ohm) + int32 lDivider = 1); // clock divider + +// reference clock +bool bSpcMSetupClockRefClock ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + int32 lRefClock, // reference clock speed if using ref clock mode + int64 llSamplerate, // desired sampling rate + bool bClockTerm = true); // enable clock termination (50 ohm) + + + +/* +************************************************************************** +bSpcMSetupTriggerXXX + +setup the trigger engine for different modes +************************************************************************** +*/ + +// software trigger +bool bSpcMSetupTrigSoftware ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + bool bTrigOut = false); // enable trigger output + +// external trigger (if input is using comparators the levels are set to TTL) +bool bSpcMSetupTrigExternal ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + int32 lExtMode, // external trigger mode + bool bTrigTerm = true, // trigger termination active + int32 lPulsewidth = 0, // programmable pulsewidth for all external + pulsewidth modes + bool bSingleSrc = true, // acts as single trigger source, all other masks cleared + int32 lExtLine = 0); // standard external trigger is line 0 + +// external analog trigger with programmable levels +bool bSpcMSetupTrigExternalLevel ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + int32 lExtMode, // external trigger mode + int32 lLevel0 = 1500, // trigger level 0 (mV) + int32 lLevel1 = 800, // trigger level 1 (mV) + bool bTrigTerm = true, // trigger termination active + bool bACCoupling = false, // programmable AC coupling + int32 lPulsewidth = 0, // programmable pulsewidth for all external + pulsewidth modes + bool bSingleSrc = true, // acts as single trigger source, all other masks cleared + int32 lExtLine = 0); // standard external trigger is line 0 + +// additional BaseXIO trigger +bool bSpcMSetupTrigXIO ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + int32 lXIOMode, // external trigger mode + bool bSingleSrc = true, // acts as single trigger source, all other masks cleared + int32 lXIOLine = 0); // standard XIO trigger is line 0 + +// channel trigger is set for each channel separately +bool bSpcMSetupTrigChannel ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + int32 lChannel, // channel to modify + int32 lTrigMode, // channel trigger mode + int32 lTrigLevel0 = 0, // level 0 + int32 lTrigLevel1 = 0, // level 1 + int32 lPulsewidth = 0, // programmable pulsewidth for channel + bool bTrigOut = false, // trigger output + bool bSingleSrc = true); // acts as single trigger source, all other masks cleared + +// this function sets the trigger masks (bSingleSrc of other commands must be false to use this) +bool bSpcMSetupTrigMask ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + uint32 dwChannelOrMask0, // or mask of all available channels + uint32 dwChannelOrMask1 = 0, // ... + uint32 dwChannelAndMask0 = 0, // and mask of all available channels + uint32 dwChannelAndMask1 = 0, // ... + uint32 dwTrigOrMask = 0, // trigger or mask (software external, basexio) + uint32 dwTrigAndMask = 0); // trigger and mask (software external, basexio) + + + +/* +************************************************************************** +bSpcMSetupInputChannel + +allows all input channel related settings. if one of the setup like +termination or differential inputs is not available on the card the +setting is simply ignored +************************************************************************** +*/ + +bool bSpcMSetupInputChannel ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + int32 lChannel, // channel to change + int32 lInputRange, // input range in mV = (max-min)/2, =1000 for +/-1V range + bool bTerm = true, // set input termination (50 ohm) if available + int32 lInputOffset = 0, // programmable input offset as listed in the manual + bool bDiffInput = false); // set differential input if available + +// *********************************************************************** +// suitable for M3i series with enhanced inputs + +bool bSpcMSetupPathInputCh ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + int32 lChannel, // channel to change + int32 lPath, // input path + int32 lInputRange, // input range in mV = (max-min)/2, =1000 for +/-1V range + bool bTerm = true, // set input termination (50 ohm) if available + bool bACCoupling = false, // AC coupling activated + bool bBWLimit = false, // bandwidth limit activated + bool bDiffInput = false); // set differential input if available + + +/* +************************************************************************** +bSpcMSetupAnalogOutputChannel + +allows all analog output channel related settings. if one of the setup like +DoubleOut is not available on the card the setting is simply ignored +************************************************************************** +*/ + +bool bSpcMSetupAnalogOutputChannel ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + int32 lChannel, // channel to change + int32 lAmplitude, // output amplitude in mV = (max-min)/2, =1000 for +/-1V range + int32 lOutputOffset = 0, // programmable output offset as listed in the manual + int32 lFilter = 0, // programmable output filter as listed in the manual + int32 lStopMode = SPCM_STOPLVL_ZERO, // defines the behavior after replay or while replay is pausing + bool bDoubleOut = false, // enables identical output on two channels of one module (if available) + bool bDifferential = false); // enables differential output on two channels of one module (if available) + + + +/* +************************************************************************** +bSpcMSetupDigitalXXXModul + +allows all input and output channel related settings for one group of +channels. If one of the setups like the programmable output levels is not +available this setup is simply ignored +************************************************************************** +*/ + +bool bSpcMSetupDigitalOutput ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + int32 lGroup, // module/group of channels to change + int32 lStopMode = SPCM_STOPLVL_LOW, // defines the behavior after replay or while replay is pausing + int32 lLowLevel = 0, // low level in mV if output is programmable + int32 lHighLevel = 3300, // high level in mV if output levels are programmable + bool bDiffMode = false); // hardware differential mode if available + +bool bSpcMSetupDigitalInput ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + int32 lGroup, // module/group of channels to change + bool bTerm = true); // input termination + + + +/* +************************************************************************** +bSpcMSetupTimestamp + +set up the timestamp mode and performs a synchronisation with refernce +clock if that mode is activated +************************************************************************** +*/ + +bool bSpcMSetupTimestamp ( // returns false if error occured, otherwise true + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + int32 lMode, // mode for timestamp + uint32 dwRefTimeoutMS); // timeout in milli seconds for synchronisation with reference clock + +#endif diff --git a/AWGDependencies/Spectrum/common/spcm_lib_data.cpp b/AWGDependencies/Spectrum/common/spcm_lib_data.cpp new file mode 100644 index 0000000..64b9061 --- /dev/null +++ b/AWGDependencies/Spectrum/common/spcm_lib_data.cpp @@ -0,0 +1,674 @@ +/* +************************************************************************** + +spcm_lib_data.cpp (c) Spectrum GmbH + +************************************************************************** + +Offers simple data manipulation routines for the SpcMDrv data format. +Feel free to use this source for own projects and modify it in any kind + +Documentation for the API as well as a detailed description of the hardware +can be found in the manual for each device which can be found on our website: +https://www.spectrum-instrumentation.com/en/downloads + +Further information can be found online in the Knowledge Base: +https://www.spectrum-instrumentation.com/en/knowledge-base-overview + +************************************************************************** +*/ + +// ----- include of common example librarys ----- +#include "../common/spcm_lib_data.h" + + +// ----- standard c include files ----- +#include +#include +#include + + +/* +************************************************************************** +bSpcMDemuxDigitalInputData + +demultiplexes the digital input data to seperate arrays. +The data buffers for the demultiplexed data must be allocated by the +caller. Each buffer must be of the size (LenInSamples) +************************************************************************** +*/ + +bool bSpcMDemuxDigitalInputDataToUInt8 (ST_SPCM_CARDINFO *pstCardInfo, void *pvMuxData, uint32 dwLenInSamples, uint8 **ppbyData) + { + uint32 dwSample; + int32 lCh; + uint8* ppbyChPtr[SPCM_MAX_AICHANNEL]; + + if (!pstCardInfo || !pvMuxData) + return false; + + // set the sorting table for the channels + for (lCh=0; lCh < pstCardInfo->lSetChannels; lCh++) + ppbyChPtr[lCh] = ppbyData[lCh]; + + // if two modules are active data is sorted mod0ch0, mod1ch0, mod0ch1, ... + if (pstCardInfo->qwSetChEnableMap & ~((1 << (pstCardInfo->lMaxChannels / pstCardInfo->lModulesCount)) - 1)) + for (lCh=0; lCh < (pstCardInfo->lSetChannels >> 1); lCh++) + { + ppbyChPtr[2 * lCh + 0] = ppbyData[lCh]; + ppbyChPtr[2 * lCh + 1] = ppbyData[(pstCardInfo->lSetChannels >> 1) + lCh]; + } + + uint8* pbyMuxBuf = (uint8*) pvMuxData; + + for (dwSample = 0; dwSample < dwLenInSamples; dwSample++) + for (lCh = 0; lCh < pstCardInfo->lSetChannels; lCh++) + *ppbyChPtr[lCh]++ = *pbyMuxBuf++; + + return true; + } + + +/* +************************************************************************** +bSpcMDemuxDigitalDataToInt8 + +demultiplexes the digital channel data to seperate arrays. At 64 bit are +the both inner words swapped to compensate the hardware-order. +The data buffers for the demultiplexed data must be allocated by the +caller. +************************************************************************** +*/ + +bool bSpcMDemuxDigitalDataToInt8 (ST_SPCM_CARDINFO *pstCardInfo, void *pvMuxData, uint32 dwLenInSamples, int8 **ppbyData) + { + int16 nGroupSample; + int8 bySample; + int32 lIdxOffset, lChIdx, lSampleIdx; + uint32 dwGroupIdx; + int16* ppnBuf; + + ppnBuf = (int16*)pvMuxData; + lSampleIdx = -1; + + // split data + for (dwGroupIdx=0; dwGroupIdx < (dwLenInSamples * pstCardInfo->lSetChannels) / 16; dwGroupIdx++) + { + + nGroupSample = ppnBuf[dwGroupIdx]; + + switch (pstCardInfo->lSetChannels) + { + // 1, 2, 4, 8 channels + case 1: + case 2: + case 4: + case 8: + for (lChIdx=0; lChIdx < 16; lChIdx++) + { + + if (!(lChIdx%pstCardInfo->lSetChannels)) + lSampleIdx++; + + bySample = (int8)(nGroupSample & 0x0001); + nGroupSample = nGroupSample >> 1; + + ppbyData[lChIdx%pstCardInfo->lSetChannels][lSampleIdx] = bySample; + } + + break; + + // 16 channels + case 16 : + for (lChIdx=0; lChIdx < 16; lChIdx++) + { + bySample = (int8)(nGroupSample & 0x0001); + nGroupSample = nGroupSample >> 1; + + ppbyData[lChIdx][dwGroupIdx] = bySample; + } + + break; + + // 32 channels + case 32 : + if (!(dwGroupIdx%2)) + { + lIdxOffset = 0; + lSampleIdx++; + } + else + lIdxOffset = 16; + + for (lChIdx=0; lChIdx < 16; lChIdx++) + { + bySample = (int8)(nGroupSample & 0x0001); + nGroupSample = nGroupSample >> 1; + + ppbyData[lChIdx + lIdxOffset][lSampleIdx] = bySample; + } + + break; + + // 64 channels + case 64 : + switch (dwGroupIdx%4) + { + case 0 : + lIdxOffset = 0; + lSampleIdx++; + break; + case 1 : + lIdxOffset = 32; + break; + case 2 : + lIdxOffset = 16; + break; + case 3 : + lIdxOffset = 48; + break; + } + + for (lChIdx=0; lChIdx < 16; lChIdx++) + { + bySample = (int8)(nGroupSample & 0x0001); + nGroupSample = nGroupSample >> 1; + + ppbyData[lChIdx + lIdxOffset][lSampleIdx] = bySample; + } + + break; + + default: + return false; + } + } + + return true; + } + + +/* +************************************************************************** +dSpcMIntToVoltage: recalculates an integer value to a voltage value taking +selected range and selected offset into account +************************************************************************** +*/ + +double dSpcMIntToVoltage (ST_SPCM_CARDINFO *pstCardInfo, int32 lChannel, double dValue) + { + if (!pstCardInfo) + return 0; + + if ((lChannel < 0) || (lChannel >= pstCardInfo->lMaxChannels)) + { + sprintf (pstCardInfo->szError, "SpcMIntToVoltage: channel number %d not valid. Channels range from 0 to %d\n", lChannel, pstCardInfo->lMaxChannels); + return 0; + } + + double dVoltage_mv; + + // recalculate with input range + dVoltage_mv = pstCardInfo->uCfg.stAI.lSetRange[lChannel] * dValue / pstCardInfo->uCfg.stAI.lMaxADCValue; + + // add the signal offset + if (pstCardInfo->uCfg.stAI.bOffsPercentMode) + dVoltage_mv -= pstCardInfo->uCfg.stAI.lSetRange[lChannel] * pstCardInfo->uCfg.stAI.lSetOffset[lChannel] / 100; + else + dVoltage_mv -= pstCardInfo->uCfg.stAI.lSetOffset[lChannel]; + + return (dVoltage_mv / 1000.0); + } + + + +/* +************************************************************************** +bSpcMDemuxAnalogDataToVoltage + +demultiplexes the analog channel data to seperate arrays. +The data buffers for the demultiplexed data must be allocated by the +caller. Each buffer must be of the size (LenInSamples * sizeof(float)) + +Recalculates the plain data to voltage levels taking resolution, offset +and range into account. +************************************************************************** +*/ + +bool bSpcMDemuxAnalogDataToVoltage (ST_SPCM_CARDINFO *pstCardInfo, void *pvMuxData, uint32 dwLenInSamples, float **ppfData) + { + uint32 dwSample; + int32 lCh; + float* ppfChPtr[SPCM_MAX_AICHANNEL]; + double dOffset[SPCM_MAX_AICHANNEL], dFactor[SPCM_MAX_AICHANNEL]; + + if (!pstCardInfo || !pvMuxData) + return false; + + // set the sorting table for the channels + for (lCh=0; lCh < pstCardInfo->lSetChannels; lCh++) + ppfChPtr[lCh] = ppfData[lCh]; + + // if two modules are active data is sorted mod0ch0, mod1ch0, mod0ch1, ... + if (pstCardInfo->qwSetChEnableMap & ~((1 << (pstCardInfo->lMaxChannels / pstCardInfo->lModulesCount)) - 1)) + for (lCh=0; lCh < (pstCardInfo->lSetChannels >> 1); lCh++) + { + ppfChPtr[2 * lCh + 0] = ppfData[lCh]; + ppfChPtr[2 * lCh + 1] = ppfData[(pstCardInfo->lSetChannels >> 1) + lCh]; + } + + // calculate offset and factor for re-calculation to voltage + for (lCh=0; lCh < pstCardInfo->lSetChannels; lCh++) + { + dFactor[lCh] = (double) pstCardInfo->uCfg.stAI.lSetRange[lCh] / pstCardInfo->uCfg.stAI.lMaxADCValue / 1000.0; + + // add the signal offset + if (pstCardInfo->uCfg.stAI.bOffsPercentMode) + dOffset[lCh] = -(double) pstCardInfo->uCfg.stAI.lSetRange[lCh] * pstCardInfo->uCfg.stAI.lSetOffset[lCh] / 100.0 / 1000.0; + else + dOffset[lCh] = -(double) pstCardInfo->uCfg.stAI.lSetOffset[lCh] / 1000.0; + } + + // split word data + if (pstCardInfo->lBytesPerSample > 1) + { + int16* pnMuxBuf = (int16*) pvMuxData; + + for (dwSample = 0; dwSample < dwLenInSamples; dwSample++) + for (lCh = 0; lCh < pstCardInfo->lSetChannels; lCh++) + *ppfChPtr[lCh]++ = (float) (dOffset[lCh] + dFactor[lCh] * *pnMuxBuf++); + } + + // split byte data + else + { + int8* pbyMuxBuf = (int8*) pvMuxData; + + for (dwSample = 0; dwSample < dwLenInSamples; dwSample++) + for (lCh = 0; lCh < pstCardInfo->lSetChannels; lCh++) + *ppfChPtr[lCh]++ = (float) (dOffset[lCh] + dFactor[lCh] * *pbyMuxBuf++); + } + + return true; + } + + + +/* +************************************************************************** +bMMuxData + +multiplexes a series of channels into one buffer. The function retains +the information how much bytes one sample has from the CardInfo structure. +The source buffers must be same format and the destination buffer must be +lSetChannels * llMemsize for all the data +************************************************************************** +*/ + +bool bSpcMMuxData (ST_SPCM_CARDINFO *pstCardInfo, void *pvMuxData, uint32 dwLenInSamples, void **ppvData) + { + int32 lCh; + void* ppvChPtr[SPCM_MAX_AOCHANNEL]; + uint32 dwSample; + + if (!pstCardInfo || !pvMuxData) + return false; + + // set the sorting table for the channels + for (lCh = 0; lCh < pstCardInfo->lSetChannels; lCh++) + ppvChPtr[lCh] = ppvData[lCh]; + + // M2i does not use linear sorting if two modules are active + if (pstCardInfo->bM2i) + { + // if two modules are active data is sorted mod0ch0, mod1ch0, mod0ch1, ... + if (pstCardInfo->qwSetChEnableMap & ~((1 << (pstCardInfo->lMaxChannels / pstCardInfo->lModulesCount)) - 1)) + { + for (lCh=0; lCh < (pstCardInfo->lSetChannels >> 1); lCh++) + { + ppvChPtr[2 * lCh + 0] = ppvData[lCh]; + ppvChPtr[2 * lCh + 1] = ppvData[(pstCardInfo->lSetChannels >> 1) + lCh]; + } + } + } + + // now start the mux loop + uint32 dwBytesPerSumSample = (uint32) (pstCardInfo->lSetChannels * pstCardInfo->lBytesPerSample); + uint32 dwBytesPerSample = pstCardInfo->lBytesPerSample; + + for (dwSample = 0; dwSample < dwLenInSamples; dwSample++) + for (lCh = 0; lCh < pstCardInfo->lSetChannels; lCh++) + memcpy (((uint8*) pvMuxData) + dwSample * dwBytesPerSumSample + lCh * dwBytesPerSample, ((uint8*) ppvChPtr[lCh]) + dwSample * dwBytesPerSample, dwBytesPerSample); + + return true; + } + + + +/* +************************************************************************** +bSpcMSplitAnalogAndDigitalData + +If synchronous digital inputs have been used with analog data acquisition, +analog and digital data are stored in combined samples, the digital data +using the upper bits of the analog word. + +This function splits analog and digital data into separate arrays. Analog +data is sign extended to int16 again to use it with any calculation +routine. Digital data + +The caller is responsible to allocate buffer data for the split data. The +analog data buffer must be of the size (LenInSamples * Channels * 2), the +digital data needs (LenInSamples * Channels) +************************************************************************** +*/ + +bool bSpcMSplitAnalogAndDigitalData (ST_SPCM_CARDINFO *pstCardInfo, void *pvMergedData, uint32 dwLenInSamples, void *pvAnalogData, void *pvDigitalData) + { + int16 nSample, nAnalogVal, nDigMask; + uint32 i; + + if (!pstCardInfo || !pvMergedData) + return false; + + int16 *pnMergedData = (int16*)pvMergedData; + int16 *pnAnalogData = (int16*)pvAnalogData; + uint8 *pbyDigitalData = (uint8*)pvDigitalData; + + // split analog and digital part + for (i = 0; i < dwLenInSamples; i++) + { + nSample = pnMergedData[i]; + + if (pstCardInfo->uCfg.stAI.lResolution == 12) + { + + // card resolution = 12 bit -> 4 digital channels + nDigMask = nSample >> 12; + nDigMask &= 0x000f; + + if (nSample & 0x800) + nAnalogVal = nSample | 0xf000; + else + nAnalogVal = nSample & 0x0fff; + } + else + { + + // card resolution = 14 bit -> 2 digital channels + nDigMask = nSample >> 14; + nDigMask &= 0x0003; + + if (nSample & 0x2000) + nAnalogVal = nSample | 0xc000; + else + nAnalogVal = nSample & 0x3fff; + } + + pbyDigitalData[i] = (uint8)nDigMask; + pnAnalogData[i] = nAnalogVal; + } + + return true; + } + + +/* +************************************************************************** +bFillSB5Header + +Fills a SBench5 file header structure with the current setup of pstCard +************************************************************************** +*/ + +bool bFillSB5Header (ST_SPCM_CARDINFO *pstCard, ST_SB5HEAD *pstHeader, const char* pszName) + { + char szSource[25]; + int i; + + if (!pstCard || !pstHeader) + return false; + + // check the arrays that we need + if (!pstHeader->pdSourceFS || !pstHeader->pdYOffset || !pstHeader->pdYScale || !pstHeader->plMuxIdx) + return false; + + // signal type + switch (pstCard->eCardFunction) + { + case AnalogIn: + if (pstCard->lSetChannels == 1) + pstHeader->lSignalType = SIGNAL_TYP_ANALOGTIME; + else + pstHeader->lSignalType = SIGNAL_TYP_ANALOGSTREAM; + switch (pstCard->uCfg.stAI.lResolution) + { + case 8: pstHeader->lSignalType |= SIGNAL_TYP_8BIT | SIGNAL_TYP_1BYTE; break; + case 12: pstHeader->lSignalType |= SIGNAL_TYP_12BIT | SIGNAL_TYP_2BYTE; break; + case 14: pstHeader->lSignalType |= SIGNAL_TYP_14BIT | SIGNAL_TYP_2BYTE; break; + case 16: pstHeader->lSignalType |= SIGNAL_TYP_16BIT | SIGNAL_TYP_2BYTE; break; + default: break; + } + + break; + + case DigitalIn: + case DigitalIO: + if (pstCard->lSetChannels == 1) + pstHeader->lSignalType = SIGNAL_TYP_DIGITALTIME; + else + pstHeader->lSignalType = SIGNAL_TYP_DIGITALSTREAM; + break; + + default: + return false; + } + + // signal name + pstHeader->pszSignalName = new char[strlen(pszName) + 1]; + strcpy (pstHeader->pszSignalName, pszName); + + + // source is card name + sn + switch (pstCard->lCardType & TYP_SERIESMASK) + { + case TYP_M2ISERIES: sprintf (szSource, "M2i.%04x sn %05d", pstCard->lCardType & TYP_VERSIONMASK, pstCard->lSerialNumber); break; + case TYP_M2IEXPSERIES: sprintf (szSource, "M2i.%04x-Exp sn %05d", pstCard->lCardType & TYP_VERSIONMASK, pstCard->lSerialNumber); break; + default: sprintf (szSource, "Unknown %04x sn %05d", pstCard->lCardType & TYP_VERSIONMASK, pstCard->lSerialNumber); break; + } + pstHeader->pszSource = new char[strlen(szSource) + 1]; + strcpy (pstHeader->pszSource, szSource); + + + // fill in the single information + pstHeader->lSumSamples = (int32) pstCard->llSetMemsize * pstCard->lSetChannels; + pstHeader->dXScale = 1.0 / pstCard->llSetSamplerate; + pstHeader->lChannels = pstCard->lSetChannels; + + + // channel information to be stored + switch (pstCard->eCardFunction) + { + case AnalogIn: + for (i=0; ilSetChannels; i++) + { + pstHeader->pdSourceFS[i] = pstCard->uCfg.stAI.lSetRange[i]; + pstHeader->pdYOffset[i] = - (double) pstCard->uCfg.stAI.lSetOffset[i] / 100 * pstCard->uCfg.stAI.lSetRange[i]; + pstHeader->pdYScale[i] = (double) pstCard->uCfg.stAI.lSetRange[i] / pstCard->uCfg.stAI.lMaxADCValue / 1000.0; + } + + // if two modules are active data is sorted mod0ch0, mod1ch0, mod0ch1, ... + if (pstCard->qwSetChEnableMap & ~((1 << (pstCard->lMaxChannels / pstCard->lModulesCount)) - 1)) + for (i=0; i < (pstCard->lSetChannels >> 1); i++) + { + pstHeader->plMuxIdx[2 * i + 0] = i; + pstHeader->plMuxIdx[2 * i + 1] = (pstCard->lSetChannels >> 1) + i; + } + + // all channels on one module + else + for (i=0; i < pstCard->lSetChannels; i++) + pstHeader->plMuxIdx[i] = i; + + break; + } + + return true; + } + + + +/* +************************************************************************** +bCalcSignal: calculates simple signal shapes for output card test +************************************************************************** +*/ + +bool bSpcMCalcSignal (ST_SPCM_CARDINFO *pstCardInfo, void *pvData, uint32 dwLenInSamples, uint32 dwByteWidth, E_SPCM_SIGSHAPE eShape, uint32 dwLoops, uint32 dwGainP) + { + int64 llMinFS, llMaxFS, llValue; + uint32 i; + int32 lResolution; + double dScale; + int8* pbyData = (int8*) pvData; + int16* pnData = (int16*) pvData; + int32* plData = (int32*) pvData; + int64* pllData = (int64*) pvData; + + if (!pstCardInfo || !pvData || !dwLenInSamples) + return false; + + + // examine the resolution, bytewidth and min/max values + switch (pstCardInfo->eCardFunction) + { + case AnalogIn: + case AnalogOut: + if (pstCardInfo->eCardFunction == AnalogIn) + lResolution = pstCardInfo->uCfg.stAI.lResolution; + else + lResolution = pstCardInfo->uCfg.stAO.lResolution; + + switch (lResolution) + { + default: + case 8: + dwByteWidth = 1; + break; + + case 12: + case 14: + case 16: + dwByteWidth = 2; + break; + } + + llMinFS = -pstCardInfo->uCfg.stAO.lMaxDACValue - 1; + llMaxFS = pstCardInfo->uCfg.stAO.lMaxDACValue; + dScale = (double) pstCardInfo->uCfg.stAO.lMaxDACValue * dwGainP / 100.0; + + break; + + case DigitalIn: + case DigitalOut: + case DigitalIO: + if (dwByteWidth == 0) + { + sprintf (pstCardInfo->szError, "ByteWidth can't be zero for digital cards as we didn't know how much channels are activated\n"); + return false; + } + // two complement numbers + llMaxFS = (((uint64) 1 << (8 * dwByteWidth - 1)) - 1); + llMinFS = -llMaxFS - 1; + dScale = ((double) llMaxFS) * dwGainP / 100.0; + break; + } + + + // calculation of different signal shapes + double dSineXScale = 2.0 * 3.14159 / dwLenInSamples * dwLoops; + uint32 dwBlockLen = dwLenInSamples / dwLoops; + uint32 dwBlockHalf = dwBlockLen / 2; + uint32 dwPosInBlock; + double dSpan = (double) ((uint64) (llMaxFS - llMinFS)); + for (i = 0; i < dwLenInSamples; i++) + { + + dwPosInBlock = (i % dwBlockLen); + + // calculation of value + switch (eShape) + { + + // DC level + case eDCZero: llValue = 0; break; + case eDCPlusFS: llValue = llMaxFS; break; + case eDCMinusFS: llValue = llMinFS; break; + + // sine + case eSine: + case eInvertedSine: + llValue = (int64) (dScale * sin (dSineXScale * i)); + break; + + // rectangle + case eRectangle: + case eInvertedRectangle: + if (dwPosInBlock < dwBlockHalf) + llValue = llMinFS; + else + llValue = llMaxFS; + break; + + // triangle + case eTriangle: + case eInvertedTriangle: + if (dwPosInBlock < dwBlockHalf) + llValue = (int64) (llMinFS + dwPosInBlock * dSpan / dwBlockHalf); + else + llValue = (int64) (llMaxFS - (dwPosInBlock - dwBlockHalf) * dSpan / dwBlockHalf); + break; + + // sawtooth + case eSawtooth: + case eInvertedSawtooth: + llValue = (int64) (llMinFS + dwPosInBlock * dSpan / dwBlockLen); + break; + + default: + sprintf (pstCardInfo->szError, "Unknown signal shape selected\n"); + return false; + } + + switch (eShape) + { + // invert sign for inverted waveforms + case eInvertedSine: + case eInvertedTriangle: + case eInvertedSawtooth: + case eInvertedRectangle: + llValue *= -1; + break; + default: + // nothing + break; + } + + // write value to array + if (llValue < llMinFS) + llValue = llMinFS; + else if (llValue > llMaxFS) + llValue = llMaxFS; + + switch (dwByteWidth) + { + default: + case 1: *pbyData++ = (int8) llValue; break; + case 2: *pnData++ = (int16) llValue; break; + case 4: *plData++ = (int32) llValue; break; + case 8: *pllData++ = (int64) llValue; break; + } + } // end of for-loop + + return true; + } diff --git a/AWGDependencies/Spectrum/common/spcm_lib_data.h b/AWGDependencies/Spectrum/common/spcm_lib_data.h new file mode 100644 index 0000000..0e32d33 --- /dev/null +++ b/AWGDependencies/Spectrum/common/spcm_lib_data.h @@ -0,0 +1,321 @@ +/* +************************************************************************** + +spcm_lib_data.h (c) Spectrum GmbH , 01/2006 + +************************************************************************** + +Offers simple data manipulation routines for the SpcMDrv data format. +Feel free to use this source for own projects and modify it in any kind + +************************************************************************** +*/ + + +#ifndef SPCM_LIB_DATA_H +#define SPCM_LIB_DATA_H + +#include +#include + +// ----- include standard driver header from library ----- +#include "../c_header/dlltyp.h" +#include "../c_header/regs.h" +#include "../c_header/spcerr.h" +#include "../c_header/spcm_drv.h" + +// ----- include of common example librarys ----- +#include "../common/spcm_lib_card.h" +#include "../sb5_file/sb5_file.h" + + +/* +************************************************************************** +bSpcMDemuxDigitalInputDataToUInt8 + +demultiplexes the digital input data to seperate arrays of uint8 values. +The data buffers for the demultiplexed data must be allocated by the +caller. Each buffer must be of the size (LenInSamples) +************************************************************************** +*/ + +bool bSpcMDemuxDigitalInputDataToUInt8 ( + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + void *pvMuxData, // pointer to the muxed data + uint32 dwLenInSamples, // length ot muxed data in samples + uint8 **ppbyData); // array of pointers for demuxed data + + +/* +************************************************************************** +bSpcMDemuxDigitalDataToInt8 + +demultiplexes the digital channel data to seperate arrays of int8 values. +The data buffers for the demultiplexed data must be allocated by the +caller. +************************************************************************** +*/ + +bool bSpcMDemuxDigitalDataToInt8 ( + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + void *pvMuxData, // pointer to the muxed data + uint32 dwLenInSamples, // length ot muxed data in samples + int8 **ppbyData); // array of pointers for demuxed data + + +/* +************************************************************************** +bMMuxData + +multiplexes a series of channels into one buffer. The function retains +the information how much bytes one sample has from the CardInfo structure. +The source buffers must be same format and the destination buffer must be +lSetChannels * llMemsize for all the data +************************************************************************** +*/ + +bool bSpcMMuxData ( + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + void *pvMuxData, // pointer to the empty muxed data buffer + uint32 dwLenInSamples, // length ot channel data in samples + void **ppvData); // array of pointers for demuxed data + + + +/* +************************************************************************** +dSpcMIntToVoltage + +recalculates an integer value to a voltage value taking selected range +and selected offset into account +************************************************************************** +*/ + +double dSpcMIntToVoltage ( // returns the calculated voltage value + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + int32 lChannel, // channel for which the data is valid + double dValue); // channel value + + + +/* +************************************************************************** +bSpcMDemuxAnalogDataToVoltage + +demultiplexes the analog channel data to seperate arrays. +The data buffers for the demultiplexed data must be allocated by the +caller. Each buffer must be of the size (LenInSamples * sizeof(float)) + +Recalculates the plain data to voltage levels taking resolution, offset +and range into account. +************************************************************************** +*/ + +bool bSpcMDemuxAnalogDataToVoltage ( + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + void *pvMuxData, // pointer to the muxed data + uint32 dwLenInSamples, // length ot muxed data in samples + float **ppfData); // array of pointers for demuxed data + + + +/* +************************************************************************** +bSplitAnalogAndDigitalData + +If synchronous digital inputs have been used with analog data acquistion, +analog and digital data are stored in combined samples, the digital data +using the upper bits of the analog word. + +This function splits analog and digital data into separate arrays. Analog +data is sign extended to int16 again to use it with any calculation +routine. Digital data + +The caller is responsible to allocate buffer data for the split data. The +analog data buffer must be of the size (LenInSamples * Channels * 2), the +digital data needs (LenInSamples * Channels) +************************************************************************** +*/ + +bool bSpcMSplitAnalogAndDigitalData ( + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + void *pvMergedData, // pointer to the merged data + uint32 dwLenInSamples, // length ot merged data in samples + void *pvAnalogData, // pointer to a free buffer for analog data + void *pvDigitalData); // pointer to a free buffer for digital data + + + +/* +************************************************************************** +vFillSB5Header + +Fills a SBench5 file header structure with the current setup of pstCard +************************************************************************** +*/ + +bool bFillSB5Header ( + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + ST_SB5HEAD *pstHeader, // pointer to an empty header structure + const char* pszName); // name of signal + + +/* +************************************************************************** +TCalcXXX + +some simple calculation routines for generic data +************************************************************************** +*/ + + +// remove existing Windows min,max definitions so allow std:: functions +#ifdef max +# undef max +#endif + +#ifdef min +# undef min +#endif + + +// *********************************************************************** +template +T TSpcMCalcMin( // returns the min value of the signal + T* pTData, // generic data array + uint32 lLenInSamples) // length of the data array + { + if (!pTData) + return 0; + + T TMin = std::numeric_limits < T >::max (); + + for (uint32 j = 0; j < lLenInSamples; j++, pTData++) + if (*pTData < TMin) + TMin = *pTData; + + return TMin; + } + + +// *********************************************************************** +template +T TSpcMCalcMax( // returns the max value of the signal + T* pTData, // generic data array + uint32 lLenInSamples) // length of the data array + { + if (!pTData) + return 0; + + T TMax = std::numeric_limits < T >::min (); + + + for (uint32 j = 0; j < lLenInSamples; j++, pTData++) + if (*pTData > TMax) + TMax = *pTData; + + return TMax; + } + + +// *********************************************************************** +template +double dSpcMCalcAverage( // returns the average (DC) of the signal + T* pTData, // generic data array + uint32 lLenInSamples) // length of the data array + { + if (!pTData) + return 0; + + uint32 j; + double dAverage; + + for (dAverage = 0, j = 0; j < lLenInSamples; j++, pTData++) + dAverage += *pTData; + + return (dAverage / lLenInSamples); + } + + +/* +************************************************************************** +bSpcMDemuxAnalogData + +demultiplexes the analog channel data to seperate arrays. +The data buffers for the demultiplexed data must be allocated by the +caller. Each buffer must be of the size (LenInSamples * BytesPerSample) +************************************************************************** +*/ + +template +bool bSpcMDemuxAnalogData ( + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure + void *pvMuxData, // pointer to the muxed data + uint32 dwLenInSamples, // length ot muxed data in samples + T **ppTChannelData) // generic array of pointers for demuxed data + { + uint32 dwSample; + int32 lCh; + T* ppTChPtr[SPCM_MAX_AICHANNEL]; + + if (!pstCardInfo || !pvMuxData) + return false; + + // set the sorting table for the channels + for (lCh=0; lCh < pstCardInfo->lSetChannels; lCh++) + ppTChPtr[lCh] = ppTChannelData[lCh]; + + // if two modules are active data is sorted mod0ch0, mod1ch0, mod0ch1, ... + if (pstCardInfo->qwSetChEnableMap & ~((1 << (pstCardInfo->lMaxChannels / pstCardInfo->lModulesCount)) - 1)) + for (lCh=0; lCh < (pstCardInfo->lSetChannels >> 1); lCh++) + { + ppTChPtr[2 * lCh + 0] = ppTChannelData[lCh]; + ppTChPtr[2 * lCh + 1] = ppTChannelData[(pstCardInfo->lSetChannels >> 1) + lCh]; + } + + // split data + T* pTMuxBuf = (T*) pvMuxData; + + for (dwSample = 0; dwSample < dwLenInSamples; dwSample++) + for (lCh = 0; lCh < pstCardInfo->lSetChannels; lCh++) + *ppTChPtr[lCh]++ = *pTMuxBuf++; + + return true; + } + +/* +************************************************************************** +bCalcSignal + +calculates simple signal shapes for output card test +************************************************************************** +*/ + +// signal shapes +typedef enum E_SPCM_SIGSHAPE + { + eDCZero, // zero level + eDCPlusFS, // positive full scale level (max) + eDCMinusFS, // negative full scale level (min) + eSine, // sine signal, one full 360° sine per loop + eRectangle, // rectangle with 50% duty + eTriangle, // triangle starting at -full scale level + eSawtooth, // sawtooth starting at -full scale level + eInvertedSine, // like eSine, but with inverted sign + eInvertedRectangle, // like eRectangle, but with inverted sign + eInvertedTriangle, // like eTriangle, but with inverted sign + eInvertedSawtooth // like eSawtooth, but with inverted sign + } E_SPCM_SIGSHAPE; + + +bool bSpcMCalcSignal ( // return true if calculation has succeeded + ST_SPCM_CARDINFO *pstCardInfo, // pointer to a filled card info structure (needed for resolution) + void *pvData, // pointer to free buffer for calculated data + uint32 dwLenInSamples, // length of the data array in samples + uint32 dwByteWidth = 0,// bytes width (for digital cards), if zero we expect a matching width to analog resolution + E_SPCM_SIGSHAPE eShape = eSine, // shape of signal to calculate + uint32 dwLoops = 1, // number of loops in calculated signal + uint32 dwGainP = 100); // gain in percent in relation to resolution + + +#endif diff --git a/AWGDependencies/Spectrum/common/spcm_lib_thread.cpp b/AWGDependencies/Spectrum/common/spcm_lib_thread.cpp new file mode 100644 index 0000000..6a06977 --- /dev/null +++ b/AWGDependencies/Spectrum/common/spcm_lib_thread.cpp @@ -0,0 +1,723 @@ +/* +************************************************************************** + +spcm_lib_thread.cpp (c) Spectrum GmbH + +************************************************************************** + +Offers data transfer threads for sample data, timestamp data and ABA date. +Each thread get's a bundle of parameters including a work function that +is used to do something with the data. These threads are used in all our +FIFO examples. + +************************************************************************** +*/ + + +// ----- include of common example librarys ----- +#include "../common/spcm_lib_thread.h" + +// ----- standard c include files ----- +#include +#include + + + +/* +************************************************************************** +bInitThreadStructure: initializes all mutexes and events. If the parameter +hSharedUpdate is set we do not allocate a new event for updat ebut use +this one as a shared event +************************************************************************** +*/ + +bool bInitThreadStructure (ST_THREADDATA* pstThreadData, SPCM_EVENT_HANDLE* phSharedEventUpdate) + { + bool bSetupOk = true; + + // initialize the structre with 0 + memset (pstThreadData, 0, sizeof (ST_THREADDATA)); + + // init the mutex and the events + bSetupOk &= (bSetupOk && spcm_bCreateMutex (&pstThreadData->hMutexSharedAccess)); + bSetupOk &= (bSetupOk && spcm_bCreateEvent (&pstThreadData->hEventInitDone)); + bSetupOk &= (bSetupOk && spcm_bCreateEvent (&pstThreadData->hEventStart)); + bSetupOk &= (bSetupOk && spcm_bCreateEvent (&pstThreadData->hEventStartDone)); + bSetupOk &= (bSetupOk && spcm_bCreateEvent (&pstThreadData->hEventTermDone)); + + // if a shared event is given we store this and set a matching flag + if (phSharedEventUpdate != NULL) + { + pstThreadData->phSharedUpdate = phSharedEventUpdate; + pstThreadData->bSharedUpdate = true; + } + + // otherwise we allocate a new event + else + { + bSetupOk &= (bSetupOk && spcm_bCreateEvent (&pstThreadData->hEventUpdate)); + pstThreadData->phSharedUpdate = &pstThreadData->hEventUpdate; + pstThreadData->bSharedUpdate = false; + } + + return bSetupOk; + } + + + +/* +************************************************************************** +vCleanThreadStructure: clean up (we don't need to care for correct +initialisation as this is checked in the close routines) +************************************************************************** +*/ + +void vCleanThreadStructure (ST_THREADDATA* pstThreadData) + { + spcm_vCloseMutex (&pstThreadData->hMutexSharedAccess); + spcm_vCloseEvent (&pstThreadData->hEventStart); + spcm_vCloseEvent (&pstThreadData->hEventInitDone); + spcm_vCloseEvent (&pstThreadData->hEventStartDone); + spcm_vCloseEvent (&pstThreadData->hEventTermDone); + + if (!pstThreadData->bSharedUpdate) + spcm_vCloseEvent (&pstThreadData->hEventUpdate); + } + + + + +/* +************************************************************************** +main loop. the loop cares for card, data, timestamp and aba data all +enabled by flags in the pstBufferData structure. + +This loop can be either called directly or from within the thread function. +if it's called from the thread function it will handle the mutexes and +events also. + +Mainly the loop does the following steps: + + Call bWorkSetup (user function to setup all details) + Allocate memory for buffer + Start card and transfers depending on the flags that have been set + Loop + Wait for interrupt that announces new data or timeout to occur + Read Status and current positions in the buffers + Recalculate positions and length + Call bWorkDo (user function) with the available data + Set the data that was processed available to card again + Until (Abort OR Error) + Call vWorkClose (user function to close files and clean up) + Clean up buffers + +************************************************************************** +*/ + + +void vMainLoop ( + ST_BUFFERDATA* pstBufferData, // filled card info structure + void* pvWorkData, // working data structure that is passed to the calback functions + SPCM_WORK_INIT* pfn_bWorkSetup, // callback function for pre-run setup + SPCM_WORK_DO* pfn_bWorkDo, // callback function that is called if new data is available + SPCM_WORK_CLOSE* pfn_vWorkClose, // callback function at the end of run + SPCM_ABORTCHECK* pfn_bAbortCheck, // callback function for abort checking on each update loop + ST_THREADDATA* pstThreadData) // threaddata for synchronization. Can be NULL if non threaded version is used + +// *********************************************************************** + + { + void* pvDataBuffer = NULL; + void* pvTSBuffer = NULL; + void* pvABABuffer = NULL; + int32 lStartCmd = 0; + int32 lWaitCmd = 0; + int32 lStatus = 0; + int64 llAvailPos = 0; + uint32 dwError = ERR_OK; + bool bContMemUsed = false; + + + // secure the initialisation + if (pstThreadData) + spcm_vGetMutex (&pstThreadData->hMutexSharedAccess); + + // first we do the setup + pstBufferData->qwDataTransferred = 0; + pstBufferData->qwTSTransferred = 0; + pstBufferData->qwABATransferred = 0; + pstBufferData->dwError = ERR_OK; + if (pfn_bWorkSetup) + if (!(*pfn_bWorkSetup) (pvWorkData, pstBufferData)) + { + printf ("Setup failed!\n"); + dwError = ERR_INIT; + } + + + + // now the setup routine has defined the buffer details and we allocate data + if (!dwError) + { + if (pstBufferData->bStartData) + { + + // try to use cont mem buffer if size matches + uint64 qwContBufLen = 0; + spcm_dwGetContBuf_i64 (pstBufferData->pstCard->hDrv, SPCM_BUF_DATA, &pvDataBuffer, &qwContBufLen); + bContMemUsed = (qwContBufLen >= pstBufferData->dwDataBufLen); + if (!bContMemUsed) + pvDataBuffer = pvAllocMemPageAligned (pstBufferData->dwDataBufLen); + } + if (pstBufferData->bStartTimestamp) + pvTSBuffer = pvAllocMemPageAligned (pstBufferData->dwTSBufLen); + if (pstBufferData->bStartABA) + pvABABuffer = pvAllocMemPageAligned (pstBufferData->dwABABufLen); + if ((!pvDataBuffer && pstBufferData->bStartData) || (!pvTSBuffer && pstBufferData->bStartTimestamp) || (!pvABABuffer && pstBufferData->bStartABA)) + { + printf ("Memory Allocation Error\n"); + dwError = ERR_MEMALLOC; + } + } + + + // all is prepared and we define the buffers for the transfer + if (!pstBufferData->dwError && pstBufferData->bStartData) + pstBufferData->dwError = spcm_dwDefTransfer_i64 (pstBufferData->pstCard->hDrv, SPCM_BUF_DATA, SPCM_DIR_CARDTOPC, (uint32) pstBufferData->dwDataNotify, pvDataBuffer, 0, pstBufferData->dwDataBufLen); + if (!pstBufferData->dwError && pstBufferData->bStartTimestamp) + pstBufferData->dwError = spcm_dwDefTransfer_i64 (pstBufferData->pstCard->hDrv, SPCM_BUF_TIMESTAMP, SPCM_DIR_CARDTOPC, (uint32) pstBufferData->dwTSNotify, pvTSBuffer, 0, pstBufferData->dwTSBufLen); + if (!pstBufferData->dwError && pstBufferData->bStartABA) + pstBufferData->dwError = spcm_dwDefTransfer_i64 (pstBufferData->pstCard->hDrv, SPCM_BUF_ABA, SPCM_DIR_CARDTOPC, (uint32) pstBufferData->dwABANotify, pvABABuffer, 0, pstBufferData->dwABABufLen); + + + // send a message that the initialisation has been done + if (pstThreadData) + { + pstThreadData->dwEventFlags |= EVENTFLAG_INITDONE; + spcm_vSignalEvent (&pstThreadData->hEventInitDone); + } + + + // start of the card together with all transfers if enabled + if (!dwError) + { + + // wait for the start event from the main thread + if (pstThreadData) + { + if ((pstThreadData->dwEventFlags & EVENTFLAG_START) == 0) + spcm_bWaitEventWithMutex (&pstThreadData->hEventStart, &pstThreadData->hMutexSharedAccess); + spcm_vReleaseMutex (&pstThreadData->hMutexSharedAccess); + } + + if (pstBufferData->bStartCard) + lStartCmd = M2CMD_CARD_START | M2CMD_CARD_ENABLETRIGGER; + + if (pstBufferData->bStartData) + { + lStartCmd |= M2CMD_DATA_STARTDMA; + lWaitCmd |= M2CMD_DATA_WAITDMA; + } + + if (pstBufferData->bStartExtraDMA) + lStartCmd |= M2CMD_EXTRA_STARTDMA; + + if (pstBufferData->bStartTimestamp || pstBufferData->bStartABA) + lWaitCmd |= M2CMD_EXTRA_WAITDMA; + + spcm_dwSetParam_i32 (pstBufferData->pstCard->hDrv, SPC_TIMEOUT, pstBufferData->lTimeout); + dwError = spcm_dwSetParam_i32 (pstBufferData->pstCard->hDrv, SPC_M2CMD, lStartCmd); + + if (pstThreadData) + { + pstThreadData->dwEventFlags |= EVENTFLAG_STARTDONE; + spcm_vSignalEvent (&pstThreadData->hEventStartDone); + } + } + + + + // this is the main loop that waits for data. As we defined a timeout this routine is latest called in our timeout interval + while (!dwError) + { + dwError = spcm_dwSetParam_i32 (pstBufferData->pstCard->hDrv, SPC_M2CMD, lWaitCmd); + spcm_dwGetParam_i32 (pstBufferData->pstCard->hDrv, SPC_M2STATUS, &lStatus); + + // Recording complete (for setups with SPC_LOOPS != 0)? + if (lStatus & M2STAT_DATA_END) + { + // DATA_END can also occur if all data has been transfered from card after overrun + if (lStatus & M2STAT_DATA_OVERRUN) + dwError = ERR_FIFOHWOVERRUN; + else + if (pstBufferData->llDataAvailBytes == 0) + dwError = ERR_FIFOFINISHED; + } + + // secure the following access as it's the main data loop + if (pstThreadData) + spcm_vGetMutex (&pstThreadData->hMutexSharedAccess); + + + // read out the current position of data buffer and recalculate it to avoid rollover + if (pstBufferData->bStartData) + { + spcm_dwGetParam_i64 (pstBufferData->pstCard->hDrv, SPC_DATA_AVAIL_USER_LEN, &pstBufferData->llDataAvailBytes); + spcm_dwGetParam_i64 (pstBufferData->pstCard->hDrv, SPC_DATA_AVAIL_USER_POS, &llAvailPos); + if ((llAvailPos + pstBufferData->llDataAvailBytes) >= pstBufferData->dwDataBufLen) + pstBufferData->llDataAvailBytes = (uint64) (pstBufferData->dwDataBufLen - llAvailPos); + pstBufferData->pvDataCurrentBuf = (void*) (((char*) pvDataBuffer) + llAvailPos); + } + + + // read out the timestanp positions and recalculate it to avoid rollover + if (pstBufferData->bStartTimestamp) + { + spcm_dwGetParam_i64 (pstBufferData->pstCard->hDrv, SPC_TS_AVAIL_USER_LEN, &pstBufferData->llTSAvailBytes); + spcm_dwGetParam_i64 (pstBufferData->pstCard->hDrv, SPC_TS_AVAIL_USER_POS, &llAvailPos); + if ((llAvailPos + pstBufferData->llTSAvailBytes) >= pstBufferData->dwTSBufLen) + pstBufferData->llTSAvailBytes = pstBufferData->dwTSBufLen - llAvailPos; + pstBufferData->pvTSCurrentBuf = (void*) (((char*) pvTSBuffer) + llAvailPos); + } + + + // read out the ABA positions and recalculate it to avoid rollover + if (pstBufferData->bStartABA) + { + spcm_dwGetParam_i64 (pstBufferData->pstCard->hDrv, SPC_ABA_AVAIL_USER_LEN, &pstBufferData->llABAAvailBytes); + spcm_dwGetParam_i64 (pstBufferData->pstCard->hDrv, SPC_ABA_AVAIL_USER_POS, &llAvailPos); + if ((llAvailPos + pstBufferData->llABAAvailBytes) >= pstBufferData->dwABABufLen) + pstBufferData->llABAAvailBytes = pstBufferData->dwABABufLen - llAvailPos; + pstBufferData->pvABACurrentBuf = (void*) (((char*) pvABABuffer) + llAvailPos); + } + + // if there is some new data we call our work function + if (pstBufferData->llDataAvailBytes || pstBufferData->llTSAvailBytes || pstBufferData->llABAAvailBytes) + if (pfn_bWorkDo) + if (!(*pfn_bWorkDo) (pvWorkData, pstBufferData)) + dwError = ERR_ABORT; + + + // now we have to set the data available for the card again (the number of bytes may have been modified by the work routine) + if (pstBufferData->bStartData && pstBufferData->llDataAvailBytes) + spcm_dwSetParam_i64 (pstBufferData->pstCard->hDrv, SPC_DATA_AVAIL_CARD_LEN, pstBufferData->llDataAvailBytes); + + if (pstBufferData->bStartTimestamp && pstBufferData->llTSAvailBytes) + spcm_dwSetParam_i64 (pstBufferData->pstCard->hDrv, SPC_TS_AVAIL_CARD_LEN, pstBufferData->llTSAvailBytes); + + if (pstBufferData->bStartABA && pstBufferData->llABAAvailBytes) + spcm_dwSetParam_i64 (pstBufferData->pstCard->hDrv, SPC_ABA_AVAIL_CARD_LEN, pstBufferData->llABAAvailBytes); + + + // we continuously count the number of bytes that we have transferred so far + pstBufferData->qwDataTransferred += pstBufferData->llDataAvailBytes; + pstBufferData->qwTSTransferred += pstBufferData->llTSAvailBytes; + pstBufferData->qwABATransferred += pstBufferData->llABAAvailBytes; + + + // at last we check for abort (not in the threaded version as this is then done in the main thread) + if (pfn_bAbortCheck && !pstThreadData) + if ((*pfn_bAbortCheck) (pvWorkData, pstBufferData)) + dwError = ERR_ABORT; + + + // signal the new status to the main thread + if (pstThreadData) + { + pstBufferData->dwError = dwError; + spcm_vSignalEvent (pstThreadData->phSharedUpdate); + spcm_vReleaseMutex (&pstThreadData->hMutexSharedAccess); + } + + // we don't count timeout as an error as we've forced the loop with a small timeout (non-threaded version) + if (!pstThreadData) + if (dwError == ERR_TIMEOUT) + dwError = ERR_OK; + + // we have to suspend this thread for a short tiem to give other threads some working time + if (pstThreadData) + spcm_vSuspendThread (1); + } // while (!dwError) (Main Loop) + + + // check for the error in the loop + printf ("\n\n"); + switch (dwError) + { + case ERR_FIFOHWOVERRUN: printf ("Loop: Hardware Overrun\n"); break; + case ERR_FIFOFINISHED: printf ("Loop: FIFO Mode finished"); break; + case ERR_OK: printf ("Loop: Finished normal\n"); break; + case ERR_ABORT: printf ("Loop: Aborted...\n"); break; + default: printf ("Loop: Error %4d\n", dwError); break; + } + + + + // copy the error information to the buffer structure + if (pstThreadData) + spcm_vGetMutex (&pstThreadData->hMutexSharedAccess); + + pstBufferData->dwError = dwError; + + // at least we do one last upodate with the final error code + if (pstThreadData) + { + spcm_vReleaseMutex (&pstThreadData->hMutexSharedAccess); + spcm_vSignalEvent (pstThreadData->phSharedUpdate); + } + + + + // close the work + if (pfn_vWorkClose) + (*pfn_vWorkClose) (pvWorkData, pstBufferData); + + // clean up + if (pvDataBuffer && !bContMemUsed) + vFreeMemPageAligned (pvDataBuffer, pstBufferData->dwDataBufLen); + if (pvTSBuffer) + vFreeMemPageAligned (pvTSBuffer, pstBufferData->dwTSBufLen); + if (pvABABuffer) + vFreeMemPageAligned (pvABABuffer, pstBufferData->dwABABufLen); + + // we need to leave the thread with a released mutex, otherwise the other threads may block + if (pstThreadData) + { + pstThreadData->dwEventFlags |= EVENTFLAG_TERMDONE; + spcm_vSignalEvent (&pstThreadData->hEventTermDone); + } + } + + + + +/* +************************************************************************** +vDoMainLoop: + +the non threaded version of the main loop, just calls the shared main loop +and let the thread data section be NULL to disable all synchronization +************************************************************************** +*/ + +void vDoMainLoop ( + ST_BUFFERDATA* pstBufferData, // filled card info structure + void* pvWorkData, // working data structure that is passed to the calback functions + SPCM_WORK_INIT* pfn_bWorkSetup, // callback function for pre-run setup + SPCM_WORK_DO* pfn_bWorkDo, // callback function that is called if new data is available + SPCM_WORK_CLOSE* pfn_vWorkClose, // callback function at the end of run + SPCM_ABORTCHECK* pfn_bAbortCheck) // callback function for abort checking on each update loop + + { + vMainLoop ( + pstBufferData, + pvWorkData, + pfn_bWorkSetup, + pfn_bWorkDo, + pfn_vWorkClose, + pfn_bAbortCheck, + NULL); + } + + + +/* +************************************************************************** + +DataTransfer Thread: it uses the main loop to run the specified thread +function. + +************************************************************************** +*/ + +SPCM_THREAD_RETURN SPCM_THREAD_CALLTYPE pvDataTransferThread (void* pvArguments) + { + ST_THREADDATA* pstThreadData = (ST_THREADDATA*) pvArguments; + ST_BUFFERDATA* pstBufferData = (ST_BUFFERDATA*) pstThreadData->pstBufferData; + void* pvWorkData = pstThreadData->pvWorkData; + + vMainLoop ( + pstBufferData, + pvWorkData, + pstThreadData->pfn_bWorkInit, + pstThreadData->pfn_bWorkDo, + pstThreadData->pfn_vWorkClose, + NULL, + pstThreadData); + + return 0; + } + + + + +/* +************************************************************************** +vDoThreadMainLoop: contains the main FIFO loop in the threaded version. +This function mainly initializes the thread structures and calls +the threads to do the work +************************************************************************** +*/ + +void vDoThreadMainLoop ( + ST_BUFFERDATA* pstBufferData, // filled card info structure + void* pvWorkData, // working data structure that is passed to the calback functions + + SPCM_WORK_INIT* pfn_bWorkInit, // callback function for pre-run setup + SPCM_WORK_DO* pfn_bWorkDo, // callback function that is called if new data is available + SPCM_WORK_CLOSE* pfn_vWorkClose, // callback function at the end of run + + SPCM_ABORTCHECK* pfn_bAbortCheck, // callback function for abort checking on each update loop + bool bSeparateThread, // use separate threads for data, timestamp and ABA + + SPCM_WORK_INIT* pfn_bTSInit, // callback function for timestamo pre-run setup + SPCM_WORK_DO* pfn_bTSDo, // callback function that is called if new timestamps are available + SPCM_WORK_CLOSE* pfn_vTSClose, // callback function at the end of timestamp run + + SPCM_WORK_INIT* pfn_bABAInit, // callback function for ABA pre-run setup + SPCM_WORK_DO* pfn_bABADo, // callback function that is called if new ABA data is available + SPCM_WORK_CLOSE* pfn_vABAClose) // callback function at the end of ABA run + +// *********************************************************************** + + { + SPCM_THREAD_HANDLE hThread[3]; // handles for the maximum of three threads we support + int16 nThreadCount = 0; // number of threads we currently use + ST_THREADDATA stThreadData[3]; // shared data structure between main and data thread + ST_BUFFERDATA stBufferData[3]; // own copies of buffer data + bool bOk = true; + int i; + uint32 dwError; // error code of the thread + + // initialize all to zero for later clean up + for (i=0; i<3; i++) + { + hThread[i] = NULL_HANDLE; + memset (&stThreadData[i], 0, sizeof(ST_THREADDATA)); + } + + + // we set the private buffer data as a copy of the given one and disable the starting flags for separate transfers + for (i=0; i<3; i++) + { + memcpy ((void*) &stBufferData[i], pstBufferData, sizeof (ST_BUFFERDATA)); + + // the transfers should be started separately therefore we need to set the flags individually + if (bSeparateThread) + { + stBufferData[i].bStartABA = false; + stBufferData[i].bStartTimestamp = false; + stBufferData[i].bStartData = false; + stBufferData[i].bStartCard = false; + } + } + + + // count the threads to use and set separate start flags and separate work callback functions + if (bSeparateThread) + { + if (pstBufferData->bStartData) + { + stBufferData[nThreadCount].bStartData = true; + stBufferData[nThreadCount].bStartExtraDMA = false; + stBufferData[nThreadCount].bStartCard = pstBufferData->bStartCard; + nThreadCount++; + } + + if (pstBufferData->bStartTimestamp) + { + stBufferData[nThreadCount].bStartTimestamp = true; + stBufferData[nThreadCount].bStartExtraDMA = true; + nThreadCount++; + } + + // extra dma can only be started once. + if (pstBufferData->bStartABA) + { + stBufferData[nThreadCount].bStartABA = true; + stBufferData[nThreadCount].bStartExtraDMA = !pstBufferData->bStartTimestamp; + nThreadCount++; + } + } + else + { + stBufferData[nThreadCount].bStartExtraDMA = pstBufferData->bStartTimestamp || pstBufferData->bStartABA; + nThreadCount = 1; + } + + + + + // setup the thread data structure we thereby use a shared update as this main thread should get all update calls + // the work data structure is also shared between the different threads + for (i=0; (idwError) + { + bOk = false; + printf ("...initialisation failed with error %d\n", stThreadData[i].pstBufferData->dwError); + dwError = stThreadData[i].pstBufferData->dwError; + } + } + + + // initialisation ok, we now send the start event + if (bOk) + printf ("...initialisation done, thread is now started\n"); + + // first step: all threads but not the data (and card start) thread are started + for (i=0; (ibStartData) + { + stThreadData[i].dwEventFlags |= EVENTFLAG_START; + spcm_vSignalEvent (&stThreadData[i].hEventStart); + + if ((stThreadData[i].dwEventFlags & EVENTFLAG_STARTDONE) == 0) + spcm_bWaitEventWithMutex (&stThreadData[i].hEventStartDone, &stThreadData[i].hMutexSharedAccess); + + spcm_vReleaseMutex (&stThreadData[i].hMutexSharedAccess); + } + + // second step: the data thread is started and with this the card is started + for (i=0; (ibStartData) + { + stThreadData[i].dwEventFlags |= EVENTFLAG_START; + spcm_vSignalEvent (&stThreadData[i].hEventStart); + + if ((stThreadData[i].dwEventFlags & EVENTFLAG_STARTDONE) == 0) + spcm_bWaitEventWithMutex (&stThreadData[i].hEventStartDone, &stThreadData[i].hMutexSharedAccess); + + spcm_vReleaseMutex (&stThreadData[i].hMutexSharedAccess); + } + + + // we now simply wait for the (shared) update command + while (bOk) + { + spcm_vWaitEvent (&stThreadData[0].hEventUpdate); + + // on each update we can abort the loop + if (pfn_bAbortCheck) + if (pfn_bAbortCheck (pvWorkData, &stBufferData[0])) + { + spcm_dwSetParam_i32 (pstBufferData->pstCard->hDrv, SPC_M2CMD, M2CMD_CARD_STOP | M2CMD_DATA_STOPDMA | M2CMD_EXTRA_STOPDMA); + printf ("\n...Aborted by user\n"); + break; + } + + // we check all error codes of running threads + for (i=0; (idwError; + bOk = (dwError == ERR_OK); + spcm_vReleaseMutex (&stThreadData[i].hMutexSharedAccess); + } + } + + // print the error code + switch (dwError) + { + case ERR_TIMEOUT: printf ("\nTimeout has occured"); break; + case ERR_FIFOHWOVERRUN: printf ("\nHardware Overrun"); break; + case ERR_FIFOFINISHED: printf ("\nFIFO Mode finished"); break; + case ERR_OK: printf ("\nFinished normal"); break; + case ERR_ABORT: printf ("\nAborted by user"); break; + case ERR_MEMALLOC: printf ("\nMemory Allocation error"); break; + default: printf ("\nError %4d ", dwError); break; + } + + pstBufferData->dwError = dwError; + + // we have to stop the transfer to force the threads to return + spcm_dwSetParam_i32 (pstBufferData->pstCard->hDrv, SPC_M2CMD, M2CMD_CARD_STOP | M2CMD_DATA_STOPDMA | M2CMD_EXTRA_STOPDMA); + + // now it's time to clean up + for (i=0; i +#include +#include +#include + +#define MAX_ATTACHMENTS 16 + +static char* g_szSMTP = NULL; +static char* g_szSMTPUser = NULL; +static char* g_szSMTPPassword = NULL; +static char* g_szSubject = NULL; +static char* g_szBody = NULL; +static char* g_aszFilename[MAX_ATTACHMENTS] = {NULL}; +static unsigned g_dwNextAttachmentIdx = 0; + +static const int CHARS= 76; //Sending 54 chararcters at a time with \r , \n and \0 it becomes 57 +static const int ADD_SIZE= 15 + MAX_ATTACHMENTS*4; // 15 lines for To, From, ..., plus 4 per attachment +static const int SEND_BUF_SIZE= 54; +static char (*fileBuf)[CHARS] = NULL; +static const char cb64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +using namespace std; + +bool LARGEFILE = false; /*For Percent*/ +int status = 0; /*For Percent*/ +int percent2 = 0; /*For Percent*/ +int percent3 = 0; /*For Percent*/ +int percent4 = 0; /*For Percent*/ +int percent5 = 0; /*For Percent*/ +void LargeFilePercent(int rowcount) + { + //This is for displaying the percentage + //while encoding larger files + int percent = rowcount/100; + + if(LARGEFILE == true) + { + status++; + percent2++; + if (percent2 == 18) + { + percent3++; + percent2 = 0; + } + if (percent3 == percent) + { + percent4++; + percent3 = 0; + } + if (percent4 == 10) + { + system("cls"); + cout << "Larger Files take longer to encode, Please be patient." << endl + << endl << "Encoding, please be patient..." << endl; + cout << percent5 << "%"; + percent5 += 10; + percent4 = 0; + } + if (status == 10000) + { + if(percent5 == 0) + { + cout << " 0%"; percent5 = 10; + } + cout << "."; + status = 0; + } + } + } + +void encodeblock(unsigned char in[3], unsigned char out[4], int len) + { + out[0] = cb64[ in[0] >> 2 ]; + out[1] = cb64[ ((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4) ]; + out[2] = (unsigned char) (len > 1 ? cb64[ ((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6) ] : '='); + out[3] = (unsigned char) (len > 2 ? cb64[ in[2] & 0x3f ] : '='); + } + +void encode(FILE *infile, unsigned char *output_buf, int rowcount/*For Percent*/) + { + unsigned char in[3], out[4]; + int i, len; + *output_buf = 0; + + while(!feof(infile)) + { + len = 0; + for(i = 0; i < 3; i++) + { + in[i] = (unsigned char) getc(infile); + if(!feof(infile) ) + { + len++; + } + else + { + in[i] = 0; + } + } + if(len) + { + encodeblock(in, out, len); + strncat((char*)output_buf, (char*)out, 4); + } + LargeFilePercent(rowcount); //Display encoded file percent /*For Percent*/ + } + } + + +struct fileBuf_upload_status + { + int lines_read; + }; + +FILE* g_hFileTmp = NULL; +size_t read_file (char** aszFilenames, const char* szFrom, const char* szTo) + { + size_t len = 0; + size_t buffer_size = 0; + char key = ' '; + + unsigned dwFileIdx = 0; + struct + { + std::string sEncoded; + int lNumRows; + } astEncodedFiles[MAX_ATTACHMENTS]; + while (aszFilenames[dwFileIdx] != NULL) + { + //Open the file and make sure it exsits + FILE* hFile = fopen (aszFilenames[dwFileIdx], "rb"); + if(!hFile) + { + cout << "File not found!!!" << endl; + exit (EXIT_FAILURE); + } + + //Get filesize + fseek (hFile, 0, SEEK_END); + size_t fileSize = ftell (hFile); + fseek (hFile, 0, SEEK_SET); + + + //Check Filesize + if (fileSize > 256000/*bytes*/) + { + cout << "Larger Files take longer to encode, Please be patient." << endl; + LARGEFILE = true; /*For Percent*/ + } + cout << endl << "Encoding " << aszFilenames[dwFileIdx] << " please be patient..." << endl; + + //Calculate the number of rows in Base64 encoded string + //also calculate the size of the new char to be created + //for the base64 encode string + astEncodedFiles[dwFileIdx].lNumRows = fileSize / SEND_BUF_SIZE + 1; + int charsize = (astEncodedFiles[dwFileIdx].lNumRows * 72) + (astEncodedFiles[dwFileIdx].lNumRows * 2); + + //Base64 encode image and create encoded_buf string + unsigned char* b64encode = new unsigned char[charsize]; + *b64encode = 0; + encode (hFile, b64encode, astEncodedFiles[dwFileIdx].lNumRows/*For Percent*/); + fclose (hFile); + astEncodedFiles[dwFileIdx].sEncoded = (char*)b64encode; + delete [] b64encode; + + dwFileIdx++; + } + + if (LARGEFILE == true) + cout << endl << endl; /*For Percent*/ + + //Create structure of email to be sent + unsigned dwNumLines = ADD_SIZE; //ADD_SIZE for TO,FROM,SUBJECT,CONTENT-TYPE,CONTENT-TRANSFER-ENCODING,CONETNT-DISPOSITION and \r\n and content + for (unsigned i = 0; i < dwFileIdx; ++i) + dwNumLines += astEncodedFiles[i].lNumRows; + fileBuf = new char[dwNumLines][CHARS]; + for (unsigned i = 0; i < dwNumLines; ++i) + fileBuf[i][0] = '\0'; + +#define BOUNDARY "------------060709040305030006090208" + buffer_size += snprintf (fileBuf[len++], CHARS, "From: %s \r\n", szFrom); + buffer_size += snprintf (fileBuf[len++], CHARS, "To: %s \r\n", szTo); + buffer_size += snprintf (fileBuf[len++], CHARS, "Subject: %s\r\n", g_szSubject); + buffer_size += snprintf (fileBuf[len++], CHARS, "MIME-Version: 1.0\r\n"); + if (dwFileIdx != 0) + { + buffer_size += snprintf (fileBuf[len++], CHARS, "Content-Type: multipart/mixed;\r\n"); + buffer_size += snprintf (fileBuf[len++], CHARS, " boundary=\""BOUNDARY"\"\r\n"); + buffer_size += snprintf (fileBuf[len++], CHARS, "\r\n"); // empty line to divide header and data + buffer_size += snprintf (fileBuf[len++], CHARS, "This is a multi-part message in MIME format.\r\n"); + buffer_size += snprintf (fileBuf[len++], CHARS, "--"BOUNDARY"\r\n"); + } + buffer_size += snprintf (fileBuf[len++], CHARS, "Content-Type: text/plain; charset=utf-8\r\n"); + buffer_size += snprintf (fileBuf[len++], CHARS, "Content-Transfer-Encoding: 7bit\r\n\r\n"); + buffer_size += snprintf (fileBuf[len++], CHARS, "%s\r\n", g_szBody); + buffer_size += snprintf (fileBuf[len++], CHARS, "\r\n"); + buffer_size += snprintf (fileBuf[len++], CHARS, "\r\n"); + for (unsigned i = 0; i < dwFileIdx; ++i) + { + buffer_size += snprintf (fileBuf[len++], CHARS, "--"BOUNDARY"\r\n"); + buffer_size += snprintf (fileBuf[len++], CHARS, "Content-Type: application/x-msdownload; name=\"%s\"\r\n", strrchr (aszFilenames[i], '/') + 1); + buffer_size += snprintf (fileBuf[len++], CHARS, "Content-Transfer-Encoding: base64\r\n"); + buffer_size += snprintf (fileBuf[len++], CHARS, "Content-Disposition: attachment; filename=\"%s\"\r\n\r\n", strrchr (aszFilenames[i], '/') + 1); + + //This part attaches the Base64 encoded string and + //sets the Base64 linesize to 72 characters + \r\n + size_t dwPos = 0; + std::string sub_encoded_buf; + for (int lRow = 0; lRow <= astEncodedFiles[i].lNumRows - 1; lRow++) + { + sub_encoded_buf = astEncodedFiles[i].sEncoded.substr (dwPos * 72, 72); // Reads 72 characters at a time + sub_encoded_buf += "\r\n"; // and appends \r\n at the end + strcpy (fileBuf[len++], sub_encoded_buf.c_str()); // copy the 72 characters & \r\n to email + buffer_size += sub_encoded_buf.size(); // now increase the buffer_size + dwPos++; // finally increase pos by 1 + } + } + +// this seems to be unncessary. +// if (dwFileIdx != 0) +// buffer_size += snprintf (fileBuf[len++], CHARS, BOUNDARY "--"); + + + return buffer_size; + } + + /* + The fileBuf_source() is a function which CURL calls when it need to obtain data that will be uploaded to the server. + Imagine that fileBuf_source() is something similar to fread(). When called it performs any voodoo-mumbo-jumbo that is needed, + but in the end uploadable data must be stored in *ptr buffer, which is curl's internal buffer. For your in-memory buffer + memcpy() will do just fine as body of fileBuf_source(), so you don't need real fread() at all. + + size * nmemb tells you how big buffer curl has reserved for a single chunk of data. The last void* is a pointer which was + set by CURLOPT_READDATA option - it's a do-what-ever-you-need-with-it kind of pointer, so it can point to a structure + containing data which you're uploading and a some additional info e.g. current progress. + */ +static size_t fileBuf_source(void *ptr, size_t size, size_t nmemb, void *userp) + { + struct fileBuf_upload_status *upload_ctx = (struct fileBuf_upload_status *)userp; + const char *fdata; + + if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) + { + return 0; + } + + fdata = fileBuf[upload_ctx->lines_read]; + + if (strcmp (fdata, "")) + { + //printf ("Line %d: %s\n", upload_ctx->lines_read, fdata); + size_t len = strlen(fdata); + memcpy(ptr, fdata, len); + upload_ctx->lines_read++; + return len; + } + + return 0; + } + +// ----- defines SMTP server and login credentials ----- +void vNetboxMailSetServerAndLogin (const char* szSMTPServer, const char* szUsername, const char* szPassword) + { + if (g_szSMTP != NULL) + delete [] g_szSMTP; + g_szSMTP = new char[strlen (szSMTPServer) + 1]; + strcpy (g_szSMTP, szSMTPServer); + + if (g_szSMTPUser != NULL) + delete [] g_szSMTPUser; + g_szSMTPUser = new char[strlen (szUsername) + 1]; + strcpy (g_szSMTPUser, szUsername); + + if (g_szSMTPPassword != NULL) + delete [] g_szSMTPPassword; + g_szSMTPPassword = new char[strlen (szPassword) + 1]; + strcpy (g_szSMTPPassword, szPassword); + } + +// ----- defines the subject of the mail ----- +void vNetboxMailSetSubject (const char* szSubject) + { + if (g_szSubject != NULL) + delete [] g_szSubject; + g_szSubject = new char[strlen (szSubject) + 1]; + strcpy (g_szSubject, szSubject); + } + +// ----- defines the body (content) of the mail ----- +void vNetboxMailSetBody (const char* szBody) + { + if (g_szBody != NULL) + delete [] g_szBody; + g_szBody = new char[strlen (szBody) + 1]; + strcpy (g_szBody, szBody); + } + +// ----- adds a file that should be attached to the mail ----- +// ----- call this function multiple times for multiple attachments ----- +void vNetboxMailAddAttachment (const char* szFilename) + { + if (g_aszFilename[g_dwNextAttachmentIdx] != NULL) + delete [] g_aszFilename[g_dwNextAttachmentIdx]; + g_aszFilename[g_dwNextAttachmentIdx] = new char[strlen (szFilename) + 1]; + strcpy (g_aszFilename[g_dwNextAttachmentIdx], szFilename); + g_dwNextAttachmentIdx++; + } + +// ----- defines sender and recipient of the mail and starts mail transfer ----- +void vNetboxMailSendMail (const char* szFrom, const char* szTo) + { + CURL *curl; + CURLcode res = CURLE_OK; + struct curl_slist *recipients = NULL; + struct fileBuf_upload_status file_upload_ctx; + size_t file_size(0); + + file_upload_ctx.lines_read = 0; + + file_size = read_file (g_aszFilename, szFrom, szTo); + + curl = curl_easy_init(); + if(curl) + { + curl_easy_setopt(curl, CURLOPT_URL, g_szSMTP); // SMTP server address + curl_easy_setopt(curl, CURLOPT_USERNAME, g_szSMTPUser); // username on the SMTP server + curl_easy_setopt(curl, CURLOPT_PASSWORD, g_szSMTPPassword); // password for the SMTP server +/* + curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL); +*/ + //curl_easy_setopt(curl, CURLOPT_CAINFO, "google.pem"); + curl_easy_setopt(curl, CURLOPT_MAIL_FROM, szFrom); + recipients = curl_slist_append(recipients, szTo); + curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); + curl_easy_setopt(curl, CURLOPT_INFILESIZE, file_size); + curl_easy_setopt(curl, CURLOPT_READFUNCTION, fileBuf_source); + curl_easy_setopt(curl, CURLOPT_READDATA, &file_upload_ctx); + curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 0); //Dont display Curl Connection data Change 1L to 0 + + res = curl_easy_perform(curl); + + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); + curl_slist_free_all(recipients); + curl_easy_cleanup(curl); + + g_dwNextAttachmentIdx = 0; + memset (g_aszFilename, 0, sizeof (char*) * MAX_ATTACHMENTS); + } + delete[] fileBuf; + } + diff --git a/AWGDependencies/Spectrum/common/spcm_netbox_sendmail.h b/AWGDependencies/Spectrum/common/spcm_netbox_sendmail.h new file mode 100644 index 0000000..1962e15 --- /dev/null +++ b/AWGDependencies/Spectrum/common/spcm_netbox_sendmail.h @@ -0,0 +1,15 @@ +#ifndef SPCM_NETBOX_SENDMAIL_H +#define SPCM_NETBOX_SENDMAIL_H + +// These files use libcurl for mail transfer + +// mail content +void vNetboxMailSetServerAndLogin (const char* szSMTPServer, const char* szUsername, const char* szPassword); +void vNetboxMailSetSubject (const char* szSubject); +void vNetboxMailSetBody (const char* szBody); +void vNetboxMailAddAttachment (const char* szFile); + +void vNetboxMailSendMail (const char* szFrom, const char* szTo); + +#endif // SPCM_NETBOX_SENDMAIL_H + diff --git a/AWGDependencies/Spectrum/sb5_file/sb5_file.cpp b/AWGDependencies/Spectrum/sb5_file/sb5_file.cpp new file mode 100644 index 0000000..b279536 --- /dev/null +++ b/AWGDependencies/Spectrum/sb5_file/sb5_file.cpp @@ -0,0 +1,455 @@ +/* +************************************************************************** + +sb5_file.cpp (c) Spectrum GmbH + +************************************************************************** + +implements the header load and write functions + +Feel free to use these functions in your own programs. + +************************************************************************** +*/ + +#include "sb5_file.h" + +#include + + + +/* +**************************************************************************** +header type information +**************************************************************************** +*/ + +#define SH_TYP_MASK 0xFF000000 // mask for type information +#define SH_TYP_INT32 0x01000000 // entry is 32 bit integer +#define SH_TYP_DOUBLE 0x02000000 // entry is 64 bit double +#define SH_TYP_TEXT 0x04000000 // entry is zero terminated string +#define SH_TYP_DATA 0x80000000 // entry is the data area + +#define SH_CHX_MASK 0x00FF0000 // mask for channel index +#define SH_CHX_CH0 0x00000000 // channel 0 +#define SH_CHX_CH1 0x00010000 // channel 1 +#define SH_CHX_CH2 0x00020000 // channel 2 + // ... + + +/* +**************************************************************************** +header information +**************************************************************************** +*/ + +#define SH_ID_IDMASK 0x0000FFFF // mask for information id +#define SH_ID_DATA 0x80000000 // data area +#define SH_ID_XOFFSET 0x02000001 // offset x direction (trigger) +#define SH_ID_XRANGE 0x02000002 // scaling in x direction (1/sampling rate) +#define SH_ID_YRANGE 0x02000003 // scaling in y direction (voltage) +#define SH_ID_YOFFSET 0x02000004 // offset y direction +#define SH_ID_SOURCE 0x04000005 // data source (normally name of generating card) +#define SH_ID_SAMPLES 0x01000006 // number of samples in file +#define SH_ID_SIGNALNAME 0x04000007 // name of signal +#define SH_ID_SIGNALTYP 0x01000008 // type of signal as defined below +#define SH_ID_TIMESTAMP 0x04000009 // time stamp (just system time) +#define SH_ID_MULTISEGMENT 0x0100000C // segment size on Multiple Recording files +#define SH_ID_SOURCEFS 0x0200000D // full scale range of source signal (used on FFT display) +#define SH_ID_MUXCOUNT 0x01000015 // number of multiplexed signals in file +#define SH_ID_MUXINDEX 0x01000016 // index of multiplexed signals as sorting may be different + + + +/* +**************************************************************************** +SBench file identification +**************************************************************************** +*/ + +#define SB5DATALEN 10 +#define SB5DATA "SB5Data___" +#define SB5STREAM "SB5Stream_" + + + +/* +**************************************************************************** +Some simple read and write routines. All return true if sucessful +**************************************************************************** +*/ + +void vWriteHeader (bool* pbOk, FILE* hFile, int32 lId) + { + if (*pbOk) + (*pbOk) = (fwrite (&lId, sizeof(int32), 1, hFile) == 1); + } + +// ************************************************************************* + +void vWriteHeader (bool* pbOk, FILE* hFile, int32 lId, int32 lValue) + { + if (*pbOk) + (*pbOk) = (fwrite (&lId, sizeof(int32), 1, hFile) == 1); + if (*pbOk) + (*pbOk) = (fwrite (&lValue, sizeof (int32), 1, hFile) == 1); + } + +// ************************************************************************* + +void vWriteHeader (bool* pbOk, FILE* hFile, int32 lId, double dValue) + { + if (*pbOk) + (*pbOk) = (fwrite (&lId, sizeof(int32), 1, hFile) == 1); + if (*pbOk) + (*pbOk) = (fwrite (&dValue, sizeof (double), 1, hFile) == 1); + } + +// ************************************************************************* + +void vWriteHeader (bool* pbOk, FILE* hFile, int32 lId, const char* pszValue, const char* pszDefault) + { + int32 lLen ; + + if (pszValue) + lLen = (int32) strlen (pszValue) + 1; + else + lLen = (int32) strlen (pszDefault) + 1; + + if (*pbOk) + (*pbOk) = (fwrite (&lId, sizeof(int32), 1, hFile) == 1); + if (*pbOk) + (*pbOk) = (fwrite (&lLen, sizeof (int32), 1, hFile) == 1); + if (*pbOk && pszValue) + (*pbOk) = (fwrite (pszValue, lLen, 1, hFile) == 1); + if (*pbOk && !pszValue) + (*pbOk) = (fwrite (pszDefault, lLen, 1, hFile) == 1); + } + + + +/* +**************************************************************************** +bSB5_StoreHeader: stores the given header information to an already opened +file. The file pointer is afterwards directly at the beginning of the data +section and plain binary data can be written +**************************************************************************** +*/ + +bool bSB5_StoreHeader (FILE* hFile, ST_SB5HEAD* pstHead) + { + bool bOk = true; + + if (!hFile) + return false; + + // some simple header checks + if ((pstHead->lChannels < 0) || (pstHead->lChannels > SB5MAXMUX)) + return false; + + // go to beginning of file and write identification + bOk = !fseek (hFile, 0, SEEK_SET); + if (bOk && (pstHead->lChannels == 1)) + bOk = (fwrite (SB5DATA, SB5DATALEN, 1, hFile) == 1); + if (bOk && (pstHead->lChannels > 1)) + bOk = (fwrite (SB5STREAM, SB5DATALEN, 1, hFile) == 1); + + // multiplex channels + if (pstHead->lChannels > 1) + vWriteHeader (&bOk, hFile, SH_ID_MUXCOUNT, pstHead->lChannels); + + // we write samples as second as we may need to update this again + vWriteHeader (&bOk, hFile, SH_ID_SAMPLES, pstHead->lSumSamples); + + // write data information + vWriteHeader (&bOk, hFile, SH_ID_SIGNALTYP, pstHead->lSignalType); + vWriteHeader (&bOk, hFile, SH_ID_MULTISEGMENT, pstHead->lMRSegmentsize); + vWriteHeader (&bOk, hFile, SH_ID_XOFFSET, pstHead->dXOffset); + vWriteHeader (&bOk, hFile, SH_ID_XRANGE, pstHead->dXScale); + + // if strins aren't specified we took defaults + vWriteHeader (&bOk, hFile, SH_ID_SIGNALNAME, pstHead->pszSignalName, "SB5File"); + vWriteHeader (&bOk, hFile, SH_ID_SOURCE, pstHead->pszSource, ""); + vWriteHeader (&bOk, hFile, SH_ID_TIMESTAMP, pstHead->pszTimestamp, ""); + + // write channel related information + for (int i=0; ilChannels; i++) + { + vWriteHeader (&bOk, hFile, SH_ID_MUXINDEX | ((i << 16) & SH_CHX_MASK), pstHead->plMuxIdx[i]); + vWriteHeader (&bOk, hFile, SH_ID_YRANGE | ((i << 16) & SH_CHX_MASK), pstHead->pdYScale[i]); + vWriteHeader (&bOk, hFile, SH_ID_YOFFSET | ((i << 16) & SH_CHX_MASK), pstHead->pdYOffset[i]); + vWriteHeader (&bOk, hFile, SH_ID_SOURCEFS | ((i << 16) & SH_CHX_MASK), pstHead->pdSourceFS[i]); + } + + // at last we write the data identifier + vWriteHeader (&bOk, hFile, SH_ID_DATA); + + return bOk; + } + + + +/* +**************************************************************************** +Alloc/Free Header. Allocation of header with all arrays correctly set. +Storage for strings need to be allocated separately +**************************************************************************** +*/ + +ST_SB5HEAD* pstSB5_AllocHeader (int32 lChannels) + { + ST_SB5HEAD* pstHeader; + + if ((lChannels < 0) || (lChannels > SB5MAXMUX)) + return NULL; + + pstHeader = new ST_SB5HEAD; + memset (pstHeader, 0, sizeof (ST_SB5HEAD)); + + pstHeader->pdSourceFS = new double[lChannels]; + pstHeader->pdYOffset = new double[lChannels]; + pstHeader->pdYScale = new double[lChannels]; + pstHeader->plMuxIdx = new int32[lChannels]; + pstHeader->lChannels = lChannels; + + return pstHeader; + } + +// ************************************************************************* + +void vSB5_FreeHeader (ST_SB5HEAD* pstHeader) + { + if (!pstHeader) + return; + + delete [] (pstHeader->pdSourceFS); + delete [] (pstHeader->pdYOffset); + delete [] (pstHeader->pdYScale); + delete [] (pstHeader->plMuxIdx); + if (pstHeader->pszSignalName) + delete [] (pstHeader->pszSignalName); + if (pstHeader->pszSource) + delete [] (pstHeader->pszSource); + if (pstHeader->pszTimestamp) + delete [] (pstHeader->pszTimestamp); + + delete (pstHeader); + } + + + +/* +**************************************************************************** +bSB5_UpdateSamples: tries to update the samples settings at the end of +writing if this information wasn#t known when writing the header information +as usually on streaming files. +**************************************************************************** +*/ + +bool bSB5_UpdateSamples (FILE* hFile, int32 lSamples) + { + bool bOk = true; + int32 lPos; + int32 plEntry[2]; + + // search for samples, it's either first or second + bOk = !fseek (hFile, SB5DATALEN, SEEK_SET); + while (bOk) + { + lPos = ftell (hFile); + bOk = (fread (plEntry, sizeof(int32), 2, hFile) == 2); + if (bOk && plEntry[0] == SH_ID_SAMPLES) + { + bOk = !fseek (hFile, lPos, SEEK_SET); + vWriteHeader (&bOk, hFile, SH_ID_SAMPLES, lSamples); + return true; + } + } + + return false; + } + + + +/* +**************************************************************************** +pstSB5_LoadHeader: load the header information from an already opened file. +The file pointer is afterwards directly at the beginning of the data +section and plain binary data can be read +**************************************************************************** +*/ + +#define MAXTEXTLEN 1024 + +ST_SB5HEAD* pstSB5_LoadHeader (FILE* hFile) + { + ST_SB5HEAD* pstHeader; + bool bOk; + int32 lChannels = 0; + int32 lId, lValue, lLen, lCh; + double dValue; + char szBuffer[MAXTEXTLEN]; + int i; + + if (!hFile) + return NULL; + + // examine the identification tag + bOk = (fread (szBuffer, SB5DATALEN, 1, hFile) == 1); + if (!bOk) + return NULL; + + // check for file type + if (strncmp (szBuffer, SB5STREAM, SB5DATALEN) == 0) + { + bOk = (fread (&lId, sizeof(int32), 1, hFile) == 1); + if (!bOk || (lId != SH_ID_MUXCOUNT)) + return NULL; + bOk = (fread (&lChannels, sizeof (int32), 1, hFile) == 1); + } + else if (strncmp (szBuffer, SB5DATA, SB5DATALEN) == 0) + lChannels = 1; + else + return NULL; + + // check number of channels + if (!bOk || (lChannels < 0) || (lChannels > SB5MAXMUX)) + return NULL; + + // now we know that the file type is correct and we know which tpye it is + pstHeader = pstSB5_AllocHeader (lChannels); + + // we predefine the mux signals in case that we don't find them + for (i=0; iplMuxIdx[i] = i; + + // now we loop through the complete header and fill our details + while (bOk) + { + + // ----- read the entry ----- + bOk = (fread (&lId, sizeof(int32), 1, hFile) == 1); + if (bOk) + switch (lId & SH_TYP_MASK) + { + + // if we find the data tag, we're done + case SH_TYP_DATA: + return pstHeader; + + // int32 entry + case SH_TYP_INT32: + bOk = (fread (&lValue, sizeof(int32), 1, hFile) == 1); + break; + + // double entry + case SH_TYP_DOUBLE: + bOk = (fread (&dValue, sizeof(double), 1, hFile) == 1); + break; + + // text entry + case SH_TYP_TEXT: + bOk = (fread (&lLen, sizeof(int32), 1, hFile) == 1); + if (lLen > (MAXTEXTLEN - 1)) + bOk = false; + if (bOk) + { + bOk = (fread (szBuffer, lLen, 1, hFile) == 1); + szBuffer[lLen] = 0; + } + break; + + // unknown entry + default: + bOk = false; + break; + } // switch (lId & SH_TYP_MASK) + + // ----- fill entry in header ----- + if (bOk) + switch (lId & ~SH_CHX_MASK) + { + case SH_ID_XOFFSET: + pstHeader->dXOffset = dValue; + break; + + case SH_ID_XRANGE: + pstHeader->dXScale = dValue; + break; + + case SH_ID_SAMPLES: + pstHeader->lSumSamples = lValue; + break; + + case SH_ID_SIGNALTYP: + pstHeader->lSignalType = lValue; + break; + + case SH_ID_MULTISEGMENT: + pstHeader->lMRSegmentsize = lValue; + break; + + case SH_ID_SOURCE: + pstHeader->pszSource = new char[strlen(szBuffer) + 1]; + strcpy (pstHeader->pszSource, szBuffer); + break; + + case SH_ID_SIGNALNAME: + pstHeader->pszSignalName = new char[strlen(szBuffer) + 1]; + strcpy (pstHeader->pszSignalName, szBuffer); + break; + + case SH_ID_TIMESTAMP: + pstHeader->pszTimestamp = new char[strlen(szBuffer) + 1]; + strcpy (pstHeader->pszTimestamp, szBuffer); + break; + + case SH_ID_YRANGE: + lCh = (lId >> 16) & 0x0f; + if (lCh > (lChannels - 1)) + bOk = false; + else + pstHeader->pdYScale[lCh] = dValue; + break; + + case SH_ID_YOFFSET: + lCh = (lId >> 16) & 0x0f; + if (lCh > (lChannels - 1)) + bOk = false; + else + pstHeader->pdYOffset[lCh] = dValue; + break; + + case SH_ID_SOURCEFS: + lCh = (lId >> 16) & 0x0f; + if (lCh > (lChannels - 1)) + bOk = false; + else + pstHeader->pdSourceFS[lCh] = dValue; + break; + + case SH_ID_MUXINDEX: + lCh = (lId >> 16) & 0x0f; + if (lCh > (lChannels - 1)) + bOk = false; + else + pstHeader->plMuxIdx[lCh] = lValue; + break; + + default: + break; + + } // switch (lId) + + } // while (bOk) + + + // something failed + if (!bOk) + { + vSB5_FreeHeader (pstHeader); + pstHeader = NULL; + } + return pstHeader; + } + diff --git a/AWGDependencies/Spectrum/sb5_file/sb5_file.h b/AWGDependencies/Spectrum/sb5_file/sb5_file.h new file mode 100644 index 0000000..305f3ca --- /dev/null +++ b/AWGDependencies/Spectrum/sb5_file/sb5_file.h @@ -0,0 +1,162 @@ +/* +************************************************************************** + +sb5_file.h (c) Spectrum GmbH , 01/2006 + +************************************************************************** + +offers defintions and functions to handle files of SBench5 format. The +functions handle both *.sb5 data files for single channels and *.sbs data +files for streaming files with multiplexed data. + +If using the storage functions please be sure to use the correct file +names if you wish to open the files under SBench5. + +Feel free to use these functions in your own programs. + +************************************************************************** +*/ + +#ifndef SB5_FILE_H +#define SB5_FILE_H + +// ----- include standard driver header from library ----- +#include "../c_header/dlltyp.h" +#include "../c_header/regs.h" +#include "../c_header/spcerr.h" +#include "../c_header/spcm_drv.h" + +// ----- standard c include files ----- +#include + + + +/* +**************************************************************************** +signal types +**************************************************************************** +*/ + +#define SIGNAL_TYP_TYPMASK 0xFF000000 // mask for signal type +#define SIGNAL_TYP_ALL 0xFF000000 +#define SIGNAL_TYP_ANALOGTIME 0x01000000 // analog signal +#define SIGNAL_TYP_DIGITALTIME 0x02000000 // digital signal +#define SIGNAL_TYP_FFT 0x04000000 // fft signal +#define SIGNAL_TYP_ANADIGTIME 0x10000000 // mixed analog/digital signal, digital bits in upper bits of analog signal +#define SIGNAL_TYP_ANALOGSTREAM 0x20000000 // analog multiplexed stream +#define SIGNAL_TYP_DIGITALSTREAM 0x40000000 // digital multiplexed stream +#define SIGNAL_TYP_ANADIGSTREAM 0x80000000 // mixed analog/digital multiplexed stream + + + +/* +**************************************************************************** +sample bit width (coded in signaltype) +**************************************************************************** +*/ + +#define SIGNAL_TYP_BITMASK 0x000000FF +#define SIGNAL_TYP_2BIT 0x00000002 +#define SIGNAL_TYP_4BIT 0x00000004 +#define SIGNAL_TYP_6BIT 0x00000006 +#define SIGNAL_TYP_8BIT 0x00000008 +#define SIGNAL_TYP_10BIT 0x0000000A +#define SIGNAL_TYP_12BIT 0x0000000C +#define SIGNAL_TYP_14BIT 0x0000000E +#define SIGNAL_TYP_16BIT 0x00000010 +#define SIGNAL_TYP_FLOAT 0x00000040 + + + +/* +**************************************************************************** +sample byte width (coded in signal type) +**************************************************************************** +*/ + +#define SIGNAL_TYP_BYTEMASK 0x00000F00 +#define SIGNAL_TYP_1BYTE 0x00000100 +#define SIGNAL_TYP_2BYTE 0x00000200 +#define SIGNAL_TYP_4BYTE 0x00000400 + + + + +/* +**************************************************************************** +sb5 header information structure +If reading header be sure to have storage space for SB5MAXMUX for all +channel related information. +**************************************************************************** +*/ + +// maximum number of multiplexed channels +#define SB5MAXMUX 16 + +struct ST_SB5HEAD + { + int32 lSignalType; // signal type as defined above, be sure to include type, bit width and byte width + char* pszSignalName; // name of the signal + char* pszSource; // source (normally generating card) + char* pszTimestamp; // generating timestamp + int32 lChannels; // number of channels stored + int32 lSumSamples; // number of stored samples in total (SamplesPerChannel * Channels) + int32 lMRSegmentsize; // size of one segment in multiple reoording files + double dXOffset; // offset in x direction (trigger position) + double dXScale; // x direction scaling (1/sampling rate) + double* pdYScale; // array with y scaling information for each channel + double* pdYOffset; // array with y offset information for each channel + double* pdSourceFS; // array with full scale ranges of source signal + int32* plMuxIdx; // array with multiplex indexes of each channel + }; + + + +/* +**************************************************************************** +bSB5_StoreHeader: stores the given header information to an already opened +file. The file pointer is afterwards directly at the beginning of the data +section and plain binary data can be written +**************************************************************************** +*/ + +// allocates an empty header structure with correct arrays for channel parameters +ST_SB5HEAD* pstSB5_AllocHeader (int32 lChannels); + +// frees the header structure +void vSB5_FreeHeader (ST_SB5HEAD* pstHeader); + +// the store function +bool bSB5_StoreHeader ( // returns true if storage succeeded + FILE* hFile, // file handle of an already opened empty file + ST_SB5HEAD* pstHeader); // pointer to a filled header structure, be sure to fill all values correctly + + + +/* +**************************************************************************** +bSB5_UpdateSamples: tries to update the samples settings at the end of +writing if this information wasn#t known when writing the header information +as usually on streaming files. +**************************************************************************** +*/ + +bool bSB5_UpdateSamples ( // returns true if update succeeded + FILE* hFile, // file handle of an already opened empty file + int32 lSamples); // samples value to update + + + +/* +**************************************************************************** +bSB5_LoadHeader: load the header information from an already opened file. +The file pointer is afterwards directly at the beginning of the data +section and plain binary data can be read +**************************************************************************** +*/ + +ST_SB5HEAD* pstSB5_LoadHeader ( // returns pointer to new allocated and filled header or NULL if an error occurs + FILE* hFile); // file handle of an already opened empty file + + +#endif diff --git a/AWGDependencies/pthreadVC3d.dll b/AWGDependencies/pthreadVC3d.dll new file mode 100644 index 0000000000000000000000000000000000000000..7ef3168e95bb3a922bfee5b0a399af1b10fc5564 GIT binary patch literal 101888 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 literal 0 HcmV?d00001 diff --git a/AWGDependencies/pthreadVCE3d.dll b/AWGDependencies/pthreadVCE3d.dll new file mode 100644 index 0000000000000000000000000000000000000000..03ca22cab86b1a646a551d166566799590665630 GIT binary patch literal 106496 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 F{0Gf(awq@* literal 0 HcmV?d00001 diff --git a/AWGDependencies/pthreadVSE3d.dll b/AWGDependencies/pthreadVSE3d.dll new file mode 100644 index 0000000000000000000000000000000000000000..638dc31099e12e1684e89d1cb06ca2702ef890c0 GIT binary patch literal 103424 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 literal 0 HcmV?d00001 diff --git a/AWGDependencies/vcpkg-export-pthreads/.vcpkg-root b/AWGDependencies/vcpkg-export-pthreads/.vcpkg-root new file mode 100644 index 0000000..e69de29 diff --git a/AWGDependencies/vcpkg-export-pthreads/installed/vcpkg/info/pthreads_3.0.0-6_x64-windows.list b/AWGDependencies/vcpkg-export-pthreads/installed/vcpkg/info/pthreads_3.0.0-6_x64-windows.list new file mode 100644 index 0000000..beb4794 --- /dev/null +++ b/AWGDependencies/vcpkg-export-pthreads/installed/vcpkg/info/pthreads_3.0.0-6_x64-windows.list @@ -0,0 +1,32 @@ +x64-windows/ +x64-windows/bin/ +x64-windows/bin/pthreadVC3.dll +x64-windows/bin/pthreadVCE3.dll +x64-windows/bin/pthreadVSE3.dll +x64-windows/debug/ +x64-windows/debug/bin/ +x64-windows/debug/bin/pthreadVC3d.dll +x64-windows/debug/bin/pthreadVCE3d.dll +x64-windows/debug/bin/pthreadVSE3d.dll +x64-windows/debug/lib/ +x64-windows/debug/lib/pthreadVC3d.lib +x64-windows/debug/lib/pthreadVCE3d.lib +x64-windows/debug/lib/pthreadVSE3d.lib +x64-windows/include/ +x64-windows/include/_ptw32.h +x64-windows/include/pthread.h +x64-windows/include/sched.h +x64-windows/include/semaphore.h +x64-windows/lib/ +x64-windows/lib/pthreadVC3.lib +x64-windows/lib/pthreadVCE3.lib +x64-windows/lib/pthreadVSE3.lib +x64-windows/share/ +x64-windows/share/pthread/ +x64-windows/share/pthread/vcpkg-cmake-wrapper.cmake +x64-windows/share/pthreads/ +x64-windows/share/pthreads/copyright +x64-windows/share/pthreads/vcpkg-cmake-wrapper.cmake +x64-windows/share/pthreads/vcpkg_abi_info.txt +x64-windows/share/pthreads_windows/ +x64-windows/share/pthreads_windows/vcpkg-cmake-wrapper.cmake diff --git a/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/bin/pthreadVC3.dll b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/bin/pthreadVC3.dll new file mode 100644 index 0000000000000000000000000000000000000000..8580481a957550bcff1f15d6cf2308424733a17a GIT binary patch literal 103424 zcmeFa34B!5**`v6CJalM01gBN86?mkijlY^#>fmw;0{b6$QBnCMGy)q$_$HufRhxi z*KujlYHM4nR_&{8v09tpLIO$xZUIGOafw^Kanwew5K+AU@AsU0XGy}Q)ZhF5KjlNt zoO|wBpXWKxdCqg5=iJhZZ?mP?Y_?SV8HUYPgWLShVYmKzo${2uAD-_YHas;GzupnUQ~Qed!|l`XTX8_QpCsO&nwlYgho$xu zzo&_O;p}0ld>_s}!~AU!`NP?#i{}gH&z{G&4mGl}5}WOcpE+!b);iP5(_%Zt-8H#; zKU*dSyhf(>&A>1Jkb+bhPqx|87{@>B*JeW^fs231wpqw33t2zypJhtZj3nD1dfRO4 zA5XF^W8tPGTS_PV-j-zB(47h9zm_E1`G}sCpJdCk(mMEE#P_13=F3e>Gt z9+>?MKa@AJ@6i5we`gB747nQhR>Jz#xWnpBJwTiAYV?-?73IkY!msa0Rh`x z-$B0X7GF0TuLO(%YnuZPH+7V6&cbVu@hQG)LBRTc-Y(xLr2e1y_X7Vlr`6hQ&9@In z&}{{Rb*CWM`aFW6|3EPBNd$d%Be>yd1cUb?xL-kV#z+J=or^$y1wl>-!8f}Q4EYs; zM<*aieHX!)%?OfTK#=Z5ptI6nEJSd1E`mQ6BKSAxr+M`)2u^e(_#11kX+ki}k6?;I2DiB=p8iL<-LGbZP1XIEYT24kVjQx9{ z2*JcP2%wzKXziCW2?5LNJpU&iq7|*wTe}drEs}Q`*!Cbrv!5o&@$Vv;`2-5CG zaOR&7EG$Q`&VyhxTPtDjTRHLxdk{SH7J}*v5qv+@ZsAC zK6n#B?&}C{WGAlzJ83SzAHgJI`uZIRsvkh$Aan=hA-I_Rdyf6fC_wOhK7t2cMo`Pa zoW^{89!4;hmG<9=z%c;9`?C<-G7-ULY9 zB(4$6XMYL7G7hE}AAig7UP}Zt@BsvIKpKKhdOWwf_{Aa3pTWybGndyZX`%T zoa~>m=DrL9oODi(vdbU@U!91+R*Yc5g9w(aLvSYN;6nCb8cW>B*8VgJfx;J$F>QP$ zg62gCHcUq_h=lYjcJhvy2r_yhc(@F~RKjmyIf8D)%rCD;aO2Gg!ff|(qGvHnd`C#$ zLC~G`X9T&dY9|}|Z~}tH?Fc52q^7Pw@JGIVDj&fwry=MG2np`^-{8Lx_%8(h3xWSa zpaTdfp--|acL#=rK28esXV5)#ASu{c2|b(L{QIvBqbkW}v+-%0Nczcs!_ZZvizgeN zI;b-~3H2*=#aV9dmlSn!R<`QT%0a?esMh8W`?K7+yNko4QmWVYy2@j?3hzj=McAIQ zExwjm+%rj8`-#nt$~1fVoFto)`>di?WVNI+DFOAgV4SYH@Zv}dPyrzqMd80a#;Hng z>Z%(2RTXO=;b)U?ol`BzR4R7_<|yHkhm>_*M{Z4v;(YYlOeL%U{$C$l+F8-+4cEX8 z7@}5(ceN!|N@Y#(tdiUvCAl@ZyK{FKu0i5$qbxhUD%gFqfq#I7;j)QWi2VH*Nj9HW zQm$z4_|%eFidOm%Yn#4FsoWc!&F0x~zUXB^y|d!)qzSXdnszNdirN&-YOyB1#aqNH zv{)h{@5ojn#R-+26W{$SM8;Ox{Z+BbUN&4_@d}Yv?B8+?nPqWC6gnpe=%gUm+_`g| z10dkA+kmuyxCw0&)JFs7YBXbYv^|`k6mP9jC&2kG@d~4!fQV0XlF}h-FoiqL$W!Ak|fk_-i20dpIlJ70?EOXePW4ft5!@K1m1dv2s#E|6+hdw_0!K zz!3S1h#Uo0UJ@BQ#LC0s6|izSA{}5w((F}y3F-{vw|U-oB*>x+NqZ|Cn$xc>br`OC zywsezyA`d)aBahbQn}Aru?JH(v??>zdF%6tkydk!c*tDdo?ib7$Q+VflUZ@cwVaB?^0*k)O8AtD%%$}f&KoS8*IP5OUg1o9 zEDq;Q?PlUnL@gFgHpS1xRPhQpfAUt2Q4XykHWNi<2{Z8@BBM35SY;T|-^D9Lu14fY zL%R-nyvDPN_LA3lO{v>X7&OoMmLxFFO)}tIOjT4bA~lRCNbRcRUsN9Kgj6soKFkU- z%Pf@1Mj62;nSh8agH%kd{EIS0zDz;hw+T!i1-(3eIC|NA%OUCIFX9z|I#)!Ff?g^` zMhmF1S;_e$ULn#K5eZZQD-u8)m+L9GTz}+=bTXldIgv;>b1@~_5YE335a5zov?rX; z!trB_;Tl7GUc5r&MiDUyr}>69^*JjSA|;-a|4QVyhT7D8rYP}4*;;WzPh$W?2M1a` zZM-=~;+tY5Uc>p4K;rvFMyrdl%7BDd#VbTKL=MT;?!-&2B(tRQ183zat%l*(R%Xre zYk{nJe(j2^MT+)R)-nJcBjVrsscV7`b~DEl;U5 z0w?AF4rFW#f@zNNC~9$5HkoRd@Z#i%T|sr(#oCKPx`vFYy=1s{sY$lV8fV3CP*bQi zDbS}d8O5LMjmPSn5IBq9XkLq7Me}E68?Nh-oy{y%!ejDSUpYG>8bWYsRv80DS?Az7 zaJCXI#=E+$TqR;M@Wi$xQ?yGt z6(7%9!%l^soi%e?-I#1h{I`{1io92?!TF7wk^C>Uq7l4sf+b(t%>_yK3UhS^PCIg+=#mEH$;jH)W4g zi3m5>o-s$P5}w!*a?9_mJu(rfC$fw zJ<+d#8A(af`P0lQkG%N$#hmT2rxlRgPafplF|i&YTrpF~<}w31Dzm7@z<} zy(bGASNyKbTIR>pS)_zo4QFK<--Yd~%9Ct<^(r0Pi3UY2X+XTGG#tb}?<$}peFk2W zd{4u|+hCHdzk{vY+@BFWrA_*Rj|ju=zJiw|VqVf${Zk;OJF4+&2dgAzTCub@__Vi( znCXqg%MiBEg1U!_t^g}}i0Jx>s4$u_(pjXXAq^-&<~aF5%A0RhCfU?gIs5DWg?Sdp zl89NRXc7oq!4_d#Oz3%MdZ&9YoiQEL=mI4?Aya<_wPGQ48lA-B&(UwNi(Y6^0gM&H zbvtNKD^VhkDB9WfX&i7#4q&zkV0@cUSFvjimu$o@_rmzaezA5 z?pmYas$%SUKX(Iz5k+-ROl5Ubs{CpY63(|#HL-Y&zs>PH~Mq#Zar#T5A5b$n0;^Q^vk7qq(mToUuhr3w&LXh$)BvGv| zsKZ&&oAJ;$2B@lrQ%=D&b9-lOQ^Jt7LDe4pCjwu=g%Fp?9TsNgfo=zJ8sM=hn~0 zdkx8)>v;<3$rIlltteIN1*+*>R|G|l%{Ht7tpvJgAJ?VuG15(RB0S2__NXcByE@6C zzxO_>Yypl>K}v?UN3A6vhoafqptsO&xS3p`Sv#{wIBCUW^eVWNm}RmTi4uqmu*=6g4!!i zx7mK`_o`mUkyZ>qUC08|Ihr(?R3SivNbrV6){H5(%`6 zd4}tTwG@2483T>%#fX5cqHgfrEoxUxL;&!TZB<=? zC>cEr^tg)jk_%Iy>)O1}jGAYIDd?nVDY2`f7E@G`D{qgeF02bWt{8*&txmEf7K)Bf zl&Iwb7%arLjq6@cREhXD%E6*W)>;tNBVar9lz4;4Vi7^1!w*TeM;#aBgo`1Rj>`0F zTNTV|b(F)uE~ymYJkz(X%wcIqe9lJ|NHt~9cpk7co@a=*o);}O=QLq53y2;DjL}z| zkC2B0Ss7wNLfq2cP_)k4cU)3eK;|@pn5EmKpi|Hoz#4~1_QE@0HD(qrrbwzrlG#TI zmI-ae9Q6hQ?Nai*0C*m{I5QFU(N4uhBxC>;z=P0nuqQo~{f#HpgqkwimyZp_uO+iE zR3MOQs67Fn!30sXt$sDB1z^kxj8sC`!!!yY$O*bYqB!5B63)SnhE_XlfzQPf{`T8s zk7H1jomWRAG6ww_jhc^sAm*5ae7hjir>>BzlqdI7h_L{b{nQB%a@7SbF+q2Mjy@x) z$qz{iLaqZj+6uW4Uao5^$8=pQ61xE-jl=S{S<8iq~INaG{ZH{BKT1v za!^q(hybpw-vuG^xPIeDK?ovmz6FA5j10kxgW|=_=8J9eg^;)3GUaU$ppdr@k_J~o z-UgVhKIAZW`C5Lo%jta%_x52S%O z`uk5uWAl$3CX?%%dx}^dGvVkS5T*@_S+eA7Qd{h>9-*2%(yPYuU_YN4h?QpwCNiosm^T1D4+{g0VO_g7!}a5 zZ$j^*0{U_^8qH`5=yQ-J(RXEA^qr5+ik2Yr58qsaUP8__T+fkEH8ccy4fYct+7dB- z(G}H$4&nq#vp+B{3EQ3>icuq|-F_#Yz1r&}_Y}YS7#2iZvHIA};^#?dh5_xxdHBo0 z%SGbxv1Rh-A^EcrKZdJrIa*hXJe(#cIy0cU4VTt9hnCdny+Mf1jFL^x9%+#jXODB7 z*+8g2d{5RIf>*l)klpUn7H9jk6*;Ba>^z_LK1GWEeJZdRe^s=?F+e-_i$*XVOe4k& z1xGbp>j5Lp$(>4f00yUxTC3q&fkeqjq4PKeQf+rd>jZ!W(!f+4MuVbF1FKH|#Fu2# z%ikm+lE-2Lc693no6Zp8KiNH(U#Gd3X!u{ROJ&s+FW3!fC>yE19F{Q0%~c~$=Gkv}Yt zQt!wg){CcF{M6a6L5R+QdR0=dm^;DlnBJG;gU#KH}(LilFqu z3z+9V=9#+LjY<@?|1czl$G&U0&P%NBBxYU4tiue~K3KNKSC=NM+mEs9lbHu68~vN{ zq}g9VNSM1N(R3uE9#0+(d?}&A>1fpEtT+!LuwTwDa0w;xmlJCqU=19#n;v-$6si`U zBRZLWE`LP&D>8iu6T*%DZ663Ic5KQ+|9M!#rbE~V1uX3uV;<^lv-aw;|*hd z!y1*Unx|Wgk)xb8rJ!+T*D4$mn{vKVwfC$iUcd3}lZur65vBG3j=;7mwfaaUr9p6< z%H7W51|)%lUa}30TKs-b6kzKG!P=RTOm(S}?d;)!HfarbI%dd3o=^t6Ap-f9%-^;x z`p%mfjVjRY%C{Z#0rhW2K_EfNuEGe77U!cA9a?<=`q`@0coF(K*;%r6TU90E9SCYD z&!T?KlcA_(z$#SZ&0DvoS__Csjc3bAblnJ;)8fD#lwFS7_UIyUu3j*L$5_&3LLH>(D z&02h@&yQ{S+O1S$SW&x`>P(~_Vx@Ah4-#rzuCUkp;Q))mOVV3xU$1ES*xCz#VNb6v z0KgUiU}HdaMU8Sp5ADhh>%>X`4*S%0YyG6FEWk~B3GC3RXm4rf3i2|^B@s&PHpT-{ z3T4{RR#&6~O6Ji=f->p7g+Rx? z3Qb)xy3i5Da($0K&owp69z{E|BzK=zYt#;Swa-e!HyEJ<$xG9`;nAN*`U*XR;mSk{ zX7s}a+yK@UG&*l~WBCag$xAy`Il4`i z2eogIAWlo2qrXXSqeFYy5>%dts?eiC+Ytp}Gv$ub@-O16IC z3qPK2nu^+pW8R6q z@G_5cD7G~EnWRnZ>aj0?D(1R*>?Jc`YmFpWAk7p>tReJl-eH8SI83+UuT)Y?n}9F# zQN4O5mUKnE)*%_KX&nHQ050)d-m$CN$&76nEkvjJZPi~NUx|D|bo#8GsCGSiE)rn< z9Y7?^3j4*535oW=D}fQ1otW>7;71y~Q95D5jQh0{b9-EJD*AlkDs zThnkJQV&4@BiU8CkilXg%8-xCf))pRMx*eT@&E)5oUGZGLy=%z`bBstB!l)q zZ@0Py=SrY^^yPKbkQG6m@>bOdPWHUB2dV0xaF26lAg0t6kvH3%J)l@KiZbhpviS&g zp7R`H3Z^#DbeFq@^5EZR6GYs6sr_3-+>|QvqR7bMc2-CgIZ^8kMgJT|g;A*@Pa;Fn z_aapyqn)Y1U+1tT!3ts52Ffn`;Zj8#B*Z<^R>?7S8ca8Yp`2EcwTUo*N+FMa1=)B2 z@QW!Fwu+5xbp}$tykEiLCsY>%BVw4++#kU^za2a+Q)ms00ZD5(e# zFoKf?S*u48bwzs1=eGIKDon8YV7$nl4Fd;4b>N$qJNq9nGQaH#|3`1Pf3B3 zwdX>5QlJ|qMzG5>0xBumQk=#Zt|7=Lis%!G!|;SfFc-M?zVG26XzD+3Xo%Tfh$S`H zNo?CA4n^CkfA%a^#|FXs?}KwZ7LlI97%teWik5JgEO8o%sPVz!JWYxa>CVKblwFm6l)>?f)3K~jMs%^JtJV9#oLy3}7tIV(AA-O-Lrc_PpV962kqiKr( z@&;vH_N-s@;F?D z!b|gHsyGopY-#v!9j3hdD9X3B7dc#g{f?qOmOt4XPj7QPumRi+(6Y$K_8v@+h;B8lwtoO>BFai zti9Psz%a|5WRAC&Io_@ia+jv5Wtkn6JzRcw2l-?0(RLcHTL=#ghZ19Rz_zdx5GDhe zGsV>CaG=Zr4kgCtHpeG;Sg&F&*&FsaL#-z-?NqFK`*qMbK*jRy@VWmVC)EsIOT@RE zI-sOX%J^yW4IpEpgw=~8iSX};esClvHb_nro;bWJ%jmd!l&5Jy<)N7k?QG%34+!-D zMLR3*WjwSMTIdB1nuXBdnf4%5x-HOiYp6k@%-SW89xj2}eSrhS;<*HeiRQ7?EJZ8O z#-!$Vy3R*4Pkqvp!oclxxnWa>>GPkW#D>k;9n%F0! zFCjIEvU&~*R#B3SJa2I^G@J;Uqk0nOHQYC5N+V6L)&lz++5iG^D@(xWmTvYC4m=!=15m#Hm&hhTb3@^Dt1$ats*_+1Pw;ED`l z*4#zKD^;NqqFxp7I89o!$0=14v_g3o0WxC8dOnsZMLQ{!Vgwgcl6EWMNp4|MR*bm1 zA`gFO-6k+#I!`tw}tR2`u-iAIwrBgx`zx{sfrC~YV2L>~JV0C^5W+Z-o;?-cn zziL2f_!=6Ztwtu8v($0iH0AGOdRjoY*zP3i*Hc+x=}+{Hed5PJSj06pIC(@sW(`*D;6+n`lWfNnp2JK@hd6(NxJ$NU}I z>715K5kTssuXw^Rit~l3QE(|DG(8GltrY<}_EmFXVP2We?rV!3V*mC4%JBdeTe)$F zianLHavKH!K3G>IoOcxMwYm`N!G8=qeJd1-hHE7l5<9KWK#QV+%TYn|dgKwUrLMy2 zInIMRNV4$rn=Ew9P9P}KMfS(*EG4oqe4$dA4pt?RwckS4ehXPn{ocRDkYxyDIrUqR zb_it6L34CPs$qZXXdp!@g@F_-qE>iJt0+2Lz~2I+Fozl&r@jt#OFyNp7~t{d9zTA4 z;xN2<2oAMm+gM+wOqyyL2*PNOK1*vrwfLLffWLZZOCRAY@R$*xT=zWHQOY_MX zyH6dUUw{{=G*&7pS}H>y*!JZIAV_U`j;L}iUKR@vi*DlCA)l4}!qJ0Bwqvq`ouL-a z#{< z(Sz5_#7S1=-ePCTmtJjO^F%yZi*po1KmJVkel25j0*Wa#N1w@t)X{GCTAHJe z7eXCQN}nQpxGp}1h)?^ zIrrcI+E>#ti-Ii`$ZkI7D0R@5LU=%&_IhiOjq|Uqym5VXxXn`gSl=$ zk)_o!*qGRzq9UQ5TgF%W!K=`BDalvXz`*cRq$ti}nqB_`QJ&@p&{M;D`g;69%WqJ_IURrKgNyKS4abJXf$1du{Xq3J|J06hq%e`{buCbn`B5mhqv=)z^xAw^+>4k#1cU;`oKS4I4A%)D;qRdy6#9*0 z*?+|J+w^DuIy@;gJTA#_{e~1t%IZ{2-UXL*=>}n{xUJE&|0TVDkNwBOEGWeToJ%;q z5**ny)PVd#=Y}#xy~t6jy~_y)19)B0KHfrqFzrkIPndoY0ZB7QRvQR@6%&L{<6l<&c5gO@+>p?SCE7D=J(7l$6754J9J&jS5Lm@7i051Wu)WJ89NSAcxN}q7_G+*C)dl6;jz7Zg zszo^KAa7=e>N)VfC0gBF=W3XbQ1by;>FfVUUN+95Xun|Z4ObTc$wv;T!suMV0U;%5 zK+o$eIf%hVE;i%f2h@wu6CnpM3*b}^3MJO5XqR|oBl-+fkKE|{9n z!HGTyg2Dj(6u^Ke`FspcLS1~QA>?L(6XK|MZ7of5t3t58-QP^`xwQkeMo+DdCsM86 z`87Hap3`??IRRw z*CANabr?w=k%S245?lNw5qRBRcuy1vTSo((V*Y&lAcSRTd5C>p65-WHJ_MmpkZP=> zVw)MrG<9Ur{&OMS!>X85D6j#R_B*pr(T3caWrJjojG5z;L*O^2bc`uM#0_#104tijya9^Yrw_|KlLTrzoGjGAx|kZCzuXW`B8Hi<;QPnMh^ET{k{h{ zf3WkCdfqWGHy-0~R&E5cLR-j5a5O9K;%NRk@rN5g&|*~9N4&+Wy@?-)`wlW2DimPU zVp$8elQag)hFkPg(J(e7;*dAg+G$lkJgB#_#ZYTnFtZp6S4#Zl$QC&D`oXv1Coz6bc^PUY|3=C;jgC~`4QnW=dGAh}mzX&R#VZUTL-I+aV zab&|2xz8dEcITIXtuJn`H8?(0b^L1Ko+Cdgm;nEa`Oa1 zOMmJFFeL+kHuoY9u@As(6qr}knTlSGw}>L^YMu36#x*x!@6uw1V2 zwzB-ujv$V&v5JAlCt!gJ6q)N8>m6pe&MqQdh^4TQ;$y$0-e_*Q*PtlpY< z=~L4p-L`bcoQl}DNJ6G0AGL!e8;+S4x09SdxtASmYc%^BQYAgNGmQL`m;D3(qe}b7 zw20K~PxOpGy*~oKgT7a&d;f+)xE~Z8uL&Hl33rUN;;*Fyl9#$l_lK_}W^Y3#PCD?x zVr{>`gk(P!hA(e};RijaHC)=FKk|FR57Smki$dF571j2pd7m+POOvAQ7raHcc#AmT zqQbYy;w`QE3{jhzQSg>leJs)>F6Oq~#SBC*$X6U*ZF}=HP>K%*(_~gK#Kq_u1)Ilp zl8A#^qihxY++wSjWkxRw0H3KhTrZ6j18dM<*~o$2NlCBR`9yL_MNJ^fi@PY4yOfk| zyyyVFIg5KL#@6EXDT=Yp%oA(|Fls#O3#^L;!Aj*tqBR)3&~KBKIx8OJB4FM^#}lu_ zt4rsx7txy;8>80_V8>q~ULo@B1q;F3a90qFW4YNCrpfm zK{hwJQeKpW2|Gr?!s6{1hl)C_%yRRu=)I772&8^|KF>)4sajp+M9xNgcy#XwPMOox z;o5p`WpZo0s*^}B1Jd1)?cuGw7_00G%UjudX~%2UAwd7VlH>Q&LEQ2MAsi-T!Vnqj z0EQsFdw;{2^zQ9~sOhvzO&)R|u3_rVwKxM2@$89RtAb~34R>;8Er+9@S&DWhsKPtxvSVu`bxNA!g56;=v*@qwt$%uwN^rQjRczA^wsAg7MUNnlP>mZvlee^vb z8!$Sk6-Gm_#2VTw^h^c%mK3`nD{lGoL}^Ef(vFAxN6?Ok{8rpxR<3{gYto}hJBp;8 za{YCr9)foMd>(1XS-DmSv0UQ!ll=0tK}BPdBiA@Hc(T^rJW#{l#XMsp$>VGdB+qkZ z(0m@u2eY_ppHC+TAr$JqO;p$i2SRNafIv7}@u{77PA6mu&bS=?59nH?v)Hdhl6h`~ zmH7W5ksgM?V(YVMbod3dGQxLSI8ECHu?p7To4Z7H0Hq4d`shU?hO0W?a-JS6EGu__ zAmrsab)5h@5PMUCD?%VxC-lV72@^y!`d5NhpS@iFx+4g zcdVoHNc*Mr`nbDEp)u5wcim(CR%`RJ@QNJNxK`a3^d};UjmYNNbrl%KZGQ5 z*(6CK548gzRn|B`^%5Xe7C@>9kUV5=(7PgYG@}qH8}$8mTKuiuxL!J&V~3V&Itb9b z#P)HaSmTv|YcLA263zQxcwxt3c+t_kBEJILFt19b>y7q?_8m55y&xWt(_q^c^*+U7 zcWD|Rh3o(`nLCe8_?W|hXC~*1_cS(>XDO6;V4ucpa!O)aL93A6mwOXdRp3KAl-h^JZl%Rd(<4eVZTQWN;I=YVH#598gfnB z&DG^>oH_(;dm`kHnRbpxftbGvWo+|iO>By^FT^&7lLaran%F^z^vw|! zxLLu;;bpkgY@9`zOISBGX;+EJTR^^??~ufJEDVoU?d|<7DC?~ysoD{;8skvRvr~BhZyG51}N$yVr8O}@vLH4jPZif z_4@(f-~@4P=(=J2Cd>KAEj)GBrSP(>)A1s;LEU^<*VxYg}b zT<}%Uf!jQr??c5~xCdyy8?k8PfzzD4pASf~`ZrPZ4;Sm>NIse^__i|x9Z(mfI(v-E zXr9Vm!s_BK)aTXkk%h(CFi9QlfYG6|Vhs{GUCVSIrlWWNYt|?@1~xmz*Zxd2$Ev%*HDL&&Y)Wn2~WNBq3b@B2i%Q z%9_e}IHnO8k=|x1K@g4dvYN2StI3hmDuUF+JD`QOSI)M$iFrKO?*G|3Jd+@7NQ0|I zf`Q4ULYiIe4LT(cTO`b>W(J&JYal_W#+pAzEca9AfHnBVTxk#g zIfVa30{+^I>r%9XSiQ}YU(koQgxSu@cG*||*#U~`8eFkAV zLtg+5lJw>VVRyBT*OWSM)kzpnBap;(C4fu;_Rz%Tth|@GV+2-7lbq0Z`1WOi z`p=CVB#c@^xZqZ*aTtph6%nd_T&5YU>6h+H74F%hM4Q~wpZA#TU1j~kKhE-dcO1q+ z?^yd|`t!*vA>hyVmEoFr3X}zq6WjRnDbk^@&f@^GK{-eE?IwWO9~_4XGhz5;0c$MXAzAbZ&QkEuWKuQXh*olO0S_%s9*bCdbyk=X-C!-Dby z{rs3^uwcdaUVW7{*7qP3eh)&c#k$j$Xw0$lN1V4Va8p5o)$3zk|HLDxK4kOsq3(_d z{A)9Cqsn%%7LajMIptHwHNfGv!MYg=zc>YQ5`Jgl#I@nb=8`-5V^CPe6#c~;3?qLj zg!i??Y}np&HLdzh9}n&9oPQDDRB1!6oyS-Z4B-g@&I)P? z)~?8U?@y07ot50=K?|pEz|e?B=<6`paSlC%1mTDUFD|@qUI`H%wmunnpTDBt>gigM zJHIG%^%Q1SS7hn+$bkIFi)q@RSL2cOH3{I2!^(1jUJ4X4yVk0oiPy-A0{Rdc)pXzo zB;Cx7zv#gd^F^z^5HVzZnu17V1&HDLPmu?@(gcn4N@}F3EMAv>G2esg#HZYFsnwCJ zbT2$fl3k8Im5qijfZrBBvS1go50UTIZ^s*`p*uro1vBr@w1Y6>h+Wc$^)h-#7?hS= z9e(7m9K=XR$e&ZD$bB z3(f#95|OW{UsV*k7X|zH!%H3XYuXn)+Z&#NfxN6omXnHbTzaa=evtYiMJSG8ovMyZ z9Ba%CD)s35dQsm)_Vo$U49_e7BqH#FI)^?^SAdDo6DoJNJ{;W>Cp76~FBjmcc{JYE zjS+KCd#l-xrx@CPv{<}-kF(-_V3ig)n5`9J?(qitZu-DwhVjRLp@YHsxb?u~7s2bv z3+7$VxgDH{`{CBE$V8Ua=J6vYWDxGB;2tH&!hK9I6MTXxLyI!;ITrn1)XH?;9|ER> zC!#BdGBam0=o0!Wa%&!EMw6NsAfv@wk6>JM6j0>+ke}k=XKTz$Lge?wB^aoYrZX?V zaN<%6441^f;H*>y&|c>t)~pcFIKK@vf)Gnz7qFO#3}Vb#g}jg}m|_4VD0nBTj*gzE zYZ(2^Z83P^Dn4Yl=~pA4fF)Ga7G$jK%@ai>c#MMQhc7+UFUq4#8qSE71h=3@iDV|@ z5<1@oE$Eae+Q_x5%|)e9SzQN;3Vs1{gx$!1KtTQ zP|r-LEVT*!AaPVai{We2-1rhu*?`LdIffkf7;$$l@dNhrz&kNBrSN z)EeUt0X#)#$l>_IIApY7_QUx@;`sj!QnUCYH@qh4Ct;A1KaP)Q4BJKS=k<@S6EGMd zIU^XL5LfgDB#ZG4AP3kW03|k;ZJA(bML%264`xtVb3+#}Pm>wIkRJ)-1Yeno(!78Y z0#~4quHdOXtn@QQCeY|T;-!#h+Hl)g({)8y8973-;o}F-w$y3DmwSq}0$hEe7Yi(> zbQ&`^wN{+VwW59|5Mft`nVE-07vniuf7cq?86jL+8tez4aMhgw-FhV5s8@^n>A3*6 zqJ2pyy`&EzN(?8iR!Ll4e(*>=CbyKV5?1{OwIk2oH7T3zPW+=8=_ozAfTUuC`vuX zQgZLKP;$zitP^0J$MbER{*ynFRq8F!*u{9{hZc|QB4#$aL`FH3jB<=*lo+&8Bl)B$ zsbYi{DI(gImi`mZht2Xy0mt)bV$oY_Pf6--Vr2~D3RCgRn&%vF~G3hHH4`oiF z0h8D=EK;<>9q)+qkD)*Zb$}oq$omT+T*E$iDDKsO3P9eQdKY6L4lJW~M1`Z6Gh=B+ zGf%U*aVpa{ToZL1-iI~RSwU4n=#~x0kW}|GVM~n!*sGwt`m?)`Y`DHor*Mr*ZLE|Z zkopKI@WITXZqFYc4=a>R;-y)+5m`5qF3Z(<@EU?%`;v#ogGvXf0HnognEnC1a z1OSDbaG8ECo`vQb^`%Ar{GTBFqpTD9AzY6$SrAJ(BrDk1!@$b^+*|O0R#()+n{5*; z@i!q}1L+z+Ri)C|={}KTaU*=(aJ3URpEShZ6mw^Tvs0oma&=b#U+7+*h6#$I4WkXR zI60wx4GnJKMGjAnA}ETQ`IH}o$t#GL-q_BHmk}{skE4>@-PN{K`m5I%u5LK6F!!~Y zu#3Z6;VV^5w8AsjS^RnAGJbK@4W6rjY`7~jTxlo;G8jcvihU9{o}YK2A@c>wpl<@F zz%UjR1Ha-=*l9^IPYa5f_Dok)5h;6yRy`4)ctYLq|3PtXA-@0t@OLYomGI43Yml!P zBjvB*dX{gcIx5ob8R>9mdUyG=;2>h&x}8G?3_XMiAWK1oy|eJb%QkP0LJ`{NiW3!& zK6e3)bgdes>6}L|L#i}CZs(Wu6Lxt!=(n6UQjpb;l4yR!Y(oFR^;4)Y%dmyPSE_{$ z=ees$MAD)ix+Z*sBFVW9(m&Qfu{SBogV`OH!yIOZHi;Y$f#7|4ux*#iCchL47As5~ zb7EHR?Ji#b7OF#5ve{`sm`sF`-8`=-j(bB{3+`NNA`E|v=ffOpjy@j^N+0z5G3p-!?T5zq9?jQYpG zcjb=d=2fz4dcW6ck(bDXNDo4OhSnLEGA4fSHT21%=!J~EP}t8q*l;NUZWM&S*cbR| z5FdeE1y8ao;d5yJ>@}E^z(W_u_jDZ_M(2EAyz5wk9lgU&xWM}%eJ-(cDEC~;+mN3B zrXwk5chvKr-nn#F6|NMGdd-|Dm!4i9>5P|+`Xfj?1dk4-f~MferPVbzS1UZyt*~sChJDSCTqN{dIPkm(Trlet@=|)JH&W@ z0RwdKurQ8(q(|ES?vK14)}Jv-oJ(GX5W~v=q)#Kns3!b1YF{91FlqBbq> zr|A$I=h~P+pYvdI#Ccn$FPu$G;benr*zSxCmRT-A z<$5ww4}rNik_4sFA@+>Wcgaf!W0CAswH8Dh8Gvv3+DbI(f{1g>p;(sn?=IuD8DdTP zf9HTG^v9GhGI7W;^l5r~!ea;H3b(6iPSglf-<;!Qvk*4UbN4eu@(V zgB)VGUbI1y65q?51SoJ5g(J!uB=UWlGh=i{q$ib^o$*1fc6yh6w`ZSFm3=d^b^yT&;_ z0!WaK{vBO!=^#C^E;t-o{Gwf5?;7kH*yKNFkqSqb)7DJN^))<^TIL8W6gR{}C-Qmh z&97B zIqTE^VpaA4BAU~uy#{=sqm?z)l;6b#UKW!v{j%SOkIetN4@jHqpLISgv{Q5^`5YJT zQR&9*5ijMT$u8|q6&S+=MukSEaQ%ULe!~o@vvF2FDstk=%;AP>JIQsMI0Uq8Yt9I~ zC$!i|7Pt%Bo3Z1f#GG(23mp;Dcrd$z?*aIuJ(#UNi2Op#cp9A&2eUo+45SU$4fbXe7aer~u1b8g9FTX=?di!8zyif`x&-(h*%W#p1)Xj!AZ z79J17n%3`F6!viD_3yan6uQSc5BADUj}AH*Y70T;dwNOpEf}b!Y&`mNgoOTJ;KJ|+hwP$1IkG=6OzS12 zWUDh>_}!pE40`e7L2&9DYj)z1i_r;zQlW5DNuxx)%9g+o}V zH8pq*e86~{8m=M4?it%(27)1g4RCM0PAn0E1sufazN$c>jdAt^`y z7D?Q!^3-@7=F{zF=A1ftL3eD6s_#NpxlieK=?~kd(0@#-N^#%qK4`x7?vz~wSAy1v zN`gGE_8osAPs1mdp88;Zk24!^li-UBM{=x=2{PKVt+Kitz5XIXxBoa%5MKD;7MQKL zZZE|i|Wf_H+rk>|VSXP6qsw*a2Tpn2Y8dRY}Yv|O;8Oh^>~Al~;x z16phIEy$m;Ju<3baq0~p;YFr?9$p~l0D^g0FV@ z*xXP{hWin-Ij+h+I2_=n6#^E9ECg25shrNImN@D*{m;2FSjw$DT}2OKnWZ?Ir!PjT z6i3_nppS({asNBYNj0ISt{^K#sA&J6tGE>HSsL3wK|jT$yIHvP1ecpY&cWrC_=v!) z3|^(!37_KtQo8u?-8iC0(|O@u*nV0)sX%Ndk0P<-I=B+gFE1mYB0EsrU> z!8;q@_Dei$ax;KXrBk{^~)3_<{0} z_v>s&9&vf2b-_-RFRCShmvADI-u==dq7Ns-v-Rj`DEX*K$h>1mMcwU5Xfaad{BL*j zz*uyPw6Z=*E587Z`}5tBRF)h&slZKjyaT7wI&@=4AeCbDE7D7liuj{Ql%ZQJ>)0-w`g>&NmKzTI}toM-(hPBUF``gi$N$e!EqWg-fjrv23S z7^m1T@pGR!ka`u(9;n4nE_iN*xH34`$S-_!D=tHHgl8r-XF=lL>?VEG+5c68BTO0n z#EPngVdTYi;VG$$wEiK4n|a(;XTKlOB!UQ> z*KN3dk4hj`ob44?V&it^vSnsgGebRRU=7scGQW!a7}u{*3+mVGwnF%DK+LQTOvoA2Sr+)#ga5o0_lm3ef!S&VjcSKT6U;;`+ic!tJrDioQR)e}v zG~lC(n=kVV2caHqTj2CidJ{?|M7^+^m@#Pza6s5!8-e-O1-!HH<&F#j7b+}7_+4uvm}0CV@12F=>X95z}0Mg#eygGiX=AF6$ec@mWQCaeN!_ zo);=CrO@uII42pM1iS&U!XhLIc=r^E!n5I*pIGqj4`7(^z6psUP(E;?s8Gf_Oq3pY~SPi4S*KvY@z&6tY&k4^W-RcF{_i zeljW+@*S=PsvDEt31ew5=AjC4J5apJ_(K>$N3Rl!-h=ltQn5y(K)W^ife6~v)-A(G ziOjk5KgR+v5vCycdaJq|=9yzNc{L;wN8x4xT!yBNg?ua%@L@RIJdl4IiwCiKj6%X1 zQ5R~!Efk|r%I7v*o`hC{_n3stoyf8vbiM#F8b3FlnlVFofil(9+W2@ve&J(w)uQ2N z_@vpdgc}B{Flo44v?oy|=z|2kh(t_Vk$L7>EIKU++e*V*nVDH)v3O$pUl<3yXNSH{ zUfQL~$??z^shWE}!}T%f$&CIT<{VWN^2PgvQN+rBZoM}P{ZFj?(!-SJ`Jj+rd|IPc z%dHbWl~Ue4vI5Zo+DX_-uMc#;fK&8m@B@6(bX46y`8*utyWjo(;hJ zXs4)l!2%q?DWj#PI*N`7d5f%H8sX>e^=a@)BN}kjQQp0|8c>m#IDm>xOr()ME@VHY zY7>?_H{)$POk7AzcuY({={f;LfQgG0t+z4=xWUl`EpK3xK{+D}_CKfv!wjS&J=8ia zm>VwN63G>cRb0?6brC4g3E7}+a9aq(!emOEC?^nUxZeM##NHrGal-6NJjY=%R^%vv zbPQQc`4#fGc0gcx2F@+eG_X9`#4^?od=CXfAePU8KP6swgys35TlPF3?WlwUy=q>nPI-^g?f zc(<~)-M<4qm;ilq_sP%NF2))1VjZq7_-TS>)`4w&qg>@31PE>LtjjvF;Nq%{#J&32 z>?IcY96i4TN~IL6)E*N zFIfFOTq%B_o4Fr^4J#PZd2HsaM)T&(@uLSyT@Cu&!D0(Y9~FIR-+fQ=dhK1bF39U2 zqexzbgx#tvSb^gfoYe!N*XMO|-f$T{sk9k+!N9s1UFoK8-*SprKRK|Yy^L}R+K6Sg zh;bHDW8!AQS2WILlSbeK&ggNN3H&_?X;jTvv->|mq;VA92L9sybn~vszPR*Se!Ciz ze1WdUYmZi%1eICE%ctT>^`Lc=64(9lbe@UZO#4XaPnc7{_&?0*CJ z*l|Nv!Asg}&hfiUv>2|Rpd3*$G`Af}OjE=*{6XA=9nT-$_YfskW(y@RB2{YXXt$Vv zlKbBgC~*-LRiIt|u16aDlRLr*X3;z{;2$`P;tQq6~id z0auf&%QA6|hPtRpU4?_8WsQ1X5k`wO!r|S*2^Ya0!T4ei?1RbbLnpv@@7 z->ODm-LuSxXoI;cqisd~VQi)=-zFwuA$HS96okdsJH^^LFh#2;yPgg`o3u0IqxdXB zy=8ZWPt~A=^<{$wVRzM}7b8s~qMa@9NoWb~(8~kx3HjY$*lGz@(UOO7=Fmt>TNS1% z;gXH`ty0wBMi{dM;99chEuu;ozFdq7%q?skQc+F0sAkG0jJJj^c-4RmRH*o*;p_VS zlR%jDYKdEao+LWm&0B&O(R6hgt)4d#^5zvr*li6Ulf4_%$=~^+&1a#5S%X~OOY!|v zOy0PsHYoj3AKT1t)0?Qx`u)B6>ykH#7%tz}gSBd4syC#;J1Pb2Q*J+wg?*ljD%!Kp zfk-_B`)u7CW1rnHM>$vDMB0zYK3|Ai^;8g?x#~?tFD$vMy}ZcNHX>q{n8c4{k!Sr z_6i(lVG8bf7~R6qFqL_BEhnuTMa@b32Sm+D+Y?cgxQ`{I2o0qhr)}~Da@uajxC}iq zffHA2)O#V>`uHWLXcnjDKF}wBx4*#_a5^TB?7*>cH5M-*HWM&kt)w4uc9M2VH7{hb zojz@s?mQ2+8A$*e`Vu7?&!iIg6lnkOhTd=WYdgIAY^i>2SD=?y^EgUpm!-l{Ic1kJ zyWT%&mv8pAvDyh(9EvhD1*)bZ$G+mE6lb8T^9lThnp*rR_5NHmwd0cJPtn#fjC5}F zzE7nf{n3YPwl9J`mD<{jx%+Dk#>XX{5>gDcnA5qv+_BFb@oa;5d8Wx=dwg#f<6RL(l5rK^e+*E zuJ@LUNsQ@BFG8-XGlg(6RPTj4k=>2=*SMRBP9Dw;tpnQ#CXwnd zT8jGx>?>ygbC5N=&<{`m`2@ptD~|iMMzE_KdQtopC4e36buyu>gXn1V)i2{;-HGwY zS8xFeo`Xt9pqRWH?0USzDFj{l@5LSv4X4P41Kq7WI5$AE*cRABMoQ2VZSk+)TGc}3 zG!!LwOqX5m94=3S)-fk?f|VC?(7&yoN78cl@-5Dgpbc0Cj6qmE{zd`lPrlh7^9y*2 zF?a%cVbWalm){895Sy!}lC+hw?B`$#LAzcE=)mbxdj)4SLboNis?=vTp9FBVq2H)& z92Gh#djJjc`Y&D;`Y42$R+~Gg+Q?Jfm!La3(%Mw<0#7Mm8}~_GbsykR?|cI3JJ3lO zbG?Y|MEbY~IHRDGl{dku_7R{Uc`;O|1`@S>D>7j8Cox&I-~0!e(}VbJcvEMeixl>v z&OQq00`z`;e~sQ{7e~K5&#i*h)mfU6-JT z*Pab(`T@sGn&@O<1;fXBh>zqEP*pJC{>{uzcv_+(?$JqZu! zNwe_{7sBUWj!UzD!ynbY@P3Z}LWB|~e#9h9rkXKpn1soAq``U>O0yG^@c0qfufFcA z`2MxUXGhOMN1;y6%1Fd@|JYzW=3r)^JzcuZ3-QZd!d_!AP{)eF>_G+$X1E;8?|=oY z8wllKRwKs2gdnlmmSiaSEwcq3U?~bxMRNBgT>vKqEEA!K)u{HFC>KBMX?Uj5E{Bc6 zZWfNPoEw@8ge-?kDBX)sVH*7`j9Lwbk*ghxLlPvZ> zNX}#70_lOBhT)pCi*R|e6&6f1^n3ez#6U@CeAzHv(_vz+$GWi-10I&v`G znK+9NP|S*I4c8D+-KBDGeOSF^>^>Rv;++Qe;xYCj*AO=aOy*f9Jd|GK8}uVT){lAY z$E;XCaPNvAr(y~H_$`VVbs-~p<)dVrygsHQ0*g!YOp!htZY4A)6XPw#S%OV;t0YrV zOQ75R`O83VjdCXAOJqD;>Xy$_kyFDyH(Z*b)Hb=5T*PxrGL+m}rJB;NVPF`8C=I!f z;29tQ8SRT^|Ms^i`Q(Uu-#Pv6VTcuM3kKqPI0OAq=fBgUinF*DQ-3+TfHg=__BY`1ay}k;AaSr|6y*FzG8kj<2=qk0MA{ulYhK@7reM4A z8$1hCA^!Vl96V0nb~@RIBTIizMv~EosI-mxnI|m=OKm-0G;c8LWJ~_p-t)cAzZW}B zC=GYRqEV9xiCQGUk*M36(s1gIQtY5`wY{&KQn2f~u3pXSNU2o{8m>$8g=(`S@A|ab zLwp&w`ApdmmF7RGDg~pPi_gmTSJ0%AQoA;WhpP8R%Z1lP#yZJUxJ`z1)Dp{OTI z*3(Hp7l4WM)&GfSh^))f#cGf`q9)QwzZMUhk`jSw*1|dD$u;ys`w0lYWX+aq|^ zA0!a2K;-}!p?88_AfeY8@ZN;<$j3Jw`lE@m?lpxQQI$=5BX}jg5VZ8C`Z;nG*-#MB zDCs6Pbaz*xnugu!Kj*V5o&&?tW-czrx6hfxan&1NI#=5-LI%!n{P2;#cwB&=?e?<~ zCJBte>!8|>c6A-YwnlsSU%(05qgr!z*mw2C1#-)j+3Be#0&rnhEuLZ9w>DqQm6=s? zu6Q$pll{ZCI{)s4-4_gwQyLHz^VJ{jwi7FCmakw}AX6LL&0kP^T^D@DIi=QLP;(vT z_txylJN$UlZVB7a^;x!6gmM?mlQjG$i)oX2q$MFbC<*VI-q2q?m3tp7M_nuS20P(P zy}j=hWYNYg#KMp9d%)?YHv*{@yMx{IcY#*ypLP#5Nk6fWETe=9ccT#Y7jIx9ebyP` zgA>=70DDg%S>J^OwhzV(QF|+hF0m5y7&Sb^8k`kRAhV+FLfN~J(0m6T%@GNjKL!0z zaFSWGztIpZQ-TA0_m9Xf9zugF5jFWS?IUop=ObAjYzUy!t^pBfZ%FY{g8&Msq-xK< zIJ7#2#IXT`1q$F9=&fokLFO+q!`| z9APCzzXkL{RaFCE1;sK!c7)|WN^{2&0X8@;4ikVV4v(6r4~0TOJQ=RtbvE0+;;c)P zs=6T4TxSV}iO#S@n;FnNWr^qrTy&2Zg=(!|Mm)pBif1ap+x3f8uIbG{CY&DY+c z>I&4_eMx$#nzEcNkct^6XItD-oiH?z=eKATa>0S^7J-WPNpE7S$;)cBuh$mLUVK$k zuwQ6JW@@mvHpv~nvFX6Vf5Ka7iEHfvo9FH%8f$?03zZ-&WAwZ<^jw7wZl*&YA>;a= z@te?m!h=|YWSimsUrr_j3;#U@a}XCNr4R_P13K$NB!{*+l!AAzYnH1GW?_3#H=(Y& zsiLlWsF&jF(my!5y0)Uz@F0UC0DoaukBO|!{ww|r+o=rO3b|lu(hD(UBG0E~BF~b9 zJe{h&K+20lV>w@VLDY?P9%i@IEQ5QX!>*Ai<{MVy8`hu{Y+VZQ+be&AcYpw3Y+sJJ z;Tk47A1{JMVTsON#kz*oqptt2y>o$&syy@mGcXAuBxJ}1xoQw-sR~4hctZ`4Akd%@ z!bOXnTxK96lbLa5!mU(;S_?%irPeEJQ*~Rlv{FQuQtbwz7A>}^rCqD;Hf^cJuHD8i z|E=4#`u{%fIVU-pnP|Ih_w(uQgwOB&J?DAv&wDxVIp=+ce>YMW&2sVcMR(G(tUt|& zlJ6)xe5HnDF6(SxcyZ^tF{mo6!khABtYB&yH}+4XoHX80)sCDtle=T2Oa>q=#|FJ+ zn%+OX^DxeCRq1S+b0$e*8SKLX(HN&?H-5HpRw2JzHvH#k`mImxA{)|H+mZA96@)qa zsP@-GRQ+htU5;^hPw<+q_oaN#!Zq?%#RGse8z z|C8A>kEiT{wz>s37e2U)@=xx$?A@YEI{9^m{MW@jn?ImsCHLy> z`gY6f|=R*_uHNy@OcQR4Fol`_XH1+Cjg$0O32Y*>wbn|B{#qZ#6FqCE6_#Q<3 z#wIr6j!Ps+-qW?<(9g;j4C`7zt;+Rbz5L9>7aeX}u|4M*Lf?Ee@7pYm-*R(NyadVH(4jc%%Gatd0|c-g>gE{yOXc$)RqhzH)7nFapT5K8h4#> zHyC%5aW@xc3{k z!?+I^_aWnc(YOyA_fg~SG45B5yVtn;jJw~sPa5}taSs~zDdT?AxShs*#<)j}`>b(~ z8uz+G#y-Z47&m6zxN-Ho$Gel)8Moybm6sTI_F|u<(77P{m$g9F0$B@WEs(W9)&f}z zWG#@jK-L0T3uG;jwLsPaSqo$>khMV80$B_E-?TvA{`YsgGg-jpKlz&H-s{_7rr23s z)&f}zWG#@jK-L0T3uG;jwLsPaSqo$>khMV80$B_EEn9%oVCI*MfAy)wRl3Xm+ShyD ze#buT;PNX!`D4^OO^CzCdOfTd*Yw7)EMdGkoAN8R@os1PCY#rFe`4*9!kzrgQtkGd z*!E?dZCl)M@~S^riB_a;7AFZ4edcppE?|>lXVD#pwjW9j^tWvHY}vCG$XXz4fvg3x z7RXv4Yk{lSSeWpm560qXTW>1DmM7RXxQ z&$GairPWJ65Pf4}+o$RlJ&=FaZHK@6jT1Uu%)4k+BHp}eU2|;hnyIagiDWRos;Mm$ z4kY8jU}9A)*%A*n1`;Mv<%PlXD$i}2HLH1QQ&Yvv#&ZL~rkT^4!@nyXU0 zUSO2?`2F_t`9`U2_rqR0s-J1QU9@3=R|>Fi!M;4xP7}O?#2YA* zZhouIyGvx$e7pQ=vlBj}+lYROqt6*6IoLpTyFrzs$CjCNnr6TFgiFoKqkVxs==8}6 zCXZZcIG>+y1$$h1r0NEW+r!hRZ#F-4>x!GI%h>k|21~&+ISpQ?@96kARe&vu#Y>-T zSTC{xTyVL|PRS8Q_ZIpEj-GmIxKv$gd{0@Plm$wqj4@R9;_&W*nAK}dpFLG9@)$q9 z2p)E&o2v7S^~%^}t{J0bE4|~?8T-z-b*?qfxW3$j1k=$&#`;mjUs;s#x3aU z%c(j~VXhR?4+`T$yNASb8+zl{7mDxWJRjd6(%_1ps`CuXkzvma>B;FF92-=jvB|&C zD}^Vpb$zjPw(|_WMWn+?!;Ik)qbs>dWWQT~yi`=@zgeWq(UV>#ou=6@KH*aH@)YDs z!Haoaxt-qF;0CL76UOGs*i$2=`W%$1Qp1f{r zzMbIniZ3vNG<;INT_g-{aix)}GyNkuoVF^Yj}%DRE~~9P{7)G}XXJEKKGRdJwi_zG z$3@Ns-AxW5cWxkZgeKE|@*MFRT<73`U=27k;;+s*> ztzn$L(!uZX9tE|F96K<7axY2O)0Qb=J=&&mZ-tqI>hq$}Po;e0Dc^X;?f6};d#f4C`BFGzXb)rA>Q51`L{1FF_Ic9rIr_w% zBInfh*(Y76_a1)JJVSWTn0y(NER-?ywK4RyG4!=D@sXw@=Mo|AK~SX4Bwm2aIXw^@*$6N`0-@l;=X!yr|Dez{Kfoe!<4jo%jdE~=UqH2 z-_1SWRlamxU-{DgnA=j)u=;Vzy%rmGl27?PjDaiqY>}?hwb36J*3>6HC^kXuO}ppN z=DyF1tOD(>JkoX4hwzdqysiuAKc6Oz{osI;j_O%gsqQd1?&z7PGU?Ld6E3wJ9vz=? z*ZgntE|6|)bpE}pd#>!WQ@Rd2)n^E+_vur^O<9{rV;k7)N+(@6KsuB+HP7DuYRAJ&k0xO$<@rYMYKUtPuuCamMZIeJ-%>J%u?^_yF@zCu^_@ z&4D~v+a#04a_)(I@v?T6hiETwz?Dy`&NC`sMg@k;DApsRxNnY%m-ZBQ+xIseW9agC z+0Q`sx@hzn3PPWr`ODQ3RUVZK-W zgW!bYCxaMcz6^RQOIkvjY3XU4O!-j0)Uc^@j9Kg5#9FW0wbs)%;9ikaKV0M=L~a1L zEwOD$nyETZd4ZH4DU0oQn=^JO&m*mfp->3FY`{W zc{gIpsQuw4^48}(*0}kUOYc=x7cqvxlx2N=GF8`aPN>Y2y32V60RbnD&I!yFs%r&d zM^DC?bgA*px{>(#mF9lkV9I;;a5=kWh)g_knoOi0Or#%7tSps@zjcj;f!aye@jOTP zDru)(1?dYrb^C=)J{LBF^)kr*N$_70GLn07@sZ(DkmOm3 zx!zk@BJE>E?g4@2efCV%S!2%iZtA`Is8c3~2YQc{;k|;;=Vk)$ioUX>>a2GIc~Vr* zyD|H{Sno4WE$a+W<%-{tqI2wO;?Raw^u?8+-4!QQ*Lx3k<|w_l^4vCT#*l7pE0Y#; zrko>kF*xF+W!5G`jP45b#~nR!G+cijgF(}vUTNuQCMjuqs`I7#NWRRjAIh`rFd06h z?^)JUk}D;@W!}@Lod)|kv^ZCaPw-wKStNOtr%CyTs5c0#bZpHt8~%d7Wc25rn-Ztj zE~a1mcwQ~yd3Csy?i=8F^*#GP^AqEnIm-0^q4xNHvWKxi^`9Oi@y4veS49`5iF$G%L*^FY|l=9Dlto0gk`Pz?FxSms5|SV{%zP6q#qS(pX7@ zV}n-GSo(^{ndGCaeOVHa_Im@s#7{T6Y)2)_h;;5Ya!ME6m6GGYG_-3G$0 z=Q@mj7uQ8x{}kwJ$B~5jEXYN^2>%@NX(jBHU^@EW6K)Oqf5!jA$S;BmkS_;2KoAVZ z|26ctfm6i0hwJCiUk7dmr*VA@{Vk-oj4+==egOGH_%-48Z{Tb&jO%ys+Xz3%^*+#m z%;y-n7yTCSORmoV9#F;gC~!Ug9{|sSZ;@^bIv#mtA~?zQRQQAFYCsP1*TLh+)r7x? z{`55XK6nkh4T^&vISb4M*MKPa1h^0E122G|gSSBGYL8Ta#UKdU!EUe*90RX`w?OF{ z!hyvg2-?AJun!yquYq?!NsEW?tsbcc&0sUQ4?GGEfggdB;B8P6^2lUxDYyp2z-{0@ zum^ktJO_RRehs|WdE_)O70dz4K@!{!?gL*1hroBiFTo#xZ>>irf{VdbU^Qq5e+LeN zAAue)B2QJ4akjnWIUJ& z7J+L)0(=te244l8;D_LK@HQ9|^~iKE7km`l0PY7*gIB?Sf#R4)J_IfXi$MbjgLU90 z@M&;2_yTwoJO!QyKLS4m^gh;ogITxbNUjW#JQ*taGE54jQ21gjJ{iHjrxNy!mdQvt zO-9LR86#t5oQ#*#Gw>TD3fHed_X=ZQ{+Q(mYmIUe5y>7=~5x*@`y51D&;(x zCFjcpa-m!#7t3t9L@t%fq)O( z>t%y%luhz6*(@KI8{|f5mo0LW+$^`qC*)T7q->RK@+sLaw~4)NOm~9?!eR0IW6AY1 zXZY6ylm6g_=3p!tibniw{9PAn4krA~(Lk^_Oe`Ann=NH+u|8c}qNPunXl@Ax{Ee$u zv;Q}_u{qY(7zv0!P1_ufXVOO7BFPN;;Pq{d6f`ZBP$Ch`6h4|M@ytOtWDL707{|ia z_PTkEk>+5yu_+v^548pZD;nAGoaW`$`WutUxIYj~B;(PIPEbpUjUChYBe68U0N%|l ziDY9knC2IXv;^a!q_IJoXQZ(;m?=RMI@TC(Y)y+|c}2sa=JYZqnxnDw5>T$@wT*#5 zJUuP-NrX0~#L+I$KP+u9VEyqMu>SZBTz@<>)*t;q_3!n{P=Di>R)5uIuD|2cul`Mq z@pveh-U}RkKhrqM^{%evx0Mgw{kDx%O~jE+NIFj-q~5HR?1?#+qwT9>DOGb@JRXd=#u@6=9*ZhNXH{)1 z*c@6NYVIusy0%E@`nG-p9wl?QHDR?d<%S3J4F%jaye=Aw^rpNvxY6I--z2KSEJ2r* z)`qxgI7Vn~O9nS+yCy>HPG<7%?~&R~tl<6H$5Mr(&1+NQntqZ=AK#ck+ZIVzX6!*G zKc@?=4bdT86LCM!)Zx+3GahYfa}A1qe#wol*|X0lz1mK{9Jm-6MrmJycn(+${Q4Cm z($?ya#iQKO6VZ6WU1$1d-@F}PuVzfUdD-fIHL!K@KtIFVTGM#%;k7=VF;;xz0CD0Q zGsj42c02csVKepyD}vJ!rp@1jDO)`!em2>5hlmnr-{v?0ePy+D^3@ zW)ak>vk0mTvxsU_XOToK6iI7lqwH5xqv_XFMw3h#gGQOs7D*OBDR&g@70pafYl41j zl8U=KqUkd_A@x(nH>RrAha%Q;wXrFoaooWzKf9yrnv3<+!2Z_!p6;(j_pj#O&=zL} z?3y2}OJPDYE z_r_2#9FRn?l@)n35j2uB39FX-#Ja|Co8@6zTD7cp$QL0NWlnPhe`{Mf8H$Ciz@~M~ zOOE&$zWV-M)6{gPms>h{%jOhH%{#?Ad-)f(K-C!Dje}!+ zckh5-22-x)y)3+neHd@E=f=JNLic8TYa-u7*q@>N0_Z^Qp3L_H@YD)g@B@4&0Q-^4 z;WZy*uL0?I!rz<1w*=C3f4kT3{+rI?TLWQ~SI}?nMph1k1IX_E2JXEIx@X}D@CJD) zKMTBsSH5s6@A#3G7lBIT4*28KIDdg$KArCXU=;hJ8sKk%Db&Ti-$M6d>;hX!U-@p( zfxH(kIG1k(gs*@f13k#@{UN${q!pABUU>sJ2e|`w_A@E}%S_V6CdxIH*bR9v+%=1D zGwcO&pJn;P`Q!zjn(s0E6XfH_yy%td!4bmmgil;ZzQ|P<_3cm6eM;Le=DQMl<(;4o z*?rzc&%&Gs-XcxqCBSz%-v{6iUBdS->ez6p$nBsOxdVReGWri?=H;@y3*N@IRddK^ zE@hxE#o%@GC>!BB;a5R9Ht&INsUaNt9{An)l$&(i`{&<|kn7-E7f}Y%?}jh0&k`J|=erizv&dt3?lSCvtlR`nAS<^5?}v#C zJLe>n&sxrREW#*X1U4Wm*MXhL?lTE`HsRn3Y)d-I-vYCd%U9BlpmYI!1O5&uKz5&L z)AMfM`3U+NkKtb-PeN8MT1EFlcAqEEa|q9Z4$@a%;ipd`E4P4`kbMo@N$Y4E;&#C2t>+rO`+SxA{FR==x@#k4CXDiiO_Tvy zc?-A$x$a{kAKQ#g>L};OvFi=g3wtWR0FubcuYlW--Djfoyi`Lwa}j#wb)Xix6CSjM zIwC7OXOG-xll0tD<1O@8!YGG;Ec6)OfLw~Kd^4DW>^^6tXOMcfVRQ7#Z-W?e`F7d} z=-DFWiXDtGWaYVFKXMmb_-Xnjas#{zc(wdH`PK^F#wP8bVJv`iXqRr-IV0#k*XKU> zr)L7611p(ll>Z&Xkd=!+OL>r$Cxg3@+u^f6hdpUu_n8tsZ}K3hLa+QJScR;-_%6~! zcAss~a}rmB1B*R|{m93WmDhoj$jV!Q_X^^|&UpvrC147AxXFK$a$2PDPTPf>#i-(Zi=PummGW5(wc?aW~Fv|77OZv*! zgHg!Jo54A1AGr7n^l9>~gSUez$X)O!9;AHC3GVX%dRAcH-(xqzC=dT4c_F*c=jz$r zlV8FP%!kT<0PV=iQy-@7kaxn)8C>O;9--~fEB_jFBP)-8lzRhm2mHhy%ELTX^%ar7 z|0?-1H@eSn>eQAFMyA+=H64U`|Uq=fIdyxl-~qTA-m6O=vj_~2kFn)O1b_Uj9;}g zeEZXkUu5|vXGOtg;&#E89iorvTmioc^n8SJ?la5@$jZ(+2<0}g6}|F3paWU?F|Z$5 z`DJhv*?rEyeWpRrHVpcfFo>CB;UpM`th^OeA}iko>X4Pc09uf%o)t*|AAP1BejMZ> zcf#wxjXja~!sCz9rn>%t=RQY&L%$O~|9Sc+as!+Ig4_;21gdqt2VeUg<`dRMJK>KV z!;a`X;p7XXgMKgE4Q8Y7fy=)~8IWV}!7i?m-TV4=&;OTRq+bzN`8YU*T=xU^l^>^$ znkIZ4)DpKF?g4rZLHUIr(q72QdKTdhWcQhbH_#3JC(6kh&j+sswa6XtA<%%_1(&~s zov-moCA{dzj2-kl;nJ6xuaGZ*L$A<>3DXUaf0aIfd=A_I_8`aLIsZ(*Lf!yx2b+<1 z!e{>r^DS~c-1HOdh5RsF*3JC_xdQ$I*p1u?pZ!zDBk}_H6xffv>SwegIELH~-vQb` zLYSX3Mt~1_Cwv5~L_Q9`4(gD5;87>I*C0=VF9aKqtKbfB0rCO(BxpcB1?T+&J0ttx zt3f$(82%loKpyuRUz=y$c=T?Wv~bN2rU1~xJLHDwcr@?Q}FM>tH_;iuovsslm|Hs7ygDh3b`ZK zBM$&sMHu*5kcX`Mmwy2srhRqavFHF9khQ@7 zj0LuS-5PIq+WfH12W@`d=9g`L&E``!=N+`-pKkLsn`hZvXLG>jO*Y?d^FuZtu=$wH zuiE^E&2QP9`wc643e6P)WZT|1)_{YVZ z^i9i-<7_Ur`HzeJr-!=VPXE$>wDSEoyPnf*eYbtRz`kB-bHL`f&9~S*%jQm-U$yxy zn|*dZr`ud<^PgVwKQBg}U7ol9+U@#;WmhfjS(?{gp7H*nPxoDP<@?y*e4tOa2%AiK z9KAgkY1}Zn^8Kv0TybwlcYwH={<8C*WtZ&ym#KHKcDMU|cK);aNp}9r+)w^o?X5CT zcg8F*n7;A~fgS^knS;02n`O)~&P-IOwcxBUd!RDkq zCG*V2OA~PpPu)37!@*!oPB@_#+k0`W@ClyXwN&%W&eCL^wXsi5PuDFB$OMox|W-c01et zw8E242z=+*M;aD4Cf4$HMayOvqrXo>U#a_fyl%H}Z&x7wA9$A}!}A(ry3fq1;>)V5 zjYikD#pbs~n)NV7O@!@MoCZ^$<)L_z!w}0NY(=BRp2}Gkv9{6$dV4HJ;D>^Fv!x{& z(EHw;`e3{@6rtxk=9F!N7bfhBXnel4|E&(wXxFau@(b_rjdj8J>S(-GcZ$!`(;8$H z9=wo^{-MS&2LP7VvJZFxKT0e&kydrEscp@gVBAULpG>PH8>vEUVPti5h1{T;#nAv; z*sSrlf)i{tORlJ?ojJptPT^EdI2u`VU2BXJJbwQ?zq6Ck*+D3rwrLHvCO8Pf$sNBx zgt0%S0h-gKxzQRU zqhz%X0!|>c+L~ozwwH4{$=?)QL!HdH4Q}B5mG~KWeb=*uI)#!nL@TF|dS!o*Gf0%E z#lPBg2frTm86{eQ)uA=?H-Cg93eolc#`v0bytTGsT8-#<1taT1@o1#g%xsnYLPR54 zK7Ue=#qgd~{BcUDzfbMAeOB9jSI(ro8-mU36L-9+XlEyM<7 ztM((&TGATP3Yy+3jj_z*OQ)jnfMm{8Pi{PCa+3)fg!uus3t9J3wk0Ey2cE zKmR}XE|ZO)wLpIh%;2X8JuX%1_0SRh{a;84pL*>|Dl7iYS%CNdlz9}NKKd8kIyYaD zLC?>Na)y*|A3xNf0uIp+GA{$G^LDC!?4Q=nnGXAmlJyiXRfO`J6&ty z&o}X}G`X!IFDt%N7QM2p`F`nqlylx5QjZcoMyv>DsNHRGCE6g`a_SJJt>V-$XkV?S zjO&S`?Ng3k(`Y43gz_XwNB=f)Ufe^OgY*!sq2?6BPpzaUx>eaktAexdm{6)Wkf^jRkFt!z|u>ZaDvxY}1VSB~i+U&JZ)>2P1o ztp2rz(9;MXB;0gDD%|anpcU7nT~A5Yg6XCXnaVbu{Hg)JVqh%gv{2tD;ajvBVfEBS z?VrF(jpWwXe};PZ>JZHSWi9ZxZGj5*8c>70M|_VQeWd%5laFkDbmyaYKdO6@bmdn7 fRdig?Azgg4*P3?tI?6jLI;uMKBK!BZZh`*~r${DB literal 0 HcmV?d00001 diff --git a/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/bin/pthreadVCE3.dll b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/bin/pthreadVCE3.dll new file mode 100644 index 0000000000000000000000000000000000000000..54c680fa16552613307a6d6e5fad9de1a2dc701f GIT binary patch literal 107520 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 P0Pp8nz_Y+Vody067K~j) literal 0 HcmV?d00001 diff --git a/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/bin/pthreadVSE3.dll b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/bin/pthreadVSE3.dll new file mode 100644 index 0000000000000000000000000000000000000000..47349131161c7ec51d62840a48eb9bffddac007c GIT binary patch literal 104960 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

20*@u5faqP&t%(`>YDV8cTrAxG1JX< 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 literal 0 HcmV?d00001 diff --git a/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/debug/bin/pthreadVC3d.dll b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/debug/bin/pthreadVC3d.dll new file mode 100644 index 0000000000000000000000000000000000000000..7ef3168e95bb3a922bfee5b0a399af1b10fc5564 GIT binary patch literal 101888 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 literal 0 HcmV?d00001 diff --git a/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/debug/bin/pthreadVCE3d.dll b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/debug/bin/pthreadVCE3d.dll new file mode 100644 index 0000000000000000000000000000000000000000..03ca22cab86b1a646a551d166566799590665630 GIT binary patch literal 106496 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 F{0Gf(awq@* literal 0 HcmV?d00001 diff --git a/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/debug/bin/pthreadVSE3d.dll b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/debug/bin/pthreadVSE3d.dll new file mode 100644 index 0000000000000000000000000000000000000000..638dc31099e12e1684e89d1cb06ca2702ef890c0 GIT binary patch literal 103424 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 literal 0 HcmV?d00001 diff --git a/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/debug/lib/pthreadVC3d.lib b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/debug/lib/pthreadVC3d.lib new file mode 100644 index 0000000000000000000000000000000000000000..63599d8762c7ab65dd45330498a8edd85a85e4cd GIT binary patch literal 34898 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 KEcRGypZ^1Jr;I89 literal 0 HcmV?d00001 diff --git a/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/debug/lib/pthreadVCE3d.lib b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/debug/lib/pthreadVCE3d.lib new file mode 100644 index 0000000000000000000000000000000000000000..edd12f4abdcffab78ac45d5935e870c6e5145147 GIT binary patch literal 35132 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 E0MR_hSpWb4 literal 0 HcmV?d00001 diff --git a/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/debug/lib/pthreadVSE3d.lib b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/debug/lib/pthreadVSE3d.lib new file mode 100644 index 0000000000000000000000000000000000000000..1f458a4446c9789824f1054be5f2972be50f0146 GIT binary patch literal 35132 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 maybe also add a + * leading underscore to the macro names. + */ +#define __PTW32_VERSION_MAJOR 3 +#define __PTW32_VERSION_MINOR 0 +#define __PTW32_VERSION_MICRO 0 +#define __PTW32_VERION_BUILD 0 +#define __PTW32_VERSION 3,0,0,0 +#define __PTW32_VERSION_STRING "3, 0, 0, 0\0" + +#if defined(__GNUC__) +# pragma GCC system_header +# if ! defined __declspec +# error "Please upgrade your GNU compiler to one that supports __declspec." +# endif +#endif + +#if defined (__cplusplus) +# define __PTW32_BEGIN_C_DECLS extern "C" { +# define __PTW32_END_C_DECLS } +#else +# define __PTW32_BEGIN_C_DECLS +# define __PTW32_END_C_DECLS +#endif + +#if defined __PTW32_STATIC_LIB +# define __PTW32_DLLPORT + +#elif defined __PTW32_BUILD +# define __PTW32_DLLPORT __declspec (dllexport) +#else +# define __PTW32_DLLPORT /*__declspec (dllimport)*/ +#endif + +#ifndef __PTW32_CDECL +/* FIXME: another internal macro; should have two initial underscores; + * Nominally, we prefer to use __cdecl calling convention for all our + * functions, but we map it through this macro alias to facilitate the + * possible choice of alternatives; for example: + */ +# ifdef _OPEN_WATCOM_SOURCE + /* The Open Watcom C/C++ compiler uses a non-standard default calling + * convention, (similar to __fastcall), which passes function arguments + * in registers, unless the __cdecl convention is explicitly specified + * in exposed function prototypes. + * + * Our preference is to specify the __cdecl convention for all calls, + * even though this could slow Watcom code down slightly. If you know + * that the Watcom compiler will be used to build both the DLL and your + * application, then you may #define _OPEN_WATCOM_SOURCE, so disabling + * the forced specification of __cdecl for all function declarations; + * remember that this must be defined consistently, for both the DLL + * build, and the application build. + */ +# define __PTW32_CDECL +# else +# define __PTW32_CDECL __cdecl +# endif +#endif + +/* + * This is more or less a duplicate of what is in the autoconf config.h, + * which is only used when building the pthreads4w libraries. + */ + +#if !defined (__PTW32_CONFIG_H) && !defined(__PTW32_PSEUDO_CONFIG_H_SOURCED) +# define __PTW32_PSEUDO_CONFIG_H_SOURCED +# if defined(WINCE) +# undef HAVE_CPU_AFFINITY +# define NEED_DUPLICATEHANDLE +# define NEED_CREATETHREAD +# define NEED_ERRNO +# define NEED_CALLOC +# define NEED_UNICODE_CONSTS +# define NEED_PROCESS_AFFINITY_MASK +/* This may not be needed */ +# define RETAIN_WSALASTERROR +# elif defined(_MSC_VER) +# if _MSC_VER >= 1900 +# define HAVE_STRUCT_TIMESPEC +# elif _MSC_VER < 1300 +# define __PTW32_CONFIG_MSVC6 +# elif _MSC_VER < 1400 +# define __PTW32_CONFIG_MSVC7 +# endif +# elif defined(_UWIN) +# define HAVE_MODE_T +# define HAVE_STRUCT_TIMESPEC +# define HAVE_SIGNAL_H +# endif +#endif + +/* + * If HAVE_ERRNO_H is defined then assume that autoconf has been used + * to overwrite config.h, otherwise the original config.h is in use + * at build-time or the above block of defines is in use otherwise + * and NEED_ERRNO is either defined or not defined. + */ +#if defined(HAVE_ERRNO_H) || !defined(NEED_ERRNO) +# include +#else +# include "need_errno.h" +#endif + +#if defined(__BORLANDC__) +# define int64_t LONGLONG +# define uint64_t ULONGLONG +#elif !defined(__MINGW32__) + typedef _int64 int64_t; + typedef unsigned _int64 uint64_t; +# if defined (__PTW32_CONFIG_MSVC6) + typedef long intptr_t; +# endif +#elif defined(HAVE_STDINT_H) && HAVE_STDINT_H == 1 +# include +#endif + +/* + * In case ETIMEDOUT hasn't been defined above somehow. + */ +#if !defined(ETIMEDOUT) + /* + * note: ETIMEDOUT is no longer defined in winsock.h + * WSAETIMEDOUT is so use its value. + */ +# include +# if defined(WSAETIMEDOUT) +# define ETIMEDOUT WSAETIMEDOUT +# else +# define ETIMEDOUT 10060 /* This is the value of WSAETIMEDOUT in winsock.h. */ +# endif +#endif + +/* + * Several systems may not define some error numbers; + * defining those which are likely to be missing here will let + * us complete the library builds. + */ +#if !defined(ENOTSUP) +# define ENOTSUP 48 /* This is the value in Solaris. */ +#endif + +#if !defined(ENOSYS) +# define ENOSYS 140 /* Semi-arbitrary value */ +#endif + +#if !defined(EDEADLK) +# if defined(EDEADLOCK) +# define EDEADLK EDEADLOCK +# else +# define EDEADLK 36 /* This is the value in MSVC. */ +# endif +#endif + +/* POSIX 2008 - related to robust mutexes */ +#if __PTW32_VERSION_MAJOR > 2 +# if !defined(EOWNERDEAD) +# define EOWNERDEAD 1000 +# endif +# if !defined(ENOTRECOVERABLE) +# define ENOTRECOVERABLE 1001 +# endif +#else +# if !defined(EOWNERDEAD) +# define EOWNERDEAD 42 +# endif +# if !defined(ENOTRECOVERABLE) +# define ENOTRECOVERABLE 43 +# endif +#endif + +#endif /* !__PTW32_H */ diff --git a/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/include/pthread.h b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/include/pthread.h new file mode 100644 index 0000000..f35a39b --- /dev/null +++ b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/include/pthread.h @@ -0,0 +1,1228 @@ +/* This is an implementation of the threads API of the Single Unix Specification. + * + * -------------------------------------------------------------------------- + * + * Pthreads4w - POSIX Threads for Windows + * Copyright 1998 John E. Bossom + * Copyright 1999-2018, Pthreads4w contributors + * + * Homepage: https://sourceforge.net/projects/pthreads4w/ + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * + * https://sourceforge.net/p/pthreads4w/wiki/Contributors/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if !defined( PTHREAD_H ) +#define PTHREAD_H + +/* There are three implementations of cancel cleanup. + * Note that pthread.h is included in both application + * compilation units and also internally for the library. + * The code here and within the library aims to work + * for all reasonable combinations of environments. + * + * The three implementations are: + * + * WIN32 SEH + * C + * C++ + * + * Please note that exiting a push/pop block via + * "return", "exit", "break", or "continue" will + * lead to different behaviour amongst applications + * depending upon whether the library was built + * using SEH, C++, or C. For example, a library built + * with SEH will call the cleanup routine, while both + * C++ and C built versions will not. + */ + +/* + * Define defaults for cleanup code. + * Note: Unless the build explicitly defines one of the following, then + * we default to standard C style cleanup. This style uses setjmp/longjmp + * in the cancellation and thread exit implementations and therefore won't + * do stack unwinding if linked to applications that have it (e.g. + * C++ apps). This is currently consistent with most/all commercial Unix + * POSIX threads implementations. + */ +#if !defined( __PTW32_CLEANUP_SEH ) && !defined( __PTW32_CLEANUP_CXX ) && !defined( __PTW32_CLEANUP_C ) +# define __PTW32_CLEANUP_C +#endif + +#if defined( __PTW32_CLEANUP_SEH ) && ( !defined( _MSC_VER ) && !defined (__PTW32_RC_MSC)) +#error ERROR [__FILE__, line __LINE__]: SEH is not supported for this compiler. +#endif + +#include <_ptw32.h> + +/* + * Stop here if we are being included by the resource compiler. + */ +#if !defined(RC_INVOKED) + +#undef __PTW32_LEVEL +#undef __PTW32_LEVEL_MAX +#define __PTW32_LEVEL_MAX 3 + +#if _POSIX_C_SOURCE >= 200112L /* POSIX.1-2001 and later */ +# define __PTW32_LEVEL __PTW32_LEVEL_MAX /* include everything */ + +#elif defined INCLUDE_NP /* earlier than POSIX.1-2001, but... */ +# define __PTW32_LEVEL 2 /* include non-portable extensions */ + +#elif _POSIX_C_SOURCE >= 199309L /* POSIX.1-1993 */ +# define __PTW32_LEVEL 1 /* include 1b, 1c, and 1d */ + +#elif defined _POSIX_SOURCE /* early POSIX */ +# define __PTW32_LEVEL 0 /* minimal support */ + +#else /* unspecified support level */ +# define __PTW32_LEVEL __PTW32_LEVEL_MAX /* include everything anyway */ +#endif + +/* + * ------------------------------------------------------------- + * + * + * Module: pthread.h + * + * Purpose: + * Provides an implementation of PThreads based upon the + * standard: + * + * POSIX 1003.1-2001 + * and + * The Single Unix Specification version 3 + * + * (these two are equivalent) + * + * in order to enhance code portability between Windows, + * various commercial Unix implementations, and Linux. + * + * See the ANNOUNCE file for a full list of conforming + * routines and defined constants, and a list of missing + * routines and constants not defined in this implementation. + * + * Authors: + * There have been many contributors to this library. + * The initial implementation was contributed by + * John Bossom, and several others have provided major + * sections or revisions of parts of the implementation. + * Often significant effort has been contributed to + * find and fix important bugs and other problems to + * improve the reliability of the library, which sometimes + * is not reflected in the amount of code which changed as + * result. + * As much as possible, the contributors are acknowledged + * in the ChangeLog file in the source code distribution + * where their changes are noted in detail. + * + * Contributors are listed in the CONTRIBUTORS file. + * + * As usual, all bouquets go to the contributors, and all + * brickbats go to the project maintainer. + * + * Maintainer: + * The code base for this project is coordinated and + * eventually pre-tested, packaged, and made available by + * + * Ross Johnson + * + * QA Testers: + * Ultimately, the library is tested in the real world by + * a host of competent and demanding scientists and + * engineers who report bugs and/or provide solutions + * which are then fixed or incorporated into subsequent + * versions of the library. Each time a bug is fixed, a + * test case is written to prove the fix and ensure + * that later changes to the code don't reintroduce the + * same error. The number of test cases is slowly growing + * and therefore so is the code reliability. + * + * Compliance: + * See the file ANNOUNCE for the list of implemented + * and not-implemented routines and defined options. + * Of course, these are all defined is this file as well. + * + * Web site: + * The source code and other information about this library + * are available from + * + * https://sourceforge.net/projects/pthreads4w/ + * + * ------------------------------------------------------------- + */ +enum +{ /* Boolean values to make us independent of system includes. */ + __PTW32_FALSE = 0, + __PTW32_TRUE = (! __PTW32_FALSE) +}; + +#include +#include + +/* + * ------------------------------------------------------------- + * + * POSIX 1003.1-2001 Options + * ========================= + * + * Options are normally set in , which is not provided + * with pthreads-win32. + * + * For conformance with the Single Unix Specification (version 3), all of the + * options below are defined, and have a value of either -1 (not supported) + * or yyyymm[dd]L (supported). + * + * These options can neither be left undefined nor have a value of 0, because + * either indicates that sysconf(), which is not implemented, may be used at + * runtime to check the status of the option. + * + * _POSIX_THREADS (== 20080912L) + * If == 20080912L, you can use threads + * + * _POSIX_THREAD_ATTR_STACKSIZE (== 200809L) + * If == 200809L, you can control the size of a thread's + * stack + * pthread_attr_getstacksize + * pthread_attr_setstacksize + * + * _POSIX_THREAD_ATTR_STACKADDR (== -1) + * If == 200809L, you can allocate and control a thread's + * stack. If not supported, the following functions + * will return ENOSYS, indicating they are not + * supported: + * pthread_attr_getstackaddr + * pthread_attr_setstackaddr + * + * _POSIX_THREAD_PRIORITY_SCHEDULING (== -1) + * If == 200112L, you can use realtime scheduling. + * This option indicates that the behaviour of some + * implemented functions conforms to the additional TPS + * requirements in the standard. E.g. rwlocks favour + * writers over readers when threads have equal priority. + * + * _POSIX_THREAD_PRIO_INHERIT (== -1) + * If == 200809L, you can create priority inheritance + * mutexes. + * pthread_mutexattr_getprotocol + + * pthread_mutexattr_setprotocol + + * + * _POSIX_THREAD_PRIO_PROTECT (== -1) + * If == 200809L, you can create priority ceiling mutexes + * Indicates the availability of: + * pthread_mutex_getprioceiling + * pthread_mutex_setprioceiling + * pthread_mutexattr_getprioceiling + * pthread_mutexattr_getprotocol + + * pthread_mutexattr_setprioceiling + * pthread_mutexattr_setprotocol + + * + * _POSIX_THREAD_PROCESS_SHARED (== -1) + * If set, you can create mutexes and condition + * variables that can be shared with another + * process.If set, indicates the availability + * of: + * pthread_mutexattr_getpshared + * pthread_mutexattr_setpshared + * pthread_condattr_getpshared + * pthread_condattr_setpshared + * + * _POSIX_THREAD_SAFE_FUNCTIONS (== 200809L) + * If == 200809L you can use the special *_r library + * functions that provide thread-safe behaviour + * + * _POSIX_READER_WRITER_LOCKS (== 200809L) + * If == 200809L, you can use read/write locks + * + * _POSIX_SPIN_LOCKS (== 200809L) + * If == 200809L, you can use spin locks + * + * _POSIX_BARRIERS (== 200809L) + * If == 200809L, you can use barriers + * + * _POSIX_ROBUST_MUTEXES (== 200809L) + * If == 200809L, you can use robust mutexes + * Officially this should also imply + * _POSIX_THREAD_PROCESS_SHARED != -1 however + * not here yet. + * + * ------------------------------------------------------------- + */ + +/* + * POSIX Options + */ +#undef _POSIX_THREADS +#define _POSIX_THREADS 200809L + +#undef _POSIX_READER_WRITER_LOCKS +#define _POSIX_READER_WRITER_LOCKS 200809L + +#undef _POSIX_SPIN_LOCKS +#define _POSIX_SPIN_LOCKS 200809L + +#undef _POSIX_BARRIERS +#define _POSIX_BARRIERS 200809L + +#undef _POSIX_THREAD_SAFE_FUNCTIONS +#define _POSIX_THREAD_SAFE_FUNCTIONS 200809L + +#undef _POSIX_THREAD_ATTR_STACKSIZE +#define _POSIX_THREAD_ATTR_STACKSIZE 200809L + +#undef _POSIX_ROBUST_MUTEXES +#define _POSIX_ROBUST_MUTEXES 200809L + +/* + * The following options are not supported + */ +#undef _POSIX_THREAD_ATTR_STACKADDR +#define _POSIX_THREAD_ATTR_STACKADDR -1 + +#undef _POSIX_THREAD_PRIO_INHERIT +#define _POSIX_THREAD_PRIO_INHERIT -1 + +#undef _POSIX_THREAD_PRIO_PROTECT +#define _POSIX_THREAD_PRIO_PROTECT -1 + +/* TPS is not fully supported. */ +#undef _POSIX_THREAD_PRIORITY_SCHEDULING +#define _POSIX_THREAD_PRIORITY_SCHEDULING -1 + +#undef _POSIX_THREAD_PROCESS_SHARED +#define _POSIX_THREAD_PROCESS_SHARED -1 + + +/* + * POSIX 1003.1-2001 Limits + * =========================== + * + * These limits are normally set in , which is not provided with + * pthreads-win32. + * + * PTHREAD_DESTRUCTOR_ITERATIONS + * Maximum number of attempts to destroy + * a thread's thread-specific data on + * termination (must be at least 4) + * + * PTHREAD_KEYS_MAX + * Maximum number of thread-specific data keys + * available per process (must be at least 128) + * + * PTHREAD_STACK_MIN + * Minimum supported stack size for a thread + * + * PTHREAD_THREADS_MAX + * Maximum number of threads supported per + * process (must be at least 64). + * + * SEM_NSEMS_MAX + * The maximum number of semaphores a process can have. + * (must be at least 256) + * + * SEM_VALUE_MAX + * The maximum value a semaphore can have. + * (must be at least 32767) + * + */ +#undef _POSIX_THREAD_DESTRUCTOR_ITERATIONS +#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4 + +#undef PTHREAD_DESTRUCTOR_ITERATIONS +#define PTHREAD_DESTRUCTOR_ITERATIONS _POSIX_THREAD_DESTRUCTOR_ITERATIONS + +#undef _POSIX_THREAD_KEYS_MAX +#define _POSIX_THREAD_KEYS_MAX 128 + +#undef PTHREAD_KEYS_MAX +#define PTHREAD_KEYS_MAX _POSIX_THREAD_KEYS_MAX + +#undef PTHREAD_STACK_MIN +#define PTHREAD_STACK_MIN 0 + +#undef _POSIX_THREAD_THREADS_MAX +#define _POSIX_THREAD_THREADS_MAX 64 + +/* Arbitrary value */ +#undef PTHREAD_THREADS_MAX +#define PTHREAD_THREADS_MAX 2019 + +#undef _POSIX_SEM_NSEMS_MAX +#define _POSIX_SEM_NSEMS_MAX 256 + +/* Arbitrary value */ +#undef SEM_NSEMS_MAX +#define SEM_NSEMS_MAX 1024 + +#undef _POSIX_SEM_VALUE_MAX +#define _POSIX_SEM_VALUE_MAX 32767 + +#undef SEM_VALUE_MAX +#define SEM_VALUE_MAX INT_MAX + + +#if defined(_UWIN) && __PTW32_LEVEL >= __PTW32_LEVEL_MAX +# include +#else +/* Generic handle type - intended to provide the lifetime-uniqueness that + * a simple pointer can't. It should scale for either + * 32 or 64 bit systems. + * + * The constraint with this approach is that applications must + * strictly comply with POSIX, e.g. not assume scalar type, only + * compare pthread_t using the API function pthread_equal(), etc. + * + * Non-conforming applications could use the element 'p' to compare, + * e.g. for sorting, but it will be up to the application to determine + * if handles are live or dead, or resurrected for an entirely + * new/different thread. I.e. the thread is valid iff + * x == p->ptHandle.x + */ +typedef struct +{ void * p; /* Pointer to actual object */ +#if __PTW32_VERSION_MAJOR > 2 + size_t x; /* Extra information - reuse count etc */ +#else + unsigned int x; /* Extra information - reuse count etc */ +#endif +} __ptw32_handle_t; + +typedef __ptw32_handle_t pthread_t; +typedef struct pthread_attr_t_ * pthread_attr_t; +typedef struct pthread_once_t_ pthread_once_t; +typedef struct pthread_key_t_ * pthread_key_t; +typedef struct pthread_mutex_t_ * pthread_mutex_t; +typedef struct pthread_mutexattr_t_ * pthread_mutexattr_t; +typedef struct pthread_cond_t_ * pthread_cond_t; +typedef struct pthread_condattr_t_ * pthread_condattr_t; +#endif + +typedef struct pthread_rwlock_t_ * pthread_rwlock_t; +typedef struct pthread_rwlockattr_t_ * pthread_rwlockattr_t; +typedef struct pthread_spinlock_t_ * pthread_spinlock_t; +typedef struct pthread_barrier_t_ * pthread_barrier_t; +typedef struct pthread_barrierattr_t_ * pthread_barrierattr_t; + +/* + * ==================== + * ==================== + * POSIX Threads + * ==================== + * ==================== + */ + +enum +{ /* pthread_attr_{get,set}detachstate + */ + PTHREAD_CREATE_JOINABLE = 0, /* Default */ + PTHREAD_CREATE_DETACHED = 1, + /* + * pthread_attr_{get,set}inheritsched + */ + PTHREAD_INHERIT_SCHED = 0, + PTHREAD_EXPLICIT_SCHED = 1, /* Default */ + /* + * pthread_{get,set}scope + */ + PTHREAD_SCOPE_PROCESS = 0, + PTHREAD_SCOPE_SYSTEM = 1, /* Default */ + /* + * pthread_setcancelstate paramters + */ + PTHREAD_CANCEL_ENABLE = 0, /* Default */ + PTHREAD_CANCEL_DISABLE = 1, + /* + * pthread_setcanceltype parameters + */ + PTHREAD_CANCEL_ASYNCHRONOUS = 0, + PTHREAD_CANCEL_DEFERRED = 1, /* Default */ + /* + * pthread_mutexattr_{get,set}pshared + * pthread_condattr_{get,set}pshared + */ + PTHREAD_PROCESS_PRIVATE = 0, + PTHREAD_PROCESS_SHARED = 1, + /* + * pthread_mutexattr_{get,set}robust + */ + PTHREAD_MUTEX_STALLED = 0, /* Default */ + PTHREAD_MUTEX_ROBUST = 1, + /* + * pthread_barrier_wait + */ + PTHREAD_BARRIER_SERIAL_THREAD = -1 +}; + +/* + * ==================== + * ==================== + * cancellation + * ==================== + * ==================== + */ +#define PTHREAD_CANCELED ((void *)(size_t) -1) + + +/* + * ==================== + * ==================== + * Once Key + * ==================== + * ==================== + */ +#if __PTW32_VERSION_MAJOR > 2 + +#define PTHREAD_ONCE_INIT { 0, __PTW32_FALSE } + +struct pthread_once_t_ +{ + void * lock; /* MCS lock */ + int done; /* indicates if user function has been executed */ +}; + +#else + +#define PTHREAD_ONCE_INIT { __PTW32_FALSE, 0, 0, 0 } + +struct pthread_once_t_ +{ + int done; /* indicates if user function has been executed */ + void * lock; /* MCS lock */ + int reserved1; + int reserved2; +}; + +#endif + + +/* + * ==================== + * ==================== + * Object initialisers + * ==================== + * ==================== + */ +#define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -1) +#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -2) +#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -3) + +/* + * Compatibility with LinuxThreads + */ +#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP PTHREAD_RECURSIVE_MUTEX_INITIALIZER +#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP PTHREAD_ERRORCHECK_MUTEX_INITIALIZER + +#define PTHREAD_COND_INITIALIZER ((pthread_cond_t)(size_t) -1) + +#define PTHREAD_RWLOCK_INITIALIZER ((pthread_rwlock_t)(size_t) -1) + +#define PTHREAD_SPINLOCK_INITIALIZER ((pthread_spinlock_t)(size_t) -1) + + +/* + * Mutex types. + */ +enum +{ + /* Compatibility with LinuxThreads */ + PTHREAD_MUTEX_FAST_NP, + PTHREAD_MUTEX_RECURSIVE_NP, + PTHREAD_MUTEX_ERRORCHECK_NP, + PTHREAD_MUTEX_TIMED_NP = PTHREAD_MUTEX_FAST_NP, + PTHREAD_MUTEX_ADAPTIVE_NP = PTHREAD_MUTEX_FAST_NP, + /* For compatibility with POSIX */ + PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_FAST_NP, + PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP, + PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP, + PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL +}; + + +typedef struct __ptw32_cleanup_t __ptw32_cleanup_t; + +#if defined(_MSC_VER) +/* Disable MSVC 'anachronism used' warning */ +#pragma warning( disable : 4229 ) +#endif + +typedef void (* __PTW32_CDECL __ptw32_cleanup_callback_t)(void *); + +#if defined(_MSC_VER) +#pragma warning( default : 4229 ) +#endif + +struct __ptw32_cleanup_t +{ + __ptw32_cleanup_callback_t routine; + void *arg; + struct __ptw32_cleanup_t *prev; +}; + +#if defined(__PTW32_CLEANUP_SEH) + /* + * WIN32 SEH version of cancel cleanup. + */ + +#define pthread_cleanup_push( _rout, _arg ) \ + { \ + __ptw32_cleanup_t _cleanup; \ + \ + _cleanup.routine = (__ptw32_cleanup_callback_t)(_rout); \ + _cleanup.arg = (_arg); \ + __try \ + { \ + +#define pthread_cleanup_pop( _execute ) \ + } \ + __finally \ + { \ + if( _execute || AbnormalTermination()) \ + { \ + (*(_cleanup.routine))( _cleanup.arg ); \ + } \ + } \ + } + +#else /* __PTW32_CLEANUP_SEH */ + +#if defined(__PTW32_CLEANUP_C) + + /* + * C implementation of PThreads cancel cleanup + */ + +#define pthread_cleanup_push( _rout, _arg ) \ + { \ + __ptw32_cleanup_t _cleanup; \ + \ + __ptw32_push_cleanup( &_cleanup, (__ptw32_cleanup_callback_t) (_rout), (_arg) ); \ + +#define pthread_cleanup_pop( _execute ) \ + (void) __ptw32_pop_cleanup( _execute ); \ + } + +#else /* __PTW32_CLEANUP_C */ + +#if defined(__PTW32_CLEANUP_CXX) + + /* + * C++ version of cancel cleanup. + * - John E. Bossom. + */ + + class PThreadCleanup { + /* + * PThreadCleanup + * + * Purpose + * This class is a C++ helper class that is + * used to implement pthread_cleanup_push/ + * pthread_cleanup_pop. + * The destructor of this class automatically + * pops the pushed cleanup routine regardless + * of how the code exits the scope + * (i.e. such as by an exception) + */ + __ptw32_cleanup_callback_t cleanUpRout; + void * obj; + int executeIt; + + public: + PThreadCleanup() : + cleanUpRout( 0 ), + obj( 0 ), + executeIt( 0 ) + /* + * No cleanup performed + */ + { + } + + PThreadCleanup( + __ptw32_cleanup_callback_t routine, + void * arg ) : + cleanUpRout( routine ), + obj( arg ), + executeIt( 1 ) + /* + * Registers a cleanup routine for 'arg' + */ + { + } + + ~PThreadCleanup() + { + if ( executeIt && ((void *) cleanUpRout != (void *) 0) ) + { + (void) (*cleanUpRout)( obj ); + } + } + + void execute( int exec ) + { + executeIt = exec; + } + }; + + /* + * C++ implementation of PThreads cancel cleanup; + * This implementation takes advantage of a helper + * class who's destructor automatically calls the + * cleanup routine if we exit our scope weirdly + */ +#define pthread_cleanup_push( _rout, _arg ) \ + { \ + PThreadCleanup cleanup((__ptw32_cleanup_callback_t)(_rout), \ + (void *) (_arg) ); + +#define pthread_cleanup_pop( _execute ) \ + cleanup.execute( _execute ); \ + } + +#else + +#error ERROR [__FILE__, line __LINE__]: Cleanup type undefined. + +#endif /* __PTW32_CLEANUP_CXX */ + +#endif /* __PTW32_CLEANUP_C */ + +#endif /* __PTW32_CLEANUP_SEH */ + + +/* + * =============== + * =============== + * Methods + * =============== + * =============== + */ + +__PTW32_BEGIN_C_DECLS + +/* + * PThread Attribute Functions + */ +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_init (pthread_attr_t * attr); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_destroy (pthread_attr_t * attr); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_getaffinity_np (const pthread_attr_t * attr, + size_t cpusetsize, + cpu_set_t * cpuset); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_getdetachstate (const pthread_attr_t * attr, + int *detachstate); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_getstackaddr (const pthread_attr_t * attr, + void **stackaddr); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_getstacksize (const pthread_attr_t * attr, + size_t * stacksize); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_setaffinity_np (pthread_attr_t * attr, + size_t cpusetsize, + const cpu_set_t * cpuset); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_setdetachstate (pthread_attr_t * attr, + int detachstate); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_setstackaddr (pthread_attr_t * attr, + void *stackaddr); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_setstacksize (pthread_attr_t * attr, + size_t stacksize); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_getschedparam (const pthread_attr_t *attr, + struct sched_param *param); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_setschedparam (pthread_attr_t *attr, + const struct sched_param *param); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_setschedpolicy (pthread_attr_t *, + int); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_getschedpolicy (const pthread_attr_t *, + int *); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_setinheritsched(pthread_attr_t * attr, + int inheritsched); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_getinheritsched(const pthread_attr_t * attr, + int * inheritsched); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_setscope (pthread_attr_t *, + int); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_getscope (const pthread_attr_t *, + int *); + +/* + * PThread Functions + */ +__PTW32_DLLPORT int __PTW32_CDECL pthread_create (pthread_t * tid, + const pthread_attr_t * attr, + void * (__PTW32_CDECL *start) (void *), + void *arg); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_detach (pthread_t tid); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_equal (pthread_t t1, + pthread_t t2); + +__PTW32_DLLPORT void __PTW32_CDECL pthread_exit (void *value_ptr); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_join (pthread_t thread, + void **value_ptr); + +__PTW32_DLLPORT pthread_t __PTW32_CDECL pthread_self (void); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_cancel (pthread_t thread); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_setcancelstate (int state, + int *oldstate); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_setcanceltype (int type, + int *oldtype); + +__PTW32_DLLPORT void __PTW32_CDECL pthread_testcancel (void); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_once (pthread_once_t * once_control, + void (__PTW32_CDECL *init_routine) (void)); + +#if __PTW32_LEVEL >= __PTW32_LEVEL_MAX +__PTW32_DLLPORT __ptw32_cleanup_t * __PTW32_CDECL __ptw32_pop_cleanup (int execute); + +__PTW32_DLLPORT void __PTW32_CDECL __ptw32_push_cleanup (__ptw32_cleanup_t * cleanup, + __ptw32_cleanup_callback_t routine, + void *arg); +#endif /* __PTW32_LEVEL >= __PTW32_LEVEL_MAX */ + +/* + * Thread Specific Data Functions + */ +__PTW32_DLLPORT int __PTW32_CDECL pthread_key_create (pthread_key_t * key, + void (__PTW32_CDECL *destructor) (void *)); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_key_delete (pthread_key_t key); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_setspecific (pthread_key_t key, + const void *value); + +__PTW32_DLLPORT void * __PTW32_CDECL pthread_getspecific (pthread_key_t key); + + +/* + * Mutex Attribute Functions + */ +__PTW32_DLLPORT int __PTW32_CDECL pthread_mutexattr_init (pthread_mutexattr_t * attr); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_mutexattr_destroy (pthread_mutexattr_t * attr); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_mutexattr_getpshared (const pthread_mutexattr_t + * attr, + int *pshared); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_mutexattr_setpshared (pthread_mutexattr_t * attr, + int pshared); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_mutexattr_settype (pthread_mutexattr_t * attr, int kind); +__PTW32_DLLPORT int __PTW32_CDECL pthread_mutexattr_gettype (const pthread_mutexattr_t * attr, int *kind); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_mutexattr_setrobust( + pthread_mutexattr_t *attr, + int robust); +__PTW32_DLLPORT int __PTW32_CDECL pthread_mutexattr_getrobust( + const pthread_mutexattr_t * attr, + int * robust); + +/* + * Barrier Attribute Functions + */ +__PTW32_DLLPORT int __PTW32_CDECL pthread_barrierattr_init (pthread_barrierattr_t * attr); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_barrierattr_destroy (pthread_barrierattr_t * attr); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_barrierattr_getpshared (const pthread_barrierattr_t + * attr, + int *pshared); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_barrierattr_setpshared (pthread_barrierattr_t * attr, + int pshared); + +/* + * Mutex Functions + */ +__PTW32_DLLPORT int __PTW32_CDECL pthread_mutex_init (pthread_mutex_t * mutex, + const pthread_mutexattr_t * attr); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_mutex_destroy (pthread_mutex_t * mutex); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_mutex_lock (pthread_mutex_t * mutex); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_mutex_timedlock(pthread_mutex_t * mutex, + const struct timespec *abstime); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_mutex_trylock (pthread_mutex_t * mutex); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_mutex_unlock (pthread_mutex_t * mutex); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_mutex_consistent (pthread_mutex_t * mutex); + +/* + * Spinlock Functions + */ +__PTW32_DLLPORT int __PTW32_CDECL pthread_spin_init (pthread_spinlock_t * lock, int pshared); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_spin_destroy (pthread_spinlock_t * lock); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_spin_lock (pthread_spinlock_t * lock); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_spin_trylock (pthread_spinlock_t * lock); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_spin_unlock (pthread_spinlock_t * lock); + +/* + * Barrier Functions + */ +__PTW32_DLLPORT int __PTW32_CDECL pthread_barrier_init (pthread_barrier_t * barrier, + const pthread_barrierattr_t * attr, + unsigned int count); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_barrier_destroy (pthread_barrier_t * barrier); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_barrier_wait (pthread_barrier_t * barrier); + +/* + * Condition Variable Attribute Functions + */ +__PTW32_DLLPORT int __PTW32_CDECL pthread_condattr_init (pthread_condattr_t * attr); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_condattr_destroy (pthread_condattr_t * attr); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_condattr_getpshared (const pthread_condattr_t * attr, + int *pshared); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_condattr_setpshared (pthread_condattr_t * attr, + int pshared); + +/* + * Condition Variable Functions + */ +__PTW32_DLLPORT int __PTW32_CDECL pthread_cond_init (pthread_cond_t * cond, + const pthread_condattr_t * attr); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_cond_destroy (pthread_cond_t * cond); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_cond_wait (pthread_cond_t * cond, + pthread_mutex_t * mutex); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_cond_timedwait (pthread_cond_t * cond, + pthread_mutex_t * mutex, + const struct timespec *abstime); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_cond_signal (pthread_cond_t * cond); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_cond_broadcast (pthread_cond_t * cond); + +/* + * Scheduling + */ +__PTW32_DLLPORT int __PTW32_CDECL pthread_setschedparam (pthread_t thread, + int policy, + const struct sched_param *param); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_getschedparam (pthread_t thread, + int *policy, + struct sched_param *param); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_setconcurrency (int); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_getconcurrency (void); + +/* + * Read-Write Lock Functions + */ +__PTW32_DLLPORT int __PTW32_CDECL pthread_rwlock_init(pthread_rwlock_t *lock, + const pthread_rwlockattr_t *attr); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_rwlock_destroy(pthread_rwlock_t *lock); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_rwlock_tryrdlock(pthread_rwlock_t *); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_rwlock_trywrlock(pthread_rwlock_t *); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_rwlock_rdlock(pthread_rwlock_t *lock); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_rwlock_timedrdlock(pthread_rwlock_t *lock, + const struct timespec *abstime); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_rwlock_wrlock(pthread_rwlock_t *lock); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_rwlock_timedwrlock(pthread_rwlock_t *lock, + const struct timespec *abstime); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_rwlock_unlock(pthread_rwlock_t *lock); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_rwlockattr_init (pthread_rwlockattr_t * attr); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_rwlockattr_destroy (pthread_rwlockattr_t * attr); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_rwlockattr_getpshared (const pthread_rwlockattr_t * attr, + int *pshared); + +__PTW32_DLLPORT int __PTW32_CDECL pthread_rwlockattr_setpshared (pthread_rwlockattr_t * attr, + int pshared); + +#if __PTW32_LEVEL >= __PTW32_LEVEL_MAX - 1 + +/* + * Signal Functions. Should be defined in but MSVC and MinGW32 + * already have signal.h that don't define these. + */ +__PTW32_DLLPORT int __PTW32_CDECL pthread_kill(pthread_t thread, int sig); + +/* + * Non-portable functions + */ + +/* + * Compatibility with Linux. + */ +__PTW32_DLLPORT int __PTW32_CDECL pthread_mutexattr_setkind_np(pthread_mutexattr_t * attr, + int kind); +__PTW32_DLLPORT int __PTW32_CDECL pthread_mutexattr_getkind_np(pthread_mutexattr_t * attr, + int *kind); +__PTW32_DLLPORT int __PTW32_CDECL pthread_timedjoin_np(pthread_t thread, + void **value_ptr, + const struct timespec *abstime); +__PTW32_DLLPORT int __PTW32_CDECL pthread_tryjoin_np(pthread_t thread, + void **value_ptr); +__PTW32_DLLPORT int __PTW32_CDECL pthread_setaffinity_np(pthread_t thread, + size_t cpusetsize, + const cpu_set_t *cpuset); +__PTW32_DLLPORT int __PTW32_CDECL pthread_getaffinity_np(pthread_t thread, + size_t cpusetsize, + cpu_set_t *cpuset); + +/* + * Possibly supported by other POSIX threads implementations + */ +__PTW32_DLLPORT int __PTW32_CDECL pthread_delay_np (struct timespec * interval); +__PTW32_DLLPORT int __PTW32_CDECL pthread_num_processors_np(void); +__PTW32_DLLPORT unsigned __int64 __PTW32_CDECL pthread_getunique_np(pthread_t thread); + +/* + * Useful if an application wants to statically link + * the lib rather than load the DLL at run-time. + */ +__PTW32_DLLPORT int __PTW32_CDECL pthread_win32_process_attach_np(void); +__PTW32_DLLPORT int __PTW32_CDECL pthread_win32_process_detach_np(void); +__PTW32_DLLPORT int __PTW32_CDECL pthread_win32_thread_attach_np(void); +__PTW32_DLLPORT int __PTW32_CDECL pthread_win32_thread_detach_np(void); + +/* + * Returns the first parameter "abstime" modified to represent the current system time. + * If "relative" is not NULL it represents an interval to add to "abstime". + */ + +__PTW32_DLLPORT struct timespec * __PTW32_CDECL pthread_win32_getabstime_np( + struct timespec * abstime, + const struct timespec * relative); + +/* + * Features that are auto-detected at load/run time. + */ +__PTW32_DLLPORT int __PTW32_CDECL pthread_win32_test_features_np(int); +enum __ptw32_features +{ + __PTW32_SYSTEM_INTERLOCKED_COMPARE_EXCHANGE = 0x0001, /* System provides it. */ + __PTW32_ALERTABLE_ASYNC_CANCEL = 0x0002 /* Can cancel blocked threads. */ +}; + +/* + * Register a system time change with the library. + * Causes the library to perform various functions + * in response to the change. Should be called whenever + * the application's top level window receives a + * WM_TIMECHANGE message. It can be passed directly to + * pthread_create() as a new thread if desired. + */ +__PTW32_DLLPORT void * __PTW32_CDECL pthread_timechange_handler_np(void *); + +#endif /* __PTW32_LEVEL >= __PTW32_LEVEL_MAX - 1 */ + +#if __PTW32_LEVEL >= __PTW32_LEVEL_MAX + +/* + * Returns the Win32 HANDLE for the POSIX thread. + */ +__PTW32_DLLPORT void * __PTW32_CDECL pthread_getw32threadhandle_np(pthread_t thread); +/* + * Returns the win32 thread ID for POSIX thread. + */ +__PTW32_DLLPORT unsigned long __PTW32_CDECL pthread_getw32threadid_np (pthread_t thread); + +/* + * Sets the POSIX thread name. If _MSC_VER is defined the name should be displayed by + * the MSVS debugger. + */ +#if defined (__PTW32_COMPATIBILITY_BSD) || defined (__PTW32_COMPATIBILITY_TRU64) +#define PTHREAD_MAX_NAMELEN_NP 16 +__PTW32_DLLPORT int __PTW32_CDECL pthread_setname_np (pthread_t thr, const char * name, void * arg); +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_setname_np (pthread_attr_t * attr, const char * name, void * arg); +#else +__PTW32_DLLPORT int __PTW32_CDECL pthread_setname_np (pthread_t thr, const char * name); +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_setname_np (pthread_attr_t * attr, const char * name); +#endif + +__PTW32_DLLPORT int __PTW32_CDECL pthread_getname_np (pthread_t thr, char * name, int len); +__PTW32_DLLPORT int __PTW32_CDECL pthread_attr_getname_np (pthread_attr_t * attr, char * name, int len); + + +/* + * Protected Methods + * + * This function blocks until the given WIN32 handle + * is signalled or pthread_cancel had been called. + * This function allows the caller to hook into the + * PThreads cancel mechanism. It is implemented using + * + * WaitForMultipleObjects + * + * on 'waitHandle' and a manually reset WIN32 Event + * used to implement pthread_cancel. The 'timeout' + * argument to TimedWait is simply passed to + * WaitForMultipleObjects. + */ +__PTW32_DLLPORT int __PTW32_CDECL pthreadCancelableWait (void *waitHandle); +__PTW32_DLLPORT int __PTW32_CDECL pthreadCancelableTimedWait (void *waitHandle, + unsigned long timeout); + +#endif /* __PTW32_LEVEL >= __PTW32_LEVEL_MAX */ + +/* + * Declare a thread-safe errno for Open Watcom + * (note: this has not been tested in a long time) + */ +#if defined(__WATCOMC__) && !defined(errno) +# if defined(_MT) || defined(_DLL) + __declspec(dllimport) extern int * __cdecl _errno(void); +# define errno (*_errno()) +# endif +#endif + +#if defined (__PTW32_USES_SEPARATE_CRT) && (defined(__PTW32_CLEANUP_CXX) || defined(__PTW32_CLEANUP_SEH)) +typedef void (*__ptw32_terminate_handler)(); +__PTW32_DLLPORT __ptw32_terminate_handler __PTW32_CDECL pthread_win32_set_terminate_np(__ptw32_terminate_handler termFunction); +#endif + +#if defined(__cplusplus) + +/* + * Internal exceptions + */ +class __ptw32_exception {}; +class __ptw32_exception_cancel : public __ptw32_exception {}; +class __ptw32_exception_exit : public __ptw32_exception {}; + +#endif + +#if __PTW32_LEVEL >= __PTW32_LEVEL_MAX + +/* FIXME: This is only required if the library was built using SEH */ +/* + * Get internal SEH tag + */ +__PTW32_DLLPORT unsigned long __PTW32_CDECL __ptw32_get_exception_services_code(void); + +#endif /* __PTW32_LEVEL >= __PTW32_LEVEL_MAX */ + +#if !defined (__PTW32_BUILD) + +#if defined(__PTW32_CLEANUP_SEH) + +/* + * Redefine the SEH __except keyword to ensure that applications + * propagate our internal exceptions up to the library's internal handlers. + */ +#define __except( E ) \ + __except( ( GetExceptionCode() == __ptw32_get_exception_services_code() ) \ + ? EXCEPTION_CONTINUE_SEARCH : ( E ) ) + +#endif /* __PTW32_CLEANUP_SEH */ + +#if defined(__PTW32_CLEANUP_CXX) + +/* + * Redefine the C++ catch keyword to ensure that applications + * propagate our internal exceptions up to the library's internal handlers. + */ +#if defined(_MSC_VER) + /* + * WARNING: Replace any 'catch( ... )' with '__PtW32CatchAll' + * if you want Pthread-Win32 cancellation and pthread_exit to work. + */ + +#if !defined(__PtW32NoCatchWarn) + +#pragma message("Specify \"/D__PtW32NoCatchWarn\" compiler flag to skip this message.") +#pragma message("------------------------------------------------------------------") +#pragma message("When compiling applications with MSVC++ and C++ exception handling:") +#pragma message(" Replace any 'catch( ... )' in routines called from POSIX threads") +#pragma message(" with '__PtW32CatchAll' or 'CATCHALL' if you want POSIX thread") +#pragma message(" cancellation and pthread_exit to work. For example:") +#pragma message("") +#pragma message(" #if defined(__PtW32CatchAll)") +#pragma message(" __PtW32CatchAll") +#pragma message(" #else") +#pragma message(" catch(...)") +#pragma message(" #endif") +#pragma message(" {") +#pragma message(" /* Catchall block processing */") +#pragma message(" }") +#pragma message("------------------------------------------------------------------") + +#endif + +#define __PtW32CatchAll \ + catch( __ptw32_exception & ) { throw; } \ + catch( ... ) + +#else /* _MSC_VER */ + +#define catch( E ) \ + catch( __ptw32_exception & ) { throw; } \ + catch( E ) + +#endif /* _MSC_VER */ + +#endif /* __PTW32_CLEANUP_CXX */ + +#endif /* ! __PTW32_BUILD */ + +__PTW32_END_C_DECLS + +#undef __PTW32_LEVEL +#undef __PTW32_LEVEL_MAX + +#endif /* ! RC_INVOKED */ + +#endif /* PTHREAD_H */ diff --git a/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/include/sched.h b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/include/sched.h new file mode 100644 index 0000000..81630d9 --- /dev/null +++ b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/include/sched.h @@ -0,0 +1,235 @@ +/* + * Module: sched.h + * + * Purpose: + * Provides an implementation of POSIX realtime extensions + * as defined in + * + * POSIX 1003.1b-1993 (POSIX.1b) + * + * -------------------------------------------------------------------------- + * + * Pthreads4w - POSIX Threads for Windows + * Copyright 1998 John E. Bossom + * Copyright 1999-2018, Pthreads4w contributors + * + * Homepage: https://sourceforge.net/projects/pthreads4w/ + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * + * https://sourceforge.net/p/pthreads4w/wiki/Contributors/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#if !defined(_SCHED_H) +#define _SCHED_H +#define __SCHED_H_SOURCED__ + +#include <_ptw32.h> + +/* We need a typedef for pid_t, (and POSIX requires to + * define it, as it is defined in , but it does NOT + * sanction exposure of everything from ); there is + * no pid_t in Windows anyway, (except that MinGW does define it + * in their ), so just provide a suitable typedef, + * but note that we must do so cautiously, to avoid a typedef + * conflict if MinGW's is also #included: + */ +#if ! defined __MINGW32__ || ! defined __have_typedef_pid_t + +# if defined __MINGW64__ + typedef __int64 pid_t; +# else + typedef int pid_t; +#endif + +#if __GNUC__ < 4 +/* GCC v4.0 and later, (as used by MinGW), allows us to repeat a + * typedef, provided every duplicate is consistent; only set this + * multiple definition guard when we cannot be certain that it is + * permissable to repeat typedefs. + */ +#define __have_typedef_pid_t 1 +#endif +#endif + +/* POSIX.1-1993 says that WILL expose all of + */ +#undef __SCHED_H_SOURCED__ +#if _POSIX_C_SOURCE >= 200112L +/* POSIX.1-2001 and later revises this to say only that it MAY do so; + * only struct timespec, and associated time_t are actually required, + * so prefer to be selective; (MinGW.org's offers an option + * for selective #inclusion, when __SCHED_H_SOURCED__ is defined): + */ +#define __SCHED_H_SOURCED__ +#define __need_struct_timespec +#define __need_time_t +#endif +#include + +#if defined __MINGW64__ || _MSC_VER >= 1900 +/* These are known to define struct timespec, when has been + * #included, but may not, (probably don't), follow the convention of + * defining __struct_timespec_defined, as adopted by MinGW.org; for + * these cases, we unconditionally assume that struct timespec has + * been defined, otherwise, if MinGW.org's criterion has not been + * satisfied... + */ +#elif ! defined __struct_timespec_defined +# ifndef _TIMESPEC_DEFINED +# define _TIMESPEC_DEFINED +struct timespec +{ /* ...we fall back on this explicit definition. + */ + time_t tv_sec; + int tv_nsec; +}; +# endif +#endif + +/* + * Microsoft VC++6.0 lacks these *_PTR types + */ +#if defined(_MSC_VER) && _MSC_VER < 1300 && !defined (__PTW32_HAVE_DWORD_PTR) +typedef unsigned long ULONG_PTR; +typedef ULONG_PTR DWORD_PTR; +#endif + +/* Thread scheduling policies */ + +enum +{ SCHED_OTHER = 0, + SCHED_FIFO, + SCHED_RR, + SCHED_MIN = SCHED_OTHER, + SCHED_MAX = SCHED_RR +}; + +struct sched_param +{ int sched_priority; +}; + +/* + * CPU affinity + * + * cpu_set_t: + * Considered opaque but cannot be an opaque pointer due to the need for + * compatibility with GNU systems and sched_setaffinity() et.al., which + * include the cpusetsize parameter "normally set to sizeof(cpu_set_t)". + * + * FIXME: These are GNU, and NOT specified by POSIX; maybe consider + * occluding them within a _GNU_SOURCE (or similar) feature test. + */ + +#define CPU_SETSIZE (sizeof(size_t)*8) + +#define CPU_COUNT(setptr) (_sched_affinitycpucount(setptr)) + +#define CPU_ZERO(setptr) (_sched_affinitycpuzero(setptr)) + +#define CPU_SET(cpu, setptr) (_sched_affinitycpuset((cpu),(setptr))) + +#define CPU_CLR(cpu, setptr) (_sched_affinitycpuclr((cpu),(setptr))) + +#define CPU_ISSET(cpu, setptr) (_sched_affinitycpuisset((cpu),(setptr))) + +#define CPU_AND(destsetptr, srcset1ptr, srcset2ptr) (_sched_affinitycpuand((destsetptr),(srcset1ptr),(srcset2ptr))) + +#define CPU_OR(destsetptr, srcset1ptr, srcset2ptr) (_sched_affinitycpuor((destsetptr),(srcset1ptr),(srcset2ptr))) + +#define CPU_XOR(destsetptr, srcset1ptr, srcset2ptr) \ + (_sched_affinitycpuxor((destsetptr),(srcset1ptr),(srcset2ptr))) + +#define CPU_EQUAL(set1ptr, set2ptr) (_sched_affinitycpuequal((set1ptr),(set2ptr))) + +typedef union +{ char cpuset[CPU_SETSIZE/8]; + size_t _align; +} cpu_set_t; + +__PTW32_BEGIN_C_DECLS + +__PTW32_DLLPORT int __PTW32_CDECL sched_yield (void); + +__PTW32_DLLPORT int __PTW32_CDECL sched_get_priority_min (int policy); + +__PTW32_DLLPORT int __PTW32_CDECL sched_get_priority_max (int policy); + +/* FIXME: this declaration of sched_setscheduler() is NOT as prescribed + * by POSIX; it lacks const struct sched_param * as third argument. + */ +__PTW32_DLLPORT int __PTW32_CDECL sched_setscheduler (pid_t pid, int policy); + +/* FIXME: In addition to the above five functions, POSIX also requires: + * + * int sched_getparam (pid_t, struct sched_param *); + * int sched_setparam (pid_t, const struct sched_param *); + * + * both of which are conspicuous by their absence here! + */ + +/* Compatibility with Linux - not standard in POSIX + * FIXME: consider occluding within a _GNU_SOURCE (or similar) feature test. + */ +__PTW32_DLLPORT int __PTW32_CDECL sched_setaffinity (pid_t pid, size_t cpusetsize, cpu_set_t *mask); + +__PTW32_DLLPORT int __PTW32_CDECL sched_getaffinity (pid_t pid, size_t cpusetsize, cpu_set_t *mask); + +/* + * Support routines and macros for cpu_set_t + */ +__PTW32_DLLPORT int __PTW32_CDECL _sched_affinitycpucount (const cpu_set_t *set); + +__PTW32_DLLPORT void __PTW32_CDECL _sched_affinitycpuzero (cpu_set_t *pset); + +__PTW32_DLLPORT void __PTW32_CDECL _sched_affinitycpuset (int cpu, cpu_set_t *pset); + +__PTW32_DLLPORT void __PTW32_CDECL _sched_affinitycpuclr (int cpu, cpu_set_t *pset); + +__PTW32_DLLPORT int __PTW32_CDECL _sched_affinitycpuisset (int cpu, const cpu_set_t *pset); + +__PTW32_DLLPORT void __PTW32_CDECL _sched_affinitycpuand(cpu_set_t *pdestset, const cpu_set_t *psrcset1, const cpu_set_t *psrcset2); + +__PTW32_DLLPORT void __PTW32_CDECL _sched_affinitycpuor(cpu_set_t *pdestset, const cpu_set_t *psrcset1, const cpu_set_t *psrcset2); + +__PTW32_DLLPORT void __PTW32_CDECL _sched_affinitycpuxor(cpu_set_t *pdestset, const cpu_set_t *psrcset1, const cpu_set_t *psrcset2); + +__PTW32_DLLPORT int __PTW32_CDECL _sched_affinitycpuequal (const cpu_set_t *pset1, const cpu_set_t *pset2); + +/* Note that this macro returns ENOTSUP rather than ENOSYS, as + * might be expected. However, returning ENOSYS should mean that + * sched_get_priority_{min,max} are not implemented as well as + * sched_rr_get_interval. This is not the case, since we just + * don't support round-robin scheduling. Therefore I have chosen + * to return the same value as sched_setscheduler when SCHED_RR + * is passed to it. + * + * FIXME: POSIX requires this to be defined as a function; this + * macro implementation is permitted IN ADDITION to the function, + * but the macro alone is not POSIX compliant! Worse still, it + * imposes a requirement on the caller, to ensure that both the + * declaration of errno, and the definition of ENOTSUP, are in + * scope at point of call, (which it may wish to do anyway, but + * POSIX imposes no such constraint)! + */ +#define sched_rr_get_interval(_pid, _interval) \ + ( errno = ENOTSUP, (int) -1 ) + +__PTW32_END_C_DECLS + +#undef __SCHED_H_SOURCED__ +#endif /* !_SCHED_H */ diff --git a/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/include/semaphore.h b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/include/semaphore.h new file mode 100644 index 0000000..f3eaa18 --- /dev/null +++ b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/include/semaphore.h @@ -0,0 +1,116 @@ +/* + * Module: semaphore.h + * + * Purpose: + * Semaphores aren't actually part of the PThreads standard. + * They are defined by the POSIX Standard: + * + * POSIX 1003.1b-1993 (POSIX.1b) + * + * -------------------------------------------------------------------------- + * + * Pthreads4w - POSIX Threads for Windows + * Copyright 1998 John E. Bossom + * Copyright 1999-2018, Pthreads4w contributors + * + * Homepage: https://sourceforge.net/projects/pthreads4w/ + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * + * https://sourceforge.net/p/pthreads4w/wiki/Contributors/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#if !defined( SEMAPHORE_H ) +#define SEMAPHORE_H + +/* FIXME: POSIX.1 says that _POSIX_SEMAPHORES should be defined + * in , not here; for later POSIX.1 versions, its value + * should match the corresponding _POSIX_VERSION number, but in + * the case of POSIX.1b-1993, the value is unspecified. + * + * Notwithstanding the above, since POSIX semaphores, (and indeed + * having any to #include), are not a standard feature + * on MS-Windows, it is convenient to retain this definition here; + * we may consider adding a hook, to make it selectively available + * for inclusion by , in those cases (e.g. MinGW) where + * is provided. + */ +#define _POSIX_SEMAPHORES + +/* Internal macros, common to the public interfaces for various + * pthreads-win32 components, are defined in <_ptw32.h>; we must + * include them here. + */ +#include <_ptw32.h> + +/* The sem_timedwait() function was added in POSIX.1-2001; it + * requires struct timespec to be defined, at least as a partial + * (a.k.a. incomplete) data type. Forward declare it as such, + * then include selectively, to acquire a complete + * definition, (if available). + */ +struct timespec; +#define __need_struct_timespec +#include + +/* The data type used to represent our semaphore implementation, + * as required by POSIX.1; FIXME: consider renaming the underlying + * structure tag, to avoid possible pollution of user namespace. + */ +typedef struct sem_t_ * sem_t; + +/* POSIX.1b (and later) mandates SEM_FAILED as the value to be + * returned on failure of sem_open(); (our implementation is a + * stub, which will always return this). + */ +#define SEM_FAILED (sem_t *)(-1) + +__PTW32_BEGIN_C_DECLS + +/* Function prototypes: some are implemented as stubs, which + * always fail; (FIXME: identify them). + */ +__PTW32_DLLPORT int __PTW32_CDECL sem_init (sem_t * sem, + int pshared, + unsigned int value); + +__PTW32_DLLPORT int __PTW32_CDECL sem_destroy (sem_t * sem); + +__PTW32_DLLPORT int __PTW32_CDECL sem_trywait (sem_t * sem); + +__PTW32_DLLPORT int __PTW32_CDECL sem_wait (sem_t * sem); + +__PTW32_DLLPORT int __PTW32_CDECL sem_timedwait (sem_t * sem, + const struct timespec * abstime); + +__PTW32_DLLPORT int __PTW32_CDECL sem_post (sem_t * sem); + +__PTW32_DLLPORT int __PTW32_CDECL sem_post_multiple (sem_t * sem, + int count); + +__PTW32_DLLPORT sem_t * __PTW32_CDECL sem_open (const char *, int, ...); + +__PTW32_DLLPORT int __PTW32_CDECL sem_close (sem_t * sem); + +__PTW32_DLLPORT int __PTW32_CDECL sem_unlink (const char * name); + +__PTW32_DLLPORT int __PTW32_CDECL sem_getvalue (sem_t * sem, + int * sval); + +__PTW32_END_C_DECLS + +#endif /* !SEMAPHORE_H */ diff --git a/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/lib/pthreadVC3.lib b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/lib/pthreadVC3.lib new file mode 100644 index 0000000000000000000000000000000000000000..ede08a8cc7666878f2e31cfe542b06e79a5d3a32 GIT binary patch literal 34750 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 literal 0 HcmV?d00001 diff --git a/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/lib/pthreadVCE3.lib b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/lib/pthreadVCE3.lib new file mode 100644 index 0000000000000000000000000000000000000000..282c236c812e2639fc430cb1aed421d7b43edca4 GIT binary patch literal 34898 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 Ma*v0_9&7FOf0i+d{r~^~ literal 0 HcmV?d00001 diff --git a/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/share/pthread/vcpkg-cmake-wrapper.cmake b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/share/pthread/vcpkg-cmake-wrapper.cmake new file mode 100644 index 0000000..12d390a --- /dev/null +++ b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/share/pthread/vcpkg-cmake-wrapper.cmake @@ -0,0 +1,224 @@ +#.rst: +# PThreads4W config wrap for vcpkg +# ------------ +# +# Find the PThread4W includes and library. +# +# Result Variables +# ^^^^^^^^^^^^^^^^ +# +# This script defines the following variables: +# +# ``PThreads4W_FOUND`` +# True if PThreads4W library found +# +# ``PThreads4W_VERSION`` +# Containing the PThreads4W version tag (manually defined) +# +# ``PThreads4W_INCLUDE_DIR`` +# Location of PThreads4W headers +# +# ``PThreads4W_LIBRARY`` +# List of libraries to link with when using PThreads4W (no exception handling) +# +# ``PThreads4W_CXXEXC_LIBRARY`` +# List of libraries to link with when using PThreads4W (C++ exception handling) +# +# ``PThreads4W_STRUCTEXC_LIBRARY`` +# List of libraries to link with when using PThreads4W (struct exception handling) +# +# Result Targets +# ^^^^^^^^^^^^^^^^ +# +# This script defines the following targets: +# +# ``PThreads4W::PThreads4W`` +# Target to use PThreads4W (no exception handling) +# +# ``PThreads4W::PThreads4W_CXXEXC`` +# Target to use PThreads4W (C++ exception handling) +# +# ``PThreads4W::PThreads4W_STRUCTEXC`` +# Target to use PThreads4W (struct exception handling) +# + +include(${CMAKE_ROOT}/Modules/FindPackageHandleStandardArgs.cmake) +include(${CMAKE_ROOT}/Modules/SelectLibraryConfigurations.cmake) + +if(NOT PThreads4W_INCLUDE_DIR) + find_path(PThreads4W_INCLUDE_DIR NAMES pthread.h) +endif() + +set(PThreads4W_MAJOR_VERSION 3) +set(PThreads4W_MINOR_VERSION 0) +set(PThreads4W_PATCH_VERSION 0) +set(PThreads4W_VERSION "${PThreads4W_MAJOR_VERSION}.${PThreads4W_MINOR_VERSION}.${PThreads4W_PATCH_VERSION}") + +# Allow libraries to be set manually +if(NOT PThreads4W_LIBRARY) + find_library(PThreads4W_LIBRARY_RELEASE NAMES pthreadVC${PThreads4W_MAJOR_VERSION}) + find_library(PThreads4W_LIBRARY_DEBUG NAMES pthreadVC${PThreads4W_MAJOR_VERSION}d) + select_library_configurations(PThreads4W) +endif() +if(NOT PThreads4W_CXXEXC_LIBRARY) + find_library(PThreads4W_CXXEXC_LIBRARY_RELEASE NAMES pthreadVCE${PThreads4W_MAJOR_VERSION}) + find_library(PThreads4W_CXXEXC_LIBRARY_DEBUG NAMES pthreadVCE${PThreads4W_MAJOR_VERSION}d) + select_library_configurations(PThreads4W_CXXEXC) +endif() +if(NOT PThreads4W_STRUCTEXC_LIBRARY) + find_library(PThreads4W_STRUCTEXC_LIBRARY_RELEASE NAMES pthreadVSE${PThreads4W_MAJOR_VERSION}) + find_library(PThreads4W_STRUCTEXC_LIBRARY_DEBUG NAMES pthreadVSE${PThreads4W_MAJOR_VERSION}d) + select_library_configurations(PThreads4W_STRUCTEXC) +endif() + +find_package_handle_standard_args(PThreads4W DEFAULT_MSG PThreads4W_LIBRARY PThreads4W_CXXEXC_LIBRARY PThreads4W_STRUCTEXC_LIBRARY PThreads4W_INCLUDE_DIR) +mark_as_advanced(PThreads4W_INCLUDE_DIR PThreads4W_LIBRARY PThreads4W_CXXEXC_LIBRARY PThreads4W_STRUCTEXC_LIBRARY) + +set(PThreads4W_DLL_DIR ${PThreads4W_INCLUDE_DIR}) +list(TRANSFORM PThreads4W_DLL_DIR APPEND "/../bin") +message(STATUS "PThreads4W_DLL_DIR: ${PThreads4W_DLL_DIR}") + +find_file(PThreads4W_LIBRARY_RELEASE_DLL NAMES pthreadVC${PThreads4W_MAJOR_VERSION}.dll PATHS ${PThreads4W_DLL_DIR}) +find_file(PThreads4W_LIBRARY_DEBUG_DLL NAMES pthreadVC${PThreads4W_MAJOR_VERSION}d.dll PATHS ${PThreads4W_DLL_DIR}) +find_file(PThreads4W_CXXEXC_LIBRARY_RELEASE_DLL NAMES pthreadVCE${PThreads4W_MAJOR_VERSION}.dll PATHS ${PThreads4W_DLL_DIR}) +find_file(PThreads4W_CXXEXC_LIBRARY_DEBUG_DLL NAMES pthreadVCE${PThreads4W_MAJOR_VERSION}d.dll PATHS ${PThreads4W_DLL_DIR}) +find_file(PThreads4W_STRUCTEXC_LIBRARY_RELEASE_DLL NAMES pthreadVSE${PThreads4W_MAJOR_VERSION}.dll PATHS ${PThreads4W_DLL_DIR}) +find_file(PThreads4W_STRUCTEXC_LIBRARY_DEBUG_DLL NAMES pthreadVSE${PThreads4W_MAJOR_VERSION}d.dll PATHS ${PThreads4W_DLL_DIR}) + +#Compatibility definitions, deprecated +set(PTHREAD_INCLUDE_DIR ${PThreads4W_INCLUDE_DIR} CACHE PATH "") +set(PTHREADS_INCLUDE_DIR ${PThreads4W_INCLUDE_DIR} CACHE PATH "") +set(PThreads_windows_INCLUDE_DIR ${PThreads4W_INCLUDE_DIR} CACHE PATH "") +set(PTHREAD_LIBRARIES ${PThreads4W_LIBRARY} CACHE STRING "") +set(PTHREADS_LIBRARIES ${PThreads4W_LIBRARY} CACHE STRING "") +set(PTHREAD_LIBRARY ${PThreads4W_LIBRARY} CACHE STRING "") +set(PTHREADS_LIBRARY ${PThreads4W_LIBRARY} CACHE STRING "") +set(LIBPTHREAD ${PThreads4W_LIBRARY} CACHE STRING "") +set(LIBPTHREADS ${PThreads4W_LIBRARY} CACHE STRING "") +set(PThreads_windows_LIBRARY ${PThreads4W_LIBRARY} CACHE STRING "") +set(PThreads_VERSION "${PThreads4W_VERSION}") +if(PThreads4W_FOUND) + set(PThreads_windows_FOUND TRUE) +endif() + +#TARGETS +if( PThreads4W_FOUND AND NOT TARGET PThreads4W::PThreads4W_CXXEXC ) + if( EXISTS "${PThreads4W_CXXEXC_LIBRARY_RELEASE_DLL}" ) + add_library( PThreads4W::PThreads4W_CXXEXC SHARED IMPORTED ) + set_target_properties( PThreads4W::PThreads4W_CXXEXC PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_CXXEXC_LIBRARY_RELEASE_DLL}" + IMPORTED_IMPLIB "${PThreads4W_CXXEXC_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_CXXEXC_LIBRARY_DEBUG_DLL}" ) + set_property( TARGET PThreads4W::PThreads4W_CXXEXC APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads4W::PThreads4W_CXXEXC PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_CXXEXC_LIBRARY_DEBUG_DLL}" + IMPORTED_IMPLIB_DEBUG "${PThreads4W_CXXEXC_LIBRARY_DEBUG}" ) + endif() + else() + add_library( PThreads4W::PThreads4W_CXXEXC UNKNOWN IMPORTED ) + set_target_properties( PThreads4W::PThreads4W_CXXEXC PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_CXXEXC_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_CXXEXC_LIBRARY_DEBUG}" ) + set_property( TARGET PThreads4W::PThreads4W_CXXEXC APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads4W::PThreads4W_CXXEXC PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_CXXEXC_LIBRARY_DEBUG}" ) + endif() + endif() +endif() + +if( PThreads4W_FOUND AND NOT TARGET PThreads4W::PThreads4W_STRUCTEXC ) + if( EXISTS "${PThreads4W_STRUCTEXC_LIBRARY_RELEASE_DLL}" ) + add_library( PThreads4W::PThreads4W_STRUCTEXC SHARED IMPORTED ) + set_target_properties( PThreads4W::PThreads4W_STRUCTEXC PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_STRUCTEXC_LIBRARY_RELEASE_DLL}" + IMPORTED_IMPLIB "${PThreads4W_STRUCTEXC_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_STRUCTEXC_LIBRARY_DEBUG_DLL}" ) + set_property( TARGET PThreads4W::PThreads4W_STRUCTEXC APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads4W::PThreads4W_STRUCTEXC PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_STRUCTEXC_LIBRARY_DEBUG_DLL}" + IMPORTED_IMPLIB_DEBUG "${PThreads4W_STRUCTEXC_LIBRARY_DEBUG}" ) + endif() + else() + add_library( PThreads4W::PThreads4W_STRUCTEXC UNKNOWN IMPORTED ) + set_target_properties( PThreads4W::PThreads4W_STRUCTEXC PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_STRUCTEXC_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_STRUCTEXC_LIBRARY_DEBUG}" ) + set_property( TARGET PThreads4W::PThreads4W_STRUCTEXC APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads4W::PThreads4W_STRUCTEXC PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_STRUCTEXC_LIBRARY_DEBUG}" ) + endif() + endif() +endif() + +if( PThreads4W_FOUND AND NOT TARGET PThreads4W::PThreads4W ) + if( EXISTS "${PThreads4W_LIBRARY_RELEASE_DLL}" ) + add_library( PThreads4W::PThreads4W SHARED IMPORTED ) + set_target_properties( PThreads4W::PThreads4W PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_LIBRARY_RELEASE_DLL}" + IMPORTED_IMPLIB "${PThreads4W_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_LIBRARY_DEBUG_DLL}" ) + set_property( TARGET PThreads4W::PThreads4W APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads4W::PThreads4W PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_LIBRARY_DEBUG_DLL}" + IMPORTED_IMPLIB_DEBUG "${PThreads4W_LIBRARY_DEBUG}" ) + endif() + else() + add_library( PThreads4W::PThreads4W UNKNOWN IMPORTED ) + set_target_properties( PThreads4W::PThreads4W PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_LIBRARY_DEBUG}" ) + set_property( TARGET PThreads4W::PThreads4W APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads4W::PThreads4W PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_LIBRARY_DEBUG}" ) + endif() + endif() +endif() + +#Compatibility targets, deprecated +if( PThreads4W_FOUND AND NOT TARGET PThreads_windows::PThreads_windows ) + if( EXISTS "${PThreads4W_LIBRARY_RELEASE_DLL}" ) + add_library( PThreads_windows::PThreads_windows SHARED IMPORTED ) + set_target_properties( PThreads_windows::PThreads_windows PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_LIBRARY_RELEASE_DLL}" + IMPORTED_IMPLIB "${PThreads4W_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_LIBRARY_DEBUG_DLL}" ) + set_property( TARGET PThreads_windows::PThreads_windows APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads_windows::PThreads_windows PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_LIBRARY_DEBUG_DLL}" + IMPORTED_IMPLIB_DEBUG "${PThreads4W_LIBRARY_DEBUG}" ) + endif() + else() + add_library( PThreads_windows::PThreads_windows UNKNOWN IMPORTED ) + set_target_properties( PThreads_windows::PThreads_windows PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_LIBRARY_DEBUG}" ) + set_property( TARGET PThreads_windows::PThreads_windows APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads_windows::PThreads_windows PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_LIBRARY_DEBUG}" ) + endif() + endif() +endif() diff --git a/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/share/pthreads/copyright b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/share/pthreads/copyright new file mode 100644 index 0000000..7a4a3ea --- /dev/null +++ b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/share/pthreads/copyright @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/share/pthreads/vcpkg-cmake-wrapper.cmake b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/share/pthreads/vcpkg-cmake-wrapper.cmake new file mode 100644 index 0000000..12d390a --- /dev/null +++ b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/share/pthreads/vcpkg-cmake-wrapper.cmake @@ -0,0 +1,224 @@ +#.rst: +# PThreads4W config wrap for vcpkg +# ------------ +# +# Find the PThread4W includes and library. +# +# Result Variables +# ^^^^^^^^^^^^^^^^ +# +# This script defines the following variables: +# +# ``PThreads4W_FOUND`` +# True if PThreads4W library found +# +# ``PThreads4W_VERSION`` +# Containing the PThreads4W version tag (manually defined) +# +# ``PThreads4W_INCLUDE_DIR`` +# Location of PThreads4W headers +# +# ``PThreads4W_LIBRARY`` +# List of libraries to link with when using PThreads4W (no exception handling) +# +# ``PThreads4W_CXXEXC_LIBRARY`` +# List of libraries to link with when using PThreads4W (C++ exception handling) +# +# ``PThreads4W_STRUCTEXC_LIBRARY`` +# List of libraries to link with when using PThreads4W (struct exception handling) +# +# Result Targets +# ^^^^^^^^^^^^^^^^ +# +# This script defines the following targets: +# +# ``PThreads4W::PThreads4W`` +# Target to use PThreads4W (no exception handling) +# +# ``PThreads4W::PThreads4W_CXXEXC`` +# Target to use PThreads4W (C++ exception handling) +# +# ``PThreads4W::PThreads4W_STRUCTEXC`` +# Target to use PThreads4W (struct exception handling) +# + +include(${CMAKE_ROOT}/Modules/FindPackageHandleStandardArgs.cmake) +include(${CMAKE_ROOT}/Modules/SelectLibraryConfigurations.cmake) + +if(NOT PThreads4W_INCLUDE_DIR) + find_path(PThreads4W_INCLUDE_DIR NAMES pthread.h) +endif() + +set(PThreads4W_MAJOR_VERSION 3) +set(PThreads4W_MINOR_VERSION 0) +set(PThreads4W_PATCH_VERSION 0) +set(PThreads4W_VERSION "${PThreads4W_MAJOR_VERSION}.${PThreads4W_MINOR_VERSION}.${PThreads4W_PATCH_VERSION}") + +# Allow libraries to be set manually +if(NOT PThreads4W_LIBRARY) + find_library(PThreads4W_LIBRARY_RELEASE NAMES pthreadVC${PThreads4W_MAJOR_VERSION}) + find_library(PThreads4W_LIBRARY_DEBUG NAMES pthreadVC${PThreads4W_MAJOR_VERSION}d) + select_library_configurations(PThreads4W) +endif() +if(NOT PThreads4W_CXXEXC_LIBRARY) + find_library(PThreads4W_CXXEXC_LIBRARY_RELEASE NAMES pthreadVCE${PThreads4W_MAJOR_VERSION}) + find_library(PThreads4W_CXXEXC_LIBRARY_DEBUG NAMES pthreadVCE${PThreads4W_MAJOR_VERSION}d) + select_library_configurations(PThreads4W_CXXEXC) +endif() +if(NOT PThreads4W_STRUCTEXC_LIBRARY) + find_library(PThreads4W_STRUCTEXC_LIBRARY_RELEASE NAMES pthreadVSE${PThreads4W_MAJOR_VERSION}) + find_library(PThreads4W_STRUCTEXC_LIBRARY_DEBUG NAMES pthreadVSE${PThreads4W_MAJOR_VERSION}d) + select_library_configurations(PThreads4W_STRUCTEXC) +endif() + +find_package_handle_standard_args(PThreads4W DEFAULT_MSG PThreads4W_LIBRARY PThreads4W_CXXEXC_LIBRARY PThreads4W_STRUCTEXC_LIBRARY PThreads4W_INCLUDE_DIR) +mark_as_advanced(PThreads4W_INCLUDE_DIR PThreads4W_LIBRARY PThreads4W_CXXEXC_LIBRARY PThreads4W_STRUCTEXC_LIBRARY) + +set(PThreads4W_DLL_DIR ${PThreads4W_INCLUDE_DIR}) +list(TRANSFORM PThreads4W_DLL_DIR APPEND "/../bin") +message(STATUS "PThreads4W_DLL_DIR: ${PThreads4W_DLL_DIR}") + +find_file(PThreads4W_LIBRARY_RELEASE_DLL NAMES pthreadVC${PThreads4W_MAJOR_VERSION}.dll PATHS ${PThreads4W_DLL_DIR}) +find_file(PThreads4W_LIBRARY_DEBUG_DLL NAMES pthreadVC${PThreads4W_MAJOR_VERSION}d.dll PATHS ${PThreads4W_DLL_DIR}) +find_file(PThreads4W_CXXEXC_LIBRARY_RELEASE_DLL NAMES pthreadVCE${PThreads4W_MAJOR_VERSION}.dll PATHS ${PThreads4W_DLL_DIR}) +find_file(PThreads4W_CXXEXC_LIBRARY_DEBUG_DLL NAMES pthreadVCE${PThreads4W_MAJOR_VERSION}d.dll PATHS ${PThreads4W_DLL_DIR}) +find_file(PThreads4W_STRUCTEXC_LIBRARY_RELEASE_DLL NAMES pthreadVSE${PThreads4W_MAJOR_VERSION}.dll PATHS ${PThreads4W_DLL_DIR}) +find_file(PThreads4W_STRUCTEXC_LIBRARY_DEBUG_DLL NAMES pthreadVSE${PThreads4W_MAJOR_VERSION}d.dll PATHS ${PThreads4W_DLL_DIR}) + +#Compatibility definitions, deprecated +set(PTHREAD_INCLUDE_DIR ${PThreads4W_INCLUDE_DIR} CACHE PATH "") +set(PTHREADS_INCLUDE_DIR ${PThreads4W_INCLUDE_DIR} CACHE PATH "") +set(PThreads_windows_INCLUDE_DIR ${PThreads4W_INCLUDE_DIR} CACHE PATH "") +set(PTHREAD_LIBRARIES ${PThreads4W_LIBRARY} CACHE STRING "") +set(PTHREADS_LIBRARIES ${PThreads4W_LIBRARY} CACHE STRING "") +set(PTHREAD_LIBRARY ${PThreads4W_LIBRARY} CACHE STRING "") +set(PTHREADS_LIBRARY ${PThreads4W_LIBRARY} CACHE STRING "") +set(LIBPTHREAD ${PThreads4W_LIBRARY} CACHE STRING "") +set(LIBPTHREADS ${PThreads4W_LIBRARY} CACHE STRING "") +set(PThreads_windows_LIBRARY ${PThreads4W_LIBRARY} CACHE STRING "") +set(PThreads_VERSION "${PThreads4W_VERSION}") +if(PThreads4W_FOUND) + set(PThreads_windows_FOUND TRUE) +endif() + +#TARGETS +if( PThreads4W_FOUND AND NOT TARGET PThreads4W::PThreads4W_CXXEXC ) + if( EXISTS "${PThreads4W_CXXEXC_LIBRARY_RELEASE_DLL}" ) + add_library( PThreads4W::PThreads4W_CXXEXC SHARED IMPORTED ) + set_target_properties( PThreads4W::PThreads4W_CXXEXC PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_CXXEXC_LIBRARY_RELEASE_DLL}" + IMPORTED_IMPLIB "${PThreads4W_CXXEXC_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_CXXEXC_LIBRARY_DEBUG_DLL}" ) + set_property( TARGET PThreads4W::PThreads4W_CXXEXC APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads4W::PThreads4W_CXXEXC PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_CXXEXC_LIBRARY_DEBUG_DLL}" + IMPORTED_IMPLIB_DEBUG "${PThreads4W_CXXEXC_LIBRARY_DEBUG}" ) + endif() + else() + add_library( PThreads4W::PThreads4W_CXXEXC UNKNOWN IMPORTED ) + set_target_properties( PThreads4W::PThreads4W_CXXEXC PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_CXXEXC_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_CXXEXC_LIBRARY_DEBUG}" ) + set_property( TARGET PThreads4W::PThreads4W_CXXEXC APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads4W::PThreads4W_CXXEXC PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_CXXEXC_LIBRARY_DEBUG}" ) + endif() + endif() +endif() + +if( PThreads4W_FOUND AND NOT TARGET PThreads4W::PThreads4W_STRUCTEXC ) + if( EXISTS "${PThreads4W_STRUCTEXC_LIBRARY_RELEASE_DLL}" ) + add_library( PThreads4W::PThreads4W_STRUCTEXC SHARED IMPORTED ) + set_target_properties( PThreads4W::PThreads4W_STRUCTEXC PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_STRUCTEXC_LIBRARY_RELEASE_DLL}" + IMPORTED_IMPLIB "${PThreads4W_STRUCTEXC_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_STRUCTEXC_LIBRARY_DEBUG_DLL}" ) + set_property( TARGET PThreads4W::PThreads4W_STRUCTEXC APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads4W::PThreads4W_STRUCTEXC PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_STRUCTEXC_LIBRARY_DEBUG_DLL}" + IMPORTED_IMPLIB_DEBUG "${PThreads4W_STRUCTEXC_LIBRARY_DEBUG}" ) + endif() + else() + add_library( PThreads4W::PThreads4W_STRUCTEXC UNKNOWN IMPORTED ) + set_target_properties( PThreads4W::PThreads4W_STRUCTEXC PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_STRUCTEXC_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_STRUCTEXC_LIBRARY_DEBUG}" ) + set_property( TARGET PThreads4W::PThreads4W_STRUCTEXC APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads4W::PThreads4W_STRUCTEXC PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_STRUCTEXC_LIBRARY_DEBUG}" ) + endif() + endif() +endif() + +if( PThreads4W_FOUND AND NOT TARGET PThreads4W::PThreads4W ) + if( EXISTS "${PThreads4W_LIBRARY_RELEASE_DLL}" ) + add_library( PThreads4W::PThreads4W SHARED IMPORTED ) + set_target_properties( PThreads4W::PThreads4W PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_LIBRARY_RELEASE_DLL}" + IMPORTED_IMPLIB "${PThreads4W_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_LIBRARY_DEBUG_DLL}" ) + set_property( TARGET PThreads4W::PThreads4W APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads4W::PThreads4W PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_LIBRARY_DEBUG_DLL}" + IMPORTED_IMPLIB_DEBUG "${PThreads4W_LIBRARY_DEBUG}" ) + endif() + else() + add_library( PThreads4W::PThreads4W UNKNOWN IMPORTED ) + set_target_properties( PThreads4W::PThreads4W PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_LIBRARY_DEBUG}" ) + set_property( TARGET PThreads4W::PThreads4W APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads4W::PThreads4W PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_LIBRARY_DEBUG}" ) + endif() + endif() +endif() + +#Compatibility targets, deprecated +if( PThreads4W_FOUND AND NOT TARGET PThreads_windows::PThreads_windows ) + if( EXISTS "${PThreads4W_LIBRARY_RELEASE_DLL}" ) + add_library( PThreads_windows::PThreads_windows SHARED IMPORTED ) + set_target_properties( PThreads_windows::PThreads_windows PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_LIBRARY_RELEASE_DLL}" + IMPORTED_IMPLIB "${PThreads4W_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_LIBRARY_DEBUG_DLL}" ) + set_property( TARGET PThreads_windows::PThreads_windows APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads_windows::PThreads_windows PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_LIBRARY_DEBUG_DLL}" + IMPORTED_IMPLIB_DEBUG "${PThreads4W_LIBRARY_DEBUG}" ) + endif() + else() + add_library( PThreads_windows::PThreads_windows UNKNOWN IMPORTED ) + set_target_properties( PThreads_windows::PThreads_windows PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_LIBRARY_DEBUG}" ) + set_property( TARGET PThreads_windows::PThreads_windows APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads_windows::PThreads_windows PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_LIBRARY_DEBUG}" ) + endif() + endif() +endif() diff --git a/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/share/pthreads/vcpkg_abi_info.txt b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/share/pthreads/vcpkg_abi_info.txt new file mode 100644 index 0000000..b4a85f1 --- /dev/null +++ b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/share/pthreads/vcpkg_abi_info.txt @@ -0,0 +1,12 @@ +CONTROL 4b7a9114524d5c5a0abb88c1d5f3d81da52af8ae +cmake 3.19.2 +features core +portfile.cmake 6610c32adbb168b779a92405cd8317a3c56973b7 +post_build_checks 2 +powershell 7.1.0 +triplet 3eab5c64d9cf628fc0aec277fde66dbdc69b8516-a1c0eabb0c5177b6a8fb97a58ae398880c47b352-674cc9191bda876ee7d19ae851648ca0819aa44f +usage 5f76b0b48a9389f2066458ef9598568165b74e7c +vcpkg-cmake-wrapper.cmake 2a8500866916ee1345dbd8e971df373fa68bb5e0 +vcpkg_execute_required_process da9bc5a8da68ade5f709933edbe8b29a75b7789c +vcpkg_fail_port_install 69f61f498784f900b570c22b1e8bee2ca8995840 +vcpkg_from_sourceforge f05117a4cda03f5e75246ebcc96c8dd5d666641e diff --git a/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/share/pthreads_windows/vcpkg-cmake-wrapper.cmake b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/share/pthreads_windows/vcpkg-cmake-wrapper.cmake new file mode 100644 index 0000000..12d390a --- /dev/null +++ b/AWGDependencies/vcpkg-export-pthreads/installed/x64-windows/share/pthreads_windows/vcpkg-cmake-wrapper.cmake @@ -0,0 +1,224 @@ +#.rst: +# PThreads4W config wrap for vcpkg +# ------------ +# +# Find the PThread4W includes and library. +# +# Result Variables +# ^^^^^^^^^^^^^^^^ +# +# This script defines the following variables: +# +# ``PThreads4W_FOUND`` +# True if PThreads4W library found +# +# ``PThreads4W_VERSION`` +# Containing the PThreads4W version tag (manually defined) +# +# ``PThreads4W_INCLUDE_DIR`` +# Location of PThreads4W headers +# +# ``PThreads4W_LIBRARY`` +# List of libraries to link with when using PThreads4W (no exception handling) +# +# ``PThreads4W_CXXEXC_LIBRARY`` +# List of libraries to link with when using PThreads4W (C++ exception handling) +# +# ``PThreads4W_STRUCTEXC_LIBRARY`` +# List of libraries to link with when using PThreads4W (struct exception handling) +# +# Result Targets +# ^^^^^^^^^^^^^^^^ +# +# This script defines the following targets: +# +# ``PThreads4W::PThreads4W`` +# Target to use PThreads4W (no exception handling) +# +# ``PThreads4W::PThreads4W_CXXEXC`` +# Target to use PThreads4W (C++ exception handling) +# +# ``PThreads4W::PThreads4W_STRUCTEXC`` +# Target to use PThreads4W (struct exception handling) +# + +include(${CMAKE_ROOT}/Modules/FindPackageHandleStandardArgs.cmake) +include(${CMAKE_ROOT}/Modules/SelectLibraryConfigurations.cmake) + +if(NOT PThreads4W_INCLUDE_DIR) + find_path(PThreads4W_INCLUDE_DIR NAMES pthread.h) +endif() + +set(PThreads4W_MAJOR_VERSION 3) +set(PThreads4W_MINOR_VERSION 0) +set(PThreads4W_PATCH_VERSION 0) +set(PThreads4W_VERSION "${PThreads4W_MAJOR_VERSION}.${PThreads4W_MINOR_VERSION}.${PThreads4W_PATCH_VERSION}") + +# Allow libraries to be set manually +if(NOT PThreads4W_LIBRARY) + find_library(PThreads4W_LIBRARY_RELEASE NAMES pthreadVC${PThreads4W_MAJOR_VERSION}) + find_library(PThreads4W_LIBRARY_DEBUG NAMES pthreadVC${PThreads4W_MAJOR_VERSION}d) + select_library_configurations(PThreads4W) +endif() +if(NOT PThreads4W_CXXEXC_LIBRARY) + find_library(PThreads4W_CXXEXC_LIBRARY_RELEASE NAMES pthreadVCE${PThreads4W_MAJOR_VERSION}) + find_library(PThreads4W_CXXEXC_LIBRARY_DEBUG NAMES pthreadVCE${PThreads4W_MAJOR_VERSION}d) + select_library_configurations(PThreads4W_CXXEXC) +endif() +if(NOT PThreads4W_STRUCTEXC_LIBRARY) + find_library(PThreads4W_STRUCTEXC_LIBRARY_RELEASE NAMES pthreadVSE${PThreads4W_MAJOR_VERSION}) + find_library(PThreads4W_STRUCTEXC_LIBRARY_DEBUG NAMES pthreadVSE${PThreads4W_MAJOR_VERSION}d) + select_library_configurations(PThreads4W_STRUCTEXC) +endif() + +find_package_handle_standard_args(PThreads4W DEFAULT_MSG PThreads4W_LIBRARY PThreads4W_CXXEXC_LIBRARY PThreads4W_STRUCTEXC_LIBRARY PThreads4W_INCLUDE_DIR) +mark_as_advanced(PThreads4W_INCLUDE_DIR PThreads4W_LIBRARY PThreads4W_CXXEXC_LIBRARY PThreads4W_STRUCTEXC_LIBRARY) + +set(PThreads4W_DLL_DIR ${PThreads4W_INCLUDE_DIR}) +list(TRANSFORM PThreads4W_DLL_DIR APPEND "/../bin") +message(STATUS "PThreads4W_DLL_DIR: ${PThreads4W_DLL_DIR}") + +find_file(PThreads4W_LIBRARY_RELEASE_DLL NAMES pthreadVC${PThreads4W_MAJOR_VERSION}.dll PATHS ${PThreads4W_DLL_DIR}) +find_file(PThreads4W_LIBRARY_DEBUG_DLL NAMES pthreadVC${PThreads4W_MAJOR_VERSION}d.dll PATHS ${PThreads4W_DLL_DIR}) +find_file(PThreads4W_CXXEXC_LIBRARY_RELEASE_DLL NAMES pthreadVCE${PThreads4W_MAJOR_VERSION}.dll PATHS ${PThreads4W_DLL_DIR}) +find_file(PThreads4W_CXXEXC_LIBRARY_DEBUG_DLL NAMES pthreadVCE${PThreads4W_MAJOR_VERSION}d.dll PATHS ${PThreads4W_DLL_DIR}) +find_file(PThreads4W_STRUCTEXC_LIBRARY_RELEASE_DLL NAMES pthreadVSE${PThreads4W_MAJOR_VERSION}.dll PATHS ${PThreads4W_DLL_DIR}) +find_file(PThreads4W_STRUCTEXC_LIBRARY_DEBUG_DLL NAMES pthreadVSE${PThreads4W_MAJOR_VERSION}d.dll PATHS ${PThreads4W_DLL_DIR}) + +#Compatibility definitions, deprecated +set(PTHREAD_INCLUDE_DIR ${PThreads4W_INCLUDE_DIR} CACHE PATH "") +set(PTHREADS_INCLUDE_DIR ${PThreads4W_INCLUDE_DIR} CACHE PATH "") +set(PThreads_windows_INCLUDE_DIR ${PThreads4W_INCLUDE_DIR} CACHE PATH "") +set(PTHREAD_LIBRARIES ${PThreads4W_LIBRARY} CACHE STRING "") +set(PTHREADS_LIBRARIES ${PThreads4W_LIBRARY} CACHE STRING "") +set(PTHREAD_LIBRARY ${PThreads4W_LIBRARY} CACHE STRING "") +set(PTHREADS_LIBRARY ${PThreads4W_LIBRARY} CACHE STRING "") +set(LIBPTHREAD ${PThreads4W_LIBRARY} CACHE STRING "") +set(LIBPTHREADS ${PThreads4W_LIBRARY} CACHE STRING "") +set(PThreads_windows_LIBRARY ${PThreads4W_LIBRARY} CACHE STRING "") +set(PThreads_VERSION "${PThreads4W_VERSION}") +if(PThreads4W_FOUND) + set(PThreads_windows_FOUND TRUE) +endif() + +#TARGETS +if( PThreads4W_FOUND AND NOT TARGET PThreads4W::PThreads4W_CXXEXC ) + if( EXISTS "${PThreads4W_CXXEXC_LIBRARY_RELEASE_DLL}" ) + add_library( PThreads4W::PThreads4W_CXXEXC SHARED IMPORTED ) + set_target_properties( PThreads4W::PThreads4W_CXXEXC PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_CXXEXC_LIBRARY_RELEASE_DLL}" + IMPORTED_IMPLIB "${PThreads4W_CXXEXC_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_CXXEXC_LIBRARY_DEBUG_DLL}" ) + set_property( TARGET PThreads4W::PThreads4W_CXXEXC APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads4W::PThreads4W_CXXEXC PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_CXXEXC_LIBRARY_DEBUG_DLL}" + IMPORTED_IMPLIB_DEBUG "${PThreads4W_CXXEXC_LIBRARY_DEBUG}" ) + endif() + else() + add_library( PThreads4W::PThreads4W_CXXEXC UNKNOWN IMPORTED ) + set_target_properties( PThreads4W::PThreads4W_CXXEXC PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_CXXEXC_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_CXXEXC_LIBRARY_DEBUG}" ) + set_property( TARGET PThreads4W::PThreads4W_CXXEXC APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads4W::PThreads4W_CXXEXC PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_CXXEXC_LIBRARY_DEBUG}" ) + endif() + endif() +endif() + +if( PThreads4W_FOUND AND NOT TARGET PThreads4W::PThreads4W_STRUCTEXC ) + if( EXISTS "${PThreads4W_STRUCTEXC_LIBRARY_RELEASE_DLL}" ) + add_library( PThreads4W::PThreads4W_STRUCTEXC SHARED IMPORTED ) + set_target_properties( PThreads4W::PThreads4W_STRUCTEXC PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_STRUCTEXC_LIBRARY_RELEASE_DLL}" + IMPORTED_IMPLIB "${PThreads4W_STRUCTEXC_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_STRUCTEXC_LIBRARY_DEBUG_DLL}" ) + set_property( TARGET PThreads4W::PThreads4W_STRUCTEXC APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads4W::PThreads4W_STRUCTEXC PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_STRUCTEXC_LIBRARY_DEBUG_DLL}" + IMPORTED_IMPLIB_DEBUG "${PThreads4W_STRUCTEXC_LIBRARY_DEBUG}" ) + endif() + else() + add_library( PThreads4W::PThreads4W_STRUCTEXC UNKNOWN IMPORTED ) + set_target_properties( PThreads4W::PThreads4W_STRUCTEXC PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_STRUCTEXC_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_STRUCTEXC_LIBRARY_DEBUG}" ) + set_property( TARGET PThreads4W::PThreads4W_STRUCTEXC APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads4W::PThreads4W_STRUCTEXC PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_STRUCTEXC_LIBRARY_DEBUG}" ) + endif() + endif() +endif() + +if( PThreads4W_FOUND AND NOT TARGET PThreads4W::PThreads4W ) + if( EXISTS "${PThreads4W_LIBRARY_RELEASE_DLL}" ) + add_library( PThreads4W::PThreads4W SHARED IMPORTED ) + set_target_properties( PThreads4W::PThreads4W PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_LIBRARY_RELEASE_DLL}" + IMPORTED_IMPLIB "${PThreads4W_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_LIBRARY_DEBUG_DLL}" ) + set_property( TARGET PThreads4W::PThreads4W APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads4W::PThreads4W PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_LIBRARY_DEBUG_DLL}" + IMPORTED_IMPLIB_DEBUG "${PThreads4W_LIBRARY_DEBUG}" ) + endif() + else() + add_library( PThreads4W::PThreads4W UNKNOWN IMPORTED ) + set_target_properties( PThreads4W::PThreads4W PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_LIBRARY_DEBUG}" ) + set_property( TARGET PThreads4W::PThreads4W APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads4W::PThreads4W PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_LIBRARY_DEBUG}" ) + endif() + endif() +endif() + +#Compatibility targets, deprecated +if( PThreads4W_FOUND AND NOT TARGET PThreads_windows::PThreads_windows ) + if( EXISTS "${PThreads4W_LIBRARY_RELEASE_DLL}" ) + add_library( PThreads_windows::PThreads_windows SHARED IMPORTED ) + set_target_properties( PThreads_windows::PThreads_windows PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_LIBRARY_RELEASE_DLL}" + IMPORTED_IMPLIB "${PThreads4W_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_LIBRARY_DEBUG_DLL}" ) + set_property( TARGET PThreads_windows::PThreads_windows APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads_windows::PThreads_windows PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_LIBRARY_DEBUG_DLL}" + IMPORTED_IMPLIB_DEBUG "${PThreads4W_LIBRARY_DEBUG}" ) + endif() + else() + add_library( PThreads_windows::PThreads_windows UNKNOWN IMPORTED ) + set_target_properties( PThreads_windows::PThreads_windows PROPERTIES + IMPORTED_LOCATION_RELEASE "${PThreads4W_LIBRARY_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PThreads4W_INCLUDE_DIR}" + IMPORTED_CONFIGURATIONS Release + IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) + if( EXISTS "${PThreads4W_LIBRARY_DEBUG}" ) + set_property( TARGET PThreads_windows::PThreads_windows APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( PThreads_windows::PThreads_windows PROPERTIES + IMPORTED_LOCATION_DEBUG "${PThreads4W_LIBRARY_DEBUG}" ) + endif() + endif() +endif() diff --git a/AWGDependencies/vcpkg-export-pthreads/scripts/buildsystems/msbuild/applocal.ps1 b/AWGDependencies/vcpkg-export-pthreads/scripts/buildsystems/msbuild/applocal.ps1 new file mode 100644 index 0000000..2e8d76c --- /dev/null +++ b/AWGDependencies/vcpkg-export-pthreads/scripts/buildsystems/msbuild/applocal.ps1 @@ -0,0 +1,152 @@ +[cmdletbinding()] +param([string]$targetBinary, [string]$installedDir, [string]$tlogFile, [string]$copiedFilesLog) + +$g_searched = @{} +# Note: installedDir is actually the bin\ directory. +$g_install_root = Split-Path $installedDir -parent +$g_is_debug = $g_install_root -match '(.*\\)?debug(\\)?$' + +# Ensure we create the copied files log, even if we don't end up copying any files +if ($copiedFilesLog) +{ + Set-Content -Path $copiedFilesLog -Value "" -Encoding UTF8 +} + +function computeHash([System.Security.Cryptography.HashAlgorithm]$alg, [string]$str) { + $bytes = [System.Text.Encoding]::UTF8.GetBytes($str) + $hash = $alg.ComputeHash($bytes) + return [Convert]::ToBase64String($hash) +} + +function getMutex([string]$targetDir) { + $sha512Hash = [System.Security.Cryptography.SHA512]::Create() + if ($sha512Hash) { + $hash = computeHash $sha512Hash $targetDir + $mtxName = "VcpkgAppLocalDeployBinary-" + $hash + return New-Object System.Threading.Mutex($false, $mtxName) + } + + return New-Object System.Threading.Mutex($false, "VcpkgAppLocalDeployBinary") +} + +# Note: this function signature is depended upon by the qtdeploy.ps1 script introduced in 5.7.1-7 +function deployBinary([string]$targetBinaryDir, [string]$SourceDir, [string]$targetBinaryName) { + try { + $mtx = getMutex($targetBinaryDir) + if ($mtx) { + $mtx.WaitOne() | Out-Null + } + + if (Test-Path "$targetBinaryDir\$targetBinaryName") { + $sourceModTime = (Get-Item $SourceDir\$targetBinaryName).LastWriteTime + $destModTime = (Get-Item $targetBinaryDir\$targetBinaryName).LastWriteTime + if ($destModTime -lt $sourceModTime) { + Write-Verbose " ${targetBinaryName}: Updating $SourceDir\$targetBinaryName" + Copy-Item "$SourceDir\$targetBinaryName" $targetBinaryDir + } else { + Write-Verbose " ${targetBinaryName}: already present" + } + } + else { + Write-Verbose " ${targetBinaryName}: Copying $SourceDir\$targetBinaryName" + Copy-Item "$SourceDir\$targetBinaryName" $targetBinaryDir + } + if ($copiedFilesLog) { Add-Content $copiedFilesLog "$targetBinaryDir\$targetBinaryName" -Encoding UTF8 } + if ($tlogFile) { Add-Content $tlogFile "$targetBinaryDir\$targetBinaryName" -Encoding Unicode } + } finally { + if ($mtx) { + $mtx.ReleaseMutex() | Out-Null + $mtx.Dispose() | Out-Null + } + } +} + + +Write-Verbose "Resolving base path $targetBinary..." +try +{ + $baseBinaryPath = Resolve-Path $targetBinary -erroraction stop + $baseTargetBinaryDir = Split-Path $baseBinaryPath -parent +} +catch [System.Management.Automation.ItemNotFoundException] +{ + return +} + +# Note: this function signature is depended upon by the qtdeploy.ps1 script +function resolve([string]$targetBinary) { + Write-Verbose "Resolving $targetBinary..." + try + { + $targetBinaryPath = Resolve-Path $targetBinary -erroraction stop + } + catch [System.Management.Automation.ItemNotFoundException] + { + return + } + $targetBinaryDir = Split-Path $targetBinaryPath -parent + + if (Get-Command "dumpbin" -ErrorAction SilentlyContinue) { + $a = $(dumpbin /DEPENDENTS $targetBinary | ? { $_ -match "^ [^ ].*\.dll" } | % { $_ -replace "^ ","" }) + } elseif (Get-Command "llvm-objdump" -ErrorAction SilentlyContinue) { + $a = $(llvm-objdump -p $targetBinary| ? { $_ -match "^ {4}DLL Name: .*\.dll" } | % { $_ -replace "^ {4}DLL Name: ","" }) + } else { + Write-Error "Neither dumpbin nor llvm-objdump could be found. Can not take care of dll dependencies." + } + $a | % { + if ([string]::IsNullOrEmpty($_)) { + return + } + if ($g_searched.ContainsKey($_)) { + Write-Verbose " ${_}: previously searched - Skip" + return + } + $g_searched.Set_Item($_, $true) + if (Test-Path "$installedDir\$_") { + deployBinary $baseTargetBinaryDir $installedDir "$_" + if (Test-Path function:\deployPluginsIfQt) { deployPluginsIfQt $baseTargetBinaryDir "$g_install_root\plugins" "$_" } + if (Test-Path function:\deployOpenNI2) { deployOpenNI2 $targetBinaryDir "$g_install_root" "$_" } + if (Test-Path function:\deployPluginsIfMagnum) { + if ($g_is_debug) { + deployPluginsIfMagnum $targetBinaryDir "$g_install_root\bin\magnum-d" "$_" + } else { + deployPluginsIfMagnum $targetBinaryDir "$g_install_root\bin\magnum" "$_" + } + } + if (Test-Path function:\deployAzureKinectSensorSDK) { deployAzureKinectSensorSDK $targetBinaryDir "$g_install_root" "$_" } + resolve "$baseTargetBinaryDir\$_" + } elseif (Test-Path "$targetBinaryDir\$_") { + Write-Verbose " ${_}: $_ not found in vcpkg; locally deployed" + resolve "$targetBinaryDir\$_" + } else { + Write-Verbose " ${_}: $installedDir\$_ not found" + } + } + Write-Verbose "Done Resolving $targetBinary." +} + +# Note: This is a hack to make Qt5 work. +# Introduced with Qt package version 5.7.1-7 +if (Test-Path "$g_install_root\plugins\qtdeploy.ps1") { + . "$g_install_root\plugins\qtdeploy.ps1" +} + +# Note: This is a hack to make OpenNI2 work. +if (Test-Path "$g_install_root\bin\OpenNI2\openni2deploy.ps1") { + . "$g_install_root\bin\OpenNI2\openni2deploy.ps1" +} + +# Note: This is a hack to make Magnum work. +if (Test-Path "$g_install_root\bin\magnum\magnumdeploy.ps1") { + . "$g_install_root\bin\magnum\magnumdeploy.ps1" +} elseif (Test-Path "$g_install_root\bin\magnum-d\magnumdeploy.ps1") { + . "$g_install_root\bin\magnum-d\magnumdeploy.ps1" +} + +# Note: This is a hack to make Azure Kinect Sensor SDK work. +if (Test-Path "$g_install_root\tools\azure-kinect-sensor-sdk\k4adeploy.ps1") { + . "$g_install_root\tools\azure-kinect-sensor-sdk\k4adeploy.ps1" +} + +resolve($targetBinary) +Write-Verbose $($g_searched | out-string) diff --git a/AWGDependencies/vcpkg-export-pthreads/scripts/buildsystems/msbuild/vcpkg-general.xml b/AWGDependencies/vcpkg-export-pthreads/scripts/buildsystems/msbuild/vcpkg-general.xml new file mode 100644 index 0000000..0fbe3c6 --- /dev/null +++ b/AWGDependencies/vcpkg-export-pthreads/scripts/buildsystems/msbuild/vcpkg-general.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AWGDependencies/vcpkg-export-pthreads/scripts/buildsystems/msbuild/vcpkg.props b/AWGDependencies/vcpkg-export-pthreads/scripts/buildsystems/msbuild/vcpkg.props new file mode 100644 index 0000000..aee2cfc --- /dev/null +++ b/AWGDependencies/vcpkg-export-pthreads/scripts/buildsystems/msbuild/vcpkg.props @@ -0,0 +1,34 @@ + + + + + + windows + uwp + + + + + $(Platform) + x86 + + + + true + true + $(Configuration) + false + $([System.IO.Path]::Combine($(MSBuildThisFileDirectory), '..\..\..')) + + true + + false + + + false + true + $([MSbuild]::GetDirectoryNameOfFileAbove($(MSBuildProjectDirectory), vcpkg.json)) + + + diff --git a/AWGDependencies/vcpkg-export-pthreads/scripts/buildsystems/msbuild/vcpkg.targets b/AWGDependencies/vcpkg-export-pthreads/scripts/buildsystems/msbuild/vcpkg.targets new file mode 100644 index 0000000..0ba7d89 --- /dev/null +++ b/AWGDependencies/vcpkg-export-pthreads/scripts/buildsystems/msbuild/vcpkg.targets @@ -0,0 +1,119 @@ + + + + + + + + + $([System.IO.Path]::Combine($(VcpkgRoot), 'scripts\buildsystems\msbuild\vcpkg-general.xml')) + + + + + + -static + $(VcpkgPlatformTarget)-$(VcpkgOSTarget)$(VcpkgLinkage) + + $(VcpkgRoot)\ + $(VcpkgManifestRoot)\ + + $([System.IO.Path]::Combine($(VcpkgRoot), 'installed')) + $([System.IO.Path]::Combine($(VcpkgManifestRoot), 'vcpkg_installed')) + $(VcpkgInstalledDir)\ + + $([System.IO.Path]::Combine($(VcpkgInstalledDir), $(VcpkgTriplet))) + $(VcpkgCurrentInstalledDir)\ + + Debug + Release + + debug\ + true + + + + + + Project + + + + + + %(AdditionalDependencies);$(VcpkgCurrentInstalledDir)$(VcpkgConfigSubdir)lib\*.lib + %(AdditionalLibraryDirectories);$(VcpkgCurrentInstalledDir)$(VcpkgConfigSubdir)lib;$(VcpkgCurrentInstalledDir)$(VcpkgConfigSubdir)lib\manual-link + + + %(AdditionalIncludeDirectories);$(VcpkgCurrentInstalledDir)include + + + %(AdditionalIncludeDirectories);$(VcpkgCurrentInstalledDir)include + + + + + + + + + + + + + + + + + + + + + + + <_VcpkgAppLocalPowerShellCommonArguments>-ExecutionPolicy Bypass -noprofile -File "$(MSBuildThisFileDirectory)applocal.ps1" "$(TargetPath)" "$(VcpkgCurrentInstalledDir)$(VcpkgConfigSubdir)bin" "$(TLogLocation)$(ProjectName).write.1u.tlog" "$(IntDir)vcpkg.applocal.log" + + + + + + + + + + + + + + + + + + + + + diff --git a/AWGDependencies/vcpkg-export-pthreads/scripts/buildsystems/vcpkg.cmake b/AWGDependencies/vcpkg-export-pthreads/scripts/buildsystems/vcpkg.cmake new file mode 100644 index 0000000..bc54afb --- /dev/null +++ b/AWGDependencies/vcpkg-export-pthreads/scripts/buildsystems/vcpkg.cmake @@ -0,0 +1,673 @@ +# Mark variables as used so cmake doesn't complain about them +mark_as_advanced(CMAKE_TOOLCHAIN_FILE) + +# VCPKG toolchain options. +option(VCPKG_VERBOSE "Enables messages from the VCPKG toolchain for debugging purposes." OFF) +mark_as_advanced(VCPKG_VERBOSE) + +include(CMakeDependentOption) + +function(_vcpkg_get_directory_name_of_file_above OUT DIRECTORY FILENAME) + set(_vcpkg_get_dir_candidate ${DIRECTORY}) + while(IS_DIRECTORY ${_vcpkg_get_dir_candidate} AND NOT DEFINED _vcpkg_get_dir_out) + if(EXISTS ${_vcpkg_get_dir_candidate}/${FILENAME}) + set(_vcpkg_get_dir_out ${_vcpkg_get_dir_candidate}) + else() + get_filename_component(_vcpkg_get_dir_candidate_tmp ${_vcpkg_get_dir_candidate} DIRECTORY) + if(_vcpkg_get_dir_candidate STREQUAL _vcpkg_get_dir_candidate_tmp) # we've reached the root + set(_vcpkg_get_dir_out "${OUT}-NOTFOUND") + else() + set(_vcpkg_get_dir_candidate ${_vcpkg_get_dir_candidate_tmp}) + endif() + endif() + endwhile() + + set(${OUT} ${_vcpkg_get_dir_out} CACHE INTERNAL "_vcpkg_get_directory_name_of_file_above: ${OUT}") +endfunction() + +#[===[ +We use this system, instead of `message(FATAL_ERROR)`, +since cmake prints a lot of nonsense if the toolchain errors out before it's found the build tools. + +This `_VCPKG_HAS_FATAL_ERROR` must be checked before any filesystem operations are done, +since otherwise you might be doing something with bad variables set up. +#]===] +set(_VCPKG_FATAL_ERROR) +set(_VCPKG_HAS_FATAL_ERROR OFF) +function(_vcpkg_add_fatal_error ERROR) + if(NOT _VCPKG_HAS_FATAL_ERROR) + set(_VCPKG_HAS_FATAL_ERROR ON PARENT_SCOPE) + set(_VCPKG_FATAL_ERROR "${ERROR}" PARENT_SCOPE) + else() + string(APPEND _VCPKG_FATAL_ERROR "\n${ERROR}") + endif() +endfunction() + +if(NOT DEFINED VCPKG_MANIFEST_DIR) + if(EXISTS "${CMAKE_SOURCE_DIR}/vcpkg.json") + set(_VCPKG_MANIFEST_DIR "${CMAKE_SOURCE_DIR}") + endif() +else() + set(_VCPKG_MANIFEST_DIR ${VCPKG_MANIFEST_DIR}) +endif() +if(NOT DEFINED VCPKG_MANIFEST_MODE) + if(_VCPKG_MANIFEST_DIR) + set(VCPKG_MANIFEST_MODE ON) + else() + set(VCPKG_MANIFEST_MODE OFF) + endif() +elseif(VCPKG_MANIFEST_MODE AND NOT _VCPKG_MANIFEST_DIR) + _vcpkg_add_fatal_error( + "vcpkg manifest mode was enabled, but we couldn't find a manifest file (vcpkg.json) " + "in any directories above ${CMAKE_CURRENT_SOURCE_DIR}. Please add a manifest, or " + "disable manifests by turning off VCPKG_MANIFEST_MODE.") +endif() + +if(NOT DEFINED _INTERNAL_CHECK_VCPKG_MANIFEST_MODE) + set(_INTERNAL_CHECK_VCPKG_MANIFEST_MODE "${VCPKG_MANIFEST_MODE}" + CACHE INTERNAL "Making sure VCPKG_MANIFEST_MODE doesn't change") +endif() + +if(NOT VCPKG_MANIFEST_MODE STREQUAL _INTERNAL_CHECK_VCPKG_MANIFEST_MODE) + _vcpkg_add_fatal_error([[ +vcpkg manifest mode was enabled for a build directory where it was initially disabled. +This is not supported. Please delete the build directory and reconfigure. +]]) +endif() + +CMAKE_DEPENDENT_OPTION(VCPKG_MANIFEST_INSTALL [[ +Install the dependencies listed in your manifest: + If this is off, you will have to manually install your dependencies. + See https://github.com/microsoft/vcpkg/tree/master/docs/specifications/manifests.md for more info. +]] + ON + "VCPKG_MANIFEST_MODE" + OFF) + +# Determine whether the toolchain is loaded during a try-compile configuration +get_property(_CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE) + +if (${CMAKE_VERSION} VERSION_LESS "3.6.0") + set(_CMAKE_EMULATE_TRY_COMPILE_PLATFORM_VARIABLES ON) +else() + set(_CMAKE_EMULATE_TRY_COMPILE_PLATFORM_VARIABLES OFF) +endif() + +if(_CMAKE_IN_TRY_COMPILE AND _CMAKE_EMULATE_TRY_COMPILE_PLATFORM_VARIABLES) + include("${CMAKE_CURRENT_SOURCE_DIR}/../vcpkg.config.cmake" OPTIONAL) +endif() + +if(VCPKG_CHAINLOAD_TOOLCHAIN_FILE) + include("${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}") +endif() + +if(VCPKG_TOOLCHAIN) + return() +endif() + +#If CMake does not have a mapping for MinSizeRel and RelWithDebInfo in imported targets +#it will map those configuration to the first valid configuration in CMAKE_CONFIGURATION_TYPES or the targets IMPORTED_CONFIGURATIONS. +#In most cases this is the debug configuration which is wrong. +if(NOT DEFINED CMAKE_MAP_IMPORTED_CONFIG_MINSIZEREL) + set(CMAKE_MAP_IMPORTED_CONFIG_MINSIZEREL "MinSizeRel;Release;") + if(VCPKG_VERBOSE) + message(STATUS "VCPKG-Info: CMAKE_MAP_IMPORTED_CONFIG_MINSIZEREL set to MinSizeRel;Release;") + endif() +endif() +if(NOT DEFINED CMAKE_MAP_IMPORTED_CONFIG_RELWITHDEBINFO) + set(CMAKE_MAP_IMPORTED_CONFIG_RELWITHDEBINFO "RelWithDebInfo;Release;") + if(VCPKG_VERBOSE) + message(STATUS "VCPKG-Info: CMAKE_MAP_IMPORTED_CONFIG_RELWITHDEBINFO set to RelWithDebInfo;Release;") + endif() +endif() + +if(VCPKG_TARGET_TRIPLET) + # This is required since a user might do: 'set(VCPKG_TARGET_TRIPLET somevalue)' [no CACHE] before the first project() call + # Latter within the toolchain file we do: 'set(VCPKG_TARGET_TRIPLET somevalue CACHE STRING "")' which + # will otherwise override the user setting of VCPKG_TARGET_TRIPLET in the current scope of the toolchain since the CACHE value + # did not exist previously. Since the value is newly created CMake will use the CACHE value within this scope since it is the more + # recently created value in directory scope. This 'strange' behaviour only happens on the very first configure call since subsequent + # configure call will see the user value as the more recent value. The same logic must be applied to all cache values within this file! + # The FORCE keyword is required to ALWAYS lift the user provided/previously set value into a CACHE value. + set(VCPKG_TARGET_TRIPLET ${VCPKG_TARGET_TRIPLET} CACHE STRING "Vcpkg target triplet (ex. x86-windows)" FORCE) +elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Ww][Ii][Nn]32$") + set(_VCPKG_TARGET_TRIPLET_ARCH x86) +elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Xx]64$") + set(_VCPKG_TARGET_TRIPLET_ARCH x64) +elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]$") + set(_VCPKG_TARGET_TRIPLET_ARCH arm) +elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]64$") + set(_VCPKG_TARGET_TRIPLET_ARCH arm64) +else() + if(CMAKE_GENERATOR MATCHES "^Visual Studio 14 2015 Win64$") + set(_VCPKG_TARGET_TRIPLET_ARCH x64) + elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 14 2015 ARM$") + set(_VCPKG_TARGET_TRIPLET_ARCH arm) + elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 14 2015$") + set(_VCPKG_TARGET_TRIPLET_ARCH x86) + elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 15 2017 Win64$") + set(_VCPKG_TARGET_TRIPLET_ARCH x64) + elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 15 2017 ARM$") + set(_VCPKG_TARGET_TRIPLET_ARCH arm) + elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 15 2017$") + set(_VCPKG_TARGET_TRIPLET_ARCH x86) + elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 16 2019$") + set(_VCPKG_TARGET_TRIPLET_ARCH x64) + else() + find_program(_VCPKG_CL cl) + if(_VCPKG_CL MATCHES "amd64/cl.exe$" OR _VCPKG_CL MATCHES "x64/cl.exe$") + set(_VCPKG_TARGET_TRIPLET_ARCH x64) + elseif(_VCPKG_CL MATCHES "arm/cl.exe$") + set(_VCPKG_TARGET_TRIPLET_ARCH arm) + elseif(_VCPKG_CL MATCHES "arm64/cl.exe$") + set(_VCPKG_TARGET_TRIPLET_ARCH arm64) + elseif(_VCPKG_CL MATCHES "bin/cl.exe$" OR _VCPKG_CL MATCHES "x86/cl.exe$") + set(_VCPKG_TARGET_TRIPLET_ARCH x86) + elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin" AND DEFINED CMAKE_SYSTEM_NAME AND NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin") + list(LENGTH CMAKE_OSX_ARCHITECTURES arch_count) + if(arch_count EQUAL 0) + message(WARNING "Unable to determine target architecture. " + "Consider providing a value for the CMAKE_OSX_ARCHITECTURES cache variable. " + "Continuing without vcpkg.") + set(VCPKG_TOOLCHAIN ON) + return() + else() + if(arch_count GREATER 1) + message(WARNING "Detected more than one target architecture. Using the first one.") + endif() + list(GET CMAKE_OSX_ARCHITECTURES 0 target_arch) + if(target_arch STREQUAL arm64) + set(_VCPKG_TARGET_TRIPLET_ARCH arm64) + elseif(target_arch STREQUAL arm64s) + set(_VCPKG_TARGET_TRIPLET_ARCH arm64s) + elseif(target_arch STREQUAL armv7s) + set(_VCPKG_TARGET_TRIPLET_ARCH armv7s) + elseif(target_arch STREQUAL armv7) + set(_VCPKG_TARGET_TRIPLET_ARCH arm) + elseif(target_arch STREQUAL x86_64) + set(_VCPKG_TARGET_TRIPLET_ARCH x64) + elseif(target_arch STREQUAL i386) + set(_VCPKG_TARGET_TRIPLET_ARCH x86) + else() + message(WARNING "Unable to determine target architecture, continuing without vcpkg.") + set(VCPKG_TOOLCHAIN ON) + return() + endif() + endif() + elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "x86_64" OR CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "AMD64") + set(_VCPKG_TARGET_TRIPLET_ARCH x64) + elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "s390x") + set(_VCPKG_TARGET_TRIPLET_ARCH s390x) + elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "armv7l") + set(_VCPKG_TARGET_TRIPLET_ARCH arm) + elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "aarch64") + set(_VCPKG_TARGET_TRIPLET_ARCH arm64) + else() + if( _CMAKE_IN_TRY_COMPILE ) + message(STATUS "Unable to determine target architecture, continuing without vcpkg.") + else() + message(WARNING "Unable to determine target architecture, continuing without vcpkg.") + endif() + set(VCPKG_TOOLCHAIN ON) + return() + endif() + endif() +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "WindowsStore" OR CMAKE_SYSTEM_NAME STREQUAL "WindowsPhone") + set(_VCPKG_TARGET_TRIPLET_PLAT uwp) +elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR (NOT CMAKE_SYSTEM_NAME AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")) + set(_VCPKG_TARGET_TRIPLET_PLAT linux) +elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin" OR (NOT CMAKE_SYSTEM_NAME AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")) + set(_VCPKG_TARGET_TRIPLET_PLAT osx) +elseif(CMAKE_SYSTEM_NAME STREQUAL "iOS") + set(_VCPKG_TARGET_TRIPLET_PLAT ios) +elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows" OR (NOT CMAKE_SYSTEM_NAME AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")) + set(_VCPKG_TARGET_TRIPLET_PLAT windows) +elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" OR (NOT CMAKE_SYSTEM_NAME AND CMAKE_HOST_SYSTEM_NAME STREQUAL "FreeBSD")) + set(_VCPKG_TARGET_TRIPLET_PLAT freebsd) +endif() + +set(VCPKG_TARGET_TRIPLET ${_VCPKG_TARGET_TRIPLET_ARCH}-${_VCPKG_TARGET_TRIPLET_PLAT} CACHE STRING "Vcpkg target triplet (ex. x86-windows)") +set(_VCPKG_TOOLCHAIN_DIR ${CMAKE_CURRENT_LIST_DIR}) + +if(NOT DEFINED _VCPKG_ROOT_DIR) + # Detect .vcpkg-root to figure VCPKG_ROOT_DIR + set(_VCPKG_ROOT_DIR_CANDIDATE ${CMAKE_CURRENT_LIST_DIR}) + while(IS_DIRECTORY ${_VCPKG_ROOT_DIR_CANDIDATE} AND NOT EXISTS "${_VCPKG_ROOT_DIR_CANDIDATE}/.vcpkg-root") + get_filename_component(_VCPKG_ROOT_DIR_TEMP ${_VCPKG_ROOT_DIR_CANDIDATE} DIRECTORY) + if (_VCPKG_ROOT_DIR_TEMP STREQUAL _VCPKG_ROOT_DIR_CANDIDATE) # If unchanged, we have reached the root of the drive + else() + SET(_VCPKG_ROOT_DIR_CANDIDATE ${_VCPKG_ROOT_DIR_TEMP}) + endif() + endwhile() + set(_VCPKG_ROOT_DIR ${_VCPKG_ROOT_DIR_CANDIDATE} CACHE INTERNAL "Vcpkg root directory") +endif() + +_vcpkg_get_directory_name_of_file_above(_VCPKG_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR} ".vcpkg-root") +if(NOT _VCPKG_ROOT_DIR) + _vcpkg_add_fatal_error("Could not find .vcpkg-root") +endif() + +if (NOT DEFINED _VCPKG_INSTALLED_DIR) + if(_VCPKG_MANIFEST_DIR) + set(_VCPKG_INSTALLED_DIR ${CMAKE_BINARY_DIR}/vcpkg_installed) + else() + set(_VCPKG_INSTALLED_DIR ${_VCPKG_ROOT_DIR}/installed) + endif() + + set(_VCPKG_INSTALLED_DIR ${_VCPKG_INSTALLED_DIR} + CACHE PATH + "The directory which contains the installed libraries for each triplet") +endif() + +if(CMAKE_BUILD_TYPE MATCHES "^[Dd][Ee][Bb][Uu][Gg]$" OR NOT DEFINED CMAKE_BUILD_TYPE) #Debug build: Put Debug paths before Release paths. + list(APPEND CMAKE_PREFIX_PATH + ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET} + ) + list(APPEND CMAKE_LIBRARY_PATH + ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/lib/manual-link ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/manual-link + ) + list(APPEND CMAKE_FIND_ROOT_PATH + ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET} + ) +else() #Release build: Put Release paths before Debug paths. Debug Paths are required so that CMake generates correct info in autogenerated target files. + list(APPEND CMAKE_PREFIX_PATH + ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET} ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug + ) + list(APPEND CMAKE_LIBRARY_PATH + ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/manual-link ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/lib/manual-link + ) + list(APPEND CMAKE_FIND_ROOT_PATH + ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET} ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug + ) +endif() + +# If one CMAKE_FIND_ROOT_PATH_MODE_* variables is set to ONLY, to make sure that ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET} +# and ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug are searched, it is not sufficient to just add them to CMAKE_FIND_ROOT_PATH, +# as CMAKE_FIND_ROOT_PATH specify "one or more directories to be prepended to all other search directories", so to make sure that +# the libraries are searched as they are, it is necessary to add "/" to the CMAKE_PREFIX_PATH +if(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE STREQUAL "ONLY" OR + CMAKE_FIND_ROOT_PATH_MODE_LIBRARY STREQUAL "ONLY" OR + CMAKE_FIND_ROOT_PATH_MODE_PACKAGE STREQUAL "ONLY") + list(APPEND CMAKE_PREFIX_PATH "/") +endif() + +set(VCPKG_CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH}) + +file(TO_CMAKE_PATH "$ENV{PROGRAMFILES}" _programfiles) +set(_PROGRAMFILESX86 "PROGRAMFILES(x86)") +file(TO_CMAKE_PATH "$ENV{${_PROGRAMFILESX86}}" _programfiles_x86) +set(CMAKE_SYSTEM_IGNORE_PATH + "${_programfiles}/OpenSSL" + "${_programfiles}/OpenSSL-Win32" + "${_programfiles}/OpenSSL-Win64" + "${_programfiles}/OpenSSL-Win32/lib/VC" + "${_programfiles}/OpenSSL-Win64/lib/VC" + "${_programfiles}/OpenSSL-Win32/lib/VC/static" + "${_programfiles}/OpenSSL-Win64/lib/VC/static" + "${_programfiles_x86}/OpenSSL" + "${_programfiles_x86}/OpenSSL-Win32" + "${_programfiles_x86}/OpenSSL-Win64" + "${_programfiles_x86}/OpenSSL-Win32/lib/VC" + "${_programfiles_x86}/OpenSSL-Win64/lib/VC" + "${_programfiles_x86}/OpenSSL-Win32/lib/VC/static" + "${_programfiles_x86}/OpenSSL-Win64/lib/VC/static" + "C:/OpenSSL/" + "C:/OpenSSL-Win32/" + "C:/OpenSSL-Win64/" + "C:/OpenSSL-Win32/lib/VC" + "C:/OpenSSL-Win64/lib/VC" + "C:/OpenSSL-Win32/lib/VC/static" + "C:/OpenSSL-Win64/lib/VC/static" +) + +list(APPEND CMAKE_PROGRAM_PATH ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/tools) +file(GLOB _VCPKG_TOOLS_DIRS ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/tools/*) +foreach(_VCPKG_TOOLS_DIR IN LISTS _VCPKG_TOOLS_DIRS) + if(IS_DIRECTORY "${_VCPKG_TOOLS_DIR}") + list(APPEND CMAKE_PROGRAM_PATH "${_VCPKG_TOOLS_DIR}") + endif() +endforeach() + + +# CMAKE_EXECUTABLE_SUFFIX is not yet defined +if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") + set(_VCPKG_EXECUTABLE "${_VCPKG_ROOT_DIR}/vcpkg.exe") + set(_VCPKG_BOOTSTRAP_SCRIPT "${_VCPKG_ROOT_DIR}/bootstrap-vcpkg.bat") +else() + set(_VCPKG_EXECUTABLE "${_VCPKG_ROOT_DIR}/vcpkg") + set(_VCPKG_BOOTSTRAP_SCRIPT "${_VCPKG_ROOT_DIR}/bootstrap-vcpkg.sh") +endif() + +if(VCPKG_MANIFEST_MODE AND VCPKG_MANIFEST_INSTALL AND NOT _CMAKE_IN_TRY_COMPILE AND NOT _VCPKG_HAS_FATAL_ERROR) + set(VCPKG_BOOTSTRAP_OPTIONS "${VCPKG_BOOTSTRAP_OPTIONS}" CACHE STRING "Additional options to bootstrap vcpkg" FORCE) + mark_as_advanced(VCPKG_BOOTSTRAP_OPTIONS) + + if(NOT EXISTS "${_VCPKG_EXECUTABLE}") + message(STATUS "Bootstrapping vcpkg before install") + + file(TO_NATIVE_PATH "${CMAKE_BINARY_DIR}/vcpkg-bootstrap.log" _VCPKG_BOOTSTRAP_LOG) + execute_process( + COMMAND "${_VCPKG_BOOTSTRAP_SCRIPT}" ${VCPKG_BOOTSTRAP_OPTIONS} + OUTPUT_FILE "${_VCPKG_BOOTSTRAP_LOG}" + ERROR_FILE "${_VCPKG_BOOTSTRAP_LOG}" + RESULT_VARIABLE _VCPKG_BOOTSTRAP_RESULT) + + if (_VCPKG_BOOTSTRAP_RESULT EQUAL 0) + message(STATUS "Bootstrapping vcpkg before install - done") + else() + message(STATUS "Bootstrapping vcpkg before install - failed") + _vcpkg_add_fatal_error("vcpkg install failed. See logs for more information: ${_VCPKG_BOOTSTRAP_LOG}") + endif() + endif() + + if (NOT _VCPKG_HAS_FATAL_ERROR) + set(VCPKG_OVERLAY_PORTS "${VCPKG_OVERLAY_PORTS}" CACHE STRING "Overlay ports to use for vcpkg install in manifest mode" FORCE) + mark_as_advanced(VCPKG_OVERLAY_PORTS) + set(VCPKG_OVERLAY_TRIPLETS "${VCPKG_OVERLAY_TRIPLETS}" CACHE STRING "Overlay triplets to use for vcpkg install in manifest mode" FORCE) + mark_as_advanced(VCPKG_OVERLAY_TRIPLETS) + set(VCPKG_INSTALL_OPTIONS "${VCPKG_INSTALL_OPTIONS}" CACHE STRING "Additional install options to pass to vcpkg" FORCE) + mark_as_advanced(VCPKG_INSTALL_OPTIONS) + + message(STATUS "Running vcpkg install") + + set(_VCPKG_ADDITIONAL_MANIFEST_PARAMS) + if(VCPKG_OVERLAY_PORTS) + foreach(_overlay_port IN LISTS VCPKG_OVERLAY_PORTS) + list(APPEND _VCPKG_ADDITIONAL_MANIFEST_PARAMS "--overlay-ports=${_overlay_port}") + endforeach() + endif() + if(VCPKG_OVERLAY_TRIPLETS) + foreach(_overlay_triplet IN LISTS VCPKG_OVERLAY_TRIPLETS) + list(APPEND _VCPKG_ADDITIONAL_MANIFEST_PARAMS "--overlay-triplets=${_overlay_triplet}") + endforeach() + endif() + + foreach(feature IN LISTS VCPKG_MANIFEST_FEATURES) + list(APPEND _VCPKG_ADDITIONAL_MANIFEST_PARAMS "--x-feature=${feature}") + endforeach() + + if(VCPKG_MANIFEST_NO_DEFAULT_FEATURES) + list(APPEND _VCPKG_ADDITIONAL_MANIFEST_PARAMS "--x-no-default-features") + endif() + + if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.18") + set(_VCPKG_MANIFEST_INSTALL_ECHO_PARAMS ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE) + else() + set(_VCPKG_MANIFEST_INSTALL_ECHO_PARAMS) + endif() + + execute_process( + COMMAND "${_VCPKG_EXECUTABLE}" install + --triplet "${VCPKG_TARGET_TRIPLET}" + --vcpkg-root "${_VCPKG_ROOT_DIR}" + "--x-wait-for-lock" + "--x-manifest-root=${_VCPKG_MANIFEST_DIR}" + "--x-install-root=${_VCPKG_INSTALLED_DIR}" + ${_VCPKG_ADDITIONAL_MANIFEST_PARAMS} + ${VCPKG_INSTALL_OPTIONS} + OUTPUT_VARIABLE _VCPKG_MANIFEST_INSTALL_LOGTEXT + ERROR_VARIABLE _VCPKG_MANIFEST_INSTALL_LOGTEXT + RESULT_VARIABLE _VCPKG_INSTALL_RESULT + ${_VCPKG_MANIFEST_INSTALL_ECHO_PARAMS} + ) + + file(TO_NATIVE_PATH "${CMAKE_BINARY_DIR}/vcpkg-manifest-install.log" _VCPKG_MANIFEST_INSTALL_LOGFILE) + file(WRITE "${_VCPKG_MANIFEST_INSTALL_LOGFILE}" "${_VCPKG_MANIFEST_INSTALL_LOGTEXT}") + + if (_VCPKG_INSTALL_RESULT EQUAL 0) + message(STATUS "Running vcpkg install - done") + + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS + "${_VCPKG_MANIFEST_DIR}/vcpkg.json" + "${_VCPKG_INSTALLED_DIR}/vcpkg/status") + else() + message(STATUS "Running vcpkg install - failed") + _vcpkg_add_fatal_error("vcpkg install failed. See logs for more information: ${_VCPKG_MANIFEST_INSTALL_LOGFILE}") + endif() + endif() +endif() + +option(VCPKG_APPLOCAL_DEPS "Automatically copy dependencies into the output directory for executables." ON) +option(X_VCPKG_APPLOCAL_DEPS_SERIALIZED "(experimental) Add USES_TERMINAL to VCPKG_APPLOCAL_DEPS to force serialization." OFF) +function(_vcpkg_set_powershell_path) + # Attempt to use pwsh if it is present; otherwise use powershell + if (NOT DEFINED _VCPKG_POWERSHELL_PATH) + find_program(_VCPKG_PWSH_PATH pwsh) + if (_VCPKG_PWSH_PATH) + set(_VCPKG_POWERSHELL_PATH "${_VCPKG_PWSH_PATH}" CACHE INTERNAL "The path to the PowerShell implementation to use.") + else() + message(DEBUG "vcpkg: Could not find PowerShell Core; falling back to PowerShell") + find_program(_VCPKG_BUILTIN_POWERSHELL_PATH powershell REQUIRED) + if (_VCPKG_BUILTIN_POWERSHELL_PATH) + set(_VCPKG_POWERSHELL_PATH "${_VCPKG_BUILTIN_POWERSHELL_PATH}" CACHE INTERNAL "The path to the PowerShell implementation to use.") + else() + message(WARNING "vcpkg: Could not find PowerShell; using static string 'powershell.exe'") + set(_VCPKG_POWERSHELL_PATH "powershell.exe" CACHE INTERNAL "The path to the PowerShell implementation to use.") + endif() + endif() + endif() # _VCPKG_POWERSHELL_PATH +endfunction() + +function(add_executable name) + _add_executable(${ARGV}) + list(FIND ARGV "IMPORTED" IMPORTED_IDX) + list(FIND ARGV "ALIAS" ALIAS_IDX) + list(FIND ARGV "MACOSX_BUNDLE" MACOSX_BUNDLE_IDX) + if(IMPORTED_IDX EQUAL -1 AND ALIAS_IDX EQUAL -1) + if(VCPKG_APPLOCAL_DEPS) + if(_VCPKG_TARGET_TRIPLET_PLAT MATCHES "windows|uwp") + _vcpkg_set_powershell_path() + set(EXTRA_OPTIONS "") + if(X_VCPKG_APPLOCAL_DEPS_SERIALIZED) + set(EXTRA_OPTIONS USES_TERMINAL) + endif() + add_custom_command(TARGET ${name} POST_BUILD + COMMAND "${_VCPKG_POWERSHELL_PATH}" -noprofile -executionpolicy Bypass -file "${_VCPKG_TOOLCHAIN_DIR}/msbuild/applocal.ps1" + -targetBinary $ + -installedDir "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}$<$:/debug>/bin" + -OutVariable out + ${EXTRA_OPTIONS} + ) + elseif(_VCPKG_TARGET_TRIPLET_PLAT MATCHES "osx") + if (NOT MACOSX_BUNDLE_IDX EQUAL -1) + add_custom_command(TARGET ${name} POST_BUILD + COMMAND python ${_VCPKG_TOOLCHAIN_DIR}/osx/applocal.py + $ + "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}$<$:/debug>" + ) + endif() + endif() + endif() + set_target_properties(${name} PROPERTIES VS_USER_PROPS do_not_import_user.props) + set_target_properties(${name} PROPERTIES VS_GLOBAL_VcpkgEnabled false) + endif() +endfunction() + +function(add_library name) + _add_library(${ARGV}) + list(FIND ARGV "IMPORTED" IMPORTED_IDX) + list(FIND ARGV "INTERFACE" INTERFACE_IDX) + list(FIND ARGV "ALIAS" ALIAS_IDX) + if(IMPORTED_IDX EQUAL -1 AND INTERFACE_IDX EQUAL -1 AND ALIAS_IDX EQUAL -1) + get_target_property(IS_LIBRARY_SHARED ${name} TYPE) + if(VCPKG_APPLOCAL_DEPS AND _VCPKG_TARGET_TRIPLET_PLAT MATCHES "windows|uwp" AND (IS_LIBRARY_SHARED STREQUAL "SHARED_LIBRARY" OR IS_LIBRARY_SHARED STREQUAL "MODULE_LIBRARY")) + _vcpkg_set_powershell_path() + add_custom_command(TARGET ${name} POST_BUILD + COMMAND "${_VCPKG_POWERSHELL_PATH}" -noprofile -executionpolicy Bypass -file "${_VCPKG_TOOLCHAIN_DIR}/msbuild/applocal.ps1" + -targetBinary $ + -installedDir "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}$<$:/debug>/bin" + -OutVariable out + ) + endif() + set_target_properties(${name} PROPERTIES VS_USER_PROPS do_not_import_user.props) + set_target_properties(${name} PROPERTIES VS_GLOBAL_VcpkgEnabled false) + endif() +endfunction() + +# This is an experimental function to enable applocal install of dependencies as part of the `make install` process +# Arguments: +# TARGETS - a list of installed targets to have dependencies copied for +# DESTINATION - the runtime directory for those targets (usually `bin`) +function(x_vcpkg_install_local_dependencies) + if(_VCPKG_TARGET_TRIPLET_PLAT MATCHES "windows|uwp") + cmake_parse_arguments(PARSE_ARGV 0 __VCPKG_APPINSTALL "" "DESTINATION" "TARGETS") + _vcpkg_set_powershell_path() + foreach(TARGET IN LISTS __VCPKG_APPINSTALL_TARGETS) + get_target_property(TARGETTYPE ${TARGET} TYPE) + if(NOT TARGETTYPE STREQUAL "INTERFACE_LIBRARY") + install(CODE "message(\"-- Installing app dependencies for ${TARGET}...\") + execute_process(COMMAND \"${_VCPKG_POWERSHELL_PATH}\" -noprofile -executionpolicy Bypass -file \"${_VCPKG_TOOLCHAIN_DIR}/msbuild/applocal.ps1\" + -targetBinary \"\${CMAKE_INSTALL_PREFIX}/${__VCPKG_APPINSTALL_DESTINATION}/$\" + -installedDir \"${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}$<$:/debug>/bin\" + -OutVariable out)") + endif() + endforeach() + endif() +endfunction() + +set(X_VCPKG_APPLOCAL_DEPS_INSTALL ${X_VCPKG_APPLOCAL_DEPS_INSTALL} CACHE BOOL "(experimental) Automatically copy dependencies into the install target directory for executables.") +if(X_VCPKG_APPLOCAL_DEPS_INSTALL) + function(install) + _install(${ARGV}) + + if(ARGV0 STREQUAL "TARGETS") + # Will contain the list of targets + set(PARSED_TARGETS "") + + # Destination - [RUNTIME] DESTINATION argument overrides this + set(DESTINATION "${CMAKE_INSTALL_PREFIX}/bin") + + # Parse arguments given to the install function to find targets and (runtime) destination + set(MODIFIER "") # Modifier for the command in the argument + set(LAST_COMMAND "") # Last command we found to process + foreach(ARG ${ARGN}) + if(ARG MATCHES "ARCHIVE|LIBRARY|RUNTIME|OBJECTS|FRAMEWORK|BUNDLE|PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE") + set(MODIFIER ${ARG}) + continue() + endif() + + if(ARG MATCHES "TARGETS|DESTINATION|PERMISSIONS|CONFIGURATIONS|COMPONENT|NAMELINK_COMPONENT|OPTIONAL|EXCLUDE_FROM_ALL|NAMELINK_ONLY|NAMELINK_SKIP") + set(LAST_COMMAND ${ARG}) + continue() + endif() + + if(LAST_COMMAND STREQUAL "TARGETS") + list(APPEND PARSED_TARGETS "${ARG}") + endif() + + if(LAST_COMMAND STREQUAL "DESTINATION" AND (MODIFIER STREQUAL "" OR MODIFIER STREQUAL "RUNTIME")) + set(DESTINATION "${ARG}") + endif() + endforeach() + + x_vcpkg_install_local_dependencies(TARGETS ${PARSED_TARGETS} DESTINATION ${DESTINATION}) + endif() + endfunction() +endif() + +if(NOT DEFINED VCPKG_OVERRIDE_FIND_PACKAGE_NAME) + set(VCPKG_OVERRIDE_FIND_PACKAGE_NAME find_package) +endif() +macro(${VCPKG_OVERRIDE_FIND_PACKAGE_NAME} name) + # Workaround to set the ROOT_PATH until upstream CMake stops overriding + # the ROOT_PATH at apple OS initialization phase. + # See https://gitlab.kitware.com/cmake/cmake/merge_requests/3273 + if(CMAKE_SYSTEM_NAME STREQUAL iOS) + set(BACKUP_CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH}) + list(APPEND CMAKE_FIND_ROOT_PATH ${VCPKG_CMAKE_FIND_ROOT_PATH}) + endif() + string(TOLOWER "${name}" _vcpkg_lowercase_name) + + if(EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/share/${_vcpkg_lowercase_name}/vcpkg-cmake-wrapper.cmake") + set(ARGS "${ARGV}") + include(${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/share/${_vcpkg_lowercase_name}/vcpkg-cmake-wrapper.cmake) + elseif("${name}" STREQUAL "Boost" AND EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/boost") + # Checking for the boost headers disables this wrapper unless the user has installed at least one boost library + set(Boost_USE_STATIC_LIBS OFF) + set(Boost_USE_MULTITHREADED ON) + unset(Boost_USE_STATIC_RUNTIME) + set(Boost_NO_BOOST_CMAKE ON) + unset(Boost_USE_STATIC_RUNTIME CACHE) + if("${CMAKE_VS_PLATFORM_TOOLSET}" STREQUAL "v120") + set(Boost_COMPILER "-vc120") + else() + set(Boost_COMPILER "-vc140") + endif() + _find_package(${ARGV}) + elseif("${name}" STREQUAL "ICU" AND EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/unicode/utf.h") + function(_vcpkg_find_in_list) + list(FIND ARGV "COMPONENTS" COMPONENTS_IDX) + set(COMPONENTS_IDX ${COMPONENTS_IDX} PARENT_SCOPE) + endfunction() + _vcpkg_find_in_list(${ARGV}) + if(NOT COMPONENTS_IDX EQUAL -1) + _find_package(${ARGV} COMPONENTS data) + else() + _find_package(${ARGV}) + endif() + elseif("${name}" STREQUAL "GSL" AND EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/gsl") + _find_package(${ARGV}) + if(GSL_FOUND AND TARGET GSL::gsl) + set_property( TARGET GSL::gslcblas APPEND PROPERTY IMPORTED_CONFIGURATIONS Release ) + set_property( TARGET GSL::gsl APPEND PROPERTY IMPORTED_CONFIGURATIONS Release ) + if( EXISTS "${GSL_LIBRARY_DEBUG}" AND EXISTS "${GSL_CBLAS_LIBRARY_DEBUG}") + set_property( TARGET GSL::gsl APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( GSL::gsl PROPERTIES IMPORTED_LOCATION_DEBUG "${GSL_LIBRARY_DEBUG}" ) + set_property( TARGET GSL::gslcblas APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug ) + set_target_properties( GSL::gslcblas PROPERTIES IMPORTED_LOCATION_DEBUG "${GSL_CBLAS_LIBRARY_DEBUG}" ) + endif() + endif() + elseif("${name}" STREQUAL "CURL" AND EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/curl") + _find_package(${ARGV}) + if(CURL_FOUND) + if(EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/nghttp2.lib") + list(APPEND CURL_LIBRARIES + "debug" "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/lib/nghttp2.lib" + "optimized" "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/nghttp2.lib") + endif() + endif() + elseif("${_vcpkg_lowercase_name}" STREQUAL "grpc" AND EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/share/grpc") + _find_package(gRPC ${ARGN}) + else() + _find_package(${ARGV}) + endif() + if(CMAKE_SYSTEM_NAME STREQUAL iOS) + set(CMAKE_FIND_ROOT_PATH "${BACKUP_CMAKE_FIND_ROOT_PATH}") + endif() +endmacro() + +set(VCPKG_TOOLCHAIN ON) +set(_UNUSED ${CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION}) +set(_UNUSED ${CMAKE_EXPORT_NO_PACKAGE_REGISTRY}) +set(_UNUSED ${CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY}) +set(_UNUSED ${CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY}) +set(_UNUSED ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP}) + +# Propogate these values to try-compile configurations so the triplet and toolchain load +if(NOT _CMAKE_IN_TRY_COMPILE) + if(_CMAKE_EMULATE_TRY_COMPILE_PLATFORM_VARIABLES) + file(TO_CMAKE_PATH "${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}" _chainload_file) + file(TO_CMAKE_PATH "${_VCPKG_ROOT_DIR}" _root_dir) + file(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/vcpkg.config.cmake" + "set(VCPKG_TARGET_TRIPLET \"${VCPKG_TARGET_TRIPLET}\" CACHE STRING \"\")\n" + "set(VCPKG_TARGET_ARCHITECTURE \"${VCPKG_TARGET_ARCHITECTURE}\" CACHE STRING \"\")\n" + "set(VCPKG_APPLOCAL_DEPS \"${VCPKG_APPLOCAL_DEPS}\" CACHE STRING \"\")\n" + "set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE \"${_chainload_file}\" CACHE STRING \"\")\n" + "set(_VCPKG_ROOT_DIR \"${_root_dir}\" CACHE STRING \"\")\n" + ) + else() + list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES + VCPKG_TARGET_TRIPLET + VCPKG_TARGET_ARCHITECTURE + VCPKG_APPLOCAL_DEPS + VCPKG_CHAINLOAD_TOOLCHAIN_FILE + _VCPKG_ROOT_DIR + ) + endif() +endif() + +if(_VCPKG_HAS_FATAL_ERROR) + message(FATAL_ERROR "${_VCPKG_FATAL_ERROR}") +endif() diff --git a/AWGDependencies/vcpkg-export-pthreads/scripts/cmake/vcpkg_get_windows_sdk.cmake b/AWGDependencies/vcpkg-export-pthreads/scripts/cmake/vcpkg_get_windows_sdk.cmake new file mode 100644 index 0000000..f16d4f5 --- /dev/null +++ b/AWGDependencies/vcpkg-export-pthreads/scripts/cmake/vcpkg_get_windows_sdk.cmake @@ -0,0 +1,16 @@ +#[===[.md: +# vcpkg_get_windows_sdk + +Get the Windows SDK number. + +## Usage: +```cmake +vcpkg_get_windows_sdk() +``` +#]===] + +function(vcpkg_get_windows_sdk ret) + set(WINDOWS_SDK $ENV{WindowsSDKVersion}) + string(REPLACE "\\" "" WINDOWS_SDK "${WINDOWS_SDK}") + set(${ret} ${WINDOWS_SDK} PARENT_SCOPE) +endfunction()