tree 7e3a2d2bad0960f233b3212b9e255c24624faffb
parent 72136230f1efd3ffeb51a51f456e3ce403ddfc69
author John Wang <wangzqbj@inspur.com> 1573198695 +0800
committer Deepak Kodihalli <dkodihal@in.ibm.com> 1574397917 +0000

tool: Refactor base type Commands

Each command will be implemented as a CLI subcommand
command handers registration process:

    CLI::App app;
    auto base = app.add_subcommand("base");
    auto GetPLDMVersion = base->add_subcommand("GetPLDMVersion");
    /* register callback for GetPLDMVersion Command */
    GetPLDMVersion->callback(exec());
    CLI11_PARSER();

Each command will be implemented as a class. To avoid duplicate,
An interface class is abstracted as the base class for commands.

CommandInterface
{
	CommandInterface(CLI::App* app){
		app->callback([&](){exec();}) //register exec() to CLI11
	}
	virtual createRequestMsg();
	virtual parseResponseMsg();
	exec(){
		createRequestMsg();
		send_recv();
		parseResponseMsg();
	}
};

GetPLDMVersion : public CommandInterface
{
	GetPLDMVersion(CLI::App *app){
		app->add_option();  // add options for this command
	}
	...
}

Then, the main is like below:

int main()
{
	CLI::App app{"PLDM requester tool for OpenBMC"};
	auto base = app.add_subcommand("base");
	auto version = base->add_subcommand("GetPLDMVersion");
	GetPLDMVersion getPLDMVersion(version);
	CLI11_PARSE(app, argc, argv);
}

Tested:

root@fp5280g2:~# pldmtool base GetPLDMTypes
Encode request successfully
Request Message:
08 01 80 00 04
Success in creating the socket : RC = 3
Success in connecting to socket : RC = 0
Success in sending message type as pldm to mctp : RC = 0
Write to socket successful : RC = 5
Total length:5
Loopback response message:
08 01 80 00 04
On first recv(),response == request : RC = 0
Total length: 14
Shutdown Socket successful :  RC = 0
Response Message:
08 01 00 00 04 00 0d 00 00 00 00 00 00 00
Supported types: 0(base) 2(platform) 3(bios)

root@fp5280g2:~# pldmtool base GetPLDMVersion -t platform
Encode request successfully
Request Message:
08 01 80 00 03 00 00 00 00 01 02
Success in creating the socket : RC = 3
Success in connecting to socket : RC = 0
Success in sending message type as pldm to mctp : RC = 0
Write to socket successful : RC = 11
Total length:11
Loopback response message:
08 01 80 00 03 00 00 00 00 01 02
On first recv(),response == request : RC = 0
Total length: 15
Shutdown Socket successful :  RC = 0
Response Message:
08 01 00 00 03 00 00 00 00 00 05 f1 f1 f1 00
Type 2(platform): 1.1.1

root@fp5280g2:~# pldmtool raw -d 0x80 0x00 0x04
Encode request successfully
Request Message:
08 01 80 00 04
Success in creating the socket : RC = 3
Success in connecting to socket : RC = 0
Success in sending message type as pldm to mctp : RC = 0
Write to socket successful : RC = 5
Total length:5
Loopback response message:
08 01 80 00 04
On first recv(),response == request : RC = 0
Total length: 14
Shutdown Socket successful :  RC = 0
Response Message:
08 01 00 00 04 00 0d 00 00 00 00 00 00 00

Signed-off-by: John Wang <wangzqbj@inspur.com>
Change-Id: I658b2c8094e9e5d972d786b26f9f8d52bc011981
