diff options
Diffstat (limited to 'utils/regtools/qeditor/regdisplaypanel.cpp')
-rw-r--r-- | utils/regtools/qeditor/regdisplaypanel.cpp | 157 |
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 | |||
29 | QWidget *RegItemEditorCreator::createWidget(QWidget * parent) const | ||
30 | { | ||
31 | return new RegLineEdit(parent); | ||
32 | } | ||
33 | |||
34 | QByteArray RegItemEditorCreator::valuePropertyName () const | ||
35 | { | ||
36 | return QByteArray("text"); | ||
37 | } | ||
38 | 25 | ||
39 | /** | 26 | /** |
40 | * SocDisplayPanel | 27 | * SocDisplayPanel |
41 | */ | 28 | */ |
42 | SocDisplayPanel::SocDisplayPanel(QWidget *parent, const SocRef& dev_ref) | 29 | SocDisplayPanel::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 | */ |
76 | DevDisplayPanel::DevDisplayPanel(QWidget *parent, const SocDevRef& dev_ref) | 66 | NodeDisplayPanel::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 | ||
117 | void DevDisplayPanel::AllowWrite(bool en) | 115 | void NodeDisplayPanel::AllowWrite(bool en) |
118 | { | 116 | { |
119 | Q_UNUSED(en); | 117 | Q_UNUSED(en); |
120 | } | 118 | } |
121 | 119 | ||
122 | QWidget *DevDisplayPanel::GetWidget() | 120 | QWidget *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 | ||
131 | RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const SocRegRef& reg_ref) | 129 | RegDisplayPanel::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 | ||
259 | RegDisplayPanel::~RegDisplayPanel() | 277 | RegDisplayPanel::~RegDisplayPanel() |
@@ -263,12 +281,9 @@ RegDisplayPanel::~RegDisplayPanel() | |||
263 | 281 | ||
264 | void RegDisplayPanel::Reload() | 282 | void 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 | ||
302 | IoBackend::WriteMode RegDisplayPanel::EditModeToWriteMode(RegLineEdit::EditMode mode) | 316 | IoBackend::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 | ||
354 | void RegDisplayPanel::OnRegFieldActivated(const QModelIndex& index) | ||
355 | { | ||
356 | Q_UNUSED(index); | ||
357 | } | ||
358 | |||
342 | QWidget *RegDisplayPanel::GetWidget() | 359 | QWidget *RegDisplayPanel::GetWidget() |
343 | { | 360 | { |
344 | return this; | 361 | return this; |