From 57240e6c1644c41bc78e6ae29cb6742004f7421c Mon Sep 17 00:00:00 2001
From: szdarkhack <1457198+szdarkhack@users.noreply.github.com>
Date: Thu, 25 Jul 2024 22:21:22 +0300
Subject: [PATCH] Implements a steps per hour (global) setting that gets
 returned by PTM GetStepHistory

---
 src/citra_qt/configuration/config.cpp         |  2 ++
 .../configuration/configure_system.cpp        |  6 ++++
 .../configuration/configure_system.ui         | 29 ++++++++++++++-----
 src/common/settings.h                         |  1 +
 src/core/hle/service/ptm/ptm.cpp              |  3 +-
 5 files changed, 32 insertions(+), 9 deletions(-)

diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp
index 619d82833..21271946b 100644
--- a/src/citra_qt/configuration/config.cpp
+++ b/src/citra_qt/configuration/config.cpp
@@ -713,6 +713,7 @@ void Config::ReadSystemValues() {
         ReadBasicSetting(Settings::values.init_time_offset);
         ReadBasicSetting(Settings::values.init_ticks_type);
         ReadBasicSetting(Settings::values.init_ticks_override);
+        ReadBasicSetting(Settings::values.steps_per_hour);
         ReadBasicSetting(Settings::values.plugin_loader_enabled);
         ReadBasicSetting(Settings::values.allow_plugin_loader);
     }
@@ -1219,6 +1220,7 @@ void Config::SaveSystemValues() {
         WriteBasicSetting(Settings::values.init_time_offset);
         WriteBasicSetting(Settings::values.init_ticks_type);
         WriteBasicSetting(Settings::values.init_ticks_override);
+        WriteBasicSetting(Settings::values.steps_per_hour);
         WriteBasicSetting(Settings::values.plugin_loader_enabled);
         WriteBasicSetting(Settings::values.allow_plugin_loader);
     }
