with Gtk.Menu_Item; use Gtk.Menu_Item; with Gtk; use Gtk; with Gtk.Main; use Gtk.Main; with Glib.Error; use Glib.Error; with Gtk.Widget; use Gtk.Widget; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; with GNAT.Command_Line; use GNAT.Command_Line; with GNAT.OS_Lib; use GNAT.OS_Lib; with unbounded_strings; use unbounded_strings; use unbounded_strings.unbounded_string_list_package; with Framework_Config; use Framework_Config; with Framework_config.extended; use Framework_config.extended; with Framework; use Framework; with Call_Framework; use Call_Framework; with Version; use Version; with Ada.Text_IO; use Ada.Text_IO; with Ada.IO_Exceptions; use Ada.IO_Exceptions; with GNAT.Current_Exception; use GNAT.Current_Exception; with Xml_generic_Parsers; use Xml_generic_Parsers; with Xml_generic_Parsers.architecture; use Xml_generic_Parsers.architecture; with AADL_Parsers; use AADL_Parsers; with Systems; use Systems; --with Project; use Project; with Debug; use Debug; with Processors; use Processors; with Processor_Set; use Processor_Set; with Buffer_Set; use Buffer_Set; with Resource_Set; use Resource_Set; with Address_Space_Set; use Address_Space_Set; with Scheduler_Interface; use Scheduler_Interface; with Task_Set; use Task_Set; with Gtk.Text_Buffer; use Gtk.Text_Buffer; --with Schedule_From_To_Pkg; use Schedule_From_To_Pkg; with Gtkada.Builder; use Gtkada.Builder; with graphical_editor.cheddar_callbacks; use graphical_editor.cheddar_callbacks; with graphical_editor; use graphical_editor; with graphical_editor.scheduling_simulation_callbacks; use graphical_editor.scheduling_simulation_callbacks; with graphical_editor.scheduling_simulation_draw_callbacks; use graphical_editor.scheduling_simulation_draw_callbacks; with graphical_editor.Draw_Scheduling_Pkg; use graphical_editor.Draw_Scheduling_Pkg; procedure cheddar is procedure Usage is begin Put_Line ("Cheddar is a free real time scheduling simulator."); Put_Line( "This program provides services to automatically check temporal constraints of real time tasks." ); New_Line; Put_Line( "Check Cheddar home page for details : http://beru.univ-brest.fr/~singhoff/cheddar " ); New_Line; New_Line; Put_Line ("Usage : cheddar [switches] foo"); Put_Line (" where foo can be : "); Put_Line (" - an unique XML file "); Put_Line (" - one or several AADL files"); New_Line; Put_Line (" Switches can be :"); Put_Line (" -u get this help"); Put_Line( " -l select a language : ""fr"" for français; ""en"" for english "); Put (" Default language is "); if (Current_Language = English) then Put ("English."); else Put ("Français."); end if; New_Line; Put( " -a the file names given to cheddar contain AADL descriptions instead of an XML file" ); Put_Line( " Only one XML file can be provided to Cheddar but several AADL files can be sent to Cheddar." ); Put_Line( " -I directory-name : gives an extra directory name where to look for XML or AADL files. By default, Cheddar only looks for project files into the Cheddar's current directory."); Put_Line (" -d activate Cheddar's debug mode "); Put_Line (" -i directory of glades files "); Put_Line (" -c put the current Cheddar's configuration at the screen" ); end Usage; Builder : Gtkada_Builder; Error : Glib.Error.GError; --Path : constant string := Glade_path & "cheddar.glade"; --My_Style : Gtk_Style; --Global_Font : Gdk_Font; Aadl_File : Boolean; A_Dir_Name : unbounded_string_ptr; Project_File_Name : unbounded_string_ptr; Project_File_List : unbounded_string_list; begin Copyright ("cheddar"); Aadl_File := False; initialize (Project_File_List); Do_New; loop case Getopt ("c d u l: a i I:") is when ASCII.NUL => exit; when 'c' => -- Framework_Config.Put; framework_config.extended.Put; when 'a' => Aadl_File := True; when 'd' => Cheddar_Debug := very_verbose; when 'i' => Put_Debug ("Install path : " & Parameter); install_path:=To_Unbounded_String(parameter); when 'I' => A_Dir_Name := new Unbounded_String; A_Dir_Name.all := To_Unbounded_String (Parameter); Put_Debug ("Project file directory : " & To_String (A_Dir_Name.all)); add (Project_File_Dir_List, A_Dir_Name); when 'u' => Usage; OS_Exit (0); when 'l' => if (Parameter /= "fr") and (Parameter /= "en") then Put_Line ("cheddar.adb : invalid language parameter"); New_Line; Usage; OS_Exit (0); else if Parameter = "fr" then Current_Language := Francais; else Current_Language := English; end if; end if; when others => Usage; OS_Exit (0); end case; end loop; loop Project_File_Name := new Unbounded_String; Project_File_Name.all := To_Unbounded_String (Get_Argument (Do_Expansion => True)); exit when Project_File_Name.all = empty_string; Put_Debug ("Project file to load : " & To_String (Project_File_Name.all)); add (Project_File_List, Project_File_Name); end loop; if (get_number_of_elements (Project_File_List) > 1) and (not Aadl_File) then Put_Line ("cheddar.adb : can not load more than one XML file at the same time ") ; OS_Exit (0); end if; Call_Framework.initialize (Aadl_File); if (get_number_of_elements (Project_File_List) > 0) then Is_New := False; Is_Saved := True; if (Aadl_File) then duplicate (Project_File_List, Aadl_Project_File_Name); Systems.Read_From_Aadl_File (Sys, Project_File_Dir_List, Aadl_Project_File_Name); -- -- The piece of code below allows us to call aadl2xml externally instead --of -- directly calling the package aadl_parser.ads -- -- declare -- Ok : Boolean; -- Spawn_Args : String_List (1 .. 2); -- Temp_File_Name : aliased String := "-o --cheddar_temp_file.xml"; -- Aadl_File_Name_To_Perform : aliased String := --To_String -- (Aadl_Project_File_Name); -- begin -- Spawn_Args(1) := Temp_File_Name'Unchecked_Access; -- Spawn_Args(2):=Aadl_File_Name_To_Perform'Unchecked_Access; -- Spawn("aadl2xml", Spawn_Args, Ok); -- if not Ok then -- Put_Line("marche pas"); -- end if; -- end; else Project_File_Name := get_head (Project_File_List); Xml_Project_File_Name := Project_File_Name.all; Systems.Read_From_Xml_File (sys, Project_File_Dir_List, Xml_Project_File_Name); end if; end if; Gtk.Main.Init; Gtk_New (Builder); Error := Add_From_File (Builder, to_string(Glade_path) & "cheddar.glade"); if Error /= null then Ada.Text_IO.Put_Line ("Error : " & Get_Message (Error)); Error_Free (Error); return; end if; Register_Handler (Builder => Builder, Handler_Name => "on_menuitem14_activate", Handler => graphical_editor.cheddar_callbacks.cache'Access); Register_Handler (Builder => Builder, Handler_Name => "on_menuitem24_activate", Handler => graphical_editor.cheddar_callbacks.event_analyzer'Access); Register_Handler (Builder => Builder, Handler_Name => "on_menuitem40_activate", Handler => graphical_editor.cheddar_callbacks.scheduling_simulation'Access); Register_Handler (Builder => Builder, Handler_Name => "on_toolbutton11_clicked", Handler => graphical_editor.scheduling_simulation_callbacks.Show_Direct_Scheduling_Simulation_widget'Access); Register_Handler (Builder => Builder, Handler_Name => "on_menuitem15_activate", Handler => graphical_editor.cheddar_callbacks.core'Access); Register_Handler (Builder => Builder, Handler_Name => "on_menuitem21_activate", Handler => graphical_editor.cheddar_callbacks.buffer'Access); Register_Handler (Builder => Builder, Handler_Name => "on_menuitem16_activate", Handler => graphical_editor.cheddar_callbacks.processor'Access); Register_Handler (Builder => Builder, Handler_Name => "on_menuitem17_activate", Handler => graphical_editor.cheddar_callbacks.network'Access); Register_Handler (Builder => Builder, Handler_Name => "on_menuitem18_activate", Handler => graphical_editor.cheddar_callbacks.adress_space'Access); Register_Handler (Builder => Builder, Handler_Name => "on_menuitem19_activate", Handler => graphical_editor.cheddar_callbacks.taskc'Access); Register_Handler (Builder => Builder, Handler_Name => "on_menuitem23_activate", Handler => graphical_editor.cheddar_callbacks.message'Access); Register_Handler (Builder => Builder, Handler_Name => "on_menuitem20_activate", Handler => graphical_editor.cheddar_callbacks.resource'Access); Register_Handler (Builder => Builder, Handler_Name => "on_menuitem30_activate", Handler => graphical_editor.cheddar_callbacks.open_xml'Access); Register_Handler (Builder => Builder, Handler_Name => "on_toolbutton2_clicked", Handler => graphical_editor.cheddar_callbacks.open_xml'Access); --faire juste ici un save et non un save as ... Register_Handler (Builder => Builder, Handler_Name => "on_menuitem31_activate", Handler => graphical_editor.cheddar_callbacks.save_xml'Access); --faire juste ici un save et non un save as ... Register_Handler (Builder => Builder, Handler_Name => "on_toolbutton5_clicked", Handler => graphical_editor.cheddar_callbacks.save_xml'Access); Register_Handler (Builder => Builder, Handler_Name => "on_menuitem32_activate", Handler => graphical_editor.cheddar_callbacks.save_xml'Access); Register_Handler (Builder => Builder, Handler_Name => "on_toolbutton6_clicked", Handler => graphical_editor.cheddar_callbacks.save_xml'Access); Register_Handler (Builder => Builder, Handler_Name => "on_menuitem29_activate", Handler => graphical_editor.cheddar_callbacks.initialyse_system'Access); Register_Handler (Builder => Builder, Handler_Name => "on_toolbutton4_clicked", Handler => graphical_editor.cheddar_callbacks.initialyse_system'Access); Register_Handler (Builder => Builder, Handler_Name => "on_window1_destroy", Handler => graphical_editor.cheddar_callbacks.Quit'Access); Register_Handler (Builder => Builder, Handler_Name => "on_imagemenuitem11_activate", Handler => graphical_editor.cheddar_callbacks.about'Access); Register_Handler (Builder => Builder, Handler_Name => "on_Manual_activate", Handler => graphical_editor.cheddar_callbacks.manual'Access); Register_Handler (Builder => Builder, Handler_Name => "on_menuitem9_activate", Handler => graphical_editor.cheddar_callbacks.scheduling_ref'Access); Register_Handler (Builder => Builder, Handler_Name => "on_menuitem39_activate", Handler => graphical_editor.cheddar_callbacks.Quit'Access); Register_Handler (Builder => Builder, Handler_Name => "on_toolbutton3_clicked", Handler => graphical_editor.cheddar_callbacks.Quit'Access); --Register_Handler --(Builder => Builder, -- Handler_Name => "on_drawingarea1_expose_event", -- Handler => graphical_editor.scheduling_simulation_draw_callbacks.Draw_Direct_Scheduling_cbk'Access); --Handler => graphical_editor.scheduling_simulation_callbacks.Draw_Direct_Scheduling_cbk'Access); --Handler => graphical_editor.draw_scheduling_pkg.Draw_Time_line_cbk'Access); Do_Connect (Builder); Gtk.Widget.Show_All (Get_Widget (Builder, "window1")); Gtk.Main.Main; exception when Task_Set.Invalid_Parameter => if (Aadl_File = True) then Put_Line ("Invalid thread component argument ; " & Exception_Message); else Put_Line ("cheddar.adb : invalid task argument ; " & Exception_Message); end if; when Address_Space_Set.Invalid_Parameter => if (Aadl_File = True) then Put_Line ("Invalid process component argument ; " & Exception_Message); else Put_Line ("cheddar.adb : invalid addresss space argument ; " & Exception_Message); end if; when Processor_Set.Invalid_Parameter => if (Aadl_File = True) then Put_Line ("Invalid processor component argument ; " & Exception_Message); else Put_Line ("cheddar.adb : invalid processor argument ; " & Exception_Message); end if; when Buffer_Set.Invalid_Parameter => if (Aadl_File = True) then Put_Line ("Invalid event data port argument ; " & Exception_Message); else Put_Line ("cheddar.adb : invalid buffer argument ; " & Exception_Message); end if; when Resource_Set.Invalid_Parameter => if (Aadl_File = True) then Put_Line ("Invalid data component argument ; " & Exception_Message); else Put_Line ("cheddar.adb : invalid resource argument ; " & Exception_Message); end if; when GNAT.Command_Line.Invalid_Switch => begin Put_Line ("cheddar.adb : invalid Switch ; " & Full_Switch); Usage; end; when GNAT.Command_Line.Invalid_Parameter => begin Put_Line ("cheddar.adb : missing parameter for switch ; " & Full_Switch); Usage; end; when Xml_Read_Error => Put_Line ("cheddar.adb : Can not read project file ; Xml Fatal Error ; " & Exception_Message); when AADL_Read_Error => Put_Line ("cheddar.adb : Can not read project files ; AADL parsing Error ; " & Exception_Message); when Ada.IO_Exceptions.Name_Error => Put_Line ("cheddar.adb : Can not open project files, Name_Error"); when Ada.IO_Exceptions.Status_Error => Put_Line ("cheddar.adb : Can not open project files, Status_Error"); when Ada.IO_Exceptions.Mode_Error => Put_Line ("cheddar.adb : Can not open project files, Mode_Error"); when Ada.IO_Exceptions.Use_Error => Put_Line ("cheddar.adb : Can not open project files, Use_Error"); when Ada.IO_Exceptions.Device_Error => Put_Line ("cheddar.adb : Can not open project files, Device_Error"); when Ada.IO_Exceptions.End_Error => Put_Line ("cheddar.adb : Can not open project files, End_Error"); when Ada.IO_Exceptions.Data_Error => Put_Line ("cheddar.adb : Can not open project files, Data_Error"); when Ada.IO_Exceptions.Layout_Error => Put_Line ("cheddar.adb : Can not open project files, Layout_Error"); when others => Put_Line ("This is an internal Cheddar bug ... sorry"); Put_Line( "WARNING : your project was saved in the file cheddar_bug.xml"); Put_Line ("Exception name : " & Exception_Name); Put_Line ("Exception message : " & Exception_Message); Systems.Write_To_Xml_File (Sys, To_Unbounded_String ("cheddar_bug.xml")); Put_Line ("Please, send a bug report to cheddar@listes.univ-brest.fr"); Put_Line( "Do not forget to join your AADL/XML/SC Cheddar project files with your bug report" ); Unref (Builder); end cheddar;