/**
* Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT
* All rights reserved. Use is subject to license terms. See LICENSE.TXT
*/
package org.diirt.datasource.formula.channel;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import org.diirt.datasource.expression.DesiredRateExpression;
import org.diirt.datasource.formula.DynamicFormulaFunction;
import org.diirt.vtype.VString;
/**
* Formula function that returns the value of a channel matching the name
* of the argument.
*
* @author carcassi
*/
public class ChannelFormulaFunction extends DynamicFormulaFunction {
@Override
public boolean isVarArgs() {
return false;
}
@Override
public String getName() {
return "channel";
}
@Override
public String getDescription() {
return "Returns the value of the given pv name";
}
@Override
public List<Class<?>> getArgumentTypes() {
return Arrays.<Class<?>>asList(VString.class);
}
@Override
public List<String> getArgumentNames() {
return Arrays.asList("pvName");
}
@Override
public Class<?> getReturnType() {
return Object.class;
}
// Function state (will be different for each use of the function)
private String previousName;
private DesiredRateExpression<?> currentExpression;
@Override
public Object calculate(final List<Object> args) {
// Retrieve the new name
VString value = (VString) args.get(0);
String newName = null;
if (value != null) {
newName = value.getValue();
}
// If the name does not match, disconnect and connect
if (!Objects.equals(newName, previousName)) {
// Disconnect previous
if (currentExpression != null) {
getDirector().disconnectReadExpression(currentExpression);
currentExpression = null;
}
// Connect new
if (newName != null) {
currentExpression = channel(newName, Object.class);
getDirector().connectReadExpression(currentExpression);
}
previousName = newName;
}
// Return value
if (newName == null) {
return null;
}
return currentExpression.getFunction().readValue();
}
@Override
public void dispose() {
// Disconnect everything on dispose
if (currentExpression != null) {
getDirector().disconnectReadExpression(currentExpression);
}
currentExpression = null;
}
}