All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jive.AttributePanel Maven / Gradle / Ivy

The newest version!
package jive;

import fr.esrf.TangoApi.*;
import fr.esrf.Tango.*;
import fr.esrf.tangoatk.widget.util.ATKConstant;
import fr.esrf.tangoatk.widget.util.ErrorPane;
import fr.esrf.tangoatk.widget.util.ATKGraphicsUtils;
import fr.esrf.tangoatk.widget.util.chart.JLDataView;
import fr.esrf.tangoatk.widget.util.chart.JLChart;
import fr.esrf.tangoatk.widget.util.chart.JLAxis;
import fr.esrf.tangoatk.widget.attribute.NumberImageViewer;
import fr.esrf.TangoDs.TangoConst;

import javax.swing.*;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.ListSelectionEvent;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.awt.event.*;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.TimeZone;

/**
 * The command panel.
 */
class AttributePanel extends JPanel implements ActionListener,ListSelectionListener,TangoConst,MouseListener,ClipboardOwner,DragGestureListener,DragSourceListener {

  private AttributeInfoEx[] attList;
  private ConsolePanel      console;
  private DeviceProxy       device;
  private CommonPanel       common;

  private JComboBox   arginCombo;
  private JLabel      arginLabel;
  private JLabel      descrLabel;

  private JList       attributeList;
  private JScrollPane attributeView;

  private JTextArea    descrList;
  private JScrollPane  descrView;

  private JButton      readBtn;
  private JButton      writeBtn;
  private JButton      plotBtn;

  private JFrame       chartDlg = null;
  private JLChart      chart;
  private JLDataView   plotData;

  private JFrame imageDlg = null;
  private NumberImageViewer image;

  private JPopupMenu   copyMenu;
  private JMenuItem    copyAttributeMenuItem;
  private JMenuItem    copyDevAttributeMenuItem;

  /**
   * Construct the device panel
   * @param ds DeviceProxy
   */
  AttributePanel(DeviceProxy ds,ConsolePanel console,CommonPanel common) throws DevFailed {

    setLayout(null);

    this.console = console;
    this.common = common;
    this.device = ds;
    attList = getAttributeList();

    arginLabel = new JLabel("Argin value");
    arginLabel.setFont(ATKConstant.labelFont);
    add(arginLabel);

    descrLabel = new JLabel();
    descrLabel.setFont(ATKConstant.labelFont);
    descrLabel.setHorizontalAlignment(JLabel.RIGHT);
    add(descrLabel);

    arginCombo = new JComboBox();
    arginCombo.setEditable(true);
    arginCombo.setFont(ATKConstant.labelFont);
    add(arginCombo);

    DefaultListModel ml = new DefaultListModel();
    for (int i = 0; i < attList.length; i++)
      ml.add(i, attList[i].name);
    attributeList = new JList(ml);
    attributeList.addListSelectionListener(this);
    attributeList.addMouseListener(this);
    DragSource dragSource = DragSource.getDefaultDragSource();
    dragSource.createDefaultDragGestureRecognizer(attributeList,
            DnDConstants.ACTION_MOVE,
            this);

    attributeView = new JScrollPane(attributeList);
    add(attributeView);

    descrList = new JTextArea();
    descrList.setFont(new Font("monospaced",Font.PLAIN,12));
    descrList.setEditable(false);
    descrView = new JScrollPane(descrList);
    add(descrView);

    readBtn = new JButton("Read");
    readBtn.setFont(ATKConstant.labelFont);
    add(readBtn);
    readBtn.addActionListener(this);

    writeBtn = new JButton("Write");
    writeBtn.setFont(ATKConstant.labelFont);
    add(writeBtn);
    writeBtn.addActionListener(this);

    plotBtn = new JButton("Plot");
    plotBtn.setFont(ATKConstant.labelFont);
    add(plotBtn);
    plotBtn.addActionListener(this);

    addComponentListener(new ComponentListener() {

          public void componentHidden(ComponentEvent e) {}

          public void componentMoved(ComponentEvent e) {}

          public void componentResized(ComponentEvent e) {
            placeComponents(getSize());
          }

          public void componentShown(ComponentEvent e) {
            placeComponents(getSize());
          }
    });

    // Default

    attributeList.setSelectedIndex(0);

    // Popup menu
    copyMenu = new JPopupMenu();
    copyAttributeMenuItem = new JMenuItem("Copy attribute");
    copyAttributeMenuItem.addActionListener(this);
    copyMenu.add(copyAttributeMenuItem);
    copyDevAttributeMenuItem = new JMenuItem("Copy device/attribute");
    copyDevAttributeMenuItem.addActionListener(this);
    copyMenu.add(copyDevAttributeMenuItem);

  }

