Skip to content
Snippets Groups Projects
catdbcacheu.cpp 3.85 KiB
#include "catdbcacheu.h"
#include <cudata.h>

CaTDBCacheU::CaTDBCacheU()
{

}

Tango::DeviceProxy *CaTDBCacheU::m_get_dev(const std::string &nam) {
    error.clear();
    Tango::DeviceProxy *dev = nullptr;
    try {
        dev = new Tango::DeviceProxy(nam.c_str());
    }
    catch(const Tango::DevFailed& e) {
        dev = nullptr;
        error = std::string("device ") + nam + " connection error: " + tg_strerror(e);
    }
    return dev;
}

int CaTDBCacheU::m_att_conf_change_subscribe(Tango::DeviceProxy *dev, const std::string&devna, const string &attna, Tango::CallBack* cb) {
    int evid = -1;
    error.clear();
    try {
        evid = dev->subscribe_event(attna, Tango::ATTR_CONF_EVENT, cb, true);
    }
    catch(const Tango::DevFailed& e) {
        error = "device " + devna + " subscribe error: " + tg_strerror(e);
    }
    return evid;
}

std::string CaTDBCacheU::m_dev_get_name(Tango::DeviceProxy *dev) {
    std::string n;
    error.clear();
    try {
        n = dev->name();
    }
    catch(const Tango::DevFailed& e) {
        error = "dev->name failed: " + tg_strerror(e);
    }
    return n;
}

std::string CaTDBCacheU::m_mkattsrc(const string &dev, const string &att) const {
    return dev + "/" + att;
}

void CaTDBCacheU::m_fill_from_attconf(const Tango::AttributeInfoEx *ai, CuData &dat)
{
    dat["type"] = "property";
    dat["df"] = ai->data_format;
    dat["dfs"] = format_to_str(ai->data_format); /* as string */
    dat["dt"] = ai->data_type;
    dat["description"] = ai->description;
    ai->display_unit != std::string("No display unit") ? dat["display_unit"] = ai->display_unit : dat["display_unit"] = "";
    dat["format"] = ai->format;
    dat["label"] = ai->label;
    dat["max_alarm"] = ai->max_alarm;
    dat["max_dim_x"] = ai->max_dim_x;
    dat["max_dim_y"] = ai->max_dim_y;
    dat["max"] = ai->max_value;
    dat["min"] = ai->min_value;
    dat["min_alarm"] = ai->min_alarm;
    dat["name"] = ai->name;
    dat["standard_unit"] = ai->standard_unit;
    dat["unit"] = ai->unit;
    dat["writable"] = ai->writable;
    dat["writable_attr_name"] = ai->writable_attr_name;
    dat["disp_level"] = ai->disp_level;
    dat["root_attr_name"] = ai->root_attr_name; // Root attribute name (in case of forwarded attribute)

    Tango::AttributeAlarmInfo aai = ai->alarms;
    dat["delta_t"] = aai.delta_t;
    dat["delta_val"] = aai.delta_val;
    dat["max_alarm"] = aai.max_alarm;
    dat["min_alarm"] = aai.min_alarm;
    dat["max_warning"] = aai.max_warning;
    dat["min_warning"] = aai.min_warning;

    Tango::AttributeEventInfo ei = ai->events;
    dat["archive_abs_change"] = ei.arch_event.archive_abs_change;
    dat["archive_period"] = ei.arch_event.archive_period;
    dat["archive_rel_change"] = ei.arch_event.archive_rel_change;

    dat["abs_change"] = ei.ch_event.abs_change;
    dat["rel_change"] = ei.ch_event.rel_change;

    dat["periodic_period"] = ei.per_event.period;

    // dim_x property contains the actual number of x elements
    long int dimx = dat["value"].getSize(); // if !contains value, empty variant, 0 dimx
    if(dimx > 0)
        dat["dim_x"] = dimx;
}

string CaTDBCacheU::format_to_str(Tango::AttrDataFormat f) const {
    switch(f) {
    case Tango::SCALAR:
        return "scalar";
    case Tango::SPECTRUM:
        return "vector";
    case Tango::IMAGE:
        return "matrix";
    default:
        return "data format unknown";
    }
}

std::string CaTDBCacheU::tg_strerror(const Tango::DevErrorList &errors)
{
    std::string msg;
    for(int i = errors.length() - 1; i >= 0; i--)
    {
        msg += errors[i].origin;
        msg += "\n";
        msg += errors[i].desc;
        msg += "\n";
        msg += errors[i].reason;
        msg += "\n\n";
    }
    return msg;
}

std::string CaTDBCacheU::tg_strerror(const Tango::DevFailed &e) const
{
    std::string msg;
    if(e.errors.length() > 0)
        msg = tg_strerror(e.errors);
    return msg;
}