Including doxygen comments to the new SMART support classes

This commit is contained in:
Caio Carvalho 2018-01-11 17:38:53 -03:00
parent a135c86ba1
commit 0190d32cf6
6 changed files with 87 additions and 32 deletions

View File

@ -33,6 +33,10 @@
static const QMap<qint32, SmartAttributeParsedData::SmartAttributeUnit> tableUnit(); static const QMap<qint32, SmartAttributeParsedData::SmartAttributeUnit> tableUnit();
static SmartAttributeParsedData::SmartQuirk getQuirk(QString model, QString firmware); static SmartAttributeParsedData::SmartQuirk getQuirk(QString model, QString firmware);
/** Creates a new SmartAttributeParsedData object.
@param disk the reference to the disk that this attribute is allocated to
@param jsonAttribute JSON attribute data
*/
SmartAttributeParsedData::SmartAttributeParsedData(SmartDiskInformation *disk, SmartAttributeParsedData::SmartAttributeParsedData(SmartDiskInformation *disk,
QJsonObject jsonAttribute) : QJsonObject jsonAttribute) :
m_Id(0), m_Id(0),
@ -93,6 +97,8 @@ SmartAttributeParsedData::SmartAttributeParsedData(SmartDiskInformation *disk,
} }
} }
/** @param other SmartAttributeParsedData to copy
*/
SmartAttributeParsedData::SmartAttributeParsedData(const SmartAttributeParsedData &other) : SmartAttributeParsedData::SmartAttributeParsedData(const SmartAttributeParsedData &other) :
m_Id(other.id()), m_Id(other.id()),
m_CurrentValue(other.currentValue()), m_CurrentValue(other.currentValue()),
@ -117,6 +123,7 @@ SmartAttributeParsedData::SmartAttributeParsedData(const SmartAttributeParsedDat
} }
/** Validate values from the current attribute */
void SmartAttributeParsedData::validateValues() void SmartAttributeParsedData::validateValues()
{ {
m_CurrentValueValid = m_CurrentValue >= 1 && m_CurrentValue <= 0xFD; m_CurrentValueValid = m_CurrentValue >= 1 && m_CurrentValue <= 0xFD;
@ -137,6 +144,7 @@ void SmartAttributeParsedData::validateValues()
m_Warn = (m_GoodNowValid && !m_GoodNow) || (m_GoodInThePastValid && !m_GoodInThePast); m_Warn = (m_GoodNowValid && !m_GoodNow) || (m_GoodInThePastValid && !m_GoodInThePast);
} }
/** Make a pretty value from raw based on attribute's id */
void SmartAttributeParsedData::makePretty() void SmartAttributeParsedData::makePretty()
{ {
if (m_PrettyUnit == SMART_ATTRIBUTE_UNIT_UNKNOWN) if (m_PrettyUnit == SMART_ATTRIBUTE_UNIT_UNKNOWN)
@ -206,6 +214,7 @@ void SmartAttributeParsedData::makePretty()
} }
} }
/** Verify attribute's unit */
void SmartAttributeParsedData::verifyAttribute() void SmartAttributeParsedData::verifyAttribute()
{ {
if (id() == 3 || id() == 226) if (id() == 3 || id() == 226)

View File

@ -23,9 +23,17 @@
class SmartDiskInformation; class SmartDiskInformation;
/** A SMART parsed attribute.
It receives the attribute data from JSON, retrieve its data and validates its values.
@author Caio Carvalho <caiojcarvalho@gmail.com>
*/
class SmartAttributeParsedData class SmartAttributeParsedData
{ {
public: public:
/** A unit for SMART attributes */
enum SmartAttributeUnit { enum SmartAttributeUnit {
SMART_ATTRIBUTE_UNIT_UNKNOWN, SMART_ATTRIBUTE_UNIT_UNKNOWN,
SMART_ATTRIBUTE_UNIT_NONE, SMART_ATTRIBUTE_UNIT_NONE,
@ -38,6 +46,7 @@ public:
_SMART_ATTRIBUTE_UNIT_MAX _SMART_ATTRIBUTE_UNIT_MAX
}; };
/** SMART Quirk */
enum SmartQuirk { enum SmartQuirk {
SMART_QUIRK_9_POWERONMINUTES = 0x000001, SMART_QUIRK_9_POWERONMINUTES = 0x000001,
SMART_QUIRK_9_POWERONSECONDS = 0x000002, SMART_QUIRK_9_POWERONSECONDS = 0x000002,
@ -63,6 +72,7 @@ public:
SMART_QUIRK_3_UNUSED = 0x200000 SMART_QUIRK_3_UNUSED = 0x200000
}; };
/** SMART Quirk to some particular model and firmware */
struct SmartQuirkDataBase { struct SmartQuirkDataBase {
const char *model; const char *model;
const char *firmware; const char *firmware;
@ -77,92 +87,92 @@ public:
public: public:
quint32 id() const quint32 id() const
{ {
return m_Id; return m_Id; /**< @return attribute id */
} }
qint32 currentValue() const qint32 currentValue() const
{ {
return m_CurrentValue; return m_CurrentValue; /**< @return attribute current value */
} }
qint32 worstValue() const qint32 worstValue() const
{ {
return m_WorstValue; return m_WorstValue; /**< @return attribute worst value */
} }
qint32 threshold() const qint32 threshold() const
{ {
return m_Threshold; return m_Threshold; /**< @return attribute threshold value */
} }
bool prefailure() const bool prefailure() const
{ {
return m_Prefailure; return m_Prefailure; /**< @return attribute prefailure status */
} }
bool online() const bool online() const
{ {
return m_Online; return m_Online; /**< @return attribute online status */
} }
quint64 raw() const quint64 raw() const
{ {
return m_Raw; return m_Raw; /**< @return attribute raw value */
} }
quint64 prettyValue() const quint64 prettyValue() const
{ {
return m_PrettyValue; return m_PrettyValue; /**< @return attribute pretty value */
} }
SmartAttributeUnit prettyUnit() const SmartAttributeUnit prettyUnit() const
{ {
return m_PrettyUnit; return m_PrettyUnit; /**< @return pretty unit value */
} }
bool goodNowValid() const bool goodNowValid() const
{ {
return m_GoodNowValid; return m_GoodNowValid; /**< @return good now attribute status validation */
} }
bool goodNow() const bool goodNow() const
{ {
return m_GoodNow; return m_GoodNow; /**< @return good now attribute status */
} }
bool goodInThePastValid() const bool goodInThePastValid() const
{ {
return m_GoodInThePastValid; return m_GoodInThePastValid; /**< @return good in the past attribute status validation */
} }
bool goodInThePast() const bool goodInThePast() const
{ {
return m_GoodInThePast; return m_GoodInThePast; /**< @return good in the past attribute status */
} }
bool thresholdValid() const bool thresholdValid() const
{ {
return m_ThresholdValid; return m_ThresholdValid; /**< @return threshold value validation */
} }
bool currentValueValid() const bool currentValueValid() const
{ {
return m_CurrentValueValid; return m_CurrentValueValid; /**< @return current value validation */
} }
bool worstValueValid() const bool worstValueValid() const
{ {
return m_WorstValueValid; return m_WorstValueValid; /**< @return worst value validation */
} }
bool warn() const bool warn() const
{ {
return m_Warn; return m_Warn; /**< @return warn status */
} }
SmartDiskInformation *disk() const SmartDiskInformation *disk() const
{ {
return m_Disk; return m_Disk; /**< @return attribute's disk reference */
} }
protected: protected:

View File

@ -20,6 +20,7 @@
static quint64 u64log2(quint64 n); static quint64 u64log2(quint64 n);
/** Creates a new SmartDiskInformationObject */
SmartDiskInformation::SmartDiskInformation() : SmartDiskInformation::SmartDiskInformation() :
m_ModelName(QString()), m_ModelName(QString()),
m_FirmwareVersion(QString()), m_FirmwareVersion(QString()),
@ -38,6 +39,7 @@ SmartDiskInformation::SmartDiskInformation() :
} }
/** Update the number of bad sectors based on reallocated sector count and current pending sector attributes data */
void SmartDiskInformation::updateBadSectors() void SmartDiskInformation::updateBadSectors()
{ {
SmartAttributeParsedData *reallocatedSectorCt; SmartAttributeParsedData *reallocatedSectorCt;
@ -56,6 +58,7 @@ void SmartDiskInformation::updateBadSectors()
m_BadSectors = currentPendingSector->prettyValue(); m_BadSectors = currentPendingSector->prettyValue();
} }
/** Update SMART overall data based on the quantity of bad sectors and the status of SMART attributes */
void SmartDiskInformation::updateOverall() void SmartDiskInformation::updateOverall()
{ {
if (!smartStatus()) { if (!smartStatus()) {
@ -91,6 +94,9 @@ void SmartDiskInformation::updateOverall()
} }
/** Update the temperature value based on SMART attributes
@return a boolean representing the status of the operation
*/
bool SmartDiskInformation::updateTemperature() bool SmartDiskInformation::updateTemperature()
{ {
SmartAttributeParsedData *temperatureCelsius; SmartAttributeParsedData *temperatureCelsius;
@ -118,6 +124,9 @@ bool SmartDiskInformation::updateTemperature()
return false; return false;
} }
/** Update the powered on value based on SMART attributes
@return a boolean representing the status of the operation
*/
bool SmartDiskInformation::updatePowerOn() bool SmartDiskInformation::updatePowerOn()
{ {
SmartAttributeParsedData *powerOnHours; SmartAttributeParsedData *powerOnHours;
@ -138,6 +147,9 @@ bool SmartDiskInformation::updatePowerOn()
return false; return false;
} }
/** Update the power cycles value based on SMART attributes
@return a boolean representing the status of the operation
*/
bool SmartDiskInformation::updatePowerCycle() bool SmartDiskInformation::updatePowerCycle()
{ {
SmartAttributeParsedData *powerCycleCount; SmartAttributeParsedData *powerCycleCount;
@ -152,6 +164,7 @@ bool SmartDiskInformation::updatePowerCycle()
return false; return false;
} }
/** Validate disk attributes status */
void SmartDiskInformation::validateBadAttributes() void SmartDiskInformation::validateBadAttributes()
{ {
for (const SmartAttributeParsedData &attribute : qAsConst(m_Attributes)) { for (const SmartAttributeParsedData &attribute : qAsConst(m_Attributes)) {
@ -164,6 +177,9 @@ void SmartDiskInformation::validateBadAttributes()
} }
} }
/** Search for a attribute based on its id number
@return a reference to the attribute
*/
SmartAttributeParsedData *SmartDiskInformation::findAttribute(quint32 id) SmartAttributeParsedData *SmartDiskInformation::findAttribute(quint32 id)
{ {
SmartAttributeParsedData *attr = nullptr; SmartAttributeParsedData *attr = nullptr;

View File

@ -23,9 +23,16 @@
class SmartAttributeParsedData; class SmartAttributeParsedData;
/** Disk information retrieved by SMART.
It includes a list with your SMART attributes.
@author Caio Carvalho <caiojcarvalho@gmail.com>
*/
class SmartDiskInformation class SmartDiskInformation
{ {
public: public:
/** SMART self test execution state */
enum SmartSelfTestExecutionStatus { enum SmartSelfTestExecutionStatus {
SMART_SELF_TEST_EXECUTION_STATUS_SUCCESS_OR_NEVER = 0, SMART_SELF_TEST_EXECUTION_STATUS_SUCCESS_OR_NEVER = 0,
SMART_SELF_TEST_EXECUTION_STATUS_ABORTED = 1, SMART_SELF_TEST_EXECUTION_STATUS_ABORTED = 1,
@ -40,6 +47,7 @@ public:
_SMART_SELF_TEST_EXECUTION_STATUS_MAX _SMART_SELF_TEST_EXECUTION_STATUS_MAX
}; };
/** SMART overall state */
enum SmartOverall { enum SmartOverall {
SMART_OVERALL_GOOD, SMART_OVERALL_GOOD,
SMART_OVERALL_BAD_ATTRIBUTE_IN_THE_PAST, SMART_OVERALL_BAD_ATTRIBUTE_IN_THE_PAST,
@ -69,62 +77,62 @@ public:
public: public:
const QString model() const const QString model() const
{ {
return m_ModelName; return m_ModelName; /**< @return the disk model name */
} }
const QString firmware() const const QString firmware() const
{ {
return m_FirmwareVersion; return m_FirmwareVersion; /**< @return the disk firmware version */
} }
const QString serial() const const QString serial() const
{ {
return m_SerialNumber; return m_SerialNumber; /**< @return the disk serial number */
} }
quint64 size() const quint64 size() const
{ {
return m_Size; return m_Size; /**< @return disk size */
} }
bool smartStatus() const bool smartStatus() const
{ {
return m_SmartStatus; return m_SmartStatus; /**< @return a boolean representing SMART status */
} }
SmartSelfTestExecutionStatus selfTestExecutionStatus() const SmartSelfTestExecutionStatus selfTestExecutionStatus() const
{ {
return m_SelfTestExecutionStatus; return m_SelfTestExecutionStatus; /**< @return SMART self execution status */
} }
SmartOverall overall() const SmartOverall overall() const
{ {
return m_Overall; return m_Overall; /**< @return SMART overall status */
} }
quint64 temperature() const quint64 temperature() const
{ {
return m_Temperature; return m_Temperature; /**< @return disk temperature in kelvin */
} }
quint64 badSectors() const quint64 badSectors() const
{ {
return m_BadSectors; return m_BadSectors; /**< @return the number of bad sectors */
} }
quint64 poweredOn() const quint64 poweredOn() const
{ {
return m_PoweredOn; return m_PoweredOn; /**< @return quantity of time that device is powered on */
} }
quint64 powerCycles() const quint64 powerCycles() const
{ {
return m_PowerCycles; return m_PowerCycles; /**< @return quantity of power cycles */
} }
QList<SmartAttributeParsedData> attributes() const QList<SmartAttributeParsedData> attributes() const
{ {
return m_Attributes; return m_Attributes; /**< @return a list that contains the disk SMART attributes */
} }
public: public:

View File

@ -28,6 +28,9 @@
#include <QJsonObject> #include <QJsonObject>
#include <QString> #include <QString>
/** Creates a new SmartParser object
@param device_path device path that indicates the device that SMART must analyse
*/
SmartParser::SmartParser(const QString &device_path) : SmartParser::SmartParser(const QString &device_path) :
m_DevicePath(device_path), m_DevicePath(device_path),
m_DiskInformation(nullptr) m_DiskInformation(nullptr)
@ -35,6 +38,7 @@ SmartParser::SmartParser(const QString &device_path) :
} }
/** Initialize SmartParser data, retrieve the information from SMART JSON and initialize the disk information data */
bool SmartParser::init() bool SmartParser::init()
{ {
loadSmartOutput(); loadSmartOutput();
@ -107,6 +111,7 @@ bool SmartParser::init()
return true; return true;
} }
/** Run smartctl command and recover its output */
void SmartParser::loadSmartOutput() void SmartParser::loadSmartOutput()
{ {
if (m_SmartOutput.isEmpty()) { if (m_SmartOutput.isEmpty()) {
@ -122,6 +127,7 @@ void SmartParser::loadSmartOutput()
} }
} }
/** Load SMART disk attributes from JSON data */
void SmartParser::loadAttributes() void SmartParser::loadAttributes()
{ {
loadSmartOutput(); loadSmartOutput();

View File

@ -23,6 +23,12 @@
class SmartDiskInformation; class SmartDiskInformation;
/** A parser to SMART JSON output.
Responsable to execute smartctl and parse its output.
@author Caio Carvalho <caiojcarvalho@gmail.com>
*/
class SmartParser class SmartParser
{ {
public: public:
@ -34,12 +40,12 @@ public:
public: public:
const QString &devicePath() const const QString &devicePath() const
{ {
return m_DevicePath; return m_DevicePath; /**< @return the device path that SMART must analyse */
} }
SmartDiskInformation *diskInformation() const SmartDiskInformation *diskInformation() const
{ {
return m_DiskInformation; return m_DiskInformation; /**< @return a reference to parsed disk information */
} }
protected: protected: