From 8ffa3c9119f0249349be48bf4853dd9503dbdfe6 Mon Sep 17 00:00:00 2001 From: DreamSourceLab Date: Wed, 24 Jun 2015 22:07:09 +0800 Subject: [PATCH] add support for path with chinese characters --- DSView/CMakeLists.txt | 12 +- DSView/pv/device/device.cpp | 4 +- DSView/pv/device/device.h | 2 +- DSView/pv/device/devinst.h | 2 +- DSView/pv/device/file.cpp | 10 +- DSView/pv/device/file.h | 8 +- DSView/pv/device/inputfile.cpp | 17 ++- DSView/pv/device/inputfile.h | 6 +- DSView/pv/device/sessionfile.cpp | 4 +- DSView/pv/device/sessionfile.h | 2 +- DSView/pv/devicemanager.cpp | 5 +- DSView/pv/mainwindow.cpp | 25 ++-- .../pv/prop/binding/binding_deviceoptions.cpp | 6 +- DSView/pv/prop/string.cpp | 4 +- DSView/pv/sigsession.cpp | 25 ++-- DSView/pv/sigsession.h | 6 +- DSView/pv/toolbars/filebar.cpp | 4 +- DSView/pv/toolbars/samplingbar.cpp | 4 +- DSView/res/DSCope1.dsc | 8 +- DSView/res/DSLogic0.dsc | 116 +++++++++++++++++- libsigrok4DSL/hardware/DSL/dscope.c | 36 +++--- libsigrok4DSL/hardware/DSL/dslogic.c | 44 ++++--- libsigrok4DSL/hwdriver.c | 50 ++++---- libsigrok4DSL/input/in_vcd.c | 4 +- libsigrok4DSL/libsigrok.h | 1 + libsigrok4DSL/output/srzip.c | 4 +- libsigrok4DSL/session_driver.c | 4 +- libsigrok4DSL/session_file.c | 4 +- libsigrok4DSL/strutil.c | 2 +- 29 files changed, 280 insertions(+), 139 deletions(-) diff --git a/DSView/CMakeLists.txt b/DSView/CMakeLists.txt index 95096455..35f17336 100644 --- a/DSView/CMakeLists.txt +++ b/DSView/CMakeLists.txt @@ -357,10 +357,14 @@ install(FILES res/DSLogicPro.fw DESTINATION bin/res/) install(FILES res/DSLogicPro.bin DESTINATION bin/res/) install(FILES res/DSCope.fw DESTINATION bin/res/) install(FILES res/DSCope.bin DESTINATION bin/res/) -install(FILES res/DSLogic_ini.dsc DESTINATION bin/res/) -install(FILES res/DSLogic_ini.dsc.bak DESTINATION bin/res/) -install(FILES res/DSCope_ini.dsc DESTINATION bin/res/) -install(FILES res/DSCope_ini.dsc.bak DESTINATION bin/res/) +install(FILES res/DSLogic0.dsc DESTINATION bin/res/) +install(FILES res/DSLogic0.def.dsc DESTINATION bin/res/) +install(FILES res/DSLogic1.dsc DESTINATION bin/res/) +install(FILES res/DSLogic1.def.dsc DESTINATION bin/res/) +install(FILES res/DSLogic2.dsc DESTINATION bin/res/) +install(FILES res/DSLogic2.def.dsc DESTINATION bin/res/) +install(FILES res/DSCope1.dsc DESTINATION bin/res/) +install(FILES res/DSCope1.def.dsc DESTINATION bin/res/) #=============================================================================== #= Packaging (handled by CPack) diff --git a/DSView/pv/device/device.cpp b/DSView/pv/device/device.cpp index 6c0e17c3..76fd520b 100644 --- a/DSView/pv/device/device.cpp +++ b/DSView/pv/device/device.cpp @@ -64,7 +64,7 @@ void Device::release() sr_dev_close(_sdi); } -std::string Device::format_device_title() const +QString Device::format_device_title() const { ostringstream s; @@ -86,7 +86,7 @@ std::string Device::format_device_title() const if (_sdi->version && _sdi->version[0]) s << _sdi->version; - return s.str(); + return QString::fromStdString(s.str()); } bool Device::is_trigger_enabled() const diff --git a/DSView/pv/device/device.h b/DSView/pv/device/device.h index ad6499ab..435bb4bd 100644 --- a/DSView/pv/device/device.h +++ b/DSView/pv/device/device.h @@ -38,7 +38,7 @@ public: void release(); - std::string format_device_title() const; + QString format_device_title() const; bool is_trigger_enabled() const; diff --git a/DSView/pv/device/devinst.h b/DSView/pv/device/devinst.h index 50821939..da441a7f 100644 --- a/DSView/pv/device/devinst.h +++ b/DSView/pv/device/devinst.h @@ -59,7 +59,7 @@ public: SigSession* owner() const; - virtual std::string format_device_title() const = 0; + virtual QString format_device_title() const = 0; GVariant* get_config(const sr_channel *ch, const sr_channel_group *group, int key); diff --git a/DSView/pv/device/file.cpp b/DSView/pv/device/file.cpp index 2f67c46c..18c9f6fb 100644 --- a/DSView/pv/device/file.cpp +++ b/DSView/pv/device/file.cpp @@ -32,19 +32,19 @@ using std::string; namespace pv { namespace device { -File::File(const std::string path) : +File::File(QString path) : _path(path) { } -std::string File::format_device_title() const +QString File::format_device_title() const { - return boost::filesystem::path(_path).filename().string(); + return _path; } -File* File::create(const string &name) +File* File::create(QString name) { - if (sr_session_load(name.c_str()) == SR_OK) { + if (sr_session_load(name.toLocal8Bit().data()) == SR_OK) { GSList *devlist = NULL; sr_session_dev_list(&devlist); sr_session_destroy(); diff --git a/DSView/pv/device/file.h b/DSView/pv/device/file.h index 027314d2..89a7ddf3 100644 --- a/DSView/pv/device/file.h +++ b/DSView/pv/device/file.h @@ -32,16 +32,16 @@ namespace device { class File : public DevInst { protected: - File(const std::string path); + File(QString path); public: - static File* create(const std::string &name); + static File* create(QString name); public: - std::string format_device_title() const; + QString format_device_title() const; protected: - const std::string _path; + const QString _path; }; } // device diff --git a/DSView/pv/device/inputfile.cpp b/DSView/pv/device/inputfile.cpp index 549c3d3a..967d6f7b 100644 --- a/DSView/pv/device/inputfile.cpp +++ b/DSView/pv/device/inputfile.cpp @@ -34,7 +34,7 @@ using std::string; namespace pv { namespace device { -InputFile::InputFile(const std::string &path) : +InputFile::InputFile(QString path) : File(path), _input(NULL) { @@ -71,8 +71,7 @@ void InputFile::release() _input = NULL; } -sr_input_format* InputFile::determine_input_file_format( - const string &filename) +sr_input_format* InputFile::determine_input_file_format(const QString filename) { int i; @@ -85,7 +84,7 @@ sr_input_format* InputFile::determine_input_file_format( /* Otherwise, try to find an input module that can handle this file. */ for (i = 0; inputs[i]; i++) { - if (inputs[i]->format_match(filename.c_str())) + if (inputs[i]->format_match(filename.toLocal8Bit().data())) break; } @@ -98,19 +97,19 @@ sr_input_format* InputFile::determine_input_file_format( return inputs[i]; } -sr_input* InputFile::load_input_file_format(const string &filename, +sr_input* InputFile::load_input_file_format(const QString filename, sr_input_format *format) { struct stat st; sr_input *in; if (!format && !(format = - determine_input_file_format(filename.c_str()))) { + determine_input_file_format(filename))) { /* The exact cause was already logged. */ throw tr("Failed to load file"); } - if (stat(filename.c_str(), &st) == -1) + if (stat(filename.toLocal8Bit().data(), &st) == -1) throw tr("Failed to load file"); /* Initialize the input module. */ @@ -121,7 +120,7 @@ sr_input* InputFile::load_input_file_format(const string &filename, in->format = format; in->param = NULL; if (in->format->init && - in->format->init(in, filename.c_str()) != SR_OK) { + in->format->init(in, filename.toLocal8Bit().data()) != SR_OK) { throw tr("Failed to load file"); } @@ -137,7 +136,7 @@ void InputFile::run() assert(_input); assert(_input->format); assert(_input->format->loadfile); - _input->format->loadfile(_input, _path.c_str()); + _input->format->loadfile(_input, _path.toLocal8Bit().data()); } } // device diff --git a/DSView/pv/device/inputfile.h b/DSView/pv/device/inputfile.h index a4d970fa..c063deaf 100644 --- a/DSView/pv/device/inputfile.h +++ b/DSView/pv/device/inputfile.h @@ -35,7 +35,7 @@ namespace device { class InputFile : public File { public: - InputFile(const std::string &path); + InputFile(QString path); sr_dev_inst* dev_inst() const; @@ -55,9 +55,9 @@ private: * or NULL if no input format was selected or auto-detected. */ static sr_input_format* determine_input_file_format( - const std::string &filename); + const QString filename); - static sr_input* load_input_file_format(const std::string &filename, + static sr_input* load_input_file_format(const QString filename, sr_input_format *format); private: sr_input *_input; diff --git a/DSView/pv/device/sessionfile.cpp b/DSView/pv/device/sessionfile.cpp index 0ce7daf5..c1902c15 100644 --- a/DSView/pv/device/sessionfile.cpp +++ b/DSView/pv/device/sessionfile.cpp @@ -26,7 +26,7 @@ namespace pv { namespace device { -SessionFile::SessionFile(const std::string &path) : +SessionFile::SessionFile(QString path) : File(path), _sdi(NULL) { @@ -41,7 +41,7 @@ void SessionFile::use(SigSession *owner) throw(QString) { assert(!_sdi); - if (sr_session_load(_path.c_str()) != SR_OK) + if (sr_session_load(_path.toLocal8Bit().data()) != SR_OK) throw tr("Failed to open file.\n"); GSList *devlist = NULL; diff --git a/DSView/pv/device/sessionfile.h b/DSView/pv/device/sessionfile.h index 5a89a036..51d6d3f2 100644 --- a/DSView/pv/device/sessionfile.h +++ b/DSView/pv/device/sessionfile.h @@ -30,7 +30,7 @@ namespace device { class SessionFile : public File { public: - SessionFile(const std::string &path); + SessionFile(QString path); sr_dev_inst* dev_inst() const; diff --git a/DSView/pv/devicemanager.cpp b/DSView/pv/devicemanager.cpp index e4a2b6e8..a3d6d212 100644 --- a/DSView/pv/devicemanager.cpp +++ b/DSView/pv/devicemanager.cpp @@ -106,8 +106,9 @@ std::list > DeviceManager::driver_scan( QDir dir(QCoreApplication::applicationDirPath()); if (!dir.cd("res")) return driver_devices; - std::string str = dir.absolutePath().toStdString() + "/"; - strcpy(config_path, str.c_str()); + QString str = dir.absolutePath() + "/"; + QString str_utf8 = QString::fromLocal8Bit(str.toLocal8Bit()); + strcpy(config_path, str_utf8.toUtf8().data()); } // Do the scan diff --git a/DSView/pv/mainwindow.cpp b/DSView/pv/mainwindow.cpp index 6840c2d4..99bb06aa 100644 --- a/DSView/pv/mainwindow.cpp +++ b/DSView/pv/mainwindow.cpp @@ -318,7 +318,7 @@ void MainWindow::update_device_list() if (strcmp(selected_device->dev_inst()->driver->name, "demo") != 0) { _logo_bar->dsl_connected(true); QString ses_name = config_path + - QString::fromLocal8Bit(selected_device->dev_inst()->driver->name) + + QString::fromUtf8(selected_device->dev_inst()->driver->name) + QString::number(selected_device->dev_inst()->mode) + ".dsc"; load_session(ses_name); @@ -336,7 +336,8 @@ void MainWindow::reload() void MainWindow::load_file(QString file_name) { try { - _session.set_file(file_name.toStdString()); + //_session.set_file(file_name.toStdString()); + _session.set_file(file_name); } catch(QString e) { show_session_error(tr("Failed to load ") + file_name, e); _session.set_default_device(boost::bind(&MainWindow::session_error, this, @@ -571,7 +572,7 @@ void MainWindow::on_save() bool MainWindow::load_session(QString name) { - QFile sessionFile(name.toStdString().c_str()); + QFile sessionFile(name); if (!sessionFile.open(QIODevice::ReadOnly)) { QMessageBox msg(this); msg.setText(tr("File Error")); @@ -582,8 +583,8 @@ bool MainWindow::load_session(QString name) return false; } - QByteArray sessionData = sessionFile.readAll(); - QJsonDocument sessionDoc = QJsonDocument::fromJson(sessionData); + QString sessionData = QString::fromUtf8(sessionFile.readAll()); + QJsonDocument sessionDoc = QJsonDocument::fromJson(sessionData.toUtf8()); QJsonObject sessionObj = sessionDoc.object(); // check device and mode @@ -617,7 +618,7 @@ bool MainWindow::load_session(QString name) else if (info->datatype == SR_T_FLOAT) _session.get_device()->set_config(NULL, NULL, info->key, g_variant_new_double(sessionObj[info->name].toDouble())); else if (info->datatype == SR_T_CHAR) - _session.get_device()->set_config(NULL, NULL, info->key, g_variant_new_string(sessionObj[info->name].toString().toLocal8Bit())); + _session.get_device()->set_config(NULL, NULL, info->key, g_variant_new_string(sessionObj[info->name].toString().toUtf8())); } } _sampling_bar->update_record_length(); @@ -680,8 +681,8 @@ bool MainWindow::load_session(QString name) bool MainWindow::store_session(QString name) { - QFile sessionFile(name.toStdString().c_str()); - if (!sessionFile.open(QIODevice::WriteOnly)) { + QFile sessionFile(name); + if (!sessionFile.open(QIODevice::WriteOnly | QIODevice::Text)) { QMessageBox msg(this); msg.setText(tr("File Error")); msg.setInformativeText(tr("Couldn't open session file to write!")); @@ -690,6 +691,9 @@ bool MainWindow::store_session(QString name) msg.exec(); return false; } + QTextStream outStream(&sessionFile); + outStream.setCodec("UTF-8"); + outStream.setGenerateByteOrderMark(true); GVariant *gvar_opts; GVariant *gvar; @@ -748,8 +752,11 @@ bool MainWindow::store_session(QString name) sessionVar["trigger"] = _trigger_widget->get_session(); } + QJsonDocument sessionDoc(sessionVar); - sessionFile.write(sessionDoc.toJson()); + //sessionFile.write(QString::fromUtf8(sessionDoc.toJson())); + outStream << QString::fromUtf8(sessionDoc.toJson()); + sessionFile.close(); return true; } diff --git a/DSView/pv/prop/binding/binding_deviceoptions.cpp b/DSView/pv/prop/binding/binding_deviceoptions.cpp index ba5045d7..65282044 100644 --- a/DSView/pv/prop/binding/binding_deviceoptions.cpp +++ b/DSView/pv/prop/binding/binding_deviceoptions.cpp @@ -66,7 +66,7 @@ DeviceOptions::DeviceOptions(struct sr_dev_inst *sdi) : if(sr_config_list(_sdi->driver, _sdi, NULL, key, &gvar_list) != SR_OK) gvar_list = NULL; - const QString name(info->name); + const QString name(info->label); switch(key) { @@ -194,11 +194,11 @@ QString DeviceOptions::print_gvariant(GVariant *const gvar) QString s; if (g_variant_is_of_type(gvar, G_VARIANT_TYPE("s"))) - s = QString(g_variant_get_string(gvar, NULL)); + s = QString::fromUtf8(g_variant_get_string(gvar, NULL)); else { gchar *const text = g_variant_print(gvar, FALSE); - s = QString(text); + s = QString::fromUtf8(text); g_free(text); } diff --git a/DSView/pv/prop/string.cpp b/DSView/pv/prop/string.cpp index 7fcc6569..7542faef 100644 --- a/DSView/pv/prop/string.cpp +++ b/DSView/pv/prop/string.cpp @@ -47,7 +47,7 @@ QWidget* String::get_widget(QWidget *parent, bool auto_commit) _line_edit = new QLineEdit(parent); _line_edit->setText(QString::fromUtf8( - g_variant_get_string(value, NULL))); + g_variant_get_string(value, NULL))); g_variant_unref(value); if (auto_commit) @@ -65,7 +65,7 @@ void String::commit() return; QByteArray ba = _line_edit->text().toLocal8Bit(); - _setter(g_variant_new_string(ba.data())); + _setter(g_variant_new_string(ba.data())); } void String::on_text_edited(const QString&) diff --git a/DSView/pv/sigsession.cpp b/DSView/pv/sigsession.cpp index 03d7e67b..e4ecd442 100644 --- a/DSView/pv/sigsession.cpp +++ b/DSView/pv/sigsession.cpp @@ -158,7 +158,8 @@ void SigSession::set_device(boost::shared_ptr dev_inst) throw(Q } } -void SigSession::set_file(const string &name) throw(QString) + +void SigSession::set_file(QString name) throw(QString) { // Deslect the old device, because file type detection in File::create // destorys the old session inside libsigrok. @@ -176,7 +177,7 @@ void SigSession::set_file(const string &name) throw(QString) } } -void SigSession::save_file(const std::string &name){ +void SigSession::save_file(const QString name){ const deque< boost::shared_ptr > &snapshots = _logic_data->get_snapshots(); if (snapshots.empty()) @@ -185,7 +186,7 @@ void SigSession::save_file(const std::string &name){ const boost::shared_ptr &snapshot = snapshots.front(); - sr_session_save(name.c_str(), _dev_inst->dev_inst(), + sr_session_save(name.toLocal8Bit().data(), _dev_inst->dev_inst(), (unsigned char*)snapshot->get_data(), snapshot->unit_size(), snapshot->get_sample_count()); @@ -213,7 +214,7 @@ void SigSession::cancelSaveFile(){ saveFileThreadRunning = false; } -void SigSession::export_file(const std::string &name, QWidget* parent, const std::string &ext){ +void SigSession::export_file(const QString name, QWidget* parent, const QString ext){ boost::shared_ptr snapshot; int channel_type; @@ -240,7 +241,7 @@ void SigSession::export_file(const std::string &name, QWidget* parent, const std while(*supportedModules){ if(*supportedModules == NULL) break; - if(!strcmp((*supportedModules)->id, ext.c_str())){ + if(!strcmp((*supportedModules)->id, ext.toLocal8Bit().data())){ outModule = *supportedModules; break; } @@ -251,7 +252,7 @@ void SigSession::export_file(const std::string &name, QWidget* parent, const std GHashTable *params = g_hash_table_new(g_str_hash, g_str_equal); - GVariant* filenameGVariant = g_variant_new_string(name.c_str()); + GVariant* filenameGVariant = g_variant_new_bytestring(name.toLocal8Bit().data()); g_hash_table_insert(params, (char*)"filename", filenameGVariant); GVariant* typeGVariant = g_variant_new_int16(channel_type); g_hash_table_insert(params, (char*)"type", typeGVariant); @@ -270,9 +271,11 @@ void SigSession::export_file(const std::string &name, QWidget* parent, const std output.param = NULL; if(outModule->init) outModule->init(&output, params); - QFile file(name.c_str()); + QFile file(name); file.open(QIODevice::WriteOnly | QIODevice::Text); QTextStream out(&file); + out.setCodec("UTF-8"); + out.setGenerateByteOrderMark(true); QFuture future; if (_dev_inst->dev_inst()->mode == LOGIC) { future = QtConcurrent::run([&]{ @@ -294,7 +297,7 @@ void SigSession::export_file(const std::string &name, QWidget* parent, const std p.payload = &lp; outModule->receive(&output, &p, &data_out); if(data_out){ - out << (char*) data_out->str; + out << QString::fromUtf8((char*) data_out->str); g_string_free(data_out,TRUE); } emit progressSaveFileValueChanged(i*100/numsamples); @@ -333,8 +336,8 @@ void SigSession::export_file(const std::string &name, QWidget* parent, const std QFutureWatcher watcher; Qt::WindowFlags flags = Qt::CustomizeWindowHint; - QProgressDialog dlg(QString::fromUtf8("Exporting data... It can take a while."), - QString::fromUtf8("Cancel"),0,100,parent,flags); + QProgressDialog dlg(tr("Exporting data... It can take a while."), + tr("Cancel"),0,100,parent,flags); dlg.setWindowModality(Qt::WindowModal); watcher.setFuture(future); connect(&watcher,SIGNAL(finished()),&dlg,SLOT(cancel())); @@ -832,9 +835,9 @@ void SigSession::refresh(int holdtime) _analog_data->clear(); _cur_analog_snapshot.reset(); } - data_updated(); _data_lock = true; _refresh_timer.start(holdtime); + data_updated(); } void SigSession::data_unlock() diff --git a/DSView/pv/sigsession.h b/DSView/pv/sigsession.h index 883149f2..96503ef2 100644 --- a/DSView/pv/sigsession.h +++ b/DSView/pv/sigsession.h @@ -114,13 +114,13 @@ public: void set_device(boost::shared_ptr dev_inst) throw(QString); - void set_file(const std::string &name) + void set_file(QString name) throw(QString); - void save_file(const std::string &name); + void save_file(const QString name); void set_default_device(boost::function error_handler); - void export_file(const std::string &name, QWidget* parent, const std::string &ext); + void export_file(const QString name, QWidget* parent, const QString ext); void set_default_device(); diff --git a/DSView/pv/toolbars/filebar.cpp b/DSView/pv/toolbars/filebar.cpp index 5916d0ce..4f557505 100644 --- a/DSView/pv/toolbars/filebar.cpp +++ b/DSView/pv/toolbars/filebar.cpp @@ -182,7 +182,7 @@ void FileBar::on_actionExport_triggered(){ QString ext = list.first(); if(f.suffix().compare(ext)) file_name+=tr(".")+ext; - _session.export_file(file_name.toStdString(), this, ext.toStdString()); + _session.export_file(file_name, this, ext); } } } @@ -215,7 +215,7 @@ void FileBar::on_actionSave_triggered() QFileInfo f(file_name); if(f.suffix().compare("dsl")) file_name.append(tr(".dsl")); - _session.save_file(file_name.toStdString()); + _session.save_file(file_name); } } } diff --git a/DSView/pv/toolbars/samplingbar.cpp b/DSView/pv/toolbars/samplingbar.cpp index 64213885..bad13045 100644 --- a/DSView/pv/toolbars/samplingbar.cpp +++ b/DSView/pv/toolbars/samplingbar.cpp @@ -173,7 +173,7 @@ void SamplingBar::set_device_list( BOOST_FOREACH (shared_ptr dev_inst, devices) { assert(dev_inst); - const string title = dev_inst->format_device_title(); + const QString title = dev_inst->format_device_title(); const void *id = dev_inst->get_id(); assert(id); @@ -181,7 +181,7 @@ void SamplingBar::set_device_list( selected_index = _device_selector.count(); _device_selector_map[id] = dev_inst; - _device_selector.addItem(title.c_str(), + _device_selector.addItem(title, qVariantFromValue((void*)id)); } diff --git a/DSView/res/DSCope1.dsc b/DSView/res/DSCope1.dsc index ffe9d0c3..5206fe0e 100644 --- a/DSView/res/DSCope1.dsc +++ b/DSView/res/DSCope1.dsc @@ -1,18 +1,18 @@ -{ +{ "Device": "DSCope", "DeviceMode": 1, "Horizontal trigger position": "0", "Operation Mode": "Normal", "Sample count": "1048576", - "Sample rate": "50000", - "Time base": "2000000000", + "Sample rate": "100000000", + "Time base": "10000", "Trigger hold off": "0", "Trigger slope": "0", "Trigger source": "0", "channel": [ { "colour": "#eeb211", - "coupling": 1, + "coupling": 0, "enabled": true, "index": 0, "name": "0", diff --git a/DSView/res/DSLogic0.dsc b/DSView/res/DSLogic0.dsc index 2c0371d3..f1da7f5c 100644 --- a/DSView/res/DSLogic0.dsc +++ b/DSView/res/DSLogic0.dsc @@ -1,4 +1,4 @@ -{ +{ "Device": "DSLogic", "DeviceMode": 0, "Filter Targets": "None", @@ -6,13 +6,53 @@ "Operation Mode": "Normal", "Sample count": "16777216", "Sample rate": "100000000", - "Threshold Level": "1.8/2.5/3.3V Level", + "Threshold Level": 1, "Trigger hold off": "0", "Trigger slope": "0", "Trigger source": "0", "Using Clock Negedge": 0, "Using External Clock": 0, "channel": [ + { + "colour": "#16191a", + "enabled": true, + "index": 0, + "name": "0", + "strigger": 0, + "type": 10000 + }, + { + "colour": "#8f5202", + "enabled": true, + "index": 1, + "name": "1", + "strigger": 0, + "type": 10000 + }, + { + "colour": "#cc0000", + "enabled": true, + "index": 2, + "name": "2", + "strigger": 0, + "type": 10000 + }, + { + "colour": "#f57900", + "enabled": true, + "index": 3, + "name": "3", + "strigger": 0, + "type": 10000 + }, + { + "colour": "#edd400", + "enabled": true, + "index": 4, + "name": "4", + "strigger": 0, + "type": 10000 + }, { "colour": "#73d216", "enabled": true, @@ -21,6 +61,62 @@ "strigger": 0, "type": 10000 }, + { + "colour": "#3465a4", + "enabled": true, + "index": 6, + "name": "6", + "strigger": 0, + "type": 10000 + }, + { + "colour": "#75507b", + "enabled": true, + "index": 7, + "name": "7", + "strigger": 0, + "type": 10000 + }, + { + "colour": "#16191a", + "enabled": true, + "index": 8, + "name": "8", + "strigger": 0, + "type": 10000 + }, + { + "colour": "#8f5202", + "enabled": true, + "index": 9, + "name": "9", + "strigger": 0, + "type": 10000 + }, + { + "colour": "#cc0000", + "enabled": true, + "index": 10, + "name": "10", + "strigger": 0, + "type": 10000 + }, + { + "colour": "#f57900", + "enabled": true, + "index": 11, + "name": "11", + "strigger": 0, + "type": 10000 + }, + { + "colour": "#edd400", + "enabled": true, + "index": 12, + "name": "12", + "strigger": 0, + "type": 10000 + }, { "colour": "#73d216", "enabled": true, @@ -28,6 +124,22 @@ "name": "13", "strigger": 0, "type": 10000 + }, + { + "colour": "#3465a4", + "enabled": true, + "index": 14, + "name": "14", + "strigger": 0, + "type": 10000 + }, + { + "colour": "#75507b", + "enabled": true, + "index": 15, + "name": "15", + "strigger": 0, + "type": 10000 } ], "trigger": { diff --git a/libsigrok4DSL/hardware/DSL/dscope.c b/libsigrok4DSL/hardware/DSL/dscope.c index 68bc356c..70102d33 100644 --- a/libsigrok4DSL/hardware/DSL/dscope.c +++ b/libsigrok4DSL/hardware/DSL/dscope.c @@ -348,7 +348,7 @@ static int fpga_config(struct libusb_device_handle *hdl, const char *filename) struct stat f_stat; sr_info("Configure FPGA using %s", filename); - if ((fw = fopen(filename, "rb")) == NULL) { + if ((fw = g_fopen(filename, "rb")) == NULL) { sr_err("Unable to open FPGA bit file %s for reading: %s", filename, strerror(errno)); return SR_ERR; @@ -671,7 +671,7 @@ static GSList *scan(GSList *options) src = l->data; switch (src->key) { case SR_CONF_CONN: - conn = g_variant_get_string(src->data, NULL); + conn = g_variant_get_string(src->data, NULL); break; } } @@ -741,9 +741,11 @@ static GSList *scan(GSList *options) sdi->conn = sr_usb_dev_inst_new(libusb_get_bus_number(devlist[i]), libusb_get_device_address(devlist[i]), NULL); } else { - char filename[256]; - sprintf(filename,"%s%s",config_path,prof->firmware); - const char *firmware = filename; + char *firmware = malloc(strlen(config_path)+strlen(prof->firmware)+1); + if (firmware == NULL) + return NULL; + strcpy(firmware, config_path); + strcat(firmware, prof->firmware); if (ezusb_upload_firmware(devlist[i], USB_CONFIGURATION, firmware) == SR_OK) /* Store when this device's FW was updated. */ @@ -987,10 +989,11 @@ static int dev_open(struct sr_dev_inst *sdi) } else { /* Takes >= 10ms for the FX2 to be ready for FPGA configure. */ g_usleep(10 * 1000); - char filename[256]; - sprintf(filename,"%s%s",config_path,devc->profile->fpga_bit33); - - const char *fpga_bit = filename; + char *fpga_bit = malloc(strlen(config_path)+strlen(devc->profile->fpga_bit33)+1); + if (fpga_bit == NULL) + return SR_ERR_MALLOC; + strcpy(fpga_bit, config_path); + strcat(fpga_bit, devc->profile->fpga_bit33); ret = fpga_config(usb->devhdl, fpga_bit); if (ret != SR_OK) { sr_err("Configure FPGA failed!"); @@ -1142,7 +1145,7 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, * upload, so we don't know its (future) address. */ return SR_ERR; snprintf(str, 128, "%d.%d", usb->bus, usb->address); - *data = g_variant_new_string(str); + *data = g_variant_new_string(str); break; case SR_CONF_LIMIT_SAMPLES: if (!sdi) @@ -1404,9 +1407,14 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, } else { /* Takes >= 10ms for the FX2 to be ready for FPGA configure. */ g_usleep(10 * 1000); - char filename[256]; - sprintf(filename,"%s%s",config_path,devc->profile->fpga_bit33); - const char *fpga_bit = filename; + //char filename[256]; + //sprintf(filename,"%s%s",config_path,devc->profile->fpga_bit33); + //const char *fpga_bit = filename; + char *fpga_bit = malloc(strlen(config_path)+strlen(devc->profile->fpga_bit33)+1); + if (fpga_bit == NULL) + return SR_ERR_MALLOC; + strcpy(fpga_bit, config_path); + strcat(fpga_bit, devc->profile->fpga_bit33); ret = fpga_config(usb->devhdl, fpga_bit); if (ret != SR_OK) { sr_err("Configure FPGA failed!"); @@ -1630,7 +1638,7 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi, *data = g_variant_builder_end(&gvb); break; case SR_CONF_TRIGGER_TYPE: - *data = g_variant_new_string(TRIGGER_TYPE); + *data = g_variant_new_string(TRIGGER_TYPE); break; case SR_CONF_OPERATION_MODE: *data = g_variant_new_strv(opmodes, ARRAY_SIZE(opmodes)); diff --git a/libsigrok4DSL/hardware/DSL/dslogic.c b/libsigrok4DSL/hardware/DSL/dslogic.c index 806d5f43..c0fe17d1 100644 --- a/libsigrok4DSL/hardware/DSL/dslogic.c +++ b/libsigrok4DSL/hardware/DSL/dslogic.c @@ -415,7 +415,7 @@ static int fpga_config(struct libusb_device_handle *hdl, const char *filename) struct stat f_stat; sr_info("Configure FPGA using %s", filename); - if ((fw = fopen(filename, "rb")) == NULL) { + if ((fw = g_fopen(filename, "rb")) == NULL) { sr_err("Unable to open FPGA bit file %s for reading: %s", filename, strerror(errno)); return SR_ERR; @@ -740,7 +740,7 @@ static GSList *scan(GSList *options) src = l->data; switch (src->key) { case SR_CONF_CONN: - conn = g_variant_get_string(src->data, NULL); + conn = g_variant_get_string(src->data, NULL); break; } } @@ -811,9 +811,11 @@ static GSList *scan(GSList *options) sdi->conn = sr_usb_dev_inst_new(libusb_get_bus_number(devlist[i]), libusb_get_device_address(devlist[i]), NULL); } else { - char filename[256]; - sprintf(filename,"%s%s",config_path,prof->firmware); - const char *firmware = filename; + char *firmware = malloc(strlen(config_path)+strlen(prof->firmware)+1); + if (firmware == NULL) + return NULL; + strcpy(firmware, config_path); + strcat(firmware, prof->firmware); if (ezusb_upload_firmware(devlist[i], USB_CONFIGURATION, firmware) == SR_OK) /* Store when this device's FW was updated. */ @@ -1057,18 +1059,20 @@ static int dev_open(struct sr_dev_inst *sdi) } else { /* Takes >= 10ms for the FX2 to be ready for FPGA configure. */ g_usleep(10 * 1000); - char filename[256]; + char *fpga_bit = malloc(strlen(config_path)+strlen(devc->profile->fpga_bit33)+1); + if (fpga_bit == NULL) + return SR_ERR_MALLOC; + strcpy(fpga_bit, config_path); switch(devc->th_level) { case SR_TH_3V3: - sprintf(filename,"%s%s",config_path,devc->profile->fpga_bit33); + strcat(fpga_bit, devc->profile->fpga_bit33);; break; case SR_TH_5V0: - sprintf(filename,"%s%s",config_path,devc->profile->fpga_bit50); + strcat(fpga_bit, devc->profile->fpga_bit50);; break; default: return SR_ERR; } - const char *fpga_bit = filename; ret = fpga_config(usb->devhdl, fpga_bit); if (ret != SR_OK) { sr_err("Configure FPGA failed!"); @@ -1141,7 +1145,7 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, * upload, so we don't know its (future) address. */ return SR_ERR; snprintf(str, 128, "%d.%d", usb->bus, usb->address); - *data = g_variant_new_string(str); + *data = g_variant_new_string(str); break; case SR_CONF_LIMIT_SAMPLES: if (!sdi) @@ -1517,18 +1521,20 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, } else { /* Takes >= 10ms for the FX2 to be ready for FPGA configure. */ g_usleep(10 * 1000); - char filename[256]; + char *fpga_bit = malloc(strlen(config_path)+strlen(devc->profile->fpga_bit33)+1); + if (fpga_bit == NULL) + return SR_ERR_MALLOC; + strcpy(fpga_bit, config_path); switch(devc->th_level) { case SR_TH_3V3: - sprintf(filename,"%s%s",config_path,devc->profile->fpga_bit33); + strcat(fpga_bit, devc->profile->fpga_bit33);; break; case SR_TH_5V0: - sprintf(filename,"%s%s",config_path,devc->profile->fpga_bit50); + strcat(fpga_bit, devc->profile->fpga_bit50);; break; default: return SR_ERR; } - const char *fpga_bit = filename; ret = fpga_config(usb->devhdl, fpga_bit); if (ret != SR_OK) { sr_err("Configure FPGA failed!"); @@ -1545,7 +1551,7 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, else sr_dbg("%s: setting threshold voltage to %d failed", __func__, devc->vth); - } else if (id == SR_CONF_FILTER) { + } else if (id == SR_CONF_FILTER) { stropt = g_variant_get_string(data, NULL); ret = SR_OK; if (!strcmp(stropt, filters[SR_FILTER_NONE])) { @@ -1589,8 +1595,10 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, __func__, ch->index, ch->vdiv); } else if (id == SR_CONF_FACTOR) { ch->vfactor = g_variant_get_uint64(data); + ret = SR_OK; } else if (id == SR_CONF_TIMEBASE) { devc->timebase = g_variant_get_uint64(data); + ret = SR_OK; } else if (id == SR_CONF_COUPLING) { ch->coupling = g_variant_get_byte(data); if (ch->coupling == SR_GND_COUPLING) @@ -1672,6 +1680,7 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, __func__, devc->trigger_holdoff); } else if (id == SR_CONF_ZERO) { devc->zero = g_variant_get_boolean(data); + ret = SR_OK; } else if (id == SR_CONF_ZERO_SET) { GSList *l; for(l = sdi->channels; l; l = l->next) { @@ -1759,7 +1768,7 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi, *data = g_variant_builder_end(&gvb); break; case SR_CONF_TRIGGER_TYPE: - *data = g_variant_new_string(TRIGGER_TYPE); + *data = g_variant_new_string(TRIGGER_TYPE); break; case SR_CONF_OPERATION_MODE: *data = g_variant_new_strv(opmodes, ARRAY_SIZE(opmodes)); @@ -2536,9 +2545,6 @@ static int dev_status_get(struct sr_dev_inst *sdi, struct sr_status *status, int ret = command_get_status(usb->devhdl, (unsigned char*)status, begin, end); } - if (ret != SR_OK) - sr_err("Device don't exist!"); - return ret; } else { return SR_ERR; diff --git a/libsigrok4DSL/hwdriver.c b/libsigrok4DSL/hwdriver.c index f37efbde..0d187cca 100644 --- a/libsigrok4DSL/hwdriver.c +++ b/libsigrok4DSL/hwdriver.c @@ -52,54 +52,54 @@ static struct sr_config_info sr_config_info_data[] = { {SR_CONF_CONN, SR_T_CHAR, "conn", - "Connection", NULL}, + "Connection", "Connection", NULL}, {SR_CONF_SERIALCOMM, SR_T_CHAR, "serialcomm", - "Serial communication", NULL}, + "Serial communication", "Serial communication", NULL}, {SR_CONF_SAMPLERATE, SR_T_UINT64, "samplerate", - "Sample rate", NULL}, + "Sample rate", "Sample rate", NULL}, {SR_CONF_LIMIT_SAMPLES, SR_T_UINT64, "samplecount", - "Sample count", NULL}, + "Sample count", "Sample count", NULL}, {SR_CONF_CLOCK_TYPE, SR_T_BOOL, "clocktype", - "Using External Clock", NULL}, + "Using External Clock", "Using External Clock", NULL}, {SR_CONF_CLOCK_EDGE, SR_T_BOOL, "clockedge", - "Using Clock Negedge", NULL}, + "Using Clock Negedge", "Using Clock Negedge", NULL}, {SR_CONF_CAPTURE_RATIO, SR_T_UINT64, "captureratio", - "Pre-trigger capture ratio", NULL}, + "Pre-trigger capture ratio", "Pre-trigger capture ratio", NULL}, {SR_CONF_PATTERN_MODE, SR_T_CHAR, "pattern", - "Pattern mode", NULL}, + "Pattern mode", "Pattern mode", NULL}, {SR_CONF_TRIGGER_TYPE, SR_T_CHAR, "triggertype", - "Trigger types", NULL}, + "Trigger types", "Trigger types", NULL}, {SR_CONF_RLE, SR_T_BOOL, "rle", - "Run Length Encoding", NULL}, + "Run Length Encoding", "Run Length Encoding", NULL}, {SR_CONF_TRIGGER_SLOPE, SR_T_UINT8, "triggerslope", - "Trigger slope", NULL}, + "Trigger slope", "Trigger slope", NULL}, {SR_CONF_TRIGGER_SOURCE, SR_T_UINT8, "triggersource", - "Trigger source", NULL}, + "Trigger source", "Trigger source", NULL}, {SR_CONF_HORIZ_TRIGGERPOS, SR_T_UINT8, "horiz_triggerpos", - "Horizontal trigger position", NULL}, + "Horizontal trigger position", "Horizontal trigger position", NULL}, {SR_CONF_TRIGGER_HOLDOFF, SR_T_UINT64, "triggerholdoff", - "Trigger hold off", NULL}, + "Trigger hold off", "Trigger hold off", NULL}, {SR_CONF_BUFFERSIZE, SR_T_UINT64, "buffersize", - "Buffer size", NULL}, + "Buffer size", "Buffer size", NULL}, {SR_CONF_TIMEBASE, SR_T_UINT64, "timebase", - "Time base", NULL}, + "Time base", "Time base", NULL}, {SR_CONF_FILTER, SR_T_CHAR, "filter", - "Filter Targets", NULL}, + "Filter Targets", "Filter Targets", NULL}, {SR_CONF_VDIV, SR_T_RATIONAL_VOLT, "vdiv", - "Volts/div", NULL}, + "Volts/div", "Volts/div", NULL}, {SR_CONF_VDIV, SR_T_RATIONAL_VOLT, "factor", - "Probe Factor", NULL}, + "Probe Factor", "Probe Factor", NULL}, {SR_CONF_COUPLING, SR_T_CHAR, "coupling", - "Coupling", NULL}, + "Coupling", "Coupling", NULL}, {SR_CONF_DATALOG, SR_T_BOOL, "datalog", - "Datalog", NULL}, + "Datalog", "Datalog", NULL}, {SR_CONF_OPERATION_MODE, SR_T_CHAR, "operation", - "Operation Mode", NULL}, + "Operation Mode", "Operation Mode", NULL}, {SR_CONF_THRESHOLD, SR_T_CHAR, "threshold", - "Threshold Level", NULL}, + "Threshold Level", "Threshold Level", NULL}, {SR_CONF_VTH, SR_T_FLOAT, "threshold", - "Threshold Level", NULL}, - {0, 0, NULL, NULL, NULL}, + "Threshold Level", "Threshold Level", NULL}, + {0, 0, NULL, NULL, NULL, NULL}, }; /** @cond PRIVATE */ diff --git a/libsigrok4DSL/input/in_vcd.c b/libsigrok4DSL/input/in_vcd.c index 9db0c0b0..61c896c1 100644 --- a/libsigrok4DSL/input/in_vcd.c +++ b/libsigrok4DSL/input/in_vcd.c @@ -299,7 +299,7 @@ static int format_match(const char *filename) gchar *name = NULL, *contents = NULL; gboolean status; - file = fopen(filename, "r"); + file = g_fopen(filename, "r"); if (file == NULL) return FALSE; @@ -564,7 +564,7 @@ static int loadfile(struct sr_input *in, const char *filename) ctx = in->internal; - if ((file = fopen(filename, "r")) == NULL) + if ((file = g_fopen(filename, "r")) == NULL) return SR_ERR; if (!parse_header(file, ctx)) diff --git a/libsigrok4DSL/libsigrok.h b/libsigrok4DSL/libsigrok.h index 3de797b9..7ecc1217 100644 --- a/libsigrok4DSL/libsigrok.h +++ b/libsigrok4DSL/libsigrok.h @@ -590,6 +590,7 @@ struct sr_config_info { int datatype; char *id; char *name; + char *label; char *description; }; diff --git a/libsigrok4DSL/output/srzip.c b/libsigrok4DSL/output/srzip.c index cacd0df0..3249e276 100644 --- a/libsigrok4DSL/output/srzip.c +++ b/libsigrok4DSL/output/srzip.c @@ -41,7 +41,7 @@ static int init(struct sr_output *o, GHashTable *options) outc = g_malloc0(sizeof(struct out_context)); o->priv = outc; - outc->filename = g_strdup(g_variant_get_string(g_hash_table_lookup(options, "filename"), NULL)); + outc->filename = g_strdup(g_variant_get_bytestring(g_hash_table_lookup(options, "filename"))); if (strlen(outc->filename) == 0) return SR_ERR_ARG; @@ -303,7 +303,7 @@ static struct sr_option options[] = { static const struct sr_option *get_options(void) { if (!options[0].def) - options[0].def = g_variant_ref_sink(g_variant_new_string("")); + options[0].def = g_variant_ref_sink(g_variant_new_string("")); return options; } diff --git a/libsigrok4DSL/session_driver.c b/libsigrok4DSL/session_driver.c index 5963d428..93815ef1 100644 --- a/libsigrok4DSL/session_driver.c +++ b/libsigrok4DSL/session_driver.c @@ -203,11 +203,11 @@ static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi) sr_info("Setting samplerate to %" PRIu64 ".", vdev->samplerate); break; case SR_CONF_SESSIONFILE: - vdev->sessionfile = g_strdup(g_variant_get_string(data, NULL)); + vdev->sessionfile = g_strdup(g_variant_get_bytestring(data)); sr_info("Setting sessionfile to '%s'.", vdev->sessionfile); break; case SR_CONF_CAPTUREFILE: - vdev->capturefile = g_strdup(g_variant_get_string(data, NULL)); + vdev->capturefile = g_strdup(g_variant_get_bytestring(data)); sr_info("Setting capturefile to '%s'.", vdev->capturefile); break; case SR_CONF_CAPTURE_UNITSIZE: diff --git a/libsigrok4DSL/session_file.c b/libsigrok4DSL/session_file.c index f5592e4f..e4b3b674 100644 --- a/libsigrok4DSL/session_file.c +++ b/libsigrok4DSL/session_file.c @@ -182,9 +182,9 @@ SR_API int sr_session_load(const char *filename) sr_dev_open(sdi); sr_session_dev_add(sdi); sdi->driver->config_set(SR_CONF_SESSIONFILE, - g_variant_new_string(filename), sdi, NULL, NULL); + g_variant_new_bytestring(filename), sdi, NULL, NULL); sdi->driver->config_set(SR_CONF_CAPTUREFILE, - g_variant_new_string(val), sdi, NULL, NULL); + g_variant_new_bytestring(val), sdi, NULL, NULL); g_ptr_array_add(capturefiles, val); } else if (!strcmp(keys[j], "samplerate")) { sr_parse_sizestring(val, &tmp_u64); diff --git a/libsigrok4DSL/strutil.c b/libsigrok4DSL/strutil.c index 24b5e380..336d8f7e 100644 --- a/libsigrok4DSL/strutil.c +++ b/libsigrok4DSL/strutil.c @@ -338,7 +338,7 @@ SR_API char **sr_parse_triggerstring(const struct sr_dev_inst *sdi, sr_err("%s: Device doesn't support any triggers.", __func__); return NULL; } - trigger_types = g_variant_get_string(gvar, NULL); + trigger_types = g_variant_get_string(gvar, NULL); tokens = g_strsplit(triggerstring, ",", max_probes); for (i = 0; tokens[i]; i++) {