Тема: Вывод отладочных сообщений в консоль вместо приложения BOARD
В примитивном случае всё очень просто:
program ConBoard;
uses
KolibriOS, CRT;
const
CON_WINDOW_CLOSED = $200;
var
Ch: Byte;
begin
InitConsole('CONBOARD');
repeat
if DebugRead(Ch) = 1 then
Write(AnsiChar(Ch));
until LongBool(ConsoleInterface.GetFlags and CON_WINDOW_CLOSED);
end.
Для чтения байта из системного буфера для отладочных сообщений используется функция DebugRead, если буфер не пуст и байт был прочитан, то функция возвращает значение 1.
Эта конструкция
LongBool(ConsoleInterface.GetFlags and CON_WINDOW_CLOSED
используется для определения, закрыто ли уже окно консоли, или ещё нет(обычно по нажатию кнопки с крестиком в правом углу окна).
Но нам бы хотелось также фильтровать сообщения по отправителю, записывать данные в файл, также неплохо было бы выводить время получения(или хотя бы вывода) сообщения.
Приложение BOARD фильтрует по Kernel(префикс 'K :') и User, но мы будем также учитывать и сообщения от приложения Launcher(префикс 'L: ').
Суть фильтрации в подсвечивании сообщений от разных отправителей разными цветами.
А вот исходный код более функционального приложения
program ConBoard;
uses
KolibriOS, CRT;
const
CommandLine = PPAnsiChar(28);
CON_WINDOW_CLOSED = $200;
var
LogFilePath: PAnsiChar = '/tmp0/1/BOARDLOG.TXT';
var
Ch: Byte;
Prefix: array[0..3] of AnsiChar = #0#0#0#0;
PrefixIndex: LongWord = 0;
IsStartLine: Boolean = True;
FA: TFileAttributes;
BytesWritten: LongWord;
begin
if CommandLine^[0] <> #0 then
LogFilePath := CommandLine^;
InitConsole('CONBOARD');
repeat
if DebugRead(Ch) = 1 then
begin
if IsStartLine then
begin
Prefix[PrefixIndex] := AnsiChar(Ch);
if PrefixIndex = High(Prefix) - 1 then
begin
// Kernel
if (Prefix[0] = 'K') and (Prefix[1] = ' ') and (Prefix[2] = ':') then
TextColor(Yellow)
else
// Launcher
if (Prefix[0] = 'L') and (Prefix[1] = ':') and (Prefix[2] = ' ') then
TextColor(White)
else
TextColor(LightGray);
IsStartLine := False;
PrefixIndex := Low(Prefix);
with GetSystemTime do
ConsoleInterface.PrintF('[%02x:%02x:%02x] ', Hours, Minutes, Seconds);
Write(Prefix);
Prefix := #0#0#0#0;
end
else
Inc(PrefixIndex);
end
else
begin
Write(AnsiChar(Ch));
if Ch = 10 then
begin
IsStartLine := True;
TextColor(LightGray);
end;
end;
if GetFileAttributes(LogFilePath, FA) = 5{not found} then
CreateFile(LogFilePath);
WriteFile(LogFilePath, Ch, SizeOf(Ch), FA.Size, BytesWritten);
end;
until LongBool(ConsoleInterface.GetFlags and CON_WINDOW_CLOSED);
end.
Вот так оно выглядитТакже лог сохраняется как обычно в файл BOARDLOG.TXT на tmp-диске, который можно потом открыть, например, в Tinypad(как на скриншоте)
Прикладываю скомпилированное приложение CONBOARD.KEX