Java Migration Guide
FrontPanel 6.0 introduces several breaking changes to the Java API. The most significant are:
- Device opening —
OpenBySerial()and device-listing methods are removed; useokCFrontPanelDevicesinstead - Data port separation — Wire, Trigger, Pipe, Register, and
ResetFPGAoperations move fromokCFrontPanelto a dedicatedokCFPGADataPortClassicobject - Standalone error codes —
okCFrontPanel.ErrorCodebecomes a standaloneErrorCodeclass - Removed convenience methods — Several methods eliminated in favor of
GetDeviceInfo()
Update Device Opening
OpenBySerial(), GetDeviceCount(), and GetDeviceListSerial() are removed. Use okCFrontPanelDevices instead.
// FP5:
okCFrontPanel dev = new okCFrontPanel();
dev.OpenBySerial("");
// FP6:
okCFrontPanelDevices devices = new okCFrontPanelDevices();
okCFrontPanel dev = devices.Open();Code language: Java (java)Open() returns the device object directly. Pass a serial number to open a specific device, or pass an empty string to open the first available device.
Device enumeration:
// FP5:
okCFrontPanel dev = new okCFrontPanel();
int count = dev.GetDeviceCount();
for (int i = 0; i < count; i++) {
String serial = dev.GetDeviceListSerial(i);
}
// FP6:
okCFrontPanelDevices devices = new okCFrontPanelDevices();
int count = devices.GetCount();
for (int i = 0; i < count; i++) {
String serial = devices.GetSerial(i);
}Code language: Java (java)Obtain the Classic Data Port
After configuring the FPGA, call GetFPGADataPortClassic() on the okCFrontPanel instance:
// FP5:
dev.ConfigureFPGA("my_design.bit");
if (dev.IsFrontPanelEnabled())
System.out.println("FrontPanel support is enabled.");
dev.SetWireInValue(0x00, 0x01);
dev.UpdateWireIns();
// FP6:
dev.ConfigureFPGA("my_design.bit");
if (dev.IsFrontPanelEnabled())
System.out.println("FrontPanel support is enabled.");
okCFPGADataPortClassic classicDataPort = dev.GetFPGADataPortClassic();
classicDataPort.SetWireInValue(0x00, 0x01);
classicDataPort.UpdateWireIns();Code language: Java (java)The object returned by GetFPGADataPortClassic() is owned by the okCFrontPanel instance. It remains valid for the lifetime of that object.
Replace All Wire, Trigger, Pipe, and Register Calls
Change every call that previously went through okCFrontPanel to go through the classic data port instead. The method names and parameters are identical — only the target object changes.
Wires:
// FP5:
dev.SetWireInValue(0x00, value, mask);
dev.UpdateWireIns();
dev.UpdateWireOuts();
long wireOut = dev.GetWireOutValue(0x20);
// FP6:
classicDataPort.SetWireInValue(0x00, value, mask);
classicDataPort.UpdateWireIns();
classicDataPort.UpdateWireOuts();
long wireOut = classicDataPort.GetWireOutValue(0x20);Code language: Java (java)Triggers:
// FP5:
dev.ActivateTriggerIn(0x40, 0);
dev.UpdateTriggerOuts();
if (dev.IsTriggered(0x60, 1)) { ... }
// FP6:
classicDataPort.ActivateTriggerIn(0x40, 0);
classicDataPort.UpdateTriggerOuts();
if (classicDataPort.IsTriggered(0x60, 1)) { ... }Code language: Java (java)Pipes:
// FP5:
dev.WriteToPipeIn(0x80, length, data);
dev.ReadFromPipeOut(0xA0, length, data);
dev.WriteToBlockPipeIn(0x80, blockSize, length, data);
dev.ReadFromBlockPipeOut(0xA0, blockSize, length, data);
// FP6:
classicDataPort.WriteToPipeIn(0x80, length, data);
classicDataPort.ReadFromPipeOut(0xA0, length, data);
classicDataPort.WriteToBlockPipeIn(0x80, blockSize, length, data);
classicDataPort.ReadFromBlockPipeOut(0xA0, blockSize, length, data);Code language: Java (java)Registers:
// FP5:
dev.ReadRegister(addr, data);
dev.WriteRegister(addr, data);
// FP6:
classicDataPort.ReadRegister(addr, data);
classicDataPort.WriteRegister(addr, data);Code language: Java (java)ResetFPGA:
// FP5:
dev.ResetFPGA();
// FP6:
classicDataPort.ResetFPGA();Code language: Java (java)Update Error Code References
The ErrorCode nested enum has been moved from okCFrontPanel.ErrorCode to a standalone ErrorCode class:
// FP5:
if (okCFrontPanel.ErrorCode.NoError != dev.ConfigureFPGA(file))
...
// FP6:
if (ErrorCode.NoError != dev.ConfigureFPGA(file))
...Code language: Java (java)Common replacements:
okCFrontPanel.ErrorCode.NoError→ErrorCode.NoErrorokCFrontPanel.ErrorCode.Failed→ErrorCode.FailedokCFrontPanel.ErrorCode.Timeout→ErrorCode.TimeoutokCFrontPanel.ErrorCode.DeviceNotOpen→ErrorCode.DeviceNotOpenokCFrontPanel.ErrorCode.InvalidEndpoint→ErrorCode.InvalidEndpointokCFrontPanel.ErrorCode.InvalidBlockSize→ErrorCode.InvalidBlockSizeokCFrontPanel.ErrorCode.UnsupportedFeature→ErrorCode.UnsupportedFeature
Replace Removed Convenience Methods
Several convenience methods are removed in favor of GetDeviceInfo():
// FP5:
String serial = dev.GetSerialNumber();
okCFrontPanel.BoardModel model = dev.GetBoardModel();
int major = dev.GetDeviceMajorVersion();
int minor = dev.GetDeviceMinorVersion();
String id = dev.GetDeviceID();
boolean fast = dev.IsHighSpeed();
// FP6:
okTDeviceInfo info = new okTDeviceInfo();
dev.GetDeviceInfo(info);
// info.getSerialNumber(), info.getDeviceID(), info.getProductName(),
// info.getProductID(), info.getDeviceMajorVersion(), info.getDeviceMinorVersion(),
// info.getUsbSpeed(), info.getWireWidth()Code language: Java (java)Other removals:
GetErrorString()— useGetErrorMessage(ErrorCode)insteadEnableAsynchronousTransfers()— removed, no replacementIsFrontPanel3Supported()— removed, no replacementGetHostInterfaceWidth()— useinfo.getWireWidth()fromGetDeviceInfo()GetDeviceListModel()— useFrontPanelDevices(see Step 1)
Migration Checklist
- Replace
okCFrontPanel()+OpenBySerial("")withokCFrontPanelDevices().Open(). - After
ConfigureFPGA(), addokCFPGADataPortClassic classicDataPort = dev.GetFPGADataPortClassic();. - Find-and-replace all wire/trigger/pipe/register calls from
dev.toclassicDataPort.. - Find-and-replace
okCFrontPanel.ErrorCodewithErrorCode. - Replace removed convenience methods with
GetDeviceInfo().