[openrtm-users 01223] Re: Howto check for data port buffer full error
Ando Noriaki
n-ando @ aist.go.jp
2010年 5月 18日 (火) 17:08:41 JST
Dear Sttefen-san
2010/5/18 Steffen Wittmeier <steffen.wittmeier @ in.tum.de>:
> Dear Ando-san,
>
> we are only using the RTSystemEditor for visualizing the current RTC setup
> and checking port properties. The entire startup of all components and the
> creation of the connections is handled directly in the code. So I have to
> find a way of setting all required properties within the code.
>
> What I tried now is to disable the overwrite mode of the buffer and to set
> the blocking timeout by:
>
> CORBA_SeqUtil::push_back(prof.properties, NVUtil::newNV(
> "dataport.buffer.write.timeout", "0.1"));
>
> CORBA_SeqUtil::push_back(prof.properties,
> NVUtil::newNV("dataport.buffer.write.full_policy", "block"));
>
>
> That works - the remaining question now is: How do I define the callback in
> case the timeout occured when blocking? The ConnectorListener class is an
> abstract class. Do I have to derive my own listener class? How do I define
> the callback then?
Please forgive me for not providing enough documentation.
An example of Connector(Data)Listener is here.
http://openrtp.jp/openrtm/svn/OpenRTM-aist/tags/RELEASE_1_0_0/OpenRTM-aist/examples/SimpleIO/ConsoleIn.cpp
Thanks
Noriaki Ando
>
>
> Thanks
> Steffen
>
> On 05/18/2010 06:59 AM, Ando Noriaki wrote:
>>
>> Dear Steffen-san
>>
>> Please use new callbacks defined in ConnectorListener.h in that case.
>> Two types of callback (listener) are provided in this scheme. One is
>> ConnectorDataListener, which receives data from somewhere, and other
>> is ConnectorListener, which does not receive any data.
>>
>> ConnecotrDataListener is as follows.
>> * - ON_BUFFER_WRITE: At the time of buffer write
>> * - ON_BUFFER_FULL: At the time of buffer full
>> * - ON_BUFFER_WRITE_TIMEOUT: At the time of buffer write timeout
>> * - ON_BUFFER_OVERWRITE: At the time of buffer overwrite
>> * - ON_BUFFER_READ: At the time of buffer read
>> * - ON_SEND: At the time of sending to InPort
>> * - ON_RECEIVED: At the time of finishing sending to
>> InPort
>> * - ON_RECEIVER_FULL: At the time of bufferfull of InPort
>> * - ON_RECEIVER_TIMEOUT: At the time of timeout of InPort
>> * - ON_RECEIVER_ERROR: At the time of error of InPort
>>
>> ConnectorListener is as follows.
>> * - ON_BUFFER_EMPTY: At the time of buffer empty
>> * - ON_BUFFER_READTIMEOUT: At the time of buffer read timeout
>> * - ON_BUFFER_EMPTY: At the time of empty of OutPort
>> * - ON_SENDER_TIMEOUT: At the time of timeout of OutPort
>> * - ON_SENDER_ERROR: At the time of error of OutPort
>> * - ON_CONNECT: At the time of connection
>> * - ON_DISCONNECT: At the time of disconnection
>>
>> However, ON_BUFFER_FULL and other _FULL callbacks are never called by
>> default. Because overwrite mode is enabled in the default ring
>> buffer. So DataPort never returns buffer-full error.
>>
>> RTSystemEditor, which will be released soon, will provide
>> functionality in order to specify detail DataPort connector's
>> properties.
>>
>> Please newest version of RTsystemEditor from
>>
>> http://www.openrtm.org/pub/OpenRTM-aist/dailybuild/tools/1.0.0/rtmtools-r114-1005061834.zip
>> and try it.
>>
>>
>> Best regards,
>> Noriaki Ando
>>
>>
>> 2010/4/27 Steffen Wittmeier<wittmeis @ in.tum.de>:
>>>
>>> Hi,
>>>
>>> I was looking for the onOverflow callback method as I know it from
>>> OpenRTM
>>> 0.42 but I could not find it in version 1.0. Did it move to some other
>>> class?
>>>
>>> Maybe I will try the 2nd option using the connectors in the meantime.
>>>
>>>
>>> Steffen
>>>
>>> On 04/27/2010 12:28 AM, Geoffrey Biggs wrote:
>>>>
>>>> One possibility is using the OnOverflow callback on your port. When a
>>>> buffer overflow occurs, this callback should be called. You can register
>>>> a functor to this callback for the port in your component.
>>>>
>>>> Aside from that, it's possible the status is not being propagated
>>>> correctly. The buffer is not held directly in the port object. It is
>>>> held in the connection between the two ports - think of it as the buffer
>>>> floating in the ether mystically. You could try exposing the connectors
>>>> and checking their status directly to see if it's being propagated
>>>> properly.
>>>>
>>>> Geoff
>>>>
>>>> On 26/04/10 22:17, Steffen Wittmeier wrote:
>>>>>
>>>>> Hi,
>>>>>
>>>>> how can I check whether a data port buffer is full and sleep for a
>>>>> retry?
>>>>>
>>>>> I tried to get the DataPortStatusList and iterated over the list to
>>>>> check the individual status. However, I always received PORT_OK, even
>>>>> when the buffer must have been full as I did not receive all data on
>>>>> the
>>>>> other end of the connection. I also received PORT_OK when there was no
>>>>> connection between the provider and the consumer data port.
>>>>>
>>>>> Any help is appreciated.
>>>>>
>>>>>
>>>>> Cheers
>>>>> Steffen Wittmeier
>>>>>
>>>>>
>>>>
>>>
>>>
>>
>>
>>
>
> --
> Steffen Wittmeier
> Lehrstuhl für Informatik VI
> Technische Universität München
> Boltzmannstraße 3, 85748 Garching
>
> Telefon : +89 289-18100
> Telefax : +89 289-18107
> E-Mail : steffen.wittmeier @ in.tum.de
> Internet: http://www6.in.tum.de/
>
>
--
安藤慶昭@独立行政法人産業技術総合研究所 知能システム研究部門
統合知能研究グループ 主任研究員, 博士(工学)
〒305-8568 つくば市梅園1-1-1 中央第2
e-mail: n-ando @ aist.go.jp, web: http://staff.aist.go.jp/n-ando
OpenRTM-aist: http://www.openrtm.org
Noriaki Ando, Ph.D.
Senior Research Scientist, RT-Synthesis R.G., ISRI, AIST
AIST Tsukuba Central 2, Tsukuba, Ibaraki 305-8568 JAPAN
e-mail: n-ando @ aist.go.jp, web: http://staff.aist.go.jp/n-ando
OpenRTM-aist: http://www.openrtm.org
openrtm-users メーリングリストの案内