/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 |
+application/octet-stream |
\ No newline at end of property |
/cvi/instr/AitSipmDAQ/AitSipmDAQDll/AitMduManager.dll |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/cvi/instr/AitSipmDAQ/AitSipmDAQDll/AitSipmDAQ.VC.db |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/cvi/instr/AitSipmDAQ/AitSipmDAQDll/AitSipmDAQ.sln |
---|
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 |
/cvi/instr/AitSipmDAQ/AitSipmDAQDll/AitSipmDAQApp/AitMduManager.dll |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/cvi/instr/AitSipmDAQ/AitSipmDAQDll/AitSipmDAQApp/AitMduManager.h |
---|
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 |
/cvi/instr/AitSipmDAQ/AitSipmDAQDll/AitSipmDAQApp/AitMduManager.lib |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/cvi/instr/AitSipmDAQ/AitSipmDAQDll/AitSipmDAQApp/AitMduManager_DEF.h |
---|
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 |
/cvi/instr/AitSipmDAQ/AitSipmDAQDll/AitSipmDAQApp/AitSipmDAQApp.cpp |
---|
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; |
} |
/cvi/instr/AitSipmDAQ/AitSipmDAQDll/AitSipmDAQApp/AitSipmDAQApp.filters |
---|
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> |
/cvi/instr/AitSipmDAQ/AitSipmDAQDll/AitSipmDAQApp/AitSipmDAQApp.user |
---|
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> |
/cvi/instr/AitSipmDAQ/AitSipmDAQDll/AitSipmDAQApp/AitSipmDAQApp.vcxproj |
---|
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> |
/cvi/instr/AitSipmDAQ/AitSipmDAQDll/AitSipmDAQApp/ReadMe.txt |
---|
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. |
///////////////////////////////////////////////////////////////////////////// |
/cvi/instr/AitSipmDAQ/AitSipmDAQDll/AitSipmDAQApp/stdafx.cpp |
---|
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 |
/cvi/instr/AitSipmDAQ/AitSipmDAQDll/AitSipmDAQApp/stdafx.h |
---|
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 |
/cvi/instr/AitSipmDAQ/AitSipmDAQDll/AitSipmDAQApp/targetver.h |
---|
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> |
/cvi/instr/AitSipmDAQ/AitSipmDAQDll/UnmanagedDllInterface/AitSipmDAQDll.csproj |
---|
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> |
/cvi/instr/AitSipmDAQ/AitSipmDAQDll/UnmanagedDllInterface/Program.cs |
---|
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(); |
} |
} |
} |
/cvi/instr/AitSipmDAQ/AitSipmDAQDll/UnmanagedDllInterface/Properties/AssemblyInfo.cs |
---|
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")] |
/cvi/instr/AitSipmDAQ/AitSipmDAQDll/UnmanagedDllInterface/packages.config |
---|
0,0 → 1,4 |
<?xml version="1.0" encoding="utf-8"?> |
<packages> |
<package id="UnmanagedExports" version="1.2.7" targetFramework="net451" /> |
</packages> |