File PowerDriver.h
File List > midas_fe > power > PowerDriver.h
Go to the documentation of this file
//****************************************************************************************
//
// Base Driver for the LV power supplies. Use derived class for TDK or HAMEG or .. supply
//
// F.Wauters - Nov. 2020
//
#ifndef POWERDRIVER_H
#define POWERDRIVER_H
#include <atomic>
#include <iostream>
#include <mutex>
#include <thread>
#include "BaseClient.h"
#include "SerialClient.h"
#include "TCPClient.h"
#include "midas.h"
#include "odbxx.h"
enum COMMAND_TYPE {
SetVoltage,
SetCurrent,
Reset,
Beep,
CLearStatus,
SelectChannel,
ReadErrorQueue,
ReadVoltage,
ReadSetVoltage,
ReadSetCurrent,
ReadCurrent,
ReadCurrentLimit,
SetCurrentLimit,
SetState,
SelectChannelAndSetVoltage,
SelectChannelAndSetCurrent,
ReadESR,
OPC,
ReadQCGE,
ReadState,
ReadOVPLevel,
SetOVPLevel,
ReadSourceMode,
SourceCurrent,
SourceVoltage,
SetCurrentAsRead,
SetVoltageAsRead,
ON,
OFF,
ClearBuffer,
SetCurrentRange,
SetVoltageRange,
SetVoltageLimit,
ReadVoltageLimit,
CurrHighCapacitanceOn,
VoltHighCapacitanceOn
// TODO Complete with full list of action commands
};
class PowerDriver {
public:
virtual ~PowerDriver();
std::vector<bool> GetState() const { return state; }
std::vector<float> GetVoltage() const { return voltage; }
std::vector<float> GetCurrent() const { return current; }
virtual std::string ReadIDCode(int, INT&);
std::vector<std::string> ReadErrorQueue(int, INT&);
std::string GetName() { return name; }
INT Connect();
INT GetReadStatus() { return readstatus; }
void ReadLoop();
void StartReading() {
read = 1;
readonlythisindex = -1;
}
void Print();
void SetInitialized() { initialized = true; }
void UnsetInitialized() { initialized = false; }
void AddReadFault() { n_read_faults = n_read_faults + 1; }
void ResetNReadFaults() { n_read_faults = 0; }
bool Initialized() const { return initialized; }
bool Enabled();
bool ReadState(int, INT&);
float ReadVoltage(int, INT&);
float ReadCurrent(int, INT&);
int ReadESR(int, INT&);
bool ClearBuffer();
int GetNReadFaults() { return n_read_faults; }
WORD ReadQCGE(int, INT&);
EQUIPMENT_INFO GetInfo() { return *info; } // by value, so you cant modify the original
virtual INT ConnectODB();
virtual INT Init() { return FE_ERR_DRIVER; };
virtual INT ReadAll() { return FE_ERR_DRIVER; }
virtual void ReadESRChanged() {};
virtual bool AskPermissionToTurnOn(int) {
std::cout << "Ask permissions in derived class!" << std::endl;
return false;
};
virtual std::string getDriverName() { return "PowerDriver"; }
protected:
PowerDriver();
PowerDriver(std::string, EQUIPMENT_INFO*);
EQUIPMENT_INFO* info;
std::string name;
midas::odb settings;
midas::odb variables;
BaseClient* client;
int n_read_faults;
float relevantchange;
// local copies of hardware state
std::vector<bool> state;
std::vector<float> voltage;
std::vector<float> temperature;
std::vector<float> demandvoltage;
std::vector<float> demandcurrent;
std::vector<float> current;
std::vector<float> currentlimit;
std::vector<float> OVPlevel;
std::vector<std::string> SourceMode;
std::vector<int> instrumentID;
std::mutex power_mutex;
std::thread readthread;
std::atomic<int> read;
std::atomic<int> stop;
std::atomic<INT> readstatus;
std::atomic<int> readonlythisindex;
// read
float Read(std::string, INT&);
float ReadSetVoltage(int, INT&);
float ReadSetCurrent(int, INT&);
float ReadCurrentLimit(int, INT&);
float ReadOVPLevel(int, INT&);
std::string ReadSourceMode(int, INT&);
// set
bool SelectChannel(int);
bool OPC();
bool Set(std::string, INT&);
void SetCurrentLimit(int, float, INT&);
// watch
void CurrentLimitChanged();
void SetStateChanged();
void SetState(int, bool, INT&);
void SetVoltage(int, float, INT&);
void SetCurrent(int, float, INT&);
void DemandVoltageChanged();
void DemandCurrentChanged();
void DemandOVPLevelChanged();
void SourceModeChanged();
void SetOVPLevel(int, float, INT&);
void SourceCurrent(int, INT&);
void SourceVoltage(int, INT&);
virtual std::string GenerateCommand(COMMAND_TYPE, float);
virtual std::string GenerateCommand(COMMAND_TYPE, int, float);
private:
bool initialized = false;
int min_reply_length;
};
#endif