File indexing completed on 2024-12-01 05:13:07
0001 /*************************************************************************** 0002 * Copyright (C) 2003-2005 by David Saxton * 0003 * david@bluehaze.org * 0004 * * 0005 * This program is free software; you can redistribute it and/or modify * 0006 * it under the terms of the GNU General Public License as published by * 0007 * the Free Software Foundation; either version 2 of the License, or * 0008 * (at your option) any later version. * 0009 ***************************************************************************/ 0010 0011 #include "itemdocumentdata.h" 0012 #include "microinfo.h" 0013 #include "micropackage.h" 0014 #include "pinmapping.h" 0015 0016 // BEGIN class VariableInfo 0017 VariableInfo::VariableInfo() 0018 { 0019 type = MicroSettings::vt_unknown; 0020 value = QVariant(0); 0021 initAtStart = false; 0022 permanent = false; 0023 } 0024 0025 void VariableInfo::setValue(const QVariant &_value) 0026 { 0027 value = _value; 0028 } 0029 0030 QString VariableInfo::valueAsString() const 0031 { 0032 if (value.canConvert(QVariant::String)) 0033 return value.toString(); 0034 if (value.canConvert(QVariant::Int)) 0035 return QString::number(value.toInt()); 0036 return "0"; 0037 } 0038 // END class VariableInfo 0039 0040 // BEGIN class PinSettings 0041 PinSettings::PinSettings() 0042 : QObject() 0043 { 0044 m_type = PinSettings::pt_input; 0045 m_state = PinSettings::ps_off; 0046 m_id = "pin"; 0047 } 0048 0049 PinSettings::PinSettings(PinSettings::pin_type _type, PinSettings::pin_state _state, const QString &id, const QString &port) 0050 { 0051 m_type = _type; 0052 m_state = _state; 0053 m_id = id; 0054 m_port = port; 0055 } 0056 0057 void PinSettings::setType(PinSettings::pin_type type) 0058 { 0059 if (m_type == type) 0060 return; 0061 m_type = type; 0062 emit settingsChanged(); 0063 } 0064 0065 void PinSettings::setState(PinSettings::pin_state state) 0066 { 0067 if (m_state == state) 0068 return; 0069 m_state = state; 0070 emit settingsChanged(); 0071 } 0072 // END class PinSettings 0073 0074 // BEGIN class MicroSettings 0075 MicroSettings::MicroSettings(MicroInfo *microInfo) 0076 { 0077 _microInfo = microInfo; 0078 0079 QStringList portNames = _microInfo->package()->portNames(); 0080 const QStringList::iterator portNamesEnd = portNames.end(); 0081 for (QStringList::iterator it = portNames.begin(); it != portNamesEnd; ++it) { 0082 PinSettingsList portPins; 0083 QStringList pinIDs; 0084 pinIDs = _microInfo->package()->pinIDs(PicPin::type_bidir | PicPin::type_open, *it); 0085 pinIDs.sort(); 0086 const int numPins = pinIDs.size(); 0087 for (int i = 0; i < numPins; i++) { 0088 PinSettings *pinSettings = new PinSettings(PinSettings::pt_input, PinSettings::ps_off, pinIDs[i], *it); 0089 m_pinSettingsList.append(pinSettings); 0090 portPins.append(pinSettings); 0091 } 0092 m_ports[*it] = portPins; 0093 } 0094 } 0095 0096 MicroSettings::~MicroSettings() 0097 { 0098 qDeleteAll(m_pinSettingsList); 0099 // delete m_variableList; 0100 } 0101 0102 void MicroSettings::setPinType(const QString &id, PinSettings::pin_type type) 0103 { 0104 PinSettings *pin = pinWithID(id); 0105 if (pin) 0106 pin->setType(type); 0107 } 0108 0109 void MicroSettings::setPinState(const QString &id, PinSettings::pin_state state) 0110 { 0111 PinSettings *pin = pinWithID(id); 0112 if (pin) 0113 pin->setState(state); 0114 } 0115 0116 PinSettings *MicroSettings::pinWithID(const QString &id) 0117 { 0118 const PinSettingsList::iterator pinListEnd = m_pinSettingsList.end(); 0119 for (PinSettingsList::iterator it = m_pinSettingsList.begin(); it != pinListEnd; ++it) { 0120 if ((*it)->id() == id) 0121 return *it; 0122 } 0123 return nullptr; 0124 } 0125 0126 int MicroSettings::portState(const QString &port) 0127 { 0128 if (microInfo()->package()->portNames().indexOf(port) == -1) 0129 return -1; 0130 0131 int pinPower = 1; 0132 int num = 0; 0133 0134 const PinSettingsList::iterator pinListEnd = m_pinSettingsList.end(); 0135 for (PinSettingsList::iterator it = m_pinSettingsList.begin(); it != pinListEnd; ++it) { 0136 if ((*it)->port() == port) { 0137 if ((*it)->state() == PinSettings::ps_on) 0138 num += pinPower; 0139 // cout << "(*it)->state()="<<(*it)->state()<<endl; 0140 pinPower *= 2; 0141 } 0142 } 0143 0144 return num; 0145 } 0146 0147 int MicroSettings::portType(const QString &port) 0148 { 0149 if (microInfo()->package()->portNames().indexOf(port) == -1) 0150 return -1; 0151 0152 int pinPower = 1; 0153 int num = 0; 0154 0155 const PinSettingsList::iterator pinListEnd = m_pinSettingsList.end(); 0156 for (PinSettingsList::iterator it = m_pinSettingsList.begin(); it != pinListEnd; ++it) { 0157 if ((*it)->port() == port) { 0158 if ((*it)->type() == PinSettings::pt_input) 0159 num += pinPower; 0160 pinPower *= 2; 0161 } 0162 } 0163 0164 return num; 0165 } 0166 0167 void MicroSettings::setPortState(const QString &port, int state) 0168 { 0169 PortList::iterator plit = m_ports.find(port); 0170 if (plit == m_ports.end()) 0171 return; 0172 0173 const PinSettingsList::iterator plitEnd = plit.value().end(); 0174 for (PinSettingsList::iterator it = plit.value().begin(); it != plitEnd; ++it) { 0175 // cout << "state="<<state<<endl; 0176 (*it)->setState((state % 2 == 1) ? PinSettings::ps_on : PinSettings::ps_off); 0177 // cout << "(*it)->state()="<<(*it)->state()<<endl; 0178 state /= 2; 0179 } 0180 } 0181 0182 void MicroSettings::setPortType(const QString &port, int type) 0183 { 0184 PortList::iterator plit = m_ports.find(port); 0185 if (plit == m_ports.end()) 0186 return; 0187 0188 const PinSettingsList::iterator plitEnd = plit.value().end(); 0189 for (PinSettingsList::iterator it = plit.value().begin(); it != plitEnd; ++it) { 0190 (*it)->setType((type % 2 == 1) ? PinSettings::pt_input : PinSettings::pt_output); 0191 type /= 2; 0192 } 0193 } 0194 0195 MicroData MicroSettings::microData() const 0196 { 0197 MicroData data; 0198 data.id = microInfo()->id(); 0199 data.pinMappings = pinMappings(); 0200 0201 const PinSettingsList::const_iterator pinListEnd = m_pinSettingsList.end(); 0202 for (PinSettingsList::const_iterator it = m_pinSettingsList.begin(); it != pinListEnd; ++it) { 0203 data.pinMap[(*it)->id()].type = (*it)->type(); 0204 data.pinMap[(*it)->id()].state = (*it)->state(); 0205 } 0206 0207 const VariableMap::const_iterator variableMapEnd = m_variableMap.end(); 0208 for (VariableMap::const_iterator it = m_variableMap.begin(); it != variableMapEnd; ++it) { 0209 if (it.value().permanent) 0210 data.variableMap[it.key()] = it.value().valueAsString(); 0211 } 0212 0213 return data; 0214 } 0215 0216 void MicroSettings::restoreFromMicroData(const MicroData µData) 0217 { 0218 setPinMappings(microData.pinMappings); 0219 0220 const PinDataMap::const_iterator pinMapEnd = microData.pinMap.end(); 0221 for (PinDataMap::const_iterator it = microData.pinMap.begin(); it != pinMapEnd; ++it) { 0222 PinSettings *pin = pinWithID(it.key()); 0223 if (pin) { 0224 pin->setState(it.value().state); 0225 pin->setType(it.value().type); 0226 } 0227 } 0228 0229 const QStringMap::const_iterator variableMapEnd = microData.variableMap.end(); 0230 for (QStringMap::const_iterator it = microData.variableMap.begin(); it != variableMapEnd; ++it) { 0231 setVariable(it.key(), it.value(), true); 0232 } 0233 } 0234 0235 void MicroSettings::setVariable(const QString &name, QVariant value, bool permanent) 0236 { 0237 if (name.isNull()) 0238 return; 0239 VariableMap::iterator it = m_variableMap.find(name); 0240 if (it != m_variableMap.end()) { 0241 it.value().setValue(value); 0242 it.value().permanent = permanent; 0243 it.value().initAtStart = permanent; 0244 } else { 0245 VariableInfo info; 0246 info.setValue(value); 0247 info.permanent = permanent; 0248 info.initAtStart = permanent; 0249 m_variableMap[name] = info; 0250 } 0251 } 0252 0253 QStringList MicroSettings::variableNames() 0254 { 0255 QStringList list; 0256 const VariableMap::iterator variableMapEnd = m_variableMap.end(); 0257 for (VariableMap::iterator it = m_variableMap.begin(); it != variableMapEnd; ++it) { 0258 list += it.key(); 0259 } 0260 return list; 0261 } 0262 0263 VariableInfo *MicroSettings::variableInfo(const QString &name) 0264 { 0265 if (name.isNull()) 0266 return nullptr; 0267 VariableMap::iterator it = m_variableMap.find(name); 0268 if (it != m_variableMap.end()) { 0269 return &(it.value()); 0270 } else { 0271 return nullptr; 0272 } 0273 } 0274 0275 bool MicroSettings::deleteVariable(const QString &name) 0276 { 0277 if (name.isNull()) 0278 return false; 0279 VariableMap::iterator it = m_variableMap.find(name); 0280 if (it != m_variableMap.end()) { 0281 m_variableMap.erase(it); 0282 return true; 0283 } else { 0284 return false; 0285 } 0286 } 0287 0288 void MicroSettings::removeAllVariables() 0289 { 0290 m_variableMap.clear(); 0291 } 0292 0293 PinMapping MicroSettings::pinMapping(const QString &id) const 0294 { 0295 return m_pinMappings[id]; 0296 } 0297 0298 void MicroSettings::setPinMappings(const PinMappingMap &pinMappings) 0299 { 0300 m_pinMappings = pinMappings; 0301 emit pinMappingsChanged(); 0302 } 0303 0304 PinMappingMap MicroSettings::pinMappings() const 0305 { 0306 return m_pinMappings; 0307 } 0308 // END class MicroSettings 0309 0310 #include "moc_microsettings.cpp"