Skip to content
This repository has been archived by the owner on May 19, 2022. It is now read-only.

Commit

Permalink
Clarify the usage of std::string for raw commands in the clientapi, a…
Browse files Browse the repository at this point in the history
…nd add a std::vector<uint8_t> option as well.
  • Loading branch information
jtikalsky committed Jan 9, 2015
1 parent fdf24a3 commit 4e8102b
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 9 deletions.
64 changes: 55 additions & 9 deletions clientapi/sysmgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -726,8 +726,23 @@ namespace sysmgr {
{
scope_lock llock(&this->lock);

std::string parameters;
std::vector<uint8_t> cmd8;
for (std::string::iterator it = cmd.begin(); it != cmd.end(); it++)
cmd8.push_back(static_cast<uint8_t>(*it));

std::vector<uint8_t> rsp8 = this->raw_card(crate, fru, cmd8);

std::string raw;
for (std::vector<uint8_t>::iterator it = rsp8.begin(); it != rsp8.end(); it++)
raw.push_back(static_cast<char>(*it));
return raw;
}
std::vector<uint8_t> sysmgr::raw_card(uint8_t crate, uint8_t fru, std::vector<uint8_t> cmd)
{
scope_lock llock(&this->lock);

std::string parameters;
for (std::vector<uint8_t>::iterator it = cmd.begin(); it != cmd.end(); it++)
parameters += stdsprintf(" 0x%02x", *it);

uint32_t msgid = this->get_msgid();
Expand All @@ -737,18 +752,33 @@ namespace sysmgr {
if (rsp.size() < 1)
throw sysmgr_exception("RAW_CARD response not understood");

std::string raw;
std::vector<uint8_t> raw;
for (std::vector<std::string>::iterator it = rsp.begin(); it != rsp.end(); it++)
raw.push_back(static_cast<char>(parse_uint8(*it)));
raw.push_back(parse_uint8(*it));
return raw;
}

std::string sysmgr::raw_forwarded(uint8_t crate, uint8_t bridgechan, uint8_t bridgeaddr, uint8_t targetchan, uint8_t targetaddr, std::string cmd)
{
scope_lock llock(&this->lock);

std::string parameters;
std::vector<uint8_t> cmd8;
for (std::string::iterator it = cmd.begin(); it != cmd.end(); it++)
cmd8.push_back(static_cast<uint8_t>(*it));

std::vector<uint8_t> rsp8 = this->raw_forwarded(crate, bridgechan, bridgeaddr, targetchan, targetaddr, cmd8);

std::string raw;
for (std::vector<uint8_t>::iterator it = rsp8.begin(); it != rsp8.end(); it++)
raw.push_back(static_cast<char>(*it));
return raw;
}
std::vector<uint8_t> sysmgr::raw_forwarded(uint8_t crate, uint8_t bridgechan, uint8_t bridgeaddr, uint8_t targetchan, uint8_t targetaddr, std::vector<uint8_t> cmd)
{
scope_lock llock(&this->lock);

std::string parameters;
for (std::vector<uint8_t>::iterator it = cmd.begin(); it != cmd.end(); it++)
parameters += stdsprintf(" 0x%02x", *it);

uint32_t msgid = this->get_msgid();
Expand All @@ -758,18 +788,33 @@ namespace sysmgr {
if (rsp.size() < 1)
throw sysmgr_exception("RAW_FORWARDED response not understood");

std::string raw;
std::vector<uint8_t> raw;
for (std::vector<std::string>::iterator it = rsp.begin(); it != rsp.end(); it++)
raw.push_back(static_cast<char>(parse_uint8(*it)));
raw.push_back(parse_uint8(*it));
return raw;
}

std::string sysmgr::raw_direct(uint8_t crate, uint8_t targetchan, uint8_t targetaddr, std::string cmd)
{
scope_lock llock(&this->lock);

std::string parameters;
std::vector<uint8_t> cmd8;
for (std::string::iterator it = cmd.begin(); it != cmd.end(); it++)
cmd8.push_back(static_cast<uint8_t>(*it));

std::vector<uint8_t> rsp8 = this->raw_direct(crate, targetchan, targetaddr, cmd8);

std::string raw;
for (std::vector<uint8_t>::iterator it = rsp8.begin(); it != rsp8.end(); it++)
raw.push_back(static_cast<char>(*it));
return raw;
}
std::vector<uint8_t> sysmgr::raw_direct(uint8_t crate, uint8_t targetchan, uint8_t targetaddr, std::vector<uint8_t> cmd)
{
scope_lock llock(&this->lock);

std::string parameters;
for (std::vector<uint8_t>::iterator it = cmd.begin(); it != cmd.end(); it++)
parameters += stdsprintf(" 0x%02x", *it);

uint32_t msgid = this->get_msgid();
Expand All @@ -779,11 +824,12 @@ namespace sysmgr {
if (rsp.size() < 1)
throw sysmgr_exception("RAW_DIRECT response not understood");

std::string raw;
std::vector<uint8_t> raw;
for (std::vector<std::string>::iterator it = rsp.begin(); it != rsp.end(); it++)
raw.push_back(static_cast<char>(parse_uint8(*it)));
raw.push_back(parse_uint8(*it));
return raw;
}

std::string sysmgr::get_slotstring(uint8_t fru)
{
if (fru == 3 || fru == 4)
Expand Down
14 changes: 14 additions & 0 deletions clientapi/sysmgr.h
Original file line number Diff line number Diff line change
Expand Up @@ -283,10 +283,24 @@ namespace sysmgr {

// cmd = [ NetFN, CMD, ParamList ]
// ret = [ CmplCode, ParamList ]

/* Note that std::string, unlike C strings, are size-based rather
* than null-terminated. This allows you to embed null bytes in
* your command strings as shown, when using the
* std::string(char *str, int length) constructor:
*
* char raw_command[5] = { 0x2c, 0x04, 0x00, 0x06, 0x00 };
* sm.raw_direct(2, 0, 0x82, std::string(raw_command, 5));
* sm.raw_direct(2, 0, 0x82, std::string("\x2c\x04\x00\x06\x00", 5));
*/
std::string raw_card(uint8_t crate, uint8_t fru, std::string cmd);
std::string raw_forwarded(uint8_t crate, uint8_t bridgechan, uint8_t bridgeaddr, uint8_t targetchan, uint8_t targetaddr, std::string cmd);
std::string raw_direct(uint8_t crate, uint8_t targetchan, uint8_t targetaddr, std::string cmd);

std::vector<uint8_t> raw_card(uint8_t crate, uint8_t fru, std::vector<uint8_t> cmd);
std::vector<uint8_t> raw_forwarded(uint8_t crate, uint8_t bridgechan, uint8_t bridgeaddr, uint8_t targetchan, uint8_t targetaddr, std::vector<uint8_t> cmd);
std::vector<uint8_t> raw_direct(uint8_t crate, uint8_t targetchan, uint8_t targetaddr, std::vector<uint8_t> cmd);

/* This helper function will return a short human-readable string
* version of the given FRU id, such as MCH1 AMC01 PM1 CU1, or
* failing all else, FRU1.
Expand Down

0 comments on commit 4e8102b

Please sign in to comment.