Newer
Older
#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>
#include <vector>
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 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"},
};
private:
// card information
drv_handle pCardHandle;
int32 cardIdx;
int32 serialNumber;
int64 instMemSize;
int32 bytesPerSample;
int64 maxSampleRate;
// setting information
std::set<int> activeChannels;
void checkError();
public:
class CardException : std::exception {
private:
char* exceptionMsg;
public:
CardException(char* msg) : exceptionMsg(msg) {}
const char* what() const throw() { return exceptionMsg; }
};
// collection of special constants to help with setting options
enum class CHANNEL_STOPLVL : int32 {
ZERO = SPCM_STOPLVL_ZERO,
LOW = SPCM_STOPLVL_LOW,
HIGH = SPCM_STOPLVL_HIGH,
HOLDLAST = SPCM_STOPLVL_HOLDLAST,
};
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,
};
enum class BUFFER_TYPE : int32 {
DATA = SPCM_BUF_DATA,
ABA = SPCM_BUF_ABA,
TIMESTAMP = SPCM_BUF_TIMESTAMP,
};
enum class TRANSFER_DIR : int32 {
PCTOCARD = SPCM_DIR_PCTOCARD,
CARDTOPC = SPCM_DIR_CARDTOPC,
CARDTOGPU = SPCM_DIR_CARDTOGPU,
GPUTOCARD = SPCM_DIR_GPUTOCARD,
};
enum class CLOCK_MODE : int32 {
INTPLL = SPC_CM_INTPLL,
EXTREFCLK = SPC_CM_EXTREFCLOCK,
};
enum class TRIGGER_MASK : int32 {
NONE = SPC_TMASK_NONE,
SOFTWARE = SPC_TMASK_SOFTWARE,
EXT0 = SPC_TMASK_EXT0,
EXT1 = SPC_TMASK_EXT1,
};
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,
};
enum class SEQ_LOOPCONDITION : int64 {
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
ALWAYS = SPCSEQ_ENDLOOPALWAYS,
ONTRIG = SPCSEQ_ENDLOOPONTRIG,
END = SPCSEQ_END,
};
// 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 setTrigMaskOr(std::vector<TRIGGER_MASK> trigMasks);
void setTrigMaskAnd(std::initializer_list<TRIGGER_MASK> trigMasks);
void setTrigMaskAnd(std::vector<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(
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
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();
// memory management functions
void* getPageAlignedMem(uint64 memSize);
void freePageAlignedMem(void* pMem, uint64 memSize);