File indexing completed on 2024-05-12 04:41:10

0001 /* AtCore KDE Libary for 3D Printers
0002     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0003     SPDX-FileCopyrightText: 2019 Chris Rizzitello <rizzitello@kde.org>
0004     SPDX-FileCopyrightText: 2019 Lays Rodrigues <lays.rodrigues@kde.org>
0005 */
0006 
0007 #include "machineinfo.h"
0008 
0009 #include <QCoreApplication>
0010 #include <QLoggingCategory>
0011 
0012 Q_LOGGING_CATEGORY(MACHINE_INFO, "org.kde.atelier.core.machineInfo")
0013 
0014 const QMap<MachineInfo::KEY, MachineInfo::keyInfo> MachineInfo::decoderMap = {{KEY::NAME, {QStringLiteral("Name"), QStringLiteral("ProfileName")}},
0015                                                                               {KEY::BAUDRATE, {QStringLiteral("bps"), 115200}},
0016                                                                               {KEY::FIRMWARE, {QStringLiteral("firmware"), QStringLiteral("Auto-Detect")}},
0017                                                                               {KEY::MAXBEDTEMP, {QStringLiteral("maximumTemperatureBed"), 0}},
0018                                                                               {KEY::MAXEXTTEMP, {QStringLiteral("maximumTemperatureExtruder"), 0}},
0019                                                                               {KEY::POSTPAUSE, {QStringLiteral("postPause"), QString()}},
0020                                                                               {KEY::ISCARTESIAN, {QStringLiteral("isCartesian"), false}},
0021                                                                               {KEY::XMAX, {QStringLiteral("dimensionX"), 200}},
0022                                                                               {KEY::YMAX, {QStringLiteral("dimensionY"), 200}},
0023                                                                               {KEY::ZMAX, {QStringLiteral("dimensionZ"), 180}},
0024                                                                               {KEY::AUTOTEMPREPORT, {QStringLiteral("autoReportTemp"), false}}};
0025 
0026 MachineInfo *MachineInfo::instance()
0027 {
0028     static MachineInfo m;
0029     return &m;
0030 }
0031 
0032 MachineInfo::MachineInfo(QObject *parent)
0033     : QObject(parent)
0034     , m_settings(new QSettings(QSettings::IniFormat, QSettings::UserScope, QStringLiteral("atcore"), QStringLiteral("profiles"), this))
0035 {
0036 }
0037 
0038 QObject *MachineInfo::qmlSingletonRegister(QQmlEngine *engine, QJSEngine *scriptEngine)
0039 {
0040     Q_UNUSED(scriptEngine)
0041     engine->setObjectOwnership(instance(), QQmlEngine::CppOwnership);
0042     return instance();
0043 }
0044 
0045 QVariantMap MachineInfo::readProfile(const QString &profileName) const
0046 {
0047     m_settings->sync();
0048     m_settings->beginGroup(profileName);
0049     QVariantMap data {{decoderMap[KEY::NAME].name, m_settings->group()}};
0050     for (int i = 1; i < decoderMap.size(); i++) {
0051         data.insert(decoderMap[MachineInfo::KEY(i)].name, m_settings->value(decoderMap[MachineInfo::KEY(i)].name, decoderMap[MachineInfo::KEY(i)].defaultValue));
0052     }
0053     m_settings->endGroup();
0054     return data;
0055 }
0056 
0057 QVariant MachineInfo::readKey(const QString &profileName, MachineInfo::KEY key) const
0058 {
0059     if (profileName.isEmpty()) {
0060         return decoderMap[key].defaultValue;
0061     }
0062 
0063     if (key == KEY::NAME) {
0064         return profileName;
0065     }
0066 
0067     m_settings->sync();
0068     return m_settings->value(QStringLiteral("%1/%2").arg(profileName, decoderMap[key].name), decoderMap[key].defaultValue);
0069 }
0070 
0071 bool MachineInfo::storeKey(const QString &profileName, const MachineInfo::KEY key, const QVariant &value) const
0072 {
0073     if (key == KEY::NAME) {
0074         // copyProfile Q_EMITs profilesChanged
0075         return copyProfile(profileName, value.toString(), true);
0076     }
0077 
0078     if (!profileNames().contains(profileName)) {
0079         qCWarning(MACHINE_INFO) << "Keysave: Profile does not exsits, create profile before attempting to store keys.";
0080         return false;
0081     }
0082 
0083     if (readKey(profileName, key) == value) {
0084         return false;
0085     }
0086 
0087     m_settings->beginGroup(profileName);
0088     m_settings->setValue(decoderMap[key].name, value);
0089     m_settings->endGroup();
0090     m_settings->sync();
0091     Q_EMIT profilesChanged();
0092     return true;
0093 }
0094 
0095 bool MachineInfo::copyProfile(const QString &srcProfile, const QString &destProfile, bool rmSrc) const
0096 {
0097     if (srcProfile.isEmpty() || destProfile.isEmpty()) {
0098         qCWarning(MACHINE_INFO) << "Profile Copy Error: Source or Destination Profile Is Empty.";
0099         return false;
0100     }
0101 
0102     if (!profileNames().contains(srcProfile)) {
0103         qCWarning(MACHINE_INFO) << "Profile Copy Error: Source Not Found.";
0104         return false;
0105     }
0106 
0107     if (srcProfile == destProfile) {
0108         qCWarning(MACHINE_INFO) << "Profile Copy Error: Source is Destination.";
0109         return false;
0110     }
0111     QVariantMap newProfile = readProfile(srcProfile);
0112     m_settings->beginGroup(destProfile);
0113     for (int i = 1; i < decoderMap.size(); i++) {
0114         m_settings->setValue(decoderMap[MachineInfo::KEY(i)].name, newProfile[decoderMap[MachineInfo::KEY(i)].name]);
0115     }
0116     m_settings->endGroup();
0117     m_settings->sync();
0118     if (rmSrc) {
0119         removeProfile(srcProfile);
0120         // removeProfile Q_EMITs profilesChanged
0121     } else {
0122         Q_EMIT profilesChanged();
0123     }
0124     return true;
0125 }
0126 
0127 bool MachineInfo::removeProfile(const QString &profileName) const
0128 {
0129     if (!profileNames().contains(profileName)) {
0130         qCWarning(MACHINE_INFO) << "Profile Remove Error: Profile not found.";
0131         return false;
0132     }
0133     m_settings->beginGroup(profileName);
0134     m_settings->remove(QString());
0135     m_settings->endGroup();
0136     m_settings->sync();
0137     Q_EMIT profilesChanged();
0138     return true;
0139 }
0140 
0141 void MachineInfo::storeProfile(const QMap<MachineInfo::KEY, QVariant> &profile) const
0142 {
0143     m_settings->beginGroup(profile[KEY::NAME].toString());
0144     for (int i = 1; i < decoderMap.size(); i++) {
0145         m_settings->setValue(decoderMap[MachineInfo::KEY(i)].name, profile[MachineInfo::KEY(i)]);
0146     }
0147     m_settings->endGroup();
0148     m_settings->sync();
0149     Q_EMIT profilesChanged();
0150 }
0151 
0152 void MachineInfo::storeProfile(const QVariantMap &profile) const
0153 {
0154     m_settings->beginGroup(profile.first().toString());
0155     for (auto it = profile.begin(), end = profile.end(); it != end; ++it) {
0156         m_settings->setValue(it.key(), it.value());
0157     }
0158     m_settings->endGroup();
0159     m_settings->sync();
0160     Q_EMIT profilesChanged();
0161 }
0162 
0163 QStringList MachineInfo::profileNames() const
0164 {
0165     m_settings->sync();
0166     return m_settings->childGroups();
0167 }
0168 
0169 QString MachineInfo::keyName(const MachineInfo::KEY key) const
0170 {
0171     auto it = decoderMap.find(key);
0172     if (it != decoderMap.end()) {
0173         return it.value().name;
0174     }
0175     return QString();
0176 }