aboutsummaryrefslogtreecommitdiff
path: root/apps/sample-select.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'apps/sample-select.cpp')
-rw-r--r--apps/sample-select.cpp123
1 files changed, 123 insertions, 0 deletions
diff --git a/apps/sample-select.cpp b/apps/sample-select.cpp
new file mode 100644
index 0000000..d1954b3
--- /dev/null
+++ b/apps/sample-select.cpp
@@ -0,0 +1,123 @@
+#include "SoilMoistureIo.h"
+#include "apps.h"
+#include <boost/tokenizer.hpp>
+
+namespace trygvis {
+namespace apps {
+
+using namespace std;
+using namespace trygvis::apps;
+using namespace trygvis::soil_moisture;
+using boost::tokenizer;
+namespace po = boost::program_options;
+
+class sample_select : public app {
+
+private:
+ string fields;
+
+public:
+ void add_options(po::options_description_easy_init &options) override {
+ options
+ ("help", "produce this help message")
+ ("fields", po::value<string>(&fields)->required());
+ }
+
+ int main(app_execution &execution) override {
+ tokenizer<> tok(fields);
+
+ for (tokenizer<>::iterator beg = tok.begin(); beg != tok.end(); ++beg) {
+ cout << *beg << "\n";
+ }
+
+ /*
+ KeyDictionary dict;
+
+ relative_key = dict.indexOf(relative_name);
+
+ auto sample_buffer = make_shared<VectorSampleOutputStream>();
+ auto parser = open_sample_input_stream(sample_buffer, dict);
+ while (!input.fail()) {
+ char buffer[buffer_size];
+ input.read(buffer, buffer_size);
+ auto count = (size_t) input.gcount();
+
+ cerr << "eof? " << input.eof() << endl;
+ mutable_buffers_1 b = boost::asio::buffer(buffer, count);
+ parser->process(b);
+ }
+
+ if (sample_buffer->samples.empty()) {
+ cerr << "Could not find any samples" << endl;
+ return EXIT_FAILURE;
+ }
+
+ time_t end_time = buf.st_mtim.tv_sec;
+
+ SampleRecord sample = *--sample_buffer->samples.end();
+
+ o<string> s = sample.at(relative_key);
+ if (!s) {
+ cerr << "Missing key '" + relative_name + "'." << endl;
+ cerr << "Found " << sample_buffer->samples.size() << " samples." << endl;
+ cerr << "keys: " << sample.to_string() << endl;
+ return EXIT_FAILURE;
+ }
+
+ long relative;
+ try {
+ relative = boost::lexical_cast<long>(s.get());
+ } catch (const boost::bad_lexical_cast &e) {
+ cerr << "Bad integer value '" + s.get() + "'." << endl;
+ return EXIT_FAILURE;
+ }
+
+ if (relative_resolution == time_resolution::MILLISECONDS) {
+ relative /= 1000;
+ }
+
+ time_t start_time = end_time - relative;
+ cerr << "end_time " << end_time << endl;
+ cerr << "relative " << relative << endl;
+ cerr << "start_time " << start_time << endl;
+
+ // Restart the reading of the input file and add the adjusted timestamp
+ input.clear(ios::eofbit);
+ input.seekg(0);
+ if(input.fail()) {
+ cerr << "Coult not seek input file" << endl;
+ return EXIT_FAILURE;
+ }
+
+ vector<sample_output_stream_option*> options = {};
+ unique_ptr<SampleOutputStream> unique_output_stream = open_sample_output_stream(shared_ptr<ostream>(&cout, noop_deleter), dict, parser->type(), options);
+ shared_ptr<SampleOutputStream> output_stream{std::move(unique_output_stream)};
+ shared_ptr<SampleOutputStream> p = make_shared<TimestampFixingSampleOutputStream>(output_stream, dict, timestamp_name, relative_name, relative_resolution, start_time);
+ parser = open_sample_input_stream(p, dict, parser->type());
+
+ int recordCount = 0;
+
+ while (!input.eof()) {
+ char buffer[buffer_size];
+ input.read(buffer, buffer_size);
+ size_t gcount = (size_t)input.gcount();
+
+ recordCount++;
+
+ mutable_buffers_1 b = boost::asio::buffer(buffer, gcount);
+ parser->process(b);
+ }
+ */
+ return EXIT_SUCCESS;
+ };
+};
+
+}
+}
+
+using namespace trygvis::apps;
+
+int main(int argc, char *argv[]) {
+ sample_select app;
+ return launch_app(argc, argv, app);
+}