forked from Ivasoft/DSView
Add file save support @ OSC & DAQ mode
This commit is contained in:
@@ -47,7 +47,7 @@ const float AnalogSnapshot::LogEnvelopeScaleFactor =
|
||||
const uint64_t AnalogSnapshot::EnvelopeDataUnit = 64*1024; // bytes
|
||||
|
||||
AnalogSnapshot::AnalogSnapshot(const sr_datafeed_analog &analog, uint64_t _total_sample_len, unsigned int channel_num) :
|
||||
Snapshot(sizeof(uint16_t), _total_sample_len, channel_num)
|
||||
Snapshot(sizeof(uint16_t)*channel_num, _total_sample_len, channel_num)
|
||||
{
|
||||
boost::lock_guard<boost::recursive_mutex> lock(_mutex);
|
||||
memset(_envelope_levels, 0, sizeof(_envelope_levels));
|
||||
@@ -66,7 +66,7 @@ void AnalogSnapshot::append_payload(
|
||||
const sr_datafeed_analog &analog)
|
||||
{
|
||||
boost::lock_guard<boost::recursive_mutex> lock(_mutex);
|
||||
append_data(analog.data, analog.num_samples);
|
||||
append_data(analog.data, analog.num_samples);
|
||||
|
||||
// Generate the first mip-map from the data
|
||||
append_payload_to_envelope_levels();
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
#include "inputfile.h"
|
||||
#include "sessionfile.h"
|
||||
|
||||
#include <QFileInfo>
|
||||
|
||||
#include <boost/filesystem.hpp>
|
||||
|
||||
#include <libsigrok4DSL/libsigrok.h>
|
||||
@@ -39,7 +41,8 @@ File::File(QString path) :
|
||||
|
||||
QString File::format_device_title() const
|
||||
{
|
||||
return _path;
|
||||
QFileInfo fi(_path);
|
||||
return fi.fileName();
|
||||
}
|
||||
|
||||
File* File::create(QString name)
|
||||
|
||||
@@ -102,7 +102,7 @@ std::list<boost::shared_ptr<device::DevInst> > DeviceManager::driver_scan(
|
||||
//release_driver(driver);
|
||||
|
||||
// Check If DSL hardware driver
|
||||
if (strcmp(driver->name, "demo") != 0) {
|
||||
if (strncmp(driver->name, "virtual", 7)) {
|
||||
QDir dir(QCoreApplication::applicationDirPath());
|
||||
if (!dir.cd("res"))
|
||||
return driver_devices;
|
||||
|
||||
@@ -319,8 +319,7 @@ void MainWindow::update_device_list()
|
||||
errorMessage, infoMessage));
|
||||
}
|
||||
|
||||
if (strcmp(selected_device->dev_inst()->driver->name, "demo") != 0 &&
|
||||
strcmp(selected_device->dev_inst()->driver->name, "virtual-session") != 0) {
|
||||
if (strncmp(selected_device->dev_inst()->driver->name, "virtual", 7)) {
|
||||
_logo_bar->dsl_connected(true);
|
||||
QString ses_name = config_path +
|
||||
QString::fromUtf8(selected_device->dev_inst()->driver->name) +
|
||||
@@ -521,7 +520,8 @@ void MainWindow::closeEvent(QCloseEvent *event)
|
||||
QString driver_name = _session.get_device()->dev_inst()->driver->name;
|
||||
QString mode_name = QString::number(_session.get_device()->dev_inst()->mode);
|
||||
QString file_name = dir.absolutePath() + "/" + driver_name + mode_name + ".dsc";
|
||||
if (!file_name.isEmpty())
|
||||
if (strncmp(driver_name.toLocal8Bit(), "virtual", 7) &&
|
||||
!file_name.isEmpty())
|
||||
store_session(file_name);
|
||||
}
|
||||
event->accept();
|
||||
|
||||
@@ -177,19 +177,45 @@ void SigSession::set_file(QString name) throw(QString)
|
||||
}
|
||||
}
|
||||
|
||||
void SigSession::save_file(const QString name){
|
||||
const deque< boost::shared_ptr<pv::data::LogicSnapshot> > &snapshots =
|
||||
_logic_data->get_snapshots();
|
||||
if (snapshots.empty())
|
||||
return;
|
||||
|
||||
const boost::shared_ptr<pv::data::LogicSnapshot> &snapshot =
|
||||
snapshots.front();
|
||||
void SigSession::save_file(const QString name, int type){
|
||||
unsigned char* data;
|
||||
int unit_size;
|
||||
uint64_t sample_count;
|
||||
if (type == ANALOG) {
|
||||
const deque< boost::shared_ptr<pv::data::AnalogSnapshot> > &snapshots =
|
||||
_analog_data->get_snapshots();
|
||||
if (snapshots.empty())
|
||||
return;
|
||||
const boost::shared_ptr<pv::data::AnalogSnapshot> &snapshot =
|
||||
snapshots.front();
|
||||
data = (unsigned char*)snapshot->get_data();
|
||||
unit_size = snapshot->unit_size();
|
||||
sample_count = snapshot->get_sample_count();
|
||||
} else if (type == DSO) {
|
||||
const deque< boost::shared_ptr<pv::data::DsoSnapshot> > &snapshots =
|
||||
_dso_data->get_snapshots();
|
||||
if (snapshots.empty())
|
||||
return;
|
||||
const boost::shared_ptr<pv::data::DsoSnapshot> &snapshot =
|
||||
snapshots.front();
|
||||
data = (unsigned char*)snapshot->get_data();
|
||||
// snapshot->unit_size() is not valid for dso, replaced by enabled channel number
|
||||
unit_size = get_ch_num(SR_CHANNEL_DSO);
|
||||
sample_count = snapshot->get_sample_count();
|
||||
} else {
|
||||
const deque< boost::shared_ptr<pv::data::LogicSnapshot> > &snapshots =
|
||||
_logic_data->get_snapshots();
|
||||
if (snapshots.empty())
|
||||
return;
|
||||
const boost::shared_ptr<pv::data::LogicSnapshot> &snapshot =
|
||||
snapshots.front();
|
||||
data = (unsigned char*)snapshot->get_data();
|
||||
unit_size = snapshot->unit_size();
|
||||
sample_count = snapshot->get_sample_count();
|
||||
}
|
||||
|
||||
sr_session_save(name.toLocal8Bit().data(), _dev_inst->dev_inst(),
|
||||
(unsigned char*)snapshot->get_data(),
|
||||
snapshot->unit_size(),
|
||||
snapshot->get_sample_count());
|
||||
data, unit_size, sample_count);
|
||||
}
|
||||
|
||||
QList<QString> SigSession::getSuportedExportFormats(){
|
||||
@@ -365,8 +391,8 @@ void SigSession::set_default_device(boost::function<void (const QString)> error_
|
||||
// Try and find the DreamSourceLab device and select that by default
|
||||
BOOST_FOREACH (boost::shared_ptr<pv::device::DevInst> dev, devices)
|
||||
if (dev->dev_inst() &&
|
||||
strcmp(dev->dev_inst()->driver->name,
|
||||
"demo") != 0) {
|
||||
strncmp(dev->dev_inst()->driver->name,
|
||||
"virtual", 7) != 0) {
|
||||
default_device = dev;
|
||||
break;
|
||||
}
|
||||
@@ -423,7 +449,10 @@ void SigSession::start_capture(bool instant,
|
||||
}
|
||||
|
||||
// update setting
|
||||
_instant = instant;
|
||||
if (strcmp(_dev_inst->dev_inst()->driver->name, "virtual-session"))
|
||||
_instant = instant;
|
||||
else
|
||||
_instant = true;
|
||||
if (~_instant)
|
||||
_view_timer.blockSignals(false);
|
||||
|
||||
@@ -545,7 +574,7 @@ void SigSession::sample_thread_proc(boost::shared_ptr<device::DevInst> dev_inst,
|
||||
assert(s);
|
||||
boost::shared_ptr<view::LogicSignal> logicSig;
|
||||
if (logicSig = dynamic_pointer_cast<view::LogicSignal>(s)) {
|
||||
if (logicSig->get_trig() != 0) {
|
||||
if (logicSig->has_trig()) {
|
||||
ds_trigger_set_en(true);
|
||||
logicSig->set_trig(logicSig->get_trig());
|
||||
}
|
||||
@@ -628,12 +657,14 @@ void SigSession::add_group()
|
||||
_group_traces.push_back(signal);
|
||||
_group_cnt++;
|
||||
|
||||
if (_capture_state == Stopped) {
|
||||
const deque< boost::shared_ptr<data::LogicSnapshot> > &snapshots =
|
||||
_logic_data->get_snapshots();
|
||||
if (!snapshots.empty()) {
|
||||
//if (!_cur_group_snapshot)
|
||||
//{
|
||||
// Create a new data snapshot
|
||||
_cur_group_snapshot = boost::shared_ptr<data::GroupSnapshot>(
|
||||
new data::GroupSnapshot(_logic_data->get_snapshots().front(), signal->get_index_list()));
|
||||
new data::GroupSnapshot(snapshots.front(), signal->get_index_list()));
|
||||
//_cur_group_snapshot->append_payload();
|
||||
_group_data->push_snapshot(_cur_group_snapshot);
|
||||
_cur_group_snapshot.reset();
|
||||
@@ -724,10 +755,6 @@ void SigSession::init_signals()
|
||||
if (logic_probe_count != 0) {
|
||||
_logic_data.reset(new data::Logic());
|
||||
assert(_logic_data);
|
||||
|
||||
_group_data.reset(new data::Group());
|
||||
assert(_group_data);
|
||||
_group_cnt = 0;
|
||||
}
|
||||
|
||||
if (dso_probe_count != 0) {
|
||||
@@ -739,10 +766,17 @@ void SigSession::init_signals()
|
||||
_analog_data.reset(new data::Analog());
|
||||
assert(_analog_data);
|
||||
}
|
||||
|
||||
_group_data.reset(new data::Group());
|
||||
assert(_group_data);
|
||||
_group_cnt = 0;
|
||||
}
|
||||
|
||||
// Make the logic probe list
|
||||
{
|
||||
_group_traces.clear();
|
||||
vector< boost::shared_ptr<view::GroupSignal> >().swap(_group_traces);
|
||||
|
||||
for (const GSList *l = _dev_inst->dev_inst()->channels; l; l = l->next) {
|
||||
const sr_channel *const probe =
|
||||
(const sr_channel *)l->data;
|
||||
@@ -853,8 +887,10 @@ void SigSession::refresh(int holdtime)
|
||||
_analog_data->clear();
|
||||
_cur_analog_snapshot.reset();
|
||||
}
|
||||
_data_lock = true;
|
||||
_refresh_timer.start(holdtime);
|
||||
if (strncmp(_dev_inst->dev_inst()->driver->name, "virtual", 7)) {
|
||||
_data_lock = true;
|
||||
_refresh_timer.start(holdtime);
|
||||
}
|
||||
data_updated();
|
||||
}
|
||||
|
||||
|
||||
@@ -117,7 +117,7 @@ public:
|
||||
void set_file(QString name)
|
||||
throw(QString);
|
||||
|
||||
void save_file(const QString name);
|
||||
void save_file(const QString name, int type);
|
||||
|
||||
void set_default_device(boost::function<void (const QString)> error_handler);
|
||||
void export_file(const QString name, QWidget* parent, const QString ext);
|
||||
|
||||
@@ -200,22 +200,16 @@ void FileBar::on_actionSave_triggered()
|
||||
msg.setStandardButtons(QMessageBox::Ok);
|
||||
msg.setIcon(QMessageBox::Warning);
|
||||
msg.exec();
|
||||
} else if (_session.get_device()->dev_inst()->mode != LOGIC) {
|
||||
QMessageBox msg(this);
|
||||
msg.setText(tr("File Save"));
|
||||
msg.setInformativeText(tr("DSView currently only support saving logic data to file!"));
|
||||
msg.setStandardButtons(QMessageBox::Ok);
|
||||
msg.setIcon(QMessageBox::Warning);
|
||||
msg.exec();
|
||||
}else {
|
||||
} else {
|
||||
QString file_name = QFileDialog::getSaveFileName(
|
||||
this, tr("Save File"), "",
|
||||
tr("DSView Data (*.dsl)"));
|
||||
this, tr("Save File"), "",
|
||||
tr("DSView Data (*.dsl)"));
|
||||
|
||||
if (!file_name.isEmpty()) {
|
||||
QFileInfo f(file_name);
|
||||
if(f.suffix().compare("dsl"))
|
||||
file_name.append(tr(".dsl"));
|
||||
_session.save_file(file_name);
|
||||
_session.save_file(file_name, _session.get_device()->dev_inst()->mode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -137,8 +137,7 @@ void AnalogSignal::paint_trace(QPainter &p,
|
||||
//p.setPen(QPen(_colour, 2, Qt::SolidLine));
|
||||
|
||||
QPointF *points = new QPointF[sample_count];
|
||||
QPointF *point = points;
|
||||
|
||||
QPointF *point = points;
|
||||
for (int64_t sample = start; sample != end; sample++) {
|
||||
const float x = (sample / samples_per_pixel -
|
||||
pixels_offset) + left;
|
||||
@@ -147,7 +146,6 @@ void AnalogSignal::paint_trace(QPainter &p,
|
||||
}
|
||||
|
||||
p.drawPolyline(points, point - points);
|
||||
|
||||
//delete[] samples;
|
||||
delete[] points;
|
||||
}
|
||||
|
||||
@@ -120,8 +120,6 @@ DsoSignal::DsoSignal(boost::shared_ptr<pv::device::DevInst> dev_inst,
|
||||
//_trig_vpos(probe->index * 0.5 + 0.25),
|
||||
//_zeroPos(probe->index * 0.5 + 0.25)
|
||||
_trig_vpos(0.5),
|
||||
_zeroPos(0.5),
|
||||
_zero_off(255/2.0),
|
||||
_autoV(false),
|
||||
_autoH(false),
|
||||
_hover_en(false),
|
||||
@@ -495,6 +493,19 @@ bool DsoSignal::load_settings()
|
||||
_dev_inst->set_config(_probe, NULL, SR_CONF_COUPLING,
|
||||
g_variant_new_byte(_acCoupling));
|
||||
|
||||
// -- vpos
|
||||
double vpos;
|
||||
gvar = _dev_inst->get_config(_probe, NULL, SR_CONF_VPOS);
|
||||
if (gvar != NULL) {
|
||||
vpos = g_variant_get_double(gvar);
|
||||
g_variant_unref(gvar);
|
||||
} else {
|
||||
qDebug() << "ERROR: config_get SR_CONF_COUPLING failed.";
|
||||
return false;
|
||||
}
|
||||
_zeroPos = min(max((0.5 - vpos / (_vDial->get_value() * DS_CONF_DSO_VDIVS)), 0.0), 1.0);
|
||||
_zero_off = _zeroPos * 255;
|
||||
|
||||
if (_view) {
|
||||
_view->set_need_update(true);
|
||||
_view->update();
|
||||
@@ -657,6 +668,7 @@ uint64_t DsoSignal::get_factor()
|
||||
void DsoSignal::set_ms_show(bool show)
|
||||
{
|
||||
_ms_show = show;
|
||||
_view->set_need_update(true);
|
||||
}
|
||||
|
||||
bool DsoSignal::get_ms_show() const
|
||||
@@ -1093,7 +1105,12 @@ bool DsoSignal::mouse_press(int right, const QPoint pt)
|
||||
const QRectF x10_rect = get_rect(DSO_X10, y, right);
|
||||
const QRectF x100_rect = get_rect(DSO_X100, y, right);
|
||||
|
||||
if (enabled()) {
|
||||
if (chEn_rect.contains(pt)) {
|
||||
if (strcmp(_dev_inst->dev_inst()->driver->name, "virtual-session") &&
|
||||
!_view->session().get_data_lock())
|
||||
set_enable(!enabled());
|
||||
return true;
|
||||
} else if (enabled()) {
|
||||
if (vDec_rect.contains(pt)) {
|
||||
go_vDialPre();
|
||||
} else if (vInc_rect.contains(pt)) {
|
||||
@@ -1114,10 +1131,8 @@ bool DsoSignal::mouse_press(int right, const QPoint pt)
|
||||
setted = true;
|
||||
}
|
||||
}
|
||||
} else if (chEn_rect.contains(pt)) {
|
||||
if (!_view->session().get_data_lock())
|
||||
set_enable(!enabled());
|
||||
} else if (acdc_rect.contains(pt)) {
|
||||
} else if (strcmp(_dev_inst->dev_inst()->driver->name, "virtual-session") &&
|
||||
acdc_rect.contains(pt)) {
|
||||
if (strcmp(_view->session().get_device()->dev_inst()->driver->name, "DSLogic") == 0)
|
||||
set_acCoupling((get_acCoupling()+1)%2);
|
||||
else
|
||||
@@ -1284,6 +1299,14 @@ void DsoSignal::paint_measure(QPainter &p)
|
||||
_ms_string[DSO_MS_VMEA] = "Vmean: " + (abs(value_vmean) > 1000 ? QString::number(value_vmean/1000.0, 'f', 2) + "V" : QString::number(value_vmean, 'f', 2) + "mV");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
_ms_string[DSO_MS_VMAX] = "Vmax: #####";
|
||||
_ms_string[DSO_MS_VMIN] = "Vmin: #####";
|
||||
_ms_string[DSO_MS_PERD] = "Perd: #####";
|
||||
_ms_string[DSO_MS_FREQ] = "Freq: #####";
|
||||
_ms_string[DSO_MS_VP2P] = "Vp-p: #####";
|
||||
_ms_string[DSO_MS_VRMS] = "Vrms: #####";
|
||||
_ms_string[DSO_MS_VMEA] = "Vmean: #####";
|
||||
}
|
||||
|
||||
QColor measure_colour = _colour;
|
||||
|
||||
@@ -105,6 +105,11 @@ boost::shared_ptr<pv::data::Logic> LogicSignal::logic_data() const
|
||||
return _data;
|
||||
}
|
||||
|
||||
bool LogicSignal::has_trig() const
|
||||
{
|
||||
return (_trig != NONTRIG);
|
||||
}
|
||||
|
||||
LogicSignal::LogicSetRegions LogicSignal::get_trig() const
|
||||
{
|
||||
return _trig;
|
||||
|
||||
@@ -54,7 +54,7 @@ private:
|
||||
static const int StateRound;
|
||||
|
||||
enum LogicSetRegions{
|
||||
NONTRIG = -1,
|
||||
NONTRIG = 0,
|
||||
POSTRIG,
|
||||
HIGTRIG,
|
||||
NEGTRIG,
|
||||
@@ -82,6 +82,7 @@ public:
|
||||
/**
|
||||
*
|
||||
*/
|
||||
bool has_trig() const;
|
||||
LogicSetRegions get_trig() const;
|
||||
void set_trig(int trig);
|
||||
|
||||
|
||||
@@ -226,8 +226,11 @@ void View::zoom(double steps, int offset)
|
||||
}
|
||||
}
|
||||
}
|
||||
_offset = cursor_offset - _scale * offset;
|
||||
_offset = max(min(_offset, get_max_offset()), get_min_offset());
|
||||
|
||||
if (_session.get_device()->dev_inst()->mode != DSO) {
|
||||
_offset = cursor_offset - _scale * offset;
|
||||
_offset = max(min(_offset, get_max_offset()), get_min_offset());
|
||||
}
|
||||
|
||||
if (_scale != _preScale || _offset != _preOffset) {
|
||||
_header->update();
|
||||
|
||||
Reference in New Issue
Block a user