
Посмотрев пример Urbi-драйвера для управления сервомашинкой через Arduino можно заметить, что такое смешение кода — не лучший стиль программирования.
Для того чтобы избегать такого «смешения французского с нижегородским», UObject можно использовать в виде обёртки вокруг нашего класса управления(причём последний вообще может оставаться без изменений).
Пример:
#include <urbi/uobject.hh>
using namespace urbi;
using std::string;
// класс, который мы хотим использовать без модификации
class MyClass
{
public:
int func1(const string &s){return 0;}
};
// UObject - класс-обёртка вокруг MyClass
class WrapClass: public UObject, MyClass
{
public:
WrapClass(const std::string& s): UObject(s)
{
// конструктор urbiScript
UBindFunction(WrapClass, init);
// доступ к интересующей нас функции
UBindFunction(MyClass, func1);
}
int init()
{
return 0;
}
};
UStart(WrapClass);
Теперь в urbiScript можно вызвать эту функцию:
var c = WrapClass.new;
c.func1("foo");
именно такой приём я использовал при написании модуля UrbiDuino:
есть класс ArduinoFirmata для общения с Arduino по протоколу Firmata и класс-обёртка Arduino:
class Arduino: public urbi::UObject, ArduinoFirmata
в котором просто реализован конструктор (открытие порта) и прописаны UBindFunction() для всех необходимых функций.
