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 ¶mParser) printRegister(device, *reg); } } - } void setRegister(Silecs::Register* reg,std::string value) @@ -208,6 +221,13 @@ int connectNonInteractive(Silecs::Service *service, Silecs::XMLParser ¶mPars { 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