diff --git a/plugins/channeltx/CMakeLists.txt b/plugins/channeltx/CMakeLists.txt index b7186967c..75e3cb345 100644 --- a/plugins/channeltx/CMakeLists.txt +++ b/plugins/channeltx/CMakeLists.txt @@ -7,13 +7,11 @@ add_subdirectory(modwfm) add_subdirectory(udpsink) find_package(CM256cc) - if(CM256CC_FOUND) - add_subdirectory(sdrdaemonchannelsource) + add_subdirectory(daemonsrc) endif(CM256CC_FOUND) find_package(OpenCV) - if (OpenCV_FOUND) add_subdirectory(modatv) endif() diff --git a/plugins/channeltx/daemonsrc/CMakeLists.txt b/plugins/channeltx/daemonsrc/CMakeLists.txt new file mode 100644 index 000000000..6cb7e1acd --- /dev/null +++ b/plugins/channeltx/daemonsrc/CMakeLists.txt @@ -0,0 +1,57 @@ +project(daemonsrc) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + +set(daemonsrc_SOURCES + daemonsrc.cpp +# daemonsrcthread.cpp + daemonsrcgui.cpp + daemonsrcplugin.cpp + daemonsrcsettings.cpp +) + +set(daemonsrc_HEADERS + daemonsrc.h +# daemonsrcthread.h + daemonsrcgui.h + daemonsrcplugin.h + daemonsrcsettings.h +) + +set(daemonsrc_FORMS + daemonsrcgui.ui +) + +include_directories( + . + ${CMAKE_CURRENT_BINARY_DIR} +# ${CMAKE_SOURCE_DIR}/sdrdaemon + ${CM256CC_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client +) + +#include(${QT_USE_FILE}) +add_definitions(${QT_DEFINITIONS}) +add_definitions(-DQT_PLUGIN) +add_definitions(-DQT_SHARED) + +qt5_wrap_ui(daemonsrc_FORMS_HEADERS ${daemonsrc_FORMS}) + +add_library(daemonsrc SHARED + ${daemonsrc_SOURCES} + ${daemonsrc_HEADERS_MOC} + ${daemonsrc_FORMS_HEADERS} +) + +target_link_libraries(daemonsrc + ${QT_LIBRARIES} + ${CM256CC_LIBRARIES} + sdrbase +# sdrdaemon + sdrgui + swagger +) + +target_link_libraries(daemonsrc Qt5::Core Qt5::Widgets Qt5::Network) + +install(TARGETS daemonsrc DESTINATION lib/plugins/channeltx) diff --git a/plugins/channeltx/daemonsrc/daemonsrc.cpp b/plugins/channeltx/daemonsrc/daemonsrc.cpp new file mode 100644 index 000000000..8f2f23b26 --- /dev/null +++ b/plugins/channeltx/daemonsrc/daemonsrc.cpp @@ -0,0 +1,85 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2018 Edouard Griffiths, F4EXB // +// // +// 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 as version 3 of the License, or // +// // +// 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 V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include "device/devicesinkapi.h" +#include "dsp/upchannelizer.h" +#include "dsp/threadedbasebandsamplesource.h" + +#include "daemonsrc.h" + +const QString DaemonSrc::m_channelIdURI = "sdrangel.channeltx.daemonsrc"; +const QString DaemonSrc::m_channelId ="DaemonSrc"; + +DaemonSrc::DaemonSrc(DeviceSinkAPI *deviceAPI) : + ChannelSourceAPI(m_channelIdURI), + m_deviceAPI(deviceAPI) +{ + setObjectName(m_channelId); + + m_channelizer = new UpChannelizer(this); + m_threadedChannelizer = new ThreadedBasebandSampleSource(m_channelizer, this); + m_deviceAPI->addThreadedSource(m_threadedChannelizer); + m_deviceAPI->addChannelAPI(this); +} + +DaemonSrc::~DaemonSrc() +{ + m_deviceAPI->removeChannelAPI(this); + m_deviceAPI->removeThreadedSource(m_threadedChannelizer); + delete m_threadedChannelizer; + delete m_channelizer; +} + +void DaemonSrc::pull(Sample& sample) +{ + sample.m_real = 0.0f; + sample.m_imag = 0.0f; +} + +void DaemonSrc::pullAudio(int nbSamples __attribute__((unused))) +{ +} + +void DaemonSrc::start() +{ +} + +void DaemonSrc::stop() +{ +} + +bool DaemonSrc::handleMessage(const Message& cmd __attribute__((unused))) +{ + return false; +} + +QByteArray DaemonSrc::serialize() const +{ + return m_settings.serialize(); +} + +bool DaemonSrc::deserialize(const QByteArray& data __attribute__((unused))) +{ + if (m_settings.deserialize(data)) + { + return true; + } + else + { + m_settings.resetToDefaults(); + return false; + } +} diff --git a/plugins/channeltx/daemonsrc/daemonsrc.h b/plugins/channeltx/daemonsrc/daemonsrc.h new file mode 100644 index 000000000..bf4e24813 --- /dev/null +++ b/plugins/channeltx/daemonsrc/daemonsrc.h @@ -0,0 +1,57 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2018 Edouard Griffiths, F4EXB // +// // +// 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 as version 3 of the License, or // +// // +// 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 V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include "dsp/basebandsamplesource.h" +#include "channel/channelsourceapi.h" + +#include "daemonsrcsettings.h" + +class DeviceSinkAPI; +class ThreadedBasebandSampleSource; +class UpChannelizer; + +class DaemonSrc : public BasebandSampleSource, public ChannelSourceAPI { + Q_OBJECT + +public: + DaemonSrc(DeviceSinkAPI *deviceAPI); + ~DaemonSrc(); + + virtual void destroy() { delete this; } + + virtual void pull(Sample& sample); + virtual void pullAudio(int nbSamples); + virtual void start(); + virtual void stop(); + virtual bool handleMessage(const Message& cmd); + + virtual void getIdentifier(QString& id) { id = objectName(); } + virtual void getTitle(QString& title) { title = m_settings.m_title; } + virtual qint64 getCenterFrequency() const { return 0; } + + virtual QByteArray serialize() const; + virtual bool deserialize(const QByteArray& data); + + static const QString m_channelIdURI; + static const QString m_channelId; + +private: + DeviceSinkAPI* m_deviceAPI; + ThreadedBasebandSampleSource* m_threadedChannelizer; + UpChannelizer* m_channelizer; + + DaemonSrcSettings m_settings; +}; diff --git a/plugins/channeltx/daemonsrc/daemonsrcgui.cpp b/plugins/channeltx/daemonsrc/daemonsrcgui.cpp new file mode 100644 index 000000000..d67542d45 --- /dev/null +++ b/plugins/channeltx/daemonsrc/daemonsrcgui.cpp @@ -0,0 +1,109 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2018 Edouard Griffiths, F4EXB // +// // +// 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 as version 3 of the License, or // +// // +// 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 V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include "device/devicesinkapi.h" +#include "device/deviceuiset.h" + +#include "ui_daemonsrcgui.h" +#include "daemonsrcgui.h" + +DaemonSrcGUI* DaemonSrcGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSource *channelTx) +{ + DaemonSrcGUI* gui = new DaemonSrcGUI(pluginAPI, deviceUISet, channelTx); + return gui; +} + +void DaemonSrcGUI::destroy() +{ + delete this; +} + +void DaemonSrcGUI::setName(const QString& name) +{ + setObjectName(name); +} + +QString DaemonSrcGUI::getName() const +{ + return objectName(); +} + +qint64 DaemonSrcGUI::getCenterFrequency() const { + return 0; +} + +void DaemonSrcGUI::setCenterFrequency(qint64 centerFrequency __attribute__((unused))) +{ +} + +void DaemonSrcGUI::resetToDefaults() +{ + m_settings.resetToDefaults(); + displaySettings(); + applySettings(true); +} + +QByteArray DaemonSrcGUI::serialize() const +{ + return m_settings.serialize(); +} + +bool DaemonSrcGUI::deserialize(const QByteArray& data) +{ + if(m_settings.deserialize(data)) { + displaySettings(); + applySettings(true); + return true; + } else { + resetToDefaults(); + return false; + } +} + +bool DaemonSrcGUI::handleMessage(const Message& message __attribute__((unused))) +{ + return false; +} + +DaemonSrcGUI::DaemonSrcGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSource *channelTx __attribute__((unused)), QWidget* parent) : + RollupWidget(parent), + ui(new Ui::DaemonSrcGUI), + m_pluginAPI(pluginAPI), + m_deviceUISet(deviceUISet) +{ + ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose, true); + connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool))); +} + +DaemonSrcGUI::~DaemonSrcGUI() +{ + m_deviceUISet->removeTxChannelInstance(this); + delete ui; +} + +void DaemonSrcGUI::blockApplySettings(bool block) +{ + m_doApplySettings = !block; +} + +void DaemonSrcGUI::applySettings(bool force __attribute((unused))) +{ +} + +void DaemonSrcGUI::displaySettings() +{ +} diff --git a/plugins/channeltx/daemonsrc/daemonsrcgui.h b/plugins/channeltx/daemonsrc/daemonsrcgui.h new file mode 100644 index 000000000..1f5afe88b --- /dev/null +++ b/plugins/channeltx/daemonsrc/daemonsrcgui.h @@ -0,0 +1,70 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2018 Edouard Griffiths, F4EXB // +// // +// 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 as version 3 of the License, or // +// // +// 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 V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef PLUGINS_CHANNELTX_DAEMONSRC_DAEMONSRCGUI_H_ +#define PLUGINS_CHANNELTX_DAEMONSRC_DAEMONSRCGUI_H_ + +#include "plugin/plugininstancegui.h" +#include "gui/rollupwidget.h" +#include "util/messagequeue.h" + +#include "daemonsrcsettings.h" + +class PluginAPI; +class DeviceUISet; +class BasebandSampleSource; + +namespace Ui { + class DaemonSrcGUI; +} + +class DaemonSrcGUI : public RollupWidget, public PluginInstanceGUI { + Q_OBJECT + +public: + static DaemonSrcGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSource *channelTx); + virtual void destroy(); + + void setName(const QString& name); + QString getName() const; + virtual qint64 getCenterFrequency() const; + virtual void setCenterFrequency(qint64 centerFrequency); + + void resetToDefaults(); + QByteArray serialize() const; + bool deserialize(const QByteArray& data); + virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual bool handleMessage(const Message& message); + +private: + Ui::DaemonSrcGUI* ui; + PluginAPI* m_pluginAPI; + DeviceUISet* m_deviceUISet; + MessageQueue m_inputMessageQueue; + DaemonSrcSettings m_settings; + bool m_doApplySettings; + + explicit DaemonSrcGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSource *channelTx, QWidget* parent = 0); + virtual ~DaemonSrcGUI(); + + void blockApplySettings(bool block); + void applySettings(bool force = false); + void displaySettings(); + +}; + + +#endif /* PLUGINS_CHANNELTX_DAEMONSRC_DAEMONSRCGUI_H_ */ diff --git a/plugins/channeltx/daemonsrc/daemonsrcgui.ui b/plugins/channeltx/daemonsrc/daemonsrcgui.ui new file mode 100644 index 000000000..822b9bfe3 --- /dev/null +++ b/plugins/channeltx/daemonsrc/daemonsrcgui.ui @@ -0,0 +1,179 @@ + + + DaemonSrcGUI + + + + 0 + 0 + 320 + 90 + + + + + 0 + 0 + + + + + 320 + 90 + + + + + Liberation Sans + 9 + + + + LoRa Demodulator + + + + + 10 + 10 + 301 + 61 + + + + Settings + + + + 3 + + + 2 + + + 2 + + + 2 + + + 2 + + + + + + + + 30 + 0 + + + + Data + + + + + + + + 120 + 0 + + + + Local data listener address + + + 000.000.000.000 + + + 0... + + + + + + + : + + + + + + + + 50 + 16777215 + + + + Local data listener port + + + 00000 + + + 0 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 30 + 16777215 + + + + Set local data listener address and port + + + Set + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + RollupWidget + QWidget +
gui/rollupwidget.h
+ 1 +
+
+ + +
diff --git a/plugins/channeltx/daemonsrc/daemonsrcplugin.cpp b/plugins/channeltx/daemonsrc/daemonsrcplugin.cpp new file mode 100644 index 000000000..83d2f9ab8 --- /dev/null +++ b/plugins/channeltx/daemonsrc/daemonsrcplugin.cpp @@ -0,0 +1,79 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2018 Edouard Griffiths, F4EXB // +// // +// 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 as version 3 of the License, or // +// // +// 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 V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include +#include "plugin/pluginapi.h" + +#ifndef SERVER_MODE +#include "daemonsrcgui.h" +#endif +#include "daemonsrc.h" +#include "daemonsrcplugin.h" + +const PluginDescriptor DaemonSrcPlugin::m_pluginDescriptor = { + QString("Daemon channel source"), + QString("4.1.0"), + QString("(c) Edouard Griffiths, F4EXB"), + QString("https://github.com/f4exb/sdrangel"), + true, + QString("https://github.com/f4exb/sdrangel") +}; + +DaemonSrcPlugin::DaemonSrcPlugin(QObject* parent) : + QObject(parent), + m_pluginAPI(0) +{ +} + +const PluginDescriptor& DaemonSrcPlugin::getPluginDescriptor() const +{ + return m_pluginDescriptor; +} + +void DaemonSrcPlugin::initPlugin(PluginAPI* pluginAPI) +{ + m_pluginAPI = pluginAPI; + + // register source + m_pluginAPI->registerTxChannel(DaemonSrc::m_channelIdURI, DaemonSrc::m_channelId, this); +} + +#ifdef SERVER_MODE +PluginInstanceGUI* DaemonSrcPlugin::createTxChannelGUI( + DeviceUISet *deviceUISet __attribute__((unused)), + BasebandSampleSource *txChannel __attribute__((unused))) +{ + return 0; +} +#else +PluginInstanceGUI* DaemonSrcPlugin::createTxChannelGUI(DeviceUISet *deviceUISet, BasebandSampleSource *txChannel) +{ + return DaemonSrcGUI::create(m_pluginAPI, deviceUISet, txChannel); +} +#endif + +BasebandSampleSource* DaemonSrcPlugin::createTxChannelBS(DeviceSinkAPI *deviceAPI) +{ + return new DaemonSrc(deviceAPI); +} + +ChannelSourceAPI* DaemonSrcPlugin::createTxChannelCS(DeviceSinkAPI *deviceAPI) +{ + return new DaemonSrc(deviceAPI); +} + + + diff --git a/plugins/channeltx/daemonsrc/daemonsrcplugin.h b/plugins/channeltx/daemonsrc/daemonsrcplugin.h new file mode 100644 index 000000000..9e353e38e --- /dev/null +++ b/plugins/channeltx/daemonsrc/daemonsrcplugin.h @@ -0,0 +1,47 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2018 Edouard Griffiths, F4EXB // +// // +// 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 as version 3 of the License, or // +// // +// 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 V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef PLUGINS_CHANNELTX_DAEMONSRC_DAEMONSRCPLUGIN_H_ +#define PLUGINS_CHANNELTX_DAEMONSRC_DAEMONSRCPLUGIN_H_ + +#include +#include "plugin/plugininterface.h" + +class DeviceUISet; +class BasebandSampleSource; + +class DaemonSrcPlugin : public QObject, PluginInterface { + Q_OBJECT + Q_INTERFACES(PluginInterface) + Q_PLUGIN_METADATA(IID "sdrangel.channeltx.daemonsrc") + +public: + explicit DaemonSrcPlugin(QObject* parent = 0); + + const PluginDescriptor& getPluginDescriptor() const; + void initPlugin(PluginAPI* pluginAPI); + + virtual PluginInstanceGUI* createTxChannelGUI(DeviceUISet *deviceUISet, BasebandSampleSource *txChannel); + virtual BasebandSampleSource* createTxChannelBS(DeviceSinkAPI *deviceAPI); + virtual ChannelSourceAPI* createTxChannelCS(DeviceSinkAPI *deviceAPI); + +private: + static const PluginDescriptor m_pluginDescriptor; + + PluginAPI* m_pluginAPI; +}; + +#endif /* PLUGINS_CHANNELTX_DAEMONSRC_DAEMONSRCPLUGIN_H_ */ diff --git a/plugins/channeltx/daemonsrc/daemonsrcsettings.cpp b/plugins/channeltx/daemonsrc/daemonsrcsettings.cpp new file mode 100644 index 000000000..f96414ff9 --- /dev/null +++ b/plugins/channeltx/daemonsrc/daemonsrcsettings.cpp @@ -0,0 +1,84 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2018 Edouard Griffiths, F4EXB // +// // +// 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 as version 3 of the License, or // +// // +// 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 V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include "daemonsrcsettings.h" + +#include + +#include "util/simpleserializer.h" +#include "settings/serializable.h" +#include "daemonsrcsettings.h" + +DaemonSrcSettings::DaemonSrcSettings() +{ + resetToDefaults(); +} + +void DaemonSrcSettings::resetToDefaults() +{ + m_dataAddress = "127.0.0.1"; + m_dataPort = 9090; + m_rgbColor = QColor(0, 255, 255).rgb(); + m_title = "SDRDaemon sink"; + +} + +QByteArray DaemonSrcSettings::serialize() const +{ + SimpleSerializer s(1); + s.writeString(1, m_dataAddress); + s.writeU32(2, m_dataPort); + s.writeU32(3, m_rgbColor); + s.writeString(4, m_title); + + return s.final(); +} + +bool DaemonSrcSettings::deserialize(const QByteArray& data) +{ + SimpleDeserializer d(data); + + if(!d.isValid()) + { + resetToDefaults(); + return false; + } + + if(d.getVersion() == 1) + { + uint32_t tmp; + QString strtmp; + + d.readString(1, &m_dataAddress, "127.0.0.1"); + d.readU32(2, &tmp, 0); + + if ((tmp > 1023) && (tmp < 65535)) { + m_dataPort = tmp; + } else { + m_dataPort = 9090; + } + + d.readU32(3, &m_rgbColor, QColor(0, 255, 255).rgb()); + d.readString(4, &m_title, "AM Modulator"); + + return true; + } + else + { + resetToDefaults(); + return false; + } +} diff --git a/plugins/channeltx/daemonsrc/daemonsrcsettings.h b/plugins/channeltx/daemonsrc/daemonsrcsettings.h new file mode 100644 index 000000000..a1fd83594 --- /dev/null +++ b/plugins/channeltx/daemonsrc/daemonsrcsettings.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2018 Edouard Griffiths, F4EXB // +// // +// 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 as version 3 of the License, or // +// // +// 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 V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef PLUGINS_CHANNELTX_DAEMONSRC_DAEMONSRCSETTINGS_H_ +#define PLUGINS_CHANNELTX_DAEMONSRC_DAEMONSRCSETTINGS_H_ + +#include +#include + +class Serializable; + +struct DaemonSrcSettings +{ + QString m_dataAddress; //!< Listening (local) data address + uint16_t m_dataPort; //!< Listening data port + quint32 m_rgbColor; + QString m_title; + + Serializable *m_channelMarker; + + DaemonSrcSettings(); + void resetToDefaults(); + void setChannelMarker(Serializable *channelMarker) { m_channelMarker = channelMarker; } + QByteArray serialize() const; + bool deserialize(const QByteArray& data); +}; + +#endif /* PLUGINS_CHANNELTX_DAEMONSRC_DAEMONSRCSETTINGS_H_ */