You can actually access the physical IO directly from Java.
import java.util.Collection;
import java.util.Iterator;
import com.ur.urcap.api.domain.io.DigitalIO;
import com.ur.urcap.api.domain.io.IO;
import com.ur.urcap.api.domain.io.IOModel;
import com.ur.urcap.api.domain.io.ModbusIO;
/*
* A library class for getting the IO on the robot
*/
public class IOHelper {
private final IOModel ioModel;
public IOHelper(final IOModel ioModel) {
this.ioModel = ioModel;
}
public DigitalIO[] getDigitalInputs() {
final Collection<DigitalIO> ioCollection = ioModel.getIOs(DigitalIO.class);
ioCollection.removeIf(n -> !n.isInput());
final int inputSize = ioCollection.size();
final Iterator<DigitalIO> itr = ioCollection.iterator();
final DigitalIO[] inputList = new DigitalIO[inputSize];
for (int i = 0; i < inputSize; i++) {
inputList[i] = itr.next();
}
return inputList;
}
public DigitalIO[] getDigitalOutputs() {
final Collection<DigitalIO> ioCollection = ioModel.getIOs(DigitalIO.class);
ioCollection.removeIf(DigitalIO::isInput);
final int outputSize = ioCollection.size();
final Iterator<DigitalIO> itr = ioCollection.iterator();
final DigitalIO[] outputList = new DigitalIO[outputSize];
for (int i = 0; i < outputSize; i++) {
outputList[i] = itr.next();
}
return outputList;
}
public ModbusIO[] getModBusInputs() {
final Collection<ModbusIO> ioCollection = ioModel.getIOs(ModbusIO.class);
ioCollection.removeIf(n -> !n.isInput());
final int inputSize = ioCollection.size();
final Iterator<ModbusIO> itr = ioCollection.iterator();
final ModbusIO[] inputList = new ModbusIO[inputSize];
for (int i = 0; i < inputSize; i++) {
inputList[i] = itr.next();
}
return inputList;
}
public ModbusIO[] getModBusOutputs() {
final Collection<ModbusIO> ioCollection = ioModel.getIOs(ModbusIO.class);
ioCollection.removeIf(ModbusIO::isInput);
final int outputSize = ioCollection.size();
final Iterator<ModbusIO> itr = ioCollection.iterator();
final ModbusIO[] outputList = new ModbusIO[outputSize];
for (int i = 0; i < outputSize; i++) {
outputList[i] = itr.next();
}
return outputList;
}
public DigitalIO getSpecificDigitalIO(final String defaultName) {
final Collection<DigitalIO> ioCollection = ioModel.getIOs(DigitalIO.class);
final int ioCount = ioCollection.size();
if (ioCount > 0) {
final Iterator<DigitalIO> ioItr = ioCollection.iterator();
while (ioItr.hasNext()) {
final DigitalIO thisIO = ioItr.next();
final String thisDefaultName = thisIO.getDefaultName();
if (thisDefaultName.equals(defaultName)) {
return thisIO;
}
}
}
return null;
}
public IO getSpecificGPIO(final String defaultName) {
final Collection<IO> ioCollection = ioModel.getIOs();
final int ioCount = ioCollection.size();
if (ioCount > 0) {
final Iterator<IO> ioItr = ioCollection.iterator();
while (ioItr.hasNext()) {
final IO thisIO = ioItr.next();
final String thisDefaultName = thisIO.getDefaultName();
if (thisDefaultName.equals(defaultName)) {
return thisIO;
}
}
}
return null;
}
public ModbusIO getSpecificModBusIO(final String signalName) {
final Collection<ModbusIO> ioCollection = ioModel.getIOs(ModbusIO.class);
final int ioCount = ioCollection.size();
if (ioCount > 0) {
final Iterator<ModbusIO> ioItr = ioCollection.iterator();
while (ioItr.hasNext()) {
final ModbusIO thisIO = ioItr.next();
final String thisSignalAddress = thisIO.getName();
if (thisSignalAddress.equals(signalName)) {
return thisIO;
}
}
}
return null;
}
}
Here’s the contents of the class file called IOHelper. I’m sure I found this on the forum years ago.
Then in your toolbar file, declare an instance of the class
private final IOHelper ioHelper;
And assign it a value in the constructor:
ioHelper = new IOHelper(context.getAPIProvider().getApplicationAPI().getIOModel());
Now you can just directly declare DigitalIO:
DigitalIO myOutput;
And assign it to the actual IO using the IOHelper:
myOutput= ioHelper.getSpecificDigitalIO("digital_out[0]");
This DigitalIO object has .getValue() and .setValue() methods that you can use.
For a full list of the IO names that you can pass to the IO helper, you can see this link: How to obtain a list of ALL the IOs on the robot using the URCap Java API - #3 by fujikit