2
0
forked from Ivasoft/DSView

Add file save support @ OSC & DAQ mode

This commit is contained in:
DreamSourceLab
2015-11-04 00:27:42 +08:00
parent df05c5c9f9
commit 800f4c615e
18 changed files with 768 additions and 353 deletions

View File

@@ -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();

View File

@@ -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)

View File

@@ -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;

View File

@@ -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();

View File

@@ -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();
}

View File

@@ -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);

View File

@@ -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);
}
}
}

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);

View File

@@ -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();