mirror of
https://github.com/30hours/blah2.git
synced 2024-11-18 12:33:58 +00:00
Progress on adding file pointers
This commit is contained in:
parent
7d42fb2e33
commit
703560e683
8 changed files with 93 additions and 133 deletions
|
@ -25,16 +25,6 @@ void Capture::process(IqData *buffer1, IqData *buffer2, c4::yml::NodeRef config)
|
||||||
|
|
||||||
std::unique_ptr<Source> device = factory_source(type, config);
|
std::unique_ptr<Source> device = factory_source(type, config);
|
||||||
|
|
||||||
if (!replay)
|
|
||||||
{
|
|
||||||
device->start();
|
|
||||||
device->process(buffer1, buffer2);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
device->replay(buffer1, buffer2, file, loop);
|
|
||||||
}
|
|
||||||
|
|
||||||
// capture status thread
|
// capture status thread
|
||||||
std::thread t1([&]{
|
std::thread t1([&]{
|
||||||
while (true)
|
while (true)
|
||||||
|
@ -55,10 +45,20 @@ void Capture::process(IqData *buffer1, IqData *buffer2, c4::yml::NodeRef config)
|
||||||
device->close_file();
|
device->close_file();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sleep(1);
|
sleep(1);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (!replay)
|
||||||
|
{
|
||||||
|
device->start();
|
||||||
|
device->process(buffer1, buffer2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
device->replay(buffer1, buffer2, file, loop);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<Source> Capture::factory_source(const std::string& type, c4::yml::NodeRef config)
|
std::unique_ptr<Source> Capture::factory_source(const std::string& type, c4::yml::NodeRef config)
|
||||||
|
@ -99,18 +99,3 @@ void Capture::set_replay(bool _loop, std::string _file)
|
||||||
loop = _loop;
|
loop = _loop;
|
||||||
file = _file;
|
file = _file;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Capture::is_type_valid(std::string _type)
|
|
||||||
{
|
|
||||||
size_t n = sizeof(Capture::VALID_TYPE) /
|
|
||||||
sizeof(Capture::VALID_TYPE[0]);
|
|
||||||
for (size_t i = 0; i < n; i++)
|
|
||||||
{
|
|
||||||
if (_type == Capture::VALID_TYPE[i])
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
std::cerr << "Invalid capture device: " << _type << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
|
@ -21,6 +21,9 @@ private:
|
||||||
/// @brief The valid capture devices.
|
/// @brief The valid capture devices.
|
||||||
static const std::string VALID_TYPE[2];
|
static const std::string VALID_TYPE[2];
|
||||||
|
|
||||||
|
/// @brief The capture device type.
|
||||||
|
std::string type;
|
||||||
|
|
||||||
/// @brief True if IQ data to be saved.
|
/// @brief True if IQ data to be saved.
|
||||||
bool saveIq;
|
bool saveIq;
|
||||||
|
|
||||||
|
@ -34,8 +37,6 @@ private:
|
||||||
std::string file;
|
std::string file;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// @brief The capture device type.
|
|
||||||
std::string type;
|
|
||||||
|
|
||||||
/// @brief Sampling frequency (Hz).
|
/// @brief Sampling frequency (Hz).
|
||||||
uint32_t fs;
|
uint32_t fs;
|
||||||
|
@ -70,10 +71,6 @@ public:
|
||||||
/// @return Void.
|
/// @return Void.
|
||||||
void set_replay(bool loop, std::string file);
|
void set_replay(bool loop, std::string file);
|
||||||
|
|
||||||
/// @brief Check if capture device type is valid.
|
|
||||||
/// @param type The capture device type.
|
|
||||||
/// @return True is capture device type is valid.
|
|
||||||
bool is_type_valid(std::string type);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -1,10 +1,14 @@
|
||||||
#include "Source.h"
|
#include "Source.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <chrono>
|
||||||
|
#include <ctime>
|
||||||
|
#include <sstream>
|
||||||
|
#include <iomanip>
|
||||||
|
|
||||||
Source::Source()
|
Source::Source()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// constructor
|
// constructor
|
||||||
|
@ -16,4 +20,45 @@ Source::Source(std::string _type, uint32_t _fc, uint32_t _fs,
|
||||||
fs = _fs;
|
fs = _fs;
|
||||||
path = _path;
|
path = _path;
|
||||||
saveIq = _saveIq;
|
saveIq = _saveIq;
|
||||||
|
saveIqFile = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string Source::open_file()
|
||||||
|
{
|
||||||
|
// get string of timestamp in YYYYmmdd-HHMMSS
|
||||||
|
auto currentTime = std::chrono::system_clock::to_time_t(
|
||||||
|
std::chrono::system_clock::now());
|
||||||
|
std::tm* timeInfo = std::localtime(¤tTime);
|
||||||
|
std::ostringstream oss;
|
||||||
|
oss << std::put_time(timeInfo, "%Y%m%d-%H%M%S");
|
||||||
|
std::string timestamp = oss.str();
|
||||||
|
|
||||||
|
// create file path
|
||||||
|
std::string typeLower = type;
|
||||||
|
std::transform(typeLower.begin(), typeLower.end(),
|
||||||
|
typeLower.begin(), ::tolower);
|
||||||
|
std::string file = path + timestamp + "." + typeLower + ".iq";
|
||||||
|
|
||||||
|
saveIqFile = fopen(file.c_str(), "wb");
|
||||||
|
|
||||||
|
if (saveIqFile == NULL)
|
||||||
|
{
|
||||||
|
std::cerr << "Error: Can not open file: " << file << std::endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
std::cout << "Ready to record IQ to file: " << file << std::endl;
|
||||||
|
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Source::close_file()
|
||||||
|
{
|
||||||
|
if (saveIqFile != NULL)
|
||||||
|
{
|
||||||
|
fclose(saveIqFile);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cerr << "Error: Can not close file pointer." << std::endl;
|
||||||
|
}
|
||||||
|
}
|
|
@ -29,6 +29,9 @@ protected:
|
||||||
/// @brief True if IQ data to be saved.
|
/// @brief True if IQ data to be saved.
|
||||||
bool *saveIq;
|
bool *saveIq;
|
||||||
|
|
||||||
|
/// @brief File pointer to IQ data to be saved.
|
||||||
|
FILE *saveIqFile;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Source();
|
Source();
|
||||||
|
@ -67,12 +70,13 @@ public:
|
||||||
|
|
||||||
/// @brief Open a new file to record IQ.
|
/// @brief Open a new file to record IQ.
|
||||||
/// @details First creates a new file from current timestamp.
|
/// @details First creates a new file from current timestamp.
|
||||||
/// @return Void.
|
/// Files are of format <path>.<type>.iq.
|
||||||
virtual void open_file() = 0;
|
/// @return String of full path to file.
|
||||||
|
std::string open_file();
|
||||||
|
|
||||||
/// @brief Close IQ file gracefully.
|
/// @brief Close IQ file gracefully.
|
||||||
/// @return Void.
|
/// @return Void.
|
||||||
virtual void close_file() = 0;
|
void close_file();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -71,14 +71,9 @@ RspDuo::RspDuo(std::string _type, uint32_t _fc, uint32_t _fs,
|
||||||
rf_notch_fg = false;
|
rf_notch_fg = false;
|
||||||
dab_notch_fg = false;
|
dab_notch_fg = false;
|
||||||
chunk_time_nr = DEF_CHUNK_TIME_NR;
|
chunk_time_nr = DEF_CHUNK_TIME_NR;
|
||||||
}
|
|
||||||
|
|
||||||
std::string RspDuo::set_file(std::string path)
|
out_file_fp = saveIqFile;
|
||||||
{
|
capture_fg = &saveIq;
|
||||||
char buffer[15];
|
|
||||||
gettimeofday(&start_tm, NULL);
|
|
||||||
strftime(buffer, 16, "%Y%m%d-%H%M%S", localtime(&start_tm.tv_sec));
|
|
||||||
return path + buffer + ".rspduo";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RspDuo::start()
|
void RspDuo::start()
|
||||||
|
@ -148,44 +143,6 @@ void RspDuo::replay(IqData *_buffer1, IqData *_buffer2, std::string _file, bool
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RspDuo::open_file()
|
|
||||||
{
|
|
||||||
file = set_file(path);
|
|
||||||
|
|
||||||
char time_tx[BUFFER_SIZE_NR];
|
|
||||||
|
|
||||||
// get start date and time
|
|
||||||
gettimeofday(&start_tm, NULL);
|
|
||||||
strftime(time_tx, sizeof(time_tx), "%d %b %Y %H:%M:%S", localtime(&start_tm.tv_sec));
|
|
||||||
fprintf(stderr, "Info - start - start_tm: %s.%03ld\n", time_tx, start_tm.tv_usec / 1000);
|
|
||||||
|
|
||||||
//validate();
|
|
||||||
|
|
||||||
// open files
|
|
||||||
if (chunk_time_nr == 0)
|
|
||||||
{
|
|
||||||
out_file_fp = fopen(file.c_str(), "wb");
|
|
||||||
|
|
||||||
if (out_file_fp == NULL)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Error - start - opening output file %s\n", file.c_str());
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr, "Info - start - output file %s\n", file.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RspDuo::close_file()
|
|
||||||
{
|
|
||||||
if (out_file_fp != NULL)
|
|
||||||
{
|
|
||||||
fclose(out_file_fp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void RspDuo::validate()
|
void RspDuo::validate()
|
||||||
{
|
{
|
||||||
// validate decimation
|
// validate decimation
|
||||||
|
@ -569,23 +526,24 @@ void RspDuo::stream_b_callback(short *xi, short *xq, sdrplay_api_StreamCbParamsT
|
||||||
write_fg = true;
|
write_fg = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (capture_fg && write_fg && run_fg && chunk_tm.tv_sec <= current_tm.tv_sec)
|
// init file open
|
||||||
{
|
// if (capture_fg && write_fg && run_fg && chunk_tm.tv_sec <= current_tm.tv_sec)
|
||||||
if (out_file_fp != NULL)
|
// {
|
||||||
{
|
// if (out_file_fp != NULL)
|
||||||
fclose(out_file_fp);
|
// {
|
||||||
}
|
// fclose(out_file_fp);
|
||||||
out_file_fp = fopen(file.c_str(), "ab");
|
// }
|
||||||
if (out_file_fp == NULL)
|
// out_file_fp = fopen(file.c_str(), "ab");
|
||||||
{
|
// if (out_file_fp == NULL)
|
||||||
std::cerr << "Error - stream_b_callback - opening output file " + file << std::endl;
|
// {
|
||||||
free(buffer_16_ar);
|
// std::cerr << "Error - stream_b_callback - opening output file " + file << std::endl;
|
||||||
run_fg = false;
|
// free(buffer_16_ar);
|
||||||
exit(1);
|
// run_fg = false;
|
||||||
}
|
// exit(1);
|
||||||
|
// }
|
||||||
|
|
||||||
chunk_tm = current_tm;
|
// chunk_tm = current_tm;
|
||||||
}
|
// }
|
||||||
|
|
||||||
// write data to file
|
// write data to file
|
||||||
if (capture_fg && write_fg)
|
if (capture_fg && write_fg)
|
||||||
|
|
|
@ -212,13 +212,6 @@ public:
|
||||||
/// @return Void.
|
/// @return Void.
|
||||||
void replay(IqData *buffer1, IqData *buffer2, std::string file, bool loop);
|
void replay(IqData *buffer1, IqData *buffer2, std::string file, bool loop);
|
||||||
|
|
||||||
/// @brief Open a new file to record IQ.
|
|
||||||
/// @return Void.
|
|
||||||
void open_file();
|
|
||||||
|
|
||||||
/// @brief Close IQ file gracefully.
|
|
||||||
/// @return Void.
|
|
||||||
void close_file();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -19,12 +19,6 @@ Usrp::Usrp(std::string _type, uint32_t _fc, uint32_t _fs,
|
||||||
gain = _gain;
|
gain = _gain;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Usrp::set_file(std::string path)
|
|
||||||
{
|
|
||||||
// todo: deprecate
|
|
||||||
return "/blah2/tmp.iq";
|
|
||||||
}
|
|
||||||
|
|
||||||
void Usrp::start()
|
void Usrp::start()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -98,7 +92,11 @@ void Usrp::process(IqData *buffer1, IqData *buffer2)
|
||||||
buffer1->unlock();
|
buffer1->unlock();
|
||||||
buffer2->unlock();
|
buffer2->unlock();
|
||||||
|
|
||||||
sleep(0.01);
|
// save IQ data to file
|
||||||
|
if (saveIq)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,13 +104,3 @@ void Usrp::replay(IqData *buffer1, IqData *buffer2, std::string _file, bool _loo
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Usrp::open_file()
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Usrp::close_file()
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
/// @brief A class to capture data on the Ettus Research USRP.
|
/// @brief A class to capture data on the Ettus Research USRP.
|
||||||
/// @details Uses the UHD C API to extract samples into the processing chain.
|
/// @details Uses the UHD C API to extract samples into the processing chain.
|
||||||
///
|
///
|
||||||
/// Should work on all USRP models EXCEPT discontinued (USRP1, USRP2).
|
/// Should work on all USRP models.
|
||||||
/// Networked models require an IP address in the config file.
|
/// Networked models require an IP address in the config file.
|
||||||
/// Requires a USB 3.0 cable for higher data rates.
|
/// Requires a USB 3.0 cable for higher data rates.
|
||||||
///
|
///
|
||||||
|
@ -41,6 +41,7 @@ private:
|
||||||
std::vector<double> gain;
|
std::vector<double> gain;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/// @brief Constructor.
|
/// @brief Constructor.
|
||||||
/// @param fc Center frequency (Hz).
|
/// @param fc Center frequency (Hz).
|
||||||
/// @param path Path to save IQ data.
|
/// @param path Path to save IQ data.
|
||||||
|
@ -49,10 +50,6 @@ public:
|
||||||
bool *saveIq, std::string address, std::string subdev,
|
bool *saveIq, std::string address, std::string subdev,
|
||||||
std::vector<std::string> antenna, std::vector<double> gain);
|
std::vector<std::string> antenna, std::vector<double> gain);
|
||||||
|
|
||||||
/// @brief Get file name from path.
|
|
||||||
/// @return String of file name based on current time.
|
|
||||||
std::string set_file(std::string path);
|
|
||||||
|
|
||||||
/// @brief Implement capture function on USRP.
|
/// @brief Implement capture function on USRP.
|
||||||
/// @param buffer1 Pointer to reference buffer.
|
/// @param buffer1 Pointer to reference buffer.
|
||||||
/// @param buffer2 Pointer to surveillance buffer.
|
/// @param buffer2 Pointer to surveillance buffer.
|
||||||
|
@ -75,13 +72,6 @@ public:
|
||||||
/// @return Void.
|
/// @return Void.
|
||||||
void replay(IqData *buffer1, IqData *buffer2, std::string file, bool loop);
|
void replay(IqData *buffer1, IqData *buffer2, std::string file, bool loop);
|
||||||
|
|
||||||
/// @brief Open a new file to record IQ.
|
|
||||||
/// @return Void.
|
|
||||||
void open_file();
|
|
||||||
|
|
||||||
/// @brief Close IQ file gracefully.
|
|
||||||
/// @return Void.
|
|
||||||
void close_file();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
Loading…
Reference in a new issue