Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

PhxLogicalInputEngine.h

Go to the documentation of this file.
00001 #ifndef PHX_LOGICAL_INPUT_H
00002 #define PHX_LOGICAL_INPUT_H
00003 
00004 #include <Phx/PhxConfig.h>
00005 #include <Phx/PhxTypes.h>
00006 #include <Phx/Core/PhxNamedInterface.h>
00007 #include <Phx/Input/PhxRawInputEngine.h>
00008 #include <Phx/Util/PhxListeners.h>
00009 #include <Phx/Util/PhxLocks.h>
00010 #include <vector>
00011 
00019 namespace Phx {
00020 
00052   class LogicalInputEngine : public NamedInterface {
00053     class ButtonStateClass;
00054   public:
00055     const static NamedInterface::Type INTERFACE_TYPE;
00056     const static String INTERFACE_TYPE_NAME;
00057 
00058     const static NamedInterface::Identifier LOGICAL_INPUT_ENGINE_IDENTIFIER;
00059     const static String LOGICAL_INPUT_ENGINE_NAME;
00060 
00068     typedef double AxisState;
00069 
00088     typedef ValueType<ButtonStateClass, uint8_t> ButtonState;
00089 
00091     const static ButtonState PRESSED;
00093     const static ButtonState RELEASED;
00094 
00095     class AxisClient;
00096     class ButtonClient;
00097 
00098     class AxisSpec;
00099     class ButtonSpec;
00100     class ButtonSpecState;
00101 
00102     class AxisDriver;
00103     class ButtonDriver;
00104 
00105     class AnalogAxisDriver;
00106     class DigitalAxisDriver;
00107     class AnalogButtonDriver;
00108     class DigitalButtonDriver;
00109 
00110     // Sets the input engine to which this logical layer is bound.
00111     // In the future, will likely use the datagram system to specify the
00112     // identifier of the input engine to use, and thus you will not be able
00113     // to change the input layer after the logical layer is constructed.
00114     // InUseException when engine already set.
00115     virtual void rawInputEngine(const Ptr<RawInputEngine>& rawInputEngine) = 0;
00116 
00127     virtual Ptr<AxisClient> newAxisClient(const String& axisName) = 0;
00128 
00139     virtual Ptr<ButtonClient> newButtonClient(const String& buttonName) = 0;
00140 
00141 
00155     virtual Ptr<AnalogAxisDriver> newAnalogAxisDriver(const String& axisName) = 0;
00156 
00170     virtual Ptr<DigitalAxisDriver> newDigitalAxisDriver(const String& axisName) = 0;
00171 
00185     virtual Ptr<AnalogButtonDriver> newAnalogButtonDriver(const String& buttonName) = 0;
00186 
00200     virtual Ptr<DigitalButtonDriver> newDigitalButtonDriver(const String& buttonName) = 0;
00201 
00202 
00207     class Listener : public BaseListener<LogicalInputEngine, Listener> {
00208     public:
00209       virtual void onNewAxisClient(const String& axisName) = 0;
00210       virtual void onNewButtonClient(const String& buttonName) = 0;
00211     };
00212 
00220     virtual void listener(Listener* listener) = 0;
00221 
00222   protected:
00223     LogicalInputEngine() {}
00224   private:
00225     LogicalInputEngine(LogicalInputEngine&);
00226     LogicalInputEngine& operator=(LogicalInputEngine&);
00227   };
00228     
00229 
00234   class LogicalInputEngine::AxisClient :
00235     public LockedPtrInterface<AxisClient> {
00236   public:
00237 
00242     class Listener : public BaseListener<AxisClient, Listener> {
00243     public:
00247       virtual void onAxisState(void) = 0;
00248     };
00249 
00257     virtual void listener(Listener* listener) = 0;
00258 
00265     virtual AxisState axisState(void) const = 0;
00266 
00271     const String& name(void) const { return mName; }
00272 
00273   protected:
00274     void setName(const String& name) { mName = name; }
00275   private:
00276     String mName;
00277   };
00278 
00279 
00284   class LogicalInputEngine::ButtonClient :
00285     public LockedPtrInterface<ButtonClient> {
00286   public:
00287 
00292     class Listener : public BaseListener<ButtonClient, Listener> {
00293     public:
00297       virtual void onButtonState(void) = 0;
00298     };
00299 
00307     virtual void listener(Listener* listener) = 0;
00308 
00316     virtual ButtonState buttonState(void) const = 0;
00317 
00322     const String& name(void) const { return mName; }
00323 
00324   protected:
00325     void setName(const String& name) { mName = name; }
00326   private:
00327     String mName;
00328   };
00329 
00330 
00331 
00339   class LogicalInputEngine::AxisDriver :
00340     public LockedPtrInterface<AxisDriver> {
00341   public:
00342     typedef LogicalInputEngine::AxisState AxisState;
00343 
00350     virtual AxisState axisState(void) const = 0;
00351 
00357     const String& name(void) const { return mName; }
00358 
00359   protected:
00360     AxisDriver() {}
00361     void setName(const String& name) { mName = name; }
00362 
00363   private:
00364     String mName;
00365 
00366     AxisDriver(AxisDriver&);
00367     AxisDriver& operator=(AxisDriver&);
00368   };
00369 
00370 
00378   class LogicalInputEngine::ButtonDriver :
00379     public LockedPtrInterface<ButtonDriver> {
00380   public:
00381     typedef LogicalInputEngine::ButtonState ButtonState;
00382 
00389     virtual ButtonState buttonState(void) const = 0;
00390 
00396     const String& name(void) const { return mName; }
00397 
00398   protected:
00399     ButtonDriver() {}
00400     void setName(const String& name) { mName = name; }
00401 
00402   private:
00403     String mName;
00404 
00405     ButtonDriver(ButtonDriver&);
00406     ButtonDriver& operator=(ButtonDriver&);
00407   };
00408 
00409 
00410 
00416   class LogicalInputEngine::AxisSpec {
00417   public:
00419     const static AxisSpec INVALID;
00420 
00424     AxisSpec() : mDriverName(""), mIdentifier(RawInputEngine::INVALID_AXIS_IDENTIFIER) {}
00425 
00433     AxisSpec(const String& driverName, RawInputEngine::AxisIdentifier identifier) :
00434       mDriverName(driverName), mIdentifier(identifier) { 
00435     }
00436 
00437     // default copy and assignment okay
00438 
00439     // comparisons
00440 
00446     bool operator==(const AxisSpec& b) const {
00447       return (mDriverName == b.mDriverName &&
00448               mIdentifier == b.mIdentifier);
00449     }
00450 
00455     bool operator!=(const AxisSpec& b) const { return !(b==*this); }
00456 
00461     const String& driverName() const { return mDriverName; }
00462 
00469     RawInputEngine::AxisIdentifier identifier() const { return mIdentifier; }
00470 
00471   private:
00472     String  mDriverName;
00473     RawInputEngine::AxisIdentifier mIdentifier;
00474   };
00475   
00476   
00482   class LogicalInputEngine::ButtonSpec {
00483   public:
00485     const static ButtonSpec INVALID;
00486 
00490     ButtonSpec() : mDriverName(""), mIdentifier(RawInputEngine::INVALID_BUTTON_IDENTIFIER) {}
00491 
00499     ButtonSpec(const String& driverName, RawInputEngine::ButtonIdentifier identifier) :
00500       mDriverName(driverName), mIdentifier(identifier) { }
00501 
00502     // default copy and assignment okay
00503 
00504     // comparisons
00505 
00511     bool operator==(const ButtonSpec& b) const {
00512       return (mDriverName == b.mDriverName &&
00513               mIdentifier == b.mIdentifier);
00514     }
00515 
00520     bool operator!=(const ButtonSpec& b) const { return !(*this==b); }
00521 
00522     // attribute accessors (read-only)
00523 
00528     const String& driverName() const { return mDriverName; }
00529 
00536     RawInputEngine::ButtonIdentifier identifier() const { return mIdentifier; }
00537 
00538   private:
00539     String  mDriverName;
00540     RawInputEngine::ButtonIdentifier mIdentifier;
00541   };
00542 
00570   class LogicalInputEngine::ButtonSpecState {
00571   public:
00572 
00580     ButtonSpecState() : mTriggerState(RawInputEngine::PRESSED) {}
00581 
00586     ButtonSpecState(const String& driverName, RawInputEngine::ButtonIdentifier button,
00587                     RawInputEngine::ButtonState triggerState) :
00588       mButtonSpec(driverName, button), mTriggerState(triggerState) {}
00589 
00598     ButtonSpecState(const LogicalInputEngine::ButtonSpec& buttonSpec,
00599                     RawInputEngine::ButtonState triggerState) :
00600       mButtonSpec(buttonSpec), mTriggerState(triggerState) {}
00601 
00602     // default copy/assignment okay
00603 
00609     bool operator==(const ButtonSpecState& b) {
00610       return (b.mButtonSpec == mButtonSpec &&
00611               b.mTriggerState == mTriggerState);
00612     }
00613 
00618     bool operator!=(const ButtonSpecState& b) {
00619       return !(*this == b);
00620     }
00621 
00626     const LogicalInputEngine::ButtonSpec& buttonSpec() const { return mButtonSpec; }
00627 
00636     RawInputEngine::ButtonState triggerState() const { return mTriggerState; }
00637 
00638   private:
00639     LogicalInputEngine::ButtonSpec mButtonSpec;
00640     RawInputEngine::ButtonState    mTriggerState;
00641   };
00642 
00655   class LogicalInputEngine::AnalogAxisDriver :
00656     public LogicalInputEngine::AxisDriver {
00657   public:
00658 
00664     virtual void axis(const AxisSpec& axis) = 0;
00665 
00670     virtual AxisSpec axis(void) const = 0;
00671 
00681     virtual void axisMax(RawInputEngine::AxisState axisMax) = 0;
00682 
00689     virtual RawInputEngine::AxisState axisMax(void) const = 0;
00690     
00695     virtual void axisCenter(RawInputEngine::AxisState axisCenter) = 0;
00696 
00701     virtual RawInputEngine::AxisState axisCenter(void) const = 0;
00702 
00712     virtual void axisMin(RawInputEngine::AxisState axisMin) = 0;
00713 
00718     virtual RawInputEngine::AxisState axisMin(void) const = 0;
00719 
00720   protected:
00721     AnalogAxisDriver() {}
00722   private:
00723     // no copy or assignment
00724     AnalogAxisDriver(AnalogAxisDriver&);
00725     AnalogAxisDriver& operator=(AnalogAxisDriver&);
00726   };
00727 
00735   class LogicalInputEngine::DigitalAxisDriver :
00736     public LogicalInputEngine::AxisDriver {
00737   public:
00738     typedef LogicalInputEngine::AxisState AxisState;
00739 
00749     virtual void increaseButtons(const std::vector<ButtonSpecState>& buttons) = 0;
00750 
00759     virtual std::vector<ButtonSpecState> increaseButtons(void) const = 0;
00760 
00770     virtual void centerButtons(const std::vector<ButtonSpecState>& buttons) = 0;
00771 
00780     virtual std::vector<ButtonSpecState> centerButtons(void) const = 0;
00781 
00782 
00792     virtual void decreaseButtons(const std::vector<ButtonSpecState>& buttons) = 0;
00793 
00802     virtual std::vector<ButtonSpecState> decreaseButtons(void) const = 0;
00803 
00815     virtual void continuous(bool continuous) = 0;
00816     
00825     virtual bool continuous(void) const = 0;
00826 
00841     virtual void rate(AxisState rate) = 0;
00850     virtual AxisState rate(void) const = 0;
00851 
00860     virtual void max(AxisState max) = 0;
00861 
00867     virtual AxisState max(void) const = 0;
00868 
00878     virtual void min(AxisState min) = 0;
00879 
00885     virtual AxisState min(void) const = 0;
00886   };
00887 
00888 
00907   class LogicalInputEngine::AnalogButtonDriver :
00908     public LogicalInputEngine::ButtonDriver {
00909   public:
00910 
00916     virtual void axis(const AxisSpec& axis) = 0;
00917 
00922     virtual AxisSpec axis(void) const = 0;
00923 
00935     virtual void threshold(RawInputEngine::AxisState threshold) = 0;
00936 
00946     virtual RawInputEngine::AxisState threshold(void) const = 0;
00947 
00956     virtual void inverted(bool invert) = 0;
00957 
00968     virtual bool inverted(void) const = 0;
00969   };
00970 
00987   class LogicalInputEngine::DigitalButtonDriver :
00988     public LogicalInputEngine::ButtonDriver {
00989   public:
00990 
01007     virtual void buttons(const std::vector<ButtonSpecState>& buttons) = 0;
01008 
01017     virtual std::vector<ButtonSpecState> buttons(void) const = 0;
01018   };
01019 
01020 
01021 }; // namespace Phx
01022 
01023 #endif /* PHX_LOGICAL_INPUT_H */
01024 

Generated on Mon Jul 10 19:45:28 2006 for Phoenix OSFS by  doxygen 1.4.2