C# Migration Guide

FrontPanel 6.0 introduces several breaking changes to the C# API. The most significant are:

  • Device openingOpenBySerial() and device-listing methods are removed; use okCFrontPanelDevices instead
  • Data port separation — Wire, Trigger, Pipe, Register, and ResetFPGA operations move from okCFrontPanel to a dedicated okCFPGADataPortClassic object
  • Standalone error codesokCFrontPanel.ErrorCode becomes a standalone ErrorCode enum
  • Removed convenience methods — Several methods eliminated in favor of GetDeviceInfo()

Migrate with Claude Code

Download the skill from Opal Kelly Pins and place it in your projects .claude/skills folder. Then ask Claude Code to migrate your source files — it will apply every breaking change documented below automatically.

Update Device Opening

OpenBySerial(), GetDeviceCount(), and GetDeviceListSerial() are removed. Use FrontPanelDevices instead.

   // FP5:
   okCFrontPanel dev = new okCFrontPanel();
   dev.OpenBySerial("");

   // FP6:
   okCFrontPanelDevices devices = new okCFrontPanelDevices();
   okCFrontPanel dev = devices.Open();Code language: C# (cs)

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: C# (cs)

Obtain the Classic Data Port

After configuring the FPGA, call GetFPGADataPortClassic() on the okCFrontPanel instance:

   // FP5:
   dev.ConfigureFPGA("my_design.bit");

   if (dev.IsFrontPanelEnabled())
       Console.WriteLine("FrontPanel support is enabled.");

   dev.SetWireInValue(0x00, 0x01);
   dev.UpdateWireIns();

   // FP6:
   dev.ConfigureFPGA("my_design.bit");

   if (dev.IsFrontPanelEnabled())
       Console.WriteLine("FrontPanel support is enabled.");

   okCFPGADataPortClassic classicDataPort = dev.GetFPGADataPortClassic();
   classicDataPort.SetWireInValue(0x00, 0x01);
   classicDataPort.UpdateWireIns();Code language: C# (cs)

Manage the Data Port Lifetime

The okCFPGADataPortClassic object implements IDisposable. You must dispose of it before disposing of the parent okCFrontPanel object:

   // Cleanup — dispose data port before the device
   classicDataPort.Dispose();
   classicDataPort = null;

   dev.Dispose();
   dev = null;Code language: C# (cs)

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();
   uint wireOut = dev.GetWireOutValue(0x20);

   // FP6:
   classicDataPort.SetWireInValue(0x00, value, mask);
   classicDataPort.UpdateWireIns();
   classicDataPort.UpdateWireOuts();
   uint wireOut = classicDataPort.GetWireOutValue(0x20);Code language: C# (cs)

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: C# (cs)

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: C# (cs)

Registers:

   // FP5:
   dev.ReadRegister(addr, out data);
   dev.WriteRegister(addr, data);

   // FP6:
   classicDataPort.ReadRegister(addr, out data);
   classicDataPort.WriteRegister(addr, data);Code language: C# (cs)

ResetFPGA:

   // FP5:
   dev.ResetFPGA();

   // FP6:
   classicDataPort.ResetFPGA();Code language: C# (cs)

Update Error Code References

The ErrorCode nested enum has been moved from okCFrontPanel.ErrorCode to a standalone ErrorCode enum:

   // FP5:
   if (dev.ConfigureFPGA(file) != okCFrontPanel.ErrorCode.NoError)
       ...

   if (dev.SetWireInValue(0x20, 0x00) == okCFrontPanel.ErrorCode.InvalidEndpoint)
       ...

   // FP6:
   if (dev.ConfigureFPGA(file) != ErrorCode.NoError)
       ...

   if (classicDataPort.SetWireInValue(0x20, 0x00) == ErrorCode.InvalidEndpoint)
       ...Code language: C# (cs)

Common replacements:

  • okCFrontPanel.ErrorCode.NoErrorErrorCode.NoError
  • okCFrontPanel.ErrorCode.FailedErrorCode.Failed
  • okCFrontPanel.ErrorCode.TimeoutErrorCode.Timeout
  • okCFrontPanel.ErrorCode.DeviceNotOpenErrorCode.DeviceNotOpen
  • okCFrontPanel.ErrorCode.InvalidEndpointErrorCode.InvalidEndpoint
  • okCFrontPanel.ErrorCode.InvalidBlockSizeErrorCode.InvalidBlockSize
  • okCFrontPanel.ErrorCode.UnsupportedFeatureErrorCode.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();
   bool fast = dev.IsHighSpeed();

   // FP6:
   okTDeviceInfo info = new okTDeviceInfo();
   dev.GetDeviceInfo(info);
   // info.serialNumber, info.deviceID, info.productName,
   // info.productID, info.deviceMajorVersion, info.deviceMinorVersion,
   // info.usbSpeed, info.wireWidthCode language: C# (cs)

The okCFrontPanel.BoardModel enum is removed. Use info.productID with okEProduct constants.

Other removals:

  • GetErrorString() — use GetErrorMessage(ErrorCode) instead
  • EnableAsynchronousTransfers() — removed, no replacement
  • IsFrontPanel3Supported() — removed, no replacement
  • GetHostInterfaceWidth() — use info.wireWidth from GetDeviceInfo()
  • GetDeviceListModel() — use FrontPanelDevices (see Step 1)

Migration Checklist

  • Replace okCFrontPanel() + OpenBySerial("") with okCFrontPanelDevices().Open().
  • After ConfigureFPGA(), add okCFPGADataPortClassic classicDataPort = dev.GetFPGADataPortClassic();.
  • Find-and-replace all wire/trigger/pipe/register calls from dev. to classicDataPort..
  • Find-and-replace okCFrontPanel.ErrorCode with ErrorCode.
  • Replace removed convenience methods with GetDeviceInfo().
  • Add classicDataPort.Dispose() before dev.Dispose() in cleanup code.