23 #include <lua/interface_importer.h> 24 #include <lua/context.h> 26 #include <config/config.h> 27 #include <interface/interface.h> 28 #include <blackboard/blackboard.h> 29 #include <logging/logger.h> 62 __blackboard = blackboard;
68 __interfaces_pushed =
false;
89 LuaInterfaceImporter::open_interfaces(std::string &prefix,
InterfaceMap &imap,
bool write)
95 if (strcmp(vi->
type(),
"string") != 0) {
97 "but found value of type %s",
98 prefix.c_str(), vi->
type());
104 if (uid.find(
"::") == std::string::npos) {
106 throw Exception(
"Interface UID '%s' at %s is not valid, missing double colon",
107 uid.c_str(), vi->
path());
109 std::string varname = std::string(vi->
path()).substr(prefix.length());
110 std::string iftype = uid.substr(0, uid.find(
"::"));
111 std::string ifname = uid.substr(uid.find(
"::") + 2);
113 if ( __reading_ifs.find(varname) != __reading_ifs.end() ) {
115 throw Exception(
"Reading interface with varname %s already opened", varname.c_str());
117 if ( __reading_multi_ifs.find(varname) != __reading_multi_ifs.end() ) {
119 throw Exception(
"Reading multi interface with varname %s already opened", varname.c_str());
121 if ( __writing_ifs.find(varname) != __writing_ifs.end() ) {
123 throw Exception(
"Writing interface with varname %s already opened", varname.c_str());
127 if (ifname.find_first_of(
"*?[") == std::string::npos) {
128 __logger->
log_info(
"LuaInterfaceImporter",
"Adding %s interface %s::%s with name %s",
129 write ?
"writing" :
"reading",
130 iftype.c_str(), ifname.c_str(), varname.c_str());
141 imap[varname] = iface;
149 throw Exception(
"Illegal config entry %s=%s, multiple interfaces can " 150 "only be opened for reading", vi->
path(), uid.c_str());
152 __logger->
log_info(
"LuaInterfaceImporter",
"Adding multiple %s interfaces %s::%s with in table %s",
153 write ?
"writing" :
"reading",
154 iftype.c_str(), ifname.c_str(), varname.c_str());
157 __reading_multi_ifs[varname] = interfaces;
158 InterfaceObserver *observer =
159 new InterfaceObserver(
this, varname, iftype.c_str(), ifname.c_str());
160 __observers[varname] = observer;
174 open_interfaces(prefix, __reading_ifs,
false);
183 open_interfaces(prefix, __writing_ifs,
true);
200 __ext_wifs[varname] = interface;
202 __ext_rifs[varname] = interface;
208 LuaInterfaceImporter::add_observed_interface(std::string varname,
209 const char *type,
const char *
id)
212 if (__reading_multi_ifs.find(varname) == __reading_multi_ifs.end() ) {
213 throw Exception(
"Notified about unknown interface varname %s", varname.c_str());
216 __context->
add_package((std::string(
"interfaces.") + iface->type()).c_str());
217 __reading_multi_ifs[varname].push_back(iface);
220 __context->
get_field(-1, varname.c_str());
222 __context->
raw_seti(-2, __reading_multi_ifs[varname].size());
227 __logger->
log_warn(
"LuaInterfaceImporter",
"Failed to add observed interface " 228 "%s:%s, exception follows", type,
id);
229 __logger->
log_warn(
"LuaInterfaceImporter", e);
238 for (InterfaceMap::iterator i = __reading_ifs.begin(); i != __reading_ifs.end(); ++i) {
239 __blackboard->
close(i->second);
241 __reading_ifs.clear();
243 for (ObserverMap::iterator o = __observers.begin(); o != __observers.end(); ++o) {
249 for (InterfaceListMap::iterator i = __reading_multi_ifs.begin(); i != __reading_multi_ifs.end(); ++i) {
250 for (std::list<Interface *>::iterator j = i->second.begin(); j != i->second.end(); ++j) {
251 __blackboard->
close(*j);
254 __reading_multi_ifs.clear();
262 for (InterfaceMap::iterator i = __writing_ifs.begin(); i != __writing_ifs.end(); ++i) {
263 __blackboard->
close(i->second);
265 __writing_ifs.clear();
274 return __reading_ifs;
284 return __writing_ifs;
292 for (InterfaceMap::iterator i = __reading_ifs.begin(); i != __reading_ifs.end(); ++i) {
303 InterfaceMap::iterator i;
305 for (i = __reading_ifs.begin(); i != __reading_ifs.end(); ++i) {
306 i->second->resize_buffers(1);
310 for (i = __reading_ifs.begin(); i != __reading_ifs.end(); ++i) {
311 i->second->copy_shared_to_buffer(0);
323 throw Exception(
"LuaInterfaceImporter: trying to read buffer witout " 324 "previous read_to_buffer()");
326 InterfaceMap::iterator i;
327 for (i = __reading_ifs.begin(); i != __reading_ifs.end(); ++i) {
328 i->second->read_from_buffer(0);
336 for (InterfaceMap::iterator i = __writing_ifs.begin(); i != __writing_ifs.end(); ++i) {
340 e.
append(
"Failed to write interface %s, ignoring.", i->second->uid());
349 InterfaceMap::iterator imi;
350 for (imi = imap.begin(); imi != imap.end(); ++imi) {
351 context->
add_package((std::string(
"interfaces.") + imi->second->type()).c_str());
352 context->
push_usertype(imi->second, imi->second->type(),
"fawkes");
360 InterfaceListMap::iterator imi;
361 for (imi = imap.begin(); imi != imap.end(); ++imi) {
364 for (std::list<Interface *>::iterator i = imi->second.begin(); i != imi->second.end(); ++i) {
365 context->
add_package((std::string(
"interfaces.") + (*i)->type()).c_str());
378 InterfaceMap::iterator imi;
379 for (imi = imap.begin(); imi != imap.end(); ++imi) {
380 context->
add_package((std::string(
"interfaces.") + imi->second->type()).c_str());
381 context->
push_usertype(imi->second, imi->second->type(),
"fawkes");
393 context->
create_table(0, __reading_ifs.size() + __ext_rifs.size());
394 push_interfaces_varname(context, __reading_ifs);
395 push_interfaces_varname(context, __ext_rifs);
396 push_multi_interfaces_varname(context, __reading_multi_ifs);
399 context->
create_table(0, __reading_ifs.size() + __ext_rifs.size());
400 push_interfaces_uid(context, __reading_ifs);
401 push_interfaces_uid(context, __ext_rifs);
404 context->
create_table(0, __writing_ifs.size() + __ext_wifs.size());
405 push_interfaces_varname(context, __writing_ifs);
406 push_interfaces_varname(context, __ext_wifs);
410 push_interfaces_uid(context, __writing_ifs);
411 push_interfaces_uid(context, __ext_wifs);
425 __interfaces_pushed =
true;
434 if ( __interfaces_pushed ) {
438 __logger->
log_warn(
"LuaInterfaceImporter",
"Failed to re-push interfacs, exception follows");
439 __logger->
log_warn(
"LuaInterfaceImporter", e);
453 const char *type,
const char *id_pattern)
458 bbio_add_observed_create(type, id_pattern);
463 LuaInterfaceImporter::InterfaceObserver::bb_interface_created(
const char *type,
const char *
id)
throw()
465 __lii->add_observed_interface(__varname, type,
id);
virtual void register_observer(BlackBoardInterfaceObserver *observer)
Register BB interface observer.
LuaInterfaceImporter::InterfaceMap & reading_interfaces()
Get interface map of reading interfaces.
virtual void log_info(const char *component, const char *format,...)=0
Log informational message.
LuaInterfaceImporter(LuaContext *__context, BlackBoard *blackboard, Configuration *config, Logger *logger)
Constructor.
virtual const char * type() const =0
Type of value.
Fawkes library namespace.
void read_to_buffer()
Read from all reading interfaces into a buffer.
void pop(int n)
Pop value(s) from stack.
virtual ValueIterator * search(const char *path)=0
Iterator with search results.
virtual bool next()=0
Check if there is another element and advance to this if possible.
void raw_seti(int idx, int n)
Set indexed value without invoking meta methods.
A NULL pointer was supplied where not allowed.
void remove_watcher(LuaContextWatcher *watcher)
Remove a context watcher.
Base class for all Fawkes BlackBoard interfaces.
void open_writing_interfaces(std::string &prefix)
Open interfaces for writing.
void set_field(const char *key, int t_index=-2)
Set field of a table.
void add_package(const char *package)
Add a default package.
void close_reading_interfaces()
Close interfaces for reading.
~LuaInterfaceImporter()
Destructor.
Base class for exceptions in Fawkes.
void open_reading_interfaces(std::string &prefix)
Open interfaces for reading.
void get_field(int idx, const char *k)
Get named value from table.
virtual void unregister_observer(BlackBoardInterfaceObserver *observer)
Unregister BB interface observer.
void read_from_buffer()
Update interfaces from internal buffers.
virtual std::string get_string() const =0
Get string value.
virtual void log_warn(const char *component, const char *format,...)=0
Log warning message.
virtual const char * path() const =0
Path of value.
void push_usertype(void *data, const char *type_name, const char *name_space=0)
Push usertype on top of stack.
virtual std::list< Interface * > open_multiple_for_reading(const char *type_pattern, const char *id_pattern="*", const char *owner=NULL)=0
Open multiple interfaces for reading.
void add_interface(std::string varname, Interface *interface)
Add a single interface to be pushed to the context.
bool is_writer() const
Check if this is a writing instance.
void read()
Read from all reading interfaces.
void print_trace()
Prints trace to stderr.
void get_global(const char *name)
Get global variable.
void resize_buffers(unsigned int num_buffers)
Resize buffer array.
Iterator interface to iterate over config values.
virtual Interface * open_for_reading(const char *interface_type, const char *identifier, const char *owner=NULL)=0
Open interface for reading.
LuaInterfaceImporter::InterfaceMap & writing_interfaces()
Get interface map of writing interfaces.
void close_writing_interfaces()
Close interfaces for writing.
void write()
Write all writing interfaces.
The BlackBoard abstract class.
void set_global(const char *name)
Set a global value.
void create_table(int narr=0, int nrec=0)
Create a table on top of the stack.
Interface for configuration handling.
virtual Interface * open_for_writing(const char *interface_type, const char *identifier, const char *owner=NULL)=0
Open interface for writing.
void lua_restarted(LuaContext *context)
Lua restart event.
void push_interfaces()
Push interfaces to Lua environment.
void append(const char *format,...)
Append messages to the message list.
void add_watcher(LuaContextWatcher *watcher)
Add a context watcher.
virtual void close(Interface *interface)=0
Close interface.