2025-04-30 20:21:57 +02:00
|
|
|
#include "devicesmodel.h"
|
2024-10-11 09:43:29 +02:00
|
|
|
|
|
|
|
|
#include <QDebug>
|
|
|
|
|
#include <QBrush>
|
2024-10-22 16:04:08 +02:00
|
|
|
#include <QJsonDocument>
|
2024-10-11 09:43:29 +02:00
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
#include "deviceconnection.h"
|
2024-10-22 16:04:08 +02:00
|
|
|
#include "flottenupdatersettings.h"
|
2024-10-11 09:43:29 +02:00
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
enum {
|
|
|
|
|
ColumnSerial,
|
|
|
|
|
ColumnWsStatus,
|
|
|
|
|
ColumnStatus,
|
|
|
|
|
ColumnVariant,
|
|
|
|
|
ColumnIsGo,
|
|
|
|
|
ColumnIsAustralien,
|
|
|
|
|
ColumnResetCard,
|
|
|
|
|
ColumnConnectedWifi,
|
|
|
|
|
ColumnProject,
|
|
|
|
|
ColumnVersion,
|
|
|
|
|
ColumnIdfVersion,
|
|
|
|
|
ColumnUpdate,
|
|
|
|
|
ColumnReboots,
|
|
|
|
|
ColumnUptime,
|
|
|
|
|
ColumnCurrentPartition,
|
|
|
|
|
ColumnCarState,
|
|
|
|
|
ColumnEnergy,
|
|
|
|
|
ColumnLivedata,
|
|
|
|
|
NumberOfColumns
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
DevicesModel::DevicesModel(FlottenUpdaterSettings &settings, const QSslKey &key,
|
2024-10-22 16:04:08 +02:00
|
|
|
const QSslCertificate &cert, QObject *parent) :
|
2024-10-11 09:43:29 +02:00
|
|
|
QAbstractTableModel{parent},
|
2024-10-22 16:04:08 +02:00
|
|
|
m_settings{settings},
|
2024-10-11 09:43:29 +02:00
|
|
|
m_key{key},
|
2024-10-22 16:04:08 +02:00
|
|
|
m_cert{cert},
|
|
|
|
|
m_customColumns{settings.customColumns()}
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
constexpr const char *serials[] {
|
|
|
|
|
"096850", "10000003",
|
|
|
|
|
"000010", "000011", "000012", "000013", "000014", "000015", "000016", "000017", "000018", "000019", "000020", "000021", "000022", "000023", "000024", "000025", "000026", "000027", "000028", "000029",
|
|
|
|
|
"000030", "000031", "000032", "000033", "000034", "000035", "000036", "000037", "000038", "000039",
|
|
|
|
|
"999900", "999901", "999902", "999903", "999904", "999905", "999906", "999907", "999908", "999909",
|
|
|
|
|
"999910", "999911", "999912", "999913", "999914", "00999915", "00999916", "00999917", "00999918", "00999919",
|
|
|
|
|
"999920", "00999921", "00999922", "999923", "00999924", "00999925", "999926", "999927", "999928", "999929",
|
|
|
|
|
"91000286",
|
|
|
|
|
"31416778", "31416779", "31416780", "31416781", "31416783", "31416784", "31416786", "31416787", "31416788", "31416789", "31416790", "31416791", "31416793", "31416794", "31416795", "31416796", "31416797", "31416798", "31416799", "31416800", "31416801", "31416802", "31416803", "31416804", "31416806", "31416807", "31416808", "31416809", "31416810", "31416811", "31416814", "31416815", "31416816", "31416817", "31416818", "31416819",
|
|
|
|
|
"91000001", "91000002", "91000003", "91000004", "91000005", "91000006", "91000007", "91000008", "91000009", "91000010", "91000011", "91000012", "91000013", "91000014", "91000015", "91000016", "91000017", "91000018", "91000019", "91000020", "91000021", "91000022", "91000023", "91000024", "91000025", "91000026", "91000027", "91000028", "91000029", "91000030", "91000031", "91000032", "91000033", "91000034", "91000035", "91000036", "91000037", "91000038", "91000039", "91000040",
|
|
|
|
|
"000043", "000044", "000047", "000050", "900001", "900103", "900104", "900105", "900107", "900108", "900113", "900117", "900118", "900123", "900126", "900127",
|
|
|
|
|
"91028339", "91028457", "91028482", "91028368", "91028336", "91028374", "91028371", "91028452", "91028481", "91028455", "91028334", "91028456", "91028351", "91028367", "91028346", "91028459", "91028366", "91028335", "91028483", "91028372", "91028337", "91028338",
|
|
|
|
|
"91008954", "91008978", "91008282", "91009008", "91008953", "91009000", "91009024", "91048840", "91048873", "91045590", "91045593", "91045586", "91048874", "91048879", "91048882", "91048878", "91048860", "91048865", "91048853", "91048864", "91048867", "91021261", "91021260", "91021379", "91021135", "91021266", "91021259", "91021374", "91021381", "91021258", "91021275", "91021380", "91021382", "91021377", "91021240", "91021371", "91021376", "91021255", "91021378", "91021383", "91021354", "91021195", "91021370", "91021278", "91021234", "91021256", "91021257", "91021360", "91021248", "91021363", "91021270", "91021267", "91021239", "91021193", "91021268", "91028339", "91028457", "91028482", "91028368", "91036167", "91028374", "91028371", "91028452", "91028481", "91028455", "91028334", "91028456", "91028351", "91028367", "91028346", "91028459", "91028366", "91028335", "91028483", "91028372", "91028337", "91028338",
|
2025-04-30 20:21:57 +02:00
|
|
|
"91100000", "91100001", "91100002", "91100003", "91100004", "91100005", "91100006", "91100007", "91100008", "91100009", "91100010", "91100011", "91100012", "91100013", "91100014", "91100015", "91100016", "91100017", "91100018", "91100019", "91100020", "91100021", "91100022", "91100023", "91100024", "91100025", "91100026", "91100027", "91100028", "91100029", "91100030", "91100031",
|
|
|
|
|
"402557",
|
|
|
|
|
"402558",
|
|
|
|
|
"402564",
|
|
|
|
|
"402567",
|
|
|
|
|
"402577",
|
2024-10-11 09:43:29 +02:00
|
|
|
};
|
|
|
|
|
for (const auto &serial : serials)
|
|
|
|
|
{
|
2025-04-30 20:21:57 +02:00
|
|
|
if (std::none_of(std::cbegin(m_devices), std::cend(m_devices), [&serial](auto &ptr){
|
2024-10-11 09:43:29 +02:00
|
|
|
return ptr->serial() == serial;
|
|
|
|
|
}))
|
2025-04-30 20:21:57 +02:00
|
|
|
m_devices.emplace_back(std::make_shared<DevicesConnection>(m_key, m_cert, serial, this));
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
DevicesModel::~DevicesModel() = default;
|
2024-10-11 09:43:29 +02:00
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
int DevicesModel::rowCount(const QModelIndex &parent) const
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
2025-04-30 20:21:57 +02:00
|
|
|
return m_devices.size();
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
int DevicesModel::columnCount(const QModelIndex &parent) const
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
2024-10-22 16:04:08 +02:00
|
|
|
return NumberOfColumns + m_customColumns.size();
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
QVariant DevicesModel::data(const QModelIndex &index, int role) const
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
2025-04-30 20:21:57 +02:00
|
|
|
if (index.row() < 0 || index.row() >= m_devices.size())
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
qWarning() << "row out of bounds";
|
|
|
|
|
return {};
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
const DevicesConnection &device = **std::next(std::begin(m_devices), index.row());
|
2024-10-11 09:43:29 +02:00
|
|
|
|
|
|
|
|
switch (index.column())
|
|
|
|
|
{
|
|
|
|
|
case ColumnSerial:
|
|
|
|
|
switch (role)
|
|
|
|
|
{
|
|
|
|
|
case Qt::DisplayRole:
|
|
|
|
|
case Qt::EditRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.serial();
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
return {};
|
|
|
|
|
case ColumnWsStatus:
|
|
|
|
|
switch (role)
|
|
|
|
|
{
|
|
|
|
|
case Qt::DisplayRole:
|
|
|
|
|
case Qt::EditRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.wsStatusText();
|
2024-10-11 09:43:29 +02:00
|
|
|
case Qt::BackgroundRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.wsStatusBackground();
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
return {};
|
|
|
|
|
case ColumnStatus:
|
|
|
|
|
switch (role)
|
|
|
|
|
{
|
|
|
|
|
case Qt::DisplayRole:
|
|
|
|
|
case Qt::EditRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.statusText();
|
2024-10-11 09:43:29 +02:00
|
|
|
case Qt::BackgroundRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.statusBackground();
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
return {};
|
|
|
|
|
case ColumnVariant:
|
|
|
|
|
switch (role)
|
|
|
|
|
{
|
|
|
|
|
case Qt::DisplayRole:
|
|
|
|
|
case Qt::EditRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.variantText();
|
2024-10-11 09:43:29 +02:00
|
|
|
case Qt::BackgroundRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.variantBackground();
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
return {};
|
|
|
|
|
case ColumnIsGo:
|
|
|
|
|
switch (role)
|
|
|
|
|
{
|
|
|
|
|
case Qt::DisplayRole:
|
|
|
|
|
case Qt::EditRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.isGoText();
|
2024-10-11 09:43:29 +02:00
|
|
|
case Qt::BackgroundRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.isGoBackground();
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
return {};
|
|
|
|
|
case ColumnIsAustralien:
|
|
|
|
|
switch (role)
|
|
|
|
|
{
|
|
|
|
|
case Qt::DisplayRole:
|
|
|
|
|
case Qt::EditRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.isAustralienText();
|
2024-10-11 09:43:29 +02:00
|
|
|
case Qt::BackgroundRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.isAustralienBackground();
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
return {};
|
|
|
|
|
case ColumnResetCard:
|
|
|
|
|
switch (role)
|
|
|
|
|
{
|
|
|
|
|
case Qt::DisplayRole:
|
|
|
|
|
case Qt::EditRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.resetCardText();
|
2024-10-11 09:43:29 +02:00
|
|
|
case Qt::BackgroundRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.resetCardBackground();
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
return {};
|
|
|
|
|
case ColumnConnectedWifi:
|
|
|
|
|
switch (role)
|
|
|
|
|
{
|
|
|
|
|
case Qt::DisplayRole:
|
|
|
|
|
case Qt::EditRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.connectedWifiText();
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
return {};
|
|
|
|
|
case ColumnProject:
|
|
|
|
|
switch (role)
|
|
|
|
|
{
|
|
|
|
|
case Qt::DisplayRole:
|
|
|
|
|
case Qt::EditRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.projectText();
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
return {};
|
|
|
|
|
case ColumnVersion:
|
|
|
|
|
switch (role)
|
|
|
|
|
{
|
|
|
|
|
case Qt::DisplayRole:
|
|
|
|
|
case Qt::EditRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.versionText();
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
return {};
|
|
|
|
|
case ColumnIdfVersion:
|
|
|
|
|
switch (role)
|
|
|
|
|
{
|
|
|
|
|
case Qt::DisplayRole:
|
|
|
|
|
case Qt::EditRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.idfVersionText();
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
return {};
|
|
|
|
|
case ColumnUpdate:
|
|
|
|
|
switch (role)
|
|
|
|
|
{
|
|
|
|
|
case Qt::DisplayRole:
|
|
|
|
|
case Qt::EditRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.updateText();
|
2024-10-11 09:43:29 +02:00
|
|
|
case Qt::BackgroundRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.updateBackground();
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
return {};
|
|
|
|
|
case ColumnUptime:
|
|
|
|
|
switch (role)
|
|
|
|
|
{
|
|
|
|
|
case Qt::DisplayRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.uptimeText();
|
2024-10-11 09:43:29 +02:00
|
|
|
case Qt::EditRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
if (const auto uptime = device.uptime(); uptime)
|
2024-10-11 09:43:29 +02:00
|
|
|
return *uptime;
|
|
|
|
|
}
|
|
|
|
|
return {};
|
|
|
|
|
case ColumnCurrentPartition:
|
|
|
|
|
switch (role)
|
|
|
|
|
{
|
|
|
|
|
case Qt::DisplayRole:
|
|
|
|
|
case Qt::EditRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.currentPartition();
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
return {};
|
|
|
|
|
case ColumnReboots:
|
|
|
|
|
switch (role)
|
|
|
|
|
{
|
|
|
|
|
case Qt::DisplayRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.rebootsText();
|
2024-10-11 09:43:29 +02:00
|
|
|
case Qt::EditRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
if (const auto reboots = device.reboots(); reboots)
|
2024-10-11 09:43:29 +02:00
|
|
|
return *reboots;
|
|
|
|
|
}
|
|
|
|
|
return {};
|
|
|
|
|
case ColumnCarState:
|
|
|
|
|
switch (role)
|
|
|
|
|
{
|
|
|
|
|
case Qt::DisplayRole:
|
|
|
|
|
case Qt::EditRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.carStateText();
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
return {};
|
|
|
|
|
case ColumnEnergy:
|
|
|
|
|
switch (role)
|
|
|
|
|
{
|
|
|
|
|
case Qt::DisplayRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.energyText();
|
2024-10-11 09:43:29 +02:00
|
|
|
case Qt::EditRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
if (const auto energy = device.energy(); energy)
|
2024-10-11 09:43:29 +02:00
|
|
|
return *energy;
|
|
|
|
|
}
|
|
|
|
|
return {};
|
|
|
|
|
case ColumnLivedata:
|
|
|
|
|
switch (role)
|
|
|
|
|
{
|
|
|
|
|
case Qt::DisplayRole:
|
|
|
|
|
case Qt::EditRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.livedataText();
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
return {};
|
|
|
|
|
}
|
2024-10-22 16:04:08 +02:00
|
|
|
|
|
|
|
|
if (index.column() >= NumberOfColumns && index.column() - NumberOfColumns < m_customColumns.size())
|
|
|
|
|
switch (role)
|
|
|
|
|
{
|
|
|
|
|
case Qt::DisplayRole:
|
|
|
|
|
{
|
2025-04-30 20:21:57 +02:00
|
|
|
auto variant = device.getApiKey(m_customColumns.at(index.column() - NumberOfColumns));
|
2024-10-22 16:04:08 +02:00
|
|
|
auto str = variant.toString();
|
|
|
|
|
if (str.isEmpty())
|
|
|
|
|
str = QJsonDocument::fromVariant(variant).toJson(QJsonDocument::Compact);
|
|
|
|
|
return str;
|
|
|
|
|
}
|
|
|
|
|
case Qt::EditRole:
|
2025-04-30 20:21:57 +02:00
|
|
|
return device.getApiKey(m_customColumns.at(index.column() - NumberOfColumns));
|
2024-10-22 16:04:08 +02:00
|
|
|
}
|
|
|
|
|
|
2024-10-11 09:43:29 +02:00
|
|
|
return {};
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
QVariant DevicesModel::headerData(int section, Qt::Orientation orientation, int role) const
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
if (role != Qt::DisplayRole && role != Qt::EditRole)
|
|
|
|
|
return {};
|
|
|
|
|
|
|
|
|
|
switch (orientation)
|
|
|
|
|
{
|
|
|
|
|
case Qt::Horizontal:
|
|
|
|
|
switch (section)
|
|
|
|
|
{
|
|
|
|
|
case ColumnSerial: return tr("Serial");
|
|
|
|
|
case ColumnWsStatus: return tr("WS Status");
|
|
|
|
|
case ColumnStatus: return tr("Status");
|
|
|
|
|
case ColumnVariant: return tr("Variant");
|
|
|
|
|
case ColumnIsGo: return tr("IsGo");
|
|
|
|
|
case ColumnIsAustralien: return tr("IsAustralien");
|
|
|
|
|
case ColumnResetCard: return tr("ResetCard");
|
|
|
|
|
case ColumnConnectedWifi: return tr("ConnectedWifi");
|
|
|
|
|
case ColumnProject: return tr("Project");
|
|
|
|
|
case ColumnVersion: return tr("Version");
|
|
|
|
|
case ColumnIdfVersion: return tr("IDF Version");
|
|
|
|
|
case ColumnUpdate: return tr("Update");
|
|
|
|
|
case ColumnReboots: return tr("Reboots");
|
|
|
|
|
case ColumnUptime: return tr("Uptime");
|
|
|
|
|
case ColumnCurrentPartition: return tr("Current Partition");
|
|
|
|
|
case ColumnCarState: return tr("Car state");
|
|
|
|
|
case ColumnEnergy: return tr("Energy");
|
|
|
|
|
case ColumnLivedata: return tr("Livedata");
|
|
|
|
|
}
|
2024-10-22 16:04:08 +02:00
|
|
|
|
|
|
|
|
if (section >= NumberOfColumns && section - NumberOfColumns < m_customColumns.size())
|
|
|
|
|
return m_customColumns[section - NumberOfColumns];
|
|
|
|
|
|
2024-10-11 09:43:29 +02:00
|
|
|
return {};
|
|
|
|
|
}
|
2024-10-22 16:04:08 +02:00
|
|
|
|
|
|
|
|
return {};
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
bool DevicesModel::removeRows(int row, int count, const QModelIndex &parent)
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
2025-04-30 20:21:57 +02:00
|
|
|
if (row < 0 || std::size_t(row) >= m_devices.size())
|
|
|
|
|
{
|
|
|
|
|
qWarning() << "unexpected row" << row;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2024-10-11 09:43:29 +02:00
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
if (count < 0 || std::size_t(count) > m_devices.size() - row)
|
|
|
|
|
{
|
|
|
|
|
qWarning() << "unexpected row+count" << count << row;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
beginRemoveRows({}, row, row + count - 1);
|
|
|
|
|
auto begin = std::next(std::begin(m_devices), row);
|
|
|
|
|
auto end = std::next(begin, count);
|
|
|
|
|
m_devices.erase(begin, end);
|
|
|
|
|
endRemoveRows();
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DevicesModel::addClient(const QString &serial)
|
|
|
|
|
{
|
|
|
|
|
beginInsertRows({}, m_devices.size(), m_devices.size());
|
|
|
|
|
|
|
|
|
|
auto clientPtr = std::make_shared<DevicesConnection>(m_key, m_cert, serial, this);
|
2024-10-11 09:43:29 +02:00
|
|
|
auto client = clientPtr.get();
|
2025-04-30 20:21:57 +02:00
|
|
|
m_devices.emplace_back(std::move(clientPtr));
|
2024-10-11 09:43:29 +02:00
|
|
|
|
|
|
|
|
endInsertRows();
|
|
|
|
|
|
|
|
|
|
client->start();
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
std::shared_ptr<DevicesConnection> DevicesModel::getDevice(QModelIndex index)
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
Q_ASSERT(!index.parent().isValid());
|
2025-04-30 20:21:57 +02:00
|
|
|
Q_ASSERT(index.row() >= 0 && index.row() < m_devices.size());
|
|
|
|
|
auto device = m_devices.at(index.row());
|
|
|
|
|
Q_ASSERT(device);
|
|
|
|
|
return device;
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
std::shared_ptr<const DevicesConnection> DevicesModel::getDevice(QModelIndex index) const
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
Q_ASSERT(!index.parent().isValid());
|
2025-04-30 20:21:57 +02:00
|
|
|
return m_devices.at(index.row());
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::addCustomColumn(const QString &apiKey)
|
2024-10-22 16:04:08 +02:00
|
|
|
{
|
|
|
|
|
beginInsertColumns({}, NumberOfColumns + m_customColumns.size(), NumberOfColumns + m_customColumns.size());
|
|
|
|
|
m_customColumns.push_back(apiKey);
|
|
|
|
|
endInsertColumns();
|
|
|
|
|
m_settings.setCustomColumns(m_customColumns);
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
bool DevicesModel::customColumnRemovable(int section)
|
2024-10-22 16:04:08 +02:00
|
|
|
{
|
|
|
|
|
return section >= NumberOfColumns && section - NumberOfColumns < m_customColumns.size();
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::removeCustomColumn(int section)
|
2024-10-22 16:04:08 +02:00
|
|
|
{
|
|
|
|
|
if (section < NumberOfColumns || section - NumberOfColumns >= m_customColumns.size())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
beginRemoveColumns({}, section, section);
|
|
|
|
|
m_customColumns.erase(std::next(std::begin(m_customColumns), section - NumberOfColumns));
|
|
|
|
|
endRemoveColumns();
|
|
|
|
|
m_settings.setCustomColumns(m_customColumns);
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::connectAll()
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
2025-04-30 20:21:57 +02:00
|
|
|
for (auto &device : m_devices)
|
|
|
|
|
device->start();
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::disconnectAll()
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
2025-04-30 20:21:57 +02:00
|
|
|
for (auto &device : m_devices)
|
|
|
|
|
device->stop();
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::wsStatusChanged()
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
columnChanged(ColumnWsStatus, {Qt::DisplayRole, Qt::EditRole, Qt::BackgroundRole});
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::statusChanged()
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
columnChanged(ColumnStatus, {Qt::DisplayRole, Qt::EditRole, Qt::BackgroundRole});
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::variantChanged()
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
columnChanged(ColumnVariant, {Qt::DisplayRole, Qt::EditRole, Qt::BackgroundRole});
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::isGoChanged()
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
columnChanged(ColumnIsGo, {Qt::DisplayRole, Qt::EditRole, Qt::BackgroundRole});
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::isAustralienChanged()
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
columnChanged(ColumnIsAustralien, {Qt::DisplayRole, Qt::EditRole, Qt::BackgroundRole});
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::resetCardChanged()
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
columnChanged(ColumnResetCard, {Qt::DisplayRole, Qt::EditRole, Qt::BackgroundRole});
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::connectedWifiChanged()
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
columnChanged(ColumnConnectedWifi, {Qt::DisplayRole, Qt::EditRole});
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::projectChanged()
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
columnChanged(ColumnProject, {Qt::DisplayRole, Qt::EditRole});
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::versionChanged()
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
columnChanged(ColumnVersion, {Qt::DisplayRole, Qt::EditRole});
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::idfVersionChanged()
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
columnChanged(ColumnIdfVersion, {Qt::DisplayRole, Qt::EditRole});
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::updateChanged()
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
columnChanged(ColumnUpdate, {Qt::DisplayRole, Qt::EditRole, Qt::BackgroundRole});
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::uptimeChanged()
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
columnChanged(ColumnUptime, {Qt::DisplayRole, Qt::EditRole});
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::currentPartitionChanged()
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
columnChanged(ColumnCurrentPartition, {Qt::DisplayRole, Qt::EditRole});
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::rebootsChanged()
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
columnChanged(ColumnReboots, {Qt::DisplayRole, Qt::EditRole});
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::carStateChanged()
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
columnChanged(ColumnCarState, {Qt::DisplayRole, Qt::EditRole});
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::energyChanged()
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
columnChanged(ColumnEnergy, {Qt::DisplayRole, Qt::EditRole});
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::livedataChanged()
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
columnChanged(ColumnLivedata, {Qt::DisplayRole, Qt::EditRole});
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::apiKeyChanged(const QString &apiKey)
|
2024-10-22 16:04:08 +02:00
|
|
|
{
|
|
|
|
|
for (auto iter = std::cbegin(m_customColumns); iter != std::cend(m_customColumns); iter++)
|
|
|
|
|
if (*iter == apiKey)
|
|
|
|
|
columnChanged(NumberOfColumns + std::distance(std::cbegin(m_customColumns), iter), {Qt::DisplayRole, Qt::EditRole});
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
void DevicesModel::columnChanged(int column, const QList<int> &roles)
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
2025-04-30 20:21:57 +02:00
|
|
|
auto device = qobject_cast<DevicesConnection*>(sender());
|
|
|
|
|
if (!device)
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
|
|
|
|
qWarning() << "unknown sender" << sender();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
auto iter = std::find_if(std::cbegin(m_devices), std::cend(m_devices), [&device](const std::shared_ptr<DevicesConnection> &ptr){ return device == ptr.get(); });
|
|
|
|
|
if (iter == std::cend(m_devices))
|
2024-10-11 09:43:29 +02:00
|
|
|
{
|
2025-04-30 20:21:57 +02:00
|
|
|
qWarning() << "unknown sender" << device;
|
|
|
|
|
for (const auto &device : m_devices)
|
|
|
|
|
qDebug() << device.get();
|
2024-10-11 09:43:29 +02:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 20:21:57 +02:00
|
|
|
auto row = std::distance(std::cbegin(m_devices), iter);
|
2024-10-11 09:43:29 +02:00
|
|
|
|
|
|
|
|
auto index = createIndex(row, column);
|
2024-10-22 16:04:08 +02:00
|
|
|
emit dataChanged(index, index, roles);
|
2024-10-11 09:43:29 +02:00
|
|
|
}
|