source: trunk/Forms/FormMain.pas

Last change on this file was 60, checked in by chronos, 6 weeks ago
  • Modified: Remove U prefix from unit names.
File size: 7.0 KB
Line 
1unit FormMain;
2
3interface
4
5uses
6 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
7 ExtCtrls, Menus, ActnList, Kernel.Core, Kernel.Memory, Kernel.Device,
8 PlatformBase, LCLType, Kernel.Graphics, GraphType;
9
10type
11
12 { TFormMain }
13
14 TFormMain = class(TForm)
15 AShowTerminal: TAction;
16 AExit: TAction;
17 AFullscreen: TAction;
18 ActionList1: TActionList;
19 MainMenu1: TMainMenu;
20 MenuItem1: TMenuItem;
21 MenuItem2: TMenuItem;
22 MenuItem3: TMenuItem;
23 MenuItem4: TMenuItem;
24 PaintBox1: TPaintBox;
25 Timer1: TTimer;
26 procedure AExitExecute(Sender: TObject);
27 procedure AFullscreenExecute(Sender: TObject);
28 procedure AShowTerminalExecute(Sender: TObject);
29 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
30 procedure FormCreate(Sender: TObject);
31 procedure FormDestroy(Sender: TObject);
32 procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
33 procedure FormShow(Sender: TObject);
34 procedure PaintBox1Click(Sender: TObject);
35 procedure PaintBox1Paint(Sender: TObject);
36 procedure PaintBox1Resize(Sender: TObject);
37 procedure Timer1Timer(Sender: TObject);
38 private
39 TempBitmap: TBitmap;
40 RedrawPending: Boolean;
41 VideoDevice: TDeviceVideoBase;
42 SerialDevice: TBaseSerialDevice;
43 SerialText: string;
44 OriginalBounds: TRect;
45 OriginalWindowState: TWindowState;
46 ScreenBounds: TRect;
47 procedure SerialDeviceReceiveDataSync;
48 procedure SerialDeviceReceiveData(Text: string);
49 procedure VideoDeviceRedraw(Sender: TObject);
50 procedure VideoDeviceRedrawSync;
51 procedure SwitchFullScreen;
52 public
53 Kernel: TKernel;
54 procedure EraseBackground(DC: HDC); override;
55 end;
56
57var
58 FormMain: TFormMain;
59
60
61implementation
62
63uses
64 Kernel.List, Kernel.App, Kernel.API, Clock, ThreadEx, FormTerminal;
65
66{$R *.lfm}
67
68{ TFormMain }
69
70procedure TFormMain.FormCreate(Sender: TObject);
71var
72 NewApp: TApp;
73 NewApp2: TApp;
74begin
75 TempBitmap := TBitmap.Create;
76 PaintBox1.ControlStyle := PaintBox1.ControlStyle + [csOpaque];
77
78 Kernel := TKernel.Create;
79 Kernel.SchedulerClass := TBaseScheduler;
80 Kernel.FileSystemClass := TBaseFileSystem;
81
82 SerialDevice := TBaseSerialDevice.Create;
83 SerialDevice.Name := 'Serial0';
84 SerialDevice.ClassName := 'Serial port';
85 SerialDevice.OnReceiveData := SerialDeviceReceiveData;
86 Kernel.Devices.Add(SerialDevice);
87
88 VideoDevice := TDeviceVideoBase.Create;
89 VideoDevice.Name := 'Video0';
90 VideoDevice.ClassName := 'Graphic card';
91 VideoDevice.OnRedraw := VideoDeviceRedraw;
92 VideoDevice.DPI := Screen.PixelsPerInch;
93 VideoDevice.OnModeChanged := VideoDeviceRedraw;
94 PaintBox1Resize(Self);
95 Kernel.Devices.Add(VideoDevice);
96
97 NewApp := TAppClock.Create;
98 Kernel.Apps.Add(NewApp);
99
100 NewApp2 := TAppClock2.Create;
101 Kernel.Apps.Add(NewApp2);
102end;
103
104procedure TFormMain.AExitExecute(Sender: TObject);
105begin
106 Close;
107end;
108
109procedure TFormMain.AFullscreenExecute(Sender: TObject);
110begin
111 SwitchFullScreen;
112{ AFullscreen.Checked := not AFullscreen.Checked;
113 if AFullscreen.Checked then begin
114 WindowState := wsFullScreen;
115 BorderStyle := bsNone;
116 end else begin
117 BorderStyle := bsSingle;
118 WindowState := wsNormal;
119 end;
120 }
121end;
122
123procedure TFormMain.AShowTerminalExecute(Sender: TObject);
124begin
125 FormTerminal.FormTerminal.Show;
126end;
127
128procedure TFormMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
129begin
130 Kernel.Terminate;
131end;
132
133procedure TFormMain.SwitchFullScreen;
134begin
135 if WindowState <> wsFullScreen then begin
136 // To full screen
137 OriginalWindowState := WindowState;
138 OriginalBounds := BoundsRect;
139
140 WindowState := wsFullScreen;
141 end else begin
142 // From full screen
143 WindowState := OriginalWindowState;
144 BoundsRect := OriginalBounds;
145 {$IFDEF MSWINDOWS}
146 BorderStyle := bsSizeable;
147 {$ENDIF}
148 if OriginalWindowState = wsMaximized then
149 WindowState := wsMaximized
150 else
151 with OriginalBounds do
152 SetBounds(Left, Top, Right - Left, Bottom - Top) ;
153 {$IFDEF LINUX}
154 BorderStyle := bsSizeable;
155 {$ENDIF}
156 end;
157end;
158
159procedure TFormMain.EraseBackground(DC: HDC);
160begin
161 //inherited EraseBackground(DC);
162end;
163
164procedure TFormMain.FormDestroy(Sender: TObject);
165begin
166 FreeAndNil(Kernel);
167 FreeAndNil(TempBitmap);
168end;
169
170procedure TFormMain.FormKeyDown(Sender: TObject; var Key: Word;
171 Shift: TShiftState);
172begin
173
174end;
175
176procedure TFormMain.FormShow(Sender: TObject);
177begin
178 Kernel.Run;
179end;
180
181procedure TFormMain.PaintBox1Click(Sender: TObject);
182begin
183
184end;
185
186procedure TFormMain.PaintBox1Paint(Sender: TObject);
187var
188 X, Y: Integer;
189 SourceBytePerPixel: Integer;
190 SourceBytePerLine: Integer;
191 SourcePixelPtr: PByte;
192 SourcePixelRowPtr: PByte;
193 RawImage: TRawImage;
194 DestPixelRowPtr: PByte;
195 DestPixelPtr: PByte;
196 DestBytePerPixel: Integer;
197 DestBytePerLine: Integer;
198 SizeX: Integer;
199 SizeY: Integer;
200begin
201 try
202 TempBitmap.SetSize(VideoDevice.VideoMode.Size.X, VideoDevice.VideoMode.Size.Y);
203 TempBitmap.BeginUpdate;
204 RawImage := TempBitmap.RawImage;
205 DestPixelRowPtr := RawImage.Data;
206 DestBytePerPixel := RawImage.Description.BitsPerPixel div 8;
207 DestBytePerLine := RawImage.Description.BytesPerLine;
208 VideoDevice.Lock.Acquire;
209 if Assigned(VideoDevice.VideoMemory) then begin
210 SourceBytePerPixel := VideoDevice.VideoMode.GetBytesPerPixel;
211 SourceBytePerLine := VideoDevice.VideoMode.GetBytesPerLine;
212 SourcePixelRowPtr := VideoDevice.VideoMemory;
213 SizeX := VideoDevice.VideoMode.Size.X;
214 SizeY := VideoDevice.VideoMode.Size.Y;
215 for Y := 0 to SizeY - 1 do begin
216 SourcePixelPtr := SourcePixelRowPtr;
217 DestPixelPtr := DestPixelRowPtr;
218 for X := 0 to SizeX - 1 do begin
219 PInteger(DestPixelPtr)^ := PInteger(SourcePixelPtr)^ and $ffffff;
220 Inc(SourcePixelPtr, SourceBytePerPixel);
221 Inc(DestPixelPtr, DestBytePerPixel);
222 end;
223 Inc(SourcePixelRowPtr, SourceBytePerLine);
224 Inc(DestPixelRowPtr, DestBytePerLine);
225 end;
226 end;
227 VideoDevice.Lock.Release;
228 finally
229 TempBitmap.EndUpdate;
230 PaintBox1.Canvas.Draw(0, 0, TempBitmap);
231 end;
232end;
233
234procedure TFormMain.PaintBox1Resize(Sender: TObject);
235var
236 VideoMode: TVideoMode;
237begin
238 VideoMode := TVideoMode.Create;
239 VideoMode.Assign(VideoDevice.VideoMode);
240 VideoMode.Size := TPoint.Create(Width, Height);
241 VideoDevice.VideoMode := VideoMode;
242 VideoMode.Free;
243end;
244
245procedure TFormMain.Timer1Timer(Sender: TObject);
246begin
247 if RedrawPending then begin
248 PaintBox1.Refresh;
249 RedrawPending := False;
250 end;
251end;
252
253procedure TFormMain.SerialDeviceReceiveDataSync;
254begin
255 FormTerminal.FormTerminal.Memo1.Lines.AddText(SerialText);
256end;
257
258procedure TFormMain.SerialDeviceReceiveData(Text: string);
259begin
260 SerialText := Text;
261 TThreadEx.Synchronize(TThreadEx.CurrentThread, SerialDeviceReceiveDataSync);
262end;
263
264procedure TFormMain.VideoDeviceRedraw(Sender: TObject);
265begin
266 TThreadEx.Synchronize(TThreadEx.CurrentThread, VideoDeviceRedrawSync);
267end;
268
269procedure TFormMain.VideoDeviceRedrawSync;
270begin
271 RedrawPending := True;
272end;
273
274end.
275
Note: See TracBrowser for help on using the repository browser.