From 343df6eb8792b3efd33f4426766865ae03ccf316 Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Wed, 19 Jul 2023 22:12:18 +0200 Subject: Add events --- src/Events.h | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/Events.h (limited to 'src/Events.h') diff --git a/src/Events.h b/src/Events.h new file mode 100644 index 0000000..215c5a8 --- /dev/null +++ b/src/Events.h @@ -0,0 +1,76 @@ +/* + Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 + Her Majesty the Queen in Right of Canada (Communications Research + Center Canada) + + Copyright (C) 2023 + Matthias P. Braendli, matthias.braendli@mpb.li + + http://www.opendigitalradio.org + + This module adds remote-control capability to some of the dabmux/dabmod modules. + */ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#pragma once + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#if defined(HAVE_ZEROMQ) +# include "zmq.hpp" +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "Log.h" +#include "Json.h" + +class EventSender { + public: + EventSender(); + EventSender(const EventSender& other) = delete; + const EventSender& operator=(const EventSender& other) = delete; + EventSender(EventSender&& other) = delete; + EventSender& operator=(EventSender&& other) = delete; + ~EventSender(); + + void bind(const std::string& bind_endpoint); + + void send(const std::string& event_name, const json::map_t& detail); + private: + zmq::context_t m_zmq_context; + zmq::socket_t m_socket; +}; + +class LogToEventSender: public LogBackend { + public: + virtual ~LogToEventSender() {}; + virtual void log(log_level_t level, const std::string& message); + virtual std::string get_name() const; +}; + +/* events is a singleton used in all parts of the program to output log messages. + * It is constructed in Events.cpp */ +extern EventSender events; + -- cgit v1.2.3 From 2de7bab3cf1c7757078a113b35e927ecbccc5e3d Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Thu, 20 Jul 2023 09:23:17 +0200 Subject: Handle event socket bind failure --- doc/receive_events.py | 2 +- src/Events.cpp | 12 +++++++++++- src/Events.h | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) (limited to 'src/Events.h') diff --git a/doc/receive_events.py b/doc/receive_events.py index dca27cd..bfd6f86 100755 --- a/doc/receive_events.py +++ b/doc/receive_events.py @@ -13,7 +13,7 @@ from pprint import pprint context = zmq.Context() sock = context.socket(zmq.SUB) -ep = "tcp://127.0.0.1:5557" +ep = "tcp://127.0.0.1:5556" print(f"Receive from {ep}") sock.connect(ep) diff --git a/src/Events.cpp b/src/Events.cpp index d65b73a..3171cda 100644 --- a/src/Events.cpp +++ b/src/Events.cpp @@ -47,11 +47,21 @@ EventSender::~EventSender() void EventSender::bind(const std::string& bind_endpoint) { - m_socket.bind(bind_endpoint); + try { + m_socket.bind(bind_endpoint); + m_socket_valid = true; + } + catch (const zmq::error_t& err) { + fprintf(stderr, "Cannot bind event socket: %s", err.what()); + } } void EventSender::send(const std::string& event_name, const json::map_t& detail) { + if (not m_socket_valid) { + return; + } + zmq::message_t zmsg1(event_name.data(), event_name.size()); const auto detail_json = json::map_to_json(detail); zmq::message_t zmsg2(detail_json.data(), detail_json.size()); diff --git a/src/Events.h b/src/Events.h index 215c5a8..9f838e5 100644 --- a/src/Events.h +++ b/src/Events.h @@ -61,6 +61,7 @@ class EventSender { private: zmq::context_t m_zmq_context; zmq::socket_t m_socket; + bool m_socket_valid = false; }; class LogToEventSender: public LogBackend { -- cgit v1.2.3