From: curt Date: Tue, 20 Nov 2001 22:03:29 +0000 (+0000) Subject: - added extensive documentation comments X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=804c9adbb03bf49dfefae5cc4ee74c34cb4ab2e9;p=flightgear.git - added extensive documentation comments --- diff --git a/src/Main/fgfs.hxx b/src/Main/fgfs.hxx index 834c6d4df..79dec566d 100644 --- a/src/Main/fgfs.hxx +++ b/src/Main/fgfs.hxx @@ -42,16 +42,116 @@ /** * Basic interface for all FlightGear subsystems. + * + *

This is an abstract interface that all FlightGear subsystems + * will eventually implement. It defines the basic operations for + * each subsystem: initialization, property binding and unbinding, and + * updating. Interfaces may define additional methods, but the + * preferred way of exchanging information with other subsystems is + * through the property tree.

+ * + *

To publish information through a property, a subsystem should + * bind it to a variable or (if necessary) a getter/setter pair in the + * bind() method, and release the property in the unbind() method:

+ * + *
+ * void MySubsystem::bind ()
+ * {
+ *   fgTie("/controls/elevator", &_elevator);
+ *   fgSetArchivable("/controls/elevator");
+ * }
+ *
+ * void MySubsystem::unbind ()
+ * {
+ *   fgUntie("/controls/elevator");
+ * }
+ * 
+ * + *

To reference a property (possibly) from another subsystem, there + * are two alternatives. If the property will be referenced only + * infrequently (say, in the init() method), then the fgGet* methods + * declared in fg_props.hxx are the simplest:

+ * + *
+ * void MySubsystem::init ()
+ * {
+ *   _errorMargin = fgGetFloat("/display/error-margin-pct");
+ * }
+ * 
+ * + *

On the other hand, if the property will be referenced frequently + * (say, in the update() method), then the hash-table lookup required + * by the fgGet* methods might be too expensive; instead, the + * subsystem should obtain a reference to the actual property node in + * its init() function and use that reference in the main loop:

+ * + *
+ * void MySubsystem::init ()
+ * {
+ *   _errorNode = fgGetNode("/display/error-margin-pct", true);
+ * }
+ *
+ * void MySubsystem::update ()
+ * {
+ *   do_something(_errorNode.getFloatValue());
+ * }
+ * 
+ * + *

The node returned will always be a pointer to SGPropertyNode, + * and the subsystem should not delete it in its destructor + * (the pointer belongs to the property tree, not the subsystem).

*/ class FGSubsystem { public: + + /** + * Virtual destructor to ensure that subclass destructors are called. + */ virtual ~FGSubsystem (); + + /** + * Initialize the subsystem. + * + *

This method should set up the state of the subsystem, but + * should not bind any properties. Note that any dependencies on + * the state of other subsystems should be placed here rather than + * in the constructor, so that FlightGear can control the + * initialization order.

+ */ virtual void init () = 0; + + + /** + * Acquire the subsystem's property bindings. + * + *

This method should bind all properties that the subsystem + * publishes. It will be invoked after init, but before any + * invocations of update.

+ */ virtual void bind () = 0; + + + /** + * Release the subsystem's property bindings. + * + *

This method should release all properties that the subsystem + * publishes. It will be invoked by FlightGear (not the destructor) + * just before the subsystem is removed.

+ */ virtual void unbind () = 0; + + + /** + * Update the subsystem. + * + *

FlightGear invokes this method every time the subsystem should + * update its state. If the subsystem requires delta time information, + * it should track it itself.

+ */ virtual void update () = 0; + };