diff options
| author | Amaury Pouly <amaury.pouly@gmail.com> | 2014-02-09 02:16:43 +0100 |
|---|---|---|
| committer | Amaury Pouly <amaury.pouly@gmail.com> | 2014-02-10 23:14:26 +0100 |
| commit | a66a5af4db8249b5b86a8126e0fe7a60a6f6338a (patch) | |
| tree | 2b9507b56b72da61ffdf90ef44ec44a862fcd0c1 /utils/regtools/qeditor/regtab.cpp | |
| parent | 3d07706c05c46878533f55f26bbe02d7904efd75 (diff) | |
| download | rockbox-a66a5af4db8249b5b86a8126e0fe7a60a6f6338a.zip rockbox-a66a5af4db8249b5b86a8126e0fe7a60a6f6338a.tar.gz rockbox-a66a5af4db8249b5b86a8126e0fe7a60a6f6338a.tar.bz2 rockbox-a66a5af4db8249b5b86a8126e0fe7a60a6f6338a.tar.xz | |
regtools/qeditor: prepare support for register writing
Change-Id: Ifef36a3ddb1604db63ec974da2d6a77a5540ff42
Diffstat (limited to 'utils/regtools/qeditor/regtab.cpp')
| -rw-r--r-- | utils/regtools/qeditor/regtab.cpp | 117 |
1 files changed, 109 insertions, 8 deletions
diff --git a/utils/regtools/qeditor/regtab.cpp b/utils/regtools/qeditor/regtab.cpp index e4adecf..1e9846e 100644 --- a/utils/regtools/qeditor/regtab.cpp +++ b/utils/regtools/qeditor/regtab.cpp @@ -17,17 +17,100 @@ #include "backend.h" #include "analyser.h" -RegTreeItem::RegTreeItem(const QString& string, int type) - :QTreeWidgetItem(QStringList(string), type) +SocFieldValidator::SocFieldValidator(QObject *parent) + :QValidator(parent) { + m_field.first_bit = 0; + m_field.last_bit = 31; } -void RegTreeItem::SetPath(int dev_idx, int dev_addr_idx, int reg_idx, int reg_addr_idx) +SocFieldValidator::SocFieldValidator(const soc_reg_field_t& field, QObject *parent) + :QValidator(parent), m_field(field) { - m_dev_idx = dev_idx; - m_dev_addr_idx = dev_addr_idx; - m_reg_idx = reg_idx; - m_reg_addr_idx = reg_addr_idx; +} + +void SocFieldValidator::fixup(QString& input) const +{ + input = input.trimmed(); +} + +QValidator::State SocFieldValidator::validate(QString& input, int& pos) const +{ + (void) pos; + soc_word_t val; + State state = parse(input, val); + qDebug() << "validate(" << input << "): " << state; + return state; +} + +QValidator::State SocFieldValidator::parse(const QString& input, soc_word_t& val) const +{ + // the empty string is all alwats intermediate + if(input.size() == 0) + return Intermediate; + // first check named values + State state = Invalid; + foreach(const soc_reg_field_value_t& value, m_field.value) + { + QString name = QString::fromLocal8Bit(value.name.c_str()); + // cannot be a substring if too long or empty + if(input.size() > name.size()) + continue; + // check equal string + if(input == name) + { + state = Acceptable; + val = value.value; + break; + } + // check substring + if(name.startsWith(input)) + state = Intermediate; + } + // early return for exact match + if(state == Acceptable) + return state; + // do a few special cases for convenience + if(input.compare("0x", Qt::CaseInsensitive) == 0 || + input.compare("0b", Qt::CaseInsensitive) == 0) + return Intermediate; + // try by parsing + unsigned basis, pos; + if(input.size() >= 2 && input.startsWith("0x", Qt::CaseInsensitive)) + { + basis = 16; + pos = 2; + } + else if(input.size() >= 2 && input.startsWith("0b", Qt::CaseInsensitive)) + { + basis = 2; + pos = 2; + } + else if(input.size() >= 2 && input.startsWith("0")) + { + basis = 8; + pos = 1; + } + else + { + basis = 10; + pos = 0; + } + bool ok = false; + unsigned long v = input.mid(pos).toULong(&ok, basis); + // if not ok, return result of name parsing + if(!ok) + return state; + // if ok, check if it fits in the number of bits + unsigned nr_bits = m_field.last_bit - m_field.first_bit + 1; + unsigned long max = nr_bits == 32 ? 0xffffffff : (1 << nr_bits) - 1; + if(v <= max) + { + val = v; + return Acceptable; + } + + return state; } RegTab::RegTab(Backend *backend) @@ -167,6 +250,7 @@ void RegTab::OnDataSelChanged(int index) OnDataSocActivated(m_io_backend->GetSocName()); } Settings::Get()->setValue("regtab/loaddatadir", fd->directory().absolutePath()); + SetReadOnlyIndicator(); } #ifdef HAVE_HWSTUB else if(var == DataSelDevice) @@ -189,6 +273,10 @@ void RegTab::OnDataSelChanged(int index) OnDataChanged(); } +void RegTab::SetReadOnlyIndicator() +{ +} + void RegTab::OnDataChanged() { OnRegItemChanged(m_reg_tree->currentItem(), m_reg_tree->currentItem()); @@ -230,6 +318,8 @@ void RegTab::DisplayRegister(const SocRegRef& ref) { delete m_right_content; + bool read_only = m_io_backend->IsReadOnly(); + QVBoxLayout *right_layout = new QVBoxLayout; const soc_dev_addr_t& dev_addr = ref.GetDevAddr(); @@ -286,9 +376,11 @@ void RegTab::DisplayRegister(const SocRegRef& ref) QLabel *raw_val_name = new QLabel; raw_val_name->setText("Raw value:"); QLineEdit *raw_val_edit = new QLineEdit; - raw_val_edit->setReadOnly(true); + raw_val_edit->setReadOnly(read_only); raw_val_edit->setText(QString().sprintf("0x%08x", value)); raw_val_edit->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); + raw_val_edit->setValidator(new SocFieldValidator(raw_val_edit)); + connect(raw_val_edit, SIGNAL(returnPressed()), this, SLOT(OnRawRegValueReturnPressed())); raw_val_layout = new QHBoxLayout; raw_val_layout->addStretch(); raw_val_layout->addWidget(raw_val_name); @@ -445,3 +537,12 @@ void RegTab::OnSocChanged(const QString& soc) FillRegTree(); FillAnalyserList(); } + +void RegTab::OnRawRegValueReturnPressed() +{ + QObject *obj = sender(); + QLineEdit *edit = dynamic_cast< QLineEdit* >(obj); + const SocFieldValidator *validator = dynamic_cast< const SocFieldValidator* >(edit->validator()); + soc_word_t val; + QValidator::State state = validator->parse(edit->text(), val); +} |