view SettingsDialog.cpp @ 3:4ace58a7c03c

Send disconnect command before closing the connection The old BT module transmitted a notification in case a connection were closed which cause the ostc to exit the uart loop. The new one doesn't do this => send disconnect command to avoid waiting in the installation loop till timeout or button press.
author Ideenmodellierer
date Fri, 28 Nov 2025 20:00:02 +0100
parents 0b3630a29ad8
children
line wrap: on
line source

//////////////////////////////////////////////////////////////////////////////
/// \file   SettingsDialog.cpp
/// \brief  Preference dialog for OSTC Companion.
/// \author JD Gascuel.
///
/// \copyright (c) 2011-2014 JD Gascuel. All rights reserved.
/// $Id$
//////////////////////////////////////////////////////////////////////////////
//
// BSD 2-Clause License:
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
//    this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
//    this list of conditions and the following disclaimer in the documentation
//    and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
// THE POSSIBILITY OF SUCH DAMAGE.
//
//////////////////////////////////////////////////////////////////////////////

#include "SettingsDialog.h"
#include "ui_Settings.h"

#include "MainWindow.h"     // Needed to propagare retranslate()

#include "Utils/Log.h"

#include <QApplication>
#include <QDialogButtonBox>
#include <QDir>
#include <QLibraryInfo>
#include <QPushButton>
#include <QSettings>
#include <QTranslator>

#ifdef Q_OS_WIN
#   define NOMINMAX 1
#   include <Windows.h>
#   undef NOMINMAX
#endif

#include "Export.h"
#include "HardwareOperations.h"

QString EXPORT Settings::language = "";
QString EXPORT Settings::port = "";
QString EXPORT Settings::currentPath = "";

bool EXPORT Settings::autoSetDateTime = true;

bool EXPORT Settings::forceFirmwareUpdate = false;
bool EXPORT Settings::forceRTEUpdate = false;
bool EXPORT Settings::forceFontlibUpdate = false;

bool EXPORT Settings::useFastMode = false;

extern QSettings* settings;

//////////////////////////////////////////////////////////////////////////////

Settings::Settings(QWidget* parent, HardwareOperations *op)
  : QDialog(parent),
    _ui(new Ui::Settings),
    _op(op)
{
    _ui->setupUi(this);
    reload(this);
}

Settings::~Settings()
{
    delete _ui;
}

//////////////////////////////////////////////////////////////////////////////

void Settings::reload(Settings* dialog)
{
    //---- Restore options from settings -------------------------------------
    language        = settings->value("Interface/lang",
                        QLocale::system().name().right(2) ).toString();
    port            = settings->value("OSTC/port", "").toString();
    currentPath     = settings->value("OSTC/currentPath", "").toString();
    autoSetDateTime = settings->value("OSTC/autoSetDateTime", true).toBool();
    forceFirmwareUpdate = settings->value("OSTC/forceFirmwareUpdate", false).toBool();
    forceRTEUpdate = settings->value("OSTC/forceRTEUpdate", false).toBool();
    forceFontlibUpdate = settings->value("OSTC/forceFontlibUpdate", false).toBool();

    useFastMode = settings->value("OSTC/useFastMode", false).toBool();

    setLanguage();

    if( !dialog )
        return;

    //---- Update interface --------------------------------------------------
    if( language == "DE" ) dialog->_ui->languageMenu->setCurrentIndex(0);
    if( language == "EN" ) dialog->_ui->languageMenu->setCurrentIndex(1);
    if( language == "ES" ) dialog->_ui->languageMenu->setCurrentIndex(2);
    if( language == "FR" ) dialog->_ui->languageMenu->setCurrentIndex(3);
    if( language == "IT" ) dialog->_ui->languageMenu->setCurrentIndex(4);
    if( language == "RU" ) dialog->_ui->languageMenu->setCurrentIndex(5);

    dialog->updatePortsSlot();

    dialog->_ui->autoSetDateTimeCB->setChecked( autoSetDateTime );
    dialog->_ui->forceFirmwareUpdate->setChecked( forceFirmwareUpdate );
    dialog->_ui->forceRTEUpdate->setChecked( forceRTEUpdate );
    dialog->_ui->forceFontlibUpdate->setChecked( forceFontlibUpdate );
    dialog->_ui->useFastMode->setChecked( useFastMode );

}

