File indexing completed on 2024-04-28 05:45:47
0001 /* 0002 SPDX-FileCopyrightText: 2018 Caio Jordão Carvalho <caiojcarvalho@gmail.com> 0003 SPDX-FileCopyrightText: 2018 Andrius Štikonas <andrius@stikonas.eu> 0004 0005 SPDX-License-Identifier: GPL-3.0-or-later 0006 */ 0007 0008 #ifndef KPMCORE_SMARTATTRIBUTEPARSEDDATA_H 0009 #define KPMCORE_SMARTATTRIBUTEPARSEDDATA_H 0010 0011 #include <QJsonObject> 0012 #include <QString> 0013 0014 class SmartDiskInformation; 0015 0016 /** SMART Quirk */ 0017 enum SmartQuirk { 0018 None = 0x000000, 0019 SMART_QUIRK_9_POWERONMINUTES = 0x000001, 0020 SMART_QUIRK_9_POWERONSECONDS = 0x000002, 0021 SMART_QUIRK_9_POWERONHALFMINUTES = 0x000004, 0022 SMART_QUIRK_192_EMERGENCYRETRACTCYCLECT = 0x000008, 0023 SMART_QUIRK_193_LOADUNLOAD = 0x000010, 0024 SMART_QUIRK_194_10XCELSIUS = 0x000020, 0025 SMART_QUIRK_194_UNKNOWN = 0x000040, 0026 SMART_QUIRK_200_WRITEERRORCOUNT = 0x000080, 0027 SMART_QUIRK_201_DETECTEDTACOUNT = 0x000100, 0028 SMART_QUIRK_5_UNKNOWN = 0x000200, 0029 SMART_QUIRK_9_UNKNOWN = 0x000400, 0030 SMART_QUIRK_197_UNKNOWN = 0x000800, 0031 SMART_QUIRK_198_UNKNOWN = 0x001000, 0032 SMART_QUIRK_190_UNKNOWN = 0x002000, 0033 SMART_QUIRK_232_AVAILABLERESERVEDSPACE = 0x004000, 0034 SMART_QUIRK_233_MEDIAWEAROUTINDICATOR = 0x008000, 0035 SMART_QUIRK_225_TOTALLBASWRITTEN = 0x010000, 0036 SMART_QUIRK_4_UNUSED = 0x020000, 0037 SMART_QUIRK_226_TIMEWORKLOADMEDIAWEAR = 0x040000, 0038 SMART_QUIRK_227_TIMEWORKLOADHOSTREADS = 0x080000, 0039 SMART_QUIRK_228_WORKLOADTIMER = 0x100000, 0040 SMART_QUIRK_3_UNUSED = 0x200000, 0041 }; 0042 0043 /** A unit for SMART attributes */ 0044 enum class SmartAttributeUnit { 0045 Unknown, 0046 None, 0047 Miliseconds, 0048 Sectors, 0049 Milikelvin, 0050 SmallPercent, /* percentage with 3 decimal points */ 0051 Percent, 0052 MB, 0053 }; 0054 0055 /** A SMART parsed attribute. 0056 0057 It receives the attribute data from JSON, retrieve its data and validates its values. 0058 0059 @author Caio Jordão Carvalho <caiojcarvalho@gmail.com> 0060 */ 0061 class SmartAttributeParsedData 0062 { 0063 public: 0064 /** SMART Quirk to some particular model and firmware */ 0065 struct SmartQuirkDataBase { 0066 QString model; 0067 QString firmware; 0068 SmartQuirk quirk; 0069 0070 SmartQuirkDataBase(const QString &m = QString(), 0071 const QString &f = QString(), 0072 SmartQuirk q = SmartQuirk::None) : 0073 model(m), 0074 firmware(f), 0075 quirk(q) 0076 { 0077 }; 0078 }; 0079 0080 public: 0081 SmartAttributeParsedData(SmartDiskInformation *disk, QJsonObject jsonAttribute); 0082 0083 SmartAttributeParsedData(const SmartAttributeParsedData &other); 0084 0085 public: 0086 quint32 id() const 0087 { 0088 return m_Id; /**< @return attribute id */ 0089 } 0090 0091 qint32 currentValue() const 0092 { 0093 return m_CurrentValue; /**< @return attribute current value */ 0094 } 0095 0096 qint32 worstValue() const 0097 { 0098 return m_WorstValue; /**< @return attribute worst value */ 0099 } 0100 0101 qint32 threshold() const 0102 { 0103 return m_Threshold; /**< @return attribute threshold value */ 0104 } 0105 0106 bool prefailure() const 0107 { 0108 return m_Prefailure; /**< @return attribute prefailure status */ 0109 } 0110 0111 bool online() const 0112 { 0113 return m_Online; /**< @return attribute online status */ 0114 } 0115 0116 quint64 raw() const 0117 { 0118 return m_Raw; /**< @return attribute raw value */ 0119 } 0120 0121 quint64 prettyValue() const 0122 { 0123 return m_PrettyValue; /**< @return attribute pretty value */ 0124 } 0125 0126 SmartAttributeUnit prettyUnit() const 0127 { 0128 return m_PrettyUnit; /**< @return pretty unit value */ 0129 } 0130 0131 bool goodNowValid() const 0132 { 0133 return m_GoodNowValid; /**< @return good now attribute status validation */ 0134 } 0135 0136 bool goodNow() const 0137 { 0138 return m_GoodNow; /**< @return good now attribute status */ 0139 } 0140 0141 bool goodInThePastValid() const 0142 { 0143 return m_GoodInThePastValid; /**< @return good in the past attribute status validation */ 0144 } 0145 0146 bool goodInThePast() const 0147 { 0148 return m_GoodInThePast; /**< @return good in the past attribute status */ 0149 } 0150 0151 bool thresholdValid() const 0152 { 0153 return m_ThresholdValid; /**< @return threshold value validation */ 0154 } 0155 0156 bool currentValueValid() const 0157 { 0158 return m_CurrentValueValid; /**< @return current value validation */ 0159 } 0160 0161 bool worstValueValid() const 0162 { 0163 return m_WorstValueValid; /**< @return worst value validation */ 0164 } 0165 0166 bool warn() const 0167 { 0168 return m_Warn; /**< @return warn status */ 0169 } 0170 0171 SmartDiskInformation *disk() const 0172 { 0173 return m_Disk; /**< @return attribute's disk reference */ 0174 } 0175 0176 protected: 0177 void validateValues(); 0178 0179 bool updateUnit(); 0180 0181 void makePretty(); 0182 0183 void verifyAttribute(); 0184 0185 void verifyTemperature(); 0186 0187 void verifyShortTime(); 0188 0189 void verifyLongTime(); 0190 0191 void verifySectors(); 0192 0193 private: 0194 quint32 m_Id; 0195 qint32 m_CurrentValue; 0196 qint32 m_WorstValue; 0197 qint32 m_Threshold; 0198 quint64 m_Raw; 0199 quint64 m_PrettyValue; 0200 bool m_CurrentValueValid; 0201 bool m_WorstValueValid; 0202 bool m_ThresholdValid; 0203 bool m_Prefailure; 0204 bool m_Online; 0205 bool m_GoodNow; 0206 bool m_GoodNowValid; 0207 bool m_GoodInThePast; 0208 bool m_GoodInThePastValid; 0209 bool m_Warn; 0210 SmartAttributeUnit m_PrettyUnit; 0211 SmartDiskInformation *m_Disk; 0212 SmartQuirk m_Quirk; 0213 }; 0214 0215 #endif // SMARTATTRIBUTEPARSEDDATA_H