// TODO return OpenMUC value
  private double getValue(SML_ListEntry entry) {
    double value = 0;

    ASNObject obj = entry.getValue().getChoice();
    if (obj.getClass().equals(Integer64.class)) {
      Integer64 val = (Integer64) obj;
      value = val.getVal();
    } else if (obj.getClass().equals(Integer32.class)) {
      Integer32 val = (Integer32) obj;
      value = val.getVal();
    } else if (obj.getClass().equals(Integer16.class)) {
      Integer16 val = (Integer16) obj;
      value = val.getVal();
    } else if (obj.getClass().equals(Integer8.class)) {
      Integer8 val = (Integer8) obj;
      value = val.getVal();
    } else if (obj.getClass().equals(Unsigned64.class)) {
      Unsigned64 val = (Unsigned64) obj;
      value = val.getVal();
    } else if (obj.getClass().equals(Unsigned32.class)) {
      Unsigned32 val = (Unsigned32) obj;
      value = val.getVal();
    } else if (obj.getClass().equals(Unsigned16.class)) {
      Unsigned16 val = (Unsigned16) obj;
      value = val.getVal();
    } else if (obj.getClass().equals(Unsigned8.class)) {
      Unsigned8 val = (Unsigned8) obj;
      value = val.getVal();
    } else {
      return Double.NaN;
    }

    byte scaler = entry.getScaler().getVal();
    return value * Math.pow(10, scaler);
  }
  /*
   * (non-Javadoc)
   *
   * @see org.openmuc.framework.driver.ehz.Connection#listChannels(int)
   */
  @Override
  public List<ChannelScanInfo> listChannels(int timeout) {
    List<ChannelScanInfo> channelInfos = new LinkedList<ChannelScanInfo>();

    logger.debug(name + "scanning channels");
    try {
      SML_ListEntry[] list = getSML_ListEntries();
      for (SML_ListEntry entry : list) {
        String channelAddress = getAddress(entry.getObjName().getOctetString());
        String description = "Current value: " + getValue(entry); // TODO entry.getUnit();
        ValueType valueType = ValueType.DOUBLE;
        Integer valueTypeLength = null;
        Boolean readable = true;
        Boolean writable = false;
        ChannelScanInfo channelInfo =
            new ChannelScanInfo(
                channelAddress, description, valueType, valueTypeLength, readable, writable);
        channelInfos.add(channelInfo);
      }
    } catch (IOException e) {
      e.printStackTrace();
      logger.error(name + "read failed");
    }
    return channelInfos;
  }
  /*
   * (non-Javadoc)
   *
   * @see org.openmuc.framework.driver.ehz.Connection#read(java.util.List, int)
   */
  @Override
  public void read(List<ChannelRecordContainer> containers, int timeout)
      throws ConnectionException {
    logger.trace(name + "reading channels");
    try {
      long timestamp = System.currentTimeMillis();
      SML_ListEntry[] list = getSML_ListEntries();

      Map<String, Double> values = new LinkedHashMap<String, Double>();
      for (SML_ListEntry entry : list) {
        String address = getAddress(entry.getObjName().getOctetString());
        double value = getValue(entry);
        values.put(address, value);
        logger.trace(name + address + " = " + value);
      }

      handleChannelRecordContainer(containers, values, timestamp);
    } catch (IOException e) {
      e.printStackTrace();
      logger.error(name + "read failed");
      close();
      throw new ConnectionException(e);
    }
  }