From daed1933cc45c69a1fd5620aaad092dc0eb46337 Mon Sep 17 00:00:00 2001 From: Travis Nickles Date: Mon, 31 Aug 2015 00:11:43 -0500 Subject: [PATCH] Add mutex for settings. Adjust extra accel duration. --- src/antimicrosettings.cpp | 5 ++ src/antimicrosettings.h | 3 + src/autoprofilewatcher.cpp | 2 + src/firstrunwizard/associateprofilespage.cpp | 5 ++ src/firstrunwizard/firstrunwizard.cpp | 2 + src/firstrunwizard/mousesettingspage.cpp | 2 + src/inputdaemon.cpp | 6 ++ src/joybutton.cpp | 41 ++++++++-- src/mainsettingsdialog.cpp | 19 ++++- src/sdleventreader.cpp | 80 +++++++++----------- 10 files changed, 111 insertions(+), 54 deletions(-) diff --git a/src/antimicrosettings.cpp b/src/antimicrosettings.cpp index 6b62b5ad..98e99b3f 100644 --- a/src/antimicrosettings.cpp +++ b/src/antimicrosettings.cpp @@ -71,3 +71,8 @@ void AntiMicroSettings::importFromCommandLine(CommandLineUtility &cmdutility) cmdSettings.setValue("DisplaySDLMapping", 1); } } + +QMutex* AntiMicroSettings::getLock() +{ + return &lock; +} diff --git a/src/antimicrosettings.h b/src/antimicrosettings.h index fba9d13f..e7496491 100644 --- a/src/antimicrosettings.h +++ b/src/antimicrosettings.h @@ -19,6 +19,7 @@ #define ANTIMICROSETTINGS_H #include +#include #include "commandlineutility.h" @@ -30,6 +31,7 @@ public: QVariant runtimeValue(const QString &key, const QVariant &defaultValue = QVariant()) const; void importFromCommandLine(CommandLineUtility &cmdutility); + QMutex* getLock(); static const bool defaultDisabledWinEnhanced; static const bool defaultAssociateProfiles; @@ -38,6 +40,7 @@ public: protected: QSettings cmdSettings; + QMutex lock; signals: diff --git a/src/autoprofilewatcher.cpp b/src/autoprofilewatcher.cpp index bf4b6d3f..ae35ebc4 100644 --- a/src/autoprofilewatcher.cpp +++ b/src/autoprofilewatcher.cpp @@ -238,6 +238,7 @@ void AutoProfileWatcher::syncProfileAssignment() //QStringList assignments = settings->allKeys(); //QStringListIterator iter(assignments); + settings->getLock()->lock(); settings->beginGroup("DefaultAutoProfiles"); QString exe; QString guid; @@ -370,6 +371,7 @@ void AutoProfileWatcher::syncProfileAssignment() } settings->endGroup(); + settings->getLock()->unlock(); } void AutoProfileWatcher::clearProfileAssignments() diff --git a/src/firstrunwizard/associateprofilespage.cpp b/src/firstrunwizard/associateprofilespage.cpp index 879ccc90..5a469362 100644 --- a/src/firstrunwizard/associateprofilespage.cpp +++ b/src/firstrunwizard/associateprofilespage.cpp @@ -41,6 +41,8 @@ bool AssociateProfilesPage::shouldDisplay(AntiMicroSettings *settings) { bool result = false; #if defined(Q_OS_WIN) && !defined(WIN_PORTABLE_PACKAGE) + settings->getLock()->lock(); + bool shouldAssociateProfiles = settings->value("AssociateProfiles", AntiMicroSettings::defaultAssociateProfiles).toBool(); @@ -48,6 +50,9 @@ bool AssociateProfilesPage::shouldDisplay(AntiMicroSettings *settings) { result = true; } + + settings->getLock()->unlock(); + #else Q_UNUSED(settings); #endif diff --git a/src/firstrunwizard/firstrunwizard.cpp b/src/firstrunwizard/firstrunwizard.cpp index 7e77e992..1e2b7fd3 100644 --- a/src/firstrunwizard/firstrunwizard.cpp +++ b/src/firstrunwizard/firstrunwizard.cpp @@ -143,11 +143,13 @@ bool FirstRunWizard::shouldDisplay(AntiMicroSettings *settings) result = result || AssociateProfilesPage::shouldDisplay(settings); #endif + settings->getLock()->lock(); // Only show wizard if no saved settings exist. if (settings->allKeys().size() == 0) { result = true; } + settings->getLock()->unlock(); return result; } diff --git a/src/firstrunwizard/mousesettingspage.cpp b/src/firstrunwizard/mousesettingspage.cpp index 61627c08..cb580912 100644 --- a/src/firstrunwizard/mousesettingspage.cpp +++ b/src/firstrunwizard/mousesettingspage.cpp @@ -128,10 +128,12 @@ bool MouseSettingsPage::shouldDisplay(AntiMicroSettings *settings) { bool result = false; // Only show page if no saved settings exist. + settings->getLock()->lock(); if (settings->allKeys().size() == 0) { result = true; } + settings->getLock()->unlock(); return result; } diff --git a/src/inputdaemon.cpp b/src/inputdaemon.cpp index ee76d3f9..2035b7d9 100644 --- a/src/inputdaemon.cpp +++ b/src/inputdaemon.cpp @@ -161,6 +161,7 @@ void InputDaemon::refreshJoysticks() #endif #ifdef USE_SDL_2 + settings->getLock()->lock(); settings->beginGroup("Mappings"); #endif @@ -206,6 +207,7 @@ void InputDaemon::refreshJoysticks() #ifdef USE_SDL_2 settings->endGroup(); + settings->getLock()->unlock(); #endif emit joysticksRefreshed(joysticks); @@ -393,6 +395,7 @@ void InputDaemon::addInputDevice(int index) if (!joysticks->contains(tempJoystickID)) { + settings->getLock()->lock(); settings->beginGroup("Mappings"); QString temp; @@ -419,6 +422,7 @@ void InputDaemon::addInputDevice(int index) trackcontrollers.insert(tempJoystickID, damncontroller); settings->endGroup(); + settings->getLock()->unlock(); emit deviceAdded(damncontroller); } @@ -426,6 +430,7 @@ void InputDaemon::addInputDevice(int index) else { settings->endGroup(); + settings->getLock()->unlock(); } } else @@ -435,6 +440,7 @@ void InputDaemon::addInputDevice(int index) trackjoysticks.insert(tempJoystickID, curJoystick); settings->endGroup(); + settings->getLock()->unlock(); emit deviceAdded(curJoystick); } diff --git a/src/joybutton.cpp b/src/joybutton.cpp index ff182c4a..25152b4c 100644 --- a/src/joybutton.cpp +++ b/src/joybutton.cpp @@ -1312,7 +1312,38 @@ void JoyButton::mouseEvent() unsigned int elapsedElapsed = accelExtraDurationTime.elapsed(); - double tempAccel = currentAccelMulti; + double intermediateTravel = qMin(maxtravel, fabs(getAccelerationDistance() - startingAccelerationDistance)); + + // Linear case + double currentAccelMultiTemp = (slope * intermediateTravel + intercept); + double elapsedDuration = accelDuration * + ((currentAccelMultiTemp - minfactor) / (extraAccelerationMultiplier - minfactor)); + + if (extraAccelCurve == EaseOutSineCurve) + { + double multiDiff = ((currentAccelMultiTemp - minfactor) / (extraAccelerationMultiplier - minfactor)); + double temp = sin(multiDiff * (PI/2.0)); + elapsedDuration = accelDuration * temp + 0; + currentAccelMultiTemp = (extraAccelerationMultiplier - minfactor) * sin(multiDiff * (PI/2.0)) + minfactor; + } + else if (extraAccelCurve == EaseOutQuadAccelCurve) + { + double getMultiDiff2 = ((currentAccelMultiTemp - minfactor) / (extraAccelerationMultiplier - minfactor)); + double temp = (getMultiDiff2 * (getMultiDiff2 - 2)); + elapsedDuration = -accelDuration * temp + 0; + currentAccelMultiTemp = -(extraAccelerationMultiplier - minfactor) * temp + minfactor; + } + else if (extraAccelCurve == EaseOutCubicAccelCurve) + { + double getMultiDiff = ((currentAccelMultiTemp - minfactor) / (extraAccelerationMultiplier - minfactor)) - 1; + double temp = ((getMultiDiff) * (getMultiDiff) * (getMultiDiff) + 1); + elapsedDuration = accelDuration * temp + 0; + currentAccelMultiTemp = (extraAccelerationMultiplier - minfactor) * temp + minfactor; + } + + double tempAccel = currentAccelMultiTemp; + + /*double tempAccel = currentAccelMulti; //double multiModifier = (maxtravel + fullIntermediateTravel) / maxtravel; double multiModifier = getAccelerationDistance() / startingAccelerationDistance; if (multiModifier >= 0.0 && multiModifier < 1.0) @@ -1320,19 +1351,16 @@ void JoyButton::mouseEvent() tempAccel = multiModifier * currentAccelMulti; } - //double elapsedDuration = accelDuration; double orgelapsedDuration = accelDuration * ((tempAccel - minfactor) / (extraAccelerationMultiplier - minfactor)); - - //double orgelapsedDuration = accelDuration * - // ((currentAccelMulti) / (extraAccelerationMultiplier)); + */ // Use easeOut to modify duration time used. //double multiDiff = ((currentAccelMulti - minfactor) / (extraAccelerationMultiplier - minfactor)); //double elapsedDuration = -accelDuration * (multiDiff) * (multiDiff - 2) + 0; //double elapsedDuration = accelDuration * sin(multiDiff * (PI/2.0)) + 0; - double elapsedDuration = orgelapsedDuration; + //double elapsedDuration = orgelapsedDuration; double elapsedDiff = 1.0; if (elapsedDuration > 0.0 && (elapsedElapsed * 0.001) < elapsedDuration) { @@ -1340,7 +1368,6 @@ void JoyButton::mouseEvent() elapsedDiff = (1.0 - tempAccel) * (elapsedDiff * elapsedDiff * elapsedDiff) + tempAccel; difference = elapsedDiff * difference; - //difference = currentAccelMulti * difference; // As acceleration is applied, do not update last // distance values when not necessary. diff --git a/src/mainsettingsdialog.cpp b/src/mainsettingsdialog.cpp index e53d583f..13ed7d0f 100644 --- a/src/mainsettingsdialog.cpp +++ b/src/mainsettingsdialog.cpp @@ -78,6 +78,8 @@ MainSettingsDialog::MainSettingsDialog(AntiMicroSettings *settings, fillControllerMappingsTable(); #endif + settings->getLock()->lock(); + QString defaultProfileDir = settings->value("DefaultProfileDir", "").toString(); int numberRecentProfiles = settings->value("NumberRecentProfiles", 5).toInt(); bool closeToTray = settings->value("CloseToTray", false).toBool(); @@ -325,6 +327,8 @@ MainSettingsDialog::MainSettingsDialog(AntiMicroSettings *settings, ui->extraInfoFrame->hide(); #endif + settings->getLock()->unlock(); + connect(ui->categoriesListWidget, SIGNAL(currentRowChanged(int)), ui->stackedWidget, SLOT(setCurrentIndex(int))); connect(ui->controllerMappingsTableWidget, SIGNAL(itemChanged(QTableWidgetItem*)), this, SLOT(mappingsTableItemChanged(QTableWidgetItem*))); connect(ui->mappingDeletePushButton, SIGNAL(clicked()), this, SLOT(deleteMappingRow())); @@ -379,6 +383,7 @@ void MainSettingsDialog::fillControllerMappingsTable() QHash > tempHash; + settings->getLock()->lock(); settings->beginGroup("Mappings"); QStringList mappings = settings->allKeys(); @@ -418,6 +423,7 @@ void MainSettingsDialog::fillControllerMappingsTable() } settings->endGroup(); + settings->getLock()->unlock(); QHashIterator > iter2(tempHash); int i = 0; @@ -510,6 +516,8 @@ void MainSettingsDialog::deleteMappingRow() void MainSettingsDialog::syncMappingSettings() { + settings->getLock()->lock(); + settings->beginGroup("Mappings"); settings->remove(""); @@ -532,6 +540,7 @@ void MainSettingsDialog::syncMappingSettings() } settings->endGroup(); + settings->getLock()->unlock(); } void MainSettingsDialog::saveNewSettings() @@ -540,6 +549,7 @@ void MainSettingsDialog::saveNewSettings() syncMappingSettings(); #endif + settings->getLock()->lock(); QString oldProfileDir = settings->value("DefaultProfileDir", "").toString(); QString possibleProfileDir = ui->profileDefaultDirLineEdit->text(); bool closeToTray = ui->closeToTrayCheckBox->isChecked(); @@ -567,6 +577,7 @@ void MainSettingsDialog::saveNewSettings() { settings->remove("CloseToTray"); } + settings->getLock()->unlock(); checkLocaleChange(); #ifdef Q_OS_UNIX @@ -584,6 +595,7 @@ void MainSettingsDialog::saveNewSettings() saveAutoProfileSettings(); #endif + settings->getLock()->lock(); #ifdef Q_OS_WIN QSettings autoRunReg(RUNATSTARTUPKEY, QSettings::NativeFormat); QString autoRunEntry = autoRunReg.value("antimicro", "").toString(); @@ -729,6 +741,7 @@ void MainSettingsDialog::saveNewSettings() PadderCommon::unlockInputDevices(); settings->sync(); + settings->getLock()->unlock(); } void MainSettingsDialog::selectDefaultProfileDir() @@ -743,6 +756,7 @@ void MainSettingsDialog::selectDefaultProfileDir() void MainSettingsDialog::checkLocaleChange() { + settings->getLock()->lock(); int row = ui->localeListWidget->currentRow(); if (row == 0) { @@ -751,6 +765,7 @@ void MainSettingsDialog::checkLocaleChange() settings->remove("Language"); } + settings->getLock()->unlock(); emit changeLanguage(QLocale::system().name()); } else @@ -791,6 +806,7 @@ void MainSettingsDialog::checkLocaleChange() settings->setValue("Language", newLocale); + settings->getLock()->unlock(); emit changeLanguage(newLocale); } } @@ -1140,7 +1156,7 @@ void MainSettingsDialog::changeDeviceForProfileTable(int index) void MainSettingsDialog::saveAutoProfileSettings() { - + settings->getLock()->lock(); settings->beginGroup("DefaultAutoProfiles"); QStringList defaultkeys = settings->allKeys(); settings->endGroup(); @@ -1229,6 +1245,7 @@ void MainSettingsDialog::saveAutoProfileSettings() i++; } settings->endGroup(); + settings->getLock()->unlock(); } void MainSettingsDialog::fillAllAutoProfilesTable() diff --git a/src/sdleventreader.cpp b/src/sdleventreader.cpp index 205da44a..07ebf136 100644 --- a/src/sdleventreader.cpp +++ b/src/sdleventreader.cpp @@ -30,8 +30,10 @@ SDLEventReader::SDLEventReader(QMap *joysticks, { this->joysticks = joysticks; this->settings = settings; + settings->getLock()->lock(); this->pollRate = settings->value("GamepadPollRate", AntiMicroSettings::defaultSDLGamepadPollRate).toUInt(); + settings->getLock()->unlock(); pollRateTimer.setParent(this); #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) @@ -65,6 +67,7 @@ void SDLEventReader::initSDL() #ifdef USE_SDL_2 //QSettings settings(PadderCommon::configFilePath, QSettings::IniFormat); + settings->getLock()->lock(); settings->beginGroup("Mappings"); QStringList mappings = settings->allKeys(); QStringListIterator iter(mappings); @@ -81,6 +84,7 @@ void SDLEventReader::initSDL() } settings->endGroup(); + settings->getLock()->unlock(); //SDL_GameControllerAddMapping("03000000100800000100000010010000,Twin USB Joystick,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftshoulder:b6,rightshoulder:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2"); #endif @@ -119,19 +123,6 @@ void SDLEventReader::performWork() //int status = SDL_WaitEvent(NULL); int status = CheckForEvents(); - /*PadderCommon::editingLock.lockForRead(); - bool isEditing = PadderCommon::editingBindings; - PadderCommon::editingLock.unlock(); - - if (isEditing) - { - QMutex *dismutex = &PadderCommon::waitMutex; - dismutex->lock(); - PadderCommon::waitThisOut.wakeAll(); - dismutex->unlock(); - } - */ - if (status) { pollRateTimer.stop(); @@ -199,41 +190,38 @@ int SDLEventReader::CheckForEvents() true, true); */ - //while (!exit) - //{ - SDL_PumpEvents(); - switch (SDL_PeepEvents(NULL, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT)) + SDL_PumpEvents(); + switch (SDL_PeepEvents(NULL, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT)) + { + case -1: { - case -1: - { - result = 0; - exit = true; - break; - } - case 1: - { - /*Logger::LogInfo( - QString("Gamepad Poll %1").arg( - QTime::currentTime().toString("hh:mm:ss.zzz")), - true, true); - */ - - result = 1; - exit = true; - break; - } - case 0: - { - if (!pollRateTimer.isActive()) - { - pollRateTimer.start(); - } - //exit = true; - //SDL_Delay(10); - break; - } + result = 0; + exit = true; + break; } - //} + case 1: + { + /*Logger::LogInfo( + QString("Gamepad Poll %1").arg( + QTime::currentTime().toString("hh:mm:ss.zzz")), + true, true); + */ + + result = 1; + exit = true; + break; + } + case 0: + { + if (!pollRateTimer.isActive()) + { + pollRateTimer.start(); + } + //exit = true; + //SDL_Delay(10); + break; + } + } return result; }