From 2daa2ac04178db2b7fe2f77e1f814da356dd72ac Mon Sep 17 00:00:00 2001
From: Christian Koernig <ckoernig@mail.desy.de>
Date: Mon, 26 Jul 2021 18:16:38 +0200
Subject: [PATCH] Added buffer slots to simulator

---
 include/AmptekSimulatorConnectionHandler.h |  2 ++
 src/AmptekSimulatorConnectionHandler.cpp   | 36 +++++++++++++++++++---
 2 files changed, 33 insertions(+), 5 deletions(-)

diff --git a/include/AmptekSimulatorConnectionHandler.h b/include/AmptekSimulatorConnectionHandler.h
index 411445b..5509b87 100644
--- a/include/AmptekSimulatorConnectionHandler.h
+++ b/include/AmptekSimulatorConnectionHandler.h
@@ -24,7 +24,9 @@ private:
     void disable();
     void clear();
     int speclen = 1024;
+    int buffer_depth = 64;
     unsigned int* spectrum;
+    byte*  spectrum_buffer;
     uint32_t total_counts;
     double acc_time = 0;
 
diff --git a/src/AmptekSimulatorConnectionHandler.cpp b/src/AmptekSimulatorConnectionHandler.cpp
index fec5a0c..ca4d95f 100644
--- a/src/AmptekSimulatorConnectionHandler.cpp
+++ b/src/AmptekSimulatorConnectionHandler.cpp
@@ -69,13 +69,22 @@ Packet AmptekSimulatorConnectionHandler::sendAndReceive( const Packet& request){
                 p.setPid2( DP5_P2_SPECTRUM_RESPONSE_SPECTRUM8192_STATUS );
                 break;
         }
-        
         word16 len = 3*speclen + STATUS_SIZE;
-        byte arr[len];
-        createSpectrumData(arr);
-        createStatusData(arr + 3*speclen);
         p.resize( MIN_PACKET_LEN + len );
-        p.setData(arr, len);
+        if (pid2== DP5_P2_SPECTRUM_REQUEST_SPECTRUM_STATUS){
+            byte arr[len];
+            createSpectrumData(arr);
+            createStatusData(arr + 3*speclen);
+            p.setData(arr, len);
+        }else{
+            size_t buffer_idx = (request.at(DATA) << 8) + request.at(DATA);
+            if (buffer_idx >=buffer_depth){
+                return Packet(DP5_P1_ACK, DP5_P2_ACK_BADPARAM_ERR, nullptr, 0);
+            }
+
+            byte* bufferslot = spectrum_buffer + ( (3*speclen + STATUS_SIZE)*buffer_idx );
+            p.setData(bufferslot, len);
+        }
     }
     else if (pid1 == Packet::DP5_PKT_REQUEST_STATUS.at(PID1) 
      && pid2 == Packet::DP5_PKT_REQUEST_STATUS.at(PID2))
@@ -134,6 +143,22 @@ Packet AmptekSimulatorConnectionHandler::sendAndReceive( const Packet& request){
         readConfig(configs);
         return Packet(DP5_P1_ACK, DP5_P2_ACK_OK, nullptr, 0);
     }
+ 
+    else if(pid1 == DP5_P1_SPECTRUM_REQUEST
+              && pid2 == DP5_P2_SPECTRUM_REQUEST_BUFFER_CLEAR)
+    {
+        size_t buffer_idx = (request.at(DATA) << 8) + request.at(DATA);
+        if (buffer_idx >=buffer_depth){
+            return Packet(DP5_P1_ACK, DP5_P2_ACK_BADPARAM_ERR, nullptr, 0);
+        }
+
+        byte* bufferslot_spectrum = spectrum_buffer + ( (3*speclen + STATUS_SIZE)*buffer_idx );
+        byte* bufferslot_status = bufferslot_spectrum + 3*speclen;
+        createSpectrumData(bufferslot_spectrum);
+        createStatusData(bufferslot_status);
+        clear();
+
+    }
     else{
         return Packet(DP5_P1_ACK, DP5_P2_ACK_OK, nullptr, 0);
     }
@@ -144,6 +169,7 @@ Packet AmptekSimulatorConnectionHandler::sendAndReceive( const Packet& request){
 
 AmptekSimulatorConnectionHandler::AmptekSimulatorConnectionHandler(){
     spectrum = new unsigned int[speclen];
+    spectrum_buffer = new byte[(3*speclen + STATUS_SIZE)*buffer_depth];
     start_time = std::chrono::system_clock::now();
     clear();
     initConfigs();
-- 
GitLab