/home/enzo/treballs/fib/pfc/nanocomp/src/mainController.cpp

Go to the documentation of this file.
00001 /*
00002  *                                                                         *
00003  *   This program is free software; you can redistribute it and/or modify  *
00004  *   it under the terms of the GNU General Public License as published by  *
00005  *   the Free Software Foundation; either version 2 of the License, or     *
00006  *   (at your option) any later version.                                   *
00007  *                                                                         *
00008  *   This program is distributed in the hope that it will be useful,       *
00009  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00010  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00011  *   GNU General Public License for more details.                          *
00012  *                                                                         *
00013  *   You should have received a copy of the GNU General Public License     *
00014  *   along with this program; if not, write to the                         *
00015  *   Free Software Foundation, Inc.,                                       *
00016  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
00017                                                                           */
00018 
00019 // $Revision: 1.16 $
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 //TODO: check the path of all filenames since they all must be saved
00185 //in the same directory to work
00186 //So we'll have to change the order of file asking or something
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         //Here we save all files again in the same directory as the project
00211         //TODO: check errors
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     //Here we save all files again in the same directory as the project
00256     //TODO: check errors
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     //First we ask for saving the project if some part
00290     //has been modified
00291     if (rules->isModified() || 
00292         forbiddenPatterns->isModified() ||
00293         truthTables->isModified() ||
00294         layouts->isLayoutModified())
00295     {
00296         save();
00297     }
00298     
00299     //Reset collections
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         //Clean
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     //Save 
00341     save();
00342     
00343     //New
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     //Save all table information
00377     for (map< wxString, bool>::iterator i = tableEnabled.begin(); i != tableEnabled.end(); i++)
00378     {
00379         wxString table = (*i).first;
00380         //Name
00381         *stream << table << endl;
00382         //Enabled/disabled
00383         if ((*i).second)
00384         {
00385             *stream << 1 << endl;
00386         }
00387         else
00388         {
00389             *stream << 0 << endl;
00390         }
00391         //Inputs
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         //Outputs
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     //Rules
00454     line = inStream->ReadLine();
00455     //TODO: look another way to do this
00456     if (fileStream->LastRead() == 0 || fileStream->Eof())
00457     {
00458         //ERROR
00459         //TODO: when error "clean" all project
00460         frame->errorMsg(_("Error opening rule file."));
00461         return false;
00462     }
00463     if (!line.StartsWith(_("rules="), &tempFile))
00464     {
00465         //ERROR
00466         //TODO: when error "clean" all project
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     //Patterns
00484     line = inStream->ReadLine();
00485     if (fileStream->LastRead() == 0 || fileStream->Eof())
00486     {
00487         //ERROR
00488         //TODO: when error "clean" all project
00489         frame->errorMsg(_("Error opening pattern file."));
00490         return false;
00491     }
00492     if (!line.StartsWith(_("fps="), &tempFile))
00493     {
00494         //ERROR
00495         //TODO: when error "clean" all project
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     //Truth Tables
00513     line = inStream->ReadLine();
00514     if (fileStream->LastRead() == 0 || fileStream->Eof())
00515     {
00516         //ERROR
00517         //TODO: when error "clean" all project
00518         frame->errorMsg(_("Error opening table file."));
00519         return false;
00520     }
00521     if (!line.StartsWith(_("tables="), &tempFile))
00522     {
00523         //ERROR
00524         //TODO: when error "clean" all project
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     //Layout
00542     line = inStream->ReadLine();
00543     if (fileStream->LastRead() == 0 || fileStream->Eof())
00544     {
00545         //ERROR
00546         //TODO: when error "clean" all project
00547         frame->errorMsg(_("Error opening layout file."));
00548         return false;
00549     }
00550     if (!line.StartsWith(_("layout="), &tempFile))
00551     {
00552         //ERROR
00553         //TODO: when error "clean" all project
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     //Tables
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     //Rules
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     //Patterns
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         //We've read a table name, proceed to see if enabled or not
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         //Inputs
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         //Outputs
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 }

Generated on Fri Sep 1 23:55:14 2006 for NanoComp by  doxygen 1.4.6