# HG changeset patch # User Hasan Yavuz ÖZDERYA # Date 2017-11-26 05:34:00 # Node ID d38d528e9c1c392c11c3f35170d053cbb2fdaea2 # Parent 0046d16419128b8866a46b8fc845434d10f9881e source and sink classes for stream, compiles but not tested diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -143,6 +143,8 @@ add_executable(${PROGRAM_NAME} WIN32 src/versionnumber.cpp src/updatecheckdialog.cpp src/samplepack.cpp + src/source.cpp + src/sink.cpp misc/windows_icon.rc ${UI_FILES} ${RES_FILES} diff --git a/src/sink.cpp b/src/sink.cpp new file mode 100644 --- /dev/null +++ b/src/sink.cpp @@ -0,0 +1,51 @@ +/* + Copyright © 2017 Hasan Yavuz Özderya + + This file is part of serialplot. + + serialplot 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. + + serialplot 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 serialplot. If not, see . +*/ + +#include +#include "sink.h" + +void Sink::connectFollower(Sink* sink) +{ + Q_ASSERT(!followers.contains(sink)); + + followers.append(sink); +} + +void Sink::disconnectFollower(Sink* sink) +{ + Q_ASSERT(followers.contains(sink)); + + followers.removeOne(sink); +} + +void Sink::feedIn(const SamplePack& data) +{ + for (auto sink : followers) + { + sink->feedIn(data); + } +} + +void Sink::setNumChannels(unsigned nc, bool x) +{ + for (auto sink : followers) + { + sink->setNumChannels(nc, x); + } +} diff --git a/src/sink.h b/src/sink.h new file mode 100644 --- /dev/null +++ b/src/sink.h @@ -0,0 +1,52 @@ +/* + Copyright © 2017 Hasan Yavuz Özderya + + This file is part of serialplot. + + serialplot 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. + + serialplot 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 serialplot. If not, see . +*/ + +#ifndef SINK_H +#define SINK_H + +#include +#include "samplepack.h" + +class Source; + +class Sink +{ +public: + /// Connects a sink to get any data that this sink + /// gets. Connecting an already connected sink is an error. + void connectFollower(Sink* sink); + /// Disconnects a follower. Disconnecting an unconnected sink is + /// an error. + void disconnectFollower(Sink* sink); + +protected: + /// Entry point for incoming data. Re-implementations should + /// call this function to feed followers. + void feedIn(const SamplePack& data); + /// Is set by connected source. Re-implementations should call + /// this function to update followers. + void setNumChannels(unsigned nc, bool x); + + friend Source; + +private: + QList followers; +}; + +#endif // SINK_H diff --git a/src/source.cpp b/src/source.cpp new file mode 100644 --- /dev/null +++ b/src/source.cpp @@ -0,0 +1,53 @@ +/* + Copyright © 2017 Hasan Yavuz Özderya + + This file is part of serialplot. + + serialplot 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. + + serialplot 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 serialplot. If not, see . +*/ + +#include + +#include "source.h" + +void Source::connect(Sink* sink) +{ + Q_ASSERT(!sinks.contains(sink)); + + sinks.append(sink); +} + +void Source::disconnect(Sink* sink) +{ + Q_ASSERT(sinks.contains(sink)); + + sinks.removeOne(sink); +} + +void Source::feedOut(const SamplePack& data) const +{ + for (auto sink : sinks) + { + sink->feedIn(data); + } +} + +/// Updates "number of channels" of connected sinks +void Source::feedNumChannels(unsigned nc, bool x) const +{ + for (auto sink : sinks) + { + sink->setNumChannels(nc, x); + } +} diff --git a/src/source.h b/src/source.h new file mode 100644 --- /dev/null +++ b/src/source.h @@ -0,0 +1,51 @@ +/* + Copyright © 2017 Hasan Yavuz Özderya + + This file is part of serialplot. + + serialplot 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. + + serialplot 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 serialplot. If not, see . +*/ + +#ifndef SOURCE_H +#define SOURCE_H + +#include + +#include "sink.h" +#include "samplepack.h" + +class Source +{ +public: + virtual bool hasX() const = 0; + virtual unsigned numChannels() const = 0; + + /// Connects a sink to this source. Trying to connect an already + /// connected sink is an error. + void connect(Sink* sink); + /// Disconnects an already connected sink. Trying to disconnect an + /// unconnected sink is an error. + void disconnect(Sink* sink); + +protected: + /// Feeds "in" given data to connected sinks + void feedOut(const SamplePack& data) const; + /// Updates "number of channels" of connected sinks + void feedNumChannels(unsigned nc, bool x = false) const; + +private: + QList sinks; +}; + +#endif // SOURCE_H