diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2016-06-08 12:55:00 +0200 | 
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2016-06-09 10:49:54 +0200 | 
| commit | 01631d777fba7662a7f28d8a0c9a03136d982095 (patch) | |
| tree | 4cb43b2650edc92f76f08df6aedf11d42159d207 /proto-fsuipc | |
| parent | bfb0b9c197a15aa7e9826e6c2835948e8029dd81 (diff) | |
proto/fsuipc: fix float <-> double promote
Diffstat (limited to 'proto-fsuipc')
| -rw-r--r-- | proto-fsuipc/ftnoir_protocol_fsuipc.cpp | 186 | ||||
| -rw-r--r-- | proto-fsuipc/ftnoir_protocol_fsuipc.h | 7 | 
2 files changed, 106 insertions, 87 deletions
diff --git a/proto-fsuipc/ftnoir_protocol_fsuipc.cpp b/proto-fsuipc/ftnoir_protocol_fsuipc.cpp index 91a61693..82cb44e9 100644 --- a/proto-fsuipc/ftnoir_protocol_fsuipc.cpp +++ b/proto-fsuipc/ftnoir_protocol_fsuipc.cpp @@ -13,12 +13,12 @@  FTNoIR_Protocol::FTNoIR_Protocol()  { -	prevPosX = 0.0f; -	prevPosY = 0.0f; -	prevPosZ = 0.0f; -	prevRotX = 0.0f; -	prevRotY = 0.0f; -	prevRotZ = 0.0f; +    prevPosX = 0.0f; +    prevPosY = 0.0f; +    prevPosZ = 0.0f; +    prevRotX = 0.0f; +    prevRotY = 0.0f; +    prevRotZ = 0.0f;  }  FTNoIR_Protocol::~FTNoIR_Protocol() @@ -27,19 +27,30 @@ FTNoIR_Protocol::~FTNoIR_Protocol()      FSUIPCLib.unload();  } -int FTNoIR_Protocol::scale2AnalogLimits( float x, float min_x, float max_x ) { -    float y, local_x; -	 -	local_x = x; -	if (local_x > max_x) { -		local_x = max_x; -	} -	if (local_x < min_x) { -		local_x = min_x; -	} -	y = ( 16383 * local_x ) / max_x; - -	return (int) y; +template<typename t> +int FTNoIR_Protocol::scale2AnalogLimits(t x, t min_x, t max_x) +{ +    t local_x = x; + +    if (local_x > max_x) +    { +        local_x = max_x; +    } +    if (local_x < min_x) +    { +        local_x = min_x; +    } + +    t y = (16383 * local_x) / max_x; + +    return (int) y; +} + +template<typename t> +static inline bool check_float_fresh(t x, t y) +{ +    static constexpr t eps = t(1e-4); +    return std::fabs(x - y) >= eps;  }  void FTNoIR_Protocol::pose(const double *headpose ) { @@ -49,90 +60,95 @@ void FTNoIR_Protocol::pose(const double *headpose ) {      TFSState roll;      WORD FSZoom; -    float virtPosX; -    float virtPosY; -    float virtPosZ; +    double virtPosX; +    double virtPosY; +    double virtPosZ; -    float virtRotX; -    float virtRotY; -    float virtRotZ; +    double virtRotX; +    double virtRotY; +    double virtRotZ; -//	qDebug() << "FSUIPCServer::run() says: started!"; +    //	qDebug() << "FSUIPCServer::run() says: started!";      virtRotX = -headpose[Pitch];				// degrees      virtRotY = headpose[Yaw];      virtRotZ = headpose[Roll]; -	virtPosX = 0.0f;											// cm, X and Y are not working for FS2002/2004! -	virtPosY = 0.0f; +    virtPosX = 0.0f;											// cm, X and Y are not working for FS2002/2004! +    virtPosY = 0.0f;      virtPosZ = headpose[TZ]; -	// -	// Init. the FSUIPC offsets (derived from Free-track...) -	// -	pitch.Control = 66503; -	yaw.Control = 66504; -	roll.Control = 66505; - -	// -	// Only do this when the data has changed. This way, the HAT-switch can be used when tracking is OFF. -	// -	if ((prevPosX != virtPosX) || (prevPosY != virtPosY) || (prevPosZ != virtPosZ) || -		(prevRotX != virtRotX) || (prevRotY != virtRotY) || (prevRotZ != virtRotZ)) { -		// -		// Open the connection -		// -		FSUIPC_Open(SIM_ANY, &result); - -		// -		// Check the FS-version -		// -		if  (((result == FSUIPC_ERR_OK) || (result == FSUIPC_ERR_OPEN)) &&  -			 ((FSUIPC_FS_Version == SIM_FS2K2) || (FSUIPC_FS_Version == SIM_FS2K4))) { -//			qDebug() << "FSUIPCServer::run() says: FSUIPC opened succesfully"; -			// -			// Write the 4! DOF-data to FS. Only rotations and zoom are possible. -			// -			pitch.Value = scale2AnalogLimits(virtRotX, -180, 180); -			FSUIPC_Write(0x3110, 8, &pitch, &result); - -			yaw.Value = scale2AnalogLimits(virtRotY, -180, 180); -			FSUIPC_Write(0x3110, 8, &yaw, &result); - -			roll.Value = scale2AnalogLimits(virtRotZ, -180, 180); -			FSUIPC_Write(0x3110, 8, &roll, &result); +    // +    // Init. the FSUIPC offsets (derived from Free-track...) +    // +    pitch.Control = 66503; +    yaw.Control = 66504; +    roll.Control = 66505; + +    // +    // Only do this when the data has changed. This way, the HAT-switch can be used when tracking is OFF. +    // +    if (check_float_fresh(prevRotX, virtRotX) || +        check_float_fresh(prevRotY, virtRotY) || +        check_float_fresh(prevRotZ, virtRotZ) || +        check_float_fresh(prevPosX, virtPosX) || +        check_float_fresh(prevPosY, virtPosY) || +        check_float_fresh(prevPosZ, virtPosZ)) +    { +        // +        // Open the connection +        // +        FSUIPC_Open(SIM_ANY, &result); + +        // +        // Check the FS-version +        // +        if  (((result == FSUIPC_ERR_OK) || (result == FSUIPC_ERR_OPEN)) && +             ((FSUIPC_FS_Version == SIM_FS2K2) || (FSUIPC_FS_Version == SIM_FS2K4))) +        { +            // Write the 4! DOF-data to FS. Only rotations and zoom are possible. + +            pitch.Value = scale2AnalogLimits(virtRotX, -180., 180.); +            FSUIPC_Write(0x3110, 8, &pitch, &result); + +            yaw.Value = scale2AnalogLimits(virtRotY, -180., 180.); +            FSUIPC_Write(0x3110, 8, &yaw, &result);  			FSZoom = (WORD) (64/50) * virtPosZ + 64; -			FSUIPC_Write(0x832E, 2, &FSZoom, &result); +            roll.Value = scale2AnalogLimits(virtRotZ, -180., 180.); +            FSUIPC_Write(0x3110, 8, &roll, &result); + +            FSUIPC_Write(0x832E, 2, &FSZoom, &result); -			// -			// Write the data, in one go! -			// -			FSUIPC_Process(&result); -			if (result == FSUIPC_ERR_SENDMSG) { +            // +            // Write the data, in one go! +            // +            FSUIPC_Process(&result); +            if (result == FSUIPC_ERR_SENDMSG) +            {                  // FSUIPC checks for already open connections and returns FSUIPC_ERR_OPEN in that case                  // the connection scope is global for the process. this is why above code doesn't                  // leak resources or have logic errors. see: http://www.purebasic.fr/english/viewtopic.php?t=31112 -				FSUIPC_Close(); -			} -		} -	} - -	prevPosX = virtPosX; -	prevPosY = virtPosY; -	prevPosZ = virtPosZ; -	prevRotX = virtRotX; -	prevRotY = virtRotY; -	prevRotZ = virtRotZ; +                FSUIPC_Close(); +            } +        } +    } + +    prevPosX = virtPosX; +    prevPosY = virtPosY; +    prevPosZ = virtPosZ; +    prevRotX = virtRotX; +    prevRotY = virtRotY; +    prevRotZ = virtRotZ;  }  bool FTNoIR_Protocol::correct() -{    -	qDebug() << "correct says: Starting Function"; +{ +    qDebug() << "correct says: Starting Function"; -	// -	// Load the DLL. -	// +    // +    // Load the DLL. +    //      FSUIPCLib.setFileName( s.LocationOfDLL );      if (FSUIPCLib.load() != true) {          qDebug() << "correct says: Error loading FSUIPC DLL"; @@ -142,7 +158,7 @@ bool FTNoIR_Protocol::correct()          qDebug() << "correct says: FSUIPC DLL loaded.";      } -	return true; +    return true;  }  OPENTRACK_DECLARE_PROTOCOL(FTNoIR_Protocol, FSUIPCControls, FTNoIR_ProtocolDll) diff --git a/proto-fsuipc/ftnoir_protocol_fsuipc.h b/proto-fsuipc/ftnoir_protocol_fsuipc.h index af59e988..42f421ad 100644 --- a/proto-fsuipc/ftnoir_protocol_fsuipc.h +++ b/proto-fsuipc/ftnoir_protocol_fsuipc.h @@ -52,14 +52,17 @@ public:      ~FTNoIR_Protocol() override;      bool correct();      void pose(const double* headpose); -    QString game_name() { +    QString game_name() +    {          return "Microsoft Flight Simulator X";      }  private:      QLibrary FSUIPCLib;      double prevPosX, prevPosY, prevPosZ, prevRotX, prevRotY, prevRotZ; -    static int scale2AnalogLimits( float x, float min_x, float max_x );      settings s; + +    template<typename t> +    static int scale2AnalogLimits(t x, t min_x, t max_x );  };  class FSUIPCControls: public IProtocolDialog  | 
