00001 #ifndef WRITABLETYPE_H
00002 #define WRITABLETYPE_H
00003
00030
00031
00032
00033
00034 #include <string>
00035 #include <RobotTypes.H>
00036
00037 namespace WURDE {
00038
00056 template <class Type>
00057 class Writable {
00058
00059 public:
00060 Writable();
00061 explicit Writable(Type _value);
00062 Writable(Type _value, ConsumeMode _cmode);
00063 Writable(Type _value, WriteMode _rwmode, std::string id);
00064 Writable(Type _value, ConsumeMode _cmode, WriteMode _rwmode, std::string id);
00065
00071 bool setValue(Type _value);
00072
00076 Type getValue() const;
00077
00078
00079 bool setRWMode(WriteMode _mode);
00083 WriteMode getRWMode() const;
00084
00085
00086 bool setCMode(ConsumeMode _mode);
00090 ConsumeMode getCMode() const;
00091
00096 bool setStatus(StatusMode stat);
00097
00098 StatusMode getStatus() const;
00099
00103 bool setLock();
00104
00108 bool setValueAndLock(Type _value){if(!setValue(_value)){return false;} return setLock();};
00109
00113 bool unlock();
00114
00118 bool locked() const;
00119
00123 std::string getLockOwner() const;
00124
00139 void COM_ADAPTOR_setValue(Type _value);
00140
00141
00156 void COM_ADAPTOR_setRWMode(WriteMode _mode);
00157
00172 void COM_ADAPTOR_setStatus(StatusMode stat);
00173
00174
00189 void COM_ADAPTOR_setLockOwner(std::string owner);
00190
00191 Writable& operator=(const Writable& r) {
00192 m_value=r.m_value;
00193 m_rwMode=r.m_rwMode;
00194 m_cMode=r.m_cMode;
00195 m_sMode=r.m_sMode;
00196 m_id=r.m_id;
00197 m_lockOwner=r.m_lockOwner;
00198 return *this;
00199 }
00200
00201 protected:
00202 Type m_value;
00203 WriteMode m_rwMode;
00204 ConsumeMode m_cMode;
00205 StatusMode m_sMode;
00206 std::string m_id;
00207 std::string m_lockOwner;
00208
00209 };
00210
00211 template <class Type>
00212 Writable<Type>::Writable(Type _value, ConsumeMode _cmode, WriteMode _rwmode, std::string id){
00213 m_value=_value;
00214 m_cMode=_cmode;
00215 m_rwMode=_rwmode;
00216 m_id=id;
00217 if(_rwmode==W_LOCKED){
00218 m_lockOwner=m_id;
00219 }else{
00220 m_lockOwner="";
00221 }
00222 }
00223
00224 template <class Type>
00225 Writable<Type>::Writable(Type _value, ConsumeMode _cmode){
00226 Writable(_value,_cmode,W_ALL,"Default");
00227 }
00228
00229
00230 template <class Type>
00231 Writable<Type>::Writable(Type _value, WriteMode _rwmode, std::string id){
00232 Writable(_value,C_CONSUMER,_rwmode,id);
00233 }
00234
00235 template <class Type>
00236 Writable<Type>::Writable(Type _value){
00237 Writable(_value,C_CONSUMER,W_ALL,"Default");
00238 }
00239
00240
00241 template <class Type>
00242 Writable<Type>::Writable(){
00243 m_cMode=C_CONSUMER;
00244 m_rwMode=W_ALL;
00245 m_id="Default";
00246 m_lockOwner="";
00247 }
00248
00249 template <class Type>
00250 bool Writable<Type>::setValue(Type _value){
00251 switch (m_rwMode){
00252 case W_SUPPLIER_ONLY:
00253 if(m_cMode==C_SUPPLIER){
00254 m_sMode=STAT_OKAY;
00255 m_value=_value;
00256 break;
00257 }else{
00258
00259 return false;
00260 }
00261 case W_CONSUMER_ONLY:
00262 if(m_cMode==C_CONSUMER){
00263 m_sMode=STAT_REQUEST;
00264 m_value=_value;
00265 break;
00266 }else{
00267
00268 return false;
00269 }
00270 case W_ALL:
00271 if(m_cMode==C_CONSUMER){
00272 m_sMode=STAT_REQUEST;
00273 }else{
00274 m_sMode=STAT_OKAY;
00275 }
00276 m_value=_value;
00277 break;
00278 case W_LOCKED:
00279 if(m_id==m_lockOwner){
00280 m_value=_value;
00281 break;
00282 if(m_cMode==C_CONSUMER){
00283 m_sMode=STAT_REQUEST;
00284 }else{
00285 m_sMode=STAT_NULL;
00286 }
00287 }
00288
00289 return false;
00290 case W_NULL:
00291 default:
00292
00293 return false;
00294 }
00295
00296 return true;
00297 }
00298
00299 template <class Type>
00300 Type Writable<Type>::getValue() const{
00301 return m_value;
00302 }
00303
00304 template <class Type>
00305 bool Writable<Type>::setRWMode(WriteMode rwmode){
00306
00307
00308 if(rwmode==W_LOCKED||m_rwMode==W_LOCKED){
00309
00310 return false;
00311 }
00312
00313 switch(rwmode){
00314 case W_SUPPLIER_ONLY:
00315 if(m_cMode==C_SUPPLIER){
00316 m_rwMode=rwmode;
00317 break;
00318 }
00319 return false;
00320 case W_CONSUMER_ONLY:
00321 if(m_cMode==C_CONSUMER){
00322 m_rwMode=rwmode;
00323 break;
00324 }
00325 return false;
00326 case W_ALL:
00327 m_rwMode=rwmode;
00328 break;
00329 case W_LOCKED:
00330 case W_NULL:
00331 default:
00332
00333 return false;
00334 }
00335
00336 return true;
00337
00338 }
00339
00340
00341 template <class Type>
00342 WriteMode Writable<Type>::getRWMode() const{
00343 return m_rwMode;
00344 }
00345
00346 template <class Type>
00347 bool Writable<Type>::setCMode(ConsumeMode _mode){
00348 m_cMode=_mode;
00349 return true;
00350 }
00351
00352 template <class Type>
00353 ConsumeMode Writable<Type>::getCMode() const{
00354 return m_cMode;
00355 }
00356
00357 template <class Type>
00358 bool Writable<Type>::setStatus(StatusMode stat){
00359 if(m_cMode==C_SUPPLIER){
00360 m_sMode=stat;
00361 return true;
00362 }
00363
00364
00365 return false;
00366 }
00367
00368 template <class Type>
00369 StatusMode Writable<Type>::getStatus() const{
00370 return m_sMode;
00371 }
00372
00373 template <class Type>
00374 bool Writable<Type>::setLock(){
00375 switch (m_rwMode){
00376 case W_SUPPLIER_ONLY:
00377 if(m_cMode==C_SUPPLIER){
00378 m_rwMode=W_LOCKED;
00379 m_lockOwner=m_id;
00380 break;
00381 }
00382
00383 return false;
00384 case W_CONSUMER_ONLY:
00385 if(m_cMode==C_CONSUMER){
00386 m_rwMode=W_LOCKED;
00387 m_lockOwner=m_id;
00388 break;
00389 }
00390
00391 return false;
00392 case W_ALL:
00393 m_rwMode=W_LOCKED;
00394 m_lockOwner=m_id;
00395 break;
00396 case W_LOCKED:
00397
00398 return false;
00399 case W_NULL:
00400 default:
00401
00402 return false;
00403 }
00404 return true;
00405 }
00406
00407 template <class Type>
00408 bool Writable<Type>::unlock(){
00409 if(m_rwMode!=W_LOCKED){
00410
00411 return false;
00412 }
00413
00414 if(m_lockOwner!=m_id){
00415
00416 return false;
00417 }
00418
00419 m_lockOwner="";
00420 m_rwMode=W_ALL;
00421 return true;
00422
00423 }
00424
00425 template <class Type>
00426 bool Writable<Type>::locked() const{
00427 if (m_rwMode==W_LOCKED)
00428 return true;
00429
00430 return false;
00431 }
00432
00433
00434 template <class Type>
00435 std::string Writable<Type>::getLockOwner() const{
00436 return m_lockOwner;
00437 }
00438
00439
00440 template <class Type>
00441 void Writable<Type>::COM_ADAPTOR_setValue(Type _value){
00442 m_value=_value;
00443 }
00444
00445 template <class Type>
00446 void Writable<Type>::COM_ADAPTOR_setRWMode(WriteMode _mode){
00447 m_rwMode=_mode;
00448 }
00449
00450 template <class Type>
00451 void Writable<Type>::COM_ADAPTOR_setStatus(StatusMode stat){
00452 m_sMode=stat;
00453 }
00454
00455 template <class Type>
00456 void Writable<Type>::COM_ADAPTOR_setLockOwner(std::string owner){
00457 m_lockOwner=owner;
00458 }
00459
00460 };
00461
00462 #endif