#include "Multiplexer.h" #include "TimeOut.h" #include "BusAccess.h" #include "dnn/Reaction.h" #include #include #include class DnnEvent; /* Global variables. This is because we use DnnCallbacks and functions instead of DnnReactions and objects. But this is only a test... */ UchBusAccess* A; DnnCallback* C; /* This is an example of how to emit messages on the bus. Here, this function is called periodically so as to demonstrate the behaviour of the bus. */ void foo (Millisecond t) { static int i; static const char* cmds [] = {"free", "click", "lock"}; A->Emit ("tick %d", t); if (i %10 == 0) A->Emit ("knob %s", cmds[(i/10)%3]); ++i; } /* This is an example of how to handle messages coming from the bus. Here, this function is associated to a callback, which in turn is associated to a regexp (see in main). */ void print_event (DnnEvent& ev) { UchBusEvent* be = dynamic_cast (&ev); if (!be) return; const char* m = be->Matches; cout << "Event '" << be->Matches << "' matches '" << be->Regexp << "'\n"; cout << "\t(" << be->NbMatches << " matches:"; CcuListIterOf li = be->MatchList; while (++li) cout << **li << ", "; cout << ")\n"; } /* This is an example of how to handle a new agent connecting to the bus. Most applications are not interested in such events... */ void agentready (DnnEvent& ev) { UchAgentEvent* ae = dynamic_cast (&ev); if (!ae) return; UchBusAgent* a = ae->GetAgent (); cout << "HELLO " << a->GetName () << "!\n"; C->SubscribeTo (a->Bye); } /* This is an example of how to handle an agent leaving the bus. Most applications are not interested in such events... */ void agentbye (DnnEvent& ev) { UchAgentEvent* ae = dynamic_cast (&ev); if (!ae) return; UchBusAgent* a = ae->GetAgent (); cout << "BYE " << a->GetName () << "!\n"; } main () { fprintf (stderr, "00\n"); const char* bus = getenv ("IVYBUS"); int bus_number = bus ? atoi (bus) : 2010; fprintf (stderr, "0\n"); UchOpen (); fprintf (stderr, "1\n"); UchBusAccess a ("Uch test", bus_number); A = &a; fprintf (stderr, "2\n"); /* periodically send messages on the bus (see foo for timeout handling) */ UchTimeOut t (1000, foo); fprintf (stderr, "3\n"); /* subscribe to a few types of events (see print_event for event handling) */ /* Note that you can use every subclass of DnnBaseReaction instead of DnnCallback */ DnnCallback c1 (print_event); a.Subscribe (c1, "^(glidepoint) (.*)"); a.Subscribe (c1, "TRAFFIC START"); a.Subscribe (c1, "(.*TRAFFIC FILE NAME.*)"); a.Subscribe (c1, "^AVION:(.*) RADAR (.*)"); /* react to new agents calling (see agentready for event handling) */ DnnCallback c3 (agentready); c3.SubscribeTo (a.NewAgents); fprintf (stderr, "4\n"); /* reaction to agents leaving (see agentready for subscription, and agentbye for event handling) */ DnnCallback c4 (agentbye); C = &c4; UchLoop (); }