damaris-backends/drivers/SpinCore-PulseBlasterDDSIII/SpinCore-PulseBlasterDDSIII.h
2014-06-26 11:10:51 +00:00

203 lines
5.7 KiB
C++

/* **************************************************************************
Author: Achim Gaedke
Created: June 2004
****************************************************************************/
#ifndef SPINCOREPULSEBLASTERDDSIII_H
#define SPINCOREPULSEBLASTERDDSIII_H
#include "drivers/frequgen.h"
#ifndef SPINCORE_PULSEBLASTER_H
#include "drivers/SpinCore-PulseBlaster/SpinCore-PulseBlaster.h"
#include "drivers/SpinCore-PulseBlaster/PulseBlasterProgram.h"
#endif
#include "core/states.h"
#include "core/stopwatch.h"
#include <cstdio>
#include <string>
#include <vector>
#include <list>
#include <cmath>
#include <unistd.h>
/**
\defgroup SpinCorePulseblasterDDSIII SpinCore PulseblasterDDSIII
\ingroup drivers
\brief classes concerning SpinCore PulseBlasterDDSIII
@{
*/
class PulseBlasterDDSIIIProgram;
class PulseBlasterDDSIIICommand;
class SpinCorePulseBlasterDDSIII: public frequgen, public SpinCorePulseBlaster {
/**
number of frequency registers
*/
unsigned int freq_regno;
/**
number of phase registers
*/
unsigned int phase_regno;
void set_registers(int device, unsigned int register_size, double divider, const std::vector<double>& values);
void set_phase_registers(std::vector<double> rx_phases, std::vector<double> tx_phases);
void set_frequency_registers(const std::vector<double>& values);
/**
makes a machine command word from PulseBlasterDDSIIICommand object
*/
void write_command(unsigned char* data, const PulseBlasterCommand& command);
/**
send the entire program to the device
*/
int write_to_device(const PulseBlasterDDSIIIProgram& program);
public:
typedef enum {ANALOG_OFF=0, ANALOG_ON=1} analog_state;
analog_state rx_analog;
analog_state tx_analog;
/**
initialises the PulseblasterDDSIII of Spincore
*/
SpinCorePulseBlasterDDSIII(int the_id=0, double the_clock=1e8, unsigned int _sync_mask=0);
/**
sets the frequency for simple frequency generator use
if set, by default the analog output is set to rx and tx channel with 90 degree shift
*/
virtual void set_frequency(state& s) {frequency=10e6;}
/**
sets the frequency for simple frequency generator use
if set, by default the analog output is set to rx and tx channel with 90 degree shift
*/
virtual void set_frequency(double f) {frequency=f;}
/**
\brief programm the pulseblaster with the subset of states known to him
the pulse program is ended with a wait command, that resets all channels and a stop command that stops the pulseblaster in this state
*/
virtual PulseBlasterProgram* create_program(state& the_states);
/**
run a PulseBlaster Program
*/
virtual void run_pulse_program(const PulseBlasterProgram& p);
/**
provide fake substitution for get_status
*/
inline int get_status() {
fprintf(stderr,"PulseBlaster DDSIII does not support status readback! (assuming running state)\n");
return 4;
}
/**
status queries not working, workaround
*/
void wait_till_end();
/**
destructor (close device)
*/
virtual ~SpinCorePulseBlasterDDSIII() {};
};
/**
\brief holds the complete and detailed initialisation of the device
*/
class PulseBlasterDDSIIIProgram: public PulseBlasterProgram {
public:
double freq_accuracy;
double phase_accuracy;
/// here keep track of the programed frequencies(Hz)
std::vector<double> frequency_registers;
/// here keep track of the programed RX phases (degree)
std::vector<double> rx_phase_registers;
/// here keep track of the programed TX phases (degree)
std::vector<double> tx_phase_registers;
/// finds or allocates frequency given in Hz
int get_frequency_regno(double f);
/// finds or allocates rx phase given in degree
int get_rx_phase_regno(double p);
/// finds or allocates tx phase given in degree
int get_tx_phase_regno(double p);
/// standard allocator sets only accuracy
PulseBlasterDDSIIIProgram();
/// copy constructor has to correct the pointers and references in the command list
PulseBlasterDDSIIIProgram(const PulseBlasterDDSIIIProgram& orig);
PulseBlasterDDSIIIProgram(const SpinCorePulseBlasterDDSIII& pb);
/**
create a new continue command, that merges all state_atom features
*/
virtual PulseBlasterCommand* create_command(const state& the_state);
/**
create a new continue command by copying or a default one
*/
virtual PulseBlasterCommand* create_command(const PulseBlasterCommand* c=NULL);
/// write all configuration to a file to xml
int write_to_file(FILE* out, size_t indent=0) const;
};
/**
\brief parameters for each pulseblaster command
*/
class PulseBlasterDDSIIICommand: public PulseBlasterCommand {
public:
/// register for frequency
int freq_reg;
/// register for rx phase
int rx_phase_reg;
/// enable rx analog output
SpinCorePulseBlasterDDSIII::analog_state rx_enable;
/// register for tx phase
int tx_phase_reg;
/// enable tx analog output
SpinCorePulseBlasterDDSIII::analog_state tx_enable;
/// full ttl state
/// the simple constructor
PulseBlasterDDSIIICommand();
/// the copy constructor
PulseBlasterDDSIIICommand(const PulseBlasterDDSIIICommand&);
/// produces a simple state
PulseBlasterDDSIIICommand(PulseBlasterDDSIIIProgram& p,
double frequency,
double rx_phase, SpinCorePulseBlasterDDSIII::analog_state rx_enable,
double tx_phase, SpinCorePulseBlasterDDSIII::analog_state tx_enable,
int ttls, double length);
/// write the command to a give file as xml tag
int write_to_file(FILE* out, size_t indent=0) const;
};
/**
\brief the driver implementation for PulseBlasterDDSIII!
uses the classes PulseBlasterDDSIIIProgram and PulseBlasterDDSIIICommand
*/
/**
@}
*/
#endif