diff --git a/src/citra_qt/configuration/configure_system.cpp b/src/citra_qt/configuration/configure_system.cpp
index 971f9f520..bc7bb53b1 100644
--- a/src/citra_qt/configuration/configure_system.cpp
+++ b/src/citra_qt/configuration/configure_system.cpp
@@ -328,6 +328,8 @@ void ConfigureSystem::SetConfiguration() {
     ui->edit_init_ticks_value->setText(
         QString::number(Settings::values.init_ticks_override.GetValue()));
 
+    ui->spinBox_steps_per_hour->setValue(Settings::values.steps_per_hour.GetValue());
+
     cfg = Service::CFG::GetModule(system);
     ReadSystemSettings();
 
@@ -460,6 +462,8 @@ void ConfigureSystem::ApplyConfiguration() {
         Settings::values.init_ticks_override =
             static_cast<s64>(ui->edit_init_ticks_value->text().toLongLong());
 
+        Settings::values.steps_per_hour = static_cast<u16>(ui->spinBox_steps_per_hour->value());
+
         s64 time_offset_time = ui->edit_init_time_offset_time->time().msecsSinceStartOfDay() / 1000;
         s64 time_offset_days = ui->edit_init_time_offset_days->value() * 86400;
 
@@ -631,8 +635,10 @@ void ConfigureSystem::SetupPerGameUI() {
     ui->label_language->setVisible(false);
     ui->label_country->setVisible(false);
     ui->label_play_coins->setVisible(false);
+    ui->label_steps_per_hour->setVisible(false);
     ui->edit_username->setVisible(false);
     ui->spinBox_play_coins->setVisible(false);
+    ui->spinBox_steps_per_hour->setVisible(false);
     ui->combo_birthday->setVisible(false);
     ui->combo_birthmonth->setVisible(false);
     ui->combo_init_clock->setVisible(false);
diff --git a/src/citra_qt/configuration/configure_system.ui b/src/citra_qt/configuration/configure_system.ui
index 71819029e..1239688e5 100644
--- a/src/citra_qt/configuration/configure_system.ui
+++ b/src/citra_qt/configuration/configure_system.ui
@@ -392,21 +392,35 @@
               </property>
              </widget>
             </item>
+            <item row="13" column="0">
+              <widget class="QLabel" name="label_steps_per_hour">
+                <property name="text">
+                  <string>Steps per hour:</string>
+                </property>
+              </widget>
+            </item>
             <item row="13" column="1">
+              <widget class="QSpinBox" name="spinBox_steps_per_hour">
+                <property name="maximum">
+                  <number>9999</number>
+                </property>
+              </widget>
+            </item>
+            <item row="14" column="1">
              <widget class="QCheckBox" name="toggle_system_setup">
               <property name="text">
                <string>Run System Setup when Home Menu is launched</string>
               </property>
              </widget>
             </item>
-            <item row="14" column="0">
+            <item row="15" column="0">
              <widget class="QLabel" name="label_console_id">
               <property name="text">
                <string>Console ID:</string>
               </property>
              </widget>
             </item>
-            <item row="14" column="1">
+            <item row="15" column="1">
              <widget class="QPushButton" name="button_regenerate_console_id">
               <property name="sizePolicy">
                <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@@ -422,35 +436,35 @@
               </property>
              </widget>
             </item>
-            <item row="15" column="0">
+            <item row="16" column="0">
              <widget class="QLabel" name="label_plugin_loader">
               <property name="text">
                <string>3GX Plugin Loader:</string>
               </property>
              </widget>
             </item>
-            <item row="15" column="1">
+            <item row="16" column="1">
              <widget class="QCheckBox" name="plugin_loader">
               <property name="text">
                <string>Enable 3GX plugin loader</string>
               </property>
              </widget>
             </item>
-            <item row="16" column="1">
+            <item row="17" column="1">
              <widget class="QCheckBox" name="allow_plugin_loader">
               <property name="text">
                <string>Allow games to change plugin loader state</string>
               </property>
              </widget>
             </item>
-            <item row="17" column="0">
+            <item row="18" column="0">
              <widget class="QLabel" name="label_nus_download">
               <property name="text">
                <string>Download System Files from Nitendo servers</string>
               </property>
              </widget>
             </item>
-            <item row="17" column="1">
+            <item row="18" column="1">
              <widget class="QWidget" name="body_nus_download">
               <layout class="QHBoxLayout" name="horizontalLayout_nus_download">
                <item>
@@ -692,6 +706,7 @@
   <tabstop>combo_init_clock</tabstop>
   <tabstop>edit_init_time</tabstop>
   <tabstop>spinBox_play_coins</tabstop>
+  <tabstop>spinBox_steps_per_hour</tabstop>
   <tabstop>button_regenerate_console_id</tabstop>
  </tabstops>
  <resources/>
diff --git a/src/common/settings.h b/src/common/settings.h
index ba556c8c6..8bb6a474b 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -448,6 +448,7 @@ struct Values {
     Setting<s64> init_ticks_override{0, "init_ticks_override"};
     Setting<bool> plugin_loader_enabled{false, "plugin_loader"};
     Setting<bool> allow_plugin_loader{true, "allow_plugin_loader"};
+    Setting<u16> steps_per_hour{0, "steps_per_hour"};
 
     // Renderer
     SwitchableSetting<GraphicsAPI, true> graphics_api {
diff --git a/src/core/hle/service/ptm/ptm.cpp b/src/core/hle/service/ptm/ptm.cpp
index a9851a19b..79c104bce 100644
--- a/src/core/hle/service/ptm/ptm.cpp
+++ b/src/core/hle/service/ptm/ptm.cpp
@@ -84,9 +84,8 @@ void Module::Interface::GetStepHistory(Kernel::HLERequestContext& ctx) {
     ASSERT_MSG(sizeof(u16) * hours == buffer.GetSize(),
                "Buffer for steps count has incorrect size");
 
-    // Stub: set zero steps count for every hour
+    const u16_le steps_per_hour = Settings::values.steps_per_hour.GetValue();
     for (u32 i = 0; i < hours; ++i) {
-        const u16_le steps_per_hour = 0;
         buffer.Write(&steps_per_hour, i * sizeof(u16), sizeof(u16));
     }