]> sigrok.org Git - pulseview.git/commitdiff
Added InputFile
authorJoel Holdsworth <redacted>
Fri, 3 Apr 2015 14:54:22 +0000 (15:54 +0100)
committerUwe Hermann <redacted>
Thu, 11 Jun 2015 18:38:48 +0000 (20:38 +0200)
CMakeLists.txt
pv/devices/device.cpp
pv/devices/device.hpp
pv/devices/inputfile.cpp [new file with mode: 0644]
pv/devices/inputfile.hpp [new file with mode: 0644]
pv/session.cpp

index c6e3b77053a61e7346f45a2be39e84b393854d4c..049c955ec76400ee6df04009e7c11b2102a2265e 100644 (file)
@@ -158,6 +158,7 @@ set(pulseview_SOURCES
        pv/devices/device.cpp
        pv/devices/file.cpp
        pv/devices/hardwaredevice.cpp
+       pv/devices/inputfile.cpp
        pv/devices/sessionfile.cpp
        pv/dialogs/about.cpp
        pv/dialogs/connect.cpp
index 6a36ff384a990b5e9245c8b9d757e903aa56cc5f..4027a1c2d820a35ba248e312f3d066af789df620 100644 (file)
@@ -80,6 +80,11 @@ T Device::read_config(const ConfigKey *key, const T default_value)
                device_->config_get(ConfigKey::SAMPLERATE)).get();
 }
 
+void Device::start() {
+       assert(session_);
+       session_->start();
+}
+
 void Device::run() {
        assert(device_);
        assert(session_);
index 612d750940612e70e24e9eb27291590585f709d3..0a8f2438decc86fd9f592c2b92cdf89ba3f25236 100644 (file)
@@ -66,6 +66,8 @@ public:
 
        virtual void create() = 0;
 
+       virtual void start();
+
        virtual void run();
 
        virtual void stop();
diff --git a/pv/devices/inputfile.cpp b/pv/devices/inputfile.cpp
new file mode 100644 (file)
index 0000000..4118774
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * This file is part of the PulseView project.
+ *
+ * Copyright (C) 2015 Joel Holdsworth <joel@airwebreathe.org.uk>
+ *
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ */
+
+#include <cassert>
+#include <fstream>
+
+#include <QString>
+
+#include "inputfile.hpp"
+
+namespace pv {
+namespace devices {
+
+const std::streamsize InputFile::BufferSize = 16384;
+
+InputFile::InputFile(const std::shared_ptr<sigrok::Context> &context,
+       const std::string &file_name,
+       std::shared_ptr<sigrok::InputFormat> format,
+       const std::map<std::string, Glib::VariantBase> &options) :
+       context_(context),
+       input_(format->create_input(options)),
+       file_name_(file_name),
+       interrupt_(false) {
+       if (!input_)
+               throw QString("Failed to create input");
+}
+
+void InputFile::create() {
+       session_ = context_->create_session();
+}
+
+void InputFile::start() {
+}
+
+void InputFile::run() {
+       char buffer[BufferSize];
+       bool need_device = true;
+
+       assert(session_);
+       assert(input_);
+
+       interrupt_ = false;
+       std::ifstream f(file_name_);
+       while (!interrupt_ && f) {
+               f.read(buffer, BufferSize);
+               const std::streamsize size = f.gcount();
+               if (size == 0)
+                       break;
+
+               input_->send(buffer, size);
+
+               if (need_device) {
+                       try {
+                               device_ = input_->device();
+                       } catch (sigrok::Error) {
+                               break;
+                       }
+
+                       session_->add_device(device_);
+                       need_device = false;
+               }
+
+               if (size != BufferSize)
+                       break;
+       }
+
+       input_->end();
+}
+
+void InputFile::stop() {
+       interrupt_ = true;
+}
+
+} // namespace devices
+} // namespace pv
diff --git a/pv/devices/inputfile.hpp b/pv/devices/inputfile.hpp
new file mode 100644 (file)
index 0000000..55688fd
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * This file is part of the PulseView project.
+ *
+ * Copyright (C) 2015 Joel Holdsworth <joel@airwebreathe.org.uk>
+ *
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ */
+
+#ifndef PULSEVIEW_PV_DEVICE_INPUTFILE_HPP
+#define PULSEVIEW_PV_DEVICE_INPUTFILE_HPP
+
+#include <atomic>
+
+#include <libsigrokcxx/libsigrokcxx.hpp>
+
+#include "device.hpp"
+
+namespace pv {
+namespace devices {
+
+class InputFile final : public Device
+{
+private:
+       static const std::streamsize BufferSize;
+
+public:
+       InputFile(const std::shared_ptr<sigrok::Context> &context,
+               const std::string &file_name,
+               std::shared_ptr<sigrok::InputFormat> format,
+               const std::map<std::string, Glib::VariantBase> &options);
+
+       void create();
+
+       void start();
+
+       void run();
+
+       void stop();
+
+private:
+       const std::shared_ptr<sigrok::Context> context_;
+       const std::shared_ptr<sigrok::Input> input_;
+       const std::string file_name_;
+
+       std::atomic<bool> interrupt_;
+};
+
+} // namespace devices
+} // namespace pv
+
+#endif // PULSEVIEW_PV_SESSIONS_INPUTFILE_HPP
+
index f01696b01c7be00399348b66fb7240f7f7e83c2d..08bec08e4a5f664b87c0c30f2333c603861ce9fd 100644 (file)
@@ -415,7 +415,7 @@ void Session::sample_thread_proc(shared_ptr<devices::Device> device,
        cur_samplerate_ = device_->read_config<uint64_t>(ConfigKey::SAMPLERATE);
 
        try {
-               device_->session()->start();
+               device_->start();
        } catch(Error e) {
                error_handler(e.what());
                return;