From 4b1d7a83b4420b2ea7665e0e41194ebe1baa8b9d Mon Sep 17 00:00:00 2001
From: vargheseg <19566373+vargheseg@users.noreply.github.com>
Date: Sun, 29 Mar 2020 12:17:10 +0200
Subject: [PATCH] Implemented TecDummy::getLastWriteToFlash

TecDummy::getLastWriteToFlash now provides information on if the
queried parameter was written to the flash memory previously.
---
 tests/include/TecDummy.h |  6 +++++-
 tests/src/TecDummy.cc    | 15 +++++++++++++--
 2 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/tests/include/TecDummy.h b/tests/include/TecDummy.h
index 6bcc96b..8d06c17 100644
--- a/tests/include/TecDummy.h
+++ b/tests/include/TecDummy.h
@@ -9,7 +9,11 @@
 #include "TecErrorCode.h"
 
 struct TecDummy : ChimeraTK::DummyBackend {
-  TecDummy(std::string mapFileName) : DummyBackend(mapFileName) {}
+  TecDummy(std::string mapFileName) : DummyBackend(mapFileName) {
+    // inititialize write to flash as disabled on startup; 
+    rawValues[TecFrame::ParameterSystemFlashSaveOff] = 1;
+
+  }
   ~TecDummy() override {}
 
   enum class TecFramePart {
diff --git a/tests/src/TecDummy.cc b/tests/src/TecDummy.cc
index 61c4fcb..21539f1 100644
--- a/tests/src/TecDummy.cc
+++ b/tests/src/TecDummy.cc
@@ -19,6 +19,7 @@ TecDummy::BackendRegisterer::BackendRegisterer() {
 
 void TecDummy::read(uint8_t bar, uint32_t address, int32_t* data, size_t sizeInBytes) {
   DummyBackend::read(bar, address, data, sizeInBytes);
+
   if(bar != TecDummy_bar || address != TecDummy_address_loopDone) return;
   if(reg_loopStart != 1) return;
 
@@ -125,9 +126,14 @@ std::string TecDummy::processFrame(const std::string& command) {
   auto parsedFrame = splitFrame(command);
   std::string result = "";
 
+  // lastWriteToFlash[TecFrame::ParameterSystemFlashSaveOff] should be a
+  // safe default. TecFrame::ParameterSystemFlashSaveOff is a dummy entry for
+  // lastWriteToFlash.
+  uint32_t parameterId = TecFrame::ParameterSystemFlashSaveOff;
+
   // Handle store command
   if(parsedFrame[TecFramePart::COMMAND] == "VS") {
-    uint32_t parameterId = std::stoul("0x" + parsedFrame[TecFramePart::PARAMETER_ID], 0, 16);
+    parameterId = std::stoul("0x" + parsedFrame[TecFramePart::PARAMETER_ID], 0, 16);
     int32_t value = std::stol("0x" + parsedFrame[TecFramePart::PAYLOAD], 0, 16);
 
     std::cout << "Storing raw value " << value << "(" << parsedFrame[TecFramePart::PAYLOAD] << ") for parameter " << parameterId << std::endl;
@@ -137,7 +143,7 @@ std::string TecDummy::processFrame(const std::string& command) {
     result += getCrc(result);
   }
   else if(parsedFrame[TecFramePart::COMMAND] == "?VR") {
-    uint32_t parameterId = std::stoul("0x" + parsedFrame[TecFramePart::PARAMETER_ID], 0, 16);
+    parameterId = std::stoul("0x" + parsedFrame[TecFramePart::PARAMETER_ID], 0, 16);
     result = "!" + parsedFrame[TecFramePart::ADDRESS] + parsedFrame[TecFramePart::SEQUENCE];
     std::stringstream ss;
     ss << std::hex << std::setw(8) << std::setfill('0') << rawValues[static_cast<TecFrame::TecParameter>(parameterId)];
@@ -145,6 +151,11 @@ std::string TecDummy::processFrame(const std::string& command) {
     result += getCrc(result);
   }
 
+  //
+  // mark received parameter as written to flash or not
+  auto isLastWriteToFlash = (not rawValues.at(TecFrame::ParameterSystemFlashSaveOff)) ? true : false;
+  lastWriteToFlash[static_cast<TecFrame::TecParameter>(parameterId)] = isLastWriteToFlash;
+
   std::cout << "Returning result " << result << std::endl;
 
   return result;
-- 
GitLab