So I have created the foundation for the next work. I have managed to get all the run parameters from an XML file and loaded them into variables in main of the MCP C++ program. I had to do a little restructuring of the code as the includes for thread and time needed to be moved to the shared include as the methods in the classes used some of the same libraries.
So the main looks like this, it will not likely get much larger than this (as always the code is better spaced in the editor in AWS cloud9):
#include "mcp.cpp" int main() { // Print a header of execution out auto result = std::time(nullptr); std::cout << "Start: Master Control Program " << std::endl; std::cout << "Local Time: " << std::asctime(std::localtime(&result)) << std::endl; // Get running values std::string versionnumber, storedirectory, sharedirectory, UUID[10]; MCPParms ourparms("MCP.xml"); // parms for program try { ourparms.load(); } catch (std::exception const& ex) { std::cout << ex.what() << std::endl; return (1); } ourparms.version(versionnumber); // Write out version number std::cout << "File version: " << versionnumber << std::endl; ourparms.UUID(UUID); ourparms.store(storedirectory); ourparms.share(sharedirectory); int client = ourparms.client(); std::cout << "Client " << client; if (client == 0) { std::cout << " Primary!"; } std::cout << std::endl; std::cout << "Store: " << storedirectory << std::endl; std::cout << "Share: " << sharedirectory << std::endl; // Start run loop for MCP MCPRun runit(1000, storedirectory); // set wait time runit.run(); // Close down task std::this_thread::sleep_for(std::chrono::milliseconds(1000)); // Shutdown result = std::time(nullptr); std::cout << "Exit: Master Control Program " << std::endl; std::cout << "Local Time: " << std::asctime(std::localtime(&result)) << std::endl; // Leave politely return 0; }
The run routine is working and now starts up a loop with 1000 millisecond wait and checks if the file in the store directory named run.xml is present, well-formed, and has a ‘run’ value of ‘Yes’. So the MCP begins to act like a master control program now as it loops until requested to a shutdown of fail-out if it cannot find the control file that allows it to run.
The run code:
MCPRun::MCPRun(int mywaittime, const std::string &mystore) { runfile = mystore + "/run.xml"; // put hard coding inside storedirectory = mystore; waittime = mywaittime; shutdown = "Start"; return; } void MCPRun::run() /* This is the main control loop. It runs until the check becomes false. There must be a wait long enough to not cause this to take over the system, at least a second. */ { do { std::this_thread::sleep_for(std::chrono::milliseconds(waittime)); } while (check()); std::cout << "Ending Condition: " << shutdown << std::endl; return; } bool MCPRun::check() /* The check opens the run.xml in the store and stops when the run value is not "Yes" or the file is not there or malformed. */ { std::string therun; therun = "No"; try { pt::read_xml(runfile, tree); // exceptions must be handled! therun = tree.get("run", "No"); // no throw if not there } catch (std::exception const& ex) { therun = "Fail"; shutdown = "Fail"; } //std::cout << "Check: " << therun << std::endl; return (therun == "Yes"); }
Well all of the work now begins to pay. Next, and I am having issues with this step, is to scan the share directory for files to process.