unit comUSB; {$mode objfpc}{$H+} interface uses Classes, SysUtils, crt,serial,mainunit; function getserialport:longint; procedure initUSB(shandler:longint); procedure closeUSB; function startUSB:longint; function getUSB(t:longint):string; procedure sendUSB(s:string); Function readparam(s:string):longint; var device:string; implementation var serialhandler : LongInt; Parity : TParityType; { TParityType = (NoneParity, OddParity, EvenParity); } StopBits : Integer; Flags : TSerialFlags; { TSerialFlags = set of (RtsCtsFlowControl); } Function readparam(s:string):longint; var f:text; Info : TSearchRec; v:double; begin {$I-} {If FindFirst(s,faAnyFile,Info)<>0 then begin readparam:=-1; exit; end; ioresult; assign(f,s); reset(f); readln(f,v);} if version=1 then R:=7.02 else R:=4.6; // close(f); {$I+} readparam:=ioresult; end; function getUSB(t:longint):string; var s:String=' '; status:longint=0; x:String; i:longint=0; ss:byte; begin getUSB:=''; if serialhandler<0 then exit; while (Length(x)<50) and (status>=0) do begin status:= SerRead(serialhandler, ss, 1); if status=0 then begin sleep(1); inc(i); end; if (ss=10) then status:=-1; if (status>0) then begin i:=0; if ss<>13 then x:=x+chr(ss); end; if i>t then begin getUSB:='timeout'; exit; end; end; getUSB:=x; end; procedure sendUSB(s:string); var writecount:longint; status:longint; ss:string; begin writecount := length(s)+1; ss:=s+chr(10); status := SerWrite(serialhandler, ss[1], writecount ); end; procedure initUSB(shandler:longint); var status:longint=0; x:String; i:longint; ss:byte; begin sleep(1000); while (Length(x)<2000) and (status>=0) do begin status:= SerRead(shandler, ss, 1); if status=0 then begin sleep(1); inc(i); end; //if (status>0) then writeln(ss); if (status>0) then x:=x+chr(ss); if i>1000 then begin exit; end; end; end; function getsusceptibility:longint; var s:string; begin Flags:= [ ]; // None SerSetParams(serialhandler,115200,8,NoneParity,1,Flags); initUSB(serialhandler); sendUSB('RESET'); sleep(2000); s:=getUSB(100000); writeln(s); if pos('Calori',s)<>0 then begin //Writeln(s); if pos('2',s)<>0 then version:=2; s:=getUSB(5000); //Writeln(s); getsusceptibility:=0; readparam(''); paramout; exit; end; closeUSB; getsusceptibility:=-1; end; function ss(dev:string):longint; begin serialhandler:=SerOpen(dev); if serialhandler>0 then if getsusceptibility=0 then begin device:=dev; ss:=serialhandler; exit; end; ss:=-1; end; function getserialport:longint; var s:string; dev:string; begin {$ifdef Linux} dev:='/dev/ttyACM0'; {$else} dev:='COM3'; {$endif} getserialport:=ss(dev); if getserialport>0 then exit; {$ifdef Linux} dev:='/dev/ttyACM1'; {$else} dev:='COM2'; {$endif} getserialport:=ss(dev); if getserialport>0 then exit; {$ifdef Linux} dev:='/dev/ttyACM2'; {$else} dev:='COM1'; {$endif} getserialport:=ss(dev); if getserialport>0 then exit; {$ifdef Linux} dev:='/dev/ttyACM3'; {$else} dev:='COM4'; {$endif} getserialport:=ss(dev); if getserialport>0 then exit; getserialport:=-1; end; function startUSB:longint; var s:string; begin if getserialport<0 then begin startUSB:=-1; exit; end; startUSB:=0; end; procedure closeUSB; begin SerSync(serialhandler); { flush out any remaining before closure } SerFlushOutput(serialhandler); { discard any remaining output } SerClose(serialhandler); end; end.