2022-03-14 18:28:46 -05:00
|
|
|
#include "SeerArrayWidget.h"
|
|
|
|
|
#include "SeerUtl.h"
|
|
|
|
|
#include <QtWidgets/QHeaderView>
|
|
|
|
|
#include <QtCore/QDebug>
|
|
|
|
|
#include <stdexcept>
|
|
|
|
|
|
|
|
|
|
SeerArrayWidget::SeerArrayWidget(QWidget* parent) : QTableWidget(parent), _pdata(NULL) {
|
|
|
|
|
|
|
|
|
|
QFont font;
|
|
|
|
|
font.setFamily("monospace [Consolas]");
|
|
|
|
|
font.setFixedPitch(true);
|
|
|
|
|
font.setStyleHint(QFont::TypeWriter);
|
|
|
|
|
|
|
|
|
|
setFont(font);
|
|
|
|
|
setFocusPolicy(Qt::StrongFocus);
|
|
|
|
|
setEditTriggers(QAbstractItemView::NoEditTriggers);
|
|
|
|
|
horizontalHeader()->setDefaultAlignment(Qt::AlignRight);
|
|
|
|
|
|
|
|
|
|
_arrayMode = SeerArrayWidget::UnknownArrayMode;
|
|
|
|
|
_addressOffset = 0;
|
|
|
|
|
|
|
|
|
|
setElementsPerLine(1);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SeerArrayWidget::~SeerArrayWidget() {
|
|
|
|
|
|
|
|
|
|
if (_pdata) {
|
|
|
|
|
delete _pdata;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SeerArrayWidget::setElementsPerLine (int count) {
|
|
|
|
|
|
|
|
|
|
_elementsPerLine = count;
|
|
|
|
|
|
|
|
|
|
// Repaint the widget.
|
|
|
|
|
create();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int SeerArrayWidget::elementsPerLine () const {
|
|
|
|
|
return _elementsPerLine;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SeerArrayWidget::setAddressOffset (unsigned long offset) {
|
|
|
|
|
|
|
|
|
|
_addressOffset = offset;
|
|
|
|
|
|
|
|
|
|
// Repaint the widget.
|
|
|
|
|
create();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
unsigned long SeerArrayWidget::addressOffset () const {
|
|
|
|
|
return _addressOffset;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
unsigned long SeerArrayWidget::size () const {
|
|
|
|
|
|
|
|
|
|
if (_pdata) {
|
|
|
|
|
return _pdata->size();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
unsigned long SeerArrayWidget::elementSize () const {
|
|
|
|
|
|
|
|
|
|
if (arrayMode() == SeerArrayWidget::Int16ArrayMode) {
|
|
|
|
|
return 2;
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::UInt16ArrayMode) {
|
|
|
|
|
return 2;
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::Int32ArrayMode) {
|
|
|
|
|
return 4;
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::UInt32ArrayMode) {
|
|
|
|
|
return 4;
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::Int64ArrayMode) {
|
|
|
|
|
return 8;
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::UInt64ArrayMode) {
|
|
|
|
|
return 8;
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::Float32ArrayMode) {
|
|
|
|
|
return 4;
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::Float64ArrayMode) {
|
|
|
|
|
return 8;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SeerArrayWidget::setArrayMode (SeerArrayWidget::ArrayMode arrayMode) {
|
|
|
|
|
|
|
|
|
|
_arrayMode = arrayMode;
|
|
|
|
|
|
|
|
|
|
// This repaints the widget with the new array mode
|
|
|
|
|
setElementsPerLine(elementsPerLine());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SeerArrayWidget::ArrayMode SeerArrayWidget::arrayMode () const {
|
|
|
|
|
return _arrayMode;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString SeerArrayWidget::arrayModeString () const {
|
|
|
|
|
|
|
|
|
|
if (arrayMode() == SeerArrayWidget::Int16ArrayMode) {
|
|
|
|
|
return "int6";
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::UInt16ArrayMode) {
|
|
|
|
|
return "uint16";
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::Int32ArrayMode) {
|
|
|
|
|
return "int32";
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::UInt32ArrayMode) {
|
|
|
|
|
return "uint32";
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::Int64ArrayMode) {
|
|
|
|
|
return "int64";
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::UInt64ArrayMode) {
|
|
|
|
|
return "uint64";
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::Float32ArrayMode) {
|
|
|
|
|
return "float32";
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::Float64ArrayMode) {
|
|
|
|
|
return "float64";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return "???";
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-19 15:49:40 -05:00
|
|
|
const QVector<double>& SeerArrayWidget::arrayValues () const {
|
|
|
|
|
|
|
|
|
|
return _arrayValues;
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-14 18:28:46 -05:00
|
|
|
void SeerArrayWidget::setData(SeerArrayWidget::DataStorage* pData) {
|
|
|
|
|
|
|
|
|
|
if (_pdata) {
|
|
|
|
|
delete _pdata;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_pdata = pData;
|
|
|
|
|
|
|
|
|
|
// Repaint the widget.
|
|
|
|
|
create();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SeerArrayWidget::create () {
|
|
|
|
|
|
|
|
|
|
// Clear the table. We're going to recreate it.
|
|
|
|
|
clear();
|
|
|
|
|
setRowCount(0);
|
|
|
|
|
setColumnCount(elementsPerLine());
|
|
|
|
|
|
2022-03-19 15:49:40 -05:00
|
|
|
// Clear the values.
|
|
|
|
|
_arrayValues.resize(0);
|
|
|
|
|
|
2022-03-14 18:28:46 -05:00
|
|
|
// If there's no data, do nothing.
|
|
|
|
|
if (!_pdata) {
|
2022-03-19 15:49:40 -05:00
|
|
|
emit dataChanged();
|
2022-03-14 18:28:46 -05:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (elementSize() < 1) {
|
2022-03-19 15:49:40 -05:00
|
|
|
emit dataChanged();
|
2022-03-14 18:28:46 -05:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int row = 0;
|
|
|
|
|
int col = 0;
|
|
|
|
|
|
|
|
|
|
for (int i=0; i<_pdata->size(); i+=elementSize()) {
|
|
|
|
|
|
|
|
|
|
// Add new row if we need to.
|
|
|
|
|
if (row == rowCount()) {
|
|
|
|
|
insertRow(rowCount());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QTableWidgetItem* item = new QTableWidgetItem;
|
|
|
|
|
item->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
|
|
|
|
|
|
|
|
|
|
QByteArray element = _pdata->getData(i, elementSize());
|
|
|
|
|
|
|
|
|
|
QByteArray hex = element.toHex();
|
2022-03-19 15:49:40 -05:00
|
|
|
double val = 0.0;
|
2022-03-14 18:28:46 -05:00
|
|
|
|
|
|
|
|
if (arrayMode() == SeerArrayWidget::Int16ArrayMode) {
|
|
|
|
|
|
|
|
|
|
short v = *reinterpret_cast<short*>(element.data());
|
|
|
|
|
|
2022-03-19 15:49:40 -05:00
|
|
|
val = v;
|
|
|
|
|
|
2022-03-14 18:28:46 -05:00
|
|
|
item->setText(QString::number(v));
|
|
|
|
|
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::UInt16ArrayMode) {
|
|
|
|
|
|
|
|
|
|
unsigned short v = *reinterpret_cast<unsigned short*>(element.data());
|
|
|
|
|
|
2022-03-19 15:49:40 -05:00
|
|
|
val = v;
|
|
|
|
|
|
2022-03-14 18:28:46 -05:00
|
|
|
item->setText(QString::number(v));
|
|
|
|
|
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::Int32ArrayMode) {
|
|
|
|
|
|
|
|
|
|
int v = *reinterpret_cast<int*>(element.data());
|
|
|
|
|
|
2022-03-19 15:49:40 -05:00
|
|
|
val = v;
|
|
|
|
|
|
2022-03-14 18:28:46 -05:00
|
|
|
item->setText(QString::number(v));
|
|
|
|
|
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::UInt32ArrayMode) {
|
|
|
|
|
|
|
|
|
|
unsigned int v = *reinterpret_cast<unsigned int*>(element.data());
|
|
|
|
|
|
2022-03-19 15:49:40 -05:00
|
|
|
val = v;
|
|
|
|
|
|
2022-03-14 18:28:46 -05:00
|
|
|
item->setText(QString::number(v));
|
|
|
|
|
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::Int64ArrayMode) {
|
|
|
|
|
|
|
|
|
|
long v = *reinterpret_cast<long*>(element.data());
|
|
|
|
|
|
2022-03-19 15:49:40 -05:00
|
|
|
val = v;
|
|
|
|
|
|
2022-03-14 18:28:46 -05:00
|
|
|
item->setText(QString::number(v));
|
|
|
|
|
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::UInt64ArrayMode) {
|
|
|
|
|
|
|
|
|
|
unsigned long v = *reinterpret_cast<unsigned long*>(element.data());
|
|
|
|
|
|
2022-03-19 15:49:40 -05:00
|
|
|
val = v;
|
|
|
|
|
|
2022-03-14 18:28:46 -05:00
|
|
|
item->setText(QString::number(v));
|
|
|
|
|
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::Float32ArrayMode) {
|
|
|
|
|
|
|
|
|
|
float v = *reinterpret_cast<float*>(element.data());
|
|
|
|
|
|
2022-03-19 15:49:40 -05:00
|
|
|
val = v;
|
|
|
|
|
|
2022-03-14 18:28:46 -05:00
|
|
|
item->setText(QString::number(v));
|
|
|
|
|
|
|
|
|
|
}else if (arrayMode() == SeerArrayWidget::Float64ArrayMode) {
|
|
|
|
|
|
|
|
|
|
double v = *reinterpret_cast<double*>(element.data());
|
|
|
|
|
|
2022-03-19 15:49:40 -05:00
|
|
|
val = v;
|
|
|
|
|
|
2022-03-14 18:28:46 -05:00
|
|
|
item->setText(QString::number(v));
|
2022-03-19 15:49:40 -05:00
|
|
|
|
|
|
|
|
}else{
|
|
|
|
|
qWarning() << "Unknown data type.";
|
|
|
|
|
|
|
|
|
|
val = 0.0;
|
2022-03-14 18:28:46 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setItem(row, col, item);
|
|
|
|
|
|
2022-03-19 15:49:40 -05:00
|
|
|
_arrayValues.push_back(val);
|
|
|
|
|
|
2022-03-14 18:28:46 -05:00
|
|
|
col++;
|
|
|
|
|
|
|
|
|
|
if (col >= elementsPerLine()) {
|
|
|
|
|
col = 0;
|
|
|
|
|
row++;
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-03-19 15:49:40 -05:00
|
|
|
|
|
|
|
|
emit dataChanged();
|
2022-03-14 18:28:46 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SeerArrayWidget::DataStorageArray::DataStorageArray(const QByteArray& arr) {
|
|
|
|
|
_data = arr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QByteArray SeerArrayWidget::DataStorageArray::getData(int position, int length) {
|
|
|
|
|
return _data.mid(position, length);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int SeerArrayWidget::DataStorageArray::size() {
|
|
|
|
|
return _data.count();
|
|
|
|
|
}
|
|
|
|
|
|