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
00111
00112
00113
00114
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
00438
00439
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
00503
00504
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
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
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
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 };
01022
01023 #endif
01024