Skip to main content
Knowledge Base
< All Topics

ForceSeatMI – Introduction

ForceSeatMI is an easy to use yet powerful interface that allows to add a motion platforms support to any application or game (referred as SIM in next sections). In most applications there is no need to control the hardware directly from the SIM. Because of that ForceSeatMI is used only to send telemetry or positioning request to ForceSeatPM. This approach delegates responsibility of transforming telemetry data to an actual platform motion from the SIM to ForceSeatPM. It also simplifies error handling that the SIM has to implement.

With the latest version of the ForceSeatMI, it is possible to control the hardware with usage of Inverse Kinematics. The SIM sends required top frame position and ForceSeatPM calculates required arms (or actuators) positions. This feature can be used in application where precise positioning is required instead of forces simulation.

This documentation applies only to ForceSeatMI 2.63 or newer. Older version of the API is not covered by this document. ForceSeatMI 2.63+ is also not backward compatible on interface and binary levels with 2.61 and previous versions. Switching from older ForceSeatMI to 2.63+ will require changes in your application source code.


  • SIM can choose between operation modes: forces simulation (telemetry), fast top frame positioning and precise top frame positioning
  • SIM does not have to translate telemetry data to an actual motors position – it is done by ForceSeatPM
  • SIM does not depend on specific motion platform hardware, hardware related adjustments are done inside ForceSeatPM
  • All diagnostic and processing features of ForceSeatPM are still available and may be used

Package content

  • ForceSeatMI_Loader.c – a wrapper that forwards functions calls to real DLL (DLL is installed by ForceSeatPM)
  • ForceSeatMI.cs – C# API
  • ForceSeatMI_*.h – files for C/C++ API
  • ForceSeatMI_*.cs – files for C# API
  • ForceSeatMI_*.py – files for Python API
  • Unity/*.cs – Unity 3D C# API
  • Plugins/UnrealEngine – dedicated Unreal Engine plug-in with helper class for vehicle and plane telemetry extraction
  • Plugins/Matlab/Simulink – library that allows to use ForceSeatMI with Simulink environment
  • Examples – examples
ForceSeatMI uses DLL which is installed as part of the ForceSeatPM software. Make sure that you have ForceSeatPM installed on your computer.


  • Following languages and frameworks are supported out of the box: C, C++, C#, Unity 3D(C#) , Unreal Engine (C++)
  • Native API dll is compiled with Visual Studio 2019 – static linking with MSVC is used.
  • Unity 3D examples require Unity 5.x or newer
  • Unreal Engine examples require Unreal Engine 4.14 or newer
  • C# examples require at least Visual Studio 2013 Express for Windows Desktop and .NET Framework 4.0.
  • C/C++ examples require at least Visual Studio 2013 Express for Windows Desktop.
  • It supports only Windows PC

Operation modes

ForceSeatMI works in one of modes described below. For first time users it is recommended to start from Table Position as it is the simplest example and works with built-in profile SDK – Positioning.


Mode Description Applications Recommended profiles Obsolete profiles (not recommended for new designs)
Telemetry data In this mode the SIM sends information about vehicle position, g-forces and accelerations in vehicle coordination system directly to ForceSeatPM. The whole transformation from forces to top frame movements is done inside ForceSeatPM scripting engine. It allows to easy change mapping and filter parameters without the need to change anything in the SIM. Games and vehicle physics simulations SDK – Vehicle Telemetry ACE
SDK – Plane Telemetry ACE
SDK – Vehicle Telemetry
SDK – Plane Telemetry
Precise table position In this mode the SIM sends top frame position (yaw, pitch, roll, heave, sway and surge) in real world units (rad, mm)). This allows the SIM to take full control over top frame position. For applications that want to have better control over top frame position (e.g. equipment testing applications) SDK – Positioning

Implementation details

structSize is a mandatory field which MUST be filled. It is used to handle backward/forward compatibility between DLL and the SIM.

telemetry.structSize = sizeof(FSMI_TelemetryACE);

mask (if it is presented) indicates what other fields are set. For example, if the SIM provides roll in FSMI_TopTablePositionPhysical structure, then mask field has to contains FSMI_POS_BIT_POSITION bit. It is required to always include state field in the mask (FSMI_POS_BIT_STATE or FSMI_TEL_BIT_STATE).

#define FSMI_POS_BIT_STATE                         ...
#define FSMI_POS_BIT_POSITION                      ...
#define FSMI_POS_BIT_MATRIX                        ...
#define FSMI_POS_BIT_MAX_SPEED                     ...
#define FSMI_POS_BIT_TRIGGERS                      ...
#define FSMI_POS_BIT_AUX                           ...

If ForceSeatMI is used in the SIM, the SIM has to call ForceSeatMI_BeginMotionControl at least once, otherwise there will be pause state present all the time. After first call, you can choose how to handle pause. One option is to call ForceSeatMI_EndMotionControl and another option is to set state bit. Our recommendation is as follows:

  1. When the SIM enters runtime mode (it is going to send telemetry data), it calls ForceSeatMI_BeginMotionControl
  2. When the SIM exists runtime mode (it is not going to send telemetry data for a while), it calls ForceSeatMI_EndMotionControl
  3. When during runtime, there is a short pause event (e.g. user presses pause on a keyboard), the SIM should use statefield

In other words, is is recommended to use ForceSeatMI_BeginMotionControl/ForceSeatMI_EndMotionControl to handle runtime – main menu transitions and state to handle short time pause events.

state fields consists of 8 bits, but in current version only the first bit is used.

  • BIT no. 0 — 1 (FSMI_STATE_PAUSE) means that runtime mode in SIM is paused, 0 (FSMI_STATE_NO_PAUSE) means that runtime mode in SIM is running.
Remember to add FSMI_POS_BIT_STATE or FSMI_TEL_BIT_STATE to mask if state field is going to be set. Make sure to set state at least once to unpause the motion platform after ForceSeatMI_BeginMotionControl is called.


Following examples are provided together with the SDK. Please make sure to use correct profile for each example.

Example Description Required profile
Show how to specify precise top table position by providing roll, pitch, yaw, heave, sway and surge in real world units. SDK – Positioning
Show how to send vehicle telemetry data from the SIM to ForceSeatPM. SDK – Vehicle Telemetry ACE
Show how to send aeroplane telemetry data from the SIM to ForceSeatPM. SDK – Plane Telemetry ACE
Show how to control top table position using specify data stored in CSV file and how to reproduce input linear acceleration on the motion platform. SDK – Positioning

Final thoughts

  • When platform does not move or the system is in pause state, then:
    • Check if correct profile is active in ForceSeatPM
    • Check if correct profile has been imported in ForceSeatPM (different operation modes require different profiles)
    • Check ForceSeatMI diagnostic to see if ForceSeatPM receives data from the SIM.
    • Check if paused indicator is on or off
    • Remember to configure mask field
    • Remember to set correct state value to leave pause mode.
  • ForceSeatMI32.dll/ForceSeatMI64.dll have been designed for high performance, so there is no logging available and the DLL does only minimal necessary data consistency checks.
  • If you plan to use ForceSeatMI in vehicle (or plane) physics simulation application, check this document.

Related articles

You might be interested in following articles. If you want download SDK or purchase it, please visit product page.

Next ForceSeatMI library in your C/C++ project
Table of Contents