#include #include "core_simulation.h" #include "app/include/Terrarium.h" #include "app/include/TerrariumParameter.h" #include "app/include/Menu.h" #include "app/include/Tortue.h" #include "include/I2CDevices/Keyboard.h" Terrarium *terrarium = new Terrarium(1); TerrariumParameter *temperature = new TerrariumParameter(25, 20); TerrariumParameter *pressure = new TerrariumParameter(3000, 2990); Menu *menu = new Menu(); list * tortues = new list; list::iterator iteratorT; string message = ""; string input = ""; // la fonction d'initialisation d'arduino void Board::setup(){ // on configure la vitesse de la liaison Serial.begin(9600); // on fixe les pin en entree et en sorite en fonction des capteurs/actionneurs mis sur la carte pinMode(1, INPUT); pinMode(4, INPUT); pinMode(5, INPUT); pinMode(3, INPUT); pinMode(6, INPUT); pinMode(7, INPUT); pinMode(0, OUTPUT); pinMode(2, OUTPUT); digitalWrite(0,LOW); //remplissage de la liste de tortues, un jour avec lien à une bdd tortues->push_back(*(new Tortue("Marvin","03/09/1996","male"))); tortues->push_back(*(new Tortue("Clara","03/09/2008", "female"))); tortues->push_back(*(new Tortue("Camille","03/09/2017", "non binary"))); tortues->push_back(*(new Tortue("Clarisse","03/05/1971", "female"))); } // la boucle de controle arduino void Board::loop() { char buf[150]; //buf utilisé en output char inputBuf[150]; //buf utilisé en input static int cpt = 0; static int bascule = 0; int i = 0; std::string toDisplay; for (i = 0; i < 10; i++) { TemperatureManagement(); //Met à jour la valeur de temp PressureManagement(); // Met à jour la valeur de pression //cout << tortues->back() << endl; if (menu->getId() == 0 ) { //Afficher écran d'accueil message = menu->displayDefault(temperature->getValue(), pressure->getValue(), terrarium->getRadState(), terrarium->getTapState(), Tortue::getNbTortue()); } else { //Afficher le l'écran du ième menu message = menu->getMessage(); } int a3 = analogRead(3); int a4 = analogRead(4); int a6 = analogRead(6); int a7 = analogRead(7); //Conditions d'appui de bouton if ( a3 == HIGH && (terrarium->getPrevState() != a3)) { terrarium->setPrevState(HIGH); menu->previousChoice(); } else if (a3 == LOW && (terrarium->getPrevState() != a3)) { terrarium->setPrevState(LOW); } else if (a4 == HIGH && (terrarium->getNextState() != a4)) { terrarium->setNextState(HIGH); menu->nextChoice(); } else if (a4 == LOW && (terrarium->getNextState() != a4)) { terrarium->setNextState(LOW); } else if (a6 == HIGH && (terrarium->getOkState() != a6)) { terrarium->setOkState(HIGH); menu->menuNext(); } else if (a6 == LOW && (terrarium->getOkState() != a6)) { terrarium->setOkState(LOW); } else if (a7 == HIGH && (terrarium->getBackState() != a7)) { terrarium->setBackState(HIGH); menu->menuBack(); } else if (a7 == LOW && (terrarium->getBackState() != a7)) { terrarium->setBackState(LOW); } if (menu->getId() == 2){ //Lister les tortues iteratorT = tortues->begin(); for (int j = 0; j < menu->getChoice(); ++j) { iteratorT++; } message += iteratorT->getInfo(); } if (cpt % 2 == 0) { //Afficher sur écran un tr sur 2 strcpy(buf, message.c_str()); if (buf != NULL) bus.write(1, buf, 150); } //Menus nécessitant une saisie au clavier if (menu->getId() >= 5 && menu->getId() <= 12){ Keyboard::saisie = true ; sleep(4); if ( (&bus!=NULL)&&!(bus.isEmptyRegister(2))) { bus.requestFrom(2, inputBuf, 150); if (inputBuf[0] != '\0') { //Si utilisateur a saisie au clavier input = ""; for (int j = 0; inputBuf[j] != '\0'; ++j) { input += inputBuf[j]; } switch (menu->getId()) { case 5 : { //Création de nouvelle tortue et ajout dans la liste Tortue *newTortue = new Tortue("default","01/01/1970","none"); newTortue->setNom(input); tortues->push_back(*newTortue); menu->menuNext(); break; } case 11 : {//MàJ de la date de naissance de la nouvelle tortue try { tortues->back().setNaissance(input); menu->menuNext(); } catch (std::invalid_argument excep) { // Valeurs rentrés ne sont pas des integers cout << "Dates are not integers" << endl; } catch (Tortue::ExceptionDate excep) { // 1 : date postérieure à aujourd'hui if (excep.id == 1) cout << "Not yet born ? Time travelling turtles are not allowed in this terrarium"; // 2 : mauvais format else if (excep.id == 2) cout << "The format of the date is not correct"; // 3 : date trop ancienne else if (excep.id == 3) cout << "It wasn't really born before 1900... You were scammed"; // 4 : Mois > 12 else if (excep.id == 4) cout << "After December you start over at January"; // 5 : Jours > 3 else if (excep.id == 5) cout << "Months don't usually last more than 31 days !"; } break; } case 12 : { tortues->back().setSexe(input); menu->menuNext(); break; } case 6: { //Supprimer la tortue ayant le nom input int length = tortues->size(); iteratorT = tortues->begin(); for (int j = 0; j < length; ++j) { if (iteratorT->getNom() == input) { tortues->erase(iteratorT); Tortue::delete1(); menu->menuNext(); } ++iteratorT; } if (iteratorT == tortues->end()) { cout << "not in list" << endl; menu->menuBack(); } break; } case 7: try { temperature->setThresholdHigh(stoi(input)); menu->menuBack(); } catch (TerrariumParameter::ThresholdExcep excep) { if (excep.id == 1) cout << "value is under the minimum value"; } catch (std::invalid_argument excep) { cout << "Not a value" << endl; } break; case 8 : try { temperature->setThresholdLow(stoi(input)); menu->menuBack(); }catch (TerrariumParameter::ThresholdExcep excep) { if (excep.id == 2) cout << "value is over the maximum value"; } catch (std::invalid_argument excep) { cout << "Not a value" << endl; } break; case 9 : try { pressure->setThresholdHigh(stoi(input)); menu->menuBack(); }catch (TerrariumParameter::ThresholdExcep excep) { if (excep.id == 1) cout << "value is under the minimum value"; } catch (std::invalid_argument excep) { cout << "Not a value" << endl; } break; case 10 : try { pressure->setThresholdLow(stoi(input)); menu->menuBack(); }catch (TerrariumParameter::ThresholdExcep excep) { if (excep.id == 2) cout << "value is over the maximum value"; } catch (std::invalid_argument excep) { cout << "Not a value" << endl; } break; default: break; } } } } cpt++; sleep(1); } } void Board::TemperatureManagement() { char buf[100]; temperature->setValue(analogRead(1)); //Rad allume si temp trop basse mais pas déjà allumé if ((temperature->is2Low()) && (terrarium->getRadState() == LOW)) { digitalWrite(0, HIGH); terrarium->setRadState(HIGH); } else if ((temperature->is2High()) && (terrarium->getRadState() == HIGH)) { digitalWrite(0, LOW); terrarium->setRadState(LOW); } } void Board::PressureManagement() { char buf[100]; pressure->setValue(analogRead(5)); //Electrovanne ouverte si pression trop basse mais pas déjà ouverte if ((pressure->is2Low()) && (terrarium->getTapState() == LOW)) { digitalWrite(2, HIGH); terrarium->setTapState(HIGH); } else if ((pressure->is2High()) && (terrarium->getTapState() == HIGH)) { digitalWrite(2, LOW); terrarium->setTapState(LOW); } }