From 19d0cb5de27f50a943cffdc596a4779f47be4d6b Mon Sep 17 00:00:00 2001
From: donker <donker@astron.nl>
Date: Wed, 22 Sep 2021 14:48:58 +0200
Subject: [PATCH] L2SDP-355, add point FPGA_signal_input_data_buffer_R

---
 src/constants.h     |  2 ++
 src/fpga.cpp        |  2 ++
 src/periph/fpga.cpp | 21 +++++++++++++++++++++
 src/periph/fpga.h   |  2 ++
 4 files changed, 27 insertions(+)

diff --git a/src/constants.h b/src/constants.h
index 9e11faf3..8a5affb1 100644
--- a/src/constants.h
+++ b/src/constants.h
@@ -52,6 +52,8 @@
 #define C_N_pol 2  // Number of antenna polarizations, X and Y.
 #define C_A_pn 6  // Number of dual polarization antennas per Processing Node (PN) FPGA.
 // #define C_N_beamlets 976  // Number of beamlets per antenna band  488, 976
+#define C_V_si_db 1024  // Size of the databuffer per signal input (SI), to capture
+                        // a snapshot of the signal input data (ADC JESD204B data or WG data)
 
 #define C_200MHZ_1_CNT_NS 5  // Time of one cnt in nS
 #define C_N_CLK_PER_PPS 200000000
diff --git a/src/fpga.cpp b/src/fpga.cpp
index e89f9cc6..50f763b9 100644
--- a/src/fpga.cpp
+++ b/src/fpga.cpp
@@ -141,6 +141,8 @@ Fpga::Fpga(list<class Node*>& nodelist, const int32_t n_beamsets):
 
     pointMap->add_register("FPGA_weights_R",                                 "fpga/weights",                                nodes.size(), C_S_pn*nBeamsets*C_N_sub_bf, "RO", REG_FORMAT_INT16);
     pointMap->add_register("FPGA_weights_RW",                                "fpga/weights",                                nodes.size(), C_S_pn*nBeamsets*C_N_sub_bf, "RW", REG_FORMAT_INT16);
+    
+    pointMap->add_register("FPGA_signal_input_data_buffer_R",                "fpga/signal_input_data_buffer",               nodes.size(), C_S_pn*C_V_si_db, "RO", REG_FORMAT_INT16);
 }
 
 Fpga::~Fpga()
diff --git a/src/periph/fpga.cpp b/src/periph/fpga.cpp
index 1da1062d..9439435f 100644
--- a/src/periph/fpga.cpp
+++ b/src/periph/fpga.cpp
@@ -300,6 +300,9 @@ bool Periph_fpga::read(TermOutput& termout, const string addr,
         else if (addr == "fpga/subband_weights") {
             retval = read_subband_weights(termout, format);
         }
+        else if (addr == "fpga/signal_input_data_buffer") {
+            retval = read_signal_input_data_buffer(termout, format);
+        }
         else {
             throw runtime_error("address " + addr + " not found!");
         }
@@ -2375,6 +2378,24 @@ bool Periph_fpga::read_subband_weights(TermOutput& termout, int format) {
     return retval;
 }
 
+bool Periph_fpga::read_signal_input_data_buffer(TermOutput& termout, int format) {
+    bool retval = true;
+    uint32_t *_ptr = (uint32_t *)termout.val;
+
+    string regname;
+    uint32_t span;
+
+    for (uint i=0; i<C_S_pn; i++) {
+        regname = "mm/0/RAM_DIAG_DATA_BUFFER_BSN/" + to_string(i) + "/data";
+        span = mmap->getSpan((regname));
+        retval = Read(regname, _ptr);
+        _ptr += span;
+    }
+    termout.nof_vals = C_S_pn * C_V_si_db;
+    termout.datatype = format;
+    return retval;
+}
+
 bool Periph_fpga::read_time_since_last_pps(TermOutput& termout, int format, int mode) {
     bool retval = true;
     if (mode == R_UCP) {
diff --git a/src/periph/fpga.h b/src/periph/fpga.h
index 24337ee3..20697ab2 100644
--- a/src/periph/fpga.h
+++ b/src/periph/fpga.h
@@ -187,6 +187,8 @@ private:
   bool write_subband_weights(const char *data);
   bool read_subband_weights(TermOutput& termout, int format);
 
+  bool read_signal_input_data_buffer(TermOutput& termout, int format);
+
   bool read_sdp_info_block_period(TermOutput& termout, int format);
 
   bool read_time_since_last_pps(TermOutput& termout, int format, int mode);
-- 
GitLab