Skip to content
Snippets Groups Projects
Select Git revision
  • devel
  • master default protected
  • dt5471
  • doc
  • remove-autoconfigure
  • agilentsplit
  • MCP3428-gain
  • contributing
  • serialcom
  • improve-powersupply
  • sp-autoconf
  • blocking_com
  • calibrationEM
  • rd53a_ivUpdate
  • spi
  • iv_curve
  • arduino-influx
  • rd53a_ivcurve
  • InstekPST3202_addition
  • E3631A
  • v0.1
  • RALIrradNov2018
22 results

SCPIPs.cpp

Blame
  • Forked from Berkeley Lab / labRemote
    326 commits behind the upstream repository.
    user avatar
    Berkeley Strippers authored and Karol Krizka committed
    d4d7d949
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    SCPIPs.cpp 3.27 KiB
    #include "SCPIPs.h"
    
    #include <algorithm>
    #include <thread>
    
    #include "Logger.h"
    #include "StringUtils.h"
    
    //Register power supply
    #include "PowerSupplyRegistry.h"
    REGISTER_POWERSUPPLY(SCPIPs)
    
    SCPIPs::SCPIPs(const std::string& name, std::vector<std::string> models,  unsigned maxChannels) :
    IPowerSupply(name, models), m_maxChannels(maxChannels)
    { }
    
    bool SCPIPs::ping()
    {
      std::string result = m_com->sendreceive("*IDN?");
      return !result.empty();
    }
    
    void SCPIPs::reset()
    {
      send("*RST");
    
      if(!ping())
        throw std::runtime_error("No communication after reset.");
    }
    
    std::string SCPIPs::identify()
    {
      std::string idn=m_com->sendreceive("*IDN?");
      return idn;
    }
    
    void SCPIPs::turnOn(unsigned channel)
    {
      send("OUTPUT ON", channel);
    }
    
    void SCPIPs::turnOff(unsigned channel)
    {
      send("OUTPUT OFF", channel);
    }
    
    void SCPIPs::setChannel(unsigned channel)
    {
      if(m_maxChannels>0)
        { // In-range channel check
          if(channel>m_maxChannels)
    	throw std::runtime_error("Invalid channel: "+std::to_string(channel));
        }
    
      if(m_maxChannels==1) return; // No need to change channel
    
      send("INST:NSEL " + std::to_string(channel));
    }
    
    void SCPIPs::setCurrentLevel(double cur, unsigned channel)
    {
      send("CURRENT " + std::to_string(cur), channel);
    }
    
    double SCPIPs::getCurrentLevel(unsigned channel)
    {
      return std::stod(sendreceive("CURRENT?", channel));
    }
    
    void SCPIPs::setCurrentProtect(double maxcur, unsigned channel)
    {
      send("CURRENT " + std::to_string(maxcur), channel);
    }
    
    double SCPIPs::getCurrentProtect(unsigned channel)
    {
      return getCurrentLevel();
    }
    
    double SCPIPs::measureCurrent(unsigned channel)
    {
      return std::stod(sendreceive("MEAS:CURR?", channel));
    }
    
    void SCPIPs::setVoltageLevel(double volt, unsigned channel)
    {
      send("VOLTAGE " + std::to_string(volt), channel);
    }
    
    double SCPIPs::getVoltageLevel(unsigned channel)
    {
      return std::stod(sendreceive("VOLTAGE?", channel));
    }
    
    void SCPIPs::setVoltageProtect(double maxvolt, unsigned channel)
    {
      send("VOLTAGE " + std::to_string(maxvolt), channel);
    }
    
    double SCPIPs::getVoltageProtect(unsigned channel)
    {
      return getVoltageLevel();
    }
    
    double SCPIPs::measureVoltage(unsigned channel)
    {
      return std::stod(sendreceive("MEAS:VOLT?", channel));
    }
    
    void SCPIPs::send(const std::string& cmd)
    {
      m_com->lock();
      m_com->send(cmd);
      std::string opcreply=m_com->sendreceive("*OPC?");
      utils::rtrim(opcreply);
      if(opcreply!="1")
        throw std::runtime_error("SCPI command not completed");
      m_com->unlock();
    }
    
    void SCPIPs::send(const std::string& cmd, unsigned channel)
    {
      if(m_maxChannels>0)
        { // In-range channel check
          if(channel>m_maxChannels)
    	throw std::runtime_error("Invalid channel: "+std::to_string(channel));
        }
    
      m_com->lock();
      if(m_maxChannels!=1)
        m_com->send("INST:NSEL "+std::to_string(channel));
    
      send(cmd);
      m_com->unlock();
    }
    
    std::string SCPIPs::sendreceive(const std::string& cmd)
    {
      return m_com->sendreceive(cmd);
    }
    
    std::string SCPIPs::sendreceive(const std::string& cmd, unsigned channel)
    {
      if(m_maxChannels>0)
        { // In-range channel check
          if(channel>m_maxChannels)
    	throw std::runtime_error("Invalid channel: "+std::to_string(channel));
        }
    
      m_com->lock();
      if(m_maxChannels!=1)
        m_com->send("INST:NSEL "+std::to_string(channel));
    
      std::string ret=sendreceive(cmd);
      m_com->unlock();
      return ret;
    }