You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
piklab/src/progs/gui/prog_group_ui.cpp

183 lines
7.3 KiB

/***************************************************************************
* Copyright (C) 2006 Nicolas Hadacek <hadacek@kde.org> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
#include "prog_group_ui.h"
#include <tdelocale.h>
#include <tdeaction.h>
#include <kiconloader.h>
#include "common/common/misc.h"
#include "common/global/purl.h"
#include "common/gui/purl_gui.h"
#include "progs/base/generic_prog.h"
#include "progs/base/prog_group.h"
#include "progs/base/prog_config.h"
#include "libgui/main_global.h"
#include "libgui/toplevel.h"
#include "devices/base/device_group.h"
#include "devices/pic/prog/pic_prog.h"
//----------------------------------------------------------------------------
Programmer::StandaloneMemoryCalibrationEditor::StandaloneMemoryCalibrationEditor(const Pic::Memory &memory, TQWidget *parent)
: Pic::MemoryCalibrationEditor(0, const_cast<Pic::Memory &>(memory), parent)
{}
void Programmer::StandaloneMemoryCalibrationEditor::init(bool first)
{
Pic::MemoryCalibrationEditor::init(first);
TDEAction *action = new TDEAction(i18n("Read"), "reload", 0, this, TQ_SIGNAL(updateCalibration()), Main::toplevel().actionCollection());
addAction(action);
action = new TDEAction(i18n("Regenerating..."), 0, 0, this, TQ_SIGNAL(regenerate()), Main::toplevel().actionCollection());
addAction(action);
}
//----------------------------------------------------------------------------
Programmer::ButtonContainer::ButtonContainer(const TQString &title,
TQObject *receiver, const char *updateSlot, TQWidget *parent)
: ::ButtonContainer(title, parent)
{
if (receiver) button().appendAction(i18n("Read"), "reload", receiver, updateSlot);
}
//----------------------------------------------------------------------------
Programmer::AdvancedDialog::AdvancedDialog(Base &base, TQWidget *parent, const char *name)
: Dialog(IconList, i18n("Advanced Dialog"), Close, Close, parent, name, true, false),
_base(base), _calEditor(0)
{
// programmer
TDEIconLoader loader;
TQPixmap pixmap = loader.loadIcon("piklab_burnchip", TDEIcon::Toolbar, TDEIcon::SizeMedium);
TQFrame *page = addPage(i18n("Programmer"), _base.group().label(), pixmap);
TQVBoxLayout *vbox = new TQVBoxLayout(page);
_programmerContainer = new Container(page);
vbox->addWidget(_programmerContainer);
Properties properties = _base.group().properties();
uint row = _programmerContainer->numRows();
if ( properties & HasFirmware ) {
_firmwareContainer = new ButtonContainer(i18n("Firmware"), this, TQ_SLOT(updateFirmware()), _programmerContainer);
_programmerContainer->addWidget(_firmwareContainer, row,row, 0,1);
if ( _base.group().properties() & CanUploadFirmware )
_firmwareContainer->button().appendAction(i18n("Uploading..."), "piklab_burnchip", this, TQ_SLOT(uploadFirmware()));
TQLabel *label = new TQLabel(i18n("Version:"), _firmwareContainer);
_firmwareContainer->addWidget(label, 1,1, 0,0);
_firmwareLabel = new TQLabel(_firmwareContainer);
_firmwareContainer->addWidget(_firmwareLabel, 1,1, 1,1);
row++;
} else {
_firmwareContainer = 0;
_firmwareLabel = 0;
}
if ( _base.group().canReadVoltages() ) {
_voltagesContainer = new ButtonContainer(i18n("Voltages"), this, TQ_SLOT(updateVoltages()), _programmerContainer);
_programmerContainer->addWidget(_voltagesContainer, row,row, 0,1);
row++;
} else _voltagesContainer = 0;
if ( properties & HasSelfTest ) {
_selfTestContainer = new ButtonContainer(i18n("Self-test"), this, TQ_SLOT(updateSelfTest()), _programmerContainer);
_programmerContainer->addWidget(_selfTestContainer, row,row, 0,1);
row++;
} else _selfTestContainer = 0;
// calibration
pixmap = loader.loadIcon("configure", TDEIcon::Toolbar, TDEIcon::SizeMedium);
page = addPage(i18n("Calibration"), i18n("Calibration"), pixmap);
vbox = new TQVBoxLayout(page);
_calibrationContainer = new Container(page);
vbox->addWidget(_calibrationContainer);
const Device::Data *data = Main::deviceData();
TQString s;
if ( data==0 ) s = i18n("No device selected.");
else if ( data->group().name()!="pic" || !static_cast<const Pic::Data *>(data)->isReadable(Pic::MemoryRangeType::Cal) )
s = i18n("This device has no calibration information.");
else if ( !_base.group().isSupported(data->name()) ) s = i18n("The selected device is not supported by this programmer.");
else {
const ::Programmer::PicBase &pbase = static_cast<const ::Programmer::PicBase &>(_base);
_calEditor = new StandaloneMemoryCalibrationEditor(pbase.deviceMemory(), _calibrationContainer);
connect(_calEditor, TQ_SIGNAL(updateCalibration()), TQ_SLOT(updateCalibration()));
connect(_calEditor, TQ_SIGNAL(regenerate()), TQ_SLOT(regenerateCalibration()));
_calEditor->init(true);
_calEditor->setReadOnly(true);
_calibrationContainer->addWidget(_calEditor, 0,0, 0,0);
}
if ( !s.isEmpty() ) {
TQLabel *label = new TQLabel(s, _calibrationContainer);
_calibrationContainer->addWidget(label, 0,0, 0,0);
}
}
bool Programmer::AdvancedDialog::connectProgrammer()
{
_base.disconnectHardware();
if ( !_base.connectHardware() ) {
MessageBox::sorry(i18n("Could not connect programmer."), Log::Show);
return false;
}
return true;
}
bool Programmer::AdvancedDialog::ensureConnected()
{
if ( (_base.state()==NotConnected || _base.state()==Running) && !connectProgrammer() ) return false;
return _base.setTargetPowerOn(!readConfigEntry(Config::TargetSelfPowered).toBool());
}
void Programmer::AdvancedDialog::updateFirmware()
{
::PBusyCursor bc;
if ( ensureConnected() ) _base.readFirmwareVersion();
updateDisplay();
}
void Programmer::AdvancedDialog::uploadFirmware()
{
PURL::Url url = PURL::getOpenUrl(":open_firmware", PURL::filter(PURL::Hex), this ,i18n("Open Firmware"));
if ( url.isEmpty() ) return;
::PBusyCursor bc;
if ( !connectProgrammer() ) return;
if ( _base.uploadFirmware(url) )
MessageBox::information(i18n("Firmware uploaded successfully."), Log::Show);
else MessageBox::sorry(i18n("Error uploading firmware."), Log::Show);
updateFirmware();
}
void Programmer::AdvancedDialog::updateVoltages()
{
::PBusyCursor bc;
if ( ensureConnected() ) _base.readVoltages();
updateDisplay();
}
void Programmer::AdvancedDialog::updateSelfTest()
{
::PBusyCursor bc;
if ( ensureConnected() ) _base.selfTest(false);
updateDisplay();
}
void Programmer::AdvancedDialog::updateCalibration()
{
::PBusyCursor bc;
if ( ensureConnected() ) static_cast< ::Programmer::PicBase &>(_base).readCalibration();
updateDisplay();
}
void Programmer::AdvancedDialog::regenerateCalibration()
{
MessageBox::sorry(i18n("Oscillator calibration regeneration is not available with the selected programmer."), Log::Show);
}
void Programmer::AdvancedDialog::updateDisplay()
{
if (_firmwareLabel) _firmwareLabel->setText(_base.firmwareVersion().pretty());
if (_calEditor) _calEditor->updateDisplay();
}