diff options
Diffstat (limited to 'src/microsettings.cpp')
-rw-r--r-- | src/microsettings.cpp | 338 |
1 files changed, 338 insertions, 0 deletions
diff --git a/src/microsettings.cpp b/src/microsettings.cpp new file mode 100644 index 0000000..4554dc9 --- /dev/null +++ b/src/microsettings.cpp @@ -0,0 +1,338 @@ +/*************************************************************************** + * Copyright (C) 2003-2005 by David Saxton * + * [email protected] * + * * + * 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 "itemdocumentdata.h" +#include "microinfo.h" +#include "micropackage.h" +#include "pinmapping.h" + + +//BEGIN class VariableInfo +VariableInfo::VariableInfo() +{ + type = MicroSettings::vt_unknown; + value = QVariant(0); + initAtStart = false; + permanent = false; +} + +void VariableInfo::setValue( const QVariant & _value ) +{ + value = _value; +} + +QString VariableInfo::valueAsString() const +{ + if ( value.canCast(QVariant::String) ) return value.toString(); + if ( value.canCast(QVariant::Int) ) return QString::number(value.toInt()); + return "0"; +} +//END class VariableInfo + + + +//BEGIN class PinSettings +PinSettings::PinSettings() + : QObject() +{ + m_type = PinSettings::pt_input; + m_state = PinSettings::ps_off; + m_id = "pin"; +} + +PinSettings::PinSettings( PinSettings::pin_type _type, PinSettings::pin_state _state, const QString &id, const QString &port ) +{ + m_type = _type; + m_state = _state; + m_id = id; + m_port = port; +} + + +void PinSettings::setType( PinSettings::pin_type type ) +{ + if ( m_type == type ) + return; + m_type = type; + emit settingsChanged(); +} + + +void PinSettings::setState( PinSettings::pin_state state ) +{ + if ( m_state == state) + return; + m_state = state; + emit settingsChanged(); +} +//END class PinSettings + + + +//BEGIN class MicroSettings +MicroSettings::MicroSettings( MicroInfo * microInfo ) +{ + _microInfo = microInfo; + + QStringList portNames = _microInfo->package()->portNames(); + const QStringList::iterator portNamesEnd = portNames.end(); + for ( QStringList::iterator it = portNames.begin(); it != portNamesEnd; ++it ) + { + PinSettingsList portPins; + QStringList pinIDs; + pinIDs = _microInfo->package()->pinIDs( PicPin::type_bidir | PicPin::type_open, *it ); + pinIDs.sort(); + const int numPins = pinIDs.size(); + for ( int i=0; i<numPins; i++ ) + { + PinSettings *pinSettings = new PinSettings( PinSettings::pt_input, PinSettings::ps_off, pinIDs[i], *it ); + m_pinSettingsList.append(pinSettings); + portPins.append(pinSettings); + } + m_ports[*it] = portPins; + } +} + +MicroSettings::~MicroSettings() +{ + const PinSettingsList::iterator pinListEnd = m_pinSettingsList.end(); + for ( PinSettingsList::iterator it = m_pinSettingsList.begin(); it != pinListEnd; ++it ) + { + delete *it; + } +// delete m_variableList; +} + +void MicroSettings::setPinType( const QString &id, PinSettings::pin_type type ) +{ + PinSettings *pin = pinWithID(id); + if (pin) pin->setType(type); +} + +void MicroSettings::setPinState( const QString &id, PinSettings::pin_state state ) +{ + PinSettings *pin = pinWithID(id); + if (pin) + pin->setState(state); +} + + +PinSettings* MicroSettings::pinWithID( const QString &id ) +{ + const PinSettingsList::iterator pinListEnd = m_pinSettingsList.end(); + for ( PinSettingsList::iterator it = m_pinSettingsList.begin(); it != pinListEnd; ++it ) + { + if ( (*it)->id() == id ) return *it; + } + return 0L; +} + +int MicroSettings::portState( const QString &port ) +{ + if ( microInfo()->package()->portNames().findIndex(port) == -1 ) return -1; + + int pinPower = 1; + int num = 0; + + const PinSettingsList::iterator pinListEnd = m_pinSettingsList.end(); + for ( PinSettingsList::iterator it = m_pinSettingsList.begin(); it != pinListEnd; ++it ) + { + if ( (*it)->port() == port ) + { + if ( (*it)->state() == PinSettings::ps_on ) num += pinPower; +// cout << "(*it)->state()="<<(*it)->state()<<endl; + pinPower *= 2; + } + } + + return num; +} + +int MicroSettings::portType( const QString &port ) +{ + if ( microInfo()->package()->portNames().findIndex(port) == -1 ) return -1; + + int pinPower = 1; + int num = 0; + + const PinSettingsList::iterator pinListEnd = m_pinSettingsList.end(); + for ( PinSettingsList::iterator it = m_pinSettingsList.begin(); it != pinListEnd; ++it ) + { + if ( (*it)->port() == port ) + { + if ( (*it)->type() == PinSettings::pt_input ) num += pinPower; + pinPower *= 2; + } + } + + return num; +} + +void MicroSettings::setPortState( const QString &port, int state ) +{ + PortList::iterator plit = m_ports.find(port); + if ( plit == m_ports.end() ) return; + + const PinSettingsList::iterator plitEnd = plit.data().end(); + for ( PinSettingsList::iterator it = plit.data().begin(); it != plitEnd; ++it ) + { +// cout << "state="<<state<<endl; + (*it)->setState( (state%2 == 1) ? PinSettings::ps_on : PinSettings::ps_off ); +// cout << "(*it)->state()="<<(*it)->state()<<endl; + state /= 2; + } +} + +void MicroSettings::setPortType( const QString &port, int type ) +{ + PortList::iterator plit = m_ports.find(port); + if ( plit == m_ports.end() ) return; + + const PinSettingsList::iterator plitEnd = plit.data().end(); + for ( PinSettingsList::iterator it = plit.data().begin(); it != plitEnd; ++it ) + { + (*it)->setType( (type%2 == 1) ? PinSettings::pt_input : PinSettings::pt_output ); + type /= 2; + } +} + + +MicroData MicroSettings::microData() const +{ + MicroData data; + data.id = microInfo()->id(); + data.pinMappings = pinMappings(); + + const PinSettingsList::const_iterator pinListEnd = m_pinSettingsList.end(); + for ( PinSettingsList::const_iterator it = m_pinSettingsList.begin(); it != pinListEnd; ++it ) + { + data.pinMap[(*it)->id()].type = (*it)->type(); + data.pinMap[(*it)->id()].state= (*it)->state(); + } + + const VariableMap::const_iterator variableMapEnd = m_variableMap.end(); + for ( VariableMap::const_iterator it = m_variableMap.begin(); it != variableMapEnd; ++it ) + { + if ( it.data().permanent ) + data.variableMap[it.key()] = it.data().valueAsString(); + } + + return data; +} + + +void MicroSettings::restoreFromMicroData( const MicroData µData ) +{ + setPinMappings( microData.pinMappings ); + + const PinDataMap::const_iterator pinMapEnd = microData.pinMap.end(); + for ( PinDataMap::const_iterator it = microData.pinMap.begin(); it != pinMapEnd; ++it ) + { + PinSettings *pin = pinWithID(it.key()); + if (pin) + { + pin->setState( it.data().state ); + pin->setType( it.data().type ); + } + } + + const QStringMap::const_iterator variableMapEnd = microData.variableMap.end(); + for ( QStringMap::const_iterator it = microData.variableMap.begin(); it != variableMapEnd; ++it ) + { + setVariable( it.key(), it.data(), true ); + } +} + + +void MicroSettings::setVariable( const QString &name, QVariant value, bool permanent ) +{ + if ( name.isNull() ) return; + VariableMap::iterator it = m_variableMap.find(name); + if ( it != m_variableMap.end() ) + { + it.data().setValue(value); + it.data().permanent = permanent; + it.data().initAtStart = permanent; + } + else + { + VariableInfo info; + info.setValue(value); + info.permanent = permanent; + info.initAtStart = permanent; + m_variableMap[name] = info; + } +} + + +QStringList MicroSettings::variableNames() +{ + QStringList list; + const VariableMap::iterator variableMapEnd = m_variableMap.end(); + for ( VariableMap::iterator it = m_variableMap.begin(); it != variableMapEnd; ++it ) + { + list += it.key(); + } + return list; +} + + +VariableInfo* MicroSettings::variableInfo( const QString &name ) +{ + if ( name.isNull() ) return 0l; + VariableMap::iterator it = m_variableMap.find(name); + if ( it != m_variableMap.end() ) { + return &(it.data()); + } else { + return 0l; + } +} + + +bool MicroSettings::deleteVariable( const QString &name ) +{ + if ( name.isNull() ) return false; + VariableMap::iterator it = m_variableMap.find(name); + if ( it != m_variableMap.end() ) + { + m_variableMap.erase(it); + return true; + } else { + return false; + } +} + + +void MicroSettings::removeAllVariables() +{ + m_variableMap.clear(); +} + + +PinMapping MicroSettings::pinMapping( const QString & id ) const +{ + return m_pinMappings[id]; +} + + +void MicroSettings::setPinMappings( const PinMappingMap & pinMappings ) +{ + m_pinMappings = pinMappings; + emit pinMappingsChanged(); +} + + +PinMappingMap MicroSettings::pinMappings() const +{ + return m_pinMappings; +} +//END class MicroSettings + + |