Фрагмент объекта "КЛАВИТУРА", отвечающий за программное стробирование

Подобная структура, написанная для Delphi используется в редакторе swe




(*--------------------------------------------*)
(* Блок определений для системы стробирования *)
(*--------------------------------------------*)

const kbMStrobPhase  = 5;  (* вообще-то 3 достаточно *)
      kbMStrobScenar = 7;

type TkbStrobPhase = record   (* фаза "сценария стробирования" *)
       aDelay  : byte;        (* задержка (в мс)               *)
       NRep    : byte;        (* число повторений фазы         *)
     end;

     TStrobScenario  = array[0..kbMStrobPhase]  of TKbStrobPhase;
     TAStrobScenario = array[0..kbMStrobScenar] of TStrobScenario;

(*----------------------------------------------------------------------*)
(* Фрагмент объекта "Клавиатура", описывающий программное стробирование *)
(*----------------------------------------------------------------------*)

type
  TKeyb = Class(TObject)

  if Keyb.LastKey <> 0 then begin

  (* ................ *)

  (* глобальные переменные, запоминаемые между вызовами    *)
    LastKey    : word;    (* код клавиши в "нашем" формате *)
    LastKeyDown: word;    (* в формате Form.KeyDown        *)
    LastFun    : char;    (* последняя ф-ия                *)
    LastStb    : byte;    (* схема стробирования           *)
  
  (* УПРАВЛЕНИЕ СТРОБИРОВАНИЕМ *)
    QSWStrob   : boolean; (* Строб уже был ?          *)
    Delay0     : integer; (* интервалы для            *)
    Delay1     : integer; (*  "мягкого" стробирования *)

    IStrobScen : byte;
    StrobLevel : byte;
    IStrobRep  : byte;
    Strobs     : TAStrobScenario;

  (* ................ *)

procedure StrobsInit;                       (* определение сценариев *)
procedure StrobsReset(IStrobScen0:integer); (* загрузка сценария   *)
procedure StrobStep;                        (* шаг сценария        *)
procedure StrobsNextLevel(I0:integer);      (* уровень I0 сценария *)

  end;   (* TKeyb *)


implementation

uses UClock; (* главные часы программы *)

procedure TKeyb.StrobsInit;
begin
  (* ввод символов *)
  Strobs[0,0].ADelay := 192;   Strobs[0,0].NRep :=   1;
  Strobs[0,1].ADelay :=  24;   Strobs[0,1].NRep :=   5;
  Strobs[0,2].ADelay :=  12;   Strobs[0,2].NRep := 255;

  (* движение курсора *)
  Strobs[1,0].ADelay :=  96;   Strobs[1,0].NRep :=   1;
  Strobs[1,1].ADelay :=  24;   Strobs[1,1].NRep :=   3;
  Strobs[1,2].ADelay :=  12;   Strobs[1,2].NRep :=   5;
  Strobs[1,3].ADelay :=   8;   Strobs[1,3].NRep :=   8;
  Strobs[1,4].ADelay :=   3;   Strobs[1,4].NRep := 255;

  (* Enter, Esc и т.п. - однократные действия *)
  Strobs[2,0].ADelay := 255;   Strobs[2,0].NRep := 255;
end;


procedure TKeyb.StrobsNextLevel(I0:integer); (* смена "фазы" сценария стробирования *)
begin
  StrobLevel := I0;
  IStrobRep := Strobs[IStrobScen,StrobLevel].NRep; (* ск.раз повторять   *)
  Delay0 := Strobs[IStrobScen,StrobLevel].aDelay;  (* задержка шага      *)
  if Delay0 < 255 then tmKeyb.AlArm(Delay0)        (* загрузим её в часы *)
                  else tmKeyb.AlArm($7FFFFFFF);    (* бесконечная задержка *)
end;

procedure TKeyb.StrobsReset(IStrobScen0:integer);  (* загрузка сценария *)
begin
  IStrobScen := IStrobScen0;
  StrobsNextLevel(0);
end;

procedure TKeyb.StrobStep;                        (* шаг сценария *)
begin
  if IStrobRep = 255 then Exit; (* т.е. далее повторяем до бесконечности *)
  dec(IStrobRep);
  if (IStrobRep <= 0) then begin   (* переходим на следующий шаг сценария *)
    if StrobLevel < kbMStrobPhase
      then StrobsNextLevel(StrobLevel+1)
      else IStrobRep := 255;  (* обеспечивает зацикливание *)
  end;
end;

(* ................ *)



Вернуться к теме программное стробирование
Вернуться к теме проект редактора SWE

(с) Можаровский С.Г. // mailto:mozharovskys@mail.ru // swHome page