From abf1d74ba004345638c1cecc8d2ed21581231154 Mon Sep 17 00:00:00 2001
From: Douglas Araujo <douglas.araujo@ess.eu>
Date: Mon, 25 Mar 2024 16:47:29 +0100
Subject: [PATCH] Add configHybrid method

---
 vmmTblApp/src/hybrid.cpp     | 11 ++++++++++-
 vmmTblApp/src/hybrid.h       |  1 +
 vmmTblApp/src/vmm_config.cpp | 25 +++++++++++++++++++++++++
 vmmTblApp/src/vmm_config.h   |  2 ++
 4 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/vmmTblApp/src/hybrid.cpp b/vmmTblApp/src/hybrid.cpp
index de6fca4..5397c35 100644
--- a/vmmTblApp/src/hybrid.cpp
+++ b/vmmTblApp/src/hybrid.cpp
@@ -7,7 +7,7 @@ Hybrid::Hybrid() {
 Hybrid::~Hybrid() {}
 
 void Hybrid::loadDefault(){
-  hybrid_registers = {{"TP_skew", 0}, {"TP_width", 0}, {"TP_pol", 0}, {"TP_disable", 0}};
+  hybrid_registers = {{"TP_skew", 0}, {"TP_width", 0}, {"TP_pol", 0}};
   hybrid_info = {{"firmware_version", ""}, {"geo_id", ""}, {"hybrid_id", ""},{"link_status", "0"}, {"description", ""}};
 }
 
@@ -16,3 +16,12 @@ VMM3a& Hybrid::getVMM(int index) {
     throw std::out_of_range("Invalid VMM index");
   return vmms[index];
 }
+
+vmmStatus Hybrid::getRegister(std::string feature, unsigned short& result) {
+  vmmStatus status = vmmSuccess;
+  if(hybrid_registers.find(feature) != hybrid_registers.end())
+    result = hybrid_registers[feature];
+  else
+    status = vmmParamNotFound;
+  return status;
+}
diff --git a/vmmTblApp/src/hybrid.h b/vmmTblApp/src/hybrid.h
index 18a4de2..79664b6 100644
--- a/vmmTblApp/src/hybrid.h
+++ b/vmmTblApp/src/hybrid.h
@@ -14,6 +14,7 @@ public:
 
   void loadDefault();
   VMM3a& getVMM(int index);
+  vmmStatus getRegister(std::string feature, unsigned short& result);
 
 private:
   VMM3a vmms[VMMS_PER_HYBRID];
diff --git a/vmmTblApp/src/vmm_config.cpp b/vmmTblApp/src/vmm_config.cpp
index d7414c0..316de95 100644
--- a/vmmTblApp/src/vmm_config.cpp
+++ b/vmmTblApp/src/vmm_config.cpp
@@ -4,6 +4,7 @@
 #include <algorithm>
 #include <chrono>
 #include <thread>
+#include <array>
 
 #include "FrontEndBase.h"
 
@@ -17,6 +18,15 @@ FENConfigModule::FENConfigModule(FrontEndBase& frontend) : pFEN(&frontend) {
 FENConfigModule::~FENConfigModule() {
 }
 
+void FENConfigModule::sendAll(bool useConfigCheck) {
+  configFEN();
+  for(int hybrid = 0; hybrid <= HYBRIDS_PER_FEN; hybrid++) {
+    if (isHybridEnabled(hybrid)) {
+
+    }
+  }
+}
+
 void FENConfigModule::configFEN() {
   pFEN->user_reg_write("app_debug_data_format", 0);
   pFEN->user_reg_write("app_latency_reset", 27);
@@ -63,6 +73,21 @@ Hybrid& FENConfigModule::getHybrid(int index) {
   return hybrids[index];
 }
 
+void FENConfigModule::configHybrid(int hybrid_index) {
+  std::array<std::string, 3> registers = {"hyb_tp_skew0", "hyb_tp_width0", "hyb_tp_polarity0"};
+
+  for (const auto& reg : registers) {
+    unsigned short result = 0;
+    hybrids[hybrid_index].getRegister(reg, result);
+    pFEN->user_reg_write(reg + std::to_string(hybrid_index), result);
+  }
+
+  uint32_t value = (1 << hybrid_index);
+  pFEN->user_reg_write("sc_cfg_hyb", 0x0);
+  pFEN->user_reg_write("sc_cfg_hyb", value);
+  pFEN->user_reg_write("sc_cfg_hyb", 0x0);
+}
+
 bool FENConfigModule::configVMM(int hybrid_index, int vmm_index, bool enableConfigCheck)
 {
   bool result = true;
diff --git a/vmmTblApp/src/vmm_config.h b/vmmTblApp/src/vmm_config.h
index a6850de..f436f5d 100644
--- a/vmmTblApp/src/vmm_config.h
+++ b/vmmTblApp/src/vmm_config.h
@@ -15,6 +15,7 @@ public:
   FENConfigModule(FrontEndBase& frontend);
   ~FENConfigModule();
   void configFEN();
+  void configHybrid(int hybrid_index);
   bool configVMM(int hybrid_index, int vmm_index, bool enableConfigCheck=false);
   void fillGlobalRegisters(std::vector<std::string>& global, int hybrid_index, int vmm_index);
   void fillGlobalRegisters2(std::vector<std::string>& global, int hybrid_index, int vmm_index);
@@ -23,6 +24,7 @@ public:
   Hybrid& getHybrid(int index);
   bool enableHybrid(int hybrid, bool onOff);
   bool isHybridEnabled(int hybrid);
+  void sendAll(bool useConfigCheck);
 
 private:
   FrontEndBase *pFEN;
-- 
GitLab