Software Porting Guidelines
This document provides guidelines for porting the software from IFW 2025.0.0 to IFW 2026.0.0 based on the experience porting the template instrument provided with the IFW software.
Target Audience
These guidelines are intended for software developers involved in the porting process.
Prerequisites
A successful installation of the software as described in Installation.
List of Changes
The following changes affect instrument projects that are porting from IFW 2025 to IFW 2026. They are ordered by impact:
FCF Device Manager communication migration to
eso::uatools::Client.FCF
ExecuteRpcAPI change (VectorVariantparameter removed).CCF ROI coordinates changed from 0-based to 1-based.
DPM OLDB URI prefix now requires three slashes.
FCF Device Manager Communication Migration
The FCF device manager has migrated from the ifw::core::protocol::base framework to
eso::uatools::Client. The old iComm/CommFactory/Dispatcher infrastructure
has been removed entirely. Custom FCF device manager servers need to be updated.
Update includes and namespaces
The following header files need to be replaced in your server/src/main.cpp:
< #include <ifw/core/protocol/base/iComm.hpp>
< #include <ifw/core/protocol/base/commFactory.hpp>
< #include <ifw/core/protocol/base/dispatcher.hpp>
< #include <ifw/core/protocol/open62541/taskPoll.hpp>
< using namespace ifw::core::protocol::base;
Should be changed to:
> #include <ifw/fnd/defs/iCommAdapter.hpp>
> #include <ifw/fcf/devmgr/common/fndLog4cplusBridge.hpp>
> #include <eso/uatools/ualib/client.hpp>
Update dispatcher setup
The old Dispatcher<> template has been replaced by simple std::function callbacks:
< ifw::core::protocol::base::Dispatcher<> failure_dispatcher;
< ifw::core::protocol::base::Dispatcher<> normal_dispatcher;
Should be changed to:
> std::function<void()> failure_dispatcher;
> std::function<void()> normal_dispatcher;
Install the logging bridge
Before constructing any FCF or uatools objects, the logging bridge must be installed. Otherwise the first log call will abort with “no logger installed”:
> ifw::fcf::devmgr::common::InstallFndLog4cplusBridge();
Create uatools Client instance
The CommFactory has been removed. Each device now gets its own eso::uatools::Client.
< auto interface = CommFactory::Instance().Create(interface_cfg, devname, ifname);
Should be changed to:
> auto interface = std::make_shared<eso::uatools::Client>();
Update RegisterComm call
The RegisterComm signature has changed to use the device facade’s callback getters
instead of the old dispatcher objects:
< device->RegisterComm(interface, failure_dispatcher, normal_dispatcher);
Should be changed to:
> device->RegisterComm(interface,
> device_facade.GetFailureCB(),
> device_facade.GetNormalCB());
Remove Open62541 service thread
The TaskPoll for Open62541 is now managed internally by eso::uatools. Remove any
taskpoll thread management:
< ifw::core::protocol::opcua::TaskPoll open62541_service(std::chrono::milliseconds(100));
< ... open62541_service.StartThread();
< ... open62541_service.StopThread();
FCF ExecuteRpc API Change
The ExecuteRpc method no longer accepts a VectorVariant attribute list parameter.
In your custom LcsIf device implementations (e.g., YourDeviceLcsIf.cpp):
< ifw::core::protocol::base::VectorVariant attr_list;
< ...
< ExecuteRpc(obj, proc, attr_list);
Should be changed to:
> ExecuteRpc(obj, proc, {});
CCF ROI Coordinate Change
The CCF ROI (Region of Interest) window coordinates have changed from 0-based to 1-based lower-left origin to align with NGC2.
In your config/ccf/ccfSetup.yaml:
< win_start_x: 0
< win_start_y: 0
Should be changed to:
> win_start_x: 1
> win_start_y: 1
The window width and height may also need adjustment depending on your specific use case.
DPM OLDB URI Format
The OLDB URI prefix now uses three slashes to indicate the hierarchical context.
In your config/daq/dpm.yaml:
< oldb_uri_prefix: cii.oldb:/elt/prefix/dpm
Should be changed to:
> oldb_uri_prefix: cii.oldb:///elt/prefix/dpm