//21.03.2022 663-CSdemoW2 Демо работы с CS_DLL.DLL - запись файла.
//Параметр: имяФайлаЦХ
//Требуется доступ к CS_DLL.DLL
//
  
program CSdemoW2;

{$R krym52!.res}

{$APPTYPE CONSOLE}

uses
  Windows,SysUtils;

type
  ICyclickStorage=interface(IInterface)
    function ConnectToCS(sFile:PChar;sMutex:PChar;TimeOut:integer;bWrite:Boolean):integer;stdcall;
    function DisconnectCS:integer;stdcall;
    function GetCSHead:pointer;stdcall;
    function GetHeadTail(var iHead:integer;var iTail:integer):integer;stdcall;
    function NormalizeIndex(i:integer):integer;stdcall;
    function BeginWrite:integer;stdcall;
    function EndWrite(t:TDateTime;nLen:integer):integer;stdcall;
    function Write(var buf;nBufSize:integer):integer;stdcall;
    function WriteFile(t:TDateTime;sFile:PChar):integer;stdcall;
    function Read(i:integer;var buf):integer;stdcall;
    function Read2(i:integer;var buf;ofs,len:integer):integer;stdcall;
    function GetRHead(i:integer;var t:TDateTime;var n:integer):Boolean;stdcall;
    function GetT(i:integer):TDateTime;stdcall;
    function Dicho(t:TDateTime;iHead,iTail,iMode:integer):integer;stdcall;
  end;  //ICyclickStorage

function CreateCSobj:ICyclickStorage;stdcall; external 'CySt_DLL.dll';

const
  m=3;  //число кадров

var
  iJPG:integer;
  cs:ICyclickStorage; //ЦХ
  s:string;
  i,j,n:integer;
  tCycle:double=5.0/86400;  //5сек - цикл сбора данных
  t:TDateTime;  //время начала цикла
  nLen:integer; //объем данных

begin
  WriteLn('krym52.ru');
  Sleep(3000);
  if ParamCount = 0 then
    begin
    WriteLn('Needs in 1 param: CyclicStorageFileName');
    Sleep(5000);
    exit;
    end;
  s:='CSdemoW2 стартовал. Нажать ESC для завершения';
  AnsiToOem(PChar(s),PChar(s));
  WriteLn(s);
  cs:=CreateCSobj;
  if cs = nil then
    begin
    WriteLn('Changed CySt_DLL.dll. Check it with antivirus.');
    Sleep(5000);
    exit;
    end;
  cs.ConnectToCS(PChar(ParamStr(1)),'CSdemoMutex2',10000,true);
  s:=#9'ЦХ: ';
  AnsiToOem(PChar(s),PChar(s));
  WriteLn(s,ParamStr(1));
//Снимки в ЦХ
  t:=Now;
  iJPG:=0;
  repeat
    s:=IntToStr(iJPG+1)+'.JPG'; //получаемые снимки
    cs.WriteFile(t,PChar(s));
    iJPG:=(iJPG+1)mod m;
    t:=t+tCycle;
    while Now < t do
      Sleep(1);
    DateTimeToString(s,'hh:nn:ss.zzz',Now);
    Write(s+#9);
    DateTimeToString(s,'hh:nn:ss.zzz',t);
    WriteLn(s);
  until GetAsyncKeyState(VK_ESCAPE) <> 0; //Нажато ESC

  cs.GetHeadTail(i,j);
  WriteLn('Head=',i,' Tail=',j);
  cs.DisconnectCS;
  WriteLn('CSdemoW2 completed');
  Sleep(5000);
end.
