00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "mainController.hpp"
00022 #include <wx/filename.h>
00023
00025 MainController::MainController()
00026 {
00027 initControllers();
00028 fileName = wxEmptyString;
00029 }
00030
00031
00033 MainController::~MainController()
00034 {
00035 delete rules;
00036 delete layouts;
00037 delete forbiddenPatterns;
00038 delete truthTables;
00039 }
00040
00041
00043
00046 void MainController::setNanoFrame(NanoFrame *frame)
00047 {
00048 this->frame = frame;
00049 }
00050
00051
00053
00056 NanoFrame* MainController::getNanoFrame()
00057 {
00058 return frame;
00059 }
00060
00061
00063
00066 void MainController::setRules(RuleManager *rules)
00067 {
00068 this->rules = rules;
00069 }
00070
00071
00073
00076 void MainController::setLayouts(LayoutManager *layouts)
00077 {
00078 this->layouts = layouts;
00079 }
00080
00081
00083
00086 void MainController::setForbiddenPatterns(ForbiddenPatternManager *forbiddenPatterns)
00087 {
00088 this->forbiddenPatterns = forbiddenPatterns;
00089 }
00090
00091
00093
00096 void MainController::setTruthTables(TruthTableManager *truthTables)
00097 {
00098 this->truthTables = truthTables;
00099 }
00100
00101
00103 void MainController::initControllers()
00104 {
00105 rules = new RuleManager(this);
00106 forbiddenPatterns = new ForbiddenPatternManager(this);
00107 truthTables = new TruthTableManager(this);
00108 layouts = new LayoutManager(this, truthTables, forbiddenPatterns, rules);
00109 simulation = new SimulationManager(this, truthTables, forbiddenPatterns, rules, layouts);
00110 }
00111
00112
00114
00117 RuleManager* MainController::getRules()
00118 {
00119 return rules;
00120 }
00121
00122
00124
00127 LayoutManager* MainController::getLayouts()
00128 {
00129 return layouts;
00130 }
00131
00132
00134
00137 ForbiddenPatternManager* MainController::getForbiddenPatterns()
00138 {
00139 return forbiddenPatterns;
00140 }
00141
00142
00144
00147 TruthTableManager* MainController::getTruthTables()
00148 {
00149 return truthTables;
00150 }
00151
00152
00154 void MainController::tablesChanged()
00155 {
00156 layouts->tablesChanged();
00157 }
00158
00159
00161 void MainController::FPsChanged()
00162 {
00163 layouts->FPsChanged();
00164 }
00165
00166
00168 void MainController::rulesChanged()
00169 {
00170 layouts->rulesChanged();
00171 }
00172
00173
00175
00178 void MainController::setStatusMessage(wxString message)
00179 {
00180 frame->setStatusMessage(message);
00181 }
00182
00183
00184
00185
00186
00188
00193 void MainController::save()
00194 {
00195 if (rules->saveFile() && forbiddenPatterns->saveFile() && truthTables->saveFile() && layouts->saveFile())
00196 {
00197 if (fileName == wxEmptyString)
00198 {
00199 wxString name = fileView.saveFileChoose(frame, _("Select a project file to save"), _("*.ncp"));
00200
00201 if (name != wxEmptyString)
00202 {
00203 fileName = name;
00204 }
00205 else
00206 {
00207 return;
00208 }
00209 }
00210
00211
00212 wxFileName path(fileName);
00213 wxString pPath = path.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR);
00214 wxFileName ruleFile(rules->getFileName());
00215 wxFileName FPFile(forbiddenPatterns->getFileName());
00216 wxFileName tableFile(truthTables->getFileName());
00217 wxFileName layoutFile(layouts->getFileName());
00218
00219 rules->saveFilename(pPath + ruleFile.GetFullName());
00220 forbiddenPatterns->saveFilename(pPath + FPFile.GetFullName());
00221 truthTables->saveFilename(pPath + tableFile.GetFullName());
00222 layouts->saveFilename(pPath + layoutFile.GetFullName());
00223
00224 wxFileName extension(fileName);
00225 extension.SetExt(_("ncp"));
00226 fileName = extension.GetFullPath();
00227 wxFileOutputStream fileStream(fileName);
00228 wxTextOutputStream *outStream = new wxTextOutputStream(fileStream);
00229 saveFileNames(outStream);
00230 saveTables(outStream);
00231 saveRules(outStream);
00232 savePatterns(outStream);
00233 delete outStream;
00234 frame->setTitleBar(fileName);
00235 }
00236 }
00237
00238
00240 void MainController::saveAs()
00241 {
00242 if (rules->saveFile() && forbiddenPatterns->saveFile() && truthTables->saveFile() && layouts->saveFile())
00243 {
00244 wxString name = fileView.saveFileChoose(frame, _("Select a project file to save"), _("*.ncp"));
00245
00246 if (name != wxEmptyString)
00247 {
00248 fileName = name;
00249 }
00250 else
00251 {
00252 return;
00253 }
00254 }
00255
00256
00257 wxFileName path(fileName);
00258 wxString pPath = path.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR);
00259 wxFileName ruleFile(rules->getFileName());
00260 wxFileName FPFile(forbiddenPatterns->getFileName());
00261 wxFileName tableFile(truthTables->getFileName());
00262 wxFileName layoutFile(layouts->getFileName());
00263
00264 rules->saveFilename(pPath + ruleFile.GetFullName());
00265
00266 forbiddenPatterns->saveFilename(pPath + FPFile.GetFullName());
00267
00268 truthTables->saveFilename(pPath + tableFile.GetFullName());
00269
00270 layouts->saveFilename(pPath + layoutFile.GetFullName());
00271
00272 wxFileName extension(fileName);
00273 extension.SetExt(_("ncp"));
00274 fileName = extension.GetFullPath();
00275 wxFileOutputStream fileStream(fileName);
00276 wxTextOutputStream *outStream = new wxTextOutputStream(fileStream);
00277 saveFileNames(outStream);
00278 saveTables(outStream);
00279 saveRules(outStream);
00280 savePatterns(outStream);
00281 delete outStream;
00282 frame->setTitleBar(fileName);
00283 }
00284
00285
00287 void MainController::open()
00288 {
00289
00290
00291 if (rules->isModified() ||
00292 forbiddenPatterns->isModified() ||
00293 truthTables->isModified() ||
00294 layouts->isLayoutModified())
00295 {
00296 save();
00297 }
00298
00299
00300 rules->clean();
00301 forbiddenPatterns->clean();
00302 truthTables->clean();
00303 layouts->clean();
00304
00305 wxString name = fileView.openFileChoose(frame, _("Select a project file to open"), _("*.ncp"));
00306
00307 if (name != wxEmptyString)
00308 {
00309 fileName = name;
00310 }
00311 else
00312 {
00313 return;
00314 }
00315
00316 if (!openFile(fileName))
00317 {
00318
00319 rules->clean();
00320 forbiddenPatterns->clean();
00321 truthTables->clean();
00322 layouts->clean();
00323 frame->setTitleBar(fileName);
00324 fileName = wxEmptyString;
00325 frame->setTitleBar(_("Untitled"));
00326 }
00327 else
00328 {
00329 frame->setTitleBar(fileName);
00330 }
00331 }
00332
00333
00335
00338 void MainController::newFile()
00339 {
00340
00341 save();
00342
00343
00344 fileName = wxEmptyString;
00345 rules->clean();
00346 forbiddenPatterns->clean();
00347 truthTables->clean();
00348 layouts->clean();
00349 frame->setTitleBar(_("Untitled"));
00350 }
00351
00352
00354
00357 void MainController::saveFileNames(wxTextOutputStream *stream)
00358 {
00359 *stream << _("rules=") << wxFileName(rules->getFileName()).GetFullName() << endl;
00360 *stream << _("fps=") << wxFileName(forbiddenPatterns->getFileName()).GetFullName() << endl;
00361 *stream << _("tables=") << wxFileName(truthTables->getFileName()).GetFullName() << endl;
00362 *stream << _("layout=") << wxFileName(layouts->getFileName()).GetFullName() << endl;
00363 }
00364
00365
00367
00370 void MainController::saveTables(wxTextOutputStream *stream)
00371 {
00372 map< wxString, vector<coordinate> > tableInputs = layouts->getTableInputs();
00373 map< wxString, vector<coordinate> > tableOutputs = layouts->getTableOutputs();
00374 map< wxString, bool> tableEnabled = layouts->getTableEnabled();
00375
00376
00377 for (map< wxString, bool>::iterator i = tableEnabled.begin(); i != tableEnabled.end(); i++)
00378 {
00379 wxString table = (*i).first;
00380
00381 *stream << table << endl;
00382
00383 if ((*i).second)
00384 {
00385 *stream << 1 << endl;
00386 }
00387 else
00388 {
00389 *stream << 0 << endl;
00390 }
00391
00392 vector<coordinate> inputs = tableInputs[table];
00393 for (unsigned int j = 0; j < inputs.size(); j++)
00394 {
00395 *stream << inputs[j].x << endl << inputs[j].y << endl;
00396 }
00397
00398
00399 vector<coordinate> outputs = tableOutputs[table];
00400 for (unsigned int j = 0; j < outputs.size(); j++)
00401 {
00402 *stream << outputs[j].x << endl << outputs[j].y << endl;
00403 }
00404 }
00405 }
00406
00407
00409
00412 void MainController::saveRules(wxTextOutputStream *stream)
00413 {
00414 map< unsigned int, bool> ruleEnabled = layouts->getRuleEnabled();
00415 for (map< unsigned int, bool>::iterator i = ruleEnabled.begin(); i != ruleEnabled.end(); i++)
00416 {
00417 *stream << (*i).first << endl << (*i).second << endl;
00418 }
00419 }
00420
00421
00423
00426 void MainController::savePatterns(wxTextOutputStream *stream)
00427 {
00428 map< unsigned int, bool> FPEnabled = layouts->getFPEnabled();
00429 for (map< unsigned int, bool>::iterator i = FPEnabled.begin(); i != FPEnabled.end(); i++)
00430 {
00431 *stream << (*i).first << endl << (*i).second << endl;
00432 }
00433 }
00434
00435
00437
00441 bool MainController::openFile(wxString file)
00442 {
00443 bool result;
00444 wxFileName path(file);
00445 wxString pPath = path.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR);
00446
00447 wxFileInputStream *fileStream = new wxFileInputStream(file);
00448 wxTextInputStream *inStream = new wxTextInputStream(*fileStream);
00449
00450 wxString tempFile;
00451 wxString line;
00452
00453
00454 line = inStream->ReadLine();
00455
00456 if (fileStream->LastRead() == 0 || fileStream->Eof())
00457 {
00458
00459
00460 frame->errorMsg(_("Error opening rule file."));
00461 return false;
00462 }
00463 if (!line.StartsWith(_("rules="), &tempFile))
00464 {
00465
00466
00467 frame->errorMsg(_("Error opening rule file."));
00468 return false;
00469 }
00470 else
00471 {
00472 if (!tempFile.IsEmpty())
00473 {
00474 result = rules->openPFile(pPath + tempFile);
00475 if (!result)
00476 {
00477 frame->errorMsg(_("Error opening rule file."));
00478 return false;
00479 }
00480 }
00481 }
00482
00483
00484 line = inStream->ReadLine();
00485 if (fileStream->LastRead() == 0 || fileStream->Eof())
00486 {
00487
00488
00489 frame->errorMsg(_("Error opening pattern file."));
00490 return false;
00491 }
00492 if (!line.StartsWith(_("fps="), &tempFile))
00493 {
00494
00495
00496 frame->errorMsg(_("Error opening pattern file."));
00497 return false;
00498 }
00499 else
00500 {
00501 if (!tempFile.IsEmpty())
00502 {
00503 result = result && forbiddenPatterns->openPFile(pPath + tempFile);
00504 if (!result)
00505 {
00506 frame->errorMsg(_("Error opening forbidden pattern file."));
00507 return false;
00508 }
00509 }
00510 }
00511
00512
00513 line = inStream->ReadLine();
00514 if (fileStream->LastRead() == 0 || fileStream->Eof())
00515 {
00516
00517
00518 frame->errorMsg(_("Error opening table file."));
00519 return false;
00520 }
00521 if (!line.StartsWith(_("tables="), &tempFile))
00522 {
00523
00524
00525 frame->errorMsg(_("Error opening table file."));
00526 return false;
00527 }
00528 else
00529 {
00530 if (!tempFile.IsEmpty())
00531 {
00532 result = result && truthTables->openPFile(pPath + tempFile);
00533 if (!result)
00534 {
00535 frame->errorMsg(_("Error opening truth table file."));
00536 return false;
00537 }
00538 }
00539 }
00540
00541
00542 line = inStream->ReadLine();
00543 if (fileStream->LastRead() == 0 || fileStream->Eof())
00544 {
00545
00546
00547 frame->errorMsg(_("Error opening layout file."));
00548 return false;
00549 }
00550 if (!line.StartsWith(_("layout="), &tempFile))
00551 {
00552
00553
00554 frame->errorMsg(_("Error opening layout file."));
00555 return false;
00556 }
00557 else
00558 {
00559 if (!tempFile.IsEmpty())
00560 {
00561 result = result && layouts->openPFile(pPath + tempFile);
00562 if (!result)
00563 {
00564 frame->errorMsg(_("Error opening layout file."));
00565 return false;
00566 }
00567 }
00568 }
00569
00570
00571 if (!openTables(fileStream, inStream))
00572 {
00573 frame->errorMsg(_("Error mapping tables."));
00574 result = false;
00575 }
00576 else
00577 {
00578 result = result && true;
00579 }
00580
00581
00582 if (!openRules(fileStream, inStream))
00583 {
00584 frame->errorMsg(_("Error mapping rules."));
00585 result = false;
00586 }
00587 else
00588 {
00589 result = result && true;
00590 }
00591
00592 if (!openFPs(fileStream, inStream))
00593 {
00594 frame->errorMsg(_("Error mapping patterns."));
00595 result = false;
00596 }
00597 else
00598 {
00599 result = result && true;
00600 }
00601
00602 return result;
00603 }
00604
00605
00607
00612 bool MainController::openTables(wxFileInputStream *fileStream, wxTextInputStream *inStream)
00613 {
00614 wxString table;
00615 wxString temp;
00616 long int iTemp;
00617 bool enabled;
00618 long int x;
00619 long int y;
00620
00621 for (int i = 0; i < layouts->getTables(); i++)
00622 {
00623 table = inStream->ReadLine();
00624 if (fileStream->LastRead() == 0 || fileStream->Eof())
00625 {
00626 return false;
00627 }
00628
00629 temp = inStream->ReadLine();
00630 if (fileStream->LastRead() == 0 || fileStream->Eof())
00631 {
00632 return false;
00633 }
00634 if (!temp.ToLong(&iTemp))
00635 {
00636 return false;
00637 }
00638
00639 if (iTemp == 0)
00640 {
00641 enabled = false;
00642 }
00643 else if (iTemp == 1)
00644 {
00645 enabled = true;
00646 }
00647 else
00648 {
00649 return false;
00650 }
00651
00652 layouts->tableChecked(table, enabled);
00653
00654 for (int j = 0; j < truthTables->getInputs(table); j++)
00655 {
00656 temp = inStream->ReadLine();
00657 if (fileStream->LastRead() == 0 || fileStream->Eof())
00658 {
00659 return false;
00660 }
00661 if (!temp.ToLong(&x))
00662 {
00663 return false;
00664 }
00665 temp = inStream->ReadLine();
00666 if (fileStream->LastRead() == 0 || fileStream->Eof())
00667 {
00668 return false;
00669 }
00670 if (!temp.ToLong(&y))
00671 {
00672 return false;
00673 }
00674 if (!layouts->setInput(table, j, x, y))
00675 {
00676 return false;
00677 }
00678 }
00679
00680
00681 for (int j = 0; j < truthTables->getOutputs(table); j++)
00682 {
00683 temp = inStream->ReadLine();
00684 if (fileStream->LastRead() == 0 || fileStream->Eof())
00685 {
00686 return false;
00687 }
00688 if (!temp.ToLong(&x))
00689 {
00690 return false;
00691 }
00692 temp = inStream->ReadLine();
00693 if (fileStream->LastRead() == 0 || fileStream->Eof())
00694 {
00695 return false;
00696 }
00697 if (!temp.ToLong(&y))
00698 {
00699 return false;
00700 }
00701 if (!layouts->setOutput(table, j, x, y))
00702 {
00703 return false;
00704 }
00705 }
00706 }
00707 return true;
00708 }
00709
00710
00712
00717 bool MainController::openRules(wxFileInputStream *fileStream, wxTextInputStream *inStream)
00718 {
00719 wxString temp;
00720 long int iTemp;
00721 bool enabled;
00722 unsigned long int rule;
00723
00724 for (int i = 0; i < layouts->getRules(); i++)
00725 {
00726 temp = inStream->ReadLine();
00727 if (fileStream->LastRead() == 0 || fileStream->Eof())
00728 {
00729 return false;
00730 }
00731 if (!temp.ToULong(&rule))
00732 {
00733 return false;
00734 }
00735 temp = inStream->ReadLine();
00736 if (fileStream->LastRead() == 0 || fileStream->Eof())
00737 {
00738 return false;
00739 }
00740 if (!temp.ToLong(&iTemp))
00741 {
00742 return false;
00743 }
00744
00745 if (iTemp == 0)
00746 {
00747 enabled = false;
00748 }
00749 else if (iTemp == 1)
00750 {
00751 enabled = true;
00752 }
00753 else
00754 {
00755 return false;
00756 }
00757 layouts->ruleChecked(rule, enabled);
00758 }
00759 return true;
00760 }
00761
00762
00764
00769 bool MainController::openFPs(wxFileInputStream *fileStream, wxTextInputStream *inStream)
00770 {
00771 wxString temp;
00772 long int iTemp;
00773 bool enabled;
00774 unsigned long int fp;
00775
00776 for (int i = 0; i < layouts->getFPs(); i++)
00777 {
00778 temp = inStream->ReadLine();
00779 if (fileStream->LastRead() == 0 || fileStream->Eof())
00780 {
00781 return false;
00782 }
00783 if (!temp.ToULong(&fp))
00784 {
00785 return false;
00786 }
00787 temp = inStream->ReadLine();
00788 if (fileStream->LastRead() == 0 || fileStream->Eof())
00789 {
00790 return false;
00791 }
00792 if (!temp.ToLong(&iTemp))
00793 {
00794 return false;
00795 }
00796
00797 if (iTemp == 0)
00798 {
00799 enabled = false;
00800 }
00801 else if (iTemp == 1)
00802 {
00803 enabled = true;
00804 }
00805 else
00806 {
00807 return false;
00808 }
00809 layouts->FPChecked(fp, enabled);
00810 }
00811 return true;
00812 }
00813
00814
00816 void MainController::startSimulation()
00817 {
00818 simulation->prepareSimulation();
00819 setStatusMessage(_("Simulation in progress"));
00820 }
00821
00822
00824 void MainController::prepareSimulation()
00825 {
00826 if (!rules->checkRules())
00827 {
00828 frame->errorMsg(_("Check Rules for errors"));
00829 }
00830 else if (!forbiddenPatterns->checkPatterns())
00831 {
00832 frame->errorMsg(_("Check Forbidden Patterns for errors"));
00833 setStatusMessage(_("Check Forbidden Patterns for errors"));
00834 }
00835 else if (!layouts->checkLayout())
00836 {
00837 frame->errorMsg(_("Check there is a truth table checked and it has its inputs and outputs assigned"));
00838 setStatusMessage(_("Check there is a truth table checked and it has its inputs and outputs assigned"));
00839 }
00840 else
00841 {
00842 layouts->enableSimulation();
00843 setStatusMessage(_("Ready to simulate"));
00844 }
00845 }
00846
00847
00849 void MainController::elementChanged()
00850 {
00851 layouts->elementChanged();
00852 }