Hi Pascal,

this is strange, please try to reorder your header files to

#include "anyserial.h"
#include "ifDKAircraftInterface.h"
#include <QApplication>

or to:

#include "ifDKAircraftInterface.h"
#include "anyserial.h"
#include <QApplication>

BTW, does your anyserial includes anything from MICO/CORBA? Do you use
inside it `using namespace CORBA'?

Also please try to use PI's codec API as your college Andreas does.

Cheers,
Karel
-- 
Karel Gardas                  kgar...@objectsecurity.com
ObjectSecurity Ltd.           http://www.objectsecurity.com


ld1bp...@unibw.de wrote:
> Hallo Karel,
> thank you very much for your support. The anyobject Any variable contains
> all data coming from a complex structure (struct) defined in two specific
> IDL files: commonBasicTypes.idl and AircraftInterface.idl. Here are the
> files:
> 
> --- commonBasicTypes.idl ---
> 
> #ifndef __COMMONBASICTYPES_IDL__
> #define __COMMONBASICTYPES_IDL__
> 
> struct SGeoPos
> {
>       double lat_wgs84;       // degrees
>       double lon_wgs84;       // degrees
>       double alt_wgs84_m;
> };
> 
> typedef sequence <SGeoPos> LGeoPos;
> 
> struct S2dPos // e.g. referring to a pos in an OpenGL display
> {
>       double x; // normally -1.0 to +1.0
>       double y; // normally -1.0 to +1.0
> };
> 
> typedef sequence <S2dPos> L2dPos;
> 
> struct STime
> {
>       long      hour;
>       long      min;
>       long      sec;
>       double    ms;              // milliseconds
> };
> 
> 
> /**
>       Operation modes of a flight management system
>  */
> enum EFMSMode
> {
>       FMS_MODE_OFFLINE,               //!< FMS is offline (caused by operator 
> or
> "end-of-track")
>       FMS_MODE_TEMPORARY_OFFLINE,     //!< The FMS is offline for batch 
> processing
>       FMS_MODE_LNAV,                  //!< horizontal navigation only
>       FMS_MODE_VNAV,                  //!< horizontal and vertical 
> navigation, no speed control
>       FMS_MODE_VNAV_SPEED             //!< HNAV + VNAV + speed control
> };
> 
> // Different approach modes for waypoints.
> enum EWPMode
> {
>       WAYPOINT_MODE_TRACK,            //!< The default: Use the waypoint as 
> "fly-by"
> navigation hint.
>       WAYPOINT_MODE_OVERFLY,          //!< Fly over the waypoint. No 
> pre-turning is
> allowed.
>       WAYPOINT_MODE_HOVER,            //!< Hover at the waypoint. The FMS is 
> not allowed
> to advance to the next waypoint. This is only supported for rotorcrafts.
>       WAYPOINT_MODE_CIRCLE            //!< Circle around the waypoint. The 
> FMS is not
> allowed to advance to the next waypoint.
> };
> 
> enum EWaypointType
> {
>       WAYPOINTTYPE_UNKNOWN,
>       WAYPOINTTYPE_GROUND,
>       WAYPOINTTYPE_AIR,
>       WAYPOINTTYPE_TRAJECTORY //more to come
> };
> 
> enum EDesiredTurnMode
> {
>       TURNMODE_TURNFLYBY,
>       TURNMODE_TURNFLYOVER,
>       TURNMODE_TURNFLYOVERINTERCEPT
> };
> 
> struct STurnModeConstraint
> {
>       boolean constraintDefined;
>       EDesiredTurnMode eTurnMode;
> };
> 
> struct SPositionConstraint
> {
>       boolean constraintDefined;
>       double allowedLateralDeviation_m;
> };
> 
> enum EAltitudeType
> {
>       ALTTYPE_WGS84,
>       ALTTYPE_AGL,
>       ALTTYPE_MSL,
>       ALTTYPE_FL
> };
> 
> struct SAltitudeConstraint
> {
>       boolean constraintDefined;
>       boolean preferdAltSet;
>       double preferedAlt_m;
>       EAltitudeType ePreferdAltType;
>       boolean maxAltSet;
>       double maxAlt_m;
>       EAltitudeType eMaxAltType;
>       boolean minAltSet;
>       double minAlt_m;
>       EAltitudeType eMinAltType;
> };
> 
> struct STimeConstraint
> {
>       boolean constraintDefined;
>       STime   sTargetTime;
>       long            timeEarly_s;
>       long            timeLate_s;
> };
> 
> struct SWaypoint
> {
>       boolean initialized; // A waypoint is valid if this flag is true.
>       long id; // Unique ID for identification
>       string  name; // The name of this waypoint.
>       SGeoPos sPos; // The WGS84 coordinates of the waypoint
>       boolean hasHeading; // If set to true, the waypoint has an ingress
> heading. e.g. for VOR navigation or corridor entrance.
>       double  heading_rad; // If hasHeading is true, then this is the ingress
> heading for the waypoint.
>       double  ingress_speed_m_s; // Ingress speed in meter per second for this
> waypoint.
>       double  circle_radius_m;        // Circle radius in meter (only valid, 
> if mode =
> WAYPOINT_MODE_CIRCLE)
>       boolean circle_clockwise;       // true for clockwise, false for
> counter-clockwise (only valid, if mode = WAYPOINT_MODE_CIRCLE)
>       EWPMode mode;
>       EWaypointType eWaypointType;
>       STurnModeConstraint sTurnModeConstraint; // TODO: shift constraints to
> routenplaner_cmd_qe
>       SPositionConstraint sPositionConstraint;
>       SAltitudeConstraint sAltitudeConstraint;
>       STimeConstraint sTimeConstraint;
> };
> 
> typedef sequence<SWaypoint> LWaypoint;
> 
> typedef sequence<long> LWpId;
> 
> struct SRoute
> {
>       boolean initialized; // A Route is valid if this flag is true.
>       long id; // Unique ID for identification
>       string name;
>       //long nextRoutepointId; // only for MiRA integration. moved to
> SFMSOutput->sCurrentRoute.routepointIndex
>       //LWaypoint lWaypoint; // only for MiRA integration. moved to
> SRouteData->lWaypoint
>       LWpId lWpId; // For the new FMS a route consists of waypoint ids.
> Waypoints are stored separately. The order of the waypoints corresponds
> to the sequence order
> };
> 
> typedef sequence<SRoute> LRoute;
> 
> typedef sequence<long> LRouteIds;
> 
> #endif
> 
> 
> ---- AircraftInterface.idl ---
> 
> #ifndef AIRCRAFTINTERFACE_IDL
> #define AIRCRAFTINTERFACE_IDL
> 
> #include "commonBasicTypes.idl"
> 
> enum EAircraftType
> {
>       AIRCRAFTTYPE_PLANE,
>       AIRCRAFTTYPE_HELI
> };
> 
> 
> struct SIdentification
> {
>       short id; //id specified by the scenario simulation (and send to x-plane
> via the d-sim control plugin)
>       string  name;
>       string  identifier; //military or civil aircraft identifier
>       EAircraftType eAircraftType;
>       //EAircraftModel eAircraftModel;
>       boolean isManned;
> };
> 
> 
> struct SAircraftAttitude
> {
>       double phi_rad;       // roll
>       double theta_rad;     // pitch
>       double psi_rad_magN;  // yaw
>       double psi_rad_trueN; // yaw
> };
> 
> struct SAircraftRates
> {
>       //in flugzeugkoordinaten
>       double p_rad_s;         // phi_dot
>       double q_rad_s;         // theta_dot
>       double r_rad_s;         // psi_dot
> };
> 
> struct SAircraftAccelerations
> {
>       //in flugzeugkoordinaten
>       double x_m_s_s;
>       double y_m_s_s;
>       double z_m_s_s;
> };
> 
> struct SAircraftVelocities
> {
>       double north_m_s;
>       double east_m_s;
>       double vertical_m_s;
>       double ias_m_s;
>       double cas_m_s;
>       double tas_m_s;
>       double gs_m_s;
> };
> 
> struct SFlightMechanics
> {
>       SGeoPos                 sPos;
>       SAircraftAttitude       sAtt;
>       SAircraftRates          sRat;
>       SAircraftAccelerations  sAcc;
>       SAircraftVelocities     sVel;
>       double magneticVariation_rad;
> };
> 
> struct SRotorState
> {
>       double rpm_rad_s;
>       double torque_nm;
>       double maxTorque_nm;  //used for % calculation of the torque;
> };
> 
> enum EEngineOperatingState
> {
>       ENGINESTATE_ON,
>       ENGINESTATE_OFF,
>       ENGINESTATE_STARTUP
> };
> 
> struct SEngineState
> {
>       double                rpm_rad_s;
>       double                torque_nm;
>       double                maxTorque_nm;    // used for % calculation of the
> torque
>       double                curFuelConsumption_kg_s;
>       EEngineOperatingState eOpState;
> };
> 
> enum EGearState
> {
>       GEAR_UP,
>       GEAR_DOWN,
>       GEAR_TRANSIT
> };
> 
> struct SGearState
> {
>       EGearState nose;
>       EGearState right;
>       EGearState left;
> };
> 
> struct SSystemData
> {
>       SRotorState     sRotor;
>       long            noOfEngines;
>       sequence<SEngineState,2>    sEngine;
>       SGearState      sGear;
>       double          flaps; //-1 .. +1
>       double          spoiler; //-1 .. +1
>       double          break; //-1 .. +1
> };
> 
> struct SCurrentInput
> {
>       double  roll; //-1 .. +1
>       double  pitch; //-1 .. +1
>       double  yaw; //-1 .. +1
>       double  collective; //-1 .. +1
>       double  throttle1; //-1 .. +1 0= no power +1 100% power
>       double  throttle2; //-1 .. +1 0= no power +1 100% power
>       double  trimRoll; //-1 .. +1
>       double  trimPitch; //-1 .. +1
>       double  trimYaw; //-1 .. +1
>       double  trimCollective; //-1 .. +1
>       double  flaps; //-1 .. +1 -> 0 = neutral (in) +1= down -1 = up ????????
>       double  brakes; //-1 .. +1
>       double  spoiler;
>       boolean gearUp;
> };
> 
> struct SSateliteState
> {
>       boolean l1Locked;
>       boolean l2Locked;
> };
> 
> struct SGPSHealth
> {
>       double pdop_m;            // positional dilution of precision
>       double hdop_m;            // horizontal dilution of precision
>       long   noSat;             // number of satellites
>       sequence<SSateliteState,20> sSateliteState;
>       long   itow_ms;           // international time of week
> };
> 
> struct SSystemHealth
> {
>       SGPSHealth sGPS;
>       boolean destroyed;      // true => the aircraft is lost
> };
> 
> struct SBaroData
> {
>       double pressure_hPa;
>       double qnh_hPa;
>       double alt_m;
> };
> 
> struct SSensorics
> {
>       boolean   hasGroundContact;
>       double    airTemp_celsius;
>       SBaroData sBaroData;
>       double    radarAlt_m;
>       double    sonarAlt_m;
>       double    laserAlt_m;
> };
> 
> struct SWindData
> {
>       double   speed_m_s;
>       double   dir_rad_magN;
>       double   dir_rad_trueN;
> };
> 
> struct SWeatherData
> {
>       SWindData sWind;
> };
> 
> struct SAircraftInterface
> {
>       SIdentification     sId;
>       SFlightMechanics    sFm;
>       SSystemData         sSystem;
>       SSystemHealth       sHealth;
>       SSensorics          sSensorics;
>       SWeatherData        sWeather;
>       SCurrentInput       sCurrentInput;
>       double              simTime;
> };
> 
> #endif
> 
> 
> Here is the also the source cpp file I wrote and used to simulate a
> serialization process variables of type SAircraftInterface
> (AircraftInterface.idl):
> 
> 
> --- codec_test.cpp ---
> 
> #include <QApplication>
> 
> #include "anyserial.h"
> 
> #include "ifDKAircraftInterface.h"
> 
> using namespace std;
> 
> int main( int argc, char *argv[])
> {
>       SAircraftInterface_var aci_src, aci_dst;
>       CORBA::Any anyobject_src, anyobject_dst;
>       OctetSeq sequence;
> 
>       QApplication app(argc, argv);
> 
>       aci_src = new SAircraftInterface;
>       aci_dst = new SAircraftInterface;
> 
>       //identification
>       aci_src->sId.name="MiRA 1";
>       aci_src->sId.isManned = true;
>       aci_src->sId.eAircraftType = AIRCRAFTTYPE_HELI;
> 
>       //position
>       aci_src->sFm.sPos.lat_wgs84 = 10.0;
>       aci_src->sFm.sPos.lon_wgs84 = 20.0;
>       aci_src->sFm.sPos.alt_wgs84_m = 5.0;
> 
>       // Convert anyobject_src to an octet sequence using MICO internal codec
>       anyobject_src <<= *aci_src;
>       anyobject_src >> sequence;
> 
>       // Show octet sequence length
>       cout << "sequence.length: " << sequence.length() << endl;
> 
>       // Try to convert octet sequence to anyobject_dst using MICO internal 
> codec
>       try
>       {
>               anyobject_dst << sequence;
>               anyobject_dst >>= *aci_dst;
>               cout << "aci.name: " << aci_dst->sId.name << endl;
>               cout << "Sequence converted back to object of type Any." << 
> endl;
>       }
>       catch (...)
>       {
>               cout << "Error trying to convert sequence back to object of 
> type Any."
> << endl;
>       }
> 
>       return ( 0 );
> }
> 
> Using this small testing program I discovered two important things:
> 
> 1. If you remove the line where QApplication is called the try section
> works and the result is of 4016 octet for the sequence generated by the
> codec;
> 
> 2. If you leave the line where QAppliaction is called the try section
> works well only when the two lines where aci_src and aci_dst variables are
> allocated through the new operator have been placed before the
> QApplication, otherwise an exception is catched and the sequence results
> of 3748 octet, exactely 268 octet less than normal, as I already specified
> in my previous e-mail.
> 
> Note please also that:
> 
> 1. anyserial.h contains this definition:
> 
> void operator>> ( const Any& anyobject, OctetSeq& dataseq)
> 
> 2. ifDKAircraftInterface.h has been generated with the Mico idl compiler
> on the base of this interface:
> 
> #ifndef __IFDKAircraftInterface_IDL__
> #define __IFDKAircraftInterface_IDL__
> 
> #include "AircraftInterface.idl"
> 
> interface ifDKAircraftInterface
> {
>       SAircraftInterface ReadData ( );
>       void WriteData ( in SAircraftInterface var );
>       long long GetVersion ( );
> };
> 
> #endif // #ifndef __IFDKAircraftInterface_IDL__
> 
> 
> Many Thanks in advance,
> Pasquale Zarcone
> 
> 
> 
>> Hello,
>>
>> what exactly does your anyobject Any variable contain? The strange thing
>> is that you are only able to duplicate the issue when you use Qt...
>>
>> Cheers,
>> Karel
>>
>> Andreas Benzler wrote:
>>> Hallo,
>>> I´m using a client-server model based on Mico and I defined an idl
>>> interface like this:
>>>
>>> interface ifRec
>>> {
>>>     long Register( in string name, in string ns );
>>>     void WriteData( in long id, in any data );
>>>     void SetEnv( in string Key, in string Value );
>>>     void Rec();
>>>     void Break();
>>>     void Resume();
>>>     void Replay( in double speed );
>>>     void Stop();
>>>     long Load( in string filename );
>>> };
>>>
>>> The WriteData function uses the parameter "data" of type Any, which
>>> represents a structure (struct) containing other structures inside, and
>>> I
>>> get a run-time error whenever a client calls this function. The client
>>> has
>>> been compiled with Qt and uses the QApplication function. I discovered
>>> that the run-time error it´s based on the problem that the object of
>>> type
>>> Any is codified in the wrong way from Mico during the serialization
>>> process only when the QApplication function is used in the client code
>>> and
>>> also when the tree´s depth of the structures codified in the Any object
>>> is
>>> too big, otherwise no run-time error comes up and the octet sequence
>>> that
>>> represents the object, made by the Mico serialization process, has the
>>> correct length. I also discovered that the difference between the octet
>>> sequence with and without using QApplication is fixed and always 268
>>> bytes
>>> (more bytes without QApplication) and it does not depend on the
>>> complexity
>>> of the structure that the Any object represents. I discovered this last
>>> detail simulating a serialization process of the Any object using the
>>> available Mico internal codec. I tried to compile the system with the
>>> two
>>> Mico versions 2.3.11 and 2.3.13, both versions compiled specifying also
>>> the
>>> --with-qt=<qt-path> directive for the configure script, but I have same
>>> problems.
>>>
>>> Here is also the Mico codec I used to simulate the serialization
>>> process:
>>>
>>> void operator>> ( const Any& anyobject, OctetSeq& dataseq)
>>> {
>>>     // Codec
>>>     ORB_var orb;
>>>     Object_var obj;
>>>     IOP::CodecFactory_var cf;
>>>     IOP::Encoding enc2;
>>>     IOP::Codec_ptr codec_ptr;
>>>
>>>     // Generate codec based on CodecFactory
>>>     int argc = 1;
>>>     char* argv[1];
>>>     argv[0] = "anyserial";
>>>     orb = ORB_init( argc, argv, "mico-local-orb" );
>>>     obj = orb->resolve_initial_references("CodecFactory");
>>>     cf = IOP::CodecFactory::_narrow(obj);
>>>     enc2.format = IOP::ENCODING_CDR_ENCAPS;
>>>     enc2.major_version = 1;
>>>     enc2.minor_version = 2;
>>>     codec_ptr = cf->create_codec(enc2);
>>>
>>>     // Encode anyobject and generate a new octet sequence
>>>     OctetSeq_var newdataseq_ptr = codec_ptr->encode(anyobject);
>>>     int length = newdataseq_ptr->length();
>>>
>>>     // Copy generated octet sequence into dataseq
>>>     dataseq.length(length);
>>>
>>>     for (int i=0; i<length; i++)
>>>             dataseq[i] = (*newdataseq_ptr)[i];
>>> }
>>>
>>> Any and OctetSeq types are exactly CORBA::Any and CORBA::OctetSeq types
>>> defined in MICO.
>>>
>>> Could please anyone help to understand why Mico has this strange
>>> behavior
>>> and eventually to find a solution?
>>>
>>> Many Thanks in advance,
>>> Pasquale Zarcone
>>>
>>> Because the mail did not come trough with my colleges account I post
>>> this message on his behalf
>>>
>>> Andreas
>>> _______________________________________________
>>> Mico-devel mailing list
>>> Mico-devel@mico.org
>>> http://www.mico.org/mailman/listinfo/mico-devel
>>>
>>
>> --
>> Karel Gardas                  kgar...@objectsecurity.com
>> ObjectSecurity Ltd.           http://www.objectsecurity.com
>> _______________________________________________
>> Mico-devel mailing list
>> Mico-devel@mico.org
>> http://www.mico.org/mailman/listinfo/mico-devel
>>
> 
> 
> 


-- 
Karel Gardas                  kgar...@objectsecurity.com
ObjectSecurity Ltd.           http://www.objectsecurity.com
_______________________________________________
Mico-devel mailing list
Mico-devel@mico.org
http://www.mico.org/mailman/listinfo/mico-devel

Reply via email to