00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00030
00034
00036
00037
00038
00039 #ifndef __MIP_OPTION_
00040 #define __MIP_OPTION_
00041
00042 #ifdef MIP_HOST_APPLE
00043 #include <applePatch.h>
00044 #endif
00045
00046 #include <vector>
00047 #include <string>
00048 #include <sstream>
00049 #include <iostream>
00050 #include <assert.h>
00051 #include <stdlib.h>
00052 #include <map>
00053 #include <set>
00054
00055 #include <Types.h>
00056 #include <R2.h>
00057 #include <SsUtils.h>
00058
00059
00060 #include <LogTrace.h>
00061
00062 using namespace std;
00063
00064 enum OptionGroupsType {
00065 OPT_GRP_COMM,
00066 OPT_GRP_RESO,
00067 OPT_GRP_TASK,
00068 OPT_GRP_ALGO,
00069 OPT_GRP_OTHE,
00070 NUM_OPT_GRP
00071 };
00072
00073 static const char* OptionGroupsNames[NUM_OPT_GRP] = {
00074 "Common",
00075 "Resources",
00076 "Tasks",
00077 "Algorithms",
00078 "Others" };
00079
00080 enum OptionValueType {
00081 OVT_UNDEF,
00082 OVT_DECIMAL,
00083 OVT_POSITION,
00084 OVT_POSITION3D,
00085 OVT_POSE,
00086 OVT_POSE3D,
00087 OVT_ARRAY_DECIMAL,
00088 OVT_STRING,
00089 OVT_INT,
00090 OVT_BOOL,
00091 NUM_OVT
00092 };
00093
00094 static const char* OVTNames[NUM_OVT] = {
00095 "Undef",
00096 "Decimal",
00097 "Position",
00098 "Position3D",
00099 "Pose",
00100 "Pose3D",
00101 "ArrayDecimal",
00102 "string",
00103 "int",
00104 "bool" };
00105
00106 enum ScenarioType {
00107 KHEPERA_SCEN,
00108 WEBOTS_SCEN,
00109 PLAYER_SCEN,
00110 SCENARIO_NUMS
00111 };
00112
00113 static const char* scenarioNames[SCENARIO_NUMS] = {
00114 "khepera\0",
00115 "webots\0",
00116 "player\0" };
00117
00118
00119
00120 class Options;
00121
00125
00126 class GenericOption;
00127
00128 class DecimalOption;
00129 class PositionOption;
00130 class Position3DOption;
00131 class PoseOption;
00132 class Pose3DOption;
00133 class DecimalArrayOption;
00134 class StringOption;
00135 class IntOption;
00136 class BoolOption;
00137
00138
00139 class OptionListener {
00140 public:
00141
00142 virtual void optionChanged(GenericOption* option) {};
00143 virtual void optionChanged(DecimalOption* option) {};
00144 virtual void optionChanged(PositionOption* option) {};
00145 virtual void optionChanged(Position3DOption* option) {};
00146 virtual void optionChanged(PoseOption* option) {};
00147 virtual void optionChanged(DecimalArrayOption* option) {};
00148 virtual void optionChanged(Pose3DOption* option) {};
00149 virtual void optionChanged(StringOption* option) {};
00150 virtual void optionChanged(IntOption* option) {};
00151 virtual void optionChanged(BoolOption* option) {};
00152 };
00153
00154 typedef set<OptionListener*> OptionListenerSet;
00155
00156
00157 class GenericOption : public MIPObject {
00158 protected:
00159
00160 string _name;
00161 string _description;
00162
00163 OptionListenerSet _optionsListenerSet;
00164 mutable pthread_mutex_t _valueMutex;
00165
00166
00167 virtual void notifyOptionListeners() = 0;
00168
00169
00171 GenericOption(const string& name, const string& description, Options* optionsContainer);
00172
00173
00174 Options* _optionsContainer;
00175
00176 public:
00177
00180 virtual string getObjectName() const {
00181 return "GenericOption";
00182 }
00183
00184
00187 string getName() const {
00188 return _name;
00189 }
00190
00193 string getDescription() const {
00194 return _description;
00195 }
00196
00198 virtual OptionValueType getType() const = 0;
00199
00201 virtual void setValue(const string& s) = 0;
00202
00204 virtual string print() const = 0;
00205
00207 virtual string printValue() const = 0;
00208
00209
00210 void registerOptionListener(OptionListener* optionListener);
00211
00212 void unRegisterOptionListener(OptionListener* optionListener);
00213
00214
00215 const Options& getContainer() { return *_optionsContainer; }
00216 };
00217
00221 class DecimalOption: public GenericOption {
00222 private:
00223 static const OptionValueType TYPE = OVT_DECIMAL;
00224 Decimal _value;
00225
00226
00227 void notifyOptionListeners();
00228
00230 DecimalOption(const string& name, const string& description, Options* optionsContainer, const Decimal& value);
00231
00233 DecimalOption(const DecimalOption& rhs);
00234
00235 public:
00237 DecimalOption& operator=(const DecimalOption& rhs);
00238
00241 OptionValueType getType() const;
00242
00245 virtual string getObjectName() const {
00246 return "DecimalOption";
00247 }
00248
00251 void setValue(const string& s);
00252
00253 void setValue(const Decimal& v);
00254
00257 Decimal getValue() const;
00258
00261 string print() const;
00262
00265 string printValue() const;
00266
00267
00268 friend class Options;
00269 };
00270
00274 class PositionOption: public GenericOption {
00275 private:
00276 static const OptionValueType TYPE = OVT_POSITION;
00277 Position _value;
00278
00279
00280 void notifyOptionListeners();
00281
00283 PositionOption(const string& name, const string& description, Options* optionsContainer, const Position& value);
00284
00286 PositionOption(const PositionOption& rhs);
00287
00288 public:
00290 PositionOption& operator=(const PositionOption& rhs);
00291
00294 OptionValueType getType() const;
00295
00298 virtual string getObjectName() const {
00299 return "PositionOption";
00300 }
00301
00304 void setValue(const string& s);
00305
00306 void setValue(const Position& v);
00307
00310 Position getValue() const;
00311
00314 string print() const;
00315
00318 string printValue() const;
00319
00320
00321 friend class Options;
00322 };
00323
00327 class Position3DOption: public GenericOption {
00328 private:
00329 static const OptionValueType TYPE = OVT_POSITION3D;
00330 Position3D _value;
00331
00332
00333 void notifyOptionListeners();
00334
00335
00337 Position3DOption(const string& name, const string& description, Options* optionsContainer, const Position3D& value);
00338
00340 Position3DOption(const Position3DOption& rhs);
00341
00342 public:
00343
00345 Position3DOption& operator=(const Position3DOption& rhs);
00346
00349 OptionValueType getType() const;
00350
00353 virtual string getObjectName() const {
00354 return "Position3DOption";
00355 }
00356
00359 void setValue(const string& s);
00360
00361 void setValue(const Position3D& v);
00362
00365 Position3D getValue() const;
00366
00369 string print() const;
00370
00373 string printValue() const;
00374
00375
00376 friend class Options;
00377 };
00378
00382 class PoseOption: public GenericOption {
00383 private:
00384 static const OptionValueType TYPE = OVT_POSE;
00385 Pose _value;
00386
00387
00388 void notifyOptionListeners();
00389
00391 PoseOption(const string& name, const string& description, Options* optionsContainer, const Pose& value);
00392
00394 PoseOption(const PoseOption& rhs);
00395
00396 public:
00397
00399 PoseOption& operator=(const PoseOption& rhs);
00400
00403 OptionValueType getType() const;
00404
00407 virtual string getObjectName() const {
00408 return "PoseOption";
00409 }
00410
00413 void setValue(const string& s);
00414
00415 void setValue(const Pose& v);
00416
00419 Pose getValue() const;
00420
00423 string print() const;
00424
00427 string printValue() const;
00428
00429
00430 friend class Options;
00431 };
00432
00436 class Pose3DOption: public GenericOption {
00437 private:
00438 static const OptionValueType TYPE = OVT_POSE3D;
00439 Pose3D _value;
00440
00441
00442 void notifyOptionListeners();
00443
00445 Pose3DOption(const string& name, const string& description, Options* optionsContainer, const Pose3D& value);
00446
00448 Pose3DOption(const Pose3DOption& rhs);
00449
00450 public:
00451
00453 Pose3DOption& operator=(const Pose3DOption& rhs);
00454
00457 OptionValueType getType() const;
00458
00461 virtual string getObjectName() const {
00462 return "Pose3DOption";
00463 }
00464
00467 void setValue(const string& s);
00468
00469 void setValue(const Pose3D& v);
00470
00473 Pose3D getValue() const;
00474
00477 string print() const;
00478
00481 string printValue() const;
00482
00483
00484 friend class Options;
00485 };
00486
00493 class DecimalArrayOption: public GenericOption {
00494 private:
00495 static const OptionValueType TYPE = OVT_ARRAY_DECIMAL;
00497 vector<Decimal> _valueVec;
00499 string _value;
00500
00501
00502 void notifyOptionListeners();
00503
00506 DecimalArrayOption(const string& name, const string& description, Options* optionsContainer, const string& value);
00507
00509 DecimalArrayOption(const DecimalArrayOption& rhs);
00510
00511 public:
00513 DecimalArrayOption& operator=(const DecimalArrayOption& rhs);
00514
00517 OptionValueType getType() const;
00518
00521 virtual string getObjectName() const {
00522 return "DecimalArrayOption";
00523 }
00524
00527 void setValue(const string& s);
00528
00529 void setValue(const vector<Decimal>& v);
00530
00533 string getValue() const;
00534
00536 bool fromString();
00537
00540 vector<Decimal> getValueVec();
00541
00544 string print() const;
00545
00548 string printValue() const;
00549
00550
00551 friend class Options;
00552 };
00553
00557 class IntOption: public GenericOption {
00558 private:
00559 static const OptionValueType TYPE = OVT_INT;
00560 int _value;
00561
00562
00563 void notifyOptionListeners();
00564
00566 IntOption(const string& name, const string& description, Options* optionsContainer, const int& value);
00567
00569 IntOption(const IntOption& rhs);
00570
00571 public:
00573 IntOption& operator=(const IntOption& rhs);
00574
00577 OptionValueType getType() const;
00578
00581 virtual string getObjectName() const {
00582 return "IntOption";
00583 }
00584
00587 void setValue(const string& s);
00588
00589 void setValue(const int& v);
00590
00593 int getValue() const;
00594
00597 string print() const;
00598
00601 string printValue() const;
00602
00603
00604 friend class Options;
00605 };
00606
00610 class StringOption: public GenericOption {
00611 private:
00612 static const OptionValueType TYPE = OVT_STRING;
00613 string _value;
00614
00615
00616 void notifyOptionListeners();
00617
00619 StringOption(const string& name, const string& description, Options* optionsContainer, const string& value);
00620
00622 StringOption(const StringOption& rhs);
00623
00624 public:
00625
00627 StringOption& operator=(const StringOption& rhs);
00628
00631 OptionValueType getType() const;
00632
00635 virtual string getObjectName() const {
00636 return "StringOption";
00637 }
00638
00641 void setValue(const string& v);
00642
00643
00644
00647 string getValue() const;
00648
00651 string print() const;
00652
00655 string printValue() const;
00656
00657
00658 friend class Options;
00659 };
00660
00664 class BoolOption: public GenericOption {
00665 private:
00666 static const OptionValueType TYPE = OVT_BOOL;
00667 bool _value;
00668
00669
00670 void notifyOptionListeners();
00671
00673 BoolOption(const string& name, const string& description, Options* optionsContainer, const bool& value);
00674
00676 BoolOption(const BoolOption& rhs);
00677
00678 public:
00680 BoolOption& operator=(const BoolOption& rhs);
00681
00684 OptionValueType getType() const;
00685
00688 virtual string getObjectName() const {
00689 return "BoolOption";
00690 }
00691
00694 void setValue(const string& s);
00695
00696 void setValue(const bool& v);
00697
00700 bool getValue() const;
00701
00704 string print() const;
00705
00708 string printValue() const;
00709
00710
00711 friend class Options;
00712 };
00713
00714
00715
00716
00717 class GlobalOptionsListener : public OptionListener
00718 {
00719 public:
00720
00721 virtual void optionWasCreated(GenericOption* option) {};
00722 virtual void optionWasCreated(DecimalOption* option) {};
00723 virtual void optionWasCreated(PositionOption* option) {};
00724 virtual void optionWasCreated(Position3DOption* option) {};
00725 virtual void optionWasCreated(PoseOption* option) {};
00726 virtual void optionWasCreated(Pose3DOption* option) {};
00727 virtual void optionWasCreated(DecimalArrayOption* option) {};
00728 virtual void optionWasCreated(StringOption* option) {};
00729 virtual void optionWasCreated(IntOption* option) {};
00730 virtual void optionWasCreated(BoolOption* option) {};
00731
00732
00733 virtual void optionWillBeDeleted(GenericOption* option) {};
00734 virtual void optionWillBeDeleted(DecimalOption* option) {};
00735 virtual void optionWillBeDeleted(PositionOption* option) {};
00736 virtual void optionWillBeDeleted(Position3DOption* option) {};
00737 virtual void optionWillBeDeleted(PoseOption* option) {};
00738 virtual void optionWillBeDeleted(Pose3DOption* option) {};
00739 virtual void optionWillBeDeleted(DecimalArrayOption* option) {};
00740 virtual void optionWillBeDeleted(StringOption* option) {};
00741 virtual void optionWillBeDeleted(IntOption* option) {};
00742 virtual void optionWillBeDeleted(BoolOption* option) {};
00743 };
00744
00745 typedef set<Options*> GlobalOptionsSet;
00746 typedef set<GlobalOptionsListener*> GlobalOptionsListenerSet;
00747
00748
00749 typedef set<DecimalOption*> DecimalOptionSet;
00750 typedef set<PositionOption*> PositionOptionSet;
00751 typedef set<Position3DOption*> Position3DOptionSet;
00752 typedef set<PoseOption*> PoseOptionSet;
00753 typedef set<Pose3DOption*> Pose3DOptionSet;
00754 typedef set<DecimalArrayOption*> DecimalArrayOptionSet;
00755 typedef set<IntOption*> IntOptionSet;
00756 typedef set<StringOption*> StringOptionSet;
00757 typedef set<BoolOption*> BoolOptionSet;
00758
00759 typedef map<string, GenericOption*> GenericOptionNameMap;
00760 typedef set<GenericOption*> GenericOptionSet;
00761
00762
00763
00764 class Options: public MIPObject {
00765 private:
00766
00767 static GlobalOptionsSet _globalOptionsSet;
00768 static GlobalOptionsListenerSet _globalOptionsListenerSet;
00769
00770
00771 GenericOptionNameMap _genericOptionNameMap;
00772
00773
00774 DecimalOptionSet _decimalOptionSet;
00775 PositionOptionSet _positionOptionSet;
00776 Position3DOptionSet _position3DOptionSet;
00777 PoseOptionSet _poseOptionSet;
00778 Pose3DOptionSet _pose3DOptionSet;
00779 DecimalArrayOptionSet _decimalArrayOptionSet;
00780 IntOptionSet _intOptionSet;
00781 StringOptionSet _stringOptionSet;
00782 BoolOptionSet _boolOptionSet;
00783
00784
00785 GenericOptionSet _updateMandatorySet;
00786
00787
00788 void notifyWasCreatedGlobalOptionsListener(DecimalOption* option);
00789 void notifyWasCreatedGlobalOptionsListener(PositionOption* option);
00790 void notifyWasCreatedGlobalOptionsListener(Position3DOption* option);
00791 void notifyWasCreatedGlobalOptionsListener(PoseOption* option);
00792 void notifyWasCreatedGlobalOptionsListener(Pose3DOption* option);
00793 void notifyWasCreatedGlobalOptionsListener(DecimalArrayOption* option);
00794 void notifyWasCreatedGlobalOptionsListener(StringOption* option);
00795 void notifyWasCreatedGlobalOptionsListener(IntOption* option);
00796 void notifyWasCreatedGlobalOptionsListener(BoolOption* option);
00797
00798 void notifyWillBeDeletedGlobalOptionsListener(DecimalOption* option);
00799 void notifyWillBeDeletedGlobalOptionsListener(PositionOption* option);
00800 void notifyWillBeDeletedGlobalOptionsListener(Position3DOption* option);
00801 void notifyWillBeDeletedGlobalOptionsListener(PoseOption* option);
00802 void notifyWillBeDeletedGlobalOptionsListener(Pose3DOption* option);
00803 void notifyWillBeDeletedGlobalOptionsListener(DecimalArrayOption* option);
00804 void notifyWillBeDeletedGlobalOptionsListener(StringOption* option);
00805 void notifyWillBeDeletedGlobalOptionsListener(IntOption* option);
00806 void notifyWillBeDeletedGlobalOptionsListener(BoolOption* option);
00807
00808 public:
00810 Options();
00811
00813 virtual ~Options();
00816 virtual string getObjectName() const = 0;
00817
00818 virtual OptionGroupsType getGroup() {
00819 return OPT_GRP_OTHE;
00820 }
00821
00822
00823 string toString() const;
00824
00825
00826 void print() const;
00827
00828
00829 GenericOption* getOptionWithName(const string& name);
00830 bool hasOptionWithName(const string& name);
00831
00832
00833 DecimalOption* createDecimalOption(const string& name,
00834 const string& description, const Decimal& value,
00835 bool updateMandatory = false);
00836 PositionOption* createPositionOption(const string& name,
00837 const string& description, const Position& value,
00838 bool updateMandatory = false);
00839 Position3DOption* createPosition3DOption(const string& name,
00840 const string& description, const Position3D& value,
00841 bool updateMandatory = false);
00842 PoseOption* createPoseOption(const string& name, const string& description,
00843 const Pose& value, bool updateMandatory = false);
00844 Pose3DOption* createPose3DOption(const string& name, const string& description,
00845 const Pose3D& value, bool updateMandatory = false);
00846 DecimalArrayOption* createDecimalArrayOption(const string& name, const string& description,
00847 const string& value, bool updateMandatory = false);
00848 IntOption* createIntOption(const string& name, const string& description,
00849 int value, bool updateMandatory = false);
00850 StringOption* createStringOption(const string& name,
00851 const string& description, const string& value,
00852 bool updateMandatory = false);
00853 BoolOption* createBoolOption(const string& name, const string& description,
00854 bool value, bool updateMandatory = false);
00855
00856 bool removeOption(GenericOption* genericOption);
00857 bool removeDecimalOption(DecimalOption* decimalOption);
00858 bool removePositionOption(PositionOption* positionOption);
00859 bool removePosition3DOption(Position3DOption* position3DOption);
00860 bool removePoseOption(PoseOption* poseOption);
00861 bool removePose3DOption(Pose3DOption* poseOption);
00862 bool removeDecimalArrayOption(DecimalArrayOption* DecimalArrayOption);
00863 bool removeIntOption(IntOption* intOption);
00864 bool removeStringOption(StringOption* stringOption);
00865 bool removeBoolOption(BoolOption* boolOption);
00866
00867
00868 void updateValues(bool checkForUpdateMandatroy = true);
00869 void updateValue(const string& name, const string& value);
00870
00871
00872 static const GlobalOptionsSet& getGlobalOptionsSet() {
00873 return _globalOptionsSet;
00874 }
00875
00876 static GenericOption* globalGetOptionWithName(const string& name);
00877
00878
00879
00880 static void registerGlobalOptionsListener(GlobalOptionsListener* globalOptionsListener);
00881
00882 static void unRegisterGlobalOptionsListener(GlobalOptionsListener* globalOptionsListener);
00883 };
00884
00885 #endif // __MIP_OPTION_
00886