From d9ebce68c5979f71bc40889436f1995e044ada04 Mon Sep 17 00:00:00 2001
From: Arash Aletayeb <Arash.Aletayeb@gmail.com>
Date: Tue, 8 Oct 2024 16:18:41 +0330
Subject: [PATCH] HV & PM5 regulator sync clock have generated.

---
 developHw.pro.user                            |  2 +-
 .../hardware/core/lowLevelApi/TrxBoard.h      |  1 +
 .../register/boardsCtrlMngt/BoardsCtrlMngt.h  | 13 +++
 mainwindow.cpp                                | 79 ++++++++++++++++
 mainwindow.h                                  |  4 +
 mainwindow.ui                                 | 89 ++++++++++++++++++-
 .../hardware/core/lowLevelApi/TrxBoard.cpp    | 10 +++
 .../boardsCtrlMngt/BoardsCtrlMngt.cpp         | 24 +++++
 8 files changed, 218 insertions(+), 4 deletions(-)

diff --git a/developHw.pro.user b/developHw.pro.user
index 451f95b..892ff6f 100644
--- a/developHw.pro.user
+++ b/developHw.pro.user
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.10.0, 2024-09-17T16:03:01. -->
+<!-- Written by QtCreator 4.10.0, 2024-10-08T16:16:35. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
diff --git a/include/model/hardware/core/lowLevelApi/TrxBoard.h b/include/model/hardware/core/lowLevelApi/TrxBoard.h
index f6a6169..730e838 100644
--- a/include/model/hardware/core/lowLevelApi/TrxBoard.h
+++ b/include/model/hardware/core/lowLevelApi/TrxBoard.h
@@ -325,6 +325,7 @@ public:
 	void getHealthStatus(HealthStatus* healStat) const;
 
     void setTrxFanRpm(const eFanPwm& fan, const quint8& dutyCyclePercent) const;
+    void setRegulatorSyncClk(const eRegSync& regType, const regulatorSync& regSyncParams) const;
 
     //////////////////////////////// BPI Flash API ////////////////////////////////
 	void mcsProgram(QString path);
diff --git a/include/model/hardware/core/lowLevelApi/register/boardsCtrlMngt/BoardsCtrlMngt.h b/include/model/hardware/core/lowLevelApi/register/boardsCtrlMngt/BoardsCtrlMngt.h
index 6ff8e5a..5b71b48 100644
--- a/include/model/hardware/core/lowLevelApi/register/boardsCtrlMngt/BoardsCtrlMngt.h
+++ b/include/model/hardware/core/lowLevelApi/register/boardsCtrlMngt/BoardsCtrlMngt.h
@@ -160,6 +160,18 @@ struct criticalComponentTemperature
     float slave2;
 };
 
+struct regulatorSync
+{
+    quint16 halfPeriod;
+    bool enable;
+};
+
+enum eRegSync : quint8
+{
+    HVReg,
+    PM5Reg
+};
+
 class BoardsCtrlMngt : private BoardsSpecs
 {
 private:
@@ -316,6 +328,7 @@ public:
     void getFpgaVccBram(FpgaVccBram& coreBram);
     void getFanRpm(FanRpm* _rpm);
     void setFanPwm(const eFanPwm& fan, const quint8& dcPercent) const;
+    void setPllRefClk(const eRegSync& regType, const regulatorSync& regSyncParams) const;
 
 	QByteArray trxEepromRead(quint32 address, quint32 length);
 	QByteArray mpsEepromRead(quint32 address, quint32 length);
diff --git a/mainwindow.cpp b/mainwindow.cpp
index ca91d5a..ac7a33b 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -2640,6 +2640,85 @@ void MainWindow::on_btn_setAo_clicked()
     }
 }
 
