diff options
author | Arisotura <thetotalworm@gmail.com> | 2021-11-19 13:31:14 +0100 |
---|---|---|
committer | Arisotura <thetotalworm@gmail.com> | 2021-11-19 13:31:14 +0100 |
commit | 1472a0ec4b6d9a9f0eae01926666b84f04f7262d (patch) | |
tree | 976341562a81cc304a2635a56bd679d179bd93b1 /src/frontend/qt_sdl | |
parent | 1fc775d964e7397efe4f896f6abaf7baffe8fdc3 (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.cpp | 6 | ||||
-rw-r--r-- | src/frontend/qt_sdl/Config.h | 3 | ||||
-rw-r--r-- | src/frontend/qt_sdl/FirmwareSettingsDialog.cpp | 124 | ||||
-rw-r--r-- | src/frontend/qt_sdl/FirmwareSettingsDialog.h | 8 | ||||
-rw-r--r-- | src/frontend/qt_sdl/FirmwareSettingsDialog.ui | 202 | ||||
-rw-r--r-- | src/frontend/qt_sdl/Platform.cpp | 37 | ||||
-rw-r--r-- | src/frontend/qt_sdl/WifiSettingsDialog.cpp | 17 | ||||
-rw-r--r-- | src/frontend/qt_sdl/WifiSettingsDialog.ui | 12 | ||||
-rw-r--r-- | src/frontend/qt_sdl/main.cpp | 10 |
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><html><head/><body><p>Randomizes the console's MAC address upon reset. Required for local multiplayer if each melonDS instance uses the same firmware file.</p></body></html></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() { |