------------------------------------------------------------------------------ ------------------------------------------------------------------------------ -- Cheddar is a GNU GPL real-time scheduling analysis tool. -- This program provides services to automatically check schedulability and -- other performance criteria of real-time architecture models. -- -- Copyright (C) 2002-2016, Frank Singhoff, Alain Plantec, Jerome Legrand -- -- The Cheddar project was started in 2002 by -- Frank Singhoff, Lab-STICC UMR 6285 laboratory, Université de Bretagne Occidentale -- -- Cheddar has been published in the "Agence de Protection des Programmes/France" in 2008. -- Since 2008, Ellidiss technologies also contributes to the development of -- Cheddar and provides industrial support. -- -- The full list of contributors and sponsors can be found in AUTHORS.txt and SPONSORS.txt -- -- 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 2 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, write to the Free Software -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -- -- -- Contact : cheddar@listes.univ-brest.fr -- ------------------------------------------------------------------------------ -- Last update : -- $Rev: 1249 $ -- $Date: 2014-08-28 07:02:15 +0200 (Fri, 28 Aug 2014) $ -- $Author: singhoff $ ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ with ada.exceptions; use ada.exceptions; with Gdk.Drawable; use Gdk.Drawable; with Gdk.font; use Gdk.font; with Gtk.Arguments; use Gtk.Arguments; with Gtk.Drawing_Area; use Gtk.Drawing_Area; with Gtk.Handlers; use Gtk.Handlers; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; with GNAT.Current_Exception; use GNAT.Current_Exception; with Processor_Set; use Processor_Set; use Processor_Set.Generic_Processor_Set; with Tasks; use Tasks; with Resources; use Resources; with Messages; use Messages; with Buffers; use Buffers; with address_spaces; use address_spaces; with address_space_set; use address_space_set; with core_units; use core_units; use core_units.Core_Units_Table_Package; with processors; use processors; with Time_Unit_Events; use Time_Unit_Events; use Time_Unit_Events.Time_Unit_Package; with unbounded_strings; use unbounded_strings; with time_unit_events.extended; use time_unit_events.extended; with Framework_Config; use Framework_Config; with Translate; use Translate; with graphical_editor.Select_Time_Line; use graphical_editor.Select_Time_Line; with Objects; use Objects; with Editor_Config; use Editor_Config; with Ada.Text_IO; use Ada.Text_IO; with Gdk.Window; use Gdk.Window; with Gdk.Color; use Gdk.Color; with pango.font; use pango.font; with scheduler_interface; use scheduler_interface; with processor_interface; use processor_interface; with graphical_editor.scheduling_simulation_draw_callbacks; use graphical_editor.scheduling_simulation_draw_callbacks; with graphical_editor.user_message; use graphical_editor.user_message; with graphical_editor.colors; use graphical_editor.colors; with debug; use debug; package body graphical_editor.Draw_Scheduling is PACKAGE Es_Entiers IS NEW Ada.Text_IO.Integer_IO(Integer); use Es_Entiers; procedure Draw_Time_Line_Axis (Line_Number : in Gint) is begin Draw_Line (get_window(my_area), graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Black_Gc, graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Left_Margin, graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.High_Margin + Line_Number * graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Interligne, graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Left_Margin + Gint (graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Period - graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Start_Draw) * graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Timeunit_Margin, graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.High_Margin + Line_Number * graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Interligne); -- For each line, draw unit time lines -- for J in 0 .. Gint (graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Period - graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Start_Draw) loop Draw_Line (get_window(my_area), graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Black_Gc, graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Left_Margin + J * graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Timeunit_Margin, graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.High_Margin + Line_Number * graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Interligne - 3, graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Left_Margin + J * graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Timeunit_Margin, graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.High_Margin + Line_Number * graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Interligne + 3); if J mod Gint (Display_Witch_Time_Unit_Label) = 0 then Draw_Text ( get_window(my_area), graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Font, graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Black_Gc, graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Left_Margin + J * graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Timeunit_Margin, graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.High_Margin + Line_Number * graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Interligne + 20, Gint'Image (J)); Gdk.GC.Set_Foreground (graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Black_Gc, Gdk.Color.Black (Gtk.Widget.Get_Default_Colormap)); Draw_Rectangle ( get_window(my_area), graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Black_Gc, True, graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Left_Margin + graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Timeunit_Margin * J, graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.High_Margin + Line_Number * graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Interligne - 8, 3, 16); end if; end loop; exception when others => put_debug("Draw_Time_Line_Axis : " & Exception_Name & " : " & Exception_Message); end Draw_Time_Line_Axis; procedure Clear_Time_Line is begin Draw_Rectangle (get_window(my_area), graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.White_Gc, Filled => True, X => 0, Y => 0, Width => graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Current_Width, Height => graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Current_Height); end Clear_Time_Line; procedure Draw_Time_Line ( Period1 : Natural; Start_Draw1 : Natural; Sched1 : in Scheduling_Table_Ptr) is I : Gint := 0; Ok : Boolean := false; Number_of_time_axis : Gint := 0; My_processor_Iterator : processors_Iterator; a_processor : generic_processor_ptr; begin -- Select font to display text -- --Load (graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Font, -- to_string(selected_font)); graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Font := From_Description (From_String(to_string(selected_font))); -- White_Gc : color map to clean the drawing area -- Gdk.GC.Gdk_New (graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.White_Gc, Get_window(my_area)); Gdk.GC.Set_Foreground (graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.White_Gc, Gdk.Color.White (Gtk.Widget.Get_Default_Colormap)); -- Black_Gc : color map to draw the scheduling -- Gdk.GC.Gdk_New (graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Black_Gc, Get_window(my_area)); Gdk.GC.Set_Foreground (graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Black_Gc, Gdk.Color.Black (Gtk.Widget.Get_Default_Colormap)); -- Colors to display specific events from the event tables -- graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Red_Color := Gdk.Color.Parse ("Red"); Gdk.Color.Alloc (Gtk.Widget.Get_Default_Colormap, graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Red_Color); graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Blue_Color := Gdk.Color.Parse ("Blue"); Gdk.Color.Alloc (Gtk.Widget.Get_Default_Colormap, graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Blue_Color); graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Light_Blue := Gdk.Color.Parse ("#87CEFA"); Gdk.Color.Alloc (Gtk.Widget.Get_Default_Colormap, graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Light_Blue); graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Orange_Color := Gdk.Color.Parse ("#FF4500"); Gdk.Color.Alloc (Gtk.Widget.Get_Default_Colormap, graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Orange_Color); -- Save parameters of the caller -- graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Period := Period1; graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Start_Draw := Start_Draw1; graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Sched := Sched1; -- Set default Widget size -- graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Current_Width := 1000; graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Current_Height := 400; -- Compute Width Widget size -- Ok := False; I := ( Gint (Period1 - Start_Draw1) * graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Timeunit_Margin ) + graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Left_Margin + graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Right_Margin; if I > graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Current_Width then graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Current_Width := I; Ok := True; end if; -- Compute Height Widget size -- if is_empty (Time_Line_To_Display) then Number_of_time_axis := Gint (get_number_of_elements (sys.tasks)); if Schedule_With_Resources then Number_of_time_axis := Number_of_time_axis + Gint (get_number_of_elements (sys.Resources)); end if; if Schedule_With_Precedencies then Number_of_time_axis := Number_of_time_axis + Gint (get_number_of_elements (sys.Messages)) + Gint (get_number_of_elements (sys.Buffers)); end if; else Number_of_time_axis := Number_of_time_axis + Gint (get_number_of_elements (Time_Line_To_Display)); end if; if draw_core_unit_time_line then reset_iterator (sys.processors, My_processor_Iterator); loop current_element (sys.processors, A_processor, My_processor_Iterator); if a_processor.processor_type = monocore_type then Number_of_time_axis := Number_of_time_axis + 1; else Number_of_time_axis := Number_of_time_axis + Gint(multi_cores_processor_ptr(a_processor).cores.nb_entries); end if; exit when is_last_element (sys.processors, My_processor_Iterator); next_element (sys.processors, My_processor_Iterator); end loop; end if; if draw_address_space_time_line then Number_of_time_axis := Number_of_time_axis + Gint (get_number_of_elements (sys.address_spaces)); end if; -- Take care of Time line Axis -- We need some extra lines to display time axis lines -- Number_of_time_axis := Number_of_time_axis + (Number_of_time_axis / Gint (Time_Line_Between_Time_Axis)) + 1; I := (graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Interligne + 2) * Number_of_time_axis + graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.High_Margin; if I > graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Current_Height then graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Current_Height := I; Ok := True; end if; if Ok then Gtk.Drawing_Area.Set_USize (Gtk_Drawing_Area(my_area), graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Current_Width, graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Current_Height); end if; Redraw_Time_Line (graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling); exception when others => put_debug("Draw_Time_Line : " & Exception_Name & " : " & Exception_Message); end Draw_Time_Line; procedure Redraw_Time_Line (Draw_Scheduling : access Draw_Scheduling_Record'Class) is My_Task_Iterator : Tasks_Iterator; My_Resource_Iterator : Resources_Iterator; My_Buffer_Iterator : Buffers_Iterator; My_Message_Iterator : Messages_Iterator; My_processor_Iterator : processors_Iterator; My_address_space_Iterator : address_spaces_Iterator; A_Task : Generic_Task_Ptr; A_Message : Generic_Message_Ptr; A_Resource : Generic_Resource_Ptr; A_Buffer : Buffer_Ptr; A_core : core_unit_Ptr; An_address_space : address_space_Ptr; a_processor : generic_processor_ptr; I : Gint := 0; nb_cores : core_units.core_units_range; Msg, Name, Name2 : Unbounded_String; subtype Object_Range is natural range 1 .. (max_address_spaces + Max_Tasks + Max_Resources + Max_Buffers + Max_Messages + max_core_units); Task_Name : array (Object_Range) of Unbounded_String; Resource_Name : array (Object_Range) of Unbounded_String; Message_Name : array (Object_Range) of Unbounded_String; Buffer_Name : array (Object_Range) of Unbounded_String; core_Name : array (Object_Range) of Unbounded_String; address_space_Name : array (Object_Range) of Unbounded_String; Object_Id, Object2_Id : Gint; Time_U : Gint; Save_Start_U : array (Object_Range) of Gint := (others => 0); Save_Start_M : array (Object_Range) of Gint := (others => 0); Ok : Boolean; Number_Of_Time_Line : Gint := 0; begin --------------------------------- -- Clear work space --------------------------------- Draw_Rectangle (get_window(my_area), Draw_Scheduling.White_Gc, Filled => True, X => 0, Y => 0, Width => Draw_Scheduling.Current_Width, Height => Draw_Scheduling.Current_Height); --------------------------------- -- Draw a line per task --------------------------------- I := 0; reset_iterator (sys.Tasks, My_Task_Iterator); loop current_element (sys.Tasks, A_Task, My_Task_Iterator); if To_Display (A_Task.name, Task_Object_Type) then Msg := Lb_Task_Name (Current_Language) & "=" & A_Task.name & " "; case A_Task.task_type is when Aperiodic_Type => Msg := Msg & Lb_Capacity (Current_Language) & To_Unbounded_String ("=") & A_Task.capacity'Img & To_Unbounded_String ("; ") & Lb_Deadline (Current_Language) & To_Unbounded_String ("=") & Aperiodic_Task_Ptr (A_Task).deadline'Img & To_Unbounded_String ("; ") & Lb_Start_Time (Current_Language) & To_Unbounded_String ("=") & A_Task.start_time'Img & To_Unbounded_String ("; ") & Lb_Priority (Current_Language) & To_Unbounded_String ("=") & A_Task.priority'Img & To_Unbounded_String ("; Cpu=") & A_Task.cpu_name; when others => Msg := Msg & Lb_Period (Current_Language) & To_Unbounded_String ("=") & Periodic_Task_Ptr (A_Task).period'Img & To_Unbounded_String ("; ") & Lb_Capacity (Current_Language) & To_Unbounded_String ("=") & A_Task.capacity'Img & To_Unbounded_String ("; ") & Lb_Deadline (Current_Language) & To_Unbounded_String ("=") & Periodic_Task_Ptr (A_Task).deadline'Img & To_Unbounded_String ("; ") & Lb_Start_Time (Current_Language) & To_Unbounded_String ("=") & A_Task.start_time'Img & To_Unbounded_String ("; ") & Lb_Priority (Current_Language) & To_Unbounded_String ("=") & A_Task.priority'Img & To_Unbounded_String ("; Cpu=") & A_Task.cpu_name; end case; if A_Task.task_type = Parametric_Type then Msg := Msg & To_Unbounded_String (";") & Lb_Activation_Rule (Current_Language) & To_Unbounded_String ("=") & Parametric_Task_Ptr (A_Task).activation_rule; end if; -- Draw axis time line if necessary -- if (Number_Of_Time_Line mod Gint (Time_Line_Between_Time_Axis)) = 0 then Draw_Time_Line_Axis (I); I := I + 1; end if; Number_Of_Time_Line := Number_Of_Time_Line + 1; Draw_Text ( Get_window(my_area), Draw_Scheduling.Font, Draw_Scheduling.Black_Gc, Draw_Scheduling.Left_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne + 20, To_String (Msg)); Draw_Line ( Get_window(my_area), Draw_Scheduling.Black_Gc, Draw_Scheduling.Left_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne, Draw_Scheduling.Left_Margin + Gint (Draw_Scheduling.Period - Draw_Scheduling.Start_Draw) * Draw_Scheduling.Timeunit_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne); -- For each line, draw unit time lines -- for J in 0 .. Gint (Draw_Scheduling.Period - Draw_Scheduling.Start_Draw) loop Draw_Line (Get_window(my_area), Draw_Scheduling.Black_Gc, Draw_Scheduling.Left_Margin + J * Draw_Scheduling.Timeunit_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne - 3, Draw_Scheduling.Left_Margin + J * Draw_Scheduling.Timeunit_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne + 3); end loop; -- Register each task in the name table -- Task_Name (Object_Range (I)) := A_Task.name; I := I + 1; end if; exit when is_last_element (sys.Tasks, My_Task_Iterator); next_element (sys.Tasks, My_Task_Iterator); end loop; ---------------------------------------- -- Draw a line for each address space ---------------------------------------- if draw_address_space_time_line then reset_iterator (sys.address_spaces, My_address_space_Iterator); loop current_element (sys.address_spaces, An_address_space, My_address_space_Iterator); Msg := Lb_address_space_Name (Current_Language) & "=" & An_address_space.name & " "; Msg := Msg & To_Unbounded_String ("Protocol = " & an_address_space.scheduling.scheduler_type'img); MSg := Msg & " ; " & an_address_space.scheduling.preemptive_type'img; -- Draw axis time line if necessary -- if (Number_Of_Time_Line mod Gint (Time_Line_Between_Time_Axis)) = 0 then Draw_Time_Line_Axis (I); I := I + 1; end if; Number_Of_Time_Line := Number_Of_Time_Line + 1; Draw_Text ( Get_window(my_area), Draw_Scheduling.Font, Draw_Scheduling.Black_Gc, Draw_Scheduling.Left_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne + 20, To_String (Msg)); Draw_Line ( Get_window(my_area), Draw_Scheduling.Black_Gc, Draw_Scheduling.Left_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne, Draw_Scheduling.Left_Margin + Gint (Draw_Scheduling.Period - Draw_Scheduling.Start_Draw) * Draw_Scheduling.Timeunit_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne); -- For each line, draw unit time lines -- for J in 0 .. Gint (Draw_Scheduling.Period - Draw_Scheduling.Start_Draw) loop Draw_Line (Get_window(my_area), Draw_Scheduling.Black_Gc, Draw_Scheduling.Left_Margin + J * Draw_Scheduling.Timeunit_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne - 3, Draw_Scheduling.Left_Margin + J * Draw_Scheduling.Timeunit_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne + 3); end loop; -- Register each task in the name table -- address_space_Name (Object_Range (I)) := An_address_space.name; I := I + 1; exit when is_last_element (sys.address_spaces, My_address_space_Iterator); next_element (sys.address_spaces, My_address_space_Iterator); end loop; end if; ------------------------------------- -- Draw a line for each core ------------------------------------- if draw_core_unit_time_line then reset_iterator (sys.processors, My_processor_Iterator); loop current_element (sys.processors, A_processor, My_processor_Iterator); nb_cores:=0; loop if a_processor.processor_type = monocore_type then a_core:=mono_core_processor_ptr(a_processor).core; else a_core:=multi_cores_processor_ptr(a_processor).cores.entries(nb_cores); end if; Msg := Lb_core_unit (Current_Language) & "/ " & Lb_processor_Name (Current_Language) & "=" & A_core.name & "/" & a_processor.name & " "; Msg := Msg & To_Unbounded_String ("Protocol = " & a_core.scheduling.scheduler_type'img); Msg := Msg & " ; " & a_core.scheduling.preemptive_type'img; -- Draw axis time line if necessary -- if (Number_Of_Time_Line mod Gint (Time_Line_Between_Time_Axis)) = 0 then Draw_Time_Line_Axis (I); I := I + 1; end if; Number_Of_Time_Line := Number_Of_Time_Line + 1; Draw_Text (Get_window(my_area), Draw_Scheduling.Font, Draw_Scheduling.Black_Gc, Draw_Scheduling.Left_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne + 20, To_String (Msg)); Draw_Line (Get_window(my_area), Draw_Scheduling.Black_Gc, Draw_Scheduling.Left_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne, Draw_Scheduling.Left_Margin + Gint (Draw_Scheduling.Period - Draw_Scheduling.Start_Draw) * Draw_Scheduling.Timeunit_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne); -- For each line, draw unit time lines -- for J in 0 .. Gint (Draw_Scheduling.Period - Draw_Scheduling.Start_Draw) loop Draw_Line (Get_window(my_area), Draw_Scheduling.Black_Gc, Draw_Scheduling.Left_Margin + J * Draw_Scheduling.Timeunit_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne - 3, Draw_Scheduling.Left_Margin + J * Draw_Scheduling.Timeunit_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne + 3); end loop; -- Register each core in the name table -- core_Name (Object_Range (I)) := A_core.name & "/" & a_processor.name; I := I + 1; nb_cores:=nb_cores+1; if a_processor.processor_type=monocore_type then exit; else if nb_cores=multi_cores_processor_ptr(a_processor).cores.nb_entries then exit; end if; end if; end loop; exit when is_last_element (sys.processors, My_processor_Iterator); next_element (sys.processors, My_processor_Iterator); end loop; end if; ------------------------------------- -- Draw a line for each resource ------------------------------------- if Schedule_With_Resources then if not is_empty (sys.Resources) then reset_iterator (sys.Resources, My_Resource_Iterator); loop current_element (sys.Resources, A_Resource, My_Resource_Iterator); if To_Display (A_Resource.name, Resource_Object_Type) then Msg := Lb_Resource_Name (Current_Language) & "=" & A_Resource.name & " "; Msg := Msg & "Protocol = " & A_Resource.protocol'img; Msg := Msg & To_Unbounded_String ("; Cpu=") & A_Task.cpu_name; -- Draw axis time line if necessary -- if (Number_Of_Time_Line mod Gint (Time_Line_Between_Time_Axis)) = 0 then Draw_Time_Line_Axis (I); I := I + 1; end if; Number_Of_Time_Line := Number_Of_Time_Line + 1; Draw_Text (Get_window(my_area), Draw_Scheduling.Font, Draw_Scheduling.Black_Gc, Draw_Scheduling.Left_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne + 20, To_String (Msg)); Draw_Line (Get_window(my_area), Draw_Scheduling.Black_Gc, Draw_Scheduling.Left_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne, Draw_Scheduling.Left_Margin + Gint (Draw_Scheduling.Period - Draw_Scheduling.Start_Draw) * Draw_Scheduling.Timeunit_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne); -- For each line, draw unit time lines -- for J in 0 .. Gint (Draw_Scheduling.Period - Draw_Scheduling.Start_Draw) loop Draw_Line (Get_window(my_area), Draw_Scheduling.Black_Gc, Draw_Scheduling.Left_Margin + J * Draw_Scheduling.Timeunit_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne - 3, Draw_Scheduling.Left_Margin + J * Draw_Scheduling.Timeunit_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne + 3); end loop; -- Register each resource in the name table -- Resource_Name (Object_Range (I)) := A_Resource.name; I := I + 1; end if; exit when is_last_element (sys.Resources, My_Resource_Iterator); next_element (sys.Resources, My_Resource_Iterator); end loop; end if; end if; ------------------------------------- -- Draw a line for each message ------------------------------------- if Schedule_With_Precedencies then if not is_empty (sys.Messages) then reset_iterator (sys.Messages, My_Message_Iterator); loop current_element (sys.Messages, A_Message, My_Message_Iterator); if To_Display (A_Message.name, Message_Object_Type) then Msg := Lb_Message_Name (Current_Language) & "=" & A_Message.name & " "; if A_Message.message_type = Periodic_Type then Msg := Msg & To_Unbounded_String ("Period=") & Periodic_Message_Ptr (A_Message).period'Img; else Msg := Msg & To_Unbounded_String (" ;Period= 0"); end if; Msg := Msg & To_Unbounded_String (" ; Response time=") & A_Message.response_time'Img; Msg := Msg & To_Unbounded_String (" ; Size = ") & A_Message.size'Img; -- Draw axis time line if necessary -- if (Number_Of_Time_Line mod Gint (Time_Line_Between_Time_Axis)) = 0 then Draw_Time_Line_Axis (I); I := I + 1; end if; Number_Of_Time_Line := Number_Of_Time_Line + 1; Draw_Text (Get_window(my_area), Draw_Scheduling.Font, Draw_Scheduling.Black_Gc, Draw_Scheduling.Left_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne + 20, To_String (Msg)); Draw_Line (Get_window(my_area), Draw_Scheduling.Black_Gc, Draw_Scheduling.Left_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne, Draw_Scheduling.Left_Margin + Gint (Draw_Scheduling.Period - Draw_Scheduling.Start_Draw) * Draw_Scheduling.Timeunit_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne); -- For each line, draw unit time lines -- for J in 0 .. Gint (Draw_Scheduling.Period - Draw_Scheduling.Start_Draw) loop Draw_Line (Get_window(my_area), Draw_Scheduling.Black_Gc, Draw_Scheduling.Left_Margin + J * Draw_Scheduling.Timeunit_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne - 3, Draw_Scheduling.Left_Margin + J * Draw_Scheduling.Timeunit_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne + 3); end loop; -- Register each message in the name table -- Message_Name (Object_Range (I)) := A_Message.name; I := I + 1; end if; exit when is_last_element (sys.Messages, My_Message_Iterator); next_element (sys.Messages, My_Message_Iterator); end loop; end if; ------------------------------------- -- Draw a line for each buffer ------------------------------------- if not is_empty (sys.Buffers) then reset_iterator (sys.Buffers, My_Buffer_Iterator); loop current_element (sys.Buffers, A_Buffer, My_Buffer_Iterator); if To_Display (A_Buffer.name, Buffer_Object_Type) then Msg := Lb_Buffer_Name (Current_Language) & "=" & A_Buffer.name & " "; Msg := Msg & To_Unbounded_String ("Size = ") & A_Buffer.buffer_size'Img; Msg := Msg & To_Unbounded_String (" ; Cpu = ") & A_Buffer.cpu_name; -- Draw axis time line if necessary -- if (Number_Of_Time_Line mod Gint (Time_Line_Between_Time_Axis)) = 0 then Draw_Time_Line_Axis (I); I := I + 1; end if; Number_Of_Time_Line := Number_Of_Time_Line + 1; Draw_Text (Get_window(my_area), Draw_Scheduling.Font, Draw_Scheduling.Black_Gc, Draw_Scheduling.Left_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne + 20, To_String (Msg)); Draw_Line (Get_window(my_area), Draw_Scheduling.Black_Gc, Draw_Scheduling.Left_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne, Draw_Scheduling.Left_Margin + Gint (Draw_Scheduling.Period - Draw_Scheduling.Start_Draw) * Draw_Scheduling.Timeunit_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne); -- For each line, draw unit time lines -- for J in 0 .. Gint (Draw_Scheduling.Period - Draw_Scheduling.Start_Draw) loop Draw_Line (Get_window(my_area), Draw_Scheduling.Black_Gc, Draw_Scheduling.Left_Margin + J * Draw_Scheduling.Timeunit_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne - 3, Draw_Scheduling.Left_Margin + J * Draw_Scheduling.Timeunit_Margin, Draw_Scheduling.High_Margin + I * Draw_Scheduling.Interligne + 3); end loop; -- Register each buffer in the name table -- Buffer_Name (Object_Range (I)) := A_Buffer.name; I := I + 1; end if; exit when is_last_element (sys.Buffers, My_Buffer_Iterator); next_element (sys.Buffers, My_Buffer_Iterator); end loop; end if; end if; ------------------------------------------ -- Draw information from scheduling table ------------------------------------------ --------------------------------------------------------- -- Draw background data : i.e. draw horizontal rectangle --------------------------------------------------------- for U in 0 .. Draw_Scheduling.Sched.nb_entries - 1 loop if Draw_Scheduling.Sched.entries (U).data.error_msg = empty_string then -- Scan scheduling sequence, but only for period-start-draw units -- of times -- for K in 0 .. Draw_Scheduling.Sched.entries (U).data.result.nb_entries - 1 loop if (Draw_Scheduling.Sched.entries (U).data.result.entries (K). item >= Draw_Scheduling.Start_Draw) and (Draw_Scheduling.Sched.entries (U).data.result.entries (K). item <= Draw_Scheduling.Period) then case Draw_Scheduling.Sched.entries (U).data.result.entries (K). data.type_of_event is ---------------------------------------- -- Draw task running time in black -- (time when the task owns the processor) -- Draw both in the task line and its assigned core/processor -- (we then draw two boxes) ---------------------------------------- when Running_Task => Time_U := Gint ( Draw_Scheduling.Sched.entries (U).data.result. entries (K).item - Draw_Scheduling.Start_Draw); -- Draw data in the task time line -- Name := Draw_Scheduling.Sched.entries (U).data.result.entries ( K).data.running_task.name; if To_Display (Name, Task_Object_Type) then Ok := False; for L in Object_Range loop if (Task_Name (L) = Name) then Ok := True; Object_Id := Gint (L); end if; end loop; if not Ok then Raise_Exception (task_not_found'Identity, To_String(name) ); end if; -- Set color -- if not several_colors_for_time_lines then Gdk.GC.Set_Foreground (Draw_Scheduling.Black_Gc, Gdk.Color.Black (Gtk.Widget.Get_Default_Colormap)); else Gdk.GC.Set_Foreground (Draw_Scheduling.Black_Gc, colors.Colors(to_color(natural(object_id))) ); end if; -- Different color for CRPD -- TODO: The case when several_colors_for_time_lines is active. if (Draw_Scheduling.Sched.entries (U).data.result.entries(K).data.CRPD > 0) then Gdk.GC.Set_Foreground (Draw_Scheduling.Black_Gc, Draw_Scheduling.Red_Color); end if; Draw_Rectangle (Get_window(my_area), Draw_Scheduling.Black_Gc, True, Draw_Scheduling.Timeunit_Margin * Time_U + Draw_Scheduling.Left_Margin, Object_Id * Draw_Scheduling.Interligne + Draw_Scheduling.High_Margin - 3, Draw_Scheduling.Timeunit_Margin + 1, 7); end if; -- Draw data in the core time line -- if draw_core_unit_time_line then Name := Draw_Scheduling.Sched.entries (U).data.result.entries ( K).data.running_core & "/" & Draw_Scheduling.Sched.entries (U).data.result.entries (K).data.running_task.cpu_name; Ok := False; for L in Object_Range loop if (core_Name (L) = Name) then Ok := True; Object_Id := Gint (L); end if; end loop; if not Ok then Raise_Exception (core_unit_not_found'Identity, To_String(name) ); end if; Draw_Rectangle (Get_window(my_area), Draw_Scheduling.Black_Gc, True, Draw_Scheduling.Timeunit_Margin * Time_U + Draw_Scheduling.Left_Margin, Object_Id * Draw_Scheduling.Interligne + Draw_Scheduling.High_Margin - 3, Draw_Scheduling.Timeunit_Margin +1, 7); end if; -- Draw data in the address space time line -- if draw_address_space_time_line then Name := Draw_Scheduling.Sched.entries (U).data.result.entries ( K).data.running_task.address_space_name; Ok := False; for L in Object_Range loop if (address_space_Name (L) = Name) then Ok := True; Object_Id := Gint (L); end if; end loop; if not Ok then Raise_Exception (address_space_not_found'Identity, To_String(name) ); end if; Draw_Rectangle (Get_window(my_area), Draw_Scheduling.Black_Gc, True, Draw_Scheduling.Timeunit_Margin * Time_U + Draw_Scheduling.Left_Margin, Object_Id * Draw_Scheduling.Interligne + Draw_Scheduling.High_Margin - 3, Draw_Scheduling.Timeunit_Margin + 1, 7); end if; ---------------------------------------- -- Draw task switching time in black ---------------------------------------- when Context_Switch_Overhead => Name := Draw_Scheduling.Sched.entries (U).data.result.entries ( K).data.switched_task.name; if To_Display (Name, Task_Object_Type) then Ok := False; for L in Object_Range loop if (Task_Name (L) = Name) then Ok := True; Object_Id := Gint (L); Time_U := Gint ( Draw_Scheduling.Sched.entries (U).data.result. entries (K).item - Draw_Scheduling.Start_Draw); end if; end loop; if not Ok then Raise_Exception (task_not_found'Identity, To_String(name) ); end if; Gdk.GC.Set_Foreground (Draw_Scheduling.Black_Gc, Draw_Scheduling.Red_Color); Draw_Rectangle (Get_window(my_area), Draw_Scheduling.Black_Gc, True, Draw_Scheduling.Timeunit_Margin * Time_U + Draw_Scheduling.Left_Margin, Object_Id * Draw_Scheduling.Interligne + Draw_Scheduling.High_Margin - 3, Draw_Scheduling.Timeunit_Margin + 1, 7); end if; ----------------------------------------------------- -- Draw shared resource allocation in blue color ----------------------------------------------------- when Allocate_Resource => Name := Draw_Scheduling.Sched.entries (U).data.result.entries ( K).data.allocate_resource.name; if To_Display (Name, Resource_Object_Type) then Ok := False; for L in Object_Range loop if (Resource_Name (L) = Name) then Ok := True; Object_Id := Gint (L); Time_U := Gint ( Draw_Scheduling.Sched.entries (U).data.result. entries (K).item - Draw_Scheduling.Start_Draw); end if; end loop; if not Ok then Raise_Exception (resource_not_found'Identity, To_String(name) ); end if; Save_Start_U (Object_Range (Object_Id)) := Draw_Scheduling.Left_Margin + Draw_Scheduling.Timeunit_Margin * Time_U; end if; ---------------------------------------- -- Draw shared resource releasing in black ---------------------------------------- when Release_Resource => Name := Draw_Scheduling.Sched.entries (U).data.result.entries ( K).data.release_resource.name; if To_Display (Name, Resource_Object_Type) then Ok := False; for L in Object_Range loop if (Resource_Name (L) = Name) then Ok := True; Object_Id := Gint (L); Time_U := Gint ( Draw_Scheduling.Sched.entries (U).data.result. entries (K).item - Draw_Scheduling.Start_Draw) + 1; end if; end loop; if not Ok then Raise_Exception (resource_not_found'Identity, To_String(name) ); end if; Ok := False; Name2 := Draw_Scheduling.Sched.entries (U).data.result.entries(K).data.release_task.name; for L in Object_Range loop if (task_Name (L) = name2) then Ok := True; Object2_Id := Gint (L); end if; end loop; if not Ok then Raise_Exception (task_not_found'Identity, To_String(name2) ); end if; -- Set color depending on the task -- if not several_colors_for_time_lines then Gdk.GC.Set_Foreground (Draw_Scheduling.Black_Gc, Gdk.Color.Black (Gtk.Widget.Get_Default_Colormap)); else Gdk.GC.Set_Foreground (Draw_Scheduling.Black_Gc, colors.Colors(to_color(natural(object2_id))) ); end if; Draw_Rectangle (Get_window(my_area), Draw_Scheduling.Black_Gc, True, Save_Start_U (Object_Range (Object_Id)), Object_Id * Draw_Scheduling.Interligne + Draw_Scheduling.High_Margin - 3, Draw_Scheduling.Left_Margin + Draw_Scheduling.Timeunit_Margin * Time_U - Save_Start_U (Object_Range (Object_Id)) + 1, 7); end if; ---------------------------------------------------- -- Event about buffers -- Draw in red buffer write and in blue buffer read ---------------------------------------------------- when Write_To_Buffer => Name := Draw_Scheduling.Sched.entries (U).data.result.entries ( K).data.write_buffer.name; if To_Display (Name, Buffer_Object_Type) then Ok := False; for L in Object_Range loop if (Buffer_Name (L) = Name) then Ok := True; Object_Id := Gint (L); Time_U := Gint ( Draw_Scheduling.Sched.entries (U).data.result. entries (K).item); end if; end loop; if not Ok then Raise_Exception (buffer_not_found'Identity, To_String(name) ); end if; Gdk.GC.Set_Foreground (Draw_Scheduling.Black_Gc, Draw_Scheduling.Blue_Color); Draw_Rectangle (Get_window(my_area), Draw_Scheduling.Black_Gc, True, Draw_Scheduling.Timeunit_Margin * Time_U + Draw_Scheduling.Left_Margin, Object_Id * Draw_Scheduling.Interligne + Draw_Scheduling.High_Margin - 3, Draw_Scheduling.Timeunit_Margin + 1, 7); end if; when Read_From_Buffer => Name := Draw_Scheduling.Sched.entries (U).data.result.entries ( K).data.read_buffer.name; if To_Display (Name, Buffer_Object_Type) then Ok := False; for L in Object_Range loop if (Buffer_Name (L) = Name) then Ok := True; Object_Id := Gint (L); Time_U := Gint ( Draw_Scheduling.Sched.entries (U).data.result. entries (K).item - Draw_Scheduling.Start_Draw); end if; end loop; if not Ok then Raise_Exception (buffer_not_found'Identity, To_String(name) ); end if; Gdk.GC.Set_Foreground (Draw_Scheduling.Black_Gc, Draw_Scheduling.Red_Color); Draw_Rectangle (Get_window(my_area), Draw_Scheduling.Black_Gc, True, Draw_Scheduling.Timeunit_Margin * Time_U + Draw_Scheduling.Left_Margin, Object_Id * Draw_Scheduling.Interligne + Draw_Scheduling.High_Margin - 3, Draw_Scheduling.Timeunit_Margin + 1, 7); end if; when Buffer_Underflow => Name := Draw_Scheduling.Sched.entries (U).data.result.entries (K).data.underflow_buffer.name; if To_Display (Name, Buffer_Object_Type) then Ok := False; for L in Object_Range loop if (Buffer_Name (L) = Name) then Ok := True; Object_Id := Gint (L); Time_U := Gint ( Draw_Scheduling.Sched.entries (U).data.result. entries (K).item - Draw_Scheduling.Start_Draw); end if; end loop; if not Ok then Raise_Exception (buffer_not_found'Identity, To_String(name) ); end if; Gdk.GC.Set_Foreground (Draw_Scheduling.Black_Gc, Draw_Scheduling.Orange_Color); Draw_Rectangle (Get_window(my_area), Draw_Scheduling.Black_Gc, True, Draw_Scheduling.Timeunit_Margin * Time_U + Draw_Scheduling.Left_Margin, Object_Id * Draw_Scheduling.Interligne + Draw_Scheduling.High_Margin - 3, Draw_Scheduling.Timeunit_Margin + 1, 7); end if; when Buffer_Overflow => Name := Draw_Scheduling.Sched.entries (U).data.result.entries (K).data.overflow_buffer.name; if To_Display (Name, Buffer_Object_Type) then Ok := False; for L in Object_Range loop if (Buffer_Name (L) = Name) then Ok := True; Object_Id := Gint (L); Time_U := Gint ( Draw_Scheduling.Sched.entries (U).data.result. entries (K).item - Draw_Scheduling.Start_Draw); end if; end loop; if not Ok then Raise_Exception (buffer_not_found'Identity, To_String(name) ); end if; Gdk.GC.Set_Foreground (Draw_Scheduling.Black_Gc, Draw_Scheduling.Light_Blue); Draw_Rectangle (Get_window(my_area), Draw_Scheduling.Black_Gc, True, Draw_Scheduling.Timeunit_Margin * Time_U + Draw_Scheduling.Left_Margin, Object_Id * Draw_Scheduling.Interligne + Draw_Scheduling.High_Margin - 3, Draw_Scheduling.Timeunit_Margin + 1, 7); end if; ---------------------------------------- -- Event about messages -- Draw in red message communication time ---------------------------------------- when Send_Message => Name := Draw_Scheduling.Sched.entries (U).data.result.entries ( K).data.send_message.name; if To_Display (Name, Message_Object_Type) then Ok := False; for L in Object_Range loop if (Message_Name (L) = Name) then Ok := True; Object_Id := Gint (L); Time_U := Gint ( Draw_Scheduling.Sched.entries (U).data.result. entries (K).item); end if; end loop; if not Ok then Raise_Exception (message_not_found'Identity, To_String(name) ); end if; -- Save the time the message is sent -- Save_Start_M (Object_Range (Object_Id)) := Time_U; end if; when Receive_Message => Name := Draw_Scheduling.Sched.entries (U).data.result.entries ( K).data.receive_message.name; if To_Display (Name, Message_Object_Type) then Ok := False; for L in Object_Range loop if (Message_Name (L) = Name) then Ok := True; Object_Id := Gint (L); Time_U := Gint ( Draw_Scheduling.Sched.entries (U).data.result. entries (K).item - Draw_Scheduling.Start_Draw); end if; end loop; if not Ok then Raise_Exception (message_not_found'Identity, To_String(name) ); end if; Gdk.GC.Set_Foreground (Draw_Scheduling.Black_Gc, Draw_Scheduling.Red_Color); Draw_Rectangle (Get_window(my_area), Draw_Scheduling.Black_Gc, True, Draw_Scheduling.Left_Margin + Save_Start_M (Object_Range (Object_Id)) * Draw_Scheduling.Timeunit_Margin, Object_Id * Draw_Scheduling.Interligne + Draw_Scheduling.High_Margin - 3, Draw_Scheduling.Timeunit_Margin * (Time_U - Save_Start_M (Object_Range (Object_Id))) + 1, 7); end if; ------------------------------------------- -- Events we have nothing to display ------------------------------------------- when others => null; end case; end if; end loop; end if; end loop; --------------------------------------------------------- -- Draw forground data : i.e. draw vertical rectangle --------------------------------------------------------- for U in 0 .. Draw_Scheduling.Sched.nb_entries - 1 loop if Draw_Scheduling.Sched.entries (U).data.error_msg = empty_string then -- Scan scheduling sequence, but only for period-start-draw units -- of times -- for K in 0 .. Draw_Scheduling.Sched.entries (U).data.result.nb_entries - 1 loop if (Draw_Scheduling.Sched.entries (U).data.result.entries (K). item >= Draw_Scheduling.Start_Draw) and (Draw_Scheduling.Sched.entries (U).data.result.entries (K). item <= Draw_Scheduling.Period) then case Draw_Scheduling.Sched.entries (U).data.result.entries (K). data.type_of_event is -------------------------------------------------------- -- Draw in blue when a task has to wait for a resource -------------------------------------------------------- when wait_for_resource => if display_wait_for_resource then Name := Draw_Scheduling.Sched.entries (U).data.result.entries ( K).data.wait_for_resource_task.name; if To_Display (Name, Task_Object_Type) then Ok := False; for L in Object_Range loop if (Task_Name (L) = Name) then Ok := True; Object_Id := Gint (L); Time_U := Gint ( Draw_Scheduling.Sched.entries (U).data.result. entries (K).item - Draw_Scheduling.Start_Draw); end if; end loop; if not Ok then Raise_Exception (task_not_found'Identity, To_String(name) ); end if; Gdk.GC.Set_Foreground (Draw_Scheduling.Black_Gc, Draw_Scheduling.Blue_Color); Draw_Rectangle (Get_window(my_area), Draw_Scheduling.Black_Gc, True, Draw_Scheduling.Left_Margin + Draw_Scheduling.Timeunit_Margin * Time_U, Draw_Scheduling.High_Margin + Object_Id * Draw_Scheduling.Interligne - 8, 3, 16); end if; end if; ----------------------------------------------------- -- Draw each address space wake up time in red ----------------------------------------------------- when address_space_activation => if draw_address_space_time_line then Name := Draw_Scheduling.Sched.entries (U).data.result.entries ( K).data.activation_address_space; if To_Display (Name, address_space_Object_Type) then Ok := False; for L in Object_Range loop if (address_space_Name (L) = Name) then Ok := True; Object_Id := Gint (L); Time_U := Gint ( Draw_Scheduling.Sched.entries (U).data.result. entries (K).item - Draw_Scheduling.Start_Draw); end if; end loop; if not Ok then Raise_Exception (address_space_not_found'Identity, To_String(name) ); end if; if display_address_space_activation then Gdk.GC.Set_Foreground (Draw_Scheduling.Black_Gc, Draw_Scheduling.Red_Color); Draw_Rectangle (Get_window(my_area), Draw_Scheduling.Black_Gc, True, Draw_Scheduling.Left_Margin + Draw_Scheduling.Timeunit_Margin * Time_U, Draw_Scheduling.High_Margin + Object_Id * Draw_Scheduling.Interligne - 8, 3, 16); end if; if display_address_space_completion then if Time_U + Gint(Draw_Scheduling.Sched.entries(U).data.result.entries (K).data.duration) <= Gint (graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Period + graphical_editor.scheduling_simulation_draw_callbacks.Draw_Scheduling.Start_Draw) then Gdk.GC.Set_Foreground (Draw_Scheduling.Black_Gc, Draw_Scheduling.Blue_Color); Draw_Rectangle (Get_window(my_area), Draw_Scheduling.Black_Gc, True, Draw_Scheduling.Left_Margin + Draw_Scheduling.Timeunit_Margin * (Time_U + Gint(Draw_Scheduling.Sched.entries(U).data.result.entries (K).data.duration)), Draw_Scheduling.High_Margin + Object_Id * Draw_Scheduling.Interligne - 8, 3, 16); end if; end if; end if; end if; ----------------------------------------------------- -- Draw each task wake up time in red ----------------------------------------------------- when Task_activation => if display_task_activation then Name := Draw_Scheduling.Sched.entries (U).data.result.entries ( K).data.activation_task.name; if To_Display (Name, Task_Object_Type) then Ok := False; for L in Object_Range loop if (Task_Name (L) = Name) then Ok := True; Object_Id := Gint (L); Time_U := Gint ( Draw_Scheduling.Sched.entries (U).data.result. entries (K).item - Draw_Scheduling.Start_Draw); end if; end loop; if not Ok then Raise_Exception (task_not_found'Identity, To_String(name) ); end if; Gdk.GC.Set_Foreground (Draw_Scheduling.Black_Gc, Draw_Scheduling.Red_Color); Draw_Rectangle (Get_window(my_area), Draw_Scheduling.Black_Gc, True, Draw_Scheduling.Left_Margin + Draw_Scheduling.Timeunit_Margin * Time_U, Draw_Scheduling.High_Margin + Object_Id * Draw_Scheduling.Interligne - 8, 3, 16); end if; end if; ----------------------------------------------------- -- Draw shared resource allocation in blue color ----------------------------------------------------- when Allocate_Resource => if display_allocate_resource then Name := Draw_Scheduling.Sched.entries (U).data.result.entries ( K).data.allocate_resource.name; if To_Display (Name, Resource_Object_Type) then Ok := False; for L in Object_Range loop if (Resource_Name (L) = Name) then Ok := True; Object_Id := Gint (L); Time_U := Gint ( Draw_Scheduling.Sched.entries (U).data.result. entries (K).item - Draw_Scheduling.Start_Draw); end if; end loop; if not Ok then Raise_Exception (resource_not_found'Identity, To_String(name) ); end if; Gdk.GC.Set_Foreground (Draw_Scheduling.Black_Gc, Draw_Scheduling.Blue_Color); Draw_Rectangle (Get_window(my_area), Draw_Scheduling.Black_Gc, True, Draw_Scheduling.Left_Margin + Draw_Scheduling.Timeunit_Margin * Time_U, Draw_Scheduling.High_Margin + Object_Id * Draw_Scheduling.Interligne - 8, 3, 16); end if; end if; ----------------------------------------------------- -- Draw shared resource release in red color ----------------------------------------------------- when release_Resource => if display_release_resource then Name := Draw_Scheduling.Sched.entries (U).data.result.entries ( K).data.release_resource.name; if To_Display (Name, Resource_Object_Type) then Ok := False; for L in Object_Range loop if (Resource_Name (L) = Name) then Ok := True; Object_Id := Gint (L); Time_U := Gint ( Draw_Scheduling.Sched.entries (U).data.result. entries (K).item - Draw_Scheduling.Start_Draw); end if; end loop; if not Ok then Raise_Exception (resource_not_found'Identity, To_String(name) ); end if; Gdk.GC.Set_Foreground (Draw_Scheduling.Black_Gc, Draw_Scheduling.Red_Color); Draw_Rectangle (Get_window(my_area), Draw_Scheduling.Black_Gc, True, Draw_Scheduling.Left_Margin + (Draw_Scheduling.Timeunit_Margin * (Time_U+1) ), Draw_Scheduling.High_Margin + Object_Id * Draw_Scheduling.Interligne - 8, 3, 16); end if; end if; ------------------------------------------- -- Events we have nothing to display ------------------------------------------- when others => null; end case; end if; end loop; end if; end loop; Gdk.GC.Set_Foreground (Draw_Scheduling.Black_Gc, Gdk.Color.Black (Gtk.Widget.Get_Default_Colormap)); exception when others => put_debug("Redraw_Time_Line : " & Exception_Name & " : " & Exception_Message); end Redraw_Time_Line; end graphical_editor.Draw_Scheduling;