microsettings.cpp

00001 /***************************************************************************
00002  *   Copyright (C) 2003-2005 by David Saxton                               *
00003  *   david@bluehaze.org                                                    *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  ***************************************************************************/
00010 
00011 #include "itemdocumentdata.h"
00012 #include "microinfo.h"
00013 #include "micropackage.h"
00014 #include "pinmapping.h"
00015 
00016 
00017 //BEGIN class VariableInfo
00018 VariableInfo::VariableInfo()
00019 {
00020         type = MicroSettings::vt_unknown;
00021         value = QVariant(0);
00022         initAtStart = false;
00023         permanent = false;
00024 }
00025 
00026 void VariableInfo::setValue( const QVariant & _value )
00027 {
00028         value = _value;
00029 }
00030 
00031 QString VariableInfo::valueAsString() const
00032 {
00033         if ( value.canCast(QVariant::String) ) return value.toString();
00034         if ( value.canCast(QVariant::Int) ) return QString::number(value.toInt());
00035         return "0";
00036 }
00037 //END class VariableInfo
00038 
00039 
00040 
00041 //BEGIN class PinSettings
00042 PinSettings::PinSettings()
00043         : QObject()
00044 {
00045         m_type = PinSettings::pt_input;
00046         m_state = PinSettings::ps_off;
00047         m_id = "pin";
00048 }
00049 
00050 PinSettings::PinSettings( PinSettings::pin_type _type, PinSettings::pin_state _state, const QString &id, const QString &port )
00051 {
00052         m_type = _type;
00053         m_state = _state;
00054         m_id = id;
00055         m_port = port;
00056 }
00057 
00058 
00059 void PinSettings::setType( PinSettings::pin_type type )
00060 {
00061         if ( m_type == type )
00062                 return;
00063         m_type = type;
00064         emit settingsChanged();
00065 }
00066 
00067 
00068 void PinSettings::setState( PinSettings::pin_state state )
00069 {
00070         if ( m_state == state)
00071                 return;
00072         m_state = state;
00073         emit settingsChanged();
00074 }
00075 //END class PinSettings
00076 
00077 
00078 
00079 //BEGIN class MicroSettings
00080 MicroSettings::MicroSettings( MicroInfo * microInfo )
00081 {
00082         _microInfo = microInfo;
00083         
00084         QStringList portNames = _microInfo->package()->portNames();
00085         const QStringList::iterator portNamesEnd = portNames.end();
00086         for ( QStringList::iterator it = portNames.begin(); it != portNamesEnd; ++it )
00087         {
00088                 PinSettingsList portPins;
00089                 QStringList pinIDs;
00090                 pinIDs = _microInfo->package()->pinIDs( PicPin::type_bidir | PicPin::type_open, *it );
00091                 pinIDs.sort();
00092                 const int numPins = pinIDs.size();
00093                 for ( int i=0; i<numPins; i++ )
00094                 {
00095                         PinSettings *pinSettings = new PinSettings( PinSettings::pt_input, PinSettings::ps_off, pinIDs[i], *it ); 
00096                         m_pinSettingsList.append(pinSettings);
00097                         portPins.append(pinSettings);
00098                 }
00099                 m_ports[*it] = portPins;
00100         }
00101 }
00102 
00103 MicroSettings::~MicroSettings()
00104 {
00105         const PinSettingsList::iterator pinListEnd = m_pinSettingsList.end();
00106         for ( PinSettingsList::iterator it = m_pinSettingsList.begin(); it != pinListEnd; ++it )
00107         {
00108                 delete *it;
00109         }
00110 //      delete m_variableList;
00111 }
00112 
00113 void MicroSettings::setPinType( const QString &id, PinSettings::pin_type type )
00114 {
00115         PinSettings *pin = pinWithID(id);
00116         if (pin) pin->setType(type);
00117 }
00118 
00119 void MicroSettings::setPinState( const QString &id, PinSettings::pin_state state )
00120 {
00121         PinSettings *pin = pinWithID(id);
00122         if (pin)
00123                 pin->setState(state);
00124 }
00125 
00126 
00127 PinSettings* MicroSettings::pinWithID( const QString &id )
00128 {
00129         const PinSettingsList::iterator pinListEnd = m_pinSettingsList.end();
00130         for ( PinSettingsList::iterator it = m_pinSettingsList.begin(); it != pinListEnd; ++it )
00131         {
00132                 if ( (*it)->id() == id ) return *it;
00133         }
00134         return 0;
00135 }
00136 
00137 int MicroSettings::portState( const QString &port )
00138 {
00139         if ( microInfo()->package()->portNames().findIndex(port) == -1 ) return -1;
00140         
00141         int pinPower = 1;
00142         int num = 0;
00143         
00144         const PinSettingsList::iterator pinListEnd = m_pinSettingsList.end();
00145         for ( PinSettingsList::iterator it = m_pinSettingsList.begin(); it != pinListEnd; ++it )
00146         {
00147                 if ( (*it)->port() == port )
00148                 {
00149                         if ( (*it)->state() == PinSettings::ps_on ) num += pinPower;
00150 //                      cout << "(*it)->state()="<<(*it)->state()<<endl;
00151                         pinPower *= 2;
00152                 }
00153         }
00154         
00155         return num;
00156 }
00157 
00158 int MicroSettings::portType( const QString &port )
00159 {
00160         if ( microInfo()->package()->portNames().findIndex(port) == -1 ) return -1;
00161         
00162         int pinPower = 1;
00163         int num = 0;
00164         
00165         const PinSettingsList::iterator pinListEnd = m_pinSettingsList.end();
00166         for ( PinSettingsList::iterator it = m_pinSettingsList.begin(); it != pinListEnd; ++it )
00167         {
00168                 if ( (*it)->port() == port )
00169                 {
00170                         if ( (*it)->type() == PinSettings::pt_input ) num += pinPower;
00171                         pinPower *= 2;
00172                 }
00173         }
00174         
00175         return num;
00176 }
00177 
00178 void MicroSettings::setPortState( const QString &port, int state )
00179 {
00180         PortList::iterator plit = m_ports.find(port);
00181         if ( plit == m_ports.end() ) return;
00182         
00183         const PinSettingsList::iterator plitEnd = plit.data().end();
00184         for ( PinSettingsList::iterator it = plit.data().begin(); it != plitEnd; ++it )
00185         {
00186 //              cout << "state="<<state<<endl;
00187                 (*it)->setState( (state%2 == 1) ? PinSettings::ps_on : PinSettings::ps_off );
00188 //              cout << "(*it)->state()="<<(*it)->state()<<endl;
00189                 state /= 2;
00190         }
00191 }
00192 
00193 void MicroSettings::setPortType( const QString &port, int type )
00194 {
00195         PortList::iterator plit = m_ports.find(port);
00196         if ( plit == m_ports.end() ) return;
00197         
00198         const PinSettingsList::iterator plitEnd = plit.data().end();
00199         for ( PinSettingsList::iterator it = plit.data().begin(); it != plitEnd; ++it )
00200         {
00201                 (*it)->setType( (type%2 == 1) ? PinSettings::pt_input : PinSettings::pt_output );
00202                 type /= 2;
00203         }
00204 }
00205 
00206 
00207 MicroData MicroSettings::microData() const
00208 {
00209         MicroData data;
00210         data.id = microInfo()->id();
00211         data.pinMappings = pinMappings();
00212         
00213         const PinSettingsList::const_iterator pinListEnd = m_pinSettingsList.end();
00214         for ( PinSettingsList::const_iterator it = m_pinSettingsList.begin(); it != pinListEnd; ++it )
00215         {
00216                 data.pinMap[(*it)->id()].type = (*it)->type();
00217                 data.pinMap[(*it)->id()].state= (*it)->state();
00218         }
00219         
00220         const VariableMap::const_iterator variableMapEnd = m_variableMap.end();
00221         for ( VariableMap::const_iterator it = m_variableMap.begin(); it != variableMapEnd; ++it )
00222         {
00223                 if ( it.data().permanent )
00224                         data.variableMap[it.key()] = it.data().valueAsString();
00225         } 
00226         
00227         return data;
00228 }
00229 
00230 
00231 void MicroSettings::restoreFromMicroData( const MicroData &microData )
00232 {
00233         setPinMappings( microData.pinMappings );
00234         
00235         const PinDataMap::const_iterator pinMapEnd = microData.pinMap.end();
00236         for ( PinDataMap::const_iterator it = microData.pinMap.begin(); it != pinMapEnd; ++it )
00237         {
00238                 PinSettings *pin = pinWithID(it.key());
00239                 if (pin)
00240                 {
00241                         pin->setState( it.data().state );
00242                         pin->setType( it.data().type );
00243                 }
00244         }
00245         
00246         const QStringMap::const_iterator variableMapEnd = microData.variableMap.end();
00247         for ( QStringMap::const_iterator it = microData.variableMap.begin(); it != variableMapEnd; ++it )
00248         {
00249                 setVariable( it.key(), it.data(), true );
00250         }
00251 }
00252 
00253 
00254 void MicroSettings::setVariable( const QString &name, QVariant value, bool permanent )
00255 {
00256         if ( name.isNull() ) return;
00257         VariableMap::iterator it = m_variableMap.find(name);
00258         if ( it != m_variableMap.end() )
00259         {
00260                 it.data().setValue(value);
00261                 it.data().permanent = permanent;
00262                 it.data().initAtStart = permanent;
00263         }
00264         else
00265         {
00266                 VariableInfo info;
00267                 info.setValue(value);
00268                 info.permanent = permanent;
00269                 info.initAtStart = permanent;
00270                 m_variableMap[name] = info;
00271         }
00272 }
00273 
00274 
00275 QStringList MicroSettings::variableNames()
00276 {
00277         QStringList list;
00278         const VariableMap::iterator variableMapEnd = m_variableMap.end();
00279         for ( VariableMap::iterator it = m_variableMap.begin(); it != variableMapEnd; ++it )
00280         {
00281                 list += it.key();
00282         }
00283         return list;
00284 }
00285 
00286 
00287 VariableInfo* MicroSettings::variableInfo( const QString &name )
00288 {
00289         if ( name.isNull() ) return 0;
00290         VariableMap::iterator it = m_variableMap.find(name);
00291         if ( it != m_variableMap.end() ) {
00292                 return &(it.data());
00293         } else {
00294                 return 0;
00295         }
00296 }
00297 
00298 
00299 bool MicroSettings::deleteVariable( const QString &name )
00300 {
00301         if ( name.isNull() ) return false;
00302         VariableMap::iterator it = m_variableMap.find(name);
00303         if ( it != m_variableMap.end() )
00304         {
00305                 m_variableMap.erase(it);
00306                 return true;
00307         } else {
00308                 return false;
00309         }
00310 }
00311 
00312 
00313 void MicroSettings::removeAllVariables()
00314 {
00315         m_variableMap.clear();
00316 }
00317 
00318 
00319 PinMapping MicroSettings::pinMapping( const QString & id ) const
00320 {
00321         return m_pinMappings[id];
00322 }
00323 
00324 
00325 void MicroSettings::setPinMappings( const PinMappingMap & pinMappings )
00326 {
00327         m_pinMappings = pinMappings;
00328         emit pinMappingsChanged();
00329 }
00330 
00331 
00332 PinMappingMap MicroSettings::pinMappings() const
00333 {
00334         return m_pinMappings;
00335 }
00336 //END class MicroSettings
00337 
00338 

Generated on Tue May 8 17:05:31 2007 for KTechLab by  doxygen 1.5.1