29#include <wx/jsonval.h>
30#include <wx/jsonreader.h>
31#include <wx/jsonwriter.h>
33#include "model/comm_appmsg.h"
35#include "model/plugin_loader.h"
43static struct sigaction sa_all_PIM_previous;
44static sigjmp_buf env_PIM;
46static void catch_signals_PIM(
int signo) {
49 siglongjmp(env_PIM, 1);
59void SendMessageToAllPlugins(
const wxString& message_id,
60 const wxString& message_body) {
61 auto msg = std::make_shared<PluginMsg>(
62 PluginMsg(message_id.ToStdString(), message_body.ToStdString()));
63 NavMsgBus::GetInstance().
Notify(msg);
66 wxString decouple_message_id(message_id);
67 wxString decouple_message_body(message_body);
69 auto plugin_array = PluginLoader::getInstance()->GetPlugInArray();
70 for (
unsigned int i = 0; i < plugin_array->GetCount(); i++) {
72 if (pic->m_enabled && pic->m_init_state) {
74 switch (pic->m_api_version) {
78 ppi->SetPluginMessage(decouple_message_id, decouple_message_body);
84 ppi->SetPluginMessage(decouple_message_id, decouple_message_body);
101 ppi->SetPluginMessage(decouple_message_id, decouple_message_body);
112void SendJSONMessageToAllPlugins(
const wxString& message_id,
wxJSONValue v) {
116 SendMessageToAllPlugins(message_id, out);
117 wxLogDebug(message_id);
121void SendAISSentenceToAllPlugIns(
const wxString& sentence) {
123 wxString decouple_sentence(sentence);
124 auto plugin_array = PluginLoader::getInstance()->GetPlugInArray();
125 for (
unsigned int i = 0; i < plugin_array->GetCount(); i++) {
127 if (pic->m_enabled && pic->m_init_state) {
137 pfix.Lat = ppos->kLat;
138 pfix.Lon = ppos->kLon;
139 pfix.Cog = ppos->kCog;
140 pfix.Sog = ppos->kSog;
141 pfix.Var = ppos->kVar;
142 pfix.FixTime = ppos->FixTime;
143 pfix.nSats = ppos->nSats;
145 auto plugin_array = PluginLoader::getInstance()->GetPlugInArray();
146 for (
unsigned int i = 0; i < plugin_array->GetCount(); i++) {
148 if (pic->m_enabled && pic->m_init_state) {
150 if (pic->m_pplugin) pic->m_pplugin->SetPositionFix(pfix);
156 pfix_ex.Lat = ppos->kLat;
157 pfix_ex.Lon = ppos->kLon;
158 pfix_ex.Cog = ppos->kCog;
159 pfix_ex.Sog = ppos->kSog;
160 pfix_ex.Var = ppos->kVar;
161 pfix_ex.FixTime = ppos->FixTime;
162 pfix_ex.nSats = ppos->nSats;
163 pfix_ex.Hdt = ppos->kHdt;
164 pfix_ex.Hdm = ppos->kHdm;
166 for (
unsigned int i = 0; i < plugin_array->GetCount(); i++) {
168 if (pic->m_enabled && pic->m_init_state) {
170 switch (pic->m_api_version) {
184 if (ppi) ppi->SetPositionFixEx(pfix_ex);
195void SendActiveLegInfoToAllPlugIns(
const ActiveLegDat* leg_info) {
197 leg.Btw = leg_info->Btw;
198 leg.Dtw = leg_info->Dtw;
199 leg.wp_name = leg_info->wp_name;
200 leg.Xte = leg_info->Xte;
201 leg.arrival = leg_info->arrival;
202 auto plugin_array = PluginLoader::getInstance()->GetPlugInArray();
203 for (
unsigned int i = 0; i < plugin_array->GetCount(); i++) {
205 if (pic->m_enabled && pic->m_init_state) {
207 switch (pic->m_api_version) {
222 if (ppi) ppi->SetActiveLegInfo(leg);
233bool SendMouseEventToPlugins(wxMouseEvent& event) {
235 auto plugin_array = PluginLoader::getInstance()->GetPlugInArray();
236 for (
unsigned int i = 0; i < plugin_array->GetCount(); i++) {
238 if (pic->m_enabled && pic->m_init_state) {
240 switch (pic->m_api_version) {
250 if (ppi && ppi->MouseEventHook(event)) bret =
true;
262bool SendKeyEventToPlugins(wxKeyEvent& event) {
264 auto plugin_array = PluginLoader::getInstance()->GetPlugInArray();
265 for (
unsigned int i = 0; i < plugin_array->GetCount(); i++) {
267 if (pic->m_enabled && pic->m_init_state) {
270 switch (pic->m_api_version) {
279 if (ppi && ppi->KeyboardEventHook(event)) bret =
true;
293void SendPreShutdownHookToPlugins() {
294 auto plugin_array = PluginLoader::getInstance()->GetPlugInArray();
295 for (
unsigned int i = 0; i < plugin_array->GetCount(); i++) {
297 if (pic->m_enabled && pic->m_init_state) {
299 switch (pic->m_api_version) {
302 if (ppi) ppi->PreShutdownHook();
313void SendCursorLatLonToAllPlugIns(
double lat,
double lon) {
314 auto plugin_array = PluginLoader::getInstance()->GetPlugInArray();
315 for (
unsigned int i = 0; i < plugin_array->GetCount(); i++) {
317 if (pic->m_enabled && pic->m_init_state) {
319 if (pic->m_pplugin) pic->m_pplugin->SetCursorLatLon(lat, lon);
326 wxString decouple_sentence(sentence);
329 sigaction(SIGSEGV, NULL, &sa_all_PIM_previous);
331 struct sigaction temp;
332 sigaction(SIGSEGV, NULL, &temp);
334 temp.sa_handler = catch_signals_PIM;
335 sigemptyset(&temp.sa_mask);
340 sigaction(SIGSEGV, &temp, NULL);
342 auto plugin_array = PluginLoader::getInstance()->GetPlugInArray();
343 for (
unsigned int i = 0; i < plugin_array->GetCount(); i++) {
345 if (pic->m_enabled && pic->m_init_state) {
348 if (sigsetjmp(env_PIM, 1)) {
352 sigaction(SIGSEGV, &sa_all_PIM_previous, NULL);
367 sigaction(SIGSEGV, &sa_all_PIM_previous, NULL);
371int GetJSONMessageTargetCount() {
373 auto plugin_array = PluginLoader::getInstance()->GetPlugInArray();
374 for (
unsigned int i = 0; i < plugin_array->GetCount(); i++) {
376 if (pic->m_enabled && pic->m_init_state &&
383void SendVectorChartObjectInfo(
const wxString& chart,
const wxString& feature,
384 const wxString& objname,
double& lat,
385 double& lon,
double&
scale,
int& nativescale) {
386 wxString decouple_chart(chart);
387 wxString decouple_feature(feature);
388 wxString decouple_objname(objname);
389 auto plugin_array = PluginLoader::getInstance()->GetPlugInArray();
390 for (
unsigned int i = 0; i < plugin_array->GetCount(); i++) {
392 if (pic->m_enabled && pic->m_init_state) {
394 switch (pic->m_api_version) {
405 ppi->SendVectorChartObjectInfo(decouple_chart, decouple_feature,
406 decouple_objname, lat, lon,
scale,
void Notify(std::shared_ptr< const NavMsg > message)
Accept message received by driver, make it available for upper layers.
Data for a loaded plugin, including dl-loaded library.
int m_cap_flag
PlugIn Capabilities descriptor.
A plugin to plugin json message over the REST interface.
virtual void SetNMEASentence(wxString &sentence)
Receive all NMEA 0183 sentences from OpenCPN.
virtual void SetAISSentence(wxString &sentence)
Receive all AIS sentences from OpenCPN.
The JSON value class implementation.
The JSON document writer.
void Write(const wxJSONValue &value, wxString &str)
Write the JSONvalue object to a JSON text.
Raw messages layer, supports sending and recieving navmsg messages.
PlugIn Object Definition/API.
#define WANTS_NMEA_EVENTS
Receive decoded NMEA events with parsed data.
#define WANTS_VECTOR_CHART_OBJECT_INFO
Receive information about vector chart objects.
#define WANTS_AIS_SENTENCES
Receive AIS target information and updates.
#define WANTS_KEYBOARD_EVENTS
Receive keyboard events from main window.
#define WANTS_NMEA_SENTENCES
Receive raw NMEA 0183 sentences from all active ports.
#define WANTS_MOUSE_EVENTS
Receive mouse events (clicks, movement, etc).
#define WANTS_PRESHUTDOWN_HOOK
Receive notification just before OpenCPN shutdown.
#define WANTS_PLUGIN_MESSAGING
Enable message passing between plugins.
#define WANTS_CURSOR_LATLON
Receive updates when cursor moves over chart.
void SendNMEASentenceToAllPlugIns(const wxString &sentence)
Distribute a NMEA 0183 sentence to all plugins that have registered interest by setting the WANTS_NME...
Tools to send data to plugins.