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
{
2022-08-24 16:11:36 +02:00
return sSmartData . 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
{
2022-08-24 16:11:36 +02:00
return sSmartData . sModelName ;
2020-05-01 22:18:01 +02:00
}
string Drive : : getSerial ( void )
{
2022-08-24 16:11:36 +02:00
return sSmartData . sSerial ;
2020-05-01 22:18:01 +02:00
}
2020-05-02 13:25:27 +02:00
uint64_t Drive : : getCapacity ( void )
2020-05-01 22:18:01 +02:00
{
2022-08-24 16:11:36 +02:00
return sSmartData . u64Capacity ;
2020-05-01 22:18:01 +02:00
}
uint32_t Drive : : getErrorCount ( void )
{
2022-08-24 16:11:36 +02:00
return sSmartData . u32ErrorCount ;
2020-05-01 22:18:01 +02:00
}
uint32_t Drive : : getPowerOnHours ( void )
{
2022-08-24 16:11:36 +02:00
return sSmartData . u32PowerOnHours ;
2020-05-01 22:18:01 +02:00
}
2020-05-02 13:25:27 +02:00
uint32_t Drive : : getPowerCycles ( void )
2020-05-01 22:18:01 +02:00
{
2022-08-24 16:11:36 +02:00
return sSmartData . u32PowerCycles ;
2020-05-01 18:31:02 +02:00
}
2022-08-24 16:00:18 +02:00
uint32_t Drive : : getTemperature ( void )
{
2022-08-24 16:11:36 +02:00
return sSmartData . u32Temperature ;
2022-08-24 16:00:18 +02:00
}
2020-08-07 11:38:00 +02:00
string Drive : : sCapacityToText ( )
{
2022-01-26 16:31:46 +01:00
char acBuffer [ 16 ] ;
double dSize = ( double ) getCapacity ( ) ;
uint16_t u16UnitIndex = 0 ;
const char * units [ ] = { " B " , " kB " , " MB " , " GB " , " TB " , " PB " , " EB " , " ZB " , " YB " } ;
2022-05-11 23:45:05 +02:00
while ( dSize > = 1000 ) //using the marketing capacity
{
dSize / = 1000 ;
u16UnitIndex + + ;
}
2022-01-26 16:31:46 +01:00
sprintf ( acBuffer , " %.*f %s " , u16UnitIndex - 3 , dSize , units [ u16UnitIndex ] ) ;
return acBuffer ;
2020-08-04 22:35:29 +02:00
}
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 ( )
{
2020-09-21 14:45:52 +02:00
double dDays = 0U ;
2020-08-07 16:17:45 +02:00
double dYears = 0U ;
uint32_t u32Hours = getPowerOnHours ( ) ;
2020-09-21 14:45:52 +02:00
stringstream streamDays ;
stringstream streamYears ;
2020-08-07 12:07:29 +02:00
2020-09-21 14:45:52 +02:00
dDays = ( double ) ( ( double ) u32Hours / ( double ) 24U ) ;
2020-08-07 16:17:45 +02:00
dYears = ( double ) ( ( double ) u32Hours / ( double ) 8760U ) ;
2020-08-07 12:07:29 +02:00
2020-09-21 14:45:52 +02:00
streamDays < < fixed < < setprecision ( 0 ) < < dDays ;
streamYears < < fixed < < setprecision ( 1 ) < < dYears ;
string sRet = to_string ( getPowerOnHours ( ) ) + " hours or " + streamDays . str ( ) + " days or " + streamYears . 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
2022-08-24 16:00:18 +02:00
string Drive : : sTemperatureToText ( )
{
return to_string ( getTemperature ( ) ) + " C " ; ;
}
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
2022-08-24 16:11:36 +02:00
* \ param uint32_t temperature
2020-05-02 17:15:55 +02:00
* \ 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 ,
2022-08-24 16:00:18 +02:00
uint32_t powerCycle ,
uint32_t temperature )
2020-05-02 00:49:11 +02:00
{
2022-08-24 16:11:36 +02:00
this - > sSmartData . sModelFamily = modelFamily ;
this - > sSmartData . sModelName = modelName ;
this - > sSmartData . sSerial = serial ;
this - > sSmartData . u64Capacity = capacity ;
this - > sSmartData . u32ErrorCount = errorCount ;
this - > sSmartData . u32PowerOnHours = powerOnHours ;
this - > sSmartData . u32PowerCycles = powerCycle ;
this - > sSmartData . u32Temperature = temperature ;
2020-09-11 17:18:53 +02:00
}
void Drive : : setTimestamp ( )
{
time ( & this - > u32Timestamp ) ;
}
2022-05-11 23:45:05 +02:00
void Drive : : setActionStartTimestamp ( )
{
time ( & this - > u32TimestampTaskStart ) ;
}
time_t Drive : : getActionStartTimestamp ( )
{
return this - > u32TimestampTaskStart ;
}
2022-05-12 07:40:24 +02:00
void Drive : : calculateTaskDuration ( )
{
time_t u32localtime ;
time ( & u32localtime ) ;
this - > u32TaskDuration = u32localtime - this - > u32TimestampTaskStart ;
}
time_t Drive : : getTaskDuration ( )
{
return this - > u32TaskDuration ;
}
2020-09-11 17:18:53 +02:00
void Drive : : checkFrozenDrive ( void )
{
time_t u32localtime ;
time ( & u32localtime ) ;
2022-08-23 23:20:50 +02:00
if ( ( u32localtime - this - > u32Timestamp ) > = ( FROZEN_TIMEOUT * 60 ) & & ( this - > u32Timestamp > 0 ) & & ( this - > getTaskPercentage ( ) < 100.0 ) )
2020-09-11 17:18:53 +02:00
{
Logger : : logThis ( ) - > warning ( " Drive Frozen: " + this - > getModelName ( ) + " " + this - > getSerial ( ) ) ;
2022-11-24 20:41:23 +01:00
this - > bWasDeleted = false ;
2020-09-11 17:18:53 +02:00
this - > bWasShredded = false ;
this - > state = Drive : : FROZEN ;
}
2020-05-02 00:49:11 +02:00
}