inline std::string array_str(const ArrayT& array) { return array_str(nullptr, array); }
std::ostream& operator<<(std::ostream& o, std::vector<T> v) { o << array_str(v); return o; }
void AtmelSWIAnalyzerResults::GetTextsForPacketSegmentFrame(const Frame& f, DisplayBase display_base, std::vector<std::string>& texts) { const int BUFF_SIZE = 128; char number_str[BUFF_SIZE]; std::string tmpstr; texts.clear(); // get the I/O block int block_ndx(static_cast<int>(f.mData2 & 0xffffffff)); int block_offset(static_cast<int>(((f.mData2 >> 32) & 0xffffffff))); const SWI_Block& block(mBlocks[block_ndx]); SWI_PacketParam* param(PacketParams + f.mData1); switch (param->Type) { case PT_Opcode: AnalyzerHelpers::GetNumberString(block.Opcode, display_base, 8, number_str, BUFF_SIZE); texts.push_back(std::string("Opcode ") + param->Name + " (" + number_str + ")"); texts.push_back(number_str); texts.push_back(param->Name); texts.push_back(std::string("Opcode ") + param->Name); texts.push_back(std::string(param->Name) + " (" + number_str + ")"); break; case PT_RawBytes: { std::string array_str(GetByteArrayNumberStr(block.Data.begin() + block_offset, param->Length, display_base)); texts.push_back(std::string(param->Name) + " (" + array_str + ")"); texts.push_back(array_str); texts.push_back(param->Name); } break; case PT_Zone: { AnalyzerHelpers::GetNumberString(block.Opcode, display_base, 8, number_str, BUFF_SIZE); U8 zone = block.Data[block_offset] & 3; std::string zonestr("<unknown>"); if (zone == 0) zonestr = "Config"; else if (zone == 1) zonestr = "OTP"; else if (zone == 2) zonestr = "Data"; const char* lenstr; if (block.Data[block_offset] & 0x80) lenstr = "32 bytes"; else lenstr = "4 bytes"; texts.push_back("Zone " + zonestr + ", " + lenstr); texts.push_back(number_str); texts.push_back(std::string(param->Name) + " (" + number_str + ")"); } break; case PT_Byte: AnalyzerHelpers::GetNumberString(block.Data[block_offset], display_base, 8, number_str, BUFF_SIZE); texts.push_back(std::string(param->Name) + " (" + number_str + ")"); texts.push_back(param->Name); break; case PT_Status: AnalyzerHelpers::GetNumberString(block.Data[block_offset], display_base, 8, number_str, BUFF_SIZE); tmpstr = "<undefined>"; if (block.Data[block_offset] == 0x00) tmpstr = "Command executed successfully"; else if (block.Data[block_offset] == 0x01) tmpstr = "Checkmac miscompare"; else if (block.Data[block_offset] == 0x03) tmpstr = "Parse error"; else if (block.Data[block_offset] == 0x0F) tmpstr = "Execution error"; else if (block.Data[block_offset] == 0x11) tmpstr = "Wake received properly"; else if (block.Data[block_offset] == 0xFF) tmpstr = "CRC or communication error"; else tmpstr = "Unknown status code"; texts.push_back(std::string(param->Name) + " " + tmpstr + " (" + number_str + ")" ); texts.push_back(std::string(param->Name) + " " + tmpstr); texts.push_back(std::string(param->Name) + " (" + number_str + ")"); texts.push_back(tmpstr); texts.push_back(param->Name); break; case PT_Word: case PT_DWord: if (param->Type == PT_Word) { size_t val = (block.Data[block_offset + 1] << 8) | block.Data[block_offset]; AnalyzerHelpers::GetNumberString(val, display_base, 16, number_str, BUFF_SIZE); } else { size_t val = (block.Data[block_offset + 3] << 24) | (block.Data[block_offset + 2] << 16) | (block.Data[block_offset + 1] << 8) | block.Data[block_offset]; AnalyzerHelpers::GetNumberString(val, display_base, 32, number_str, BUFF_SIZE); } texts.push_back(std::string(param->Name) + " (" + number_str + ")"); texts.push_back(param->Name); texts.push_back(number_str); break; } }