packages feed

hs-tango-1.0.0: c_tango/src/c_tango_proxy.cpp

/******************************************************************************
 *
 * File:        c_tango_proxy.c
 * Project:     C/Rust client interface to Tango
 * Description: Interface functions to access Tango devices
 * Original:    November 2007
 * Author:      jensmeyer
 *
 * Adapted for tango-rs by Georg Brandl, 2015.
 *
 ******************************************************************************/

#include "c_tango.h"

ErrorStack *tango_translate_exception(Tango::DevFailed &tango_exception);

ErrorStack *tango_create_device_proxy(char *dev_name, void **proxy)
{
  try
  {
    Tango::DeviceProxy *dev = new Tango::DeviceProxy(dev_name);
    *proxy = (void *)dev;
  }
  catch (Tango::DevFailed &tango_exception)
  {
    return tango_translate_exception(tango_exception);
  }
  return 0;
}

ErrorStack *tango_delete_device_proxy(void *proxy)
{
  Tango::DeviceProxy *dev = (Tango::DeviceProxy *)proxy;

  try
  {
    delete dev;
  }
  catch (Tango::DevFailed &tango_exception)
  {
    return tango_translate_exception(tango_exception);
  }
  return 0;
}

ErrorStack *tango_set_timeout_millis(void *proxy, int millis)
{
  Tango::DeviceProxy *dev = (Tango::DeviceProxy *)proxy;

  try
  {
    dev->set_timeout_millis(millis);
  }
  catch (Tango::DevFailed &tango_exception)
  {
    return tango_translate_exception(tango_exception);
  }
  return 0;
}

ErrorStack *tango_get_timeout_millis(void *proxy, int *millis)
{
  Tango::DeviceProxy *dev = (Tango::DeviceProxy *)proxy;

  try
  {
    *millis = dev->get_timeout_millis();
  }
  catch (Tango::DevFailed &tango_exception)
  {
    return tango_translate_exception(tango_exception);
  }
  return 0;
}

ErrorStack *tango_set_source(void *proxy, DevSource source)
{
  Tango::DeviceProxy *dev = (Tango::DeviceProxy *)proxy;

  try
  {
    dev->set_source((Tango::DevSource)source);
  }
  catch (Tango::DevFailed &tango_exception)
  {
    return tango_translate_exception(tango_exception);
  }
  return 0;
}

ErrorStack *tango_get_source(void *proxy, DevSource *source)
{
  Tango::DeviceProxy *dev = (Tango::DeviceProxy *)proxy;

  try
  {
    *source = (DevSource)dev->get_source();
  }
  catch (Tango::DevFailed &tango_exception)
  {
    return tango_translate_exception(tango_exception);
  }
  return 0;
}

ErrorStack *tango_lock(void *proxy)
{
  Tango::DeviceProxy *dev = (Tango::DeviceProxy *)proxy;

  try
  {
    dev->lock();
  }
  catch (Tango::DevFailed &tango_exception)
  {
    return tango_translate_exception(tango_exception);
  }
  return 0;
}

ErrorStack *tango_unlock(void *proxy)
{
  Tango::DeviceProxy *dev = (Tango::DeviceProxy *)proxy;

  try
  {
    dev->unlock();
  }
  catch (Tango::DevFailed &tango_exception)
  {
    return tango_translate_exception(tango_exception);
  }
  return 0;
}

ErrorStack *tango_is_locked(void *proxy, bool *is_locked)
{
  Tango::DeviceProxy *dev = (Tango::DeviceProxy *)proxy;

  try
  {
    *is_locked = dev->is_locked();
  }
  catch (Tango::DevFailed &tango_exception)
  {
    return tango_translate_exception(tango_exception);
  }
  return 0;
}

ErrorStack *tango_is_locked_by_me(void *proxy, bool *is_locked_by_me)
{
  Tango::DeviceProxy *dev = (Tango::DeviceProxy *)proxy;

  try
  {
    *is_locked_by_me = dev->is_locked_by_me();
  }
  catch (Tango::DevFailed &tango_exception)
  {
    return tango_translate_exception(tango_exception);
  }
  return 0;
}

ErrorStack *tango_locking_status(void *proxy, char **locking_status)
{
  Tango::DeviceProxy *dev = (Tango::DeviceProxy *)proxy;

  try
  {
    std::string st = dev->locking_status();
    *locking_status = strdup(st.c_str());
  }
  catch (Tango::DevFailed &tango_exception)
  {
    return tango_translate_exception(tango_exception);
  }
  return 0;
}

void tango_free_ErrorStack(ErrorStack *error)
{
  for (uint32_t i = 0; i < error->length; i++)
  {
    free(error->sequence[i].desc); // from strdup
    free(error->sequence[i].reason);
    free(error->sequence[i].origin);
  }
  delete[] error->sequence;
  delete error;
}

ErrorStack *tango_translate_exception(Tango::DevFailed &tango_exception)
{
  ErrorStack *error = new ErrorStack;
  INIT_SEQ(*error, DevFailed, tango_exception.errors.length());

  for (uint32_t i = 0; i < tango_exception.errors.length(); i++)
  {
    error->sequence[i].desc = strdup(tango_exception.errors[i].desc);
    error->sequence[i].reason = strdup(tango_exception.errors[i].reason);
    error->sequence[i].origin = strdup(tango_exception.errors[i].origin);
    error->sequence[i].severity = (ErrSeverity)tango_exception.errors[i].severity;
  }

  return error;
}