Introduction

ifw-fnd is the ESO IFW Foundation library: a small, dependency-light C++20 package that holds the contracts and utility code every other IFW component is expected to agree on.

Two concerns dominate ifw-fnd’s scope:

  1. Logging abstraction. ifw::fnd::Logger is a pure-virtual interface plus a process-wide installation hook. Every component logs through the same FND* macros at call sites and never names a specific backend. Downstream applications install the backend they want (stdout, log4cplus, CII, custom) once at startup.

  2. Communication-adapter contract. ifw::fnd::defs::ICommAdapter is the protocol-agnostic adapter contract: Read / Write / Call / Browse / Subscribe / Configure / Connect over arbitrary protocols (OPC UA, Modbus, REST, MQTT, GenICam control plane, …). Implementations live elsewhere (uatools/ualib carries the OPC UA one); ifw-fnd just owns the contract.

In addition to those two large pieces, ifw-fnd carries a small grab bag of common types (DataType), FITS-IO helpers (BaseFitsio), and timing / threading utilities (IsoTimeNow, ThreadName, SleepSecs).

Scope

This manual is for developers consuming or extending ifw-fnd: it describes the logging abstraction (Logger and FND* macros), the communication- adapter contract (ICommAdapter), and how to build and install the library (Build and install). It is not an exhaustive API reference – the Doxygen documentation covers types and functions in detail.

Design constraints

  • Portability. No hard dependency on log4cplus, CII, ifw-core, or any other ESO-internal stack. Builds cleanly on VLT and ELT hosts and on plain CI containers.

  • Minimal third-party. Only fmt (formatting), cfitsio (for the FITS helpers), the C++20 standard library, and (for tests) GTest.

  • Header-friendly. Macros and inline helpers in headers so that call sites pay nothing for disabled-level logging and pay nothing extra to use them from any TU.

Conventions used in this manual

  • C++ identifiers refer to types and functions in the ifw::fnd namespace unless otherwise noted.

  • Path-like names such as $INTROOT and $PREFIX refer to the install prefix – by convention the same place ESO/IFW projects install to today (set via the PREFIX / INTROOT env vars picked up by the build).

  • The single header consumers include is <ifw/fnd/defs/base.hpp>. It pulls everything else in; see Logger and FND* macros for why this matters.

Acronyms

Acronym

Description

CII

Common Instrument Interface

ELT

Extremely Large Telescope

ESO

European Southern Observatory

FITS

Flexible Image Transport System

GenICam

Generic Interface for Cameras

ICS

Instrument Control System

IFW

Instrument Framework

MQTT

Message Queuing Telemetry Transport

OPC UA

Open Platform Communications Unified Architecture

REST

Representational State Transfer

TU

Translation Unit (a C++ compilation unit)

VLT

Very Large Telescope