Ignore:
Timestamp:
Apr 7, 2024, 11:50:48 PM (6 weeks ago)
Author:
chronos
Message:
  • Modified: Kernel API class definition improvement.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Packages/Kernel/Kernel.API.pas

    r60 r61  
    3838  end;
    3939
    40   { TKernelApi }
     40  { TSystemApi }
    4141
    42   TKernelApi = class
    43     Kernel: TObject; //TKernel;
    44     function Call(Command: TApiCommand; Data: Pointer): Pointer;
    45     procedure WriteText(Text: string);
    46     procedure DrawText(CanvasId: Integer; P: TPoint; Text: string; Color: TColor);
    47     procedure DrawLine(CanvasId: Integer; P1, P2: TPoint; Color: TColor);
    48     procedure DrawRect(CanvasId: Integer; Rect: TRectangle; Color: TColor);
    49     procedure DrawFrame(CanvasId: Integer; Rect: TRectangle; Color: TColor);
    50     procedure Sleep(Time: TDateTime);
    51     procedure ReadMessage(Message: TIPCMessage);
    52     function WindowCreate: Integer;
    53     function GetWindowCanvas(WindowId: Integer): Integer;
    54     procedure WindowSetAttr(WindowId: Integer; Bounds: TRectangle; Visible: Boolean);
     42  TSystemApi = class
     43    function Call(Command: TApiCommand; Data: Pointer): Pointer; virtual; abstract;
     44    procedure WriteText(Text: string); virtual; abstract;
     45    procedure DrawText(CanvasId: Integer; P: TPoint; Text: string; Color: TColor); virtual; abstract;
     46    procedure DrawLine(CanvasId: Integer; P1, P2: TPoint; Color: TColor); virtual; abstract;
     47    procedure DrawRect(CanvasId: Integer; Rect: TRectangle; Color: TColor); virtual; abstract;
     48    procedure DrawFrame(CanvasId: Integer; Rect: TRectangle; Color: TColor); virtual; abstract;
     49    procedure Sleep(Time: TDateTime); virtual; abstract;
     50    procedure ReadMessage(Message: TIPCMessage); virtual; abstract;
     51    function WindowCreate: Integer; virtual; abstract;
     52    function GetWindowCanvas(WindowId: Integer): Integer; virtual; abstract;
     53    procedure WindowSetAttr(WindowId: Integer; Bounds: TRectangle; Visible: Boolean); virtual; abstract;
    5554  end;
    5655
     
    166165end;
    167166
    168 { TKernelApi }
    169 
    170 function TKernelApi.Call(Command: TApiCommand; Data: Pointer
    171   ): Pointer;
    172 begin
    173   case Command of
    174     acDrawLine: DrawLine(TDrawLineParams(Data^).CanvasId, TDrawLineParams(Data^).P1,
    175       TDrawLineParams(Data^).P2, TDrawLineParams(Data^).Color);
    176     acDrawRect: DrawRect(TDrawRectParams(Data^).CanvasId, TDrawRectParams(Data^).Rect,
    177       TDrawRectParams(Data^).Color);
    178     acDrawFrame: DrawFrame(TDrawRectParams(Data^).CanvasId, TDrawRectParams(Data^).Rect,
    179       TDrawRectParams(Data^).Color);
    180     acDrawText: DrawText(TDrawTextParams(Data^).CanvasId, TDrawTextParams(Data^).P,
    181       TDrawTextParams(Data^).Text, TDrawTextParams(Data^).Color);
    182     acSleep: Sleep(TDateTime(Data^));
    183     acWindowCreate: Result := Pointer(WindowCreate);
    184     acWindowSetAttr: WindowSetAttr(TWindowSetAttrParams(Data^).WindowId,
    185       TWindowSetAttrParams(Data^).Bounds, TWindowSetAttrParams(Data^).Visible);
    186     acWriteText: WriteText(string(Data));
    187     acReadMessage: ReadMessage(Data);
    188     acGetWindowCanvas: Result := Pointer(GetWindowCanvas(Integer(Data)));
    189   end;
    190 end;
    191 
    192 procedure TKernelApi.WriteText(Text: string);
    193 var
    194   Device: TDeviceSerial;
    195 begin
    196   Device := TDeviceSerial(TKernel(Kernel).Devices.FindByName('Serial0'));
    197   if Assigned(Device) then begin
    198     Device.WriteText(Text);
    199   end else raise Exception.Create('Device Serial0 not found');
    200 end;
    201 
    202 procedure TKernelApi.DrawText(CanvasId: Integer; P: TPoint; Text: string; Color: TColor);
    203 var
    204   Screen: TScreen;
    205   Canvas: TCanvas;
    206 begin
    207   Canvas := TKernel(Kernel).Desktop.FindCanvasById(CanvasId);
    208   if Assigned(Canvas) then begin
    209     Canvas.DrawText(P, Text, Color);
    210   end;
    211 end;
    212 
    213 procedure TKernelApi.DrawLine(CanvasId: Integer; P1, P2: TPoint; Color: TColor);
    214 var
    215   Screen: TScreen;
    216   Canvas: TCanvas;
    217 begin
    218   Canvas := TKernel(Kernel).Desktop.FindCanvasById(CanvasId);
    219   if Assigned(Canvas) then begin
    220     Canvas.DrawLine(P1.Add(Canvas.Position), P2.Add(Canvas.Position), Color);
    221   end;
    222 end;
    223 
    224 procedure TKernelApi.DrawRect(CanvasId: Integer; Rect: TRectangle; Color: TColor);
    225 var
    226   Canvas: TCanvas;
    227 begin
    228   Canvas := TKernel(Kernel).Desktop.FindCanvasById(CanvasId);
    229   if Assigned(Canvas) then begin
    230     Canvas.DrawRect(Rect, Color);
    231   end;
    232 end;
    233 
    234 procedure TKernelApi.DrawFrame(CanvasId: Integer; Rect: TRectangle;
    235   Color: TColor);
    236 var
    237   Canvas: TCanvas;
    238 begin
    239   Canvas := TKernel(Kernel).Desktop.FindCanvasById(CanvasId);
    240   if Assigned(Canvas) then begin
    241     Canvas.DrawFrame(Rect, Color);
    242   end;
    243 end;
    244 
    245 procedure TKernelApi.Sleep(Time: TDateTime);
    246 var
    247   Task: TTask;
    248 begin
    249   Task := TKernel(Kernel).Scheduler.GetCurrentTask;
    250   Task.Sleep(Time);
    251 end;
    252 
    253 procedure TKernelApi.ReadMessage(Message: TIPCMessage);
    254 var
    255   Task: TTask;
    256 begin
    257   Task := TKernel(Kernel).Scheduler.GetCurrentTask;
    258   while Task.Messages.List.Count = 0 do Task.WaitForMessage;
    259 end;
    260 
    261 function TKernelApi.WindowCreate: Integer;
    262 var
    263   Window: TWindow;
    264 begin
    265   Window := TKernel(Kernel).Desktop.CreateWindow;
    266   Window.Desktop := TKernel(Kernel).Desktop;
    267   Result := Window.Id;
    268 end;
    269 
    270 function TKernelApi.GetWindowCanvas(WindowId: Integer): Integer;
    271 var
    272   Window: TWindow;
    273   Canvas: TCanvas;
    274 begin
    275   Window := TWindow(TKernel(Kernel).Desktop.FindObjectById(WindowId));
    276   if Assigned(Window) then begin
    277     Canvas := Window.Canvas;
    278     Result := Canvas.Id;
    279   end else Result := -1;
    280 end;
    281 
    282 procedure TKernelApi.WindowSetAttr(WindowId: Integer; Bounds: TRectangle; Visible: Boolean);
    283 var
    284   Window: TWindow;
    285 begin
    286   Window := TWindow(TKernel(Kernel).Desktop.FindObjectById(WindowId));
    287   if Assigned(Window) then begin
    288     Window.Bounds := Bounds;
    289     Window.Canvas.Position := Bounds.Position;
    290     Window.Visible := Visible;
    291     Window.Desktop.Paint;
    292   end;
    293 end;
    294 
    295 
    296167end.
    297168
Note: See TracChangeset for help on using the changeset viewer.