From 3e350b666b569f116450b6a115cb577aa2cd78cb Mon Sep 17 00:00:00 2001
From: Deterous <138427222+Deterous@users.noreply.github.com>
Date: Tue, 16 Apr 2024 23:11:09 +0900
Subject: [PATCH] Custom non-redump Redumper options (#691)
* Gate advanced Redumper options in UI, add read method + sector order
* Update changelog
* Fixed-width text/combo boxes
---
CHANGELIST.md | 1 +
MPF.Core/Converters/EnumConverter.cs | 89 +++++++++++++++++++++-
MPF.Core/Data/Enumerations.cs | 25 ++++++
MPF.Core/Data/Options.cs | 40 +++++++++-
MPF.Core/Modules/Redumper/Parameters.cs | 9 ++-
MPF.Core/UI/ViewModels/OptionsViewModel.cs | 41 +++++++++-
MPF.UI.Core/ElementConverter.cs | 4 +
MPF.UI.Core/Windows/OptionsWindow.xaml | 38 +++++----
MPF.UI.Core/Windows/OptionsWindow.xaml.cs | 13 +++-
9 files changed, 238 insertions(+), 22 deletions(-)
diff --git a/CHANGELIST.md b/CHANGELIST.md
index 13fc1e55..ef6c2172 100644
--- a/CHANGELIST.md
+++ b/CHANGELIST.md
@@ -2,6 +2,7 @@
- Fix parameter parsing for `=` symbol (Deterous)
- Define better default categories (Deterous)
+- Custom non-redump Redumper options (Deterous)
### 3.1.5 (2024-04-05)
diff --git a/MPF.Core/Converters/EnumConverter.cs b/MPF.Core/Converters/EnumConverter.cs
index ca3ac7bc..ae66672c 100644
--- a/MPF.Core/Converters/EnumConverter.cs
+++ b/MPF.Core/Converters/EnumConverter.cs
@@ -111,7 +111,44 @@ namespace MPF.Core.Converters
};
}
-#endregion
+ ///
+ /// Get the string representation of the RedumperReadMethod enum values
+ ///
+ /// RedumperReadMethod value to convert
+ /// String representing the value, if possible
+ public static string LongName(this RedumperReadMethod? method)
+ {
+ return (method) switch
+ {
+ RedumperReadMethod.D8 => "D8",
+ RedumperReadMethod.BE => "BE",
+ RedumperReadMethod.BE_CDDA => "BE_CDDA",
+
+ RedumperReadMethod.NONE => "Default",
+ _ => "Unknown",
+ };
+ }
+
+ ///
+ /// Get the string representation of the RedumperSectorOrder enum values
+ ///
+ /// RedumperSectorOrder value to convert
+ /// String representing the value, if possible
+ public static string LongName(this RedumperSectorOrder? order)
+ {
+ return (order) switch
+ {
+ RedumperSectorOrder.DATA_C2_SUB => "DATA_C2_SUB",
+ RedumperSectorOrder.DATA_SUB_C2 => "DATA_SUB_C2",
+ RedumperSectorOrder.DATA_SUB => "DATA_SUB",
+ RedumperSectorOrder.DATA_C2 => "DATA_C2",
+
+ RedumperSectorOrder.NONE => "Default",
+ _ => "Unknown",
+ };
+ }
+
+ #endregion
#region Convert From String
@@ -299,6 +336,56 @@ namespace MPF.Core.Converters
};
}
+ ///
+ /// Get the RedumperReadMethod enum value for a given string
+ ///
+ /// String value to convert
+ /// RedumperReadMethod represented by the string, if possible
+ public static RedumperReadMethod ToRedumperReadMethod(string? method)
+ {
+ return (method?.ToLowerInvariant()) switch
+ {
+ "d8" => RedumperReadMethod.D8,
+ "be" => RedumperReadMethod.BE,
+ "be_cdda"
+ or "be cdda"
+ or "be-cdda"
+ or "becdda" => RedumperReadMethod.BE_CDDA,
+
+ _ => RedumperReadMethod.NONE,
+ };
+ }
+
+ ///
+ /// Get the RedumperSectorOrder enum value for a given string
+ ///
+ /// String value to convert
+ /// RedumperSectorOrder represented by the string, if possible
+ public static RedumperSectorOrder ToRedumperSectorOrder(string? order)
+ {
+ return (order?.ToLowerInvariant()) switch
+ {
+ "data_c2_sub"
+ or "data c2 sub"
+ or "data-c2-sub"
+ or "datac2sub" => RedumperSectorOrder.DATA_C2_SUB,
+ "data_sub_c2"
+ or "data sub c2"
+ or "data-sub-c2"
+ or "datasubc2" => RedumperSectorOrder.DATA_SUB_C2,
+ "data_sub"
+ or "data sub"
+ or "data-sub"
+ or "datasub" => RedumperSectorOrder.DATA_SUB,
+ "data_c2"
+ or "data c2"
+ or "data-c2"
+ or "datac2" => RedumperSectorOrder.DATA_C2,
+
+ _ => RedumperSectorOrder.NONE,
+ };
+ }
+
#endregion
}
}
diff --git a/MPF.Core/Data/Enumerations.cs b/MPF.Core/Data/Enumerations.cs
index fd4ed2b4..afcaf644 100644
--- a/MPF.Core/Data/Enumerations.cs
+++ b/MPF.Core/Data/Enumerations.cs
@@ -50,6 +50,31 @@
UmdImageCreator,
}
+ ///
+ /// Drive read method option
+ ///
+ public enum RedumperReadMethod
+ {
+ NONE = 0,
+
+ BE,
+ D8,
+ BE_CDDA,
+ }
+
+ ///
+ /// Drive sector order option
+ ///
+ public enum RedumperSectorOrder
+ {
+ NONE = 0,
+
+ DATA_C2_SUB,
+ DATA_SUB_C2,
+ DATA_SUB,
+ DATA_C2,
+ }
+
///
/// Log level for output
///
diff --git a/MPF.Core/Data/Options.cs b/MPF.Core/Data/Options.cs
index 0bdd53ac..c79c0e41 100644
--- a/MPF.Core/Data/Options.cs
+++ b/MPF.Core/Data/Options.cs
@@ -326,12 +326,12 @@ namespace MPF.Core.Data
}
///
- /// Enable BE reading by default with Redumper
+ /// Enable options incompatible with redump submissions
///
- public bool RedumperUseBEReading
+ public bool RedumperNonRedumpMode
{
- get { return GetBooleanSetting(Settings, "RedumperUseBEReading", false); }
- set { Settings["RedumperUseBEReading"] = value.ToString(); }
+ get { return GetBooleanSetting(Settings, "RedumperNonRedumpMode", false); }
+ set { Settings["RedumperNonRedumpMode"] = value.ToString(); }
}
///
@@ -343,6 +343,38 @@ namespace MPF.Core.Data
set { Settings["RedumperUseGenericDriveType"] = value.ToString(); }
}
+ ///
+ /// Currently selected default redumper read method
+ ///
+ public RedumperReadMethod RedumperReadMethod
+ {
+ get
+ {
+ var valueString = GetStringSetting(Settings, "RedumperReadMethod", RedumperReadMethod.NONE.ToString());
+ return EnumConverter.ToRedumperReadMethod(valueString);
+ }
+ set
+ {
+ Settings["RedumperReadMethod"] = value.ToString();
+ }
+ }
+
+ ///
+ /// Currently selected default redumper sector order
+ ///
+ public RedumperSectorOrder RedumperSectorOrder
+ {
+ get
+ {
+ var valueString = GetStringSetting(Settings, "RedumperSectorOrder", RedumperSectorOrder.NONE.ToString());
+ return EnumConverter.ToRedumperSectorOrder(valueString);
+ }
+ set
+ {
+ Settings["RedumperSectorOrder"] = value.ToString();
+ }
+ }
+
///
/// Default number of rereads
///
diff --git a/MPF.Core/Modules/Redumper/Parameters.cs b/MPF.Core/Modules/Redumper/Parameters.cs
index d13694f2..bbf4af4b 100644
--- a/MPF.Core/Modules/Redumper/Parameters.cs
+++ b/MPF.Core/Modules/Redumper/Parameters.cs
@@ -1098,10 +1098,15 @@ namespace MPF.Core.Modules.Redumper
this[FlagStrings.Verbose] = options.RedumperEnableVerbose;
if (options.RedumperEnableDebug)
this[FlagStrings.Debug] = options.RedumperEnableDebug;
- if (options.RedumperUseBEReading)
+ if (options.RedumperReadMethod != RedumperReadMethod.NONE)
{
this[FlagStrings.DriveReadMethod] = true;
- DriveReadMethodValue = "BE_CDDA";
+ DriveReadMethodValue = options.RedumperReadMethod.ToString();
+ }
+ if (options.RedumperSectorOrder != RedumperSectorOrder.NONE)
+ {
+ this[FlagStrings.DriveSectorOrder] = true;
+ DriveSectorOrderValue = options.RedumperSectorOrder.ToString();
}
if (options.RedumperUseGenericDriveType)
{
diff --git a/MPF.Core/UI/ViewModels/OptionsViewModel.cs b/MPF.Core/UI/ViewModels/OptionsViewModel.cs
index 2a97fe39..b051888a 100644
--- a/MPF.Core/UI/ViewModels/OptionsViewModel.cs
+++ b/MPF.Core/UI/ViewModels/OptionsViewModel.cs
@@ -51,6 +51,16 @@ namespace MPF.Core.UI.ViewModels
///
public static List> InternalPrograms => PopulateInternalPrograms();
+ ///
+ /// Current list of supported Redumper read methods
+ ///
+ public static List> RedumperReadMethods => PopulateRedumperReadMethods();
+
+ ///
+ /// Current list of supported Redumper sector orders
+ ///
+ public static List> RedumperSectorOrders => PopulateRedumperSectorOrders();
+
///
/// Current list of supported system profiles
///
@@ -77,7 +87,7 @@ namespace MPF.Core.UI.ViewModels
#region Population
///
- /// Get a complete list of supported internal programs
+ /// Get a complete list of supported internal programs
///
private static List> PopulateInternalPrograms()
{
@@ -85,6 +95,24 @@ namespace MPF.Core.UI.ViewModels
return internalPrograms.Select(ip => new Element(ip)).ToList();
}
+ ///
+ /// Get a complete list of supported redumper drive read methods
+ ///
+ private static List> PopulateRedumperReadMethods()
+ {
+ var readMethods = new List { RedumperReadMethod.NONE, RedumperReadMethod.D8, RedumperReadMethod.BE, RedumperReadMethod.BE_CDDA };
+ return readMethods.Select(rm => new Element(rm)).ToList();
+ }
+
+ ///
+ /// Get a complete list of supported redumper drive sector orders
+ ///
+ private static List> PopulateRedumperSectorOrders()
+ {
+ var sectorOrders = new List { RedumperSectorOrder.NONE, RedumperSectorOrder.DATA_C2_SUB, RedumperSectorOrder.DATA_SUB_C2, RedumperSectorOrder.DATA_SUB, RedumperSectorOrder.DATA_C2 };
+ return sectorOrders.Select(so => new Element(so)).ToList();
+ }
+
#endregion
#region UI Commands
@@ -107,6 +135,17 @@ namespace MPF.Core.UI.ViewModels
#endif
}
+ ///
+ /// Reset Redumper non-redump options (Read Method, Sector Order, Drive Type)
+ ///
+ public void NonRedumpModeUnChecked()
+ {
+ Options.RedumperReadMethod = RedumperReadMethod.NONE;
+ Options.RedumperSectorOrder = RedumperSectorOrder.NONE;
+ Options.RedumperUseGenericDriveType = false;
+ TriggerPropertyChanged(nameof(Options));
+ }
+
#endregion
#region Property Updates
diff --git a/MPF.UI.Core/ElementConverter.cs b/MPF.UI.Core/ElementConverter.cs
index 640588a0..1353a2f9 100644
--- a/MPF.UI.Core/ElementConverter.cs
+++ b/MPF.UI.Core/ElementConverter.cs
@@ -16,6 +16,8 @@ namespace MPF.UI.Core
DiscCategory discCategory => new Element(discCategory),
InternalProgram internalProgram => new Element(internalProgram),
MediaType mediaType => new Element(mediaType),
+ RedumperReadMethod readMethod => new Element(readMethod),
+ RedumperSectorOrder sectorOrder => new Element(sectorOrder),
RedumpSystem redumpSystem => new RedumpSystemComboBoxItem(redumpSystem),
Region region => new Element(region),
@@ -35,6 +37,8 @@ namespace MPF.UI.Core
Element dcElement => dcElement.Value,
Element ipElement => ipElement.Value,
Element mtElement => mtElement.Value,
+ Element rmElement => rmElement.Value,
+ Element soElement => soElement.Value,
RedumpSystemComboBoxItem rsElement => rsElement.Value,
Element reValue => reValue.Value,
_ => null,
diff --git a/MPF.UI.Core/Windows/OptionsWindow.xaml b/MPF.UI.Core/Windows/OptionsWindow.xaml
index 45a2254d..48661926 100644
--- a/MPF.UI.Core/Windows/OptionsWindow.xaml
+++ b/MPF.UI.Core/Windows/OptionsWindow.xaml
@@ -370,7 +370,7 @@
/>
-
@@ -406,19 +406,19 @@
-
-
-
@@ -426,7 +426,7 @@
-
+
-
+
+
+
-
-
+
+
+
+
diff --git a/MPF.UI.Core/Windows/OptionsWindow.xaml.cs b/MPF.UI.Core/Windows/OptionsWindow.xaml.cs
index 8645e99f..9e895bfb 100644
--- a/MPF.UI.Core/Windows/OptionsWindow.xaml.cs
+++ b/MPF.UI.Core/Windows/OptionsWindow.xaml.cs
@@ -214,7 +214,7 @@ namespace MPF.UI.Core.Windows
CustomMessageBox.Show(this, message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
-#endregion
+ #endregion
#region Event Handlers
@@ -224,6 +224,17 @@ namespace MPF.UI.Core.Windows
private void BrowseForPathClick(object sender, EventArgs e) =>
BrowseForPath(this, sender as System.Windows.Controls.Button);
+ ///
+ /// Alert user of non-redump mode implications
+ ///
+ private void NonRedumpModeClicked(object sender, EventArgs e)
+ {
+ if (OptionsViewModel.Options.RedumperNonRedumpMode)
+ CustomMessageBox.Show(this, "All logs generated with these options will not be acceptable for Redump submission", "Warning", MessageBoxButton.OK, MessageBoxImage.Warning);
+ else
+ OptionsViewModel.NonRedumpModeUnChecked();
+ }
+
///
/// Handler for AcceptButton Click event
///