From 2c7625351a7e0b4480f02206759b1a5c342d0d83 Mon Sep 17 00:00:00 2001 From: curt <curt> Date: Fri, 19 Nov 1999 03:02:49 +0000 Subject: [PATCH] Added PVE (ProVision Entertainment) and RUL (some guy's motion platform) formats. --- src/Network/Makefile.am | 2 + src/Network/protocol.cxx | 35 +++++++++--- src/Network/pve.cxx | 117 +++++++++++++++++++++++++++++++++++++++ src/Network/pve.hxx | 57 +++++++++++++++++++ src/Network/rul.cxx | 103 ++++++++++++++++++++++++++++++++++ src/Network/rul.hxx | 58 +++++++++++++++++++ 6 files changed, 365 insertions(+), 7 deletions(-) create mode 100644 src/Network/pve.cxx create mode 100644 src/Network/pve.hxx create mode 100644 src/Network/rul.cxx create mode 100644 src/Network/rul.hxx diff --git a/src/Network/Makefile.am b/src/Network/Makefile.am index 9207bdf53..6d6c76e96 100644 --- a/src/Network/Makefile.am +++ b/src/Network/Makefile.am @@ -7,6 +7,8 @@ libNetwork_a_SOURCES = \ protocol.cxx protocol.hxx \ garmin.cxx garmin.hxx \ nmea.cxx nmea.hxx \ + pve.cxx pve.hxx \ + rul.cxx rul.hxx \ net_hud.cxx network.cxx network.h INCLUDES += -I$(top_builddir) -I$(top_builddir)/Lib -I$(top_builddir)/Simulator diff --git a/src/Network/protocol.cxx b/src/Network/protocol.cxx index 2954f04b6..1e5b7ca0d 100644 --- a/src/Network/protocol.cxx +++ b/src/Network/protocol.cxx @@ -23,6 +23,7 @@ #include <Debug/logstream.hxx> +#include "iochannel.hxx" #include "protocol.hxx" @@ -38,11 +39,24 @@ FGProtocol::~FGProtocol() { } -// dummy open routine +// standard I/O channel open routine bool FGProtocol::open() { - FG_LOG( FG_IO, FG_INFO, "dummy FGProtocol::open()" ); - enabled = false; - return false; + if ( is_enabled() ) { + FG_LOG( FG_IO, FG_ALERT, "This shouldn't happen, but the channel " + << "is already in use, ignoring" ); + return false; + } + + FGIOChannel *io = get_io_channel(); + + if ( ! io->open( get_direction() ) ) { + FG_LOG( FG_IO, FG_ALERT, "Error opening channel communication layer." ); + return false; + } + + set_enabled( true ); + + return true; } @@ -60,10 +74,17 @@ bool FGProtocol::close() { } -// dummy close routine +// standard I/O channel close routine bool FGProtocol::gen_message() { - FG_LOG( FG_IO, FG_INFO, "dummy FGProtocol::gen_message()" ); - return false; + FGIOChannel *io = get_io_channel(); + + set_enabled( false ); + + if ( ! io->close() ) { + return false; + } + + return true; } diff --git a/src/Network/pve.cxx b/src/Network/pve.cxx new file mode 100644 index 000000000..2caa94060 --- /dev/null +++ b/src/Network/pve.cxx @@ -0,0 +1,117 @@ +// pve.cxx -- "PVE" protocal class (for Provision Entertainment) +// +// Written by Curtis Olson, started November 1999. +// +// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// +// $Id$ + + +#include <Debug/logstream.hxx> +#include <FDM/flight.hxx> +#include <Math/fg_geodesy.hxx> +#include <Time/fg_time.hxx> + +#include "iochannel.hxx" +#include "pve.hxx" + + +FGPVE::FGPVE() { +} + + +FGPVE::~FGPVE() { +} + + +// generate Garmin message +bool FGPVE::gen_message() { + // cout << "generating pve message" << endl; + FGInterface *f = cur_fdm_state; + + // get roll and pitch, convert to degrees + double roll_deg = f->get_Phi() * RAD_TO_DEG; + while ( roll_deg <= -180.0 ) { + roll_deg += 360.0; + } + while ( roll_deg > 180.0 ) { + roll_deg -= 360.0; + } + + double pitch_deg = f->get_Theta() * RAD_TO_DEG; + while ( pitch_deg <= -180.0 ) { + pitch_deg += 360.0; + } + while ( pitch_deg > 180.0 ) { + pitch_deg -= 360.0; + } + + short int heave = (int)(f->get_W_body() * 128.0); + + // scale roll and pitch to output format (1 - 255) + // straight && level == (128, 128) + + short int roll = (int)(roll_deg * 32768 / 180.0); + short int pitch = (int)(pitch_deg * 32768 / 180.0); + + unsigned char roll_b1, roll_b2, pitch_b1, pitch_b2, heave_b1, heave_b2; + roll_b1 = roll >> 8; + roll_b2 = roll & 0x00ff; + pitch_b1 = pitch >> 8; + pitch_b2 = pitch & 0x00ff; + heave_b1 = heave >> 8; + heave_b2 = heave & 0x00ff; + + sprintf( buf, "p%c%c%c%c%c%c\n", + roll_b1, roll_b2, pitch_b1, pitch_b2, heave_b1, heave_b2 ); + length = 8; + + // printf( "p [ %u %u ] [ %u %u ] [ %u %u ]\n", + // roll_b1, roll_b2, pitch_b1, pitch_b2, heave_b1, heave_b2 ); + + FG_LOG( FG_IO, FG_INFO, "roll=" << roll << " pitch=" << pitch << + " heave=" << heave ); + + return true; +} + + +// parse RUL message +bool FGPVE::parse_message() { + FG_LOG( FG_IO, FG_ALERT, "PVE input not supported" ); + + return false; +} + + +// process work for this port +bool FGPVE::process() { + FGIOChannel *io = get_io_channel(); + + if ( get_direction() == out ) { + gen_message(); + if ( ! io->write( buf, length ) ) { + FG_LOG( FG_IO, FG_ALERT, "Error writing data." ); + return false; + } + } else if ( get_direction() == in ) { + FG_LOG( FG_IO, FG_ALERT, "in direction not supported for RUL." ); + return false; + } + + return true; +} diff --git a/src/Network/pve.hxx b/src/Network/pve.hxx new file mode 100644 index 000000000..632dafdf1 --- /dev/null +++ b/src/Network/pve.hxx @@ -0,0 +1,57 @@ +// pve.hxx -- "PVE" protocal class (for Provision Entertainment) +// +// Written by Curtis Olson, started November 1999. +// +// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// +// $Id$ + + +#ifndef _FG_PVE_HXX +#define _FG_PVE_HXX + + +#include "Include/compiler.h" + +#include STL_STRING + +#include "protocol.hxx" + +FG_USING_STD(string); + + +class FGPVE : public FGProtocol { + + char buf[ 10 ]; + int length; + +public: + + FGPVE(); + ~FGPVE(); + + bool gen_message(); + bool parse_message(); + + // process work for this port + bool process(); +}; + + +#endif // _FG_PVE_HXX + + diff --git a/src/Network/rul.cxx b/src/Network/rul.cxx new file mode 100644 index 000000000..97f1e9eec --- /dev/null +++ b/src/Network/rul.cxx @@ -0,0 +1,103 @@ +// rul.cxx -- "RUL" protocal class (for some sort of motion platform +// some guy was building) +// +// Written by Curtis Olson, started November 1999. +// +// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// +// $Id$ + + +#include <Debug/logstream.hxx> +#include <FDM/flight.hxx> +#include <Math/fg_geodesy.hxx> +#include <Time/fg_time.hxx> + +#include "iochannel.hxx" +#include "rul.hxx" + + +FGRUL::FGRUL() { +} + + +FGRUL::~FGRUL() { +} + + +// generate Garmin message +bool FGRUL::gen_message() { + // cout << "generating rul message" << endl; + FGInterface *f = cur_fdm_state; + + // get roll and pitch, convert to degrees + double roll_deg = f->get_Phi() * RAD_TO_DEG; + while ( roll_deg < -180.0 ) { + roll_deg += 360.0; + } + while ( roll_deg > 180.0 ) { + roll_deg -= 360.0; + } + + double pitch_deg = f->get_Theta() * RAD_TO_DEG; + while ( pitch_deg < -180.0 ) { + pitch_deg += 360.0; + } + while ( pitch_deg > 180.0 ) { + pitch_deg -= 360.0; + } + + // scale roll and pitch to output format (1 - 255) + // straight && level == (128, 128) + + int roll = (int)( (roll_deg+180.0) * 255.0 / 360.0) + 1; + int pitch = (int)( (pitch_deg+180.0) * 255.0 / 360.0) + 1; + + sprintf( buf, "p%c%c\n", roll, pitch); + length = 4; + + FG_LOG( FG_IO, FG_INFO, "p " << roll << " " << pitch ); + + return true; +} + + +// parse RUL message +bool FGRUL::parse_message() { + FG_LOG( FG_IO, FG_ALERT, "RUL input not supported" ); + + return false; +} + + +// process work for this port +bool FGRUL::process() { + FGIOChannel *io = get_io_channel(); + + if ( get_direction() == out ) { + gen_message(); + if ( ! io->write( buf, length ) ) { + FG_LOG( FG_IO, FG_ALERT, "Error writing data." ); + return false; + } + } else if ( get_direction() == in ) { + FG_LOG( FG_IO, FG_ALERT, "in direction not supported for RUL." ); + return false; + } + + return true; +} diff --git a/src/Network/rul.hxx b/src/Network/rul.hxx new file mode 100644 index 000000000..b093244cd --- /dev/null +++ b/src/Network/rul.hxx @@ -0,0 +1,58 @@ +// rul.hxx -- "RUL" protocal class (for some sort of motion platform +// some guy was building) +// +// Written by Curtis Olson, started November 1999. +// +// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// +// $Id$ + + +#ifndef _FG_RUL_HXX +#define _FG_RUL_HXX + + +#include "Include/compiler.h" + +#include STL_STRING + +#include "protocol.hxx" + +FG_USING_STD(string); + + +class FGRUL : public FGProtocol { + + char buf[ 10 ]; + int length; + +public: + + FGRUL(); + ~FGRUL(); + + bool gen_message(); + bool parse_message(); + + // process work for this port + bool process(); +}; + + +#endif // _FG_RUL_HXX + +