From 9322ea65a7ed8958b5309d5f4f951015edf2ef12 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 4 Aug 2020 22:35:29 +0200 Subject: [PATCH] started to use the UI --- include/drive.h | 2 + include/reHDD.h | 14 ++--- include/tui.h | 19 +++--- include/tui_data.h | 45 --------------- makefile | 2 +- src/TUI/tui.cpp | 135 +++++++++++++++++++++++++++++++++++++++++-- src/TUI/tui_data.cpp | 29 ---------- src/drive.cpp | 12 ++++ src/reHDD.cpp | 53 +++++++---------- 9 files changed, 180 insertions(+), 131 deletions(-) delete mode 100644 include/tui_data.h delete mode 100644 src/TUI/tui_data.cpp diff --git a/include/drive.h b/include/drive.h index 3f96677..53bad36 100644 --- a/include/drive.h +++ b/include/drive.h @@ -37,6 +37,8 @@ public: uint32_t powerOnHours, uint32_t powerCycles); + string sCapacityToText(); + private: string sPath; string sModelFamily; diff --git a/include/reHDD.h b/include/reHDD.h index 32390cd..bafaefb 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -23,6 +23,7 @@ #include #include #include +#include using namespace std; @@ -30,8 +31,8 @@ using namespace std; #include "drive.h" #include "smart.h" #include "wipe.h" -//#include "tui.h" -//#include "tui_data.h" +#include "tui.h" + template T* iterator_to_pointer(I i) { @@ -53,21 +54,14 @@ private: vector vecDrives; //stores all drive data static void searchDrives(vector * pvecDrives); - static void printDrives(vector * pvecDrives); - - static void filterIgnoredDrives(vector * pvecDrives); - - static void addSMARTData(vector * pvecDrives); - static void ThreadScannDevices(); - void filterNewDrives(vector * pvecOldDrives, vector * pvecNewDrives); - + TUI *ui; diff --git a/include/tui.h b/include/tui.h index 3266e70..36a14dc 100644 --- a/include/tui.h +++ b/include/tui.h @@ -24,18 +24,23 @@ public: TUI(void); - void initTUI(); - - void updateTUI(TUI_DATA data); - + static void initTUI(); + void updateTUI(vector * pvecDrives); private: + static string sCpuUsage; + static string sRamUsage; + static string sLocalTime; - void centerTitle(WINDOW *pwin, const char * title); - - + WINDOW *detailview; + WINDOW *overview; + vector vWinDriveEntries; + static void centerTitle(WINDOW *pwin, const char * title); + static WINDOW *createOverViewWindow( int iXSize, int iYSize); + static WINDOW *createDetailViewWindow( int iXSize, int iYSize, int iXStart); + static WINDOW *createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart,string sModelFamily, string sModelName, string sCapacity); }; #endif // TUI_H_ \ No newline at end of file diff --git a/include/tui_data.h b/include/tui_data.h deleted file mode 100644 index 5dab10f..0000000 --- a/include/tui_data.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - * @file tui_data.h - * @brief ui model data - * @author hendrik schutter - * @date 03.08.2020 - */ - -#ifndef TUI_DATA_H_ -#define TUI_DATA_H_ - -#include "reHDD.h" - -#define COLOR_AREA_STDSCR 1 -#define COLOR_AREA_OVERVIEW 2 -#define COLOR_AREA_ENTRY 3 - -#define COLOR_GRAY 8 - - -class TUI_DATA -{ -protected: - -public: - - TUI_DATA(vector * pvecDrives); - - - - - - - -private: - - - - - string sCpuUsage; - string sRamUsage; - string sLocalTime; - -}; - -#endif // TUI_DATA_H_ \ No newline at end of file diff --git a/makefile b/makefile index 5c4fced..66f9bac 100644 --- a/makefile +++ b/makefile @@ -18,7 +18,7 @@ DCOMPILE_FLAGS = -D DEBUG # Add additional include paths INCLUDES = include # General linker settings -LINK_FLAGS = -lpthread +LINK_FLAGS = -lpthread -lncurses # Doc DOCDIR = doc #### END PROJECT SETTINGS #### diff --git a/src/TUI/tui.cpp b/src/TUI/tui.cpp index b65f90a..825475a 100644 --- a/src/TUI/tui.cpp +++ b/src/TUI/tui.cpp @@ -4,16 +4,23 @@ * @author hendrik schutter * @date 03.08.2020 */ -/* -#include "../include/reHDD.h" -*/ + +#include "../../include/reHDD.h" + + +TUI::TUI(void){ + + + +} + /** * \brief wipe drive with shred * \param pointer of Drive instance * \return void */ -/* + void TUI::initTUI() { initscr(); @@ -30,10 +37,126 @@ void TUI::initTUI() init_color(COLOR_GRAY, 173, 170, 173); } -void TUI::updateTUI(TUI_DATA data){ +void TUI::updateTUI(vector * pvecDrives) { + + + werase(stdscr); + + int stdscrX, stdscrY; + getmaxyx(stdscr, stdscrY, stdscrX); + + init_pair(COLOR_AREA_STDSCR,COLOR_WHITE, COLOR_BLUE); + wbkgd(stdscr, COLOR_PAIR(COLOR_AREA_STDSCR)); + + mvprintw(0, 2, "reHDD - HDD refurbishing tool - Licensed under GPL 3.0 X:%d Y:%d",stdscrX,stdscrY); + + refresh(); + + overview=createOverViewWindow((int)(stdscrX/3), (stdscrY-15)); + wrefresh(overview); + + detailview=createDetailViewWindow(((stdscrX)-(int)(stdscrX/3)-7), (stdscrY-3), (int)(stdscrX/3)+5); + wrefresh(detailview); + + vWinDriveEntries.clear(); +int i = 0; + + vector ::iterator it; + for (it = pvecDrives->begin(); it != pvecDrives->end(); ++it) + { + + string sModelFamily = it->getModelFamily(); + string sModelName = it->getModelName(); + string sCapacity = it->sCapacityToText(); + + + + // WINDOW * tmp = createEntryWindow( ((int)(stdscrX/3) - 2), 5, 3, (5* (it - pvecDrives->begin()) )+3, sModelFamily, sModelName, sCapacity); + WINDOW * tmp = createEntryWindow( ((int)(stdscrX/3) - 2), 5, 3, (5* (i) )+3, sModelFamily, sModelName, sCapacity); -}*/ \ No newline at end of file + // vWinDriveEntries.push_back(tmp); + wrefresh(tmp); + + i++; + } + + +} + + +void TUI::centerTitle(WINDOW *pwin, const char * title) { + int x, maxX, stringSize; + getmaxyx(pwin, maxX, maxX); + stringSize = 4 + strlen(title); + x = (maxX - stringSize)/2; + mvwaddch(pwin, 0, x, ACS_RTEE); + waddch(pwin, ' '); + waddstr(pwin, title); + waddch(pwin, ' '); + waddch(pwin, ACS_LTEE); +} + +WINDOW* TUI::createOverViewWindow( int iXSize, int iYSize) { + WINDOW *newWindow; + newWindow = newwin(iYSize, iXSize, 2, 2); + init_pair(COLOR_AREA_OVERVIEW, COLOR_BLACK, COLOR_GRAY); + wbkgd(newWindow, COLOR_PAIR(COLOR_AREA_OVERVIEW)); + box(newWindow, ACS_VLINE, ACS_HLINE); + + + time_t rawtime; + struct tm * timeinfo; + char buffer[80]; + + time (&rawtime); + timeinfo = localtime(&rawtime); + + strftime(buffer,sizeof(buffer),"%d-%m-%Y %H:%M:%S",timeinfo); + std::string str(buffer); + + + centerTitle(newWindow, str.c_str()); + + return newWindow; +} + + +WINDOW* TUI::createDetailViewWindow( int iXSize, int iYSize, int iXStart) { + WINDOW *newWindow; + newWindow = newwin(iYSize, iXSize, 2, iXStart); + init_pair(COLOR_AREA_OVERVIEW, COLOR_BLACK, COLOR_GRAY); + wbkgd(newWindow, COLOR_PAIR(COLOR_AREA_OVERVIEW)); + box(newWindow, ACS_VLINE, ACS_HLINE); + centerTitle(newWindow, "Selected Drive: xyz"); + + // mvaddstr(iXStart+1, 5, "Test"); + + return newWindow; +} + +WINDOW* TUI::createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, string sModelFamily, string sModelName, string sCapacity) { + WINDOW *newWindow; + newWindow = newwin(iYSize, iXSize, iYStart, iXStart); + init_pair(COLOR_AREA_ENTRY, COLOR_BLACK, COLOR_GRAY); + wbkgd(newWindow, COLOR_PAIR(COLOR_AREA_ENTRY)); + box(newWindow, ACS_VLINE, ACS_HLINE); + + attron(COLOR_PAIR(COLOR_AREA_ENTRY)); + mvaddstr(iYStart+1, 5, "Test"); + + //addstr("test"); + + + //cout << "X: " << sModelFamily << endl; + + // mvaddstr(iYStart+2, 5, sModelName.c_str()); + //mvaddstr(iYStart+3, 5, sCapacity.c_str()); + + refresh(); + + return newWindow; +} diff --git a/src/TUI/tui_data.cpp b/src/TUI/tui_data.cpp deleted file mode 100644 index 8fc2ad8..0000000 --- a/src/TUI/tui_data.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @file tui.cpp - * @brief display user interface - * @author hendrik schutter - * @date 03.08.2020 - */ - -//#include "../include/reHDD.h" - -/* - - TUI_DATA::TUI_DATA(vector * pvecDrives) -{ - - - - - - - - -} - - - - - - -*/ diff --git a/src/drive.cpp b/src/drive.cpp index c597b1e..f957170 100644 --- a/src/drive.cpp +++ b/src/drive.cpp @@ -46,6 +46,18 @@ uint32_t Drive::getPowerCycles(void) return u32PowerCycles; } +string Drive::sCapacityToText(){ + if(getCapacity() <= (999*1000000000U)){ + // Less or even 999 GB --> GB + return to_string(getCapacity() / 1000000000U) + " GB"; + } + else{ + // More 999 GB --> TB + return to_string(getCapacity() / 1000000000000U) + " TB"; + } + return "ERROR"; +} + /** * \brief set S.M.A.R.T. values in model * \param string modelFamily diff --git a/src/reHDD.cpp b/src/reHDD.cpp index 6042f85..d6f8055 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -12,6 +12,8 @@ static int fdSearchDrives[2];//File descriptor for pipe that informs if new driv static int fdUserInput[2];//File descriptor for pipe that informs if a user input occoures +static int fdWhipe[2];//File descriptor for pipe that informs if a wipe thread signals + static std::mutex mxScannDrives; static vector vecNewDrives; //store found drives that are updated every 5sec @@ -27,6 +29,8 @@ static fd_set selectSet; reHDD::reHDD(void) { cout << "created app" << endl; + + } /** @@ -38,15 +42,19 @@ void reHDD::app_logic(void) { cout << "app logic" << endl; + ui = new TUI(); + + ui->initTUI(); pipe(fdSearchDrives); + pipe(fdWhipe); FD_ZERO(&selectSet); FD_SET(fdSearchDrives[0], &selectSet); + FD_SET(fdWhipe[0], &selectSet); thread thDevices(ThreadScannDevices); //start thread that scanns for drives - while(1) { select(FD_SETSIZE, &selectSet, NULL, NULL, NULL); @@ -55,46 +63,24 @@ void reHDD::app_logic(void) char dummy; read (fdSearchDrives[0],&dummy,1); mxScannDrives.lock(); - - //replace with old list - // action if needed - - - filterNewDrives(&vecDrives, &vecNewDrives); + //printDrives(&vecDrives); + //TODO update UI - - printDrives(&vecDrives); + ui->updateTUI(&vecDrives); mxScannDrives.unlock(); } - } - - - - - // thDevices.join(); - - /* - - - - size_t u64SelectedDriveIndex = 0U; - size_t u64DriveVecSize = (vecDrives.size()); - - cout << "Select drive to wipe:" << endl; - cin >> u64SelectedDriveIndex; - cout << "Selected drive index: " << u64SelectedDriveIndex << endl; - - if(u64SelectedDriveIndex < (u64DriveVecSize)) { - // Wipe::wipeDrive(&vecDrives[u64SelectedDriveIndex]); + else if (FD_ISSET(fdWhipe[0], &selectSet)) { + cout << "Whipe signal" << endl; } - */ + } //endless loop + thDevices.join(); } void reHDD::ThreadScannDevices() { while(true) { - cout << "Thread" << endl; + // cout << "Thread" << endl; mxScannDrives.lock(); vecNewDrives.clear(); searchDrives(&vecNewDrives); //search for new drives and store them in list @@ -106,6 +92,7 @@ void reHDD::ThreadScannDevices() { } } + void reHDD::filterNewDrives(vector * pvecOldDrives, vector * pvecNewDrives) { vector ::iterator itOld; //Iterator for current (old) drive list @@ -118,7 +105,7 @@ void reHDD::filterNewDrives(vector * pvecOldDrives, vector * pvecN { if(itOld->getSerial() == itNew->getSerial()) { bOldDriveIsOffline = false; - // cout << "already online drive found: " << itOld->getPath() << endl; + // cout << "already online drive found: " << itOld->getPath() << endl; } } @@ -143,7 +130,7 @@ void reHDD::filterNewDrives(vector * pvecOldDrives, vector * pvecN */ void reHDD::searchDrives(vector * pvecDrives) { - cout << "search drives ..." << endl; + // cout << "search drives ..." << endl; char * cLine = NULL; size_t len = 0;