+/*************************************************************************************************/
+void MainWindow::on_chk_hvRegEn_clicked(bool checked)
+{
+    try
+    {
+        if(checked)
+        {
+            auto hvClk = ui->tb_hvRegulatorClk->text().toUInt();
+            regulatorSync regSyncParams =
+            {
+                static_cast<quint16>(hvClk),
+                true
+            };
+
+            _trx.setRegulatorSyncClk(HVReg, regSyncParams);
+        }
+        else
+        {
+            regulatorSync regSyncParams =
+            {
+                0,
+                false
+            };
+
+            _trx.setRegulatorSyncClk(HVReg, regSyncParams);
+        }
+    }
+    catch(SonoException& e)
+    {
+        regulatorSync regSyncParams =
+        {
+            0,
+            false
+        };
+
+        _trx.setRegulatorSyncClk(HVReg, regSyncParams);
+        qDebug() << e.what();
+    }
+}
+
+void MainWindow::on_chk_pm5RegEn_clicked(bool checked)
+{
+    try
+    {
+        if(checked)
+        {
+            auto pm5Clk = ui->tb_pm5RegulatorClk->text().toUInt();
+            regulatorSync regSyncParams =
+            {
+              static_cast<quint16>(pm5Clk),
+              true
+            };
+
+            _trx.setRegulatorSyncClk(PM5Reg, regSyncParams);
+        }
+        else
+        {
+            regulatorSync regSyncParams =
+            {
+              0,
+              false
+            };
+
+            _trx.setRegulatorSyncClk(PM5Reg, regSyncParams);
+        }
+    }
+    catch(SonoException& e)
+    {
+        regulatorSync regSyncParams =
+        {
+          0,
+          false
+        };
+
+        _trx.setRegulatorSyncClk(PM5Reg, regSyncParams);
+        qDebug() << e.what();
+    }
+}
+
 /*************************************************************************************************/
 void MainWindow::on_chk_mpsInit_clicked()
 {
diff --git a/mainwindow.h b/mainwindow.h
index eef26e8..5dbb9a6 100644
--- a/mainwindow.h
+++ b/mainwindow.h
@@ -584,6 +584,10 @@ private slots:
 
     void on_checkBox_clicked(bool checked);
 
+    void on_chk_hvRegEn_clicked(bool checked);
+
+    void on_chk_pm5RegEn_clicked(bool checked);
+
 signals:
     void showMessage(QString message);
     void threeDReady();
diff --git a/mainwindow.ui b/mainwindow.ui
index fe51fd3..1213926 100644
--- a/mainwindow.ui
+++ b/mainwindow.ui
@@ -42,7 +42,7 @@
      <string/>
     </property>
     <property name="currentIndex">
-     <number>3</number>
+     <number>1</number>
     </property>
     <widget class="QWidget" name="tab_0">
      <attribute name="title">
@@ -2159,6 +2159,89 @@
        </property>
       </widget>
      </widget>
+     <widget class="QGroupBox" name="groupBox_20">
+      <property name="geometry">
+       <rect>
+        <x>0</x>
+        <y>390</y>
+        <width>361</width>
+        <height>131</height>
+       </rect>
+      </property>
+      <property name="title">
+       <string>PLL Sync Clk</string>
+      </property>
+      <widget class="QWidget" name="horizontalLayoutWidget_12">
+       <property name="geometry">
+        <rect>
+         <x>10</x>
+         <y>30</y>
+         <width>191</width>
+         <height>41</height>
+        </rect>
+       </property>
+       <layout class="QHBoxLayout" name="horizontalLayout_41">
+        <item>
+         <widget class="QLabel" name="label_103">
+          <property name="text">
+           <string>HV Regulator:   </string>
+          </property>
+         </widget>
+        </item>
+        <item alignment="Qt::AlignRight">
+         <widget class="QLineEdit" name="tb_hvRegulatorClk"/>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="horizontalLayoutWidget_59">
+       <property name="geometry">
+        <rect>
+         <x>10</x>
+         <y>80</y>
+         <width>191</width>
+         <height>41</height>
+        </rect>
+       </property>
+       <layout class="QHBoxLayout" name="horizontalLayout_130">
+        <item>
+         <widget class="QLabel" name="label_107">
+          <property name="text">
+           <string>PM5 Regulator:</string>
+          </property>
+         </widget>
+        </item>
+        <item alignment="Qt::AlignRight">
+         <widget class="QLineEdit" name="tb_pm5RegulatorClk"/>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QCheckBox" name="chk_hvRegEn">
+       <property name="geometry">
+        <rect>
+         <x>220</x>
+         <y>30</y>
+         <width>111</width>
+         <height>31</height>
+        </rect>
+       </property>
+       <property name="text">
+        <string>HV Enable</string>
+       </property>
+      </widget>
+      <widget class="QCheckBox" name="chk_pm5RegEn">
+       <property name="geometry">
+        <rect>
+         <x>220</x>
+         <y>80</y>
+         <width>111</width>
+         <height>31</height>
+        </rect>
+       </property>
+       <property name="text">
+        <string>PM5 Enable</string>
+       </property>
+      </widget>
+     </widget>
     </widget>
     <widget class="QWidget" name="tab_1">
      <attribute name="title">
@@ -6707,9 +6790,9 @@ Dynamic Contrast</string>
      <widget class="QDialogButtonBox" name="btn_discard">
       <property name="geometry">
        <rect>
-        <x>720</x>
+        <x>630</x>
         <y>310</y>
-        <width>81</width>
+        <width>171</width>
         <height>41</height>
        </rect>
       </property>
diff --git a/src/model/hardware/core/lowLevelApi/TrxBoard.cpp b/src/model/hardware/core/lowLevelApi/TrxBoard.cpp
index 3b0f2cd..b2913dc 100644
--- a/src/model/hardware/core/lowLevelApi/TrxBoard.cpp
+++ b/src/model/hardware/core/lowLevelApi/TrxBoard.cpp
@@ -2518,6 +2518,16 @@ void TrxBoard::setTrxFanRpm(const eFanPwm& fan, const quint8& dutyCyclePercent)
     this->_bCtrlMngt->setFanPwm(fan, dutyCyclePercent);
 }
 
