summaryrefslogtreecommitdiff
path: root/utils/regtools/qeditor/regdisplaypanel.cpp
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2016-02-06 15:08:43 +0000
committerAmaury Pouly <amaury.pouly@gmail.com>2016-02-06 15:20:48 +0000
commit6b9610fb908b27d1e0383c8d9bde3a88f35ed30c (patch)
tree1b0f5e2821b44d20f3704c584e309f5911357040 /utils/regtools/qeditor/regdisplaypanel.cpp
parent0f701a64bee43e79f95970ae9c0ec43ea7fcdf17 (diff)
downloadrockbox-6b9610fb908b27d1e0383c8d9bde3a88f35ed30c.tar.gz
rockbox-6b9610fb908b27d1e0383c8d9bde3a88f35ed30c.zip
regtoosl/qeditor: port to the new description format
This big commit port qeditor from v1 to v2 register file format. Although the display code was much simplified, the edit code had to be rewritten. The new code also brings many improvement to the register display widget. The new code also compiles with both Qt4 and Qt5, although it is recommended to use Qt5 to get some improvements, especially in the layout of editor. Change-Id: I24633ac37a144f25d9e705b565654269ec9cfbd3
Diffstat (limited to 'utils/regtools/qeditor/regdisplaypanel.cpp')
-rw-r--r--utils/regtools/qeditor/regdisplaypanel.cpp157
1 files changed, 87 insertions, 70 deletions
diff --git a/utils/regtools/qeditor/regdisplaypanel.cpp b/utils/regtools/qeditor/regdisplaypanel.cpp
index 167c776cce..a72d280d6c 100644
--- a/utils/regtools/qeditor/regdisplaypanel.cpp
+++ b/utils/regtools/qeditor/regdisplaypanel.cpp
@@ -21,36 +21,26 @@
21#include "regdisplaypanel.h" 21#include "regdisplaypanel.h"
22#include <QHeaderView> 22#include <QHeaderView>
23#include <QDebug> 23#include <QDebug>
24 24#include <QStandardItemModel>
25/**
26 * RegItemEditorCreator
27 */
28
29QWidget *RegItemEditorCreator::createWidget(QWidget * parent) const
30{
31 return new RegLineEdit(parent);
32}
33
34QByteArray RegItemEditorCreator::valuePropertyName () const
35{
36 return QByteArray("text");
37}
38 25
39/** 26/**
40 * SocDisplayPanel 27 * SocDisplayPanel
41 */ 28 */
42SocDisplayPanel::SocDisplayPanel(QWidget *parent, const SocRef& dev_ref) 29SocDisplayPanel::SocDisplayPanel(QWidget *parent, IoBackend *io_backend,
43 :QGroupBox(parent), m_soc(dev_ref) 30 const soc_desc::soc_ref_t& ref)
31 :QGroupBox(parent), m_soc(ref)
44{ 32{
33 Q_UNUSED(io_backend)
45 QVBoxLayout *right_layout = new QVBoxLayout; 34 QVBoxLayout *right_layout = new QVBoxLayout;
46 35
47 m_name = new QLabel(this); 36 m_name = new QLabel(this);
48 m_name->setTextFormat(Qt::RichText); 37 m_name->setTextFormat(Qt::RichText);
49 m_name->setText("<h1>" + QString::fromStdString(m_soc.GetSoc().name) + "</h1>"); 38 m_name->setText("<h1>" + QString::fromStdString(m_soc.get()->name) + "</h1>");
50 39
51 m_desc = new QLabel(this); 40 m_desc = new QLabel(this);
52 m_name->setTextFormat(Qt::RichText); 41 m_name->setTextFormat(Qt::RichText);
53 m_desc->setText(QString::fromStdString(m_soc.GetSoc().desc)); 42 m_desc->setText(QString::fromStdString(m_soc.get()->desc));
43 m_desc->setVisible(m_desc->text().size() != 0);
54 44
55 right_layout->addWidget(m_name, 0); 45 right_layout->addWidget(m_name, 0);
56 right_layout->addWidget(m_desc, 0); 46 right_layout->addWidget(m_desc, 0);
@@ -71,24 +61,21 @@ QWidget *SocDisplayPanel::GetWidget()
71} 61}
72 62
73/** 63/**
74 * DevDisplayPanel 64 * NodeDisplayPanel
75 */ 65 */
76DevDisplayPanel::DevDisplayPanel(QWidget *parent, const SocDevRef& dev_ref) 66NodeDisplayPanel::NodeDisplayPanel(QWidget *parent, IoBackend *io_backend,
77 :QGroupBox(parent), m_dev(dev_ref), m_reg_font(font()) 67 const soc_desc::node_inst_t& ref)
68 :QGroupBox(parent), m_node(ref)
78{ 69{
70 BackendHelper helper(io_backend, ref.soc());
79 QVBoxLayout *right_layout = new QVBoxLayout; 71 QVBoxLayout *right_layout = new QVBoxLayout;
80 const soc_dev_addr_t& dev_addr = m_dev.GetDevAddr();
81
82 m_reg_font.setWeight(100);
83 m_reg_font.setKerning(false);
84 72
85 QString dev_name; 73 QString dev_name = helper.GetPath(ref);
86 dev_name.sprintf("HW_%s_BASE", dev_addr.name.c_str());
87 74
88 QLabel *label_names = new QLabel("<b>" + dev_name + "</b>"); 75 QLabel *label_names = new QLabel("<b>" + dev_name + "</b>");
89 label_names->setTextFormat(Qt::RichText); 76 label_names->setTextFormat(Qt::RichText);
90 77
91 QLabel *label_addr = new QLabel("<b>" + QString().sprintf("0x%03x", dev_addr.addr) + "</b>"); 78 QLabel *label_addr = new QLabel("<b>" + QString().sprintf("0x%03x", ref.addr()) + "</b>");
92 label_addr->setTextFormat(Qt::RichText); 79 label_addr->setTextFormat(Qt::RichText);
93 80
94 QHBoxLayout *top_layout = new QHBoxLayout; 81 QHBoxLayout *top_layout = new QHBoxLayout;
@@ -99,27 +86,38 @@ DevDisplayPanel::DevDisplayPanel(QWidget *parent, const SocDevRef& dev_ref)
99 86
100 m_name = new QLabel(this); 87 m_name = new QLabel(this);
101 m_name->setTextFormat(Qt::RichText); 88 m_name->setTextFormat(Qt::RichText);
102 m_name->setText("<h1>" + QString::fromStdString(m_dev.GetDev().long_name) + "</h1>"); 89 /* if instance has a title, it overrides node title.*/
103 90 std::string title = ref.get()->title;
104 m_desc = new QLabel(this); 91 if(title.empty())
105 m_name->setTextFormat(Qt::RichText); 92 title = ref.node().get()->title;
106 m_desc->setText(QString::fromStdString(m_dev.GetDev().desc)); 93 m_name->setText("<h1>" + QString::fromStdString(title) + "</h1>");
94
95 /* put description from the node and from the instance */
96 m_node_desc = new QLabel(this);
97 m_node_desc->setTextFormat(Qt::RichText);
98 m_node_desc->setText(QString::fromStdString(ref.node().get()->desc));
99 m_node_desc->setVisible(m_node_desc->text().size() != 0);
100 m_inst_desc = new QLabel(this);
101 m_inst_desc->setTextFormat(Qt::RichText);
102 m_inst_desc->setText(QString::fromStdString(ref.get()->desc));
103 m_inst_desc->setVisible(m_inst_desc->text().size() != 0);
107 104
108 right_layout->addWidget(m_name, 0); 105 right_layout->addWidget(m_name, 0);
109 right_layout->addLayout(top_layout, 0); 106 right_layout->addLayout(top_layout, 0);
110 right_layout->addWidget(m_desc, 0); 107 right_layout->addWidget(m_node_desc, 0);
108 right_layout->addWidget(m_inst_desc, 0);
111 right_layout->addStretch(1); 109 right_layout->addStretch(1);
112 110
113 setTitle("Device Description"); 111 setTitle("Device Description");
114 setLayout(right_layout); 112 setLayout(right_layout);
115} 113}
116 114
117void DevDisplayPanel::AllowWrite(bool en) 115void NodeDisplayPanel::AllowWrite(bool en)
118{ 116{
119 Q_UNUSED(en); 117 Q_UNUSED(en);
120} 118}
121 119
122QWidget *DevDisplayPanel::GetWidget() 120QWidget *NodeDisplayPanel::GetWidget()
123{ 121{
124 return this; 122 return this;
125} 123}
@@ -128,34 +126,29 @@ QWidget *DevDisplayPanel::GetWidget()
128 * RegDisplayPanel 126 * RegDisplayPanel
129 */ 127 */
130 128
131RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const SocRegRef& reg_ref) 129RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend,
132 :QGroupBox(parent), m_io_backend(io_backend), m_reg(reg_ref), m_reg_font(font()) 130 const soc_desc::node_inst_t& ref)
131 :QGroupBox(parent), m_io_backend(io_backend), m_node(ref), m_reg_font(font())
133{ 132{
134 bool read_only = m_io_backend->IsReadOnly(); 133 bool read_only = m_io_backend->IsReadOnly();
134 BackendHelper helper(m_io_backend, ref.soc());
135 135
136 QVBoxLayout *right_layout = new QVBoxLayout; 136 QVBoxLayout *right_layout = new QVBoxLayout;
137 137
138 const soc_dev_addr_t& dev_addr = m_reg.GetDevAddr();
139 const soc_reg_t& reg = m_reg.GetReg();
140 const soc_reg_addr_t& reg_addr = m_reg.GetRegAddr();
141
142 m_reg_font.setWeight(100); 138 m_reg_font.setWeight(100);
143 m_reg_font.setKerning(false); 139 m_reg_font.setKerning(false);
144 140
145 QString reg_name; 141 QString reg_name = helper.GetPath(ref);
146 reg_name.sprintf("HW_%s_%s", dev_addr.name.c_str(), reg_addr.name.c_str());
147 QStringList names; 142 QStringList names;
148 QVector< soc_addr_t > addresses; 143 QVector< soc_addr_t > addresses;
149 names.append(reg_name); 144 names.append(reg_name);
150 addresses.append(reg_addr.addr); 145 addresses.append(ref.addr());
151 if(reg.flags & REG_HAS_SCT) 146
147 std::vector< soc_desc::variant_ref_t > variants = ref.node().reg().variants();
148 for(size_t i = 0; i < variants.size(); i++)
152 { 149 {
153 names.append(reg_name + "_SET"); 150 names.append(reg_name + "/" + QString::fromStdString(variants[i].get()->type));
154 names.append(reg_name + "_CLR"); 151 addresses.append(ref.addr() + variants[i].get()->offset);
155 names.append(reg_name + "_TOG");
156 addresses.append(reg_addr.addr + 4);
157 addresses.append(reg_addr.addr + 8);
158 addresses.append(reg_addr.addr + 12);
159 } 152 }
160 153
161 QString str; 154 QString str;
@@ -188,7 +181,7 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S
188 m_raw_val_edit->SetReadOnly(read_only); 181 m_raw_val_edit->SetReadOnly(read_only);
189 m_raw_val_edit->GetLineEdit()->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); 182 m_raw_val_edit->GetLineEdit()->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
190 m_raw_val_edit->GetLineEdit()->setValidator(new SocFieldValidator(m_raw_val_edit)); 183 m_raw_val_edit->GetLineEdit()->setValidator(new SocFieldValidator(m_raw_val_edit));
191 m_raw_val_edit->EnableSCT(!!(reg.flags & REG_HAS_SCT)); 184 //m_raw_val_edit->EnableSCT(!!(reg.flags & REG_HAS_SCT));
192 m_raw_val_edit->GetLineEdit()->setFont(m_reg_font); 185 m_raw_val_edit->GetLineEdit()->setFont(m_reg_font);
193 QHBoxLayout *raw_val_layout = new QHBoxLayout; 186 QHBoxLayout *raw_val_layout = new QHBoxLayout;
194 raw_val_layout->addStretch(); 187 raw_val_layout->addStretch();
@@ -198,9 +191,13 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S
198 191
199 m_value_table = new GrowingTableView(); 192 m_value_table = new GrowingTableView();
200 m_value_model = new RegFieldTableModel(m_value_table); // view takes ownership 193 m_value_model = new RegFieldTableModel(m_value_table); // view takes ownership
201 m_value_model->SetRegister(m_reg.GetReg()); 194 m_value_model->SetRegister(*m_node.node().reg().get());
202 m_value_model->SetReadOnly(read_only); 195 m_value_model->SetReadOnly(read_only);
203 m_value_table->setModel(m_value_model); 196 RegFieldProxyModel *proxy_model = new RegFieldProxyModel(this);
197 proxy_model->setSourceModel(m_value_model);
198 m_value_table->setModel(proxy_model);
199 m_value_table->setSortingEnabled(true);
200 m_value_table->sortByColumn(0, Qt::DescendingOrder);
204 m_value_table->verticalHeader()->setVisible(false); 201 m_value_table->verticalHeader()->setVisible(false);
205 m_value_table->resizeColumnsToContents(); 202 m_value_table->resizeColumnsToContents();
206 m_value_table->horizontalHeader()->setStretchLastSection(true); 203 m_value_table->horizontalHeader()->setStretchLastSection(true);
@@ -217,17 +214,36 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S
217 m_table_delegate->setItemEditorFactory(m_table_edit_factory); 214 m_table_delegate->setItemEditorFactory(m_table_edit_factory);
218 m_value_table->setItemDelegate(m_table_delegate); 215 m_value_table->setItemDelegate(m_table_delegate);
219 216
220 m_sexy_display2 = new Unscroll<RegSexyDisplay2>(this); 217 m_sexy_display2 = new Unscroll<YRegDisplay>(this);
221 m_sexy_display2->setFont(m_reg_font); 218 m_sexy_display2->setFont(m_reg_font);
222 m_sexy_display2->setModel(m_value_model); 219 m_sexy_display2->setModel(m_value_model);
220 m_sexy_display2->setWidth(m_node.node().reg().get()->width);
223 m_sexy_display2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 221 m_sexy_display2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
224 222
223 m_name = new QLabel(this);
224 m_name->setTextFormat(Qt::RichText);
225 m_name->setText("<h1>" + QString::fromStdString(ref.node().get()->title) + "</h1>");
226
227 /* put description from the node, from the instance and register */
228 m_node_desc = new QLabel(this);
229 m_node_desc->setTextFormat(Qt::RichText);
230 m_node_desc->setText(QString::fromStdString(ref.node().get()->desc));
231 m_node_desc->setVisible(m_node_desc->text().size() != 0);
232 m_inst_desc = new QLabel(this);
233 m_inst_desc->setTextFormat(Qt::RichText);
234 m_inst_desc->setText(QString::fromStdString(ref.get()->desc));
235 m_inst_desc->setVisible(m_inst_desc->text().size() != 0);
225 m_desc = new QLabel(this); 236 m_desc = new QLabel(this);
226 m_desc->setTextFormat(Qt::RichText); 237 m_desc->setTextFormat(Qt::RichText);
227 m_desc->setText(QString::fromStdString(m_reg.GetReg().desc)); 238 m_desc->setText(QString::fromStdString(m_node.node().reg().get()->desc));
239 m_desc->setVisible(m_desc->text().size() != 0);
228 240
241 right_layout->addWidget(m_name);
229 right_layout->addWidget(m_desc); 242 right_layout->addWidget(m_desc);
230 right_layout->addLayout(top_layout); 243 right_layout->addLayout(top_layout);
244 right_layout->addWidget(m_node_desc);
245 right_layout->addWidget(m_inst_desc);
246 right_layout->addWidget(m_desc);
231 if(raw_val_layout) 247 if(raw_val_layout)
232 right_layout->addLayout(raw_val_layout); 248 right_layout->addLayout(raw_val_layout);
233 right_layout->addWidget(m_sexy_display2); 249 right_layout->addWidget(m_sexy_display2);
@@ -252,8 +268,10 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S
252 268
253 connect(m_raw_val_edit->GetLineEdit(), SIGNAL(returnPressed()), this, 269 connect(m_raw_val_edit->GetLineEdit(), SIGNAL(returnPressed()), this,
254 SLOT(OnRawRegValueReturnPressed())); 270 SLOT(OnRawRegValueReturnPressed()));
255 connect(m_value_table->model(), SIGNAL(OnValueModified(int)), this, 271 connect(m_value_model, SIGNAL(OnValueModified(int)), this,
256 SLOT(OnRegValueChanged(int))); 272 SLOT(OnRegValueChanged(int)));
273 connect(m_sexy_display2, SIGNAL(clicked(const QModelIndex&)), this,
274 SLOT(OnRegFieldActivated(const QModelIndex&)));
257} 275}
258 276
259RegDisplayPanel::~RegDisplayPanel() 277RegDisplayPanel::~RegDisplayPanel()
@@ -263,12 +281,9 @@ RegDisplayPanel::~RegDisplayPanel()
263 281
264void RegDisplayPanel::Reload() 282void RegDisplayPanel::Reload()
265{ 283{
266 const soc_dev_addr_t& dev_addr = m_reg.GetDevAddr();
267 const soc_reg_t& reg = m_reg.GetReg();
268 const soc_reg_addr_t& reg_addr = m_reg.GetRegAddr();
269 soc_word_t value; 284 soc_word_t value;
270 BackendHelper helper(m_io_backend, m_reg); 285 BackendHelper helper(m_io_backend, m_node.soc());
271 bool has_value = helper.ReadRegister(dev_addr.name.c_str(), reg_addr.name.c_str(), value); 286 bool has_value = helper.ReadRegister(m_node, value);
272 287
273 if(has_value) 288 if(has_value)
274 { 289 {
@@ -296,7 +311,6 @@ void RegDisplayPanel::AllowWrite(bool en)
296 m_raw_val_edit->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write); 311 m_raw_val_edit->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write);
297 m_value_model->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write); 312 m_value_model->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write);
298 } 313 }
299 Reload();
300} 314}
301 315
302IoBackend::WriteMode RegDisplayPanel::EditModeToWriteMode(RegLineEdit::EditMode mode) 316IoBackend::WriteMode RegDisplayPanel::EditModeToWriteMode(RegLineEdit::EditMode mode)
@@ -320,9 +334,8 @@ void RegDisplayPanel::OnRawRegValueReturnPressed()
320 if(state != QValidator::Acceptable) 334 if(state != QValidator::Acceptable)
321 return; 335 return;
322 IoBackend::WriteMode mode = EditModeToWriteMode(m_raw_val_edit->GetMode()); 336 IoBackend::WriteMode mode = EditModeToWriteMode(m_raw_val_edit->GetMode());
323 BackendHelper helper(m_io_backend, m_reg); 337 BackendHelper helper(m_io_backend, m_node.soc());
324 helper.WriteRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(), 338 helper.WriteRegister(m_node, val, mode);
325 val, mode);
326 // register write can change all fields 339 // register write can change all fields
327 Reload(); 340 Reload();
328} 341}
@@ -332,13 +345,17 @@ void RegDisplayPanel::OnRegValueChanged(int index)
332 QVariant var = m_value_model->GetValue(index); 345 QVariant var = m_value_model->GetValue(index);
333 if(!var.isValid()) 346 if(!var.isValid())
334 return; 347 return;
335 BackendHelper helper(m_io_backend, m_reg); 348 BackendHelper helper(m_io_backend, m_node.soc());
336 helper.WriteRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(), 349 helper.WriteRegister(m_node, var.value< soc_word_t >(), IoBackend::Write);
337 var.value< soc_word_t >(), IoBackend::Write);
338 // register write can change all fields 350 // register write can change all fields
339 Reload(); 351 Reload();
340} 352}
341 353
354void RegDisplayPanel::OnRegFieldActivated(const QModelIndex& index)
355{
356 Q_UNUSED(index);
357}
358
342QWidget *RegDisplayPanel::GetWidget() 359QWidget *RegDisplayPanel::GetWidget()
343{ 360{
344 return this; 361 return this;