OpenCPN Partial API docs
|
From 5.10 a new ObsListener class offers a simple way to listen to messages.
The simplified approach:
The ObsListener object normally lives in the class context, like:
class Dlg : public ShipDriverBase { public: ... private: ObsListener listener; ...
The method is declared something like below.
static void HandleGPGA(ObservedEvt ev) { NMEA0183Id id("GPGGA"); std::string payload = GetN0183Payload(id, ev) ...
There are other ids for NMEA2000 and SignalK messages available. Likewise, there are similar methods to access the payload. See the ocpn_plugin.h header file.
To invoke this method when a GPGGA message arrives, initiate the ObsListener like:
listener.Init(NMEA0183Id("GPGGA"), [&](ObservedEvt ev) { HandleGPGA(ev); });
The last line is a lambda expression which could be used to much more than to just invoke a method, see Epilog: Using the lambda below.
The last step above was Bind(EVT_SHIPDRIVER [](wxCommandEvent ev) { HandleGPGA(ev); })
. The part between the curly braces is actually a C++ lambda expression. There is no need to dive into this to get something running, but it offers far larger possibilities than to just call a function. Actually, if written like Bind(EVT_SHIPDRIVER, [&](wxCommandEvent ev) { ... })
any code could be written between the braces.
The interesting part here is that the [&]
prefix makes this code "see" anything defined in the plugin. This is a convenient way to access plugin variables in the handler, something which otherwise is a problem.
To get the feeling one need to experiment. But then again, C++ lambdas is a complex step which is not necessary to get something running.