From e26af5ee7d9c36a28dcbd9f7488a1fc95e105d7f Mon Sep 17 00:00:00 2001 From: Nav Date: Tue, 1 Mar 2022 19:40:29 +0000 Subject: [PATCH] Moved getResponseId() function out of AvrResponseFrame class and into derived classes --- CMakeLists.txt | 3 ++ .../Discovery/DiscoveryCommandFrame.hpp | 4 +-- .../HouseKeeping/HouseKeepingCommandFrame.hpp | 5 ++- .../AVR8Generic/Avr8GenericResponseFrame.cpp | 33 +++++++++++++++++++ .../AVR8Generic/Avr8GenericResponseFrame.hpp | 16 ++------- .../AVR/ResponseFrames/AvrResponseFrame.hpp | 6 +--- .../Discovery/DiscoveryResponseFrame.cpp | 30 +++++++++++++++++ .../Discovery/DiscoveryResponseFrame.hpp | 20 +++++++++++ .../ResponseFrames/DiscoveryResponseFrame.hpp | 28 ---------------- .../HouseKeepingResponseFrame.cpp | 18 ++++++++++ .../HouseKeepingResponseFrame.hpp | 15 +++++++++ 11 files changed, 129 insertions(+), 49 deletions(-) create mode 100644 src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/AVR8Generic/Avr8GenericResponseFrame.cpp create mode 100644 src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/Discovery/DiscoveryResponseFrame.cpp create mode 100644 src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/Discovery/DiscoveryResponseFrame.hpp delete mode 100644 src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/DiscoveryResponseFrame.hpp create mode 100644 src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/HouseKeeping/HouseKeepingResponseFrame.cpp create mode 100644 src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/HouseKeeping/HouseKeepingResponseFrame.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 2138566b..66490d3c 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,6 +100,9 @@ add_executable(Bloom src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/CommandFrames/AVR8Generic/ReadMemory.cpp src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/AvrResponse.cpp src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/AvrResponseFrame.cpp + src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/AVR8Generic/Avr8GenericResponseFrame.cpp + src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/Discovery/DiscoveryResponseFrame.cpp + src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/HouseKeeping/HouseKeepingResponseFrame.cpp src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/AvrEvent.cpp src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/Events/AVR8Generic/BreakEvent.cpp src/DebugToolDrivers/Protocols/CMSIS-DAP/CmsisDapInterface.cpp diff --git a/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/CommandFrames/Discovery/DiscoveryCommandFrame.hpp b/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/CommandFrames/Discovery/DiscoveryCommandFrame.hpp index 2bbf27bd..5c6c0196 100644 --- a/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/CommandFrames/Discovery/DiscoveryCommandFrame.hpp +++ b/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/CommandFrames/Discovery/DiscoveryCommandFrame.hpp @@ -1,7 +1,7 @@ #pragma once -#include "../AvrCommandFrame.hpp" -#include "src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/DiscoveryResponseFrame.hpp" +#include "src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/CommandFrames/AvrCommandFrame.hpp" +#include "src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/Discovery/DiscoveryResponseFrame.hpp" namespace Bloom::DebugToolDrivers::Protocols::CmsisDap::Edbg::Avr::CommandFrames::Discovery { diff --git a/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/CommandFrames/HouseKeeping/HouseKeepingCommandFrame.hpp b/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/CommandFrames/HouseKeeping/HouseKeepingCommandFrame.hpp index 4cb441e0..1d4d61b2 100644 --- a/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/CommandFrames/HouseKeeping/HouseKeepingCommandFrame.hpp +++ b/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/CommandFrames/HouseKeeping/HouseKeepingCommandFrame.hpp @@ -1,6 +1,7 @@ #pragma once -#include "../AvrCommandFrame.hpp" +#include "src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/CommandFrames/AvrCommandFrame.hpp" +#include "src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/HouseKeeping/HouseKeepingResponseFrame.hpp" namespace Bloom::DebugToolDrivers::Protocols::CmsisDap::Edbg::Avr::CommandFrames::HouseKeeping { @@ -25,6 +26,8 @@ namespace Bloom::DebugToolDrivers::Protocols::CmsisDap::Edbg::Avr::CommandFrames class HouseKeepingCommandFrame: public AvrCommandFrame { public: + using ExpectedResponseFrameType = ResponseFrames::HouseKeepingResponseFrame; + HouseKeepingCommandFrame(): AvrCommandFrame(ProtocolHandlerId::HOUSE_KEEPING) {} }; } diff --git a/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/AVR8Generic/Avr8GenericResponseFrame.cpp b/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/AVR8Generic/Avr8GenericResponseFrame.cpp new file mode 100644 index 00000000..2fecbc52 --- /dev/null +++ b/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/AVR8Generic/Avr8GenericResponseFrame.cpp @@ -0,0 +1,33 @@ +#include "Avr8GenericResponseFrame.hpp" + +#include "src/Exceptions/Exception.hpp" + +namespace Bloom::DebugToolDrivers::Protocols::CmsisDap::Edbg::Avr::ResponseFrames::Avr8Generic +{ + using namespace Bloom::Exceptions; + + unsigned char Avr8GenericResponseFrame::getResponseId() { + const auto& payload = this->getPayload(); + if (payload.empty()) { + throw Exception("Response ID missing from AVR8 Generic response frame payload."); + } + + return payload[0]; + } + + std::vector Avr8GenericResponseFrame::getPayloadData() { + const auto& payload = this->getPayload(); + + /* + * AVR8 data payloads are in little endian form and include two bytes before the data (response ID and + * version byte) as well as an additional byte after the data, known as the 'status code'. + */ + auto data = std::vector( + payload.begin() + 2, + payload.end() - 1 + ); + + std::reverse(data.begin(), data.end()); + return data; + } +} diff --git a/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/AVR8Generic/Avr8GenericResponseFrame.hpp b/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/AVR8Generic/Avr8GenericResponseFrame.hpp index 653eafe2..ca99c1ef 100644 --- a/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/AVR8Generic/Avr8GenericResponseFrame.hpp +++ b/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/AVR8Generic/Avr8GenericResponseFrame.hpp @@ -11,21 +11,11 @@ namespace Bloom::DebugToolDrivers::Protocols::CmsisDap::Edbg::Avr::ResponseFrame explicit Avr8GenericResponseFrame(const std::vector& AVRResponses) : AvrResponseFrame(AVRResponses) {} + [[nodiscard]] unsigned char getResponseId(); + /** * See parent method. */ - [[nodiscard]] std::vector getPayloadData() override { - /* - * AVR8 data payloads are in little endian form and include two bytes before the data (response ID and - * version byte) as well as an additional byte after the data, known as the 'status code'. - */ - auto data = std::vector( - this->getPayload().begin() + 2, - this->getPayload().end() - 1 - ); - - std::reverse(data.begin(), data.end()); - return data; - } + [[nodiscard]] std::vector getPayloadData() override; }; } diff --git a/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/AvrResponseFrame.hpp b/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/AvrResponseFrame.hpp index ee9d6ea7..73b8ae63 100644 --- a/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/AvrResponseFrame.hpp +++ b/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/AvrResponseFrame.hpp @@ -29,7 +29,7 @@ namespace Bloom::DebugToolDrivers::Protocols::CmsisDap::Edbg::Avr AvrResponseFrame& operator = (AvrResponseFrame&& other) = default; /** - * An AVRResponse contains a single fragment of an AvrResponseFrame. + * An AvrResponse contains a single fragment of an AvrResponseFrame. * * This method will construct an AvrResponseFrame from a vector of AVRResponses. * @@ -49,10 +49,6 @@ namespace Bloom::DebugToolDrivers::Protocols::CmsisDap::Edbg::Avr return this->payload; } - unsigned char getResponseId() { - return this->payload[0]; - } - [[nodiscard]] virtual std::vector getPayloadData() { return this->payload; } diff --git a/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/Discovery/DiscoveryResponseFrame.cpp b/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/Discovery/DiscoveryResponseFrame.cpp new file mode 100644 index 00000000..e64bb376 --- /dev/null +++ b/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/Discovery/DiscoveryResponseFrame.cpp @@ -0,0 +1,30 @@ +#include "DiscoveryResponseFrame.hpp" + +#include "src/Exceptions/Exception.hpp" + +namespace Bloom::DebugToolDrivers::Protocols::CmsisDap::Edbg::Avr::ResponseFrames +{ + using namespace Bloom::Exceptions; + + unsigned char DiscoveryResponseFrame::getResponseId() { + const auto& payload = this->getPayload(); + + if (payload.empty()) { + throw Exception("Response ID missing from DISCOVERY response frame payload."); + } + + return payload[0]; + } + + std::vector DiscoveryResponseFrame::getPayloadData() { + const auto& payload = this->getPayload(); + + // DISCOVERY payloads include two bytes before the data (response ID and version byte). + auto data = std::vector( + payload.begin() + 2, + payload.end() + ); + + return data; + } +} diff --git a/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/Discovery/DiscoveryResponseFrame.hpp b/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/Discovery/DiscoveryResponseFrame.hpp new file mode 100644 index 00000000..bad9f3c6 --- /dev/null +++ b/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/Discovery/DiscoveryResponseFrame.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include "src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/AvrResponseFrame.hpp" + +namespace Bloom::DebugToolDrivers::Protocols::CmsisDap::Edbg::Avr::ResponseFrames +{ + class DiscoveryResponseFrame: public AvrResponseFrame + { + public: + DiscoveryResponseFrame() = default; + explicit DiscoveryResponseFrame(const std::vector& AVRResponses): AvrResponseFrame(AVRResponses) {} + + unsigned char getResponseId(); + + /** + * See parent method. + */ + std::vector getPayloadData() override; + }; +} diff --git a/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/DiscoveryResponseFrame.hpp b/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/DiscoveryResponseFrame.hpp deleted file mode 100644 index ca152494..00000000 --- a/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/DiscoveryResponseFrame.hpp +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - -#include "AvrResponseFrame.hpp" - -namespace Bloom::DebugToolDrivers::Protocols::CmsisDap::Edbg::Avr::ResponseFrames -{ - class DiscoveryResponseFrame: public AvrResponseFrame - { - public: - DiscoveryResponseFrame() = default; - explicit DiscoveryResponseFrame(const std::vector& AVRResponses): AvrResponseFrame(AVRResponses) {} - - /** - * See parent method. - */ - std::vector getPayloadData() override { - /* - * DISCOVERY payloads include two bytes before the data (response ID and version byte). - */ - auto data = std::vector( - this->getPayload().begin() + 2, - this->getPayload().end() - ); - - return data; - } - }; -} diff --git a/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/HouseKeeping/HouseKeepingResponseFrame.cpp b/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/HouseKeeping/HouseKeepingResponseFrame.cpp new file mode 100644 index 00000000..98f8bd9b --- /dev/null +++ b/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/HouseKeeping/HouseKeepingResponseFrame.cpp @@ -0,0 +1,18 @@ +#include "HouseKeepingResponseFrame.hpp" + +#include "src/Exceptions/Exception.hpp" + +namespace Bloom::DebugToolDrivers::Protocols::CmsisDap::Edbg::Avr::ResponseFrames +{ + using namespace Bloom::Exceptions; + + unsigned char HouseKeepingResponseFrame::getResponseId() { + const auto& payload = this->getPayload(); + + if (payload.empty()) { + throw Exception("Response ID missing from HOUSEKEEPING response frame payload."); + } + + return payload[0]; + } +} diff --git a/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/HouseKeeping/HouseKeepingResponseFrame.hpp b/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/HouseKeeping/HouseKeepingResponseFrame.hpp new file mode 100644 index 00000000..34f6c658 --- /dev/null +++ b/src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/HouseKeeping/HouseKeepingResponseFrame.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "src/DebugToolDrivers/Protocols/CMSIS-DAP/VendorSpecific/EDBG/AVR/ResponseFrames/AvrResponseFrame.hpp" + +namespace Bloom::DebugToolDrivers::Protocols::CmsisDap::Edbg::Avr::ResponseFrames +{ + class HouseKeepingResponseFrame: public AvrResponseFrame + { + public: + HouseKeepingResponseFrame() = default; + explicit HouseKeepingResponseFrame(const std::vector& AVRResponses): AvrResponseFrame(AVRResponses) {} + + unsigned char getResponseId(); + }; +}