aboutsummaryrefslogtreecommitdiff
path: root/src/frontend/qt_sdl
diff options
context:
space:
mode:
authorArisotura <thetotalworm@gmail.com>2021-11-19 13:31:14 +0100
committerArisotura <thetotalworm@gmail.com>2021-11-19 13:31:14 +0100
commit1472a0ec4b6d9a9f0eae01926666b84f04f7262d (patch)
tree976341562a81cc304a2635a56bd679d179bd93b1 /src/frontend/qt_sdl
parent1fc775d964e7397efe4f896f6abaf7baffe8fdc3 (diff)
move 'randomize MAC' setting to firmware settings, and add setting for changing the MAC.
make things overall betterer.
Diffstat (limited to 'src/frontend/qt_sdl')
-rw-r--r--src/frontend/qt_sdl/Config.cpp6
-rw-r--r--src/frontend/qt_sdl/Config.h3
-rw-r--r--src/frontend/qt_sdl/FirmwareSettingsDialog.cpp124
-rw-r--r--src/frontend/qt_sdl/FirmwareSettingsDialog.h8
-rw-r--r--src/frontend/qt_sdl/FirmwareSettingsDialog.ui202
-rw-r--r--src/frontend/qt_sdl/Platform.cpp37
-rw-r--r--src/frontend/qt_sdl/WifiSettingsDialog.cpp17
-rw-r--r--src/frontend/qt_sdl/WifiSettingsDialog.ui12
-rw-r--r--src/frontend/qt_sdl/main.cpp10
9 files changed, 301 insertions, 118 deletions
diff --git a/src/frontend/qt_sdl/Config.cpp b/src/frontend/qt_sdl/Config.cpp
index 8c3690b..30babaf 100644
--- a/src/frontend/qt_sdl/Config.cpp
+++ b/src/frontend/qt_sdl/Config.cpp
@@ -98,7 +98,6 @@ int DSiSDReadOnly;
int DSiSDFolderSync;
char DSiSDFolderPath[1024];
-int RandomizeMAC;
int FirmwareOverrideSettings;
char FirmwareUsername[64];
int FirmwareLanguage;
@@ -106,6 +105,8 @@ int FirmwareBirthdayMonth;
int FirmwareBirthdayDay;
int FirmwareFavouriteColour;
char FirmwareMessage[1024];
+char FirmwareMAC[18];
+int RandomizeMAC;
int SocketBindAnyAddr;
char LANDevice[128];
@@ -255,7 +256,6 @@ ConfigEntry ConfigFile[] =
{"DSiSDFolderSync", 0, &DSiSDFolderSync, 0, NULL, 0},
{"DSiSDFolderPath", 1, DSiSDFolderPath, 0, "", 1023},
- {"RandomizeMAC", 0, &RandomizeMAC, 0, NULL, 0},
{"FirmwareOverrideSettings", 0, &FirmwareOverrideSettings, false, NULL, 0},
{"FirmwareUsername", 1, FirmwareUsername, 0, "melonDS", 63},
{"FirmwareLanguage", 0, &FirmwareLanguage, 1, NULL, 0},
@@ -263,6 +263,8 @@ ConfigEntry ConfigFile[] =
{"FirmwareBirthdayDay", 0, &FirmwareBirthdayDay, 0, NULL, 0},
{"FirmwareFavouriteColour", 0, &FirmwareFavouriteColour, 0, NULL, 0},
{"FirmwareMessage", 1, FirmwareMessage, 0, "", 1023},
+ {"FirmwareMAC", 1, FirmwareMAC, 0, "", 17},
+ {"RandomizeMAC", 0, &RandomizeMAC, 0, NULL, 0},
{"SockBindAnyAddr", 0, &SocketBindAnyAddr, 0, NULL, 0},
{"LANDevice", 1, LANDevice, 0, "", 127},
diff --git a/src/frontend/qt_sdl/Config.h b/src/frontend/qt_sdl/Config.h
index 5914978..ad9b4c6 100644
--- a/src/frontend/qt_sdl/Config.h
+++ b/src/frontend/qt_sdl/Config.h
@@ -121,7 +121,6 @@ extern int DSiSDReadOnly;
extern int DSiSDFolderSync;
extern char DSiSDFolderPath[1024];
-extern int RandomizeMAC;
extern int FirmwareOverrideSettings;
extern char FirmwareUsername[64];
extern int FirmwareLanguage;
@@ -129,6 +128,8 @@ extern int FirmwareBirthdayMonth;
extern int FirmwareBirthdayDay;
extern int FirmwareFavouriteColour;
extern char FirmwareMessage[1024];
+extern char FirmwareMAC[18];
+extern int RandomizeMAC;
extern int SocketBindAnyAddr;
extern char LANDevice[128];
diff --git a/src/frontend/qt_sdl/FirmwareSettingsDialog.cpp b/src/frontend/qt_sdl/FirmwareSettingsDialog.cpp
index 3924463..e2dc5a7 100644
--- a/src/frontend/qt_sdl/FirmwareSettingsDialog.cpp
+++ b/src/frontend/qt_sdl/FirmwareSettingsDialog.cpp
@@ -16,13 +16,20 @@
with melonDS. If not, see http://www.gnu.org/licenses/.
*/
+#include <QMessageBox>
+
#include "Config.h"
+
#include "FirmwareSettingsDialog.h"
#include "ui_FirmwareSettingsDialog.h"
FirmwareSettingsDialog* FirmwareSettingsDialog::currentDlg = nullptr;
+extern bool RunningSomething;
+
+bool FirmwareSettingsDialog::needsReset = false;
+
FirmwareSettingsDialog::FirmwareSettingsDialog(QWidget* parent) : QDialog(parent), ui(new Ui::FirmwareSettingsDialog)
{
ui->setupUi(this);
@@ -55,6 +62,10 @@ FirmwareSettingsDialog::FirmwareSettingsDialog(QWidget* parent) : QDialog(parent
ui->messageEdit->setText(Config::FirmwareMessage);
ui->overrideFirmwareBox->setChecked(Config::FirmwareOverrideSettings);
+
+ ui->txtMAC->setText(Config::FirmwareMAC);
+ ui->cbRandomizeMAC->setChecked(Config::RandomizeMAC != 0);
+ on_cbRandomizeMAC_toggled();
}
FirmwareSettingsDialog::~FirmwareSettingsDialog()
@@ -62,31 +73,112 @@ FirmwareSettingsDialog::~FirmwareSettingsDialog()
delete ui;
}
-void FirmwareSettingsDialog::on_FirmwareSettingsDialog_accepted()
+bool FirmwareSettingsDialog::verifyMAC()
{
- std::string newName = ui->usernameEdit->text().toStdString();
- strncpy(Config::FirmwareUsername, newName.c_str(), 63); Config::FirmwareUsername[63] = '\0';
+ QString mac = ui->txtMAC->text();
+ int maclen = mac.length();
- Config::FirmwareLanguage = ui->languageBox->currentIndex();
- Config::FirmwareFavouriteColour = ui->colorsEdit->currentIndex();
- Config::FirmwareBirthdayDay = ui->cbxBirthdayDay->currentIndex() + 1;
- Config::FirmwareBirthdayMonth = ui->cbxBirthdayMonth->currentIndex() + 1;
- Config::FirmwareOverrideSettings = ui->overrideFirmwareBox->isChecked();
+ // blank MAC = no MAC override
+ if (maclen == 0)
+ return true;
- std::string newMessage = ui->messageEdit->text().toStdString();
- strncpy(Config::FirmwareMessage, newMessage.c_str(), 1023); Config::FirmwareMessage[1023] = '\0';
- Config::Save();
+ // length should be 12 or 17 if separators are used
+ if (maclen != 12 && maclen != 17)
+ return false;
- closeDlg();
+ bool hassep = maclen==17;
+ int pos = 0;
+ for (int i = 0; i < maclen;)
+ {
+ QCharRef c = mac[i];
+ bool good = false;
+ if (c >= '0' && c <= '9') good = true;
+ else if (c >= 'a' && c <= 'f') good = true;
+ else if (c >= 'A' && c <= 'F') good = true;
+ if (!good) return false;
+
+ i++;
+ pos++;
+ if (pos >= 2)
+ {
+ pos = 0;
+ if (hassep) i++;
+ }
+ }
+
+ return true;
}
-void FirmwareSettingsDialog::on_FirmwareSettingsDialog_rejected()
+void FirmwareSettingsDialog::done(int r)
{
+ needsReset = false;
+
+ if (r == QDialog::Accepted)
+ {
+ if (!verifyMAC())
+ {
+ QMessageBox::critical(this, "Invalid MAC address",
+ "The MAC address you entered isn't valid. It should contain 6 pairs of hexadecimal digits, optionally separated.");
+
+ return;
+ }
+
+ int newOverride = ui->overrideFirmwareBox->isChecked();
+
+ std::string newName = ui->usernameEdit->text().toStdString();
+ int newLanguage = ui->languageBox->currentIndex();
+ int newFavColor = ui->colorsEdit->currentIndex();
+ int newBirthdayDay = ui->cbxBirthdayDay->currentIndex() + 1;
+ int newBirthdayMonth = ui->cbxBirthdayMonth->currentIndex() + 1;
+ std::string newMessage = ui->messageEdit->text().toStdString();
+
+ std::string newMAC = ui->txtMAC->text().toStdString();
+ int newRandomizeMAC = ui->cbRandomizeMAC->isChecked() ? 1:0;
+
+ if ( newOverride != Config::FirmwareOverrideSettings
+ || strcmp(newName.c_str(), Config::FirmwareUsername) != 0
+ || newLanguage != Config::FirmwareLanguage
+ || newFavColor != Config::FirmwareFavouriteColour
+ || newBirthdayDay != Config::FirmwareBirthdayDay
+ || newBirthdayMonth != Config::FirmwareBirthdayMonth
+ || strcmp(newMessage.c_str(), Config::FirmwareMessage) != 0
+ || strcmp(newMAC.c_str(), Config::FirmwareMAC) != 0
+ || newRandomizeMAC != Config::RandomizeMAC)
+ {
+ if (RunningSomething
+ && QMessageBox::warning(this, "Reset necessary to apply changes",
+ "The emulation will be reset for the changes to take place.",
+ QMessageBox::Ok, QMessageBox::Cancel) != QMessageBox::Ok)
+ return;
+
+ Config::FirmwareOverrideSettings = newOverride;
+
+ strncpy(Config::FirmwareUsername, newName.c_str(), 63); Config::FirmwareUsername[63] = '\0';
+ Config::FirmwareLanguage = newLanguage;
+ Config::FirmwareFavouriteColour = newFavColor;
+ Config::FirmwareBirthdayDay = newBirthdayDay;
+ Config::FirmwareBirthdayMonth = newBirthdayMonth;
+ strncpy(Config::FirmwareMessage, newMessage.c_str(), 1023); Config::FirmwareMessage[1023] = '\0';
+
+ strncpy(Config::FirmwareMAC, newMAC.c_str(), 17); Config::FirmwareMAC[17] = '\0';
+ Config::RandomizeMAC = newRandomizeMAC;
+
+ Config::Save();
+
+ needsReset = true;
+ }
+ }
+
+ QDialog::done(r);
+
closeDlg();
}
void FirmwareSettingsDialog::on_cbxBirthdayMonth_currentIndexChanged(int idx)
{
+ // prevent spurious changes
+ if (ui->cbxBirthdayMonth->count() < 12) return;
+
// the DS firmware caps the birthday day depending on the birthday month
// for February, the limit is 29
const int ndays[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
@@ -109,3 +201,9 @@ void FirmwareSettingsDialog::on_cbxBirthdayMonth_currentIndexChanged(int idx)
}
}
}
+
+void FirmwareSettingsDialog::on_cbRandomizeMAC_toggled()
+{
+ bool disable = ui->cbRandomizeMAC->isChecked();
+ ui->txtMAC->setDisabled(disable);
+}
diff --git a/src/frontend/qt_sdl/FirmwareSettingsDialog.h b/src/frontend/qt_sdl/FirmwareSettingsDialog.h
index 518274e..1ae409f 100644
--- a/src/frontend/qt_sdl/FirmwareSettingsDialog.h
+++ b/src/frontend/qt_sdl/FirmwareSettingsDialog.h
@@ -117,13 +117,17 @@ public:
currentDlg = nullptr;
}
+ static bool needsReset;
+
private slots:
- void on_FirmwareSettingsDialog_accepted();
- void on_FirmwareSettingsDialog_rejected();
+ void done(int r);
void on_cbxBirthdayMonth_currentIndexChanged(int idx);
+ void on_cbRandomizeMAC_toggled();
private:
+ bool verifyMAC();
+
Ui::FirmwareSettingsDialog* ui;
};
diff --git a/src/frontend/qt_sdl/FirmwareSettingsDialog.ui b/src/frontend/qt_sdl/FirmwareSettingsDialog.ui
index 5a270e7..a97689c 100644
--- a/src/frontend/qt_sdl/FirmwareSettingsDialog.ui
+++ b/src/frontend/qt_sdl/FirmwareSettingsDialog.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>511</width>
- <height>196</height>
+ <height>342</height>
</rect>
</property>
<property name="sizePolicy">
@@ -24,78 +24,134 @@
<enum>QLayout::SetFixedSize</enum>
</property>
<item>
- <layout class="QGridLayout" name="gridLayout">
- <item row="2" column="1">
- <widget class="QComboBox" name="cbxBirthdayDay"/>
- </item>
- <item row="0" column="0">
- <widget class="QLabel" name="usernameLabel">
- <property name="text">
- <string>Username:</string>
- </property>
- </widget>
- </item>
- <item row="4" column="0">
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>Message:</string>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>Color:</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Language:</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>Birthday:</string>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <widget class="QComboBox" name="cbxBirthdayMonth"/>
- </item>
- <item row="1" column="1" colspan="2">
- <widget class="QComboBox" name="languageBox"/>
- </item>
- <item row="0" column="1" colspan="2">
- <widget class="QLineEdit" name="usernameEdit">
- <property name="text">
- <string>melonDS</string>
- </property>
- <property name="maxLength">
- <number>10</number>
- </property>
- <property name="clearButtonEnabled">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item row="3" column="1" colspan="2">
- <widget class="QComboBox" name="colorsEdit"/>
- </item>
- <item row="4" column="1" colspan="2">
- <widget class="QLineEdit" name="messageEdit"/>
- </item>
- <item row="5" column="0" colspan="3">
- <widget class="QCheckBox" name="overrideFirmwareBox">
- <property name="text">
- <string>Override settings from external firmware</string>
- </property>
- </widget>
- </item>
- </layout>
+ <widget class="QGroupBox" name="grpGeneral">
+ <property name="title">
+ <string>General</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="0" column="0">
+ <widget class="QCheckBox" name="overrideFirmwareBox">
+ <property name="text">
+ <string>Override settings from external firmware</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="grpUserSettings">
+ <property name="title">
+ <string>User settings</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="leftMargin">
+ <number>9</number>
+ </property>
+ <property name="topMargin">
+ <number>9</number>
+ </property>
+ <property name="rightMargin">
+ <number>9</number>
+ </property>
+ <property name="bottomMargin">
+ <number>9</number>
+ </property>
+ <item row="2" column="1">
+ <widget class="QComboBox" name="cbxBirthdayDay"/>
+ </item>
+ <item row="2" column="2">
+ <widget class="QComboBox" name="cbxBirthdayMonth"/>
+ </item>
+ <item row="0" column="1" colspan="2">
+ <widget class="QLineEdit" name="usernameEdit">
+ <property name="text">
+ <string>melonDS</string>
+ </property>
+ <property name="maxLength">
+ <number>10</number>
+ </property>
+ <property name="clearButtonEnabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="usernameLabel">
+ <property name="text">
+ <string>Username:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Message:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" colspan="2">
+ <widget class="QComboBox" name="colorsEdit"/>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Color:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Language:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>Birthday:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1" colspan="2">
+ <widget class="QLineEdit" name="messageEdit"/>
+ </item>
+ <item row="1" column="1" colspan="2">
+ <widget class="QComboBox" name="languageBox"/>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="grpWifiSettings">
+ <property name="title">
+ <string>Network settings</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>MAC address:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="txtMAC">
+ <property name="maxLength">
+ <number>17</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QCheckBox" name="cbRandomizeMAC">
+ <property name="text">
+ <string>Randomize</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
</item>
<item>
<widget class="QDialogButtonBox" name="dialogButtons">
diff --git a/src/frontend/qt_sdl/Platform.cpp b/src/frontend/qt_sdl/Platform.cpp
index 9dfad06..812c953 100644
--- a/src/frontend/qt_sdl/Platform.cpp
+++ b/src/frontend/qt_sdl/Platform.cpp
@@ -201,6 +201,43 @@ std::string GetConfigString(ConfigEntry entry)
return "";
}
+bool GetConfigArray(ConfigEntry entry, void* data)
+{
+ switch (entry)
+ {
+ case Firm_MAC:
+ {
+ char* mac_in = Config::FirmwareMAC;
+ u8* mac_out = (u8*)data;
+
+ int o = 0;
+ u8 tmp = 0;
+ for (int i = 0; i < 18; i++)
+ {
+ char c = mac_in[i];
+ if (c == '\0') break;
+
+ int n;
+ if (c >= '0' && c <= '9') n = c - '0';
+ else if (c >= 'a' && c <= 'f') n = c - 'a' + 10;
+ else if (c >= 'A' && c <= 'F') n = c - 'A' + 10;
+ else continue;
+
+ if (!(o & 1))
+ tmp = n;
+ else
+ mac_out[o >> 1] = n | (tmp << 4);
+
+ o++;
+ if (o >= 12) return true;
+ }
+ }
+ return false;
+ }
+
+ return false;
+}
+
FILE* OpenFile(std::string path, std::string mode, bool mustexist)
{
diff --git a/src/frontend/qt_sdl/WifiSettingsDialog.cpp b/src/frontend/qt_sdl/WifiSettingsDialog.cpp
index 9c428ba..d438179 100644
--- a/src/frontend/qt_sdl/WifiSettingsDialog.cpp
+++ b/src/frontend/qt_sdl/WifiSettingsDialog.cpp
@@ -56,7 +56,6 @@ WifiSettingsDialog::WifiSettingsDialog(QWidget* parent) : QDialog(parent), ui(ne
ui->rbDirectMode->setText("Direct mode (requires " PCAP_NAME " and ethernet connection)");
ui->cbBindAnyAddr->setChecked(Config::SocketBindAnyAddr != 0);
- ui->cbRandomizeMAC->setChecked(Config::RandomizeMAC != 0);
int sel = 0;
for (int i = 0; i < LAN_PCap::NumAdapters; i++)
@@ -88,19 +87,7 @@ void WifiSettingsDialog::done(int r)
if (r == QDialog::Accepted)
{
- int randommac = ui->cbRandomizeMAC->isChecked() ? 1:0;
-
- if (randommac != Config::RandomizeMAC)
- {
- if (RunningSomething
- && QMessageBox::warning(this, "Reset necessary to apply changes",
- "The emulation will be reset for the changes to take place.",
- QMessageBox::Ok, QMessageBox::Cancel) != QMessageBox::Ok)
- return;
- }
-
Config::SocketBindAnyAddr = ui->cbBindAnyAddr->isChecked() ? 1:0;
- Config::RandomizeMAC = randommac;
Config::DirectLAN = ui->rbDirectMode->isChecked() ? 1:0;
int sel = ui->cbxDirectAdapter->currentIndex();
@@ -116,8 +103,6 @@ void WifiSettingsDialog::done(int r)
}
Config::Save();
-
- needsReset = true;
}
QDialog::done(r);
@@ -129,10 +114,12 @@ void WifiSettingsDialog::on_rbDirectMode_clicked()
{
updateAdapterControls();
}
+
void WifiSettingsDialog::on_rbIndirectMode_clicked()
{
updateAdapterControls();
}
+
void WifiSettingsDialog::on_cbxDirectAdapter_currentIndexChanged(int sel)
{
if (!haspcap) return;
diff --git a/src/frontend/qt_sdl/WifiSettingsDialog.ui b/src/frontend/qt_sdl/WifiSettingsDialog.ui
index 44a4232..0897059 100644
--- a/src/frontend/qt_sdl/WifiSettingsDialog.ui
+++ b/src/frontend/qt_sdl/WifiSettingsDialog.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>572</width>
- <height>296</height>
+ <height>273</height>
</rect>
</property>
<property name="sizePolicy">
@@ -39,16 +39,6 @@
</property>
</widget>
</item>
- <item row="1" column="0">
- <widget class="QCheckBox" name="cbRandomizeMAC">
- <property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Randomizes the console's MAC address upon reset. Required for local multiplayer if each melonDS instance uses the same firmware file.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="text">
- <string>Randomize MAC address</string>
- </property>
- </widget>
- </item>
</layout>
</widget>
</item>
diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp
index 99c32e0..64a0a90 100644
--- a/src/frontend/qt_sdl/main.cpp
+++ b/src/frontend/qt_sdl/main.cpp
@@ -2451,11 +2451,19 @@ void MainWindow::onOpenAudioSettings()
void MainWindow::onOpenFirmwareSettings()
{
+ emuThread->emuPause();
+
FirmwareSettingsDialog* dlg = FirmwareSettingsDialog::openDlg(this);
connect(dlg, &FirmwareSettingsDialog::finished, this, &MainWindow::onFirmwareSettingsFinished);
}
-void MainWindow::onFirmwareSettingsFinished(int res) {}
+void MainWindow::onFirmwareSettingsFinished(int res)
+{
+ if (FirmwareSettingsDialog::needsReset)
+ onReset();
+
+ emuThread->emuUnpause();
+}
void MainWindow::onUpdateAudioSettings()
{