  public String indentString(String in,String space) {

    String[] s = in.trim().split("\n");

    if(s.length>1) {

      String r = s[0] + "\n";
      for(int i=1;i0) {
          end = false;
          tmp = lst[i];
          lst[i] = lst[i+1];
          lst[i+1] = tmp;
        }
      }
      j--;
    }

    return lst;

  }

  private void placeComponents(Dimension dim) {

    arginLabel.setBounds(10,0,80,20);
    descrLabel.setBounds(90,0,dim.width-100,20);
    arginCombo.setBounds(10,20,dim.width-20,25);

    attributeView.setBounds(10,50,190,dim.height-60);
    attributeView.revalidate();

    descrView.setBounds(205,50,dim.width-215,dim.height-90);
    descrView.revalidate();

    int dim2 = (dim.width - 220) / 3;

    readBtn.setBounds(205,dim.height-35,dim2,25);
    writeBtn.setBounds(205+dim2+2,dim.height-35,dim2,25);
    plotBtn.setBounds(205+2*dim2+5,dim.height-35,dim2,25);

  }

  private void addArgin(String text) {
    // Add the input string if not already done
    boolean found = false;
    int i = 0;
    while(i 1) {
      if (writable)
        retStr.append("Write length: " + length + "\n");
      else
        retStr.append("Read length: " + length + "\n");
    }

    if( checkLimit ) {
      if(length>common.getAnswerLimitMax()) {
        retStr.append("Array cannot be fully displayed. (You may change the AnswerLimitMax)\n");
        return common.getAnswerLimitMax();
      } else {
        return length;
      }
    } else {
      return length;
    }
    
  }

  private int getLimitMin(boolean checkLimit,StringBuffer retStr,int length) {

    if( checkLimit ) {
      if(length<=common.getAnswerLimitMin()) {
        retStr.append("Array cannot be displayed. (You may change the AnswerLimitMin)\n");
        return length;
      } else {
        return common.getAnswerLimitMin();
      }
    } else {
      return 0;
    }

  }

  private int getLimitMaxForPlot(int length) {

    if(length>common.getAnswerLimitMax()) {
      return common.getAnswerLimitMax();
    } else {
      return length;
    }

  }

  private int getLimitMinForPlot(int length) {

   if(length<=common.getAnswerLimitMin()) {
     return length;
   } else {
     return common.getAnswerLimitMin();
   }

  }

  private void insertData(String argin,DeviceAttribute send,AttributeInfoEx ai) throws NumberFormatException {

    ArgParser arg = new ArgParser(argin);

    switch (ai.data_type) {

      case Tango_DEV_STATE:
        switch (ai.data_format.value()) {
          case AttrDataFormat._SCALAR:
            send.insert(arg.parse_state());
            break;
          case AttrDataFormat._SPECTRUM:
            send.insert(arg.parse_state_array());
            break;
          case AttrDataFormat._IMAGE:
            send.insert(arg.parse_state_image(),arg.get_image_width(),arg.get_image_height());
            break;
        }
        break;

      case Tango_DEV_UCHAR:
        switch (ai.data_format.value()) {
          case AttrDataFormat._SCALAR:
            send.insert_uc(arg.parse_uchar());
            break;
          case AttrDataFormat._SPECTRUM:
            send.insert_uc(arg.parse_uchar_array());
            break;
          case AttrDataFormat._IMAGE:
            send.insert_uc(arg.parse_uchar_image(),arg.get_image_width(),arg.get_image_height());
            break;
        }
        break;

      case Tango_DEV_BOOLEAN:
        switch (ai.data_format.value()) {
          case AttrDataFormat._SCALAR:
            send.insert(arg.parse_boolean());
            break;
          case AttrDataFormat._SPECTRUM:
            send.insert(arg.parse_boolean_array());
            break;
          case AttrDataFormat._IMAGE:
            send.insert(arg.parse_boolean_image(),arg.get_image_width(),arg.get_image_height());
            break;
        }
        break;

      case Tango_DEV_SHORT:
        switch (ai.data_format.value()) {
          case AttrDataFormat._SCALAR:
            send.insert(arg.parse_short());
            break;
          case AttrDataFormat._SPECTRUM:
            send.insert(arg.parse_short_array());
            break;
          case AttrDataFormat._IMAGE:
            send.insert(arg.parse_short_image(),arg.get_image_width(),arg.get_image_height());
            break;
        }
        break;

      case Tango_DEV_USHORT:
        switch (ai.data_format.value()) {
          case AttrDataFormat._SCALAR:
            send.insert_us(arg.parse_ushort());
            break;
          case AttrDataFormat._SPECTRUM:
            send.insert_us(arg.parse_ushort_array());
            break;
          case AttrDataFormat._IMAGE:
            send.insert_us(arg.parse_ushort_image(),arg.get_image_width(),arg.get_image_height());
            break;
        }
        break;

      case Tango_DEV_LONG:
        switch (ai.data_format.value()) {
          case AttrDataFormat._SCALAR:
            send.insert(arg.parse_long());
            break;
          case AttrDataFormat._SPECTRUM:
            send.insert(arg.parse_long_array());
            break;
          case AttrDataFormat._IMAGE:
            send.insert(arg.parse_long_image(),arg.get_image_width(),arg.get_image_height());
            break;
        }
        break;

      case Tango_DEV_ULONG:
        switch (ai.data_format.value()) {
          case AttrDataFormat._SCALAR:
            send.insert_ul(arg.parse_ulong());
            break;
          case AttrDataFormat._SPECTRUM:
            send.insert_ul(arg.parse_ulong_array());
            break;
          case AttrDataFormat._IMAGE:
            send.insert_ul(arg.parse_ulong_image(),arg.get_image_width(),arg.get_image_height());
            break;
        }
        break;

      case Tango_DEV_LONG64:
        switch (ai.data_format.value()) {
          case AttrDataFormat._SCALAR:
            send.insert(arg.parse_long64());
            break;
          case AttrDataFormat._SPECTRUM:
            send.insert(arg.parse_long64_array());
            break;
          case AttrDataFormat._IMAGE:
            send.insert(arg.parse_long64_image(),arg.get_image_width(),arg.get_image_height());
            break;
        }
        break;

      case Tango_DEV_ULONG64:
        switch (ai.data_format.value()) {
          case AttrDataFormat._SCALAR:
            send.insert_u64(arg.parse_long64());
            break;
          case AttrDataFormat._SPECTRUM:
            send.insert_u64(arg.parse_long64_array());
            break;
          case AttrDataFormat._IMAGE:
            send.insert_u64(arg.parse_long64_image(),arg.get_image_width(),arg.get_image_height());
            break;
        }
        break;

      case Tango_DEV_FLOAT:
        switch (ai.data_format.value()) {
          case AttrDataFormat._SCALAR:
            send.insert(arg.parse_float());
            break;
          case AttrDataFormat._SPECTRUM:
            send.insert(arg.parse_float_array());
            break;
          case AttrDataFormat._IMAGE:
            send.insert(arg.parse_float_image(),arg.get_image_width(),arg.get_image_height());
            break;
        }
        break;

      case Tango_DEV_DOUBLE:
        switch (ai.data_format.value()) {
          case AttrDataFormat._SCALAR:
            send.insert(arg.parse_double());
            break;
          case AttrDataFormat._SPECTRUM:
            send.insert(arg.parse_double_array());
            break;
          case AttrDataFormat._IMAGE:
            send.insert(arg.parse_double_image(),arg.get_image_width(),arg.get_image_height());
            break;
        }
        break;

      case Tango_DEV_STRING:
        switch (ai.data_format.value()) {
          case AttrDataFormat._SCALAR:
            send.insert(arg.parse_string());
            break;
          case AttrDataFormat._SPECTRUM:
            send.insert(arg.parse_string_array());
            break;
          case AttrDataFormat._IMAGE:
            send.insert(arg.parse_string_image(),arg.get_image_width(),arg.get_image_height());
            break;
        }
        break;

      case Tango_DEV_ENUM:

        // Convert string to short array
        switch (ai.data_format.value())
        {
          case AttrDataFormat._SCALAR: {
            String in = arg.parse_string();
            short idx = (short) JiveUtils.isInsideArray(in, ai.enum_label);
            if (idx < 0)
              throw new NumberFormatException("\"" + in + "\" not known in enum\nPossible values are:\n"+
                  JiveUtils.stringArrayToString(ai.enum_label));
            send.insert(idx);
          }
          break;
          case AttrDataFormat._SPECTRUM:
          {
            String[] in = arg.parse_string_array();
            short[] idx = new short[in.length];
            for (int i = 0; i < in.length; i++) {
              idx[i] = (short) JiveUtils.isInsideArray(in[i], ai.enum_label);
              if (idx[i] < 0)
                throw new NumberFormatException("\"" + in[i] + "\" not known in enum\nPossible values are:\n"+
                    JiveUtils.stringArrayToString(ai.enum_label));
            }
            send.insert(idx);
          }
          break;
          case AttrDataFormat._IMAGE:
          {
            String[] in = arg.parse_string_image();
            int width = arg.get_image_width();
            int height = arg.get_image_height();
            short[] idx = new short[in.length];
            for (int i = 0; i < in.length; i++) {
              idx[i] = (short) JiveUtils.isInsideArray(in[i], ai.enum_label);
              if (idx[i] < 0)
                throw new NumberFormatException("\"" + in[i] + "\" not known in enum\nPossible values are:\n"+
                    JiveUtils.stringArrayToString(ai.enum_label));
            }
            send.insert(idx, width, height);
          }
          break;
        }
        break;

      default:
        throw new NumberFormatException("Attribute type not supported code=" + ai.data_type);

    }

  }

  private void printArrayItem(StringBuffer str,int idx,boolean printIdx,
                              String value,boolean writeable) {
    if(!writeable) {
      if(printIdx)
        str.append("Read [" + idx + "]\t" + value + "\n");
      else
        str.append("Read:\t" + value + "\n");
    } else {
      if(printIdx)
        str.append("Set [" + idx + "]\t" + value + "\n");
      else
        str.append("Set:\t" + value + "\n");
    }
  }

  private String extractData(DeviceAttribute data,AttributeInfo ai) {

    StringBuffer ret_string = new StringBuffer();

    try {

      // Add the date of the measure in two formats
      TimeVal t = data.getTimeVal();
      java.util.Date date = new java.util.Date((long) (t.tv_sec * 1000.0 + t.tv_usec / 1000.0));
      SimpleDateFormat dateformat =
              new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
      dateformat.setTimeZone(TimeZone.getDefault());
      ret_string.append("measure date: " + dateformat.format(date) + " + " + (t.tv_usec/1000) + "ms\n");

      // Add the quality information
      AttrQuality q = data.getQuality();

      ret_string.append("quality: ");
      switch (q.value()) {
        case AttrQuality._ATTR_VALID:
          ret_string.append("VALID\n");
          break;
        case AttrQuality._ATTR_INVALID:
          ret_string.append("INVALID\n");
          return ret_string.toString();
        case AttrQuality._ATTR_ALARM:
          ret_string.append("ALARM\n");
          break;
        case AttrQuality._ATTR_CHANGING:
          ret_string.append("CHANGING\n");
          break;
        case AttrQuality._ATTR_WARNING:
          ret_string.append("WARNING\n");
          break;
        default:
          ret_string.append("UNKNOWN\n");
          break;
      }

      // Add dimension of the attribute but only if having a meaning
      boolean printIndex = true;
      boolean checkLimit = true;
      switch (ai.data_format.value()) {
        case AttrDataFormat._SCALAR:
          printIndex = false;
          checkLimit = false;
          break;
        case AttrDataFormat._SPECTRUM:
          ret_string.append("dim x: " + data.getDimX() + "\n");
          break;
        case AttrDataFormat._IMAGE:
          ret_string.append("dim x: " + data.getDimX() + "\n");
          ret_string.append("dim y: " + data.getDimY() + "\n");
          break;
        default:
          break;
      }

      // Add values
      switch (ai.data_type) {

        case Tango_DEV_STATE:
          {
            DevState[] dummy = data.extractDevStateArray();
            int nbRead = data.getNbRead();
            int nbWritten = dummy.length - nbRead;
            int start = getLimitMin(checkLimit,ret_string,nbRead);
            int end = getLimitMax(checkLimit,ret_string,nbRead,false);
            for (int i = start; i < end; i++)
              printArrayItem(ret_string,i,printIndex,Tango_DevStateName[dummy[i].value()],false);
            if( isWritable(ai) ) {
              start = getLimitMin(checkLimit,ret_string,nbWritten);
              end = getLimitMax(checkLimit,ret_string,nbWritten,true);
              for (int i = start; i < end; i++)
                printArrayItem(ret_string,i,printIndex,Tango_DevStateName[dummy[i+nbRead].value()],true);
            }
          }
          break;

        case Tango_DEV_UCHAR:
          {
            short[] dummy = data.extractUCharArray();
            int nbRead = data.getNbRead();
            int nbWritten = dummy.length - nbRead;
            int start = getLimitMin(checkLimit,ret_string,nbRead);
            int end = getLimitMax(checkLimit,ret_string,nbRead,false);
            for (int i = start; i < end; i++)
              printArrayItem(ret_string,i,printIndex,Short.toString(dummy[i]),false);
            if( isWritable(ai) ) {
              start = getLimitMin(checkLimit,ret_string,nbWritten);
              end = getLimitMax(checkLimit,ret_string,nbWritten,true);
              for (int i = start; i < end; i++)
                printArrayItem(ret_string,i,printIndex,Short.toString(dummy[i+nbRead]),true);
            }
          }
          break;

        case Tango_DEV_SHORT:
          {
            short[] dummy = data.extractShortArray();
            int nbRead = data.getNbRead();
            int nbWritten = dummy.length - nbRead;
            int start = getLimitMin(checkLimit,ret_string,nbRead);
            int end = getLimitMax(checkLimit,ret_string,nbRead,false);
            for (int i = start; i < end; i++)
              printArrayItem(ret_string,i,printIndex,Short.toString(dummy[i]),false);
            if( isWritable(ai) ) {
              start = getLimitMin(checkLimit,ret_string,nbWritten);
              end = getLimitMax(checkLimit,ret_string,nbWritten,true);
              for (int i = start; i < end; i++)
                printArrayItem(ret_string,i,printIndex,Short.toString(dummy[i+nbRead]),true);
            }
          }
          break;

        case Tango_DEV_BOOLEAN:
          {
            boolean[] dummy = data.extractBooleanArray();
            int nbRead = data.getNbRead();
            int nbWritten = dummy.length - nbRead;
            int start = getLimitMin(checkLimit,ret_string,nbRead);
            int end = getLimitMax(checkLimit,ret_string,nbRead,false);
            for (int i = start; i < end; i++)
              printArrayItem(ret_string,i,printIndex,Boolean.toString(dummy[i]),false);
            if( isWritable(ai) ) {
              start = getLimitMin(checkLimit,ret_string,nbWritten);
              end = getLimitMax(checkLimit,ret_string,nbWritten,true);
              for (int i = start; i < end; i++)
                printArrayItem(ret_string,i,printIndex,Boolean.toString(dummy[i+nbRead]),true);
            }
          }
          break;

        case Tango_DEV_USHORT:
          {
            int[] dummy = data.extractUShortArray();
            int nbRead = data.getNbRead();
            int nbWritten = dummy.length - nbRead;
            int start = getLimitMin(checkLimit,ret_string,nbRead);
            int end = getLimitMax(checkLimit,ret_string,nbRead,false);
            for (int i = start; i < end; i++)
              printArrayItem(ret_string,i,printIndex,Integer.toString(dummy[i]),false);
            if( isWritable(ai) ) {
              start = getLimitMin(checkLimit,ret_string,nbWritten);
              end = getLimitMax(checkLimit,ret_string,nbWritten,true);
              for (int i = start; i < end; i++)
                printArrayItem(ret_string,i,printIndex,Integer.toString(dummy[i+nbRead]),true);
            }
          }
          break;

        case Tango_DEV_LONG:
          {
            int[] dummy = data.extractLongArray();
            int nbRead = data.getNbRead();
            int nbWritten = dummy.length - nbRead;
            int start = getLimitMin(checkLimit,ret_string,nbRead);
            int end = getLimitMax(checkLimit,ret_string,nbRead,false);
            for (int i = start; i < end; i++)
              printArrayItem(ret_string,i,printIndex,Integer.toString(dummy[i]),false);
            if( isWritable(ai) ) {
              start = getLimitMin(checkLimit,ret_string,nbWritten);
              end = getLimitMax(checkLimit,ret_string,nbWritten,true);
              for (int i = start; i < end; i++)
                printArrayItem(ret_string,i,printIndex,Integer.toString(dummy[i+nbRead]),true);
            }
          }
          break;

        case Tango_DEV_ULONG:
          {
            long[] dummy = data.extractULongArray();
            int nbRead = data.getNbRead();
            int nbWritten = dummy.length - nbRead;
            int start = getLimitMin(checkLimit,ret_string,nbRead);
            int end = getLimitMax(checkLimit,ret_string,nbRead,false);
            for (int i = start; i < end; i++)
              printArrayItem(ret_string,i,printIndex,Long.toString(dummy[i]),false);
            if( isWritable(ai) ) {
              start = getLimitMin(checkLimit,ret_string,nbWritten);
              end = getLimitMax(checkLimit,ret_string,nbWritten,true);
              for (int i = start; i < end; i++)
                printArrayItem(ret_string,i,printIndex,Long.toString(dummy[i+nbRead]),true);
            }
          }
          break;

        case Tango_DEV_LONG64:
          {
            long[] dummy = data.extractLong64Array();
            int nbRead = data.getNbRead();
            int nbWritten = dummy.length - nbRead;
            int start = getLimitMin(checkLimit,ret_string,nbRead);
            int end = getLimitMax(checkLimit,ret_string,nbRead,false);
            for (int i = start; i < end; i++)
              printArrayItem(ret_string,i,printIndex,Long.toString(dummy[i]),false);
            if( isWritable(ai) ) {
              start = getLimitMin(checkLimit,ret_string,nbWritten);
              end = getLimitMax(checkLimit,ret_string,nbWritten,true);
              for (int i = start; i < end; i++)
                printArrayItem(ret_string,i,printIndex,Long.toString(dummy[i+nbRead]),true);
            }
          }
          break;
        
        case Tango_DEV_ULONG64:
          {
            long[] dummy = data.extractULong64Array();
            int nbRead = data.getNbRead();
            int nbWritten = dummy.length - nbRead;
            int start = getLimitMin(checkLimit,ret_string,nbRead);
            int end = getLimitMax(checkLimit,ret_string,nbRead,false);
            for (int i = start; i < end; i++)
              printArrayItem(ret_string,i,printIndex,Long.toString(dummy[i]),false);
            if( isWritable(ai) ) {
              start = getLimitMin(checkLimit,ret_string,nbWritten);
              end = getLimitMax(checkLimit,ret_string,nbWritten,true);
              for (int i = start; i < end; i++)
                printArrayItem(ret_string,i,printIndex,Long.toString(dummy[i+nbRead]),true);
            }
          }
          break;

        case Tango_DEV_DOUBLE:
          {
            double[] dummy = data.extractDoubleArray();
            int nbRead = data.getNbRead();
            int nbWritten = dummy.length - nbRead;
            int start = getLimitMin(checkLimit,ret_string,nbRead);
            int end = getLimitMax(checkLimit,ret_string,nbRead,false);
            for (int i = start; i < end; i++)
              printArrayItem(ret_string,i,printIndex,Double.toString(dummy[i]),false);
            if( isWritable(ai) ) {
              start = getLimitMin(checkLimit,ret_string,nbWritten);
              end = getLimitMax(checkLimit,ret_string,nbWritten,true);
              for (int i = start; i < end; i++)
                printArrayItem(ret_string,i,printIndex,Double.toString(dummy[i+nbRead]),true);
            }
          }
          break;

        case Tango_DEV_FLOAT:
          {
            float[] dummy = data.extractFloatArray();
            int nbRead = data.getNbRead();
            int nbWritten = dummy.length - nbRead;
            int start = getLimitMin(checkLimit,ret_string,nbRead);
            int end = getLimitMax(checkLimit,ret_string,nbRead,false);
            for (int i = start; i < end; i++)
              printArrayItem(ret_string,i,printIndex,Float.toString(dummy[i]),false);
            if( isWritable(ai) ) {
              start = getLimitMin(checkLimit,ret_string,nbWritten);
              end = getLimitMax(checkLimit,ret_string,nbWritten,true);
              for (int i = start; i < end; i++)
                printArrayItem(ret_string,i,printIndex,Float.toString(dummy[i+nbRead]),true);
            }
          }
          break;

        case Tango_DEV_STRING:
          {
            String[] dummy = data.extractStringArray();
            int nbRead = data.getNbRead();
            int nbWritten = dummy.length - nbRead;
            int start = getLimitMin(checkLimit,ret_string,nbRead);
            int end = getLimitMax(checkLimit,ret_string,nbRead,false);
            for (int i = start; i < end; i++)
              printArrayItem(ret_string,i,printIndex,dummy[i],false);
            if( isWritable(ai) ) {
              start = getLimitMin(checkLimit,ret_string,nbWritten);
              end = getLimitMax(checkLimit,ret_string,nbWritten,true);
              for (int i = start; i < end; i++)
                printArrayItem(ret_string,i,printIndex,dummy[i+nbRead],true);
            }
          }
          break;

        case Tango_DEV_ENCODED:
          {
            printIndex = true;
            DevEncoded e = data.extractDevEncoded();
            ret_string.append("Format: " + e.encoded_format + "\n");
            int nbRead = e.encoded_data.length;
            int start = getLimitMin(checkLimit,ret_string,nbRead);
            int end = getLimitMax(checkLimit,ret_string,nbRead,false);
            for (int i = start; i < end; i++) {
              short vs = (short)e.encoded_data[i];
              vs = (short)(vs & 0xFF);
              printArrayItem(ret_string,i,printIndex,Short.toString(vs),false);
            }
          }
          break;

        case Tango_DEV_ENUM:

          // We need the labels definition
          AttributeInfoEx info = device.get_attribute_info_ex(ai.name);

          short[] dummy = data.extractShortArray();
          int nbRead = data.getNbRead();
          int nbWritten = dummy.length - nbRead;
          int start = getLimitMin(checkLimit,ret_string,nbRead);
          int end = getLimitMax(checkLimit,ret_string,nbRead,false);
          for (int i = start; i < end; i++)
            printArrayItem(ret_string,i,printIndex,info.getEnumLabel(dummy[i]),false);
          if( isWritable(ai) ) {
            start = getLimitMin(checkLimit,ret_string,nbWritten);
            end = getLimitMax(checkLimit,ret_string,nbWritten,true);
            for (int i = start; i < end; i++)
              printArrayItem(ret_string,i,printIndex,info.getEnumLabel(dummy[i + nbRead]),true);
          }
          break;

        default:
          ret_string.append("Unsupported attribute type code="+ai.data_type+"\n");
          break;
      }

    } catch (DevFailed e) {

      ErrorPane.showErrorMessage(this,device.name() + "/" + ai.name,e);

    }

    return ret_string.toString();

  }

  private double[] extractSpectrumPlotData(DeviceAttribute data,AttributeInfo ai) {

    double[] ret = new double[0];
    int i;

    try {

      int start = getLimitMinForPlot(data.getNbRead());
      int end = getLimitMaxForPlot(data.getNbRead());

      switch (ai.data_type) {

        case Tango_DEV_UCHAR:
          {
            short[] dummy = data.extractUCharArray();
            ret = new double[end-start];
            for(i=start;i




© 2015 - 2025 Weber Informatics LLC | Privacy Policy