unit comUSB; {$mode objfpc}{$H+} interface uses Classes, SysUtils, crt,serial; function getserialport:longint; procedure initUSB(shandler:longint); procedure closeUSB; function startUSB:longint; function getUSB(t:longint):string; procedure sendUSB(s:string); var device:string; implementation uses mainunit; var serialhandler : LongInt; Parity : TParityType; { TParityType = (NoneParity, OddParity, EvenParity); } StopBits : Integer; Flags : TSerialFlags; { TSerialFlags = set of (RtsCtsFlowControl); } 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 getpeltier:longint; var s:string; begin Flags:= [ ]; // None SerSetParams(serialhandler,115200,8,NoneParity,1,Flags); initUSB(serialhandler); sendUSB('RESET'); sleep(3000); s:=getUSB(10000); //writeln(s); if pos('Peltier',s)<>0 then begin //Writeln(s); s:=getUSB(5000); getpeltier:=0; paramout; exit; end; closeUSB; getpeltier:=-1; end; function ss(dev:string):longint; begin serialhandler:=SerOpen(dev); if serialhandler>0 then if getpeltier=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:='COM4'; {$endif} getserialport:=ss(dev); if getserialport>0 then exit; {$ifdef Linux} dev:='/dev/ttyACM2'; {$else} dev:='COM5'; {$endif} getserialport:=ss(dev); if getserialport>0 then exit; {$ifdef Linux} dev:='/dev/ttyACM3'; {$else} dev:='COM6'; {$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.