From 8da90d7e62d73af14971edd2fe316f40f459d2ab Mon Sep 17 00:00:00 2001
From: aschwinn <al.schwinn@gsi.de>
Date: Mon, 22 May 2017 17:14:31 +0200
Subject: [PATCH] Bug 1387 - Provide Command-Line Silecs Client - added connect
 method - improved graphics - cout runState

---
 .../src/silecs-cli-client/main.cpp            | 39 +++++++++++++++----
 1 file changed, 31 insertions(+), 8 deletions(-)

diff --git a/silecs-cli-client/src/silecs-cli-client/main.cpp b/silecs-cli-client/src/silecs-cli-client/main.cpp
index b66ec4c..288a885 100755
--- a/silecs-cli-client/src/silecs-cli-client/main.cpp
+++ b/silecs-cli-client/src/silecs-cli-client/main.cpp
@@ -18,6 +18,7 @@
 #include <stdio.h>
 #include <getopt.h>
 #include <iostream>
+#include <iomanip> // std::right, etc
 #include <unistd.h>//usleep
 
 #include <silecs-communication/interface/utility/XMLParser.h>
@@ -38,6 +39,7 @@ std::string arg_deviceName = "";
 std::string arg_blockName = "";
 std::string arg_registerName = "";
 bool arg_silent = false;
+bool arg_checkChecksum = true;
 ModeType arg_mode = UNDEFINED;
 uint32_t periodicInterval = 0;
 
@@ -55,6 +57,7 @@ void printHelp()
     std::cout << startbold << "DESCRIPTION" << endbold << std::endl;
     std::cout << "\t Connect to a PLC and get/set values by using the Silecs-framework." << std::endl;
     std::cout << startbold << "\t-b " << endbold << "silecs-block to get" << std::endl;
+    std::cout << startbold << "\t-c " << endbold << "ignore silecs-checksum, force connect to PLC" << std::endl;
     std::cout << startbold << "\t-d " << endbold << "silecs-device to request" << std::endl;
     std::cout << startbold << "\t-f " << endbold << "path to silecs-parameter-file of the plc" << std::endl;
     std::cout << startbold << "\t-h " << endbold << "print this help" << std::endl;
@@ -140,8 +143,19 @@ std::string getRegisterValueAsString(Silecs::Register* reg )
 
 void printTableHead()
 {
-	std::cout << "|\tDevice\t\t|\tBlock\t\t|\tRegister\t|\tValue\t\t|" << std::endl;
-	std::cout << "-------------------------------------------------------------------------------------------------------------------------" << std::endl;
+	std::cout << "------------------------------------------------------------------------------------------------------------------------------------------------" << std::endl;
+	std::cout << "| "<< std::setw(20) << std::left << "Device" << "| " << std::setw(30) << std::left << "Block" << "| " << std::setw(50) << std::left << "Register" << "| " << std::setw(30) << std::left<< "Value" << "|" << std::endl;
+	std::cout << "------------------------------------------------------------------------------------------------------------------------------------------------" << std::endl;
+}
+
+void printRunState(Silecs::PLC *plc)
+{
+	std::cout << "------------------------------------------------------------------------------------------------------------------------------------------------" << std::endl;
+	if( plc->isRunning() )
+		std::cout << "plc run-state is: RUNNING" << std::endl;
+	else
+		std::cout << "plc run-state is: STOPPED" << std::endl;
+	std::cout << "------------------------------------------------------------------------------------------------------------------------------------------------" << std::endl;
 }
 
 void printRegister(Silecs::Device *device, Silecs::Register* reg )
@@ -152,7 +166,7 @@ void printRegister(Silecs::Device *device, Silecs::Register* reg )
 	}
 	else
 	{
-		std::cout << "|\t" << device->getLabel() << "\t|\t" << reg->getBlockName() << "\t|\t" << reg->getName() << "\t|\t" << getRegisterValueAsString(reg) << "\t|" << std::endl;
+		std::cout << "| " << std::setw(20) << std::left << device->getLabel() << "| " << std::setw(30) << std::left << reg->getBlockName() << "| " << std::setw(50) << std::left << reg->getName() << "| " << std::setw(30) << std::left << getRegisterValueAsString(reg) << "|" << std::endl;
 	}
 }
 
@@ -184,7 +198,6 @@ void printDevice(Silecs::Device *device, Silecs::XMLParser &paramParser)
 				printRegister(device, *reg);
 		}
 	}
-
 }
 
 void setRegister(Silecs::Register* reg,std::string value)
@@ -208,6 +221,13 @@ int connectNonInteractive(Silecs::Service *service, Silecs::XMLParser &paramPars
 {
 	Silecs::Cluster *silecsCluster = getSilecsClusterbyDevice(arg_deviceName, paramParser, service);
 	Silecs::PLC *plc = silecsCluster->getPLC(getPLCName(paramParser),arg_parameterFile);
+	plc->connect(Silecs::MASTER_SYNCHRO,true,arg_checkChecksum);
+	if(!plc->isConnected())
+	{
+		std::cout << "Error: Failed to connect to PLC."<< std::endl;
+		return EXIT_FAILURE;
+	}
+	printRunState(plc);
 	Silecs::Device *device = plc->getDevice(arg_deviceName);
 
 	Silecs::Register* reg = NULL;
@@ -260,11 +280,14 @@ int main(int argc, char **argv)
 		bool interactiveOptionSet = false;
 		bool periodicOptionSet = false;
 
-		while ((opt = getopt(argc, argv, ":l:hp:r:b:d:f:m:is")) != -1)
+		while ((opt = getopt(argc, argv, ":l:hcp:r:b:d:f:m:is")) != -1)
 		{
 
 			switch (opt)
 			{
+				case 'c':
+					arg_checkChecksum = false;
+					break;
 				case 'h':
 					printHelp();
 					return EXIT_SUCCESS;
@@ -396,15 +419,15 @@ int main(int argc, char **argv)
 	}
 	catch(std::string *str)
 	{
-		std::cout << str;
+		std::cout << str << std::endl;
 	}
 	catch(std::exception& ex)
 	{
-		std::cout << ex.what();
+		std::cout << ex.what() << std::endl;
 	}
 	catch(...)
 	{
-		std::cout << "Unexpected error caught in Main. Please notify SILECS support";
+		std::cout << "Unexpected error caught in Main. Please notify SILECS support" << std::endl;
 	}
 	return -1;
 }
-- 
GitLab