/cvi/instr/AitSipmDAQ/AitSipmDAQDll/.vs/AitSipmDAQ/v14/.suo |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
## -0,0 +1 ## |
+application/octet-stream |
\ No newline at end of property |
Index: AitSipmDAQDll/AitMduManager.dll |
=================================================================== |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/AitSipmDAQDll/AitMduManager.dll |
---|
Property changes: |
Added: svn:mime-type |
## -0,0 +1 ## |
+application/octet-stream |
\ No newline at end of property |
Index: AitSipmDAQDll/AitSipmDAQ.VC.db |
=================================================================== |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/AitSipmDAQDll/AitSipmDAQ.VC.db |
---|
Property changes: |
Added: svn:mime-type |
## -0,0 +1 ## |
+application/octet-stream |
\ No newline at end of property |
Index: AitSipmDAQDll/AitSipmDAQ.sln |
=================================================================== |
--- AitSipmDAQDll/AitSipmDAQ.sln (nonexistent) |
+++ AitSipmDAQDll/AitSipmDAQ.sln (revision 213) |
@@ -0,0 +1,47 @@ |
+ |
+Microsoft Visual Studio Solution File, Format Version 12.00 |
+# Visual Studio 14 |
+VisualStudioVersion = 14.0.25420.1 |
+MinimumVisualStudioVersion = 10.0.40219.1 |
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AitSipmDAQDll", "UnmanagedDllInterface\AitSipmDAQDll.csproj", "{A9829616-449C-4F04-AFF1-B7D11F6ED0C8}" |
+EndProject |
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AitSipmDAQApp", "AitSipmDAQApp\AitSipmDAQApp.vcxproj", "{A133C14A-192C-49DA-936C-0BC2FB5EB54E}" |
+ ProjectSection(ProjectDependencies) = postProject |
+ {A9829616-449C-4F04-AFF1-B7D11F6ED0C8} = {A9829616-449C-4F04-AFF1-B7D11F6ED0C8} |
+ EndProjectSection |
+EndProject |
+Global |
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution |
+ Debug|Any CPU = Debug|Any CPU |
+ Debug|Mixed Platforms = Debug|Mixed Platforms |
+ Debug|Win32 = Debug|Win32 |
+ Release|Any CPU = Release|Any CPU |
+ Release|Mixed Platforms = Release|Mixed Platforms |
+ Release|Win32 = Release|Win32 |
+ EndGlobalSection |
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution |
+ {A9829616-449C-4F04-AFF1-B7D11F6ED0C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
+ {A9829616-449C-4F04-AFF1-B7D11F6ED0C8}.Debug|Any CPU.Build.0 = Debug|Any CPU |
+ {A9829616-449C-4F04-AFF1-B7D11F6ED0C8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU |
+ {A9829616-449C-4F04-AFF1-B7D11F6ED0C8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU |
+ {A9829616-449C-4F04-AFF1-B7D11F6ED0C8}.Debug|Win32.ActiveCfg = Debug|Any CPU |
+ {A9829616-449C-4F04-AFF1-B7D11F6ED0C8}.Release|Any CPU.ActiveCfg = Release|Any CPU |
+ {A9829616-449C-4F04-AFF1-B7D11F6ED0C8}.Release|Any CPU.Build.0 = Release|Any CPU |
+ {A9829616-449C-4F04-AFF1-B7D11F6ED0C8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU |
+ {A9829616-449C-4F04-AFF1-B7D11F6ED0C8}.Release|Mixed Platforms.Build.0 = Release|Any CPU |
+ {A9829616-449C-4F04-AFF1-B7D11F6ED0C8}.Release|Win32.ActiveCfg = Release|Any CPU |
+ {A133C14A-192C-49DA-936C-0BC2FB5EB54E}.Debug|Any CPU.ActiveCfg = Debug|Win32 |
+ {A133C14A-192C-49DA-936C-0BC2FB5EB54E}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 |
+ {A133C14A-192C-49DA-936C-0BC2FB5EB54E}.Debug|Mixed Platforms.Build.0 = Debug|Win32 |
+ {A133C14A-192C-49DA-936C-0BC2FB5EB54E}.Debug|Win32.ActiveCfg = Debug|Win32 |
+ {A133C14A-192C-49DA-936C-0BC2FB5EB54E}.Debug|Win32.Build.0 = Debug|Win32 |
+ {A133C14A-192C-49DA-936C-0BC2FB5EB54E}.Release|Any CPU.ActiveCfg = Release|Win32 |
+ {A133C14A-192C-49DA-936C-0BC2FB5EB54E}.Release|Mixed Platforms.ActiveCfg = Release|Win32 |
+ {A133C14A-192C-49DA-936C-0BC2FB5EB54E}.Release|Mixed Platforms.Build.0 = Release|Win32 |
+ {A133C14A-192C-49DA-936C-0BC2FB5EB54E}.Release|Win32.ActiveCfg = Release|Win32 |
+ {A133C14A-192C-49DA-936C-0BC2FB5EB54E}.Release|Win32.Build.0 = Release|Win32 |
+ EndGlobalSection |
+ GlobalSection(SolutionProperties) = preSolution |
+ HideSolutionNode = FALSE |
+ EndGlobalSection |
+EndGlobal |
Index: AitSipmDAQDll/AitSipmDAQApp/AitMduManager.dll |
=================================================================== |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/AitSipmDAQDll/AitSipmDAQApp/AitMduManager.dll |
---|
Property changes: |
Added: svn:mime-type |
## -0,0 +1 ## |
+application/octet-stream |
\ No newline at end of property |
Index: AitSipmDAQDll/AitSipmDAQApp/AitMduManager.h |
=================================================================== |
--- AitSipmDAQDll/AitSipmDAQApp/AitMduManager.h (nonexistent) |
+++ AitSipmDAQDll/AitSipmDAQApp/AitMduManager.h (revision 213) |
@@ -0,0 +1,48 @@ |
+#ifndef AITMDUMANAGER_H |
+#define AITMDUMANAGER_H |
+#define DLLIMPORT __declspec(dllimport) |
+#ifdef _CVI_ |
+#include <stdbool.h> |
+#endif |
+#ifdef __cplusplus |
+extern "C" |
+{ |
+#endif |
+ |
+ |
+ DLLIMPORT int SD4_BlockError(); |
+ DLLIMPORT unsigned int SD4_GetBlockTimeout(); |
+ DLLIMPORT void SD4_SetBlockTimeout(unsigned int); |
+ DLLIMPORT long SD4_BlockTransferTime(); |
+ DLLIMPORT unsigned int SD4_GetDriverTimeout(); |
+ DLLIMPORT void SD4_SetDriverTimeout(unsigned int); |
+ DLLIMPORT char * SD4_Version(); |
+ DLLIMPORT int SD4_WordsTransferred(); |
+ |
+ DLLIMPORT unsigned int* SD4_FindDevices(int * ndevices); |
+ DLLIMPORT int SD4_GetDeviceCount(); |
+ DLLIMPORT unsigned int* SD4_GetDeviceList(int * ndevices); |
+ DLLIMPORT char * SD4_GetUsbFirmwareVersionByDevice(unsigned int deviceId); |
+ DLLIMPORT char * SD4_GetUsbFirmwareVersion(int index); |
+ DLLIMPORT bool SD4_IsDeviceAttached(unsigned int deviceId); |
+ DLLIMPORT bool SD4_ProgramFpgaFirmwareByDevice(unsigned int deviceId, char * fpgaFirmware); |
+ DLLIMPORT bool SD4_ProgramFpgaFirmware(int index, char* fpgaFirmware); |
+ DLLIMPORT bool SD4_ProgramUsbFirmware(int index, char* usbFirmware); |
+ DLLIMPORT unsigned short SD4_Read(unsigned int deviceId, int address); |
+ DLLIMPORT char * SD4_ReadByteArray(unsigned int deviceId, int address, int requestedsize, int * elementsread); |
+ DLLIMPORT unsigned short * SD4_ReadUShortArray(unsigned int deviceId, int address, int requestedsize, int * elementsread ); |
+ DLLIMPORT void SD4_ReconfigureByDevice(unsigned int deviceId); |
+ DLLIMPORT void SD4_Reconfigure(int index); |
+ DLLIMPORT void SD4_ReconnectByDevice(unsigned int deviceId); |
+ DLLIMPORT void SD4_Reconnect(int index); |
+ DLLIMPORT void SD4_ResetFpga(int index); |
+ DLLIMPORT void SD4_ResetFpgaByDevice(unsigned int deviceId); |
+ DLLIMPORT void SD4_ResetUsb(int index); |
+ DLLIMPORT void SD4_ResetUsbByDevice(unsigned int deviceId); |
+ DLLIMPORT void SD4_Write(unsigned int deviceId, int address, unsigned short data); |
+ DLLIMPORT int SD4_WriteArray(unsigned int deviceId, int address, unsigned short* data); |
+#ifdef __cplusplus |
+} |
+#endif |
+#endif |
+ |
Index: AitSipmDAQDll/AitSipmDAQApp/AitMduManager.lib |
=================================================================== |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/AitSipmDAQDll/AitSipmDAQApp/AitMduManager.lib |
---|
Property changes: |
Added: svn:mime-type |
## -0,0 +1 ## |
+application/octet-stream |
\ No newline at end of property |
Index: AitSipmDAQDll/AitSipmDAQApp/AitMduManager_DEF.h |
=================================================================== |
--- AitSipmDAQDll/AitSipmDAQApp/AitMduManager_DEF.h (nonexistent) |
+++ AitSipmDAQDll/AitSipmDAQApp/AitMduManager_DEF.h (revision 213) |
@@ -0,0 +1,114 @@ |
+#ifndef AITMDUMANAGER_DEF_H |
+#define AITMDUMANAGER_DEF_H |
+ |
+// Registers 0-15 ( RESERVED - DO NOT ACCESS |
+ |
+ |
+//---------------------------------------- |
+// ADC Controller Registers |
+//---------------------------------------- |
+ |
+#define ADDR_BASE ( 16) |
+#define ADDR_CSR_MAIN ( ADDR_BASE + 0) // Main CSR |
+#define ADDR_BUFFER ( ADDR_BASE + 1) // ADC event buffer |
+#define ADDR_BUFFERWORDS ( ADDR_BASE + 2) // 16-bit words available in the ADC event buffer |
+#define ADDR_EVENTID ( ADDR_BASE + 3) // Event ID CSR |
+#define ADDR_CSR_DETECTOR ( ADDR_BASE + 4) // Detector interface CSR |
+#define ADDR_TTLPORT ( ADDR_BASE + 5) // TTL I/O port |
+#define ADDR_ITIME ( ADDR_BASE + 6) // Integration time |
+#define ADDR_CSR_TRIGGER ( ADDR_BASE + 7) // Trigger CSR |
+#define ADDR_DEADTIME ( ADDR_BASE + 8) // Trigger dead time |
+#define ADDR_TG_INTERVALHI ( ADDR_BASE + 9) // Internal trigger generator interval 31:16 |
+#define ADDR_TG_INTERVALLO ( ADDR_BASE + 10) // Internal trigger generator interval 15:0 |
+#define ADDR_TG_COUNTHI ( ADDR_BASE + 11) // Internal trigger generator burst count 31:16 |
+#define ADDR_TG_COUNTLO ( ADDR_BASE + 12) // Internal trigger generator burst count 15:0 |
+#define ADDR_TC_COUNTHI ( ADDR_BASE + 13) // Trigger count 31:16 |
+#define ADDR_TC_COUNTLO ( ADDR_BASE + 14) // Trigger count 15:0 |
+#define ADDR_TC_RATEHI ( ADDR_BASE + 15) // Trigger rate 31:16 |
+#define ADDR_TC_RATELO ( ADDR_BASE + 16) // Trigger rate 15:0 |
+#define ADDR_CONV_COUNTHI ( ADDR_BASE + 17) // ADC conversion count 31:16 |
+#define ADDR_CONV_COUNTLO ( ADDR_BASE + 18) // ADC conversion count 15:0 |
+#define ADDR_CONV_RATEHI ( ADDR_BASE + 19) // ADC conversion rate 31:16 |
+#define ADDR_CONV_RATELO ( ADDR_BASE + 20) // ADC conversion rate 15:0 |
+#define ADDR_DISCR_OFFSET ( ADDR_BASE + 21) // Discriminator offset |
+#define ADDR_DISCR_THRESHOLD ( ADDR_BASE + 22) // Discriminator threshold |
+#define ADDR_MAIN_P12 ( ADDR_BASE + 23) // Main +1.2V power supply monitor |
+#define ADDR_RESERVED2 ( ADDR_BASE + 24) // RESERVED |
+#define ADDR_MAIN_P33 ( ADDR_BASE + 25) // Main +3.3V power supply monitor |
+#define ADDR_MAIN_P50 ( ADDR_BASE + 26) // Main +5.0V power supply monitor |
+#define ADDR_MAIN_PVA ( ADDR_BASE + 27) // Main power supply +VA voltage monitor |
+#define ADDR_MAIN_NVA ( ADDR_BASE + 28) // Main power supply -VA voltage monitor |
+#define ADDR_HV_MAX ( ADDR_BASE + 29) // HV maximum allowable control voltage |
+#define ADDR_HV_RAMPRATE ( ADDR_BASE + 30) // HV ramp rate |
+#define ADDR_HV_CTRL ( ADDR_BASE + 31) // HV control voltage |
+#define ADDR_HV_ILIMIT ( ADDR_BASE + 32) // HV current limit |
+#define ADDR_HV_VMON ( ADDR_BASE + 33) // HV output current monitor |
+#define ADDR_HV_IMON ( ADDR_BASE + 34) // HV output voltage monitor |
+#define ADDR_BASE_TEMPERATURE ( ADDR_BASE + 35) // Base temperature monitor |
+#define ADDR_BASE_PVA ( ADDR_BASE + 36) // Base +VA power supply monitor |
+#define ADDR_BASE_NVA ( ADDR_BASE + 37) // Base -VA power supply monitor |
+#define ADDR_OFFSET1 ( ADDR_BASE + 38) // ADC offset 1 |
+#define ADDR_OFFSET2 ( ADDR_BASE + 39) // ADC offset 2 |
+#define ADDR_OFFSET3 ( ADDR_BASE + 40) // ADC offset 3 |
+#define ADDR_OFFSET4 ( ADDR_BASE + 41) // ADC offset 4 |
+ |
+ |
+//---------------------------------------- |
+// Main CSR bits |
+//---------------------------------------- |
+ |
+ // bit 0 ( RESERVED |
+#define BIT_CSR_MAIN_P12 ( 1) // +1.2V power supply status |
+ // bit 2 ( RESERVED |
+#define BIT_CSR_MAIN_P33 ( 3) // +3.3V power supply status |
+#define BIT_CSR_MAIN_P50 ( 4) // +5.0V power supply status |
+#define BIT_CSR_MAIN_PVA ( 5) // +VA power supply status |
+#define BIT_CSR_MAIN_NVA ( 6) // -VA power supply status |
+ // bits 12:7 ( RESERVED |
+#define BIT_CSR_MAIN_BFULL ( 13) // ADC buffer full status |
+#define BIT_CSR_MAIN_BEMPTY ( 14) // ADC buffer empty status |
+#define BIT_CSR_MAIN_ADCRESET ( 15) // Reset ADC |
+ |
+ |
+//---------------------------------------- |
+// Event ID CSR bits |
+//---------------------------------------- |
+ |
+#define BIT_EVENTID_COUNT ( 0) // Add event count to each Event Block (0(no, 1(yes) |
+#define BIT_EVENTID_TIME ( 1) // Add time stamp to each Event Block (0(no, 1(yes) |
+#define BIT_EVENTID_CHNUM ( 2) // Add channel number to each ADC data word (0(no, 1(yes) |
+ // bits 15:3 ( RESERVED |
+ |
+ |
+//---------------------------------------- |
+// Detector interface CSR bits |
+//---------------------------------------- |
+ |
+#define BIT_CSR_DET_VAENABLE ( 0) // Detector Module +/-VA enable (0 ( disable, 1 ( enable) |
+#define BIT_CSR_DET_VAHIRNG ( 1) // Detector Module +/-VA output range (0 ( low range, 1 ( high range) |
+#define BIT_CSR_DET_HVENABLE ( 2) // Detector Module HV power supply (0 ( disable, 1 ( enable) |
+#define BIT_CSR_DET_HVRESET ( 3) // Detector Module HV power supply fault reset (0 ( reset off, 1 ( reset on) |
+#define BIT_CSR_DET_SUMCOUPLING ( 4) // Sum input coupling (0 ( DC, 1 ( AC) |
+#define BIT_CSR_DET_SUMGAIN1 ( 5) // Sum gain switch 1 (0 ( open, 1 ( closed) |
+#define BIT_CSR_DET_SUMGAIN2 ( 6) // Sum gain switch 2 (0 ( open, 1 ( closed) |
+#define BIT_CSR_DET_SUMGAIN3 ( 7) // Sum gain switch 3 (0 ( open, 1 ( closed) |
+#define BIT_CSR_DET_SUMGAIN4 ( 8) // Sum gain switch 4 (0 ( open, 1 ( closed) |
+#define BIT_CSR_DET_ADCCOUPLING ( 9) // ADC input coupling (0 ( DC, 1 ( AC) |
+#define BIT_CSR_DET_ADCGAIN1 ( 10) // ADC gain switch 1 (0 ( open, 1 ( closed) |
+#define BIT_CSR_DET_ADCGAIN2 ( 11) // ADC gain switch 2 (0 ( open, 1 ( closed) |
+#define BIT_CSR_DET_HVGOOD ( 12) // Detector Module HV status (0 ( fault, 1 ( good) |
+#define BIT_CSR_DET_PVAGOOD ( 13) // Detector Module VA status (0 ( fault, 1 ( good) |
+#define BIT_CSR_DET_NVAGOOD ( 14) // Detector Module VA status (0 ( fault, 1 ( good) |
+#define BIT_CSR_DET_TEMPVALID ( 15) // Detector Module temperature status (0 ( fault, 1 ( connected) |
+ |
+ |
+//---------------------------------------- |
+// Trigger CSR bits |
+//---------------------------------------- |
+ |
+#define BIT_CSR_TRIG_CONTINUOUS ( 0) // Internal continuous trigger (0(off, 1(on) |
+#define BIT_CSR_TRIG_BURST ( 1) // Internal burst trigger (0(off, 0(on) |
+#define BIT_CSR_TRIG_DISCR ( 2) // Discriminator trigger (0(off, 0(on) |
+#define BIT_CSR_TRIG_EXTERNAL ( 3) // External trigger (0(off, 0(on) |
+ // bits 15:4 ( RESERVED |
+#endif |
\ No newline at end of file |
Index: AitSipmDAQDll/AitSipmDAQApp/AitSipmDAQApp.cpp |
=================================================================== |
--- AitSipmDAQDll/AitSipmDAQApp/AitSipmDAQApp.cpp (nonexistent) |
+++ AitSipmDAQDll/AitSipmDAQApp/AitSipmDAQApp.cpp (revision 213) |
@@ -0,0 +1,1062 @@ |
+// NativeExportsConsumerApp.cpp : Defines the entry point for the console application. |
+// |
+ |
+#include "stdafx.h" |
+#include <string.h> |
+#include <windows.h> |
+#include "AitMduManager.h" |
+#include "AitMduManager_DEF.h" |
+ |
+typedef unsigned short ushort; |
+typedef unsigned int uint; |
+ |
+extern "C" |
+{ |
+ DLLIMPORT void NE_Rainbow(); |
+ |
+ DLLIMPORT int NE_Func(int a); |
+ DLLIMPORT int NE_Ptr2ByteArray(char *, int len); |
+ DLLIMPORT char * NE_ByteArray2Ptr(char *, int *); |
+ DLLIMPORT int NE_Ptr2String(char *, int len); |
+ DLLIMPORT int NE_String2Ptr(char *); |
+ DLLIMPORT char * NE_String(); |
+ DLLIMPORT unsigned int * NE_UInt(int *); |
+} |
+ |
+#ifdef _DEBUG |
+#pragma comment(lib, "../UnmanagedDllInterface/bin/Debug/AitSipmDAQDll.lib") |
+#else |
+#pragma comment(lib, "../UnmanagedDllInterface/bin/Release/AitSipmDAQDll.lib") |
+#endif |
+ |
+uint deviceId = 0; |
+int deviceIndex = -1; |
+int adcBufferLen; |
+ushort * adcBuffer; |
+int histograms[4][0xFFF]; |
+int histogramTotalEvents = 0; |
+ |
+const double MONADC_SCALE = 65535.0; // 16-bit monitor ADC |
+const double DAC_SCALE = 65535.0; // 16-bit DAC |
+const double MONADC_VRANGE = 2.5; // 2.5V ADC voltage range |
+const double DISCR_OFFSETRANGE = 250.0; // +/- 250mV discriminator offset range |
+const double DISCR_THRESHOLDRANGE = 1000.0; // 0-1000mV discriminator threshold range |
+const double HV_IRANGE = 5.0; // 0-5.0mA HV current monitor range |
+const double HV_VRANGE = 80.0; // 0-80V HV voltage control range |
+const int INTEGRATOR_LSB = 10; // 10ns integrator time resolution |
+const double RAMPRATESCALE = 61036.0; // Ramp rate register setting = (rate in V/s) / RAMPRATESCALE |
+const char statusNoDevice[0xFF] = "No Device Connected"; |
+const char statusReconfig[0xFF] = "Reconfiguring Device ... "; |
+const char statusReset[0xFF] = "Resetting Device ... "; |
+const char statusReconnect[0xFF] = "Reconnecting Device ... "; |
+const char statusDone[0xFF] = "Done"; |
+ |
+/* |
+void Sleep(int musec) { |
+ |
+} |
+*/ |
+ |
+//---------------------------------------- |
+// Utilities |
+//---------------------------------------- |
+ushort SetBit(ushort data, int bitIndex, bool bitValue) |
+{ |
+ if (bitValue == true) |
+ return (ushort)(data | (1 << bitIndex)); |
+ else |
+ return (ushort)(data & ~(1 << bitIndex)); |
+} |
+ |
+bool GetBit(int data, int bitIndex) |
+{ |
+ return (data & (1 << bitIndex)) != 0; |
+} |
+ |
+ushort ReadSD4Register(int reg) |
+{ |
+ return SD4_Read(deviceId, reg); |
+} |
+ |
+uint ReadSD4Register32(int addrHi, int addrLo) |
+{ |
+ uint dataHi = (uint)SD4_Read(deviceId, addrHi); |
+ uint dataLo = (uint)SD4_Read(deviceId, addrLo); |
+ return (dataHi << 16) | dataLo; |
+} |
+ |
+void WriteSD4Register(int address, ushort data) |
+{ |
+ SD4_Write(deviceId, address, data); |
+} |
+ |
+void WriteSD4Register32(int addrHi, int addrLo, uint data) |
+{ |
+ WriteSD4Register(addrHi, (ushort)(data >> 16)); |
+ WriteSD4Register(addrLo, (ushort)data); |
+} |
+ |
+ |
+void ReadModifyWrite(int reg, int bitIndex, bool bitValue) |
+{ |
+ ushort regData = ReadSD4Register(reg); |
+ regData = SetBit(regData, bitIndex, bitValue); |
+ WriteSD4Register(reg, regData); |
+} |
+ |
+double LimitSetting(double value, double min, double max) |
+{ |
+ double limited = value; |
+ if (limited > max) limited = max; |
+ if (limited < min) limited = min; |
+ return limited; |
+} |
+ |
+ |
+ |
+int ReadAdcBuffer() |
+{ |
+ //if (adcBuffer == NULL) |
+ // return -1; |
+ int bytes = 0; |
+ //printf("In\n%d\n%d\n%d\n", deviceId, ADDR_BUFFER, adcBufferLen); |
+ adcBuffer = SD4_ReadUShortArray(deviceId, ADDR_BUFFER, adcBufferLen, &bytes); |
+ return bytes; |
+} |
+// Equivalent to ReadAdcBuffer() except using byte buffer for acquisition |
+int ReadAdcByteBuffer() |
+{ |
+ if (adcBuffer == NULL) |
+ return -1; |
+ int bytes = 0; |
+ char * byteBuffer = SD4_ReadByteArray(deviceId, ADDR_BUFFER, adcBufferLen * 2, &bytes); |
+ int byteIndex = 0; |
+ int words = bytes / 2; |
+ ushort dataword = 0; |
+ for (int i = 0; i < words; i++) |
+ { |
+ dataword = (ushort)(byteBuffer[byteIndex++] << 8); |
+ adcBuffer[i] = (ushort)(dataword | byteBuffer[byteIndex++]); |
+ } |
+ return words; |
+} |
+ |
+ |
+ |
+ |
+ |
+ |
+//---------------------------------------- |
+// Monitor ADC |
+//---------------------------------------- |
+ |
+double GetVoltage(int reg) |
+{ |
+ return ReadSD4Register(reg) * MONADC_VRANGE / MONADC_SCALE; |
+} |
+ |
+double GetDetectorTemperature() |
+{ |
+ // Temperature = 500mV + 1mV per degree C |
+ return (GetVoltage(ADDR_BASE_TEMPERATURE) - 0.5) / 0.01; |
+} |
+ |
+double GetHvVoltage(int reg) |
+{ |
+ return GetVoltage(reg) / MONADC_VRANGE * HV_VRANGE; |
+} |
+ |
+double GetHvCurrentInUa() |
+{ |
+ // 2.5V ADC input voltage = 5000 microamps |
+ return GetVoltage(ADDR_HV_IMON) * 2000.0; |
+} |
+ |
+double GetVoltage75(int reg) |
+{ |
+ // 2.5V ADC input voltage = 7.5V monitor voltage |
+ return GetVoltage(reg) * 3.0; |
+} |
+ |
+ |
+ |
+//---------------------------------------- |
+// Discriminator, Sum |
+//---------------------------------------- |
+ |
+void SetSumGain(int gain) |
+{ |
+ ushort csrDetector = ReadSD4Register(ADDR_CSR_DETECTOR); |
+ bool g1 = GetBit(gain, 0); |
+ bool g2 = GetBit(gain, 1); |
+ bool g3 = GetBit(gain, 2); |
+ bool g4 = GetBit(gain, 3); |
+ csrDetector = SetBit(csrDetector, BIT_CSR_DET_SUMGAIN1, g1); |
+ csrDetector = SetBit(csrDetector, BIT_CSR_DET_SUMGAIN2, g2); |
+ csrDetector = SetBit(csrDetector, BIT_CSR_DET_SUMGAIN3, g3); |
+ csrDetector = SetBit(csrDetector, BIT_CSR_DET_SUMGAIN4, g4); |
+ WriteSD4Register(ADDR_CSR_DETECTOR, (ushort)csrDetector); |
+} |
+ |
+void SetSumCoupling(bool acCoupling) |
+{ |
+ ReadModifyWrite(ADDR_CSR_DETECTOR, BIT_CSR_DET_SUMCOUPLING, acCoupling); |
+} |
+ |
+void SetThreshold(double thresholdInMillivolts) |
+{ |
+ thresholdInMillivolts = LimitSetting(thresholdInMillivolts, -DISCR_THRESHOLDRANGE, DISCR_THRESHOLDRANGE); |
+ WriteSD4Register(ADDR_DISCR_THRESHOLD, (ushort)(thresholdInMillivolts * DAC_SCALE / DISCR_THRESHOLDRANGE)); |
+} |
+ |
+double GetThreshold() |
+{ |
+ return ReadSD4Register(ADDR_DISCR_THRESHOLD) / DAC_SCALE * DISCR_THRESHOLDRANGE; |
+} |
+ |
+double GetSumOffsetInMv() |
+{ |
+ // Sum offsets are with respect to the positive sum output polarity. |
+ return (ReadSD4Register(ADDR_DISCR_OFFSET) / DAC_SCALE * (DISCR_OFFSETRANGE * 2)) - DISCR_OFFSETRANGE; |
+} |
+ |
+void SetSumOffset(double milliVolts) |
+{ |
+ // Sum offsets are with respect to the positive sum output polarity. |
+ // Actual output offset is multiplied by the selectable gain stage. |
+ WriteSD4Register(ADDR_DISCR_OFFSET, (ushort)((milliVolts + DISCR_OFFSETRANGE) * DAC_SCALE / (DISCR_OFFSETRANGE * 2))); |
+} |
+ |
+ |
+ |
+//---------------------------------------- |
+// Trigger |
+//---------------------------------------- |
+ |
+void SetTriggerInterval(int triggerInterval) |
+{ |
+ WriteSD4Register32(ADDR_TG_INTERVALHI, ADDR_TG_INTERVALLO, (uint)(triggerInterval / INTEGRATOR_LSB)); |
+} |
+ |
+void SetTriggerBurst(int triggerBurst) |
+{ |
+ WriteSD4Register32(ADDR_TG_COUNTHI, ADDR_TG_COUNTLO, (uint)triggerBurst); |
+} |
+ |
+void EnableTrigger(int bitIndex) |
+{ |
+ WriteSD4Register(ADDR_CSR_TRIGGER, SetBit(0, bitIndex, true)); |
+} |
+ |
+void DisableTriggers() |
+{ |
+ WriteSD4Register(ADDR_CSR_TRIGGER, 0); |
+} |
+ |
+void SetDeadTime(int deadTimeInNs) |
+{ |
+ WriteSD4Register(ADDR_DEADTIME, (ushort)(deadTimeInNs / INTEGRATOR_LSB)); |
+} |
+ |
+ |
+ |
+//---------------------------------------- |
+// Integrators, ADCs |
+//---------------------------------------- |
+ |
+void SetIntegrationTime(int integrationTime) |
+{ |
+ WriteSD4Register(ADDR_ITIME, (ushort)(integrationTime / INTEGRATOR_LSB)); |
+} |
+ |
+int GetIntegrationTime() |
+{ |
+ return ReadSD4Register(ADDR_ITIME) * INTEGRATOR_LSB; |
+} |
+ |
+void SetAdcCoupling(bool acCoupling) |
+{ |
+ ReadModifyWrite(ADDR_CSR_DETECTOR, BIT_CSR_DET_ADCCOUPLING, acCoupling); |
+} |
+ |
+void ResetAdc(bool reset) |
+{ |
+ ushort cmd = 0; |
+ cmd = SetBit(cmd, BIT_CSR_MAIN_ADCRESET, reset); |
+ WriteSD4Register(ADDR_CSR_MAIN, cmd); |
+} |
+ |
+double GetAdcOffsetInMv(int reg) |
+{ |
+ // ADC offset polarity is with respect to the positive ADC polarity (integrator output), not the main negative input signal polarity. |
+ // Actual output offset is multiplied by the selectable gain stage. |
+ return DISCR_OFFSETRANGE - (ReadSD4Register(reg) / DAC_SCALE * (DISCR_OFFSETRANGE * 2)); |
+} |
+ |
+void SetAdcOffset(int reg, double milliVolts) |
+{ |
+ // ADC offset polarity is with respect to the positive ADC polarity (integrator output), not the main negative input signal polarity. |
+ // Actual output offset is multiplied by the selectable gain stage. |
+ WriteSD4Register(reg, (ushort)((DISCR_OFFSETRANGE - milliVolts) * DAC_SCALE / (DISCR_OFFSETRANGE * 2))); |
+} |
+ |
+ |
+ |
+//---------------------------------------- |
+// Event ID |
+//---------------------------------------- |
+ |
+void AddEventCount(bool addEventCount) |
+{ |
+ ReadModifyWrite(ADDR_EVENTID, BIT_EVENTID_COUNT, addEventCount); |
+} |
+ |
+void AddTimeStamp(bool addTimeStamp) |
+{ |
+ ReadModifyWrite(ADDR_EVENTID, BIT_EVENTID_TIME, addTimeStamp); |
+} |
+ |
+void AddChannelNumber(bool addChannelNumber) |
+{ |
+ ReadModifyWrite(ADDR_EVENTID, BIT_EVENTID_CHNUM, addChannelNumber); |
+} |
+ |
+ |
+ |
+//---------------------------------------- |
+// Detector VA |
+//---------------------------------------- |
+ |
+void SetDetectorVaOn(bool on) |
+{ |
+ ReadModifyWrite(ADDR_CSR_DETECTOR, BIT_CSR_DET_VAENABLE, on); |
+} |
+ |
+void SetDetectorVaHiRange(bool range) |
+{ |
+ ReadModifyWrite(ADDR_CSR_DETECTOR, BIT_CSR_DET_VAHIRNG, range); |
+} |
+ |
+ |
+ |
+//---------------------------------------- |
+// High Voltage |
+//---------------------------------------- |
+ |
+void SetHvCurrentLimit(double milliamps) |
+{ |
+ milliamps = LimitSetting(milliamps, 0, HV_IRANGE); |
+ WriteSD4Register(ADDR_HV_ILIMIT, (ushort)(milliamps * DAC_SCALE / HV_IRANGE)); |
+} |
+ |
+void SetHvVoltage(int reg, double volts) |
+{ |
+ volts = LimitSetting(volts, 0, HV_VRANGE); |
+ WriteSD4Register(reg, (ushort)(volts * DAC_SCALE / HV_VRANGE)); |
+} |
+ |
+double GetHvIlimitSetting() |
+{ |
+ return ReadSD4Register(ADDR_HV_ILIMIT) / DAC_SCALE * HV_IRANGE; |
+} |
+ |
+double GetHvVoltageSetting() |
+{ |
+ return ReadSD4Register(ADDR_HV_CTRL) / DAC_SCALE * HV_VRANGE; |
+} |
+ |
+void SetHvOn(bool hvOn) |
+{ |
+ ReadModifyWrite(ADDR_CSR_DETECTOR, BIT_CSR_DET_HVENABLE, hvOn); |
+} |
+ |
+void SetMaximumHvSetting(double volts) |
+{ |
+ SetHvVoltage(ADDR_HV_MAX, volts); |
+} |
+ |
+void CycleHvReset() |
+{ |
+ // CAUTION: Holding HV in reset will force it to ignore the current limit |
+ ReadModifyWrite(ADDR_CSR_DETECTOR, BIT_CSR_DET_HVRESET, true); |
+ ReadModifyWrite(ADDR_CSR_DETECTOR, BIT_CSR_DET_HVRESET, false); |
+} |
+ |
+void SetRampRate(double voltsPerSecond) |
+{ |
+ WriteSD4Register(ADDR_HV_RAMPRATE, (ushort)(RAMPRATESCALE / voltsPerSecond)); |
+} |
+ |
+double GetRampRate() |
+{ |
+ return RAMPRATESCALE / (ReadSD4Register(ADDR_HV_RAMPRATE) + 1); |
+} |
+ |
+void SetAdcGain(int gain) |
+{ |
+ ushort csrDetector = ReadSD4Register(ADDR_CSR_DETECTOR); |
+ bool g1 = GetBit(gain, 0); |
+ bool g2 = GetBit(gain, 1); |
+ csrDetector = SetBit(csrDetector, BIT_CSR_DET_ADCGAIN1, g1); |
+ csrDetector = SetBit(csrDetector, BIT_CSR_DET_ADCGAIN2, g2); |
+ WriteSD4Register(ADDR_CSR_DETECTOR, (ushort)csrDetector); |
+} |
+ |
+void SetAdcOffsets(int offsetInMv) |
+{ |
+ //nudOffset1.Value = offsetInMv; |
+ //nudOffset2.Value = offsetInMv; |
+ //nudOffset3.Value = offsetInMv; |
+ //nudOffset4.Value = offsetInMv; |
+ SetAdcOffset(ADDR_OFFSET1, offsetInMv); |
+ SetAdcOffset(ADDR_OFFSET2, offsetInMv); |
+ SetAdcOffset(ADDR_OFFSET3, offsetInMv); |
+ SetAdcOffset(ADDR_OFFSET4, offsetInMv); |
+} |
+ |
+void QuickSetupContinuous() |
+{ |
+ // Set ADC reset |
+ ResetAdc(true); |
+ |
+ // Clear ADC reset |
+ ResetAdc(false); |
+ |
+ // Set trigger dead time to 200ns |
+ SetDeadTime(200); |
+ |
+ // Set event ID |
+ AddTimeStamp(true); |
+ AddEventCount(true); |
+ AddChannelNumber(true); |
+ |
+ // Enable detector amplifier voltage |
+ SetDetectorVaHiRange(false); |
+ SetDetectorVaOn(true); |
+ |
+ /* |
+ // Set HV current limit |
+ double iLimit = 2.5; |
+ nudHvIlimit.Value = (decimal)iLimit; |
+ SetHvCurrentLimit(iLimit); |
+ |
+ // Reset any HV faults |
+ CycleHvReset(); |
+ |
+ // Enable bias voltage |
+ SetHvOn(false); |
+ SetHvOn(true); |
+ |
+ // Set bias voltage |
+ double hvVoltage = 30.0; |
+ nudHvVoltage.Value = (decimal)hvVoltage; |
+ SetHvVoltage(ADDR_HV_CTRL, hvVoltage); |
+ */ |
+ |
+ // Set integration time |
+ int integrationTime = 350; |
+ //nudIntegrationTime.Value = integrationTime; |
+ SetIntegrationTime(integrationTime); |
+ |
+ // Set discriminator threshold |
+ int threshold = 50; |
+ //nudThreshold.Value = threshold; |
+ SetThreshold(threshold); |
+ |
+ // Set sum coupling |
+ SetSumCoupling(true); |
+ |
+ // Set sum gain |
+ int sumGain = 3; |
+ //nudSumGain.Value = sumGain; |
+ SetSumGain(sumGain); |
+ |
+ // Set sum offset |
+ int offset = 0; |
+ //nudSumOffset.Value = offset; |
+ SetSumOffset(offset); |
+ |
+ // Set ADC coupling |
+ SetAdcCoupling(false); |
+ |
+ // Set ADC gains |
+ int gain = 1; |
+ //nudAdcGain.Value = gain; |
+ SetAdcGain(gain); |
+ |
+ // Set all ADC offsets |
+ SetAdcOffsets(5); |
+ |
+ // Set internal trigger interval |
+ int triggerInterval = 1000; |
+ //nudTriggerInterval.Value = triggerInterval; |
+ SetTriggerInterval(triggerInterval); |
+ |
+ // Enable continuous trigger |
+ EnableTrigger(BIT_CSR_TRIG_CONTINUOUS); |
+ |
+ // Begin continuous acquisition |
+ //nudEventsPerAcquisition.Value = 50000; |
+ //cbAcquireContinuous.Checked = true; |
+ |
+ // Update histogram offsets |
+ //SetAllHistogramOffsets(0); |
+} |
+ |
+ |
+void QuickSetupDiscriminator() |
+{ |
+ // Set ADC reset |
+ ResetAdc(true); |
+ |
+ // Clear ADC reset |
+ ResetAdc(false); |
+ |
+ // Set trigger dead time to 300ns |
+ SetDeadTime(500); |
+ |
+ // Set event ID |
+ AddTimeStamp(true); |
+ AddEventCount(true); |
+ AddChannelNumber(true); |
+ |
+ // Enable detector amplifier voltage |
+ SetDetectorVaHiRange(true); |
+ SetDetectorVaOn(true); |
+ |
+ // Set HV current limit |
+ double iLimit = 2.5; |
+ //nudHvIlimit.Value = (decimal)iLimit; |
+ SetHvCurrentLimit(iLimit); |
+ |
+ // Reset any HV faults |
+ CycleHvReset(); |
+ |
+ // Enable bias voltage |
+ SetHvOn(false); |
+ SetHvOn(true); |
+ |
+ // Set bias voltage |
+ double hvVoltage = 30.0; |
+ //nudHvVoltage.Value = (decimal)hvVoltage; |
+ SetHvVoltage(ADDR_HV_CTRL, hvVoltage); |
+ |
+ // Set integration time |
+ int integrationTime = 350; |
+ //nudIntegrationTime.Value = integrationTime; |
+ SetIntegrationTime(integrationTime); |
+ |
+ // Set discriminator threshold |
+ int threshold = 50; |
+ //nudThreshold.Value = threshold; |
+ SetThreshold(threshold); |
+ |
+ // Set sum coupling |
+ SetSumCoupling(true); |
+ |
+ // Set sum gain |
+ int sumGain = 3; |
+ //nudSumGain.Value = sumGain; |
+ SetSumGain(sumGain); |
+ |
+ // Set sum offset |
+ int offset = 0; |
+ //nudSumOffset.Value = offset; |
+ SetSumOffset(offset); |
+ |
+ // Set ADC coupling |
+ SetAdcCoupling(false); |
+ |
+ // Set ADC gains |
+ int gain = 1; |
+ //nudAdcGain.Value = gain; |
+ SetAdcGain(gain); |
+ |
+ // Set all ADC offsets |
+ SetAdcOffsets(5); |
+ |
+ // Clear histograms |
+ //ClearHistograms(); |
+ |
+ // Enable discriminator trigger |
+ EnableTrigger(BIT_CSR_TRIG_DISCR); |
+ |
+ // Begin continuous acquisition |
+ //nudEventsPerAcquisition.Value = 1000; |
+ //cbAcquireContinuous.Checked = true; |
+ |
+ // Update histogram offsets |
+ //SetAllHistogramOffsets(0); |
+} |
+ |
+void QuickSetupTriggerOff() |
+{ |
+ //cbAcquireContinuous.Checked = false; |
+ DisableTriggers(); |
+ SetHvOn(false); |
+ SetDetectorVaOn(false); |
+} |
+ |
+void ReadRegisters() |
+{ |
+ if (deviceIndex < 0) |
+ return; |
+ |
+ // Voltages |
+ double lHvImon = GetHvCurrentInUa(); |
+ double HvVmon = GetHvVoltage(ADDR_HV_VMON); |
+ double HvVmax = GetHvVoltage(ADDR_HV_MAX); |
+ double lDetPva = GetVoltage75(ADDR_BASE_PVA); |
+ double lDetNva = GetVoltage75(ADDR_BASE_NVA); |
+ double lPva = GetVoltage75(ADDR_MAIN_PVA); |
+ double lNva = GetVoltage75(ADDR_MAIN_NVA); |
+ double l12V = GetVoltage(ADDR_MAIN_P12); |
+ double l33V = GetVoltage75(ADDR_MAIN_P33); |
+ double l50V = GetVoltage75(ADDR_MAIN_P50); |
+ double Temperature = GetDetectorTemperature(); |
+ double lRampRate = GetRampRate(); |
+ |
+ // Integration time |
+ int lItime = GetIntegrationTime(); |
+ |
+ // Buffer memory used |
+ int lBufferWords = ReadSD4Register(ADDR_BUFFERWORDS); |
+ |
+ // Offsets |
+ double lOffset1 = GetAdcOffsetInMv(ADDR_OFFSET1); |
+ double lOffset2 = GetAdcOffsetInMv(ADDR_OFFSET2); |
+ double lOffset3 = GetAdcOffsetInMv(ADDR_OFFSET3); |
+ double lOffset4 = GetAdcOffsetInMv(ADDR_OFFSET4); |
+ double lSumOffset = GetSumOffsetInMv(); |
+ |
+ // Main CSR |
+ int csrMain = ReadSD4Register(ADDR_CSR_MAIN); |
+ int lPvaStatus = GetBit(csrMain, BIT_CSR_MAIN_PVA); |
+ int lNvaStatus = GetBit(csrMain, BIT_CSR_MAIN_NVA); |
+ int l12vStatus = GetBit(csrMain, BIT_CSR_MAIN_P12); |
+ int l33vStatus = GetBit(csrMain, BIT_CSR_MAIN_P33); |
+ int l5vStatus = GetBit(csrMain, BIT_CSR_MAIN_P50); |
+ |
+ // Trigger CSR |
+ // Assumes only one trigger source is active |
+ char lTriggerSource[0xFF]; |
+ int csrTrigger = ReadSD4Register(ADDR_CSR_TRIGGER); |
+ if (GetBit(csrTrigger, BIT_CSR_TRIG_CONTINUOUS)) |
+ sprintf_s(lTriggerSource, 0xFF, "CONTINUOUS"); |
+ else if (GetBit(csrTrigger, BIT_CSR_TRIG_BURST)) |
+ sprintf_s(lTriggerSource, 0xFF, "BURST"); |
+ else if (GetBit(csrTrigger, BIT_CSR_TRIG_DISCR)) |
+ sprintf_s(lTriggerSource, 0xFF, "DISCRIMINATOR"); |
+ else if (GetBit(csrTrigger, BIT_CSR_TRIG_EXTERNAL)) |
+ sprintf_s(lTriggerSource, 0xFF, "EXTERNAL"); |
+ else |
+ sprintf_s(lTriggerSource, 0xFF, "OFF"); |
+ |
+ // Event ID CSR |
+ int csrEventId = ReadSD4Register(ADDR_EVENTID); |
+ int addTimeStamp = GetBit(csrEventId, BIT_EVENTID_TIME); |
+ int addEventCount = GetBit(csrEventId, BIT_EVENTID_COUNT); |
+ int addChannelNum = GetBit(csrEventId, BIT_EVENTID_CHNUM); |
+ //lTimeStamp.Text = addTimeStamp ? "+" : ""; |
+ //lEventCount.Text = addEventCount ? "+" : ""; |
+ //lChannelNum.Text = addChannelNum ? "+" : ""; |
+ |
+ // Trigger generator |
+ int lTriggerInterval = ReadSD4Register32(ADDR_TG_INTERVALHI, ADDR_TG_INTERVALLO) * 10; |
+ int lTrigCount = ReadSD4Register32(ADDR_TG_COUNTHI, ADDR_TG_COUNTLO); |
+ ushort dum = 0; |
+ WriteSD4Register(ADDR_TC_COUNTLO, dum); // latch counters by writing to any counter register |
+ int lTriggers = ReadSD4Register32(ADDR_TC_COUNTHI, ADDR_TC_COUNTLO); |
+ int lTriggerRate = ReadSD4Register32(ADDR_TC_RATEHI, ADDR_TC_RATELO); |
+ int lAdcConversions = ReadSD4Register32(ADDR_CONV_COUNTHI, ADDR_CONV_COUNTLO); |
+ double lThreshold = GetThreshold(); |
+ double lHvIlimit = GetHvIlimitSetting(); |
+ double lHvVoltage = GetHvVoltageSetting(); |
+ |
+ // Detector CSR |
+ int csrDetector = ReadSD4Register(ADDR_CSR_DETECTOR); |
+ int lHvEnabled = GetBit(csrDetector, BIT_CSR_DET_HVENABLE); |
+ int lHvOn = GetBit(csrDetector, BIT_CSR_DET_HVGOOD); |
+ int lSumCoupling = GetBit(csrDetector, BIT_CSR_DET_SUMCOUPLING); |
+ int lSumGain = |
+ ((GetBit(csrDetector, BIT_CSR_DET_SUMGAIN4) ? 1 : 0) << 3) | |
+ ((GetBit(csrDetector, BIT_CSR_DET_SUMGAIN3) ? 1 : 0) << 2) | |
+ ((GetBit(csrDetector, BIT_CSR_DET_SUMGAIN2) ? 1 : 0) << 1) | |
+ ((GetBit(csrDetector, BIT_CSR_DET_SUMGAIN1) ? 1 : 0) << 0); |
+ int lAdcCoupling = GetBit(csrDetector, BIT_CSR_DET_ADCCOUPLING); |
+ int lAdcGain = ((GetBit(csrDetector, BIT_CSR_DET_ADCGAIN2) ? 1 : 0) << 1) | |
+ ((GetBit(csrDetector, BIT_CSR_DET_ADCGAIN1) ? 1 : 0) << 0); |
+ int lAmpEnabled = GetBit(csrDetector, BIT_CSR_DET_VAENABLE); |
+ int lAmpLevel = GetBit(csrDetector, BIT_CSR_DET_VAHIRNG); |
+ int lDetPvaStatus = GetBit(csrDetector, BIT_CSR_DET_PVAGOOD); |
+ int lDetNvaStatus = GetBit(csrDetector, BIT_CSR_DET_NVAGOOD); |
+ int lTemperatureOn = GetBit(csrDetector, BIT_CSR_DET_TEMPVALID); |
+} |
+ |
+ |
+ |
+//---------------------------------------- |
+// Message list |
+//---------------------------------------- |
+ |
+void AddMessage(const char * message) |
+{ |
+ printf("%s\n", message); |
+} |
+ |
+ |
+ |
+ |
+ |
+//---------------------------------------- |
+// MDU Events |
+//---------------------------------------- |
+ /* |
+private void AitDeviceAttached(object sender, EventArgs e) |
+{ |
+ MduManager.DeviceChangedEventArgs aitEventArgs = e as MduManager.DeviceChangedEventArgs; |
+ AddMessage(String.Format("Attached : Index={0}, ID={1:X8}", aitEventArgs.DeviceIndex, aitEventArgs.DeviceId)); |
+ UpdateDeviceList(); |
+} |
+ |
+private void AitDeviceRemoved(object sender, EventArgs e) |
+{ |
+ MduManager.DeviceChangedEventArgs aitEventArgs = e as MduManager.DeviceChangedEventArgs; |
+ AddMessage(String.Format("Removed : Index={0}, ID={1:X8}", aitEventArgs.DeviceIndex, aitEventArgs.DeviceId)); |
+ UpdateDeviceList(); |
+} |
+ |
+*/ |
+ |
+//---------------------------------------- |
+// Device Control |
+//---------------------------------------- |
+ |
+int UpdateDeviceList() |
+{ |
+ |
+ deviceIndex = -1; |
+ deviceId = 0; |
+ int deviceCount = 0; |
+ uint * devIds = SD4_GetDeviceList(&deviceCount); |
+ for (int i = 0; i < deviceCount; i++) { |
+ printf("Device %d = 0x%8x\n", i, devIds[i]); |
+ deviceId = devIds[i]; |
+ deviceIndex = i; |
+ } |
+ return deviceCount; |
+} |
+ |
+void ResetDevice() |
+{ |
+ if (deviceIndex >= 0) |
+ { |
+ AddMessage(statusReset); |
+ SD4_ResetFpga(deviceIndex); |
+ Sleep(500); |
+ UpdateDeviceList(); |
+ AddMessage(statusReset); |
+ AddMessage(statusDone); |
+ } |
+ else |
+ AddMessage(statusNoDevice); |
+} |
+ |
+void ReconnectDevice() |
+{ |
+ if (deviceIndex >= 0) |
+ { |
+ AddMessage(statusReconnect); |
+ SD4_Reconnect(deviceIndex); |
+ Sleep(500); |
+ AddMessage(statusReconnect); |
+ AddMessage(statusDone); |
+ } |
+ else |
+ AddMessage(statusNoDevice); |
+} |
+ |
+void ReconfigureDevice() |
+{ |
+ if (deviceIndex >= 0) |
+ { |
+ AddMessage(statusReconfig); |
+ SD4_Reconfigure(deviceIndex); |
+ Sleep(500); |
+ SD4_ResetFpga(deviceIndex); |
+ UpdateDeviceList(); |
+ AddMessage(statusReconfig); |
+ AddMessage(statusDone); |
+ } |
+ else |
+ AddMessage(statusNoDevice); |
+} |
+ |
+//---------------------------------------- |
+// Initialize Device Connection |
+//---------------------------------------- |
+ |
+void InitializeConnection() |
+{ |
+ int ndevices = 0; |
+ unsigned int * devlist = SD4_FindDevices(&ndevices); |
+ printf("Found %d devices\n", ndevices); |
+ //SD4.DeviceAttached += new EventHandler(AitDeviceAttached); |
+ //SD4.DeviceRemoved += new EventHandler(AitDeviceRemoved); |
+ //tscbDeviceList.SelectedIndexChanged += new EventHandler(tscbDeviceList_SelectedIndexChanged); |
+ printf("Updated devices %d\n", UpdateDeviceList()); |
+} |
+ |
+ |
+const int CHANNELS = 4; // 4-Channel DAQ |
+const int ADCMAX = 4096; // 12-bit ADC |
+ |
+bool addTimeStamp = false; // updated by ReadRegisters |
+bool addEventCount = false; // updated by ReadRegisters |
+bool addChannelNum = false; // updated by ReadRegisters |
+ |
+int TIMESTAMP_LSB = 10; // 10ns time stamp resolution |
+ |
+ |
+ |
+int GetAdcEventSize() |
+{ |
+ int eventSize = CHANNELS; |
+ if (addTimeStamp == true) |
+ eventSize += 3; // 3 16-bit words for time stamp |
+ if (addEventCount == true) |
+ eventSize += 2; // 2 16-bit words for event count |
+ return eventSize; |
+} |
+ |
+int GetEventPosition(int eventNum) |
+{ |
+ int adcBoardEventSize = GetAdcEventSize(); |
+ return adcBoardEventSize * eventNum; |
+} |
+ |
+ushort ExtractAdcData(int eventNum, int channel) |
+{ |
+ int index = GetEventPosition(eventNum) + channel; |
+ return adcBuffer[index]; |
+} |
+ |
+long ExtractTimeStamp(int eventNum) |
+{ |
+ int index = GetEventPosition(eventNum) + CHANNELS; |
+ long timestamp = 0; |
+ for (int i = 0; i < 3; i++) |
+ timestamp = (timestamp << 16) | adcBuffer[index++]; |
+ return timestamp; |
+} |
+ |
+int ExtractEventCount(int eventNum) |
+{ |
+ int offset = 0; |
+ if (addTimeStamp == true) |
+ offset += 3; |
+ int index = GetEventPosition(eventNum) + CHANNELS + offset; |
+ int eventCount = adcBuffer[index]; |
+ eventCount = (eventCount << 16) | adcBuffer[index + 1]; |
+ return eventCount; |
+} |
+ |
+void ShowEvent(int eventNumber) |
+{ |
+ if (eventNumber < 1) |
+ return; |
+ eventNumber--; |
+ char lAdcTimeStamp[0xFF]; |
+ char lAdcAbsTimeStamp[0xFF]; |
+ char lAdcEventCount[0xFF]; |
+ //tbAdcData.Clear(); |
+ int eventPosition = GetEventPosition(eventNumber); |
+ for (int channel = 0; channel < CHANNELS; channel++) |
+ { |
+ int data = ExtractAdcData(eventNumber, channel); |
+ printf(" 0:%d 1:%d ", channel + 1, data); |
+ if (channel < (CHANNELS - 1)) |
+ printf("\n"); |
+ } |
+ if (addTimeStamp == true) |
+ { |
+ long reference = ExtractTimeStamp(0); |
+ long timeStamp = ExtractTimeStamp(eventNumber); |
+ sprintf_s(lAdcTimeStamp, 0xFF, "%d", ((timeStamp - reference) * TIMESTAMP_LSB)); |
+ sprintf_s(lAdcAbsTimeStamp, 0xFF, "%d", (timeStamp * TIMESTAMP_LSB)); |
+ } |
+ else |
+ { |
+ sprintf_s(lAdcTimeStamp, 0xFF, "%s", "----"); |
+ sprintf_s(lAdcAbsTimeStamp, 0xFF, "%s", "----"); |
+ } |
+ if (addEventCount == true) |
+ { |
+ sprintf_s(lAdcEventCount, 0xFF, "%d", ExtractEventCount(eventNumber)); |
+ } |
+ else |
+ { |
+ sprintf_s(lAdcEventCount, 0xFF, "%s", "----"); |
+ } |
+ //SetTextboxToTop(tbAdcData); |
+} |
+ |
+int Acquire(int events) |
+{ |
+ // Acquire |
+ adcBufferLen = GetAdcEventSize() * events; |
+ //adcBuffer = new ushort[adcBufferLen]; |
+ |
+ //int wordsAcquired = ReadAdcByteBuffer(); // use only to test byte buffer read operation |
+ int wordsAcquired = ReadAdcBuffer(); |
+ if (wordsAcquired != adcBufferLen) |
+ { |
+ char msg[0xFF]; |
+ sprintf_s(msg, "ERROR: Timeout with possible data loss (%d/%d words received; Block Error = %d)", wordsAcquired, adcBufferLen, SD4_BlockError()); |
+ AddMessage(msg); |
+ /* |
+ if (cbAcquireContinuous.Checked == true) |
+ { |
+ cbAcquireContinuous.Checked = false; |
+ AddMessage("Acquisition disabled"); |
+ } |
+ */ |
+ } |
+ |
+ // Update UI |
+ double blocksize = adcBufferLen * 2.0; |
+ double microseconds = SD4_BlockTransferTime(); |
+ double transferRate = blocksize / microseconds; |
+ /* |
+ lTransferRate.Text = String.Format("{0:f2}", transferRate); |
+ lAcquisitionSize.Text = String.Format("{0:f2}", blocksize / 1e6); // block size in MB |
+ lAcquisitionTime.Text = String.Format("{0:f2}", microseconds / 1e6); |
+ */ |
+ return events; |
+} |
+ |
+void GetStatistics(int events) |
+{ |
+ ushort rawAdcData = 0; |
+ ushort adcData = 0; |
+ int channelReceived = 0; |
+ int channelExpected = 0; |
+ bool includeSaturated = 0; // cbIncludeSaturated.Checked; |
+ ushort * max = new ushort[CHANNELS]; |
+ ushort * min = new ushort[CHANNELS]; |
+ ushort * average = new ushort[CHANNELS]; |
+ int* total = new int[CHANNELS]; |
+ for (int i = 0; i < CHANNELS; i++) |
+ { |
+ min[i] = 0xFFFF; |
+ max[i] = 0; |
+ total[i] = 0; |
+ } |
+ for (int eventNum = 0; eventNum < events; eventNum++) |
+ { |
+ for (int channel = 0; channel < CHANNELS; channel++) |
+ { |
+ rawAdcData = ExtractAdcData(eventNum, channel); |
+ if (addChannelNum == true) |
+ { |
+ channelReceived = (rawAdcData >> 12) & 0xF; |
+ channelExpected = (channel & 0xF); |
+ if (channelReceived != channelExpected) |
+ { |
+ char msg[0xFF]; |
+ sprintf_s(msg, "ERROR in Event %d : Expected channel %d, received %d -ANALYSIS STOPPED", eventNum, channelExpected, channelReceived); |
+ AddMessage(msg); |
+ //EnableRegisterScanTimer(true); |
+ return; |
+ } |
+ } |
+ adcData = (ushort)(rawAdcData & 0x0FFF); // remove channel number |
+ if ((includeSaturated == true) || ((includeSaturated == false) && (adcData < (ADCMAX - 2)))) |
+ histograms[channel][adcData]++; |
+ total[channel] = total[channel] + adcData; |
+ if (adcData > max[channel]) |
+ max[channel] = adcData; |
+ else if (adcData < min[channel]) |
+ min[channel] = adcData; |
+ } |
+ histogramTotalEvents++; |
+ } |
+ //tbAdcStatistics.Clear(); |
+ for (int channel = 0; channel < CHANNELS; channel++) |
+ { |
+ average[channel] = (ushort)(total[channel] / events); |
+ char msg[0xFF]; |
+ sprintf_s(msg, " {0:%d} : {1:0x%04x} {2:0x%04x} {3:0x%04x} {4:0x%04x}", channel + 1, min[channel], max[channel], max[channel] - min[channel], average[channel]); |
+ //if (channel < (CHANNELS - 1)) |
+ // tbAdcStatistics.AppendText(Environment.NewLine); |
+ AddMessage(msg); |
+ } |
+ //SetTextboxToTop(tbAdcStatistics); |
+} |
+ |
+void SetupAcquisition(int neve) |
+{ |
+ //EnableRegisterScanTimer(false); |
+ //nudEventSelect.Minimum = 0; |
+ //nudEventSelect.Maximum = 0; |
+ int eventsAcquired = Acquire(neve); |
+ if (eventsAcquired < 1) |
+ return; |
+ GetStatistics(eventsAcquired); |
+ ShowEvent(1); |
+ //ShowHistograms(); |
+ //nudEventSelect.Minimum = 1; |
+ //nudEventSelect.Maximum = eventsAcquired; |
+ //EnableRegisterScanTimer(true); |
+} |
+ |
+int main(int argc, _TCHAR* argv[]) |
+//int _tmain(int argc, _TCHAR* argv[]) |
+{ |
+ |
+ |
+ NE_Rainbow(); |
+ //----------------------------------- |
+ char bla[100] = "abcd"; |
+ NE_Ptr2ByteArray(bla, strlen(bla)); |
+ //----------------------------------- |
+ char data[1000] = { 1,0,0,1,0,0,0,0,1,1,1,1 }; |
+ int len = 0; |
+ //char *data=NULL; |
+ int *retval = (int *)NE_ByteArray2Ptr(data, &len); |
+ int *idata = (int*)data; |
+ printf("***NE_ByteArray2Ptr %d\n", len); |
+ for (int i = 0; i < len; i++) printf("%d %d %d\n", i, idata[i], retval[i]); |
+ printf("\n"); |
+ //----------------------------------- |
+ char data1[100] = "NE_Ptr2String"; |
+ NE_Ptr2String(data1, strlen(data1)); |
+ //----------------------------------- |
+ char data2[100] = "abcd"; |
+ int nb = NE_String2Ptr(data2); |
+ //----------------------------------- |
+ |
+ printf("result = %d %s\n", nb, bla); |
+ printf("string = %s\n", NE_String()); |
+ |
+ //----------------------------------- |
+ unsigned int *n = NE_UInt(&len); |
+ printf("NE_UInt size = %d\n", len); |
+ for (int i = 0; i < len; i++) printf("%d\t", n[i]); |
+ printf("\n"); |
+ //----------------------------------- |
+ |
+ int events = 1000; |
+ adcBufferLen = GetAdcEventSize() * events; |
+ //adcBuffer = new ushort[GetAdcEventSize() * events]; |
+ for (int i = 0; i < 0xFFF; i++) { |
+ for (int j = 0; j < 4; j++) histograms[j][i] = 0; |
+ } |
+ histogramTotalEvents = 0; |
+ InitializeConnection(); |
+ QuickSetupContinuous(); |
+ ReadRegisters(); |
+ SetupAcquisition(1); |
+ |
+ return 0; |
+} |
Index: AitSipmDAQDll/AitSipmDAQApp/AitSipmDAQApp.filters |
=================================================================== |
--- AitSipmDAQDll/AitSipmDAQApp/AitSipmDAQApp.filters (nonexistent) |
+++ AitSipmDAQDll/AitSipmDAQApp/AitSipmDAQApp.filters (revision 213) |
@@ -0,0 +1,39 @@ |
+<?xml version="1.0" encoding="utf-8"?> |
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
+ <ItemGroup> |
+ <Filter Include="Source Files"> |
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> |
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> |
+ </Filter> |
+ <Filter Include="Header Files"> |
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> |
+ <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions> |
+ </Filter> |
+ <Filter Include="Resource Files"> |
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> |
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> |
+ </Filter> |
+ </ItemGroup> |
+ <ItemGroup> |
+ <ClInclude Include="stdafx.h"> |
+ <Filter>Header Files</Filter> |
+ </ClInclude> |
+ <ClInclude Include="targetver.h"> |
+ <Filter>Header Files</Filter> |
+ </ClInclude> |
+ <ClInclude Include="AitMduManager.h"> |
+ <Filter>Header Files</Filter> |
+ </ClInclude> |
+ <ClInclude Include="AitMduManager_DEF.h"> |
+ <Filter>Header Files</Filter> |
+ </ClInclude> |
+ </ItemGroup> |
+ <ItemGroup> |
+ <ClCompile Include="AitSipmDAQApp.cpp"> |
+ <Filter>Source Files</Filter> |
+ </ClCompile> |
+ <ClCompile Include="stdafx.cpp"> |
+ <Filter>Source Files</Filter> |
+ </ClCompile> |
+ </ItemGroup> |
+</Project> |
\ No newline at end of file |
Index: AitSipmDAQDll/AitSipmDAQApp/AitSipmDAQApp.user |
=================================================================== |
--- AitSipmDAQDll/AitSipmDAQApp/AitSipmDAQApp.user (nonexistent) |
+++ AitSipmDAQDll/AitSipmDAQApp/AitSipmDAQApp.user (revision 213) |
@@ -0,0 +1,4 @@ |
+<?xml version="1.0" encoding="utf-8"?> |
+<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
+ <PropertyGroup /> |
+</Project> |
\ No newline at end of file |
Index: AitSipmDAQDll/AitSipmDAQApp/AitSipmDAQApp.vcxproj |
=================================================================== |
--- AitSipmDAQDll/AitSipmDAQApp/AitSipmDAQApp.vcxproj (nonexistent) |
+++ AitSipmDAQDll/AitSipmDAQApp/AitSipmDAQApp.vcxproj (revision 213) |
@@ -0,0 +1,104 @@ |
+<?xml version="1.0" encoding="utf-8"?> |
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
+ <ItemGroup Label="ProjectConfigurations"> |
+ <ProjectConfiguration Include="Debug|Win32"> |
+ <Configuration>Debug</Configuration> |
+ <Platform>Win32</Platform> |
+ </ProjectConfiguration> |
+ <ProjectConfiguration Include="Release|Win32"> |
+ <Configuration>Release</Configuration> |
+ <Platform>Win32</Platform> |
+ </ProjectConfiguration> |
+ </ItemGroup> |
+ <PropertyGroup Label="Globals"> |
+ <ProjectGuid>{A133C14A-192C-49DA-936C-0BC2FB5EB54E}</ProjectGuid> |
+ <Keyword>Win32Proj</Keyword> |
+ <RootNamespace>NativeExportsConsumerApp</RootNamespace> |
+ <ProjectName>AitSipmDAQApp</ProjectName> |
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> |
+ </PropertyGroup> |
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> |
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> |
+ <ConfigurationType>Application</ConfigurationType> |
+ <UseDebugLibraries>true</UseDebugLibraries> |
+ <PlatformToolset>v140</PlatformToolset> |
+ <CharacterSet>Unicode</CharacterSet> |
+ <CLRSupport>true</CLRSupport> |
+ </PropertyGroup> |
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> |
+ <ConfigurationType>Application</ConfigurationType> |
+ <UseDebugLibraries>false</UseDebugLibraries> |
+ <PlatformToolset>v140</PlatformToolset> |
+ <WholeProgramOptimization>true</WholeProgramOptimization> |
+ <CharacterSet>Unicode</CharacterSet> |
+ </PropertyGroup> |
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> |
+ <ImportGroup Label="ExtensionSettings"> |
+ </ImportGroup> |
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> |
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> |
+ </ImportGroup> |
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> |
+ </ImportGroup> |
+ <PropertyGroup Label="UserMacros" /> |
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> |
+ <LinkIncremental>true</LinkIncremental> |
+ </PropertyGroup> |
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |
+ <LinkIncremental>false</LinkIncremental> |
+ </PropertyGroup> |
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> |
+ <ClCompile> |
+ <PrecompiledHeader>Use</PrecompiledHeader> |
+ <WarningLevel>Level3</WarningLevel> |
+ <Optimization>Disabled</Optimization> |
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
+ <SDLCheck>true</SDLCheck> |
+ </ClCompile> |
+ <Link> |
+ <SubSystem>Console</SubSystem> |
+ <GenerateDebugInformation>true</GenerateDebugInformation> |
+ <EntryPointSymbol> |
+ </EntryPointSymbol> |
+ </Link> |
+ <PostBuildEvent> |
+ <Command>copy "..\UnmanagedDllInterface\bin\$(ConfigurationName)\AitSipmDAQDll.dll" "$(TargetDir)"</Command> |
+ </PostBuildEvent> |
+ </ItemDefinitionGroup> |
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |
+ <ClCompile> |
+ <WarningLevel>Level3</WarningLevel> |
+ <PrecompiledHeader>Use</PrecompiledHeader> |
+ <Optimization>MaxSpeed</Optimization> |
+ <FunctionLevelLinking>true</FunctionLevelLinking> |
+ <IntrinsicFunctions>true</IntrinsicFunctions> |
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
+ <SDLCheck>true</SDLCheck> |
+ </ClCompile> |
+ <Link> |
+ <SubSystem>Console</SubSystem> |
+ <GenerateDebugInformation>true</GenerateDebugInformation> |
+ <EnableCOMDATFolding>true</EnableCOMDATFolding> |
+ <OptimizeReferences>true</OptimizeReferences> |
+ </Link> |
+ <PostBuildEvent> |
+ <Command>copy "..\NativeExports\bin\$(ConfigurationName)\NativeExports.dll" "$(TargetDir)"</Command> |
+ </PostBuildEvent> |
+ </ItemDefinitionGroup> |
+ <ItemGroup> |
+ <ClInclude Include="AitMduManager.h" /> |
+ <ClInclude Include="AitMduManager_DEF.h" /> |
+ <ClInclude Include="stdafx.h" /> |
+ <ClInclude Include="targetver.h" /> |
+ </ItemGroup> |
+ <ItemGroup> |
+ <ClCompile Include="AitSipmDAQApp.cpp" /> |
+ <ClCompile Include="stdafx.cpp"> |
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> |
+ </ClCompile> |
+ </ItemGroup> |
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> |
+ <ImportGroup Label="ExtensionTargets"> |
+ </ImportGroup> |
+</Project> |
\ No newline at end of file |
Index: AitSipmDAQDll/AitSipmDAQApp/ReadMe.txt |
=================================================================== |
--- AitSipmDAQDll/AitSipmDAQApp/ReadMe.txt (nonexistent) |
+++ AitSipmDAQDll/AitSipmDAQApp/ReadMe.txt (revision 213) |
@@ -0,0 +1,40 @@ |
+======================================================================== |
+ CONSOLE APPLICATION : NativeExportsConsumerApp Project Overview |
+======================================================================== |
+ |
+AppWizard has created this NativeExportsConsumerApp application for you. |
+ |
+This file contains a summary of what you will find in each of the files that |
+make up your NativeExportsConsumerApp application. |
+ |
+ |
+NativeExportsConsumerApp.vcxproj |
+ This is the main project file for VC++ projects generated using an Application Wizard. |
+ It contains information about the version of Visual C++ that generated the file, and |
+ information about the platforms, configurations, and project features selected with the |
+ Application Wizard. |
+ |
+NativeExportsConsumerApp.vcxproj.filters |
+ This is the filters file for VC++ projects generated using an Application Wizard. |
+ It contains information about the association between the files in your project |
+ and the filters. This association is used in the IDE to show grouping of files with |
+ similar extensions under a specific node (for e.g. ".cpp" files are associated with the |
+ "Source Files" filter). |
+ |
+NativeExportsConsumerApp.cpp |
+ This is the main application source file. |
+ |
+///////////////////////////////////////////////////////////////////////////// |
+Other standard files: |
+ |
+StdAfx.h, StdAfx.cpp |
+ These files are used to build a precompiled header (PCH) file |
+ named NativeExportsConsumerApp.pch and a precompiled types file named StdAfx.obj. |
+ |
+///////////////////////////////////////////////////////////////////////////// |
+Other notes: |
+ |
+AppWizard uses "TODO:" comments to indicate parts of the source code you |
+should add to or customize. |
+ |
+///////////////////////////////////////////////////////////////////////////// |
Index: AitSipmDAQDll/AitSipmDAQApp/stdafx.cpp |
=================================================================== |
--- AitSipmDAQDll/AitSipmDAQApp/stdafx.cpp (nonexistent) |
+++ AitSipmDAQDll/AitSipmDAQApp/stdafx.cpp (revision 213) |
@@ -0,0 +1,8 @@ |
+// stdafx.cpp : source file that includes just the standard includes |
+// NativeExportsConsumerApp.pch will be the pre-compiled header |
+// stdafx.obj will contain the pre-compiled type information |
+ |
+#include "stdafx.h" |
+ |
+// TODO: reference any additional headers you need in STDAFX.H |
+// and not in this file |
Index: AitSipmDAQDll/AitSipmDAQApp/stdafx.h |
=================================================================== |
--- AitSipmDAQDll/AitSipmDAQApp/stdafx.h (nonexistent) |
+++ AitSipmDAQDll/AitSipmDAQApp/stdafx.h (revision 213) |
@@ -0,0 +1,15 @@ |
+// stdafx.h : include file for standard system include files, |
+// or project specific include files that are used frequently, but |
+// are changed infrequently |
+// |
+ |
+#pragma once |
+ |
+#include "targetver.h" |
+ |
+#include <stdio.h> |
+#include <tchar.h> |
+ |
+ |
+ |
+// TODO: reference additional headers your program requires here |
Index: AitSipmDAQDll/AitSipmDAQApp/targetver.h |
=================================================================== |
--- AitSipmDAQDll/AitSipmDAQApp/targetver.h (nonexistent) |
+++ AitSipmDAQDll/AitSipmDAQApp/targetver.h (revision 213) |
@@ -0,0 +1,8 @@ |
+#pragma once |
+ |
+// Including SDKDDKVer.h defines the highest available Windows platform. |
+ |
+// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and |
+// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. |
+ |
+#include <SDKDDKVer.h> |
Index: AitSipmDAQDll/UnmanagedDllInterface/AitSipmDAQDll.csproj |
=================================================================== |
--- AitSipmDAQDll/UnmanagedDllInterface/AitSipmDAQDll.csproj (nonexistent) |
+++ AitSipmDAQDll/UnmanagedDllInterface/AitSipmDAQDll.csproj (revision 213) |
@@ -0,0 +1,78 @@ |
+<?xml version="1.0" encoding="utf-8"?> |
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> |
+ <PropertyGroup> |
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> |
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> |
+ <ProjectGuid>{A9829616-449C-4F04-AFF1-B7D11F6ED0C8}</ProjectGuid> |
+ <OutputType>Library</OutputType> |
+ <AppDesignerFolder>Properties</AppDesignerFolder> |
+ <RootNamespace>AitSipmDAQDll</RootNamespace> |
+ <AssemblyName>AitSipmDAQDll</AssemblyName> |
+ <TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion> |
+ <FileAlignment>512</FileAlignment> |
+ <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent> |
+ <TargetFrameworkProfile /> |
+ </PropertyGroup> |
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> |
+ <PlatformTarget>x86</PlatformTarget> |
+ <DebugSymbols>true</DebugSymbols> |
+ <DebugType>full</DebugType> |
+ <Optimize>false</Optimize> |
+ <OutputPath>bin\Debug\</OutputPath> |
+ <DefineConstants>DEBUG;TRACE</DefineConstants> |
+ <ErrorReport>prompt</ErrorReport> |
+ <WarningLevel>4</WarningLevel> |
+ <Prefer32Bit>false</Prefer32Bit> |
+ </PropertyGroup> |
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> |
+ <PlatformTarget>x86</PlatformTarget> |
+ <DebugType>pdbonly</DebugType> |
+ <Optimize>true</Optimize> |
+ <OutputPath>bin\Release\</OutputPath> |
+ <DefineConstants>TRACE</DefineConstants> |
+ <ErrorReport>prompt</ErrorReport> |
+ <WarningLevel>4</WarningLevel> |
+ <Prefer32Bit>false</Prefer32Bit> |
+ </PropertyGroup> |
+ <PropertyGroup> |
+ <StartupObject /> |
+ </PropertyGroup> |
+ <ItemGroup> |
+ <Reference Include="AitMduManager"> |
+ <HintPath>..\AitMduManager.dll</HintPath> |
+ </Reference> |
+ <Reference Include="RGiesecke.DllExport.Metadata, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8f52d83c1a22df51, processorArchitecture=MSIL"> |
+ <HintPath>..\packages\UnmanagedExports.1.2.7\lib\net\RGiesecke.DllExport.Metadata.dll</HintPath> |
+ <Private>False</Private> |
+ </Reference> |
+ <Reference Include="System" /> |
+ <Reference Include="System.Core" /> |
+ <Reference Include="System.Windows.Forms" /> |
+ <Reference Include="System.Xml.Linq" /> |
+ <Reference Include="System.Data.DataSetExtensions" /> |
+ <Reference Include="Microsoft.CSharp" /> |
+ <Reference Include="System.Data" /> |
+ <Reference Include="System.Xml" /> |
+ </ItemGroup> |
+ <ItemGroup> |
+ <Compile Include="Program.cs" /> |
+ <Compile Include="Properties\AssemblyInfo.cs" /> |
+ </ItemGroup> |
+ <ItemGroup> |
+ <None Include="packages.config" /> |
+ </ItemGroup> |
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> |
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it. |
+ Other similar extension points exist, see Microsoft.Common.targets. |
+ <Target Name="BeforeBuild"> |
+ </Target> |
+ <Target Name="AfterBuild"> |
+ </Target> |
+ --> |
+ <PropertyGroup> |
+ <PostBuildEvent> |
+ </PostBuildEvent> |
+ </PropertyGroup> |
+ <Import Project="../packages/UnmanagedExports.1.2.7/tools/RGiesecke.DllExport.targets" Condition="Exists('../packages/UnmanagedExports.1.2.7/tools/RGiesecke.DllExport.targets')" /> |
+</Project> |
\ No newline at end of file |
Index: AitSipmDAQDll/UnmanagedDllInterface/Program.cs |
=================================================================== |
--- AitSipmDAQDll/UnmanagedDllInterface/Program.cs (nonexistent) |
+++ AitSipmDAQDll/UnmanagedDllInterface/Program.cs (revision 213) |
@@ -0,0 +1,500 @@ |
+using RGiesecke.DllExport; |
+using System; |
+using System.Text; |
+using System.Runtime.InteropServices; |
+ |
+using AitMduManager; |
+ |
+/* |
+#region Assembly AitMduManager, Version=1.2.0.0, Culture=neutral, PublicKeyToken=null |
+// AitMduManager.dll |
+#endregion |
+*/ |
+ |
+// https://blogs.msdn.microsoft.com/jaredpar/2008/11/05/dereference-a-double-intptr/ |
+ |
+ |
+namespace NativeExports |
+{ |
+ class Program |
+ { |
+ |
+ static MduManager SD4 = new MduManager(); |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static int SD4_BlockError() |
+ { |
+ return SD4.BlockError; |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static void SD4_SetBlockTimeout(uint a) |
+ { |
+ SD4.BlockTimeout = a; |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static uint SD4_GetBlockTimeout() |
+ { |
+ return SD4.BlockTimeout; |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static long SD4_BlockTransferTime() |
+ { |
+ return SD4.BlockTransferTime; |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static uint SD4_GetDriverTimeout() |
+ { |
+ return SD4.DriverTimeout; |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static void SD4_SetDriverTimeout(uint tout) |
+ { |
+ SD4.DriverTimeout = tout; |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static IntPtr SD4_Version() |
+ { |
+ return Marshal.StringToHGlobalAnsi(SD4.Version); |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static int SD4_WordsTransferred() |
+ { |
+ return SD4.WordsTransferred; |
+ } |
+ |
+ /* |
+ |
+ public event EventHandler DeviceAttached; |
+ public event EventHandler DeviceRemoved; |
+ public event EventHandler FirmwareStatusChanged; |
+ */ |
+ |
+ static IntPtr SD4_ArrayToIntPtr(int[] retval) |
+ { |
+ int len = retval.Length * Marshal.SizeOf(typeof(int)); |
+ SD4_AllocateMemory(len); |
+ Marshal.Copy(retval, 0, _unmanagedMemory, retval.Length); |
+ return _unmanagedMemory; |
+ } |
+ |
+ static IntPtr SD4_ArrayToIntPtr(ushort[] retval) |
+ { |
+ int len = retval.Length * Marshal.SizeOf(typeof(ushort)); |
+ SD4_AllocateMemory(len); |
+ Marshal.Copy((short[])(object) retval, 0, _unmanagedMemory, retval.Length); |
+ return _unmanagedMemory; |
+ } |
+ |
+ static IntPtr SD4_ArrayToIntPtr(uint[] retval) |
+ { |
+ int len = retval.Length * Marshal.SizeOf(typeof(uint)); |
+ SD4_AllocateMemory(len); |
+ Marshal.Copy((int[])(object) retval, 0, _unmanagedMemory, retval.Length); |
+ return _unmanagedMemory; |
+ } |
+ |
+ static IntPtr SD4_ArrayToIntPtr(byte[] retval) |
+ { |
+ int len = retval.Length * Marshal.SizeOf(typeof(byte)); |
+ SD4_AllocateMemory(len); |
+ Marshal.Copy(retval, 0, _unmanagedMemory, retval.Length); |
+ return _unmanagedMemory; |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static IntPtr SD4_FindDevices( ref int len) |
+ { |
+ uint[] devices = SD4.FindDevices(); |
+ if (devices == null) |
+ { |
+ len = 0; |
+ return IntPtr.Zero; |
+ } |
+ else |
+ { |
+ len = devices.Length; |
+ return SD4_ArrayToIntPtr(devices); |
+ } |
+ |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static int SD4_GetDeviceCount() |
+ { |
+ return SD4.GetDeviceCount(); |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static IntPtr SD4_GetDeviceList( ref int len) |
+ { |
+ uint[] devices = SD4.GetDeviceList(); |
+ if (devices == null) |
+ { |
+ len = 0; |
+ return IntPtr.Zero; |
+ } |
+ else |
+ { |
+ len = devices.Length; |
+ return SD4_ArrayToIntPtr(devices); |
+ } |
+ } |
+ |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static IntPtr SD4_GetUsbFirmwareVersionByDevice(uint deviceId) |
+ { |
+ return Marshal.StringToHGlobalAnsi(SD4.GetUsbFirmwareVersion(deviceId)); |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static IntPtr SD4_GetUsbFirmwareVersion(int index) |
+ { |
+ return Marshal.StringToHGlobalAnsi(SD4.GetUsbFirmwareVersion(index)); |
+ } |
+ |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static bool SD4_IsDeviceAttached(uint deviceId) |
+ { |
+ return SD4.IsDeviceAttached(deviceId); |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static bool SD4_ProgramFpgaFirmwareByDevice(uint deviceId, IntPtr data, int len) |
+ { |
+ byte[] fpgaFirmware = new byte[len]; |
+ Marshal.Copy(data, fpgaFirmware, 0, len); |
+ return SD4.ProgramFpgaFirmware(deviceId, fpgaFirmware); |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static bool SD4_ProgramFpgaFirmware(int index, IntPtr data, int len) |
+ { |
+ byte[] fpgaFirmware = new byte[len]; |
+ Marshal.Copy(data, fpgaFirmware, 0, len); |
+ return SD4.ProgramFpgaFirmware(index, fpgaFirmware); |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static bool SD4_ProgramUsbFirmware(int index, IntPtr data, int len) |
+ { |
+ byte[] usbFirmware = new byte[len]; |
+ Marshal.Copy(data, usbFirmware, 0, len); |
+ return SD4.ProgramUsbFirmware(index, usbFirmware); |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static ushort SD4_Read(uint deviceId, int address) |
+ { |
+ return SD4.Read(deviceId, address); |
+ } |
+ |
+ |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static IntPtr SD4_ReadByteArray(uint deviceId, int address, int requested_elements , ref int len) |
+ { |
+ SD4_AllocateByteBuffer(requested_elements); |
+ SD4.Read(deviceId, address, SD4_ByteBuffer); |
+ _unmanagedMemory = SD4_ArrayToIntPtr(SD4_ByteBuffer); |
+ len = _unmanagedMemoryLength; |
+ return _unmanagedMemory; |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static IntPtr SD4_ReadUShortArray(uint deviceId, int address, int requested_elements, ref int len) |
+ { |
+/* |
+ System.Console.WriteLine("SD4_ReadUShortArray"); |
+ System.Console.WriteLine(deviceId); |
+ System.Console.WriteLine(address); |
+ System.Console.WriteLine(requested_elements); |
+*/ |
+ |
+ SD4_AllocateUshortBuffer(requested_elements); |
+ SD4.Read(deviceId, address, SD4_UShortBuffer); |
+ _unmanagedMemory = SD4_ArrayToIntPtr(SD4_UShortBuffer); |
+ len = _unmanagedMemoryLength; |
+ return _unmanagedMemory; |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static void SD4_ReconfigureByDevice(uint deviceId) |
+ { |
+ SD4.Reconfigure(deviceId); |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static void SD4_Reconfigure(int index) |
+ { |
+ SD4.Reconfigure(index); |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static void SD4_ReconnectByDevice(uint deviceId) |
+ { |
+ SD4.Reconnect(deviceId); |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static void SD4_Reconnect(int index) |
+ { |
+ SD4.Reconnect(index); |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static void SD4_ResetFpga(int index) |
+ { |
+ SD4.ResetFpga(index); |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static void SD4_ResetFpgaByDevice(uint deviceId) |
+ { |
+ SD4.ResetFpga(deviceId); |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static void SD4_ResetUsb(int index) |
+ { |
+ SD4.ResetUsb(index); |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static void SD4_ResetUsbByDevice(uint deviceId) |
+ { |
+ SD4.ResetUsb(deviceId); |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static void SD4_Write(uint deviceId, int address, ushort data) |
+ { |
+ SD4.Write(deviceId, address, data); |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static int SD4_WriteArray(uint deviceId, int address, IntPtr data, int len) |
+ { |
+ ushort[] udata = new ushort[len]; |
+ Marshal.Copy( data, (int[])(object) udata,0, len); |
+ return SD4.Write(deviceId, address, udata); |
+ } |
+ /* |
+ public sealed class DeviceChangedEventArgs : EventArgs |
+ { |
+ public DeviceChangedEventArgs(); |
+ |
+ public uint DeviceId { get; set; } |
+ public int DeviceIndex { get; set; } |
+ } |
+ public sealed class FirmwareStatusEventArgs : EventArgs |
+ { |
+ public FirmwareStatusEventArgs(); |
+ |
+ public uint DeviceId { get; set; } |
+ public int DeviceIndex { get; set; } |
+ public string FirmwareStatus { get; set; } |
+ } |
+ */ |
+ |
+ |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static int NE_Ptr2String(IntPtr c, int len) |
+ { |
+ string d = Marshal.PtrToStringAnsi(c); |
+ Console.WriteLine(d); |
+ return 0; |
+ } |
+ |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static int NE_Ptr2ByteArray(IntPtr c, int len) |
+ { |
+ System.Console.WriteLine(len); |
+ byte[] b = new byte[len]; |
+ Marshal.Copy(c, b, 0, len); |
+ foreach (byte element in b) |
+ { |
+ System.Console.WriteLine(element); |
+ } |
+ System.Console.WriteLine(); |
+ return b.Length; |
+ } |
+ |
+ //----------------------------------- |
+ // http://stackoverflow.com/questions/14934016/unmanaged-exports-with-arrays |
+ // https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net/blob/master/Visual%20Studio%20Project%20Template%20C%23/PluginInfrastructure/UnmanagedExports.cs |
+ static IntPtr _unmanagedMemory = IntPtr.Zero; |
+ static int _unmanagedMemoryLength = 0; |
+ |
+ static void SD4_AllocateMemory(int len) |
+ { |
+ |
+ if (_unmanagedMemoryLength < len) |
+ { |
+ if (_unmanagedMemory != IntPtr.Zero) |
+ Marshal.FreeHGlobal(_unmanagedMemory); |
+ _unmanagedMemory = Marshal.AllocHGlobal(len); |
+ _unmanagedMemoryLength = len; |
+ |
+ } |
+ } |
+ |
+ |
+ static ushort[] SD4_UShortBuffer = null; |
+ static ushort[] SD4_AllocateUshortBuffer(int len) { |
+ if (SD4_UShortBuffer == null || SD4_UShortBuffer.Length < len) { |
+ Array.Resize(ref SD4_UShortBuffer, len); |
+ } |
+ return SD4_UShortBuffer; |
+ } |
+ |
+ static byte[] SD4_ByteBuffer = null; |
+ static byte[] SD4_AllocateByteBuffer(int len) |
+ { |
+ if (SD4_ByteBuffer == null || SD4_ByteBuffer.Length < len) |
+ { |
+ Array.Resize(ref SD4_ByteBuffer, len); |
+ } |
+ return SD4_ByteBuffer; |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static IntPtr NE_ByteArray2Ptr(ref IntPtr unmanagedArray, out int length) |
+ { |
+ var valueList = new[] { 1, 2, 3, 3, 2, 1, 12, 11, 10 }; |
+ System.Console.WriteLine("NE_ByteArray2Ptr"); |
+ |
+ foreach (var element in valueList) |
+ { |
+ System.Console.WriteLine(element); |
+ } |
+ System.Console.WriteLine(); |
+ |
+ length = valueList.Length; |
+ int len = valueList.Length * Marshal.SizeOf(typeof(int)); |
+ SD4_AllocateMemory(len); |
+ Marshal.Copy(valueList, 0, _unmanagedMemory, length); |
+ // |
+ //unmanagedArray = Marshal.AllocHGlobal(len); |
+ //Marshal.Copy(valueList, 0, unmanagedArray, length); |
+ return _unmanagedMemory; |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static int NE_ByteArray2Ptr1(ref IntPtr dest, ref int len) |
+ //static int NE_ByteArray2Ptr( ref byte[] src, ref int len) |
+ { |
+ len = 5; |
+ //Marshal.AllocHGlobal(len); |
+ byte[] src = new byte[len]; |
+ for (int i = 0; i < len; i++) |
+ { |
+ src[i] = Convert.ToByte(i); |
+ //Marshal.WriteByte(dest, i, src[i] ); |
+ } |
+ System.Console.WriteLine("NE_ByteArray2Ptr"); |
+ System.Console.WriteLine(len); |
+ foreach (byte element in src) |
+ { |
+ System.Console.WriteLine(element); |
+ } |
+ System.Console.WriteLine(); |
+ |
+ // Marshal.Copy(src, 0, dest, len); |
+ |
+ return src.Length; |
+ } |
+ |
+ |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static int NE_String2Ptr(ref IntPtr c) |
+ { |
+ |
+ |
+ |
+ // Copy the array to unmanaged memory. |
+ //c = Marshal.StringToHGlobalAnsi(d); |
+ string inputStr = Marshal.PtrToStringAnsi(c); |
+ Console.ForegroundColor = ConsoleColor.Green; |
+ Console.WriteLine(inputStr); |
+ |
+ |
+ string outputStr = "NE_String2Ptr"; |
+ Console.ForegroundColor = ConsoleColor.Red; |
+ Console.WriteLine(outputStr); |
+ Console.ForegroundColor = ConsoleColor.White; |
+ |
+ // http://stackoverflow.com/questions/21378132/export-managed-c-sharp-function-to-return-changed-char-parameter-to-unmanaged-c |
+ byte[] outputBytes = Encoding.Default.GetBytes(outputStr); |
+ //problemi Marshal.Copy(outputBytes, 0, c, outputBytes.Length); |
+ |
+ |
+ return outputStr.Length; |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static IntPtr NE_String() |
+ { |
+ string d = "NE_String"; |
+ |
+ |
+ // Copy the array to unmanaged memory. |
+ //c = Marshal.StringToHGlobalAnsi(d); |
+ |
+ Console.ForegroundColor = ConsoleColor.Green; |
+ Console.WriteLine(d); |
+ Console.ForegroundColor = ConsoleColor.White; |
+ |
+ return Marshal.StringToHGlobalAnsi(d); |
+ } |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static IntPtr NE_UInt(ref int len) |
+ { |
+ len = 10; |
+ uint[] b = new uint[len]; |
+ for (uint i = 0; i < len; i++) |
+ { |
+ b[i] = i; |
+ } |
+ //PrintBytes(b); |
+ IntPtr p = Marshal.AllocHGlobal(len * 4); |
+ Marshal.Copy((int[])(object)b, 0, p, len); |
+ return p; |
+ } |
+ |
+ |
+ [DllExport(CallingConvention = CallingConvention.Cdecl)] |
+ static void NE_Rainbow() |
+ { |
+ Console.ForegroundColor = ConsoleColor.Red; |
+ Console.Write('R'); |
+ Console.ForegroundColor = ConsoleColor.DarkRed; |
+ Console.Write('a'); |
+ Console.ForegroundColor = ConsoleColor.Yellow; |
+ Console.Write('i'); |
+ Console.ForegroundColor = ConsoleColor.Green; |
+ Console.Write('n'); |
+ Console.ForegroundColor = ConsoleColor.Cyan; |
+ Console.Write('b'); |
+ Console.ForegroundColor = ConsoleColor.Blue; |
+ Console.Write('o'); |
+ Console.ForegroundColor = ConsoleColor.Magenta; |
+ Console.Write('w'); |
+ |
+ Console.ResetColor(); |
+ Console.WriteLine(); |
+ } |
+ } |
+} |
Index: AitSipmDAQDll/UnmanagedDllInterface/Properties/AssemblyInfo.cs |
=================================================================== |
--- AitSipmDAQDll/UnmanagedDllInterface/Properties/AssemblyInfo.cs (nonexistent) |
+++ AitSipmDAQDll/UnmanagedDllInterface/Properties/AssemblyInfo.cs (revision 213) |
@@ -0,0 +1,36 @@ |
+using System.Reflection; |
+using System.Runtime.CompilerServices; |
+using System.Runtime.InteropServices; |
+ |
+// General Information about an assembly is controlled through the following |
+// set of attributes. Change these attribute values to modify the information |
+// associated with an assembly. |
+[assembly: AssemblyTitle("AitSipmDAQDll")] |
+[assembly: AssemblyDescription("Unamanaged interface to the NET AIT SIPMDAQ4 library")] |
+[assembly: AssemblyConfiguration("")] |
+[assembly: AssemblyCompany("Jozef Stefan Institute")] |
+[assembly: AssemblyProduct("AitSipmDAQDll")] |
+[assembly: AssemblyCopyright("Copyright Rok Pestotnik © 2017")] |
+[assembly: AssemblyTrademark("")] |
+[assembly: AssemblyCulture("")] |
+ |
+// Setting ComVisible to false makes the types in this assembly not visible |
+// to COM components. If you need to access a type in this assembly from |
+// COM, set the ComVisible attribute to true on that type. |
+[assembly: ComVisible(false)] |
+ |
+// The following GUID is for the ID of the typelib if this project is exposed to COM |
+[assembly: Guid("576f7d1f-2ff9-4181-9e87-2946da78f3eb")] |
+ |
+// Version information for an assembly consists of the following four values: |
+// |
+// Major Version |
+// Minor Version |
+// Build Number |
+// Revision |
+// |
+// You can specify all the values or you can default the Build and Revision Numbers |
+// by using the '*' as shown below: |
+// [assembly: AssemblyVersion("1.0.*")] |
+[assembly: AssemblyVersion("1.0.0.0")] |
+[assembly: AssemblyFileVersion("1.0.0.0")] |
Index: AitSipmDAQDll/UnmanagedDllInterface/packages.config |
=================================================================== |
--- AitSipmDAQDll/UnmanagedDllInterface/packages.config (nonexistent) |
+++ AitSipmDAQDll/UnmanagedDllInterface/packages.config (revision 213) |
@@ -0,0 +1,4 @@ |
+<?xml version="1.0" encoding="utf-8"?> |
+<packages> |
+ <package id="UnmanagedExports" version="1.2.7" targetFramework="net451" /> |
+</packages> |
\ No newline at end of file |