+void TrxBoard::setRegulatorSyncClk(const eRegSync& regType, const regulatorSync& regSyncParams) const
+{
+    if(regSyncParams.halfPeriod > 8192)
+    {
+        throw SonoException("Out of range for PLL sync clk.");
+    }
+
+    this->_bCtrlMngt->setPllRefClk(regType, regSyncParams);
+}
+
 void TrxBoard::mcsProgram(QString path)
 {
 	QFile mcsFile(path);
diff --git a/src/model/hardware/core/lowLevelApi/register/boardsCtrlMngt/BoardsCtrlMngt.cpp b/src/model/hardware/core/lowLevelApi/register/boardsCtrlMngt/BoardsCtrlMngt.cpp
index d82bb9f..877242b 100644
--- a/src/model/hardware/core/lowLevelApi/register/boardsCtrlMngt/BoardsCtrlMngt.cpp
+++ b/src/model/hardware/core/lowLevelApi/register/boardsCtrlMngt/BoardsCtrlMngt.cpp
@@ -901,6 +901,30 @@ void BoardsCtrlMngt::setFanPwm(const eFanPwm &fan, const quint8 &dcPercent) cons
     this->_fansPdw->update();
 }
 
+void BoardsCtrlMngt::setPllRefClk(const eRegSync& regType, const regulatorSync& regSyncParams) const
+{
+    bool enable = regSyncParams.enable;
+
+    switch(regType)
+    {
+        case HVReg:
+            this->_mHvRgltor->syncHVsHalfPeriod->setValue(regSyncParams.halfPeriod);
+            this->_mHvRgltor->syncHVsEnable->setValue(enable);
+            this->_mHvRgltor->syncHVsValid->setValue(1);
+            this->_mHvRgltor->syncHVsValid->setValue(0);
+            this->_mHvRgltor->update();
+        break;
+
+        case PM5Reg:
+            this->_mPm5Rgltor->syncPM5HalfPeriod->setValue(regSyncParams.halfPeriod);
+            this->_mPm5Rgltor->syncPM5Enable->setValue(enable);
+            this->_mPm5Rgltor->syncPM5Valid->setValue(1);
+            this->_mPm5Rgltor->syncPM5Valid->setValue(0);
+            this->_mPm5Rgltor->update();
+        break;
+    }
+}
+
 QByteArray BoardsCtrlMngt::trxEepromRead(quint32 address, quint32 length)
 {
     if(address + length > TRX_ROM_MAX_LEN)