
#include "Handler_exception.h"
// This file is part of the Herezh++ application.
//
// The finite element software Herezh++ is dedicated to the field
// of mechanics for large transformations of solid structures.
// It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600)
// INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) <https://www.irdl.fr/>.
//
// Herezh++ is distributed under GPL 3 license ou ultérieure.
//
// Copyright (C) 1997-2021 Université Bretagne Sud (France)
// AUTHOR : Gérard Rio
// E-MAIL  : gerardrio56@free.fr
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License,
// or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
// For more information, please consult: <https://herezh.irdl.fr/>.

#include "CharUtil.h"
#include "ParaGlob.h"
#include "ParaAlgoControle.h"

// méthode utilitaire, utilisable par les classes dérivées, permettant d'agir si un controle-c est émis
// où une autre interruption générée par un kill
// intervient sur des paramètres stockés dans ParaAlgoControle, qui sont actuellement actif (accessible via ParaGlob)
// c'est donc via ces paramètres que les autres programmes peuvent récupérer les infos et agir
// en conséquence éventuellement
void Handler_signal(int theSignal)
{
//  cout << "\n Je receptionne le signal " << theSignal << endl ;
//  cout << "\n tappez sur quelque chose pour continuer ";
//  string toto;
//  cin >> toto;
//  // dans le cas d'un controle c on génère une exception
//  // qui est reprise par herezh.c
  if (theSignal == SIGINT )
      { Sortie(0); // *** test
      
      // sauvegarde de l'etat actuel dans le .BI
       // et également le .PI !! ce qui est bigrement utile pour la reprise sur des gros calculs
       // on modifie les paramètres dans ParaAlgoControle
       
       ParaGlob::param->ParaAlgoContActifs().ChangeSortieEtatActuelDansBI(true);
       ParaGlob::param->ParaAlgoContActifs().ChangeSortieEquilibreGlobal(true);
//         ErrSortieFinale toto;
  cout << "\n Je receptionne le signal " << theSignal << endl ;
  cout << "\n tappez sur quelque chose pour continuer ";
//        throw (toto);
      }
  else // les autres cas
   { //On va proposer un menu
     string rep=" ";
     cout  << "\n   --- definition des parametres de controle ------       ";
     while ((Minuscules(rep) != "f")&&(Minuscules(rep) != "0"))
      {// on met une boucle de surveillance pour l'interactif au cas où
       try
        {
           cout << "\n choix : "
              << "\n (0 ou f)  (defaut) fin immediate d'execution  "
              << "\n (1 ou c)  continue l'execution "
              << "\n (2)  lecture de donnees secondaire dans le .info"
              << "\n (3)  sortie de la recherche d'equilibre global "
              << "\n (4)  sauvegarde de l'etat actuel dans le .BI "
              << "\n (5)  sauvegarde post-traitement (CVisu) actuel"
              << "\n (6)  affiche nom grandeurs actuelles accessibles globalement "
              << "\n (7)  modification d'une constante globale utilisateur "
              << "\n  ";
           int nb_choix=7; // maxi du num de choix actuel
           rep = lect_return_defaut(false,"f");
           if ((Minuscules(rep) == "f") || (Minuscules(rep) == "0"))// sortie directe
             Sortie(0);
           if ((Minuscules(rep) == "c") || (Minuscules(rep) == "1"))// sortie directe
             return;
           int num = ChangeEntier(rep);
           if (!((num >= 0)&&(num<=nb_choix)))
            { cout << "\n Erreur on attendait un entier entre 0 et "<<nb_choix<<" !!, "
                   << "\n redonnez une bonne valeur"
                   << "\n ou taper f ou 0 pour arreter le programme";
            };
           switch (num)
            { case 0:  // sortie
                { Sortie(0);break;} // normalement cela a déjà été filtré avant
              case 1:  // on continue l'exécution
                { return;break;
                }
              case 2:  // lecture de donnees secondaire dans le .info
                { // on modifie les paramètres dans ParaAlgoControle
                  ParaGlob::param->ChangeDemandeLectureSecondaireInPointInfo(1);
                  break;
                }
              case 3:  // sortie d'une boucle d'iteration d'equilibre global
                { // on modifie les paramètres dans ParaAlgoControle
                  ParaGlob::param->ParaAlgoContActifs().ChangeSortieEquilibreGlobal(true);
                  break;
                }
              case 4:  // sauvegarde de l'etat actuel dans le .BI
                { // on modifie les paramètres dans ParaAlgoControle
                  ParaGlob::param->ParaAlgoContActifs().ChangeSortieEtatActuelDansBI(true);
                  break;
                }
              case 5:  // sauvegarde de l'etat actuel dans le .BI
                { // on modifie les paramètres dans ParaAlgoControle
                  ParaGlob::param->ParaAlgoContActifs().ChangeSortieEtatActuelDansCVisu(true);
                  break;
                }
              case 6:  // affichage des grandeurs actuelles accessibles globalement
                { // on affiche directement
                  ParaGlob::param->Affiche_GrandeurGlobal(cout);
                  break;
                }
              case 7:  // modification d'une constante globale utilisateur
                { ParaGlob::param->Modif_interactive_constante_utilisateur();
                  break;
                }
            };
       
       }
      catch ( ... )
       {  cout << "\n *** erreur inconnue, on continue " << endl;
       };
      };
   };
 
};

