X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fdata%2Fmathsignal.cpp;h=079c297d828470e0060a329bfc3e21577a558f28;hb=79c0e0452fb025da84af9cc0953b85631af343f9;hp=2ad90212fe01eb5c8cd5cef764aaed6f1b3150b5;hpb=144e72c9ec677e7df35d37d7de6e8a18bb3f2ba1;p=pulseview.git diff --git a/pv/data/mathsignal.cpp b/pv/data/mathsignal.cpp index 2ad90212..079c297d 100644 --- a/pv/data/mathsignal.cpp +++ b/pv/data/mathsignal.cpp @@ -84,7 +84,6 @@ MathSignal::MathSignal(pv::Session &session) : use_custom_sample_rate_(false), use_custom_sample_count_(false), expression_(""), - error_message_(""), exprtk_unknown_symbol_table_(nullptr), exprtk_symbol_table_(nullptr), exprtk_expression_(nullptr), @@ -111,6 +110,8 @@ MathSignal::~MathSignal() void MathSignal::save_settings(QSettings &settings) const { + SignalBase::save_settings(settings); + settings.setValue("expression", expression_); settings.setValue("custom_sample_rate", (qulonglong)custom_sample_rate_); @@ -121,6 +122,8 @@ void MathSignal::save_settings(QSettings &settings) const void MathSignal::restore_settings(QSettings &settings) { + SignalBase::restore_settings(settings); + if (settings.contains("expression")) expression_ = settings.value("expression").toString(); @@ -137,11 +140,6 @@ void MathSignal::restore_settings(QSettings &settings) use_custom_sample_count_ = settings.value("use_custom_sample_count").toBool(); } -QString MathSignal::error_message() const -{ - return error_message_; -} - QString MathSignal::get_expression() const { return expression_; @@ -159,6 +157,8 @@ void MathSignal::set_error_message(QString msg) error_message_ = msg; // TODO Emulate noquote() qDebug().nospace() << name() << ": " << msg << "(Expression: '" << expression_ << "')"; + + error_message_changed(msg); } uint64_t MathSignal::get_working_sample_count(uint32_t segment_id) const @@ -313,7 +313,25 @@ void MathSignal::begin_generation() exprtk_parser_->enable_unknown_symbol_resolver(); if (!exprtk_parser_->compile(expression_.toStdString(), *exprtk_expression_)) { - set_error_message(tr("Error in expression")); + QString error_details; + size_t error_count = exprtk_parser_->error_count(); + + for (size_t i = 0; i < error_count; i++) { + typedef exprtk::parser_error::type error_t; + error_t error = exprtk_parser_->get_error(i); + exprtk::parser_error::update_error(error, expression_.toStdString()); + + QString error_detail = tr("%1 at line %2, column %3: %4"); + if ((error_count > 1) && (i < (error_count - 1))) + error_detail += "\n"; + + error_details += error_detail \ + .arg(exprtk::parser_error::to_str(error.mode).c_str()) \ + .arg(error.line_no) \ + .arg(error.column_no) \ + .arg(error.diagnostic.c_str()); + } + set_error_message(error_details); } else { // Resolve unknown scalars to signals and add them to the input signal list vector unknowns;