From fe1b6120101f561950de0ff40123889e3dbe71cf Mon Sep 17 00:00:00 2001 From: Nikos Karamolegkos Date: Wed, 2 Aug 2017 17:31:26 +0300 Subject: [PATCH] Fix bug with gcc<5 and minor changes to filenames --- lib/frame_file_sink_impl.cc | 144 ++++++++++++++++++------------------ lib/frame_file_sink_impl.h | 5 ++ 2 files changed, 79 insertions(+), 70 deletions(-) diff --git a/lib/frame_file_sink_impl.cc b/lib/frame_file_sink_impl.cc index 10fd226..a2f3304 100644 --- a/lib/frame_file_sink_impl.cc +++ b/lib/frame_file_sink_impl.cc @@ -34,23 +34,25 @@ namespace gr frame_file_sink::make (const std::string& prefix_name, int output_type) { return gnuradio::get_initial_sptr ( - new frame_file_sink_impl (prefix_name, output_type)); + new frame_file_sink_impl (prefix_name, output_type)); } /* * The private constructor */ frame_file_sink_impl::frame_file_sink_impl (const std::string& prefix_name, - int output_type) : - gr::block ("frame_file_sink", gr::io_signature::make (0, 0, 0), - gr::io_signature::make (0, 0, 0)), - d_prefix_name (prefix_name), - d_output_type (output_type) + int output_type) : + gr::block ("frame_file_sink", gr::io_signature::make (0, 0, 0), + gr::io_signature::make (0, 0, 0)), + d_prefix_name (prefix_name), + d_output_type (output_type), + d_filename_prev(""), + d_counter(0) { message_port_register_in (pmt::mp ("frame")); set_msg_handler ( - pmt::mp ("frame"), - boost::bind (&frame_file_sink_impl::msg_handler_frame, this, _1)); + pmt::mp ("frame"), + boost::bind (&frame_file_sink_impl::msg_handler_frame, this, _1)); } @@ -66,77 +68,79 @@ namespace gr { /* check for the current UTC time */ - std::stringstream tmp_time; - std::time_t t = std::time (nullptr); - tmp_time << std::put_time (std::gmtime (&t), "%FT%H-%M-%S"); - std::string time2string = tmp_time.str (); + std::chrono::system_clock::time_point p2 = + std::chrono::system_clock::now (); + + char buffer[30]; + std::time_t t2 = std::chrono::system_clock::to_time_t (p2); + struct tm * timeinfo; + timeinfo = std::gmtime (&t2); + + std::strftime (buffer, 30, "%FT%H-%M-%S", timeinfo); + //puts (buffer); /* create name of the file according prefix and timestamp */ std::string filename; filename.append (d_prefix_name); filename.append ("_"); - filename.append (time2string); + filename.append (buffer); + + + if (!filename.compare(d_filename_prev)) + { + filename.append ("_"); + d_counter++; + filename.append(std::to_string(d_counter)); + d_filename_prev.assign(filename); + } + else + { + d_filename_prev.assign(filename); + d_counter=0; + } uint8_t *su; switch (d_output_type) - { - case 0: - { - /* add .txt to filename */ - filename.append (".txt"); - FILE *fd = fopen (filename.c_str (), "w"); - if (fd == NULL) { - throw std::invalid_argument ("Error opening file"); - - } - fwrite ((const char *) pmt::blob_data (msg), pmt::blob_length (msg), - 1, fd); - fclose (fd); - break; - } - case 1: - { - /* add .hex to filename */ - filename.append (".hex"); - FILE *fd = fopen (filename.c_str (), "w"); - if (fd == NULL) { - throw std::invalid_argument ("Error opening file"); - - } - su = (uint8_t *) pmt::blob_data (msg); - std::stringstream tmp_hex; - for (size_t i = 0; i < pmt::blob_length (msg); i++) { - tmp_hex << std::hex << std::showbase << std::setw (4) - << (uint32_t) su[i] << " "; - } - std::string str_hex = tmp_hex.str (); - fprintf (fd, "%s", str_hex.c_str ()); - fclose (fd); - break; - } - case 2: - { - /* add .bin to filename */ - filename.append (".bin"); - FILE *fd = fopen (filename.c_str (), "w"); - if (fd == NULL) { - throw std::invalid_argument ("Error opening file"); - - } - su = (uint8_t *) pmt::blob_data (msg); - std::stringstream tmp_bin; - for (size_t i = 0; i < pmt::blob_length (msg); i++) { - tmp_bin << "0b" << std::bitset<8> (su[i]) << " "; - } - std::string str_bin = tmp_bin.str (); - fprintf (fd, "%s", str_bin.c_str ()); - fclose (fd); - break; - } - default: - throw std::invalid_argument ("Invalid format"); - } + { + case 0: + { + /* add .txt to filename */ + filename.append (".txt"); + std::ofstream fd (filename.c_str ()); + fd.write ((const char *) pmt::blob_data (msg), + pmt::blob_length (msg)); + fd.close (); + break; + } + case 1: + { + /* add .hex to filename */ + filename.append (".hex"); + std::ofstream fd (filename.c_str ()); + su = (uint8_t *) pmt::blob_data (msg); + for (size_t i = 0; i < pmt::blob_length (msg); i++) { + fd << std::hex << std::showbase << std::setw (4) + << (uint32_t) su[i] << " "; + } + fd.close (); + break; + } + case 2: + { + /* add .bin to filename */ + filename.append (".bin"); + std::ofstream fd (filename.c_str ()); + su = (uint8_t *) pmt::blob_data (msg); + for (size_t i = 0; i < pmt::blob_length (msg); i++) { + fd << "0b" << std::bitset<8> (su[i]) << " "; + } + fd.close (); + break; + } + default: + throw std::invalid_argument ("Invalid format"); + } } diff --git a/lib/frame_file_sink_impl.h b/lib/frame_file_sink_impl.h index 4d93571..b0e8f40 100644 --- a/lib/frame_file_sink_impl.h +++ b/lib/frame_file_sink_impl.h @@ -22,6 +22,9 @@ #define INCLUDED_SATNOGS_FRAME_FILE_SINK_IMPL_H #include +#include +#include + namespace gr { @@ -33,6 +36,8 @@ namespace gr private: const std::string d_prefix_name; int d_output_type; + std::string d_filename_prev; + int d_counter; public: frame_file_sink_impl (const std::string& prefix_name, int output_type);