2020-05-01 18:31:02 +02:00
/**
2020-05-02 22:06:47 +02:00
* @ file drive . cpp
* @ brief represent physical drive
* @ author hendrik schutter
* @ date 01.05 .2020
2020-05-01 18:31:02 +02:00
*/
2020-05-02 22:06:47 +02:00
# include "../include/reHDD.h"
2020-05-01 18:31:02 +02:00
2020-05-01 22:18:01 +02:00
string Drive : : getPath ( void )
{
return sPath ;
}
2020-05-02 00:49:11 +02:00
string Drive : : getModelFamily ( void )
2020-05-01 22:18:01 +02:00
{
2020-05-02 00:49:11 +02:00
return sModelFamily ;
2020-05-01 22:18:01 +02:00
}
2020-05-02 00:49:11 +02:00
string Drive : : getModelName ( void )
2020-05-01 22:18:01 +02:00
{
2020-05-02 00:49:11 +02:00
return sModelName ;
2020-05-01 22:18:01 +02:00
}
string Drive : : getSerial ( void )
{
return sSerial ;
}
2020-05-02 13:25:27 +02:00
uint64_t Drive : : getCapacity ( void )
2020-05-01 22:18:01 +02:00
{
2020-05-02 13:25:27 +02:00
return u64Capacity ;
2020-05-01 22:18:01 +02:00
}
uint32_t Drive : : getErrorCount ( void )
{
return u32ErrorCount ;
}
uint32_t Drive : : getPowerOnHours ( void )
{
return u32PowerOnHours ;
}
2020-05-02 13:25:27 +02:00
uint32_t Drive : : getPowerCycles ( void )
2020-05-01 22:18:01 +02:00
{
2020-05-02 13:25:27 +02:00
return u32PowerCycles ;
2020-05-01 18:31:02 +02:00
}
2020-08-07 11:38:00 +02:00
string Drive : : sCapacityToText ( )
{
if ( getCapacity ( ) < = ( 999 * 1000000000UL ) )
{
// Less or even 999 GB --> GB
return to_string ( getCapacity ( ) / 1000000000UL ) + " GB " ;
}
else
{
// More 999 GB --> TB
return to_string ( getCapacity ( ) / 1000000000000UL ) + " TB " ;
}
2020-08-04 22:35:29 +02:00
return " ERROR " ;
}
2020-08-07 16:17:45 +02:00
string Drive : : sErrorCountToText ( )
{
return to_string ( getErrorCount ( ) ) ;
}
2020-08-07 12:07:29 +02:00
2020-08-07 16:17:45 +02:00
string Drive : : sPowerOnHoursToText ( )
{
double dYears = 0U ;
uint32_t u32Hours = getPowerOnHours ( ) ;
stringstream stream ;
2020-08-07 12:07:29 +02:00
2020-08-07 16:17:45 +02:00
dYears = ( double ) ( ( double ) u32Hours / ( double ) 8760U ) ;
2020-08-07 12:07:29 +02:00
2020-08-07 16:17:45 +02:00
stream < < fixed < < setprecision ( 2 ) < < dYears ;
string sRet = to_string ( getPowerOnHours ( ) ) + " hours or " + stream . str ( ) + " years " ;
2020-08-07 13:17:52 +02:00
2020-08-07 16:17:45 +02:00
return sRet ;
}
string Drive : : sPowerCyclesToText ( )
{
return to_string ( getPowerCycles ( ) ) ;
}
2020-08-07 12:07:29 +02:00
2020-08-28 15:28:57 +02:00
void Drive : : setTaskPercentage ( double d32TaskPercentage )
2020-08-09 21:41:28 +02:00
{
2020-08-28 15:28:57 +02:00
if ( d32TaskPercentage < = 100 )
2020-08-09 21:41:28 +02:00
{
2020-08-28 15:28:57 +02:00
this - > d32TaskPercentage = d32TaskPercentage ;
2020-09-11 17:18:53 +02:00
this - > setTimestamp ( ) ; //set timestamp for this progress for detecting a frozen drive
2020-08-09 21:41:28 +02:00
}
}
2020-08-28 15:28:57 +02:00
double Drive : : getTaskPercentage ( void )
2020-08-09 21:41:28 +02:00
{
2020-08-28 15:28:57 +02:00
return this - > d32TaskPercentage ;
2020-08-09 21:41:28 +02:00
}
2020-05-02 17:15:55 +02:00
/**
* \ brief set S . M . A . R . T . values in model
* \ param string modelFamily
* \ param string modelName
* \ param string serial
* \ param uint64_t capacity
* \ param uint32_t errorCount
* \ param uint32_t powerOnHours
* \ param uint32_t powerCycle
* \ return void
*/
2020-05-02 00:49:11 +02:00
void Drive : : setDriveSMARTData ( string modelFamily ,
string modelName ,
string serial ,
2020-05-02 13:25:27 +02:00
uint64_t capacity ,
2020-05-02 00:49:11 +02:00
uint32_t errorCount ,
uint32_t powerOnHours ,
2020-05-02 13:25:27 +02:00
uint32_t powerCycle )
2020-05-02 00:49:11 +02:00
{
2020-05-02 17:15:55 +02:00
this - > sModelFamily = modelFamily ;
2020-05-02 00:49:11 +02:00
sModelName = modelName ;
sSerial = serial ;
2020-05-02 13:25:27 +02:00
u64Capacity = capacity ;
2020-05-02 00:49:11 +02:00
u32ErrorCount = errorCount ;
u32PowerOnHours = powerOnHours ;
2020-05-02 13:25:27 +02:00
u32PowerCycles = powerCycle ;
2020-09-11 17:18:53 +02:00
}
void Drive : : setTimestamp ( )
{
time ( & this - > u32Timestamp ) ;
}
void Drive : : checkFrozenDrive ( void )
{
time_t u32localtime ;
time ( & u32localtime ) ;
if ( ( u32localtime - this - > u32Timestamp ) > = ( FROZEN_TIMEOUT * 60 ) & & ( this - > u32Timestamp > 0 ) )
{
Logger : : logThis ( ) - > warning ( " Drive Frozen: " + this - > getModelName ( ) + " " + this - > getSerial ( ) ) ;
this - > bWasDeleteted = false ;
this - > bWasShredded = false ;
this - > state = Drive : : FROZEN ;
}
2020-05-02 00:49:11 +02:00
}