From aecfb27bcf1554ec738a00e84224f516c344a3c7 Mon Sep 17 00:00:00 2001 From: jhs507 Date: Mon, 3 May 2021 12:04:26 -0600 Subject: [PATCH 1/8] Changed default output format to requested style. Added the ability to take unix style command line arguments and options. Introduced option --obs_out to cause output to be formated as a .obs file. --- crhmcode/src/core/CRHMmain/CRHMmain.cpp | 137 ++++++++++++++++-- crhmcode/src/core/CRHMmain/CRHMmain.h | 8 +- .../src/core/StandardConverterUtility.cpp | 2 +- crhmcode/src/gcc/CRHMArguments.h | 15 ++ crhmcode/src/gcc/main.cpp | 76 +++++++++- crhmcode/src/vcc/CRHM_GUI.vcxproj | 1 + crhmcode/src/vcc/CRHM_GUI.vcxproj.filters | 3 + crhmcode/src/vcc/gui/CRHMmainDlg.cpp | Bin 136312 -> 136344 bytes 8 files changed, 221 insertions(+), 21 deletions(-) create mode 100644 crhmcode/src/gcc/CRHMArguments.h diff --git a/crhmcode/src/core/CRHMmain/CRHMmain.cpp b/crhmcode/src/core/CRHMmain/CRHMmain.cpp index 5eeb116bc..d8855a175 100644 --- a/crhmcode/src/core/CRHMmain/CRHMmain.cpp +++ b/crhmcode/src/core/CRHMmain/CRHMmain.cpp @@ -71,16 +71,16 @@ CRHMmain* CRHMmain::getInstance() { if (instance == 0) { - instance = new CRHMmain(); + instance = new CRHMmain(NULL); } return instance; } -CRHMmain::CRHMmain() +CRHMmain::CRHMmain(struct crhm_arguments * arguments) { - FormCreate(); + FormCreate(arguments); } @@ -865,7 +865,20 @@ void CRHMmain::SetSharedParams(ClassPar *basinPar) { } -void CRHMmain::FormCreate(void) { +void CRHMmain::FormCreate(struct crhm_arguments* arguments) { + + if (arguments == NULL) + { + //Use default values + Global::TimeFormat = TIMEFORMAT::MS; + this->ObsOut = false; + } + else + { + Global::TimeFormat = arguments->time_format; + this->ObsOut = arguments->obs_out; + } + Global::BuildFlag = TBuild::BUILD; @@ -956,7 +969,7 @@ void CRHMmain::FormCreate(void) { Global::NaNcheck = false; Global::LOGVARLOAD = false; - Global::TimeFormat = TIMEFORMAT::MS; + } @@ -2365,14 +2378,26 @@ void CRHMmain::AllRprt(void) { TStringList *LogList = new TStringList; - RprtHeader(LogList, SeriesCnt); + if (this->ObsOut) + { + //.obs file output header + RprtHeaderObs(LogList, SeriesCnt); + } + else + { + //standard output header + RprtHeader(LogList, SeriesCnt); + } + + + string Sx, Sy; for (int nn = 0; nn < cdSeries[0]->Count(); ++nn) { - //Sx = FloatToStrF(cdSeries[0]->XValue(nn), ffGeneral, 10, 0); - //Sx = StandardConverterUtility::GetDateTimeInStringForOutput(cdSeries[0]->XValue(nn)); + Sx = FloatToStrF(cdSeries[0]->XValue(nn), TFloatFormat::ffGeneral, 10, 0); + Sx = StandardConverterUtility::GetDateTimeInStringForOutput(cdSeries[0]->XValue(nn)); //added this switch statement according to Peter's code. switch (Global::TimeFormat) { @@ -2396,10 +2421,10 @@ void CRHMmain::AllRprt(void) ClassVar *thisVar = (ClassVar *)cdSeries[vv]->Tag; int prec = 7; //Manishankar did this, because GCC is showing segmentation fault here. thisVar remains null. - /* - if (thisVar->varType == CRHM::Int || thisVar->varType == CRHM::ReadI) + + if (thisVar->varType == TVar::Int || thisVar->varType == TVar::ReadI) prec = 7; - */ + Sy = FloatToStrF(cdSeries[vv]->YValue(nn), TFloatFormat::ffGeneral, prec, 10); Sx = Sx + "\t" + Sy; } @@ -2423,6 +2448,22 @@ void CRHMmain::LastRprt(void) int nn = cdSeries[0]->Count(); Sx = FloatToStrF(cdSeries[0]->XValue(nn - 1), TFloatFormat::ffGeneral, 10, 0); + Sx = StandardConverterUtility::GetDateTimeInStringForOutput(cdSeries[0]->XValue(nn-1)); + + //added this switch statement according to Peter's code. + switch (Global::TimeFormat) { + case TIMEFORMAT::MS: + Sx = FloatToStrF(cdSeries[0]->XValue(nn-1), TFloatFormat::ffGeneral, 10, 0); + break; + case TIMEFORMAT::MMDDYYYY: + Sx = StandardConverterUtility::FormatDateTime("mm/dd/yyyy hh:mm ", cdSeries[0]->XValue(nn-1)); + break; + case TIMEFORMAT::YYYYMMDD: + Sx = StandardConverterUtility::FormatDateTime("yyyy-mm-dd hh:mm ", cdSeries[0]->XValue(nn-1)); + break; + default: + break; + } for (int vv = 0; vv < SeriesCnt; ++vv) { ClassVar *thisVar = (ClassVar *)cdSeries[vv]->Tag; @@ -2802,6 +2843,69 @@ void CRHMmain::RprtHeader(TStringList *LogList, int LocalCnt) long ID = 0; + if (!thisPar) { + MapPar::iterator itPar; + + for (itPar = Global::MapPars.begin(); itPar != Global::MapPars.end(); itPar++) { + thisPar = (*itPar).second; + if (thisPar->param == "RUN_ID") { + ID = thisPar->ivalues[0]; + break; + } + } + } + else + ID = thisPar->ivalues[0]; + + OpenNameReport = ProjectDirectory + "/CRHM_output"; //manishankar updated this line to make it suitable for both windows and linux.s + if (ID >= 0) { + if (ID > 0) { + OpenNameReport += "_"; + OpenNameReport += inttoStr(ID); + } + OpenNameReport += ".txt"; + } + else if (ID < 0) { + ID = -ID; + OpenNameReport = OpenNamePrj.substr(0, OpenNamePrj.length() - 4) + "_" + Common::longtoStr(ID) + ".txt"; + } + + //LogList->Add("Future File Description"); + /** + for (int vv = 0; vv < LocalCnt; ++vv) { + ClassVar *thisVar = (ClassVar *)cdSeries[vv]->Tag; + Sx = cdSeries[vv]->Title; + Sx += string(" 1 "); + Sx += thisVar->units; + LogList->Add(Sx); + } + **/ + Sx = "time"; + for (int vv = 0; vv < LocalCnt; ++vv) { + string S = cdSeries[vv]->Title; + Sx += "\t" + S; + } + LogList->Add(Sx); + + Sx = "units"; + for (int vv = 0; vv < LocalCnt; ++vv) { + ClassVar* thisVar = (ClassVar*)cdSeries[vv]->Tag; + string S = thisVar->units; + Sx += "\t" + S; + } + LogList->Add(Sx); +} + +void CRHMmain::RprtHeaderObs(TStringList* LogList, int LocalCnt) +{ + + string Sx, Sy; + + ClassPar* thisPar; + thisPar = ParFind("basin RUN_ID"); + + long ID = 0; + if (!thisPar) { MapPar::iterator itPar; @@ -2830,22 +2934,23 @@ void CRHMmain::RprtHeader(TStringList *LogList, int LocalCnt) } LogList->Add("Future File Description"); - + for (int vv = 0; vv < LocalCnt; ++vv) { ClassVar *thisVar = (ClassVar *)cdSeries[vv]->Tag; Sx = cdSeries[vv]->Title; Sx += string(" 1 "); - //gcc is showing segmentation fault here. thisVar remains null. - //Sx += thisVar->units; + Sx += thisVar->units; LogList->Add(Sx); } - - Sx = "##### time"; + + Sx = "time"; for (int vv = 0; vv < LocalCnt; ++vv) { string S = cdSeries[vv]->Title; Sx += "\t" + S; } LogList->Add(Sx); + + Global::TimeFormat = TIMEFORMAT::MS; } string CRHMmain::DttoStr(double D) { diff --git a/crhmcode/src/core/CRHMmain/CRHMmain.h b/crhmcode/src/core/CRHMmain/CRHMmain.h index a089b2743..d855b3ba4 100644 --- a/crhmcode/src/core/CRHMmain/CRHMmain.h +++ b/crhmcode/src/core/CRHMmain/CRHMmain.h @@ -28,6 +28,7 @@ #include "TSeries.h" #include "Classinfo.h" #include "CRHMLogger.h" +#include "../../gcc/CRHMArguments.h" //class ObsFileInfo { //private: @@ -51,7 +52,7 @@ class CRHMmain CRHMLogger* Logger; static CRHMmain * getInstance(); - CRHMmain(); + CRHMmain(struct crhm_arguments * ); //virtual void DoPrjOpen(string OpenNamePrj, string ProjectDirectory); string Sstrings[12] = { "", "_WtoMJ", "_MJtoW", "_Avg", "_Min", "_Max", "_Sum", "_Pos", "_Tot", "_Tot/Freq", "_First", "_Last" }; @@ -106,6 +107,8 @@ class CRHMmain bool ShiftDown; // Linked to ListBox1 and ListBox2 bool HruNames; + bool ObsOut; + typedef void LoadModuleType(string DllName); // TDateTime ProjectFileDate; @@ -122,7 +125,7 @@ class CRHMmain void makeQuery(string statementtype, string statement, string fields, int fieldcount); string getQueryValue(int row, int column); - void FormCreate(void); + void FormCreate(struct crhm_arguments*); void InitModules(void); @@ -184,6 +187,7 @@ class CRHMmain void ControlSaveState(bool MainLoop, ClassPar * VarPar, BitSet &Bit); void DoObsStatus(bool &First); void RprtHeader(TStringList *LogList, int LocalCnt); + void RprtHeaderObs(TStringList *LogList, int LocalCnt); void ResetLoopList(void); void ReadStateFile(bool & GoodRun); string DttoStr(double D); diff --git a/crhmcode/src/core/StandardConverterUtility.cpp b/crhmcode/src/core/StandardConverterUtility.cpp index 72ed83e1d..27cad1e64 100644 --- a/crhmcode/src/core/StandardConverterUtility.cpp +++ b/crhmcode/src/core/StandardConverterUtility.cpp @@ -163,7 +163,7 @@ std::string StandardConverterUtility::FormatDateTime(std::string fmt, double dat } else if (fmt == "yyyy-mm-dd hh:mm ") { - return to_string(y) + "-" + m1 + "-" + d1 + " " + h1 + ":" + min1; + return to_string(y) + "-" + m1 + "-" + d1 + "T" + h1 + ":" + min1; } return ""; diff --git a/crhmcode/src/gcc/CRHMArguments.h b/crhmcode/src/gcc/CRHMArguments.h new file mode 100644 index 000000000..a97ef1565 --- /dev/null +++ b/crhmcode/src/gcc/CRHMArguments.h @@ -0,0 +1,15 @@ +#ifndef CRHM_ARGUMENTS +#define CRHM_ARGUMENTS + +#include "../core/Common/Common.h" + +struct crhm_arguments +{ + char* args[1]; + TIMEFORMAT time_format; + bool obs_out; +}; + +#endif // !CRHM_ARGUMENTS + + diff --git a/crhmcode/src/gcc/main.cpp b/crhmcode/src/gcc/main.cpp index b8d97df84..182495dab 100644 --- a/crhmcode/src/gcc/main.cpp +++ b/crhmcode/src/gcc/main.cpp @@ -1,13 +1,85 @@ //#include "stdafx.h" #include +#include #include "../core/CRHMmain/CRHMmain.h" +const char * argp_program_version = + "CRHMcode gcc Version 1.2"; +const char * argp_program_bug_address = + ""; + +static char doc[] = "CRHM"; + +static char args_doc[] = "PROJECT_FILE [STRING...]"; + +static struct argp_option options[] = +{ + {"time_format", 't', "TIME_FORMAT", 0, "Specify the desired time fromat in the output file."}, + {"obs_out", 1000, 0, 0, "Produces output as an .obs file."}, + {0} +}; + +static error_t +parse_opt (int key, char *arg, struct argp_state *state) +{ + struct crhm_arguments *arguments = static_cast(state->input); + char microsoftDates[] = "MS"; + + switch (key) + { + case 't': + if(!strcmp(arg, microsoftDates)) + { + arguments->time_format = TIMEFORMAT::MS; + } + else + { + std::cout << std::string(arg) + " - Not a recognized time format." << '\n'; + return ARGP_ERR_UNKNOWN; + } + + break; + + case 1000: //obs_out is selected + arguments->obs_out = true; + break; + + case ARGP_KEY_ARG: + if (state->arg_num >= 1) + { + argp_usage(state); + } + arguments->args[state->arg_num] = arg; + break; + + case ARGP_KEY_END: + if (state->arg_num < 1) + { + argp_usage(state); + } + break; + + default: + return ARGP_ERR_UNKNOWN; + } + return 0; +} + +static struct argp argp = {options, parse_opt, args_doc, doc}; + int main(int argc, char *argv[]) { - CRHMmain * m = new CRHMmain(); - std::string projectArgument = argv[1]; + struct crhm_arguments arguments; + arguments.time_format = TIMEFORMAT::YYYYMMDD; + arguments.obs_out = false; + + argp_parse(&argp, argc, argv, 0, 0, &arguments); + + CRHMmain * m = new CRHMmain(&arguments); + + std::string projectArgument = arguments.args[0]; m->OpenNamePrj = projectArgument; m->DoPrjOpen(projectArgument, ""); diff --git a/crhmcode/src/vcc/CRHM_GUI.vcxproj b/crhmcode/src/vcc/CRHM_GUI.vcxproj index 7cf2f8680..f99da15f9 100644 --- a/crhmcode/src/vcc/CRHM_GUI.vcxproj +++ b/crhmcode/src/vcc/CRHM_GUI.vcxproj @@ -197,6 +197,7 @@ + diff --git a/crhmcode/src/vcc/CRHM_GUI.vcxproj.filters b/crhmcode/src/vcc/CRHM_GUI.vcxproj.filters index 1884389d5..7ac5ac1aa 100644 --- a/crhmcode/src/vcc/CRHM_GUI.vcxproj.filters +++ b/crhmcode/src/vcc/CRHM_GUI.vcxproj.filters @@ -1473,6 +1473,9 @@ Resource Files\Header Files + + Resource Files\Header Files + diff --git a/crhmcode/src/vcc/gui/CRHMmainDlg.cpp b/crhmcode/src/vcc/gui/CRHMmainDlg.cpp index 27c6f39e38a6700c93f8272a2d09051d70167b6c..e6b34eef43265e92120fb850ec96b62cc6e0d0ad 100644 GIT binary patch delta 77 zcmeydf@8)?jtx0%?0yWP3_c7#o3q(&GQv2M?b*a9v5RcZ Date: Mon, 3 May 2021 14:17:57 -0600 Subject: [PATCH 2/8] Reworked how arguments from commandline are handled no longer passing through to FormCreate() --- crhmcode/src/core/CRHMmain/CRHMmain.cpp | 29 ++++++++++++------------ crhmcode/src/core/CRHMmain/CRHMmain.h | 2 +- crhmcode/src/vcc/gui/CRHMmainDlg.cpp | Bin 136344 -> 136312 bytes 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/crhmcode/src/core/CRHMmain/CRHMmain.cpp b/crhmcode/src/core/CRHMmain/CRHMmain.cpp index d8855a175..2c8c520a9 100644 --- a/crhmcode/src/core/CRHMmain/CRHMmain.cpp +++ b/crhmcode/src/core/CRHMmain/CRHMmain.cpp @@ -80,7 +80,19 @@ CRHMmain* CRHMmain::getInstance() CRHMmain::CRHMmain(struct crhm_arguments * arguments) { - FormCreate(arguments); + if (arguments == NULL) + { + //Use default values + Global::TimeFormat = TIMEFORMAT::MS; + this->ObsOut = false; + } + else + { + Global::TimeFormat = arguments->time_format; + this->ObsOut = arguments->obs_out; + } + + FormCreate(); } @@ -865,20 +877,7 @@ void CRHMmain::SetSharedParams(ClassPar *basinPar) { } -void CRHMmain::FormCreate(struct crhm_arguments* arguments) { - - if (arguments == NULL) - { - //Use default values - Global::TimeFormat = TIMEFORMAT::MS; - this->ObsOut = false; - } - else - { - Global::TimeFormat = arguments->time_format; - this->ObsOut = arguments->obs_out; - } - +void CRHMmain::FormCreate() { Global::BuildFlag = TBuild::BUILD; diff --git a/crhmcode/src/core/CRHMmain/CRHMmain.h b/crhmcode/src/core/CRHMmain/CRHMmain.h index d855b3ba4..6eb155a03 100644 --- a/crhmcode/src/core/CRHMmain/CRHMmain.h +++ b/crhmcode/src/core/CRHMmain/CRHMmain.h @@ -125,7 +125,7 @@ class CRHMmain void makeQuery(string statementtype, string statement, string fields, int fieldcount); string getQueryValue(int row, int column); - void FormCreate(struct crhm_arguments*); + void FormCreate(void); void InitModules(void); diff --git a/crhmcode/src/vcc/gui/CRHMmainDlg.cpp b/crhmcode/src/vcc/gui/CRHMmainDlg.cpp index e6b34eef43265e92120fb850ec96b62cc6e0d0ad..27c6f39e38a6700c93f8272a2d09051d70167b6c 100644 GIT binary patch delta 57 zcmbQSlH Date: Mon, 3 May 2021 14:18:14 -0600 Subject: [PATCH 3/8] Added a comment noting the start of setting default arguments. --- crhmcode/src/gcc/main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/crhmcode/src/gcc/main.cpp b/crhmcode/src/gcc/main.cpp index 182495dab..54f577a09 100644 --- a/crhmcode/src/gcc/main.cpp +++ b/crhmcode/src/gcc/main.cpp @@ -72,6 +72,7 @@ int main(int argc, char *argv[]) { struct crhm_arguments arguments; + // Set Default Argument Values arguments.time_format = TIMEFORMAT::YYYYMMDD; arguments.obs_out = false; From 777a76aead40ef30172086b2cb7f1e4e997c4f53 Mon Sep 17 00:00:00 2001 From: jhs507 Date: Tue, 4 May 2021 17:00:34 -0600 Subject: [PATCH 4/8] Changed the way that CRHM Handles arguments to not require any no standard libs. --- crhmcode/src/gcc/CRHMArguments.h | 4 +- crhmcode/src/gcc/main.cpp | 118 +++++++++++++--------- crhmcode/src/vcc/CRHM_GUI.vcxproj | 1 + crhmcode/src/vcc/CRHM_GUI.vcxproj.filters | 3 + 4 files changed, 79 insertions(+), 47 deletions(-) diff --git a/crhmcode/src/gcc/CRHMArguments.h b/crhmcode/src/gcc/CRHMArguments.h index a97ef1565..b2afc723d 100644 --- a/crhmcode/src/gcc/CRHMArguments.h +++ b/crhmcode/src/gcc/CRHMArguments.h @@ -3,9 +3,11 @@ #include "../core/Common/Common.h" +const string USE_MESSAGE = "\nI am the usage message! I will be written later...\n"; + struct crhm_arguments { - char* args[1]; + std::string project_name; TIMEFORMAT time_format; bool obs_out; }; diff --git a/crhmcode/src/gcc/main.cpp b/crhmcode/src/gcc/main.cpp index 54f577a09..b54c0107a 100644 --- a/crhmcode/src/gcc/main.cpp +++ b/crhmcode/src/gcc/main.cpp @@ -1,6 +1,6 @@ //#include "stdafx.h" #include -#include + #include "../core/CRHMmain/CRHMmain.h" const char * argp_program_version = @@ -12,60 +12,72 @@ static char doc[] = "CRHM"; static char args_doc[] = "PROJECT_FILE [STRING...]"; -static struct argp_option options[] = -{ - {"time_format", 't', "TIME_FORMAT", 0, "Specify the desired time fromat in the output file."}, - {"obs_out", 1000, 0, 0, "Produces output as an .obs file."}, - {0} -}; - -static error_t -parse_opt (int key, char *arg, struct argp_state *state) +std::string unrecongnized_option(char * option) { - struct crhm_arguments *arguments = static_cast(state->input); - char microsoftDates[] = "MS"; - - switch (key) - { - case 't': - if(!strcmp(arg, microsoftDates)) - { - arguments->time_format = TIMEFORMAT::MS; - } - else - { - std::cout << std::string(arg) + " - Not a recognized time format." << '\n'; - return ARGP_ERR_UNKNOWN; - } + std::string message = + "\nUnrecognized option \"" + + std::string(option) + + "\" given. Use option --help for usage information.\n"; + return message; +} - break; - case 1000: //obs_out is selected - arguments->obs_out = true; - break; +void read_option(char ** argv, struct crhm_arguments * arguments, int * i) +{ - case ARGP_KEY_ARG: - if (state->arg_num >= 1) - { - argp_usage(state); - } - arguments->args[state->arg_num] = arg; - break; - case ARGP_KEY_END: - if (state->arg_num < 1) + switch (argv[*i][1]) + { + case 't': + *i = *i + 1; + if (!strcmp(argv[*i], "MS")) + { + arguments->time_format = TIMEFORMAT::MS; + } + else if (!strcmp(argv[*i], "YYYYMMDD")) + { + arguments->time_format = TIMEFORMAT::YYYYMMDD; + } + else if (!strcmp(argv[*i], "MMDDYYYY")) + { + arguments->time_format = TIMEFORMAT::MMDDYYYY; + } + else + { + std::cout << "\nUnable to read time format argument. "+ std::string(argv[*i]) +"\n"; + std::cout << "-t must be followed directey by a valid time format.\n"; + std::cout << "Valid formats are: \n\t\tMS \n\t\tYYYYMMDD \n\t\tMMDDYYYY\n"; + exit(1); + } + break; + case 'h': + std::cout << USE_MESSAGE; + exit(1); + case '-': + switch (argv[*i][2]) + { + case 'h': + if (!strcmp(argv[*i], "--help")) { - argp_usage(state); + std::cout << USE_MESSAGE; + exit(1); } - break; - default: - return ARGP_ERR_UNKNOWN; + std::cout << unrecongnized_option(argv[*i]); + exit(1); + } + break; + default: + std::cout << unrecongnized_option(argv[*i]); + exit(1); } - return 0; + } -static struct argp argp = {options, parse_opt, args_doc, doc}; +void read_argument(char* argument, struct crhm_arguments* arguments) +{ + arguments->project_name = std::string(argument); +} int main(int argc, char *argv[]) @@ -73,14 +85,28 @@ int main(int argc, char *argv[]) struct crhm_arguments arguments; // Set Default Argument Values + arguments.project_name = ""; arguments.time_format = TIMEFORMAT::YYYYMMDD; arguments.obs_out = false; - argp_parse(&argp, argc, argv, 0, 0, &arguments); + /* + * Read the incoming argv[] vector + */ + for (int i = 1; i < argc; i++) + { + if (argv[i][0] == '-') + { + read_option(argv, &arguments, &i); + } + else + { + read_argument(argv[i], &arguments); + } + } CRHMmain * m = new CRHMmain(&arguments); - std::string projectArgument = arguments.args[0]; + std::string projectArgument = arguments.project_name; m->OpenNamePrj = projectArgument; m->DoPrjOpen(projectArgument, ""); diff --git a/crhmcode/src/vcc/CRHM_GUI.vcxproj b/crhmcode/src/vcc/CRHM_GUI.vcxproj index f99da15f9..fd307714f 100644 --- a/crhmcode/src/vcc/CRHM_GUI.vcxproj +++ b/crhmcode/src/vcc/CRHM_GUI.vcxproj @@ -764,6 +764,7 @@ + diff --git a/crhmcode/src/vcc/CRHM_GUI.vcxproj.filters b/crhmcode/src/vcc/CRHM_GUI.vcxproj.filters index 7ac5ac1aa..b5da585b9 100644 --- a/crhmcode/src/vcc/CRHM_GUI.vcxproj.filters +++ b/crhmcode/src/vcc/CRHM_GUI.vcxproj.filters @@ -2102,6 +2102,9 @@ Source Files + + Source Files + From fe3642ddce08e8b2d361de17b3d5719a76a7139b Mon Sep 17 00:00:00 2001 From: jhs507 Date: Wed, 5 May 2021 12:14:48 -0600 Subject: [PATCH 5/8] Added command line argument parsing for file formats. Currently OBS and STD formats are supported. --- crhmcode/src/core/CRHMmain/CRHMmain.cpp | 28 ++++++++++++++--------- crhmcode/src/core/CRHMmain/CRHMmain.h | 2 +- crhmcode/src/gcc/CRHMArguments.h | 20 +++++++++++++++-- crhmcode/src/gcc/main.cpp | 30 ++++++++++++++++++++----- 4 files changed, 61 insertions(+), 19 deletions(-) diff --git a/crhmcode/src/core/CRHMmain/CRHMmain.cpp b/crhmcode/src/core/CRHMmain/CRHMmain.cpp index 2c8c520a9..4176daff5 100644 --- a/crhmcode/src/core/CRHMmain/CRHMmain.cpp +++ b/crhmcode/src/core/CRHMmain/CRHMmain.cpp @@ -84,12 +84,18 @@ CRHMmain::CRHMmain(struct crhm_arguments * arguments) { //Use default values Global::TimeFormat = TIMEFORMAT::MS; - this->ObsOut = false; + this->OutputFormat = OUTPUT_FORMAT::STD; } else { Global::TimeFormat = arguments->time_format; - this->ObsOut = arguments->obs_out; + this->OutputFormat = arguments->output_format; + + //Obs output format must have MS time format. + if (this->OutputFormat == OUTPUT_FORMAT::OBS) + { + Global::TimeFormat = TIMEFORMAT::MS; + } } FormCreate(); @@ -2377,20 +2383,24 @@ void CRHMmain::AllRprt(void) { TStringList *LogList = new TStringList; - if (this->ObsOut) + if (this->OutputFormat == OUTPUT_FORMAT::STD) + { + //standard output header + RprtHeader(LogList, SeriesCnt); + } + else if (this->OutputFormat == OUTPUT_FORMAT::OBS) { //.obs file output header RprtHeaderObs(LogList, SeriesCnt); } - else + else { + CRHMException e = CRHMException("No output format was specified defaulting to STD.", TExcept::WARNING); + CRHMLogger::instance()->log_run_error(e); //standard output header RprtHeader(LogList, SeriesCnt); } - - - string Sx, Sy; for (int nn = 0; nn < cdSeries[0]->Count(); ++nn) { @@ -2942,14 +2952,12 @@ void CRHMmain::RprtHeaderObs(TStringList* LogList, int LocalCnt) LogList->Add(Sx); } - Sx = "time"; + Sx = "###### time"; for (int vv = 0; vv < LocalCnt; ++vv) { string S = cdSeries[vv]->Title; Sx += "\t" + S; } LogList->Add(Sx); - - Global::TimeFormat = TIMEFORMAT::MS; } string CRHMmain::DttoStr(double D) { diff --git a/crhmcode/src/core/CRHMmain/CRHMmain.h b/crhmcode/src/core/CRHMmain/CRHMmain.h index 6eb155a03..e3eb5b777 100644 --- a/crhmcode/src/core/CRHMmain/CRHMmain.h +++ b/crhmcode/src/core/CRHMmain/CRHMmain.h @@ -107,7 +107,7 @@ class CRHMmain bool ShiftDown; // Linked to ListBox1 and ListBox2 bool HruNames; - bool ObsOut; + OUTPUT_FORMAT OutputFormat; typedef void LoadModuleType(string DllName); diff --git a/crhmcode/src/gcc/CRHMArguments.h b/crhmcode/src/gcc/CRHMArguments.h index b2afc723d..a68f18f11 100644 --- a/crhmcode/src/gcc/CRHMArguments.h +++ b/crhmcode/src/gcc/CRHMArguments.h @@ -3,13 +3,29 @@ #include "../core/Common/Common.h" -const string USE_MESSAGE = "\nI am the usage message! I will be written later...\n"; +enum class OUTPUT_FORMAT {STD, OBS}; + +const string USE_MESSAGE = "\ncrhm [options] PROJECT_FILE\n" + "\n" + "\t-h - Display this message.\n" + "\n" + "\t-t TIME_FORMAT - Select the format for date time outputs.\n" + "\t\tValid formats are:\n" + "\t\tMS - Microsoft Excel floating point.\n" + "\t\tYYYYMMDD - year-month-dayTtime.\n" + "\t\tMMDDYYYY - month/day/year time.\n" + "\n" + "\t-f OUTPUT_FORMAT - Select the file format for the output.\n" + "\t\tValid formats are:\n" + "\t\tSTD - Standard output format. Sutable for a spreadsheet.\n" + "\t\tOBS - Observation file .obs format. Sutable for reading with CRHM GUI.\n" + "\n"; struct crhm_arguments { std::string project_name; TIMEFORMAT time_format; - bool obs_out; + OUTPUT_FORMAT output_format; }; #endif // !CRHM_ARGUMENTS diff --git a/crhmcode/src/gcc/main.cpp b/crhmcode/src/gcc/main.cpp index b54c0107a..3aaac8b1b 100644 --- a/crhmcode/src/gcc/main.cpp +++ b/crhmcode/src/gcc/main.cpp @@ -28,6 +28,9 @@ void read_option(char ** argv, struct crhm_arguments * arguments, int * i) switch (argv[*i][1]) { + case 'h': + std::cout << USE_MESSAGE; + exit(1); case 't': *i = *i + 1; if (!strcmp(argv[*i], "MS")) @@ -45,14 +48,29 @@ void read_option(char ** argv, struct crhm_arguments * arguments, int * i) else { std::cout << "\nUnable to read time format argument. "+ std::string(argv[*i]) +"\n"; - std::cout << "-t must be followed directey by a valid time format.\n"; - std::cout << "Valid formats are: \n\t\tMS \n\t\tYYYYMMDD \n\t\tMMDDYYYY\n"; + std::cout << "-t must be followed directly by a valid time format.\n"; + std::cout << "Valid formats are: \n\tMS \n\tYYYYMMDD \n\tMMDDYYYY\n"; + exit(1); + } + break; + case 'f': + *i = *i + 1; + if (!strcmp(argv[*i], "STD")) + { + arguments->output_format = OUTPUT_FORMAT::STD; + } + else if (!strcmp(argv[*i], "OBS")) + { + arguments->output_format = OUTPUT_FORMAT::OBS; + } + else + { + std::cout << "\nUnable to read output format argument. " + std::string(argv[*i]) + "\n"; + std::cout << "-f must be followed directly by a valid output format.\n"; + std::cout << "Valid formats are: \n\tSTD - standard output.\n\tOBS - obsfile output.\n"; exit(1); } break; - case 'h': - std::cout << USE_MESSAGE; - exit(1); case '-': switch (argv[*i][2]) { @@ -87,7 +105,7 @@ int main(int argc, char *argv[]) // Set Default Argument Values arguments.project_name = ""; arguments.time_format = TIMEFORMAT::YYYYMMDD; - arguments.obs_out = false; + arguments.output_format = OUTPUT_FORMAT::STD; /* * Read the incoming argv[] vector From ae9765b592cbfe4f5386e18bb58b2fb68102ee0e Mon Sep 17 00:00:00 2001 From: jhs507 Date: Wed, 5 May 2021 15:02:19 -0600 Subject: [PATCH 6/8] Reorganized time formats so that there are 4 types. MS, ISO, YYYYMMDD, and MMDDYYYY. --- crhmcode/src/core/CRHMmain/CRHMmain.cpp | 14 +++++++------- crhmcode/src/core/Common/Common.h | 2 +- crhmcode/src/core/StandardConverterUtility.cpp | 4 ++++ crhmcode/src/gcc/CRHMArguments.h | 5 +++-- crhmcode/src/gcc/main.cpp | 9 ++++++--- 5 files changed, 21 insertions(+), 13 deletions(-) diff --git a/crhmcode/src/core/CRHMmain/CRHMmain.cpp b/crhmcode/src/core/CRHMmain/CRHMmain.cpp index 4176daff5..8c24b93c1 100644 --- a/crhmcode/src/core/CRHMmain/CRHMmain.cpp +++ b/crhmcode/src/core/CRHMmain/CRHMmain.cpp @@ -83,19 +83,13 @@ CRHMmain::CRHMmain(struct crhm_arguments * arguments) if (arguments == NULL) { //Use default values - Global::TimeFormat = TIMEFORMAT::MS; + Global::TimeFormat = TIMEFORMAT::ISO; this->OutputFormat = OUTPUT_FORMAT::STD; } else { Global::TimeFormat = arguments->time_format; this->OutputFormat = arguments->output_format; - - //Obs output format must have MS time format. - if (this->OutputFormat == OUTPUT_FORMAT::OBS) - { - Global::TimeFormat = TIMEFORMAT::MS; - } } FormCreate(); @@ -2419,6 +2413,9 @@ void CRHMmain::AllRprt(void) case TIMEFORMAT::YYYYMMDD: Sx = StandardConverterUtility::FormatDateTime("yyyy-mm-dd hh:mm ", cdSeries[0]->XValue(nn)); break; + case TIMEFORMAT::ISO: + Sx = StandardConverterUtility::FormatDateTime("ISO", cdSeries[0]->XValue(nn)); + break; default: break; } @@ -2470,6 +2467,9 @@ void CRHMmain::LastRprt(void) case TIMEFORMAT::YYYYMMDD: Sx = StandardConverterUtility::FormatDateTime("yyyy-mm-dd hh:mm ", cdSeries[0]->XValue(nn-1)); break; + case TIMEFORMAT::ISO: + Sx = StandardConverterUtility::FormatDateTime("ISO", cdSeries[0]->XValue(nn)); + break; default: break; } diff --git a/crhmcode/src/core/Common/Common.h b/crhmcode/src/core/Common/Common.h index 0a8f57fc8..7dd0e08f4 100644 --- a/crhmcode/src/core/Common/Common.h +++ b/crhmcode/src/core/Common/Common.h @@ -71,7 +71,7 @@ enum class TExtra { BLANK, DD, TT, DT }; enum class TAKA { AKAERROR = -1, VARG, OBSR, VARD, OBSD, PARD, OBSF, AKAEND }; enum TMsgDlgBtn { mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToAll, mbYesToAll, mbHelp }; enum class TBuild { BUILD, DECL, INIT, RUN }; -enum class TIMEFORMAT { MS, MMDDYYYY, YYYYMMDD }; +enum class TIMEFORMAT { MS, MMDDYYYY, YYYYMMDD, ISO}; enum class LMODULE { BASIC, MACRO, ADVANCE, SUPPORT, CUSTOM, PROTO, OBSOL }; enum class TFun { FOBS, VP_SAT, W_MJ, MJ_W, AVG, MIN, MAX, TOT, POS, FIRST, LAST, CNT, CNT0, DLTA, INTVL, DAY, DTOT }; enum class TVISIBLE { OUTPUT, USUAL, DIAGNOSTIC, PRIVATE }; // OUTPUT infers all variables/parameters diff --git a/crhmcode/src/core/StandardConverterUtility.cpp b/crhmcode/src/core/StandardConverterUtility.cpp index 27cad1e64..44493ec15 100644 --- a/crhmcode/src/core/StandardConverterUtility.cpp +++ b/crhmcode/src/core/StandardConverterUtility.cpp @@ -162,6 +162,10 @@ std::string StandardConverterUtility::FormatDateTime(std::string fmt, double dat return m1 + "/" + d1 + "/" + to_string(y) + " " + h1 + ":" + min1+" "; } else if (fmt == "yyyy-mm-dd hh:mm ") + { + return to_string(y) + " " + m1 + " " + d1 + " " + h1 + " " + min1; + } + else if (fmt == "ISO") { return to_string(y) + "-" + m1 + "-" + d1 + "T" + h1 + ":" + min1; } diff --git a/crhmcode/src/gcc/CRHMArguments.h b/crhmcode/src/gcc/CRHMArguments.h index a68f18f11..3a43725e4 100644 --- a/crhmcode/src/gcc/CRHMArguments.h +++ b/crhmcode/src/gcc/CRHMArguments.h @@ -12,8 +12,9 @@ const string USE_MESSAGE = "\ncrhm [options] PROJECT_FILE\n" "\t-t TIME_FORMAT - Select the format for date time outputs.\n" "\t\tValid formats are:\n" "\t\tMS - Microsoft Excel floating point.\n" - "\t\tYYYYMMDD - year-month-dayTtime.\n" - "\t\tMMDDYYYY - month/day/year time.\n" + "\t\tISO - ISO 8601 extended format YYYY-MM-DDThh:mm\n" + "\t\tYYYYMMDD - YYYY MM DD hh mm\n" + "\t\tMMDDYYYY - MM/DD/YYYY hh:mm.\n" "\n" "\t-f OUTPUT_FORMAT - Select the file format for the output.\n" "\t\tValid formats are:\n" diff --git a/crhmcode/src/gcc/main.cpp b/crhmcode/src/gcc/main.cpp index 3aaac8b1b..fd8c851ad 100644 --- a/crhmcode/src/gcc/main.cpp +++ b/crhmcode/src/gcc/main.cpp @@ -45,11 +45,15 @@ void read_option(char ** argv, struct crhm_arguments * arguments, int * i) { arguments->time_format = TIMEFORMAT::MMDDYYYY; } + else if (!strcmp(argv[*i], "ISO")) + { + arguments->time_format = TIMEFORMAT::ISO; + } else { std::cout << "\nUnable to read time format argument. "+ std::string(argv[*i]) +"\n"; std::cout << "-t must be followed directly by a valid time format.\n"; - std::cout << "Valid formats are: \n\tMS \n\tYYYYMMDD \n\tMMDDYYYY\n"; + std::cout << "Valid formats are: \n\tMS \n\tISO \n\tYYYYMMDD \n\tMMDDYYYY\n"; exit(1); } break; @@ -100,11 +104,10 @@ void read_argument(char* argument, struct crhm_arguments* arguments) int main(int argc, char *argv[]) { - struct crhm_arguments arguments; // Set Default Argument Values arguments.project_name = ""; - arguments.time_format = TIMEFORMAT::YYYYMMDD; + arguments.time_format = TIMEFORMAT::ISO; arguments.output_format = OUTPUT_FORMAT::STD; /* From 9a3c573a67029b387deba449b879f3f16fbbf57f Mon Sep 17 00:00:00 2001 From: jhs507 Date: Wed, 5 May 2021 15:29:17 -0600 Subject: [PATCH 7/8] Added logic to account for incompatable time fromats and output formats. --- crhmcode/src/gcc/CRHMArguments.h | 1 + crhmcode/src/gcc/main.cpp | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/crhmcode/src/gcc/CRHMArguments.h b/crhmcode/src/gcc/CRHMArguments.h index 3a43725e4..1256cef94 100644 --- a/crhmcode/src/gcc/CRHMArguments.h +++ b/crhmcode/src/gcc/CRHMArguments.h @@ -26,6 +26,7 @@ struct crhm_arguments { std::string project_name; TIMEFORMAT time_format; + bool time_format_set{false}; OUTPUT_FORMAT output_format; }; diff --git a/crhmcode/src/gcc/main.cpp b/crhmcode/src/gcc/main.cpp index fd8c851ad..c52bfe1b7 100644 --- a/crhmcode/src/gcc/main.cpp +++ b/crhmcode/src/gcc/main.cpp @@ -32,6 +32,7 @@ void read_option(char ** argv, struct crhm_arguments * arguments, int * i) std::cout << USE_MESSAGE; exit(1); case 't': + arguments->time_format_set = true; *i = *i + 1; if (!strcmp(argv[*i], "MS")) { @@ -125,6 +126,27 @@ int main(int argc, char *argv[]) } } + if (arguments.output_format == OUTPUT_FORMAT::OBS) + { + if (arguments.time_format_set) + { + //Check that time format was set to MS or YYYYMMDD + if (!(arguments.time_format == TIMEFORMAT::MS || arguments.time_format == TIMEFORMAT::YYYYMMDD)) + { + std::cout << "\nCannot use specified time format while requesting output format of OBS.\n" + "Only MS and YYYYMMDD formats are compatible with OBS output file.\n"; + exit(1); + } + + } + else + { + //Default to MS time format. + arguments.time_format = TIMEFORMAT::MS; + } + } + + CRHMmain * m = new CRHMmain(&arguments); std::string projectArgument = arguments.project_name; From 4003bc6e1f75ae959c2b6bfe5f21a9ea9638836a Mon Sep 17 00:00:00 2001 From: jhs507 Date: Wed, 5 May 2021 16:23:48 -0600 Subject: [PATCH 8/8] Removed TIMEFORMAT option MMDDYYYY. --- crhmcode/src/core/CRHMmain/CRHMmain.cpp | 6 ------ crhmcode/src/core/Common/Common.h | 2 +- crhmcode/src/core/StandardConverterUtility.cpp | 6 +----- crhmcode/src/gcc/CRHMArguments.h | 1 - crhmcode/src/gcc/main.cpp | 6 +----- 5 files changed, 3 insertions(+), 18 deletions(-) diff --git a/crhmcode/src/core/CRHMmain/CRHMmain.cpp b/crhmcode/src/core/CRHMmain/CRHMmain.cpp index 8c24b93c1..e00921a45 100644 --- a/crhmcode/src/core/CRHMmain/CRHMmain.cpp +++ b/crhmcode/src/core/CRHMmain/CRHMmain.cpp @@ -2407,9 +2407,6 @@ void CRHMmain::AllRprt(void) case TIMEFORMAT::MS: Sx = FloatToStrF(cdSeries[0]->XValue(nn), TFloatFormat::ffGeneral, 10, 0); break; - case TIMEFORMAT::MMDDYYYY: - Sx = StandardConverterUtility::FormatDateTime("mm/dd/yyyy hh:mm ", cdSeries[0]->XValue(nn)); - break; case TIMEFORMAT::YYYYMMDD: Sx = StandardConverterUtility::FormatDateTime("yyyy-mm-dd hh:mm ", cdSeries[0]->XValue(nn)); break; @@ -2461,9 +2458,6 @@ void CRHMmain::LastRprt(void) case TIMEFORMAT::MS: Sx = FloatToStrF(cdSeries[0]->XValue(nn-1), TFloatFormat::ffGeneral, 10, 0); break; - case TIMEFORMAT::MMDDYYYY: - Sx = StandardConverterUtility::FormatDateTime("mm/dd/yyyy hh:mm ", cdSeries[0]->XValue(nn-1)); - break; case TIMEFORMAT::YYYYMMDD: Sx = StandardConverterUtility::FormatDateTime("yyyy-mm-dd hh:mm ", cdSeries[0]->XValue(nn-1)); break; diff --git a/crhmcode/src/core/Common/Common.h b/crhmcode/src/core/Common/Common.h index 7dd0e08f4..f84831fc3 100644 --- a/crhmcode/src/core/Common/Common.h +++ b/crhmcode/src/core/Common/Common.h @@ -71,7 +71,7 @@ enum class TExtra { BLANK, DD, TT, DT }; enum class TAKA { AKAERROR = -1, VARG, OBSR, VARD, OBSD, PARD, OBSF, AKAEND }; enum TMsgDlgBtn { mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToAll, mbYesToAll, mbHelp }; enum class TBuild { BUILD, DECL, INIT, RUN }; -enum class TIMEFORMAT { MS, MMDDYYYY, YYYYMMDD, ISO}; +enum class TIMEFORMAT { MS, YYYYMMDD, ISO}; enum class LMODULE { BASIC, MACRO, ADVANCE, SUPPORT, CUSTOM, PROTO, OBSOL }; enum class TFun { FOBS, VP_SAT, W_MJ, MJ_W, AVG, MIN, MAX, TOT, POS, FIRST, LAST, CNT, CNT0, DLTA, INTVL, DAY, DTOT }; enum class TVISIBLE { OUTPUT, USUAL, DIAGNOSTIC, PRIVATE }; // OUTPUT infers all variables/parameters diff --git a/crhmcode/src/core/StandardConverterUtility.cpp b/crhmcode/src/core/StandardConverterUtility.cpp index 44493ec15..8855795ea 100644 --- a/crhmcode/src/core/StandardConverterUtility.cpp +++ b/crhmcode/src/core/StandardConverterUtility.cpp @@ -157,11 +157,7 @@ std::string StandardConverterUtility::FormatDateTime(std::string fmt, double dat if (h < 10) { h1 = "0" + h1; } if (min < 10) { min1 = "0" + min1; } - if (fmt == "mm/dd/yyyy hh:mm ") - { - return m1 + "/" + d1 + "/" + to_string(y) + " " + h1 + ":" + min1+" "; - } - else if (fmt == "yyyy-mm-dd hh:mm ") + if (fmt == "yyyy-mm-dd hh:mm ") { return to_string(y) + " " + m1 + " " + d1 + " " + h1 + " " + min1; } diff --git a/crhmcode/src/gcc/CRHMArguments.h b/crhmcode/src/gcc/CRHMArguments.h index 1256cef94..fe21c9757 100644 --- a/crhmcode/src/gcc/CRHMArguments.h +++ b/crhmcode/src/gcc/CRHMArguments.h @@ -14,7 +14,6 @@ const string USE_MESSAGE = "\ncrhm [options] PROJECT_FILE\n" "\t\tMS - Microsoft Excel floating point.\n" "\t\tISO - ISO 8601 extended format YYYY-MM-DDThh:mm\n" "\t\tYYYYMMDD - YYYY MM DD hh mm\n" - "\t\tMMDDYYYY - MM/DD/YYYY hh:mm.\n" "\n" "\t-f OUTPUT_FORMAT - Select the file format for the output.\n" "\t\tValid formats are:\n" diff --git a/crhmcode/src/gcc/main.cpp b/crhmcode/src/gcc/main.cpp index c52bfe1b7..f5024d131 100644 --- a/crhmcode/src/gcc/main.cpp +++ b/crhmcode/src/gcc/main.cpp @@ -42,10 +42,6 @@ void read_option(char ** argv, struct crhm_arguments * arguments, int * i) { arguments->time_format = TIMEFORMAT::YYYYMMDD; } - else if (!strcmp(argv[*i], "MMDDYYYY")) - { - arguments->time_format = TIMEFORMAT::MMDDYYYY; - } else if (!strcmp(argv[*i], "ISO")) { arguments->time_format = TIMEFORMAT::ISO; @@ -54,7 +50,7 @@ void read_option(char ** argv, struct crhm_arguments * arguments, int * i) { std::cout << "\nUnable to read time format argument. "+ std::string(argv[*i]) +"\n"; std::cout << "-t must be followed directly by a valid time format.\n"; - std::cout << "Valid formats are: \n\tMS \n\tISO \n\tYYYYMMDD \n\tMMDDYYYY\n"; + std::cout << "Valid formats are: \n\tMS \n\tISO \n\tYYYYMMDD\n"; exit(1); } break;