1. Do not share user accounts! Any account that is shared by another person will be blocked and closed. This means: we will close not only the account that is shared, but also the main account of the user who uses another person's account. We have the ability to detect account sharing, so please do not try to cheat the system. This action will take place on 04/18/2023. Read all forum rules.
    Dismiss Notice
  2. For downloading SimTools plugins you need a Download Package. Get it with virtual coins that you receive for forum activity or Buy Download Package - We have a zero Spam tolerance so read our forum rules first.

    Buy Now a Download Plan!
  3. Do not try to cheat our system and do not post an unnecessary amount of useless posts only to earn credits here. We have a zero spam tolerance policy and this will cause a ban of your user account. Otherwise we wish you a pleasant stay here! Read the forum rules
  4. We have a few rules which you need to read and accept before posting anything here! Following these rules will keep the forum clean and your stay pleasant. Do not follow these rules can lead to permanent exclusion from this website: Read the forum rules.
    Are you a company? Read our company rules

FlyPT Mover 3.7.0.21

Discussion in 'FlyPt Mover' started by pmvcda, Sep 20, 2024.

  1. alex928gt

    alex928gt Member

    Joined:
    May 2, 2020
    Messages:
    44
    Balance:
    409Coins
    Ratings:
    +5 / 0 / -0
    Hi all, and firstly a huge thank you to @pmvcda for his work.

    2 bugs - I think - I spotted yesterday on the recent changes in the MIDI implementation.

    First bug with version 3.7.0.18 :

    - My MIDI device is called StremDeck2Mover in loopMIDI :

    loopMIDI.png

    - The different MIDI controls of this device are well recognized in Mover with names such as StreamDeck2Mover [1] #1.C01022 :

    37.0.18 MIDI.png

    - It looks like I can add them as Variables into Mover :

    37.0.18 PB1.png

    - But when I do so the name of the Variable turns into capital letters and is ultimately not recognized as a Variable any more and replaced by the value 0, and therefore not used by Mover :

    37.0.18 PB2.png


    Second bug with version 3.7.0.20 :

    The MIDI device is not recognized at all in Mover. All I get is:

    37.0.20 MIDI.png


    Thanks a lot in advance for your support!

    Best
    Alex
    • Informative Informative x 1
  2. pmvcda

    pmvcda aka FlyPT

    Joined:
    Nov 3, 2010
    Messages:
    2,256
    Location:
    Portugal
    Balance:
    15,806Coins
    Ratings:
    +2,700 / 17 / -0
    My Motion Simulator:
    6DOF

    Thank's, it's bugs.
    I'm using a key to identify the device. Look at my own:

    upload_2026-3-24_17-3-16.png

    M. stands for Midi
    78124264.... is the key code for that device and that should be unique.
    The idea was when sharing setups, we where able to use the same devices.
    That key is part of the device id, in my device:
    upload_2026-3-24_17-9-29.png

    I see that is not the best way to do it, I need to have another approach, because in your device you get a full name...
    In 3.7.0.18 it was using the name, but that is not good to use as variable due to letters... Might go with that, removing invalid chars and using uppercase in all letters. Might be more legible
  3. alex928gt

    alex928gt Member

    Joined:
    May 2, 2020
    Messages:
    44
    Balance:
    409Coins
    Ratings:
    +5 / 0 / -0
    Up until 3.7.0.9 I was indeed using a key code: 4488178B and it was working great. Btw you can see that it still appears in the list of devices in 3.7.0.18:
    37.0.18 PB1.png

    But it's not actually active anymore and the MIDI auto detect feature rather indicates StreamDeck2Mover [1] #1 as the right device when triggering MIDI events, even if as I said above the name does not actually work as a Variable. And in 3.7.0.20 I see neither the code nor the name in the list of devices:

    37.0.20 MIDI.png

    Key code or name is up to you, whatever is easiest for you/most reliable.

    Thanks again for this great tool!
    Alex
    • Informative Informative x 1
  4. DEMONx

    DEMONx New Member

    Joined:
    Oct 22, 2025
    Messages:
    12
    Balance:
    93Coins
    Ratings:
    +3 / 0 / -0
    My Motion Simulator:
    3DOF, Motion platform
    Hi, looks like a in 3.7.0.x 3dof actuator position working different tnak 3.5.3. I tried different options yaw swap, swap swapped. Platform moving different than on 3D view. Slider roll move to right platform move right to but on 3D view to left side. Same story with pitch

    Attached Files:

    • Informative Informative x 1
  5. pmvcda

    pmvcda aka FlyPT

    Joined:
    Nov 3, 2010
    Messages:
    2,256
    Location:
    Portugal
    Balance:
    15,806Coins
    Ratings:
    +2,700 / 17 / -0
    My Motion Simulator:
    6DOF
    Just checked this, so we have:

    Swap changes the side of the motor in the 3D view and also inverts the actuator output
    If you check swap swapped, the actuators swapped keep the motor side in the 3D view but invert the output

    Using same values in bothMovers:
    upload_2026-3-25_19-23-32.png upload_2026-3-25_19-23-43.png

    I get the same results. I might be missing what you mean, could it be something defined in the pose module?
  6. JCM

    JCM New Member

    Joined:
    Nov 19, 2022
    Messages:
    21
    Location:
    France
    Balance:
    113Coins
    Ratings:
    +4 / 0 / -0
    My Motion Simulator:
    3DOF
    Hi @pmvcda

    Awesome work as always!

    Two question please :

    1) The WASHR filter is very promising especially for yaw implementation.

    I could only make it work reasonably well when the selected value was "yaw position". For some reason, it refuses to work with "yaw velocity".

    (The problem when using yaw position value, is the huge time it can take to recenter if for example, the vehicle starts with a heading that is far different than 360 /0)

    2) BeamNG Drive source, could not make it work.

    Thank you as always for your awesome software
  7. pmvcda

    pmvcda aka FlyPT

    Joined:
    Nov 3, 2010
    Messages:
    2,256
    Location:
    Portugal
    Balance:
    15,806Coins
    Ratings:
    +2,700 / 17 / -0
    My Motion Simulator:
    6DOF
    There's a bug in BeamNG, also in Warplanes, IL2 and Condor. It was looking for the game path with some old code. I think it's solved for the next build.
    Use the patch/unpatch button in the source window. This Mover uses a lua script to send data to Mover.
    If you don't want to wait, put the code bellow in

    a file named: BeamNG_To_FlyPT_Mover.lua
    inside the folder: ...\SteamLibrary\steamapps\common\BeamNG.drive\lua\vehicle\protocols

    Code:
    -- This Source Code Form is subject to the terms of the bCDDL, v. 1.1.
    -- If a copy of the bCDDL was not distributed with this
    -- file, You can obtain one at http://beamng.com/bCDDL-1.1.txt
    
    -- ==================================== --
    -- Protocol to send data to FlyPT Mover --
    --             Version 1.0              --
    -- ==================================== --
    
    local M = {}
    
    local function init() end
    local function reset() end
    local function getAddress()        return "127.0.0.1" end
    local function getPort()           return 6666 end
    local function getMaxUpdateRate()  return 160 end
    
    local function isPhysicsStepUsed()
      return true
    end
    
    local function getStructDefinition()
      return [[
    // Fixed string with "FPTM"
          char           magic[4];            // 0
    
          // World position of the car
          float          posX;                // 4
          float          posY;                // 8
          float          posZ;                // 12
    
          // World velocity of the car
          float          velX;                // 16
          float          velY;                // 20
          float          velZ;                // 24
         
          // Acceleration of the car, gravity not included
          float          accX;                // 28
          float          accY;                // 32
          float          accZ;                // 36
    
          // Vector pointing up relative to the car
          float          upVecX;            // 40
          float          upVecY;            // 44
          float          upVecZ;            // 48
    
          // Roll, pitch and yaw positions of the car
          float          rollPos;            // 52
          float          pitchPos;            // 56
          float          yawPos;            // 60
    
          // Roll, pitch and yaw speeds of the car
          float          rollRate;            // 64
          float          pitchRate;            // 68
          float          yawRate;            // 72
    
          // Vector pointing front relative to the car
          float          frontVecX;            // 76
          float          frontVecY;            // 80
          float          frontVecZ;            // 84
         
          // Position of wheels (suspension)    
          float          flPosition;        // 88
          float          frPosition;        // 92
          float          rlPosition;        // 96
          float          rrPosition;        // 100
         
          // Angular speed of wheels
          float          flAngularSpeed;    // 104
          float          frAngularSpeed;    // 108
          float          rlAngularSpeed;    // 112
          float          rrAngularSpeed;    // 116
         
          // Load on the wheels    
          float          flLoad;            // 120
          float          frLoad;            // 124
          float          rlLoad;            // 128
          float          rrLoad;            // 132                          
         
          // Type of surface in contact with the wheel (-1 = in the air)
          float          flSurface;            // 136
          float          frSurface;            // 140
          float          rlSurface;            // 144
          float          rrSurface;            // 148
         
          // Other values
          float          clutch;             // 152
          float          throttle;            // 156
          float          brake;                // 160
          float          gear;                // 164
          float          rpm;                // 168
          float          speed;                // 172
          float          watTemp;            // 176
          float          oilTemp;            // 180
          float          steeringAngle;        // 184
          float          parkingBrake;        // 188
          float          steeringPercent;    // 192
          float          turboBoost;        // 196
          float          fuel;                // 200
      ]]
    end
    
    local function fillStruct(o, dtSim)
      o.magic = "FPTM"
      -- World position
      o.posX, o.posY, o.posZ = obj:getPositionXYZ()
      -- World velocity
      local velocity = obj:getVelocity()
      o.velX = velocity.x
      o.velY = velocity.y
      o.velZ = velocity.z
      -- Local acceleration
      o.accX = -obj:getSensorX()
      o.accY = -obj:getSensorY()
      o.accZ = -obj:getSensorZ()
      -- Vector pointing to the top of the vehicle
      local upVector = obj:getDirectionVectorUp()
      o.upVecX = upVector.x
      o.upVecY = upVector.y
      o.upVecZ = upVector.z
      -- Vector pointing to the front of the vehicle
      local frontVector = obj:getDirectionVector()
      o.frontVecX = frontVector.x
      o.frontVecY = frontVector.y
      o.frontVecZ = frontVector.z
      -- Rotation
      local quat = quatFromDir(frontVector, upVector)
      local euler = quat:toEulerYXZ()
      o.rollPos = -euler.z
      o.pitchPos = -euler.y
      o.yawPos = euler.x
      -- Rotation speeds
      o.rollRate = -obj:getRollAngularVelocity()
      o.pitchRate = -obj:getPitchAngularVelocity()
      o.yawRate = obj:getYawAngularVelocity()
      -- Wheels info
      local invQuat = quat:inversed()
      for _, v in pairs(wheels.wheels) do
        if v.name == "FL" then
          o.flPosition = (invQuat * vec3(obj:getNodePosition(v.node1))).z or 0
          o.flAngularSpeed = v.angularVelocity or 0
          o.flLoad = v.downForceRaw or 0
          o.flSurface = v.contactMaterialID1 or 0
        elseif v.name == "FR" then
          o.frPosition = (invQuat * vec3(obj:getNodePosition(v.node1))).z or 0
          o.frAngularSpeed = v.angularVelocity or 0
          o.frLoad = v.downForceRaw or 0
          o.frSurface = v.contactMaterialID1 or 0
        elseif v.name == "RL" then
          o.rlPosition = (invQuat * vec3(obj:getNodePosition(v.node1))).z or 0
          o.rlAngularSpeed = v.angularVelocity or 0
          o.rlLoad = v.downForceRaw or 0
          o.rlSurface = v.contactMaterialID1 or 0
        elseif v.name == "RR" then
          o.rrPosition = (invQuat * vec3(obj:getNodePosition(v.node1))).z or 0
          o.rrAngularSpeed = v.angularVelocity or 0
          o.rrLoad = v.downForceRaw or 0
          o.rrSurface = v.contactMaterialID1 or 0
        end
      end
      -- Some other data
      o.throttle = electrics.values.throttle or 0
      o.brake = electrics.values.brake or 0
      o.clutch = electrics.values.clutch or 0
      o.gear = electrics.values.gear_M or 0
      o.speed = electrics.values.wheelspeed or 0
      o.rpm = electrics.values.rpm or 0
      o.watTemp = electrics.values.watertemp or 0
      o.fuel = electrics.values.fuel or 0
      o.oilTemp = electrics.values.oiltemp or 0
      o.turboBoost = electrics.values.turboBoost or 0
      o.steeringAngle = electrics.values.steering or 0
      o.steeringPercent = electrics.values.steering_input or 0
      o.parkingBrake = electrics.values.parkingbrake or 0
    end
    
    M.init = init
    M.reset = reset
    M.getAddress = getAddress
    M.getPort = getPort
    M.getMaxUpdateRate = getMaxUpdateRate
    M.getStructDefinition = getStructDefinition
    M.fillStruct = fillStruct
    M.isPhysicsStepUsed = isPhysicsStepUsed
    
    return M
    For the WASHR, I recomend to use the speed. Maybe put a low pass and a gain before the wash
    • Like Like x 1
  8. JCM

    JCM New Member

    Joined:
    Nov 19, 2022
    Messages:
    21
    Location:
    France
    Balance:
    113Coins
    Ratings:
    +4 / 0 / -0
    My Motion Simulator:
    3DOF
    ... Thank you so much for the comprehensive answer @pmvcda ! :thumbs

    I will try this and report back.

    Cheers,
  9. pmvcda

    pmvcda aka FlyPT

    Joined:
    Nov 3, 2010
    Messages:
    2,256
    Location:
    Portugal
    Balance:
    15,806Coins
    Ratings:
    +2,700 / 17 / -0
    My Motion Simulator:
    6DOF
    Mover 3.7.0.21

    Recording inside Mover


    Playing inside Mover


    Update in Mover or get it here: https://github.com/FlyPTMover/Releases/raw/refs/heads/main/Mover 3.7.0.21 BETA.zip

    Release notes:


    General:
    New icons for the Mover and MoverRec files (go to options and make the file association to update the icons)
    Changed disabled colors in some controls (they where hard to read)sss
    Corrected color in horizontal slider of the 3D view
    Openning a MoverRec file (when associated in the options) opens the default setup with a plyer source added for the specified MoverRec file (that player is automatically selected in all the poses and directs)
    Games paths are no longer stored in the registry.

    Diagram:
    Corrected bug where the VR output was not showing the diagram connection

    Options:
    Changed file association code, added *.MoverRec association
    You get only one button to associate or dissociate, Mover detects if your association is with the current executable
    You still need to do the association in the options, but the first time you run Mover you will be asked if you want to do it if it's not done
    You can now set the location and enable a log file (logs the messages shown in Mover, the log file is erased each time you start Mover)

    Setups:
    Started migrating default setups to the user appdata folder
    *.MoverRec is now associated to Mover (icon with a play arrow) and when you open it, Mover opens the default setup with an added player for that file (that player source will be added and selected on the pose and direct modules)
    When loading another setup or clearing the setup, existing custom variables are also erased

    Transducers:
    Now checking manual for noise, frequency and amplitude doesnt use the filters the value used is the one given by the slider
    Gains increase at 0.01
    Examples added but not tested! Mostly copy/paste from old Mover

    Sources:
    DCS is now looking correctlly for the Saved Games folder in the system
    Corrected games patching on BeamNG, Condor, IL2Sturmovik and Warplanes (was using old code to look for the location - now removed)
    Reworked the record menu, if you use a hot control files use the name defined the first time you started recording, but appended by a # (no overwrite)
    Added values for FK
    Removed sources used for testing (LFS AVEvo/ACRally)

    Poses:
    Corrected bug in COR correction (pose from motion)

    Rigs:
    Some work done to split center of rotation into something similar to the pose from motion where you set independant COR for each rotation (if added it will be optional)
    Linear (4DOF), changed default dimensions and made yaw around a point at a specific distance of the top front

    Outputs:
    Corrected and updated some tooltips
    Solved bug in VR compensation
    Now you can't select outputs in the outputs (makes no sense)
    Corrected bug in color of the serial control in the serial output

    Tools:
    Updated and solved some bugs in the memory viewer (viewers/tools)
    Added a memory mapped file viewer based on the memory viewer (viewers/tools)
    Solved some bugs and optimized video recording

    Midis:
    Keys changed and association of midi in and out should give better matches even with multiple equal devices
    • Like Like x 1