00001
00021 #ifndef __RtcInPort_h__
00022 #define __RtcInPort_h__
00023
00024 #include "rtm/RtcInPortBase.h"
00025 #include "rtm/idl/RTCDataTypeSkel.h"
00026 #include <iostream>
00027
00028 namespace RTM
00029 {
00056 template <class T> class InPortAny
00057 : public InPortBase
00058 {
00059 public:
00085 InPortAny(const char* name, T& value, int bufsize=64)
00086 : m_Buffer(bufsize), m_Value(value)
00087 {
00088
00089 m_Profile.name = CORBA::string_dup(name);
00090 CORBA::Any var;
00091 var <<= m_Value;
00092 m_Profile.port_type = var.type();
00093
00094
00095 for (int i = 0 ; i <= m_Buffer.buff_length(); i++)
00096 {
00097 m_Buffer.put(value);
00098 }
00099 };
00100
00124 InPortAny(const char* name, int bufsize=64)
00125 : m_Buffer(bufsize), m_Value(m_Dummy)
00126 {
00127
00128 m_Profile.name = CORBA::string_dup(name);
00129 CORBA::Any var;
00130 var <<= m_Value;
00131 m_Profile.port_type = var.type();
00132
00133
00134 for (int i = 0 ; i <= m_Buffer.buff_length(); i++)
00135 {
00136 m_Buffer.put(m_Value);
00137 }
00138 };
00139
00140
00154 virtual ~InPortAny(){};
00155
00169 virtual void put(const CORBA::Any& value)
00170 throw (RTM::InPort::Disconnected, CORBA::SystemException)
00171 {
00172 T* tmp;
00173
00174 if (value >>= tmp)
00175 m_Buffer.put(*tmp);
00176 return;
00177 }
00178
00192 virtual void initBuffer(T& value)
00193 {
00194 for (int i = 0 ; i <= m_Buffer.buff_length(); i++)
00195 {
00196 m_Buffer.put(value);
00197 }
00198 }
00199
00200
00217 virtual void read_pm()
00218 {
00219 m_Value = m_Buffer.get_new();
00220 return;
00221 };
00222
00237 virtual T read()
00238 {
00239 m_Value = m_Buffer.get_new();
00240 return m_Value;
00241 };
00242
00258 virtual bool operator>>(T& rhs)
00259 {
00260 rhs = m_Buffer.get_new();
00261 return true;
00262 };
00263
00275 virtual bool isNew()
00276 {
00277 return m_Buffer.is_new();
00278 }
00279
00280
00292 virtual int getNewDataLen()
00293 {
00294 return m_Buffer.new_data_len();
00295 }
00296
00297
00309 virtual std::vector<T> getNewList()
00310 {
00311 return m_Buffer.get_new_list();
00312 }
00313
00314
00326 virtual std::vector<T> getNewListReverse()
00327 {
00328 return m_Buffer.get_new_rlist();
00329 }
00330
00331
00332 private:
00340 T& m_Value;
00341
00349 T m_Dummy;
00350
00358 T* m_Tmp;
00359
00367 RingBuffer<T> m_Buffer;
00368
00369 };
00370
00371 };
00372
00373 #endif // __RtcInPort_h__