00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "itemdocumentdata.h"
00012 #include "microinfo.h"
00013 #include "micropackage.h"
00014 #include "pinmapping.h"
00015
00016
00017
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
00038
00039
00040
00041
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
00076
00077
00078
00079
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
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
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
00187 (*it)->setState( (state%2 == 1) ? PinSettings::ps_on : PinSettings::ps_off );
00188
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 µData )
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
00337
00338