//////////////////////////////////////////////////////////////////////////////

void Settings::languageSlot(int i)
{
    switch(i) {
        case 0: language = "DE"; break;
        case 1: language = "EN"; break;
        case 2: language = "ES"; break;
        case 3: language = "FR"; break;
        case 4: language = "IT"; break;
        case 5: language = "RU"; break;
    }
    setLanguage();
}


void Settings::updatePortsSlot()
{
    //---- search for possible ports ----------------------------------------
    QStringList list;
    if( _op ) { // Known driver type ?
        list = _op->listPorts();

#ifndef Q_OS_LINUX
        if( list.isEmpty() )
            _ui->noPortLabel->setText(
                QString("<font color='red'>%1</font>: %2 - %3")
                    .arg(tr("Warning"))
                    .arg(tr("no port", "USB connection to OSTC not found"))
                    .arg(tr("Did you installed the %1 driver ?")
#ifdef Q_OS_WIN
                        .arg("<a href='http://www.ftdichip.com/Drivers/CDM/CDM%20v2.12.00%20WHQL%20Certified.zip'>FTDI VCP</a>")));
#elif defined(Q_OS_MACX)
                        .arg("<a href='http://www.ftdichip.com/drivers/VCP/MacOSX/FTDIUSBSerialDriver_v2_2_18.dmg'>FTDI VCP</a>")));
#else
                        .arg("USB")));
#endif
        else
#endif
            _ui->noPortLabel->clear();
    }

    QString myPort =  port + " (current)";
    if( ! port.isEmpty() )
        list += myPort;
    list.sort();

    _ui->portMenu->clear();
    _ui->portMenu->addItems(list);
    _ui->portMenu->setCurrentText( port.isEmpty() ? "" : myPort );
}

//////////////////////////////////////////////////////////////////////////////

void Settings::setLanguage()
{
    static QTranslator myappTranslator;
    if( myappTranslator.load(":/Translations/companion_" + language) )
        qApp->installTranslator(&myappTranslator);
}

void Settings::changeEvent(QEvent *e)
{
    if( e->type() == QEvent::LanguageChange )
    {
        _ui->retranslateUi(this);

        // FIX: also update the warning text...
        updatePortsSlot();

        // FIX: propagate to main windows.
        if( MainWindow* main = dynamic_cast<MainWindow*>(parent()) )
            main->retranslate();
    }
}

//////////////////////////////////////////////////////////////////////////////

void Settings::accept()
{
    port = _ui->portMenu->currentText().section(" ", 0, 0);
    autoSetDateTime = _ui->autoSetDateTimeCB->isChecked();
    forceFirmwareUpdate = _ui->forceFirmwareUpdate->isChecked();
    forceRTEUpdate = _ui->forceRTEUpdate->isChecked();
    forceFontlibUpdate = _ui->forceFontlibUpdate->isChecked();

    useFastMode = _ui->useFastMode->isChecked();
    save();
    QDialog::accept();
}

void Settings::save()
{
    settings->setValue("Interface/lang",       language);
    settings->setValue("OSTC/port",            port);
    settings->setValue("OSTC/currentPath",     currentPath);
    settings->setValue("OSTC/autoSetDateTime", autoSetDateTime);
    settings->setValue("OSTC/forceFirmwareUpdate", forceFirmwareUpdate);
    settings->setValue("OSTC/forceRTEUpdate", forceRTEUpdate);
    settings->setValue("OSTC/forceFontlibUpdate", forceFontlibUpdate);
    settings->setValue("OSTC/useFastMode", useFastMode);
    settings->sync();
}

//////////////////////////////////////////////////////////////////////////////

void Settings::reject()
{
    reload(this);
    if( MainWindow* main = dynamic_cast<MainWindow*>(parent()) )
        main->retranslate();
    QDialog::reject();
}

//////////////////////////////////////////////////////////////////////////////

void Settings::resetSettingsSlot()
{
    //---- Clear everything -------------------------------------------------
    settings->clear();
    settings->sync();
    //---- Set defaults
    reload(this);
    //---- Search connected ports
    updatePortsSlot();
}