Newer
Older
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include "driver_header/dlltyp.h"
#include "driver_header/regs.h"
#include "driver_header/spcerr.h"
#include "driver_header/spcm_drv.h"
#include <string>
#include <set>
#include <map>
class AWG {
/**
* Class for handling AWG M4i.6622-x8 .
* Manual can be found at
* https://spectrum-instrumentation.com/products/details/M4i6622-x8.php
*/
// collection of special constants to help with setting options
const enum class CHANNEL_STOPLVL : int32 {
ZERO = SPCM_STOPLVL_ZERO,
LOW = SPCM_STOPLVL_LOW,
HIGH = SPCM_STOPLVL_HIGH,
HOLDLAST = SPCM_STOPLVL_HOLDLAST,
};
const enum class REPLAY_MODE : int32 {
SINGLE = SPC_REP_STD_SINGLE,
MULTI = SPC_REP_STD_MULTI,
GATE = SPC_REP_STD_GATE,
SINGLERESTART = SPC_REP_STD_SINGLERESTART,
SEQUENCE = SPC_REP_STD_SEQUENCE,
FIFO_SINGLE = SPC_REP_FIFO_SINGLE,
FIFO_MULTI = SPC_REP_FIFO_MULTI,
FIFO_GATE = SPC_REP_FIFO_GATE,
};
const enum class BUFFER_TYPE : int32 {
DATA = SPCM_BUF_DATA,
ABA = SPCM_BUF_ABA,
TIMESTAMP = SPCM_BUF_TIMESTAMP,
};
const enum class TRANSFER_DIR : int32 {
PCTOCARD = SPCM_DIR_PCTOCARD,
CARDTOPC = SPCM_DIR_CARDTOPC,
CARDTOGPU = SPCM_DIR_CARDTOGPU,
GPUTOCARD = SPCM_DIR_GPUTOCARD,
};
const enum class CLOCK_MODE : int32 {
INTPLL = SPC_CM_INTPLL,
EXTREFCLK = SPC_CM_EXTREFCLOCK,
};
const enum class TRIGGER_MASK : int32 {
NONE = SPC_TMASK_NONE,
SOFTWARE = SPC_TMASK_SOFTWARE,
EXT0 = SPC_TMASK_EXT0,
EXT1 = SPC_TMASK_EXT1,
};
const enum class TRIGGER_MODE : int32 {
NONE = SPC_TM_NONE,
POS = SPC_TM_POS,
NEG = SPC_TM_NEG,
POS_REARM = SPC_TM_POS | SPC_TM_REARM,
NEG_REARM = SPC_TM_NEG | SPC_TM_REARM,
BOTH = SPC_TM_BOTH,
HIGH = SPC_TM_HIGH,
LOW = SPC_TM_LOW,
WINENTER = SPC_TM_WINENTER,
WINLEAVE = SPC_TM_WINLEAVE,
INWIN = SPC_TM_INWIN,
OUTSIDEWIN = SPC_TM_OUTSIDEWIN,
};
const enum class SEQ_LOOPCONDITION : int64 {
ALWAYS = SPCSEQ_ENDLOOPALWAYS,
ONTRIG = SPCSEQ_ENDLOOPONTRIG,
END = SPCSEQ_END,
};
// collection of card status for printouts
const std::map<int, std::string> STATUS_NAMES = {
{M2STAT_CARD_TRIGGER, "card received trigger"},
{M2STAT_CARD_READY, "card ready"},
{M2STAT_DATA_BLOCKREADY, "data block ready"},
{M2STAT_DATA_END, "data transfer ended"},
{M2STAT_DATA_OVERRUN, "data transfer overrun"},
{M2STAT_DATA_ERROR, "data transfer error"},
};
// card information
drv_handle pCardHandle;
int32 cardIdx;
int32 serialNumber;
int64 instMemSize;
int32 bytesPerSample;
int64 maxSampleRate;
// setting information
std::set<int> activeChannels;
void checkError();
void* getPageAlignedMem(uint64 memSize);
void freePageAlignedMem(void* pMem, uint64 memSize);
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
// functions
AWG() noexcept;
~AWG();
// basic card setting
void open(int openIndex);
bool isOpen();
void close();
void reset();
int getCardIdx();
int getSerialNumber();
int64 getInstMemSize();
int getBytesPerSample();
int64 getMaxSampleRate();
void setSampleRate(int64 sampleRate);
int64 getSampleRate();
// channel output control
void setActiveChannels(std::set<int> channels);
void setChannelAmp(int ch, int amp);
void setChannelStopLvl(int ch, CHANNEL_STOPLVL stopLvl);
void toggleChannelOutput(int ch, bool enable);
void setChannel(int ch, int amp, CHANNEL_STOPLVL stopLvl, bool enable);
int getChannelCount();
std::set<int> getChannelActivated();
void setChannelDiffMode(int chPair, bool enable);
void setChannelDoubleMode(int chPair, bool enable);
// card status control
void writeSetup();
void cardRun();
void cardStop();
void waitReady();
void setTimeOut(int time); // ms
int getTimeOut();
void printCardStatus();
// card trigger control
void toggleTrigger(bool enable);
void forceTrigger();
void waitTrigger();
void setTrigMaskOr(std::initializer_list<TRIGGER_MASK> trigMasks);
void setTrigMaskAnd(std::initializer_list<TRIGGER_MASK> trigMasks);
void setTrigMode(int trigChannel, TRIGGER_MODE trigMode);
void setTrigTerm(int term);
int getTrigTerm();
void setTrigCoupling(int channel, int coupling);
int getTrigCoupling(int channel);
void setTrigLvl(int channel, int level);
int getTrigLvl(int channel);
void setTrigRearmLvl(int channel, int level);
int64 getTrigRearmLvl(int channel);
// replay mode control
//void setReplayMode(REPLAY_MODE mode);
//void setMemSize(int64 sampleSize);
//int64 getMemsize();
//void setLoop(int nLoop);
//int64 getLoop();
void initReplayModeSeq(int nSeg);
void setSeqModeStep(
uint64 step,
uint64 segment,
uint64 nextStep,
uint64 nLoop,
SEQ_LOOPCONDITION condition
);
void writeSeqModeSegment(
void* pDataBuffer,
int size,
int segment
);
// data transfer
void prepDataTransfer(
void* dataBuffer,
uint64 bufferLen,
BUFFER_TYPE bufType = BUFFER_TYPE::DATA,
TRANSFER_DIR dir = TRANSFER_DIR::PCTOCARD,
uint32 notifySize = 0,
uint64 brdMemOffs = 0
);
void startDataTransfer();
void waitDataTransfer();
void stopDataTransfer();
// clock control
void setClockMode(CLOCK_MODE cm);
int32 getClockMode();
void setRefClkFreq(int64 frequency);
void setClockOut(bool enable);
int64 getClockOutFreq();