unit main; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Spin, EditBtn, Buttons, CustomDrawnControls, ExtCtrls, RTTICtrls, TAGraph, TATransformations, TASeries, CustomDrawn_Common, Printers, TAChartUtils, PrintersDlgs,Process, TADrawUtils, TATools, TAchartprint, Types, LazFileUtils, LazUTF8, //LCLType, Dos {$ifdef unix} ,BaseUnix {$endif} ; type TDataThread = class(TThread) private fStatusText: string; procedure ShowStatus; protected procedure Execute; override; public constructor Create(CreateSuspended: boolean); end; { Tmainform } Tmainform = class(TForm) expertbutton: TCDButton; Chart1: TChart; pwdEdit: TEdit; message: TStaticText; progmessage: TStaticText; SelectDirectoryDialog: TSelectDirectoryDialog; Temp2maxEdit: TFloatSpinEdit; Temp2minEdit: TFloatSpinEdit; tempfout: TEdit; rateout: TEdit; powerout: TEdit; temp_q0LineSeries: TLineSeries; temp_q1LineSeries: TLineSeries; temp_q2LineSeries: TLineSeries; temp_q3LineSeries: TLineSeries; temp_temp1LineSeries: TLineSeries; temp_temppLineSeries: TLineSeries; Timer1: TTimer; Timer2: TTimer; time_q0LineSeries: TLineSeries; time_q1LineSeries: TLineSeries; time_q2LineSeries: TLineSeries; time_q3LineSeries: TLineSeries; time_temppLineSeries: TLineSeries; time_temp1LineSeries: TLineSeries; time_temp2LineSeries: TLineSeries; ChartConstantLine: TConstantLine; massEdit: TFloatSpinEdit; massbutton: TCDButton; temp2LinearAxisTrans: TLinearAxisTransform; NoSavebutton: TCDButton; Temp1LinearAxisTrans: TLinearAxisTransform; TemppLinearAxisTrans: TLinearAxisTransform; QLinearAxisTrans: TLinearAxisTransform; TimeLinearAxisTrans: TLinearAxisTransform; TimeTrans: TChartAxisTransformations; PrintDialog: TPrintDialog; qout: TEdit; Timer: TTimer; QTrans: TChartAxisTransformations; TemppTrans: TChartAxisTransformations; Temp1Trans: TChartAxisTransformations; temp2Trans: TChartAxisTransformations; Temppout: TEdit; Temp1out: TEdit; temp2out: TEdit; progout: TEdit; IdentEdit: TEdit; Timeout: TEdit; CommandEdit: TEdit; HeattoEdit: TFloatSpinEdit; temp2Abutton: TCDButton; TempAbutton: TCDButton; Xaxisbutton: TCDButton; TimeminEdit: TFloatSpinEdit; TimemaxEdit: TFloatSpinEdit; QminEdit: TFloatSpinEdit; QmaxEdit: TFloatSpinEdit; TemppminEdit: TFloatSpinEdit; TemppmaxEdit: TFloatSpinEdit; Temp1minEdit: TFloatSpinEdit; Temp1maxEdit: TFloatSpinEdit; //temp2minEdit: TFloatSpinEdit; Temp1button: TCDButton; temp2button: TCDButton; Timebutton: TCDButton; Qbutton: TCDButton; Temppbutton: TCDButton; Yaxisbutton: TCDButton; Quit: TCDButton; Image: TCDButton; Print: TCDButton; Killbutton: TCDButton; Savebutton: TCDButton; Nextbutton: TCDButton; Holdbutton: TCDButton; Startbutton: TCDButton; func: TCDButton; heatto: TCDButton; identifier: TCDButton; Calibrbutton: TCDButton; procedure calibrationClick(Sender: TObject); procedure CalibrbuttonClick(Sender: TObject); procedure CommandEditKeyPress(Sender: TObject; var Key: char); procedure expertbuttonClick(Sender: TObject); procedure HeattoEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure HoldbuttonClick(Sender: TObject); procedure IdentEditKeyPress(Sender: TObject; var Key: char); procedure ImageClick(Sender: TObject); procedure KillbuttonClick(Sender: TObject); procedure massEditKeyPress(Sender: TObject; var Key: char); procedure massEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure progmessageClick(Sender: TObject); procedure pwdEditChange(Sender: TObject); procedure pwdEditKeyPress(Sender: TObject; var Key: char); procedure QmaxEditChange(Sender: TObject); procedure Startbutton2Click(Sender: TObject); procedure temp2AbuttonClick(Sender: TObject); procedure temp2maxEditKeyPress(Sender: TObject; var Key: char); procedure temp2maxEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure temp2minEditKeyPress(Sender: TObject; var Key: char); procedure Temp2minEditKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure temp2minEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure NextbuttonClick(Sender: TObject); procedure NoSavebuttonClick(Sender: TObject); procedure PrintClick(Sender: TObject); procedure QbuttonMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure QmaxEditKeyPress(Sender: TObject; var Key: char); procedure QmaxEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure QminEditKeyPress(Sender: TObject; var Key: char); procedure QminEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure SavebuttonClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure funcClick(Sender: TObject); procedure heattoClick(Sender: TObject); procedure HeattoEditKeyPress(Sender: TObject; var Key: char); procedure QuitClick(Sender: TObject); procedure StartbuttonClick(Sender: TObject); procedure TempAbuttonClick(Sender: TObject); procedure Temp1maxEditKeyPress(Sender: TObject; var Key: char); procedure Temp1maxEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Temp1minEditKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Temp1minEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure TemppmaxEditKeyPress(Sender: TObject; var Key: char); procedure TemppmaxEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure TimebuttonMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure TimemaxEditKeyPress(Sender: TObject; var Key: char); procedure TimemaxEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure TimeminEditKeyPress(Sender: TObject; var Key: char); procedure TimeminEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure TemppminEditKeyPress(Sender: TObject; var Key: char); procedure TemppminEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Timer1Timer(Sender: TObject); procedure Timer2Timer(Sender: TObject); procedure TimerTimer(Sender: TObject); procedure XaxisbuttonClick(Sender: TObject); procedure YaxisbuttonClick(Sender: TObject); private public end; var mainform: Tmainform; procedure setxaxis; procedure setyaxis; procedure setbcolors; procedure settimemin; procedure settimemax; procedure setqmin; procedure setqmax; procedure settemppmin; procedure settemppmax; procedure settemp1min; procedure settemp1max; procedure settemp2min; procedure settemp2max; procedure startp; procedure xxset; implementation {$R *.lfm} { Tmainform } uses OSPrinters, TAPrint, variables,setfunc,calibration,communication,Start,fit; var DataThread : TDataThread; procedure getyaxispointer; var i:longint; begin if yaxispointer>4 then yaxispointer:=1; for i:=1 to 4 do begin if yaxis[yaxispointer] then exit; inc(yaxispointer); if yaxispointer=5 then begin yaxispointer:=1; exit; end; end end; procedure setxaxis; begin mainform.Chart1.AxisList[2].Visible:=false; mainform.Chart1.AxisList[3].Visible:=false; case xaxispointer of 1:mainform.Chart1.AxisList[2].Visible:=true; 2:mainform.Chart1.AxisList[3].Visible:=true; end; end; procedure setyaxis; begin getyaxispointer; mainform.Chart1.AxisList[4].Visible:=false; mainform.Chart1.AxisList[5].Visible:=false; mainform.Chart1.AxisList[6].Visible:=false; mainform.Chart1.AxisList[7].Visible:=false; case yaxispointer of 1:mainform.Chart1.AxisList[4].Visible:=true; 2:mainform.Chart1.AxisList[5].Visible:=true; 3:mainform.Chart1.AxisList[6].Visible:=true; 4:mainform.Chart1.AxisList[7].Visible:=true; end; end; procedure setbcolors; begin if yaxis[1] then mainform.qButton.color:=$0000CA00 else mainform.qButton.color:=clSilver; if yaxis[2] then mainform.temp1Button.color:=clred else mainform.temp1Button.color:=clSilver; if yaxis[3] then mainform.Temp2Button.color:=clFuchsia else mainform.temp2Button.color:=clSilver; if yaxis[4] then mainform.temppButton.color:=clAqua else mainform.temppButton.color:=clSilver; end; procedure setdraw; begin Mainform.Time_q0Lineseries.Active:=false; Mainform.Time_q1Lineseries.Active:=false; Mainform.Time_q2Lineseries.Active:=false; Mainform.Time_q3Lineseries.Active:=false; Mainform.Time_temppLineseries.Active:=false; Mainform.Time_temp1Lineseries.Active:=false; Mainform.Time_temp2Lineseries.Active:=false; Mainform.Temp_q0Lineseries.Active:=false; Mainform.Temp_q1Lineseries.Active:=false; Mainform.Temp_q2Lineseries.Active:=false; Mainform.Temp_q3Lineseries.Active:=false; Mainform.Temp_temppLineseries.Active:=false; Mainform.Temp_temp1Lineseries.Active:=false; Case xaxispointer of 1:begin Mainform.Time_q0Lineseries.Active:=Yaxis[1]; Mainform.Time_q1Lineseries.Active:=Yaxis[1]; Mainform.Time_q2Lineseries.Active:=Yaxis[1]; Mainform.Time_q3Lineseries.Active:=Yaxis[1]; Mainform.Time_temp1Lineseries.Active:=Yaxis[2]; Mainform.Time_temp2Lineseries.Active:=Yaxis[3]; Mainform.Time_temppLineseries.Active:=Yaxis[4]; end; 2:begin Mainform.temp_q0Lineseries.Active:=Yaxis[1]; Mainform.temp_q1Lineseries.Active:=Yaxis[1]; Mainform.temp_q2Lineseries.Active:=Yaxis[1]; Mainform.temp_q3Lineseries.Active:=Yaxis[1]; Mainform.temp_temp1Lineseries.Active:=Yaxis[3]; Mainform.temp_temppLineseries.Active:=Yaxis[4]; end; end; end; function q2_01(x:double):double; begin q2_01:=qscale*x+qoffset; if q2_011 then q2_01:=1; end; function tempp2_01(x:double):double; begin tempp2_01:=temppscale*x+temppoffset; if tempp2_01<0 then tempp2_01:=0; if tempp2_01>1 then tempp2_01:=1; end; function temp12_01(x:double):double; begin temp12_01:=temp1scale*x+temp1offset; if temp12_01<0 then temp12_01:=0; if temp12_01>1 then temp12_01:=1; end; function temp22_01(x:double):double; begin temp22_01:=temp2scale*x+temp2offset; if temp22_01<0 then temp22_01:=0; if temp22_01>1 then temp22_01:=1; end; function time2_01(x:double):double; begin time2_01:=timescale*x+timeoffset; if time2_01<0 then time2_01:=0; if time2_01>1 then time2_01:=1; end; constructor TDataThread.Create(CreateSuspended: boolean); begin FreeOnTerminate := True; inherited Create(CreateSuspended); end; procedure Tmainform.FormCreate(Sender: TObject); begin inits; connecting:=1; DataThread := TDataThread.Create(True); // With the True parameter it doesn't start automatically //if Assigned(DataThread.FatalException) then //raise DataThread.FatalException; DataThread.Start; end; procedure TDataThread.ShowStatus; begin Mainform.Caption := fStatusText; end; procedure TDataThread.Execute; {$ifdef linux} var Req,Rem : TimeSpec; commands:string; {$endif} begin datethreadid:=getthreadid; fStatusText := 'DTA Starting'; Synchronize(@Showstatus); sendonb:=true; if startUSB<>0 then begin connecterror:=1; connecting:=0; connect_error:=1; exit; end; connecting:=0; connecterror:=0; StartForm.Visible:=false; StartForm.Enabled:=false; fStatusText := 'DTA Running'; Synchronize(@Showstatus); createfifo; send_createfifo; command_createfifo; connecterror:=0; sendonb:=true; senddata(SUSB_READY,1); senddata(SSENDDATAOFF,0); senddata(SBACK,15); senddata(SPOWER,0); senddata(SHOLD, 1.0e8); senddata(SSENDDATAON,0); //writeln(filter); senddata(SFILTER,filter); senddata(SFILTERT,filtert); senddata(SSAVED,0); //senddata(STP0,0); senddata(SPOWER,1); datagetonb:=true; senddata(SSENDDATA,0); sendonb:=false; mainform.massedit.value:=mass; mainform.identedit.text:=ident; mainform.Timer1.Enabled:=true; setstudent; while (threadonb) do begin sleep(10); if connecterror=0 then begin datareadfromdevice; while senddata_out>0 do begin end; if command_dataavailable then begin command_readfifo(commands); sendcommand(commands); end; end; end; sendcommand('HRESET'); sleep(10); closeUSB; writeln('terminated'); end; procedure Add_draw(x:data_t;num:longint); begin case num of 0:begin Mainform.Time_q0Lineseries.AddXY(Time2_01(x.time),q2_01(x.q)); Mainform.Temp_q0Lineseries.AddXY(Tempp2_01(x.temp2),q2_01(x.q)); end; 1:begin Mainform.Time_q1Lineseries.AddXY(Time2_01(x.time),q2_01(x.q)); Mainform.Temp_q1Lineseries.AddXY(Tempp2_01(x.temp2),q2_01(x.q)); end; 2:begin Mainform.Time_q2Lineseries.AddXY(Time2_01(x.time),q2_01(x.q)); Mainform.Temp_q2Lineseries.AddXY(Tempp2_01(x.temp2),q2_01(x.q)); end; 3:begin Mainform.Time_q3Lineseries.AddXY(Time2_01(x.time),q2_01(x.q)); Mainform.Temp_q3Lineseries.AddXY(Tempp2_01(x.temp2),q2_01(x.q)); end; end; Mainform.Time_temppLineseries.AddXY(Time2_01(x.time),tempp2_01(x.tempp)); Mainform.Time_temp1Lineseries.AddXY(Time2_01(x.time),temp12_01(x.temp1)); Mainform.Time_temp2Lineseries.AddXY(Time2_01(x.time),temp22_01(x.temp2)); Mainform.Temp_temp1Lineseries.AddXY(Tempp2_01(x.temp2),temp12_01(x.temp1)); Mainform.Temp_temppLineseries.AddXY(Tempp2_01(x.temp2),temp22_01(x.tempp)); end; procedure redraw; var i:longint; begin if (datapt>1) then for i:=1 to datapt-1 do Add_draw(datat[i],repeatpointer); if repeatpointer>0 then begin for i:=1 to datap0-1 do begin Mainform.Time_q0Lineseries.AddXY(Time2_01(data0[i].time),q2_01(data0[i].q)); Mainform.Temp_q0Lineseries.AddXY(Tempp2_01(data0[i].tempp),q2_01(data0[i].q)); end; end; if repeatpointer>1 then begin for i:=1 to datap1-1 do begin Mainform.Time_q1Lineseries.AddXY(Time2_01(data1[i].time),q2_01(data1[i].q)); Mainform.Temp_q1Lineseries.AddXY(Tempp2_01(data1[i].tempp),q2_01(data1[i].q)); end; end; if repeatpointer>2 then begin for i:=1 to datap2-1 do begin Mainform.Time_q2Lineseries.AddXY(Time2_01(data2[i].time),q2_01(data2[i].q)); Mainform.Temp_q2Lineseries.AddXY(Tempp2_01(data2[i].tempp),q2_01(data2[i].q)); end; end; end; procedure cleandraw; var i:longint; begin mainform.ChartconstantLine.Position:=q2_01(0); Mainform.Time_q0Lineseries.clear; Mainform.Time_q1Lineseries.clear; Mainform.Time_q2Lineseries.clear; Mainform.Time_q3Lineseries.clear; Mainform.Time_temppLineseries.clear; Mainform.Time_temp1Lineseries.clear; Mainform.Time_temp2Lineseries.clear; Mainform.Temp_q0Lineseries.clear; Mainform.Temp_q1Lineseries.clear; Mainform.Temp_q2Lineseries.clear; Mainform.Temp_q3Lineseries.clear; Mainform.Temp_temp1Lineseries.clear; Mainform.Temp_temppLineseries.clear; redraw; end; procedure Tmainform.calibrationClick(Sender: TObject); begin if running then begin showmessage('Measure is on'); exit; end; if calibrationForm.visible then begin calibrationexit; end else begin calibrationform.aEdit.value:=tempzero; calibrationform.bEdit.value:=tempslope; calibrationform.dtEdit.value:=q0; calibrationform.paEdit.value:=pa; calibrationform.pbEdit.value:=pb; calibrationform.pcEdit.value:=pc; calibrationform.intEdit.value:=inttime; CalibrationForm.visible:=true; end; end; procedure Tmainform.CalibrbuttonClick(Sender: TObject); begin if running then begin showmessage('Measure is on'); exit; end; if calibrationForm.visible then begin calibrationexit; end else begin calibrationform.aEdit.value:=tempzero; calibrationform.bEdit.value:=tempslope; calibrationform.dtEdit.value:=q0; calibrationform.paEdit.value:=pa; calibrationform.pbEdit.value:=pb; calibrationform.pcEdit.value:=pc; calibrationform.intEdit.value:=inttime; calibrationform.dtfilterEdit.value:=filter; calibrationform.tfilterEdit.value:=filtert; mainform.calibrbutton.Color:=clRed; CalibrationForm.visible:=true; end; end; procedure Tmainform.CommandEditKeyPress(Sender: TObject; var Key: char); begin if byte(key)=13 then begin command_writefifo(Mainform.CommandEdit.Text); end; end; procedure Tmainform.expertbuttonClick(Sender: TObject); begin if mainform.expertbutton.Color=clRed then begin mainform.expertbutton.Color:=clSilver; mainform.commandedit.Visible:=false; student:=true; end else mainform.pwdEdit.visible:=true; end; procedure Tmainform.HoldbuttonClick(Sender: TObject); begin if running then begin showmessage('Measure is on'); exit; end; sendonb:=true; senddata(SSTOP,0); senddata(SHOLD,1e30); sendonb:=false; end; procedure Tmainform.IdentEditKeyPress(Sender: TObject; var Key: char); var ii:string; begin if byte(key)=13 then begin ii:=mainform.identedit.text; ident:=ii; end; end; procedure Tmainform.ImageClick(Sender: TObject); var year,month,day,dayw:word; hour,minute,second,sec100: word; Times,imagefile:String; begin {$I-} ioresult; getdate(year,month,day,dayw); gettime(hour,minute,second,sec100); times:=IntToStr(year)+'_'+IntToStr(month)+ '_'+IntToStr(day)+':'+IntToStr(hour)+'_'+IntToStr(minute)+'_'; imagefile:=imagedirectory+times+IntToStr(imagenum+1)+'_image.jpg'; inc(imagenum); ioresult; Mainform.Chart1.SaveToFile(TJPEGImage,imagefile); {$I+} end; procedure Tmainform.KillbuttonClick(Sender: TObject); begin saverequest:=false; measureon:=false; sendonb:=true; senddata(SFILL,0); senddata(SRATE,10/6e7); senddata(STO,20); senddata(SHOLD,1e30); senddata(SFINISH,0); senddata(SSTART,0); senddata(SSENDDATAON,0); //senddata(SBACK,20); sendonb:=false; mainform.Startbutton.color:=clAqua; mainform.Savebutton.color:=clAqua; running:=false; end; procedure Tmainform.massEditKeyPress(Sender: TObject; var Key: char); begin if byte(key)=13 then begin mass:=mainform.massedit.Value; end; end; procedure Tmainform.massEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin mass:=mainform.massedit.Value; end; procedure Tmainform.progmessageClick(Sender: TObject); begin end; procedure Tmainform.pwdEditChange(Sender: TObject); begin end; procedure Tmainform.pwdEditKeyPress(Sender: TObject; var Key: char); begin if byte(key)=13 then begin pwd:=mainform.pwdedit.Text; if pwd=DTApwd then begin student:=false; setstudent; mainform.commandedit.visible:=true; mainform.expertbutton.Color:=clRed; end; mainform.pwdedit.Text:=''; mainform.pwdedit.visible:=false; end; end; procedure Tmainform.QmaxEditChange(Sender: TObject); begin end; procedure Tmainform.Startbutton2Click(Sender: TObject); begin end; procedure startp; begin if not programload then begin showmessage('Error in program load'); exit; end; mainform.temp1maxedit.value:=maxtemp; mainform.temp1minedit.value:=mintemp; mainform.temppmaxedit.value:=maxtemp; mainform.temppminedit.value:=mintemp; mainform.temp2maxedit.value:=maxtemp; mainform.temp2minedit.value:=mintemp; settemp1max; settemp1min; settemp2max; settemp2min; settemppmax; settemppmin; mainform.TimemaxEdit.Value:=1500; mainform.TimeminEdit.Value:=0; settimemin; settimemax; setxaxis; setyaxis; running:=true; repeatpointer:=0; mainform.Startbutton.color:=clred; mainform.Startbutton.caption:='Stop'; datapt:=0; cleandraw; savenum:=0; sendonb:=true; senddata(SHOLD,1e30); senddata(SSTOP,0); senddata(SSTART,0); senddata(SSENDDATAON,0); sendonb:=false; programselected:=false; mainform.progmessage.Caption:='Program: '+programfile; end; procedure Tmainform.StartbuttonClick(Sender: TObject); begin if running then begin running:=false; mainform.Startbutton.color:=clAqua; mainform.Startbutton.caption:='Start'; senddata(SHOLD,1e30); senddata(SSTOP,0); exit; end; if calibrationForm.visible then begin showmessage('Calibration is on'); exit; end; if ProgForm.visible then begin rate:=progform.RateEdit.value; startingt:=progform.startingtEdit.value; finalt:=progform.finaltEdit.value; repeatnum:=progform.repeatnumEdit.value; mainform.func.Color:=clSilver; progform.Timer.enabled:=false; ProgForm.visible:=false; programselected:=false; end; if programselected then begin startp; end else begin ProgForm.Memo.Clear; fillproglist; ProgForm.Memo.Lines.LoadFromFile(programsdirectory+'/'+programfile); progform.RateEdit.value:=rate; progform.startingtEdit.value:=startingt; progform.finaltEdit.value:=finalt; progform.repeatnumEdit.value:=repeatnum; mainform.func.Color:=clRed; ProgForm.visible:=true; progform.Timer.enabled:=true; progForm.exitbutton.Caption:='Start'; startb:=true; end; end; procedure Tmainform.temp2AbuttonClick(Sender: TObject); begin if xaxispointer=2 then exit; yaxis[3]:= not yaxis[3]; setyaxis; setbcolors; setdraw; end; procedure settemp2max; begin temp2max:=mainform.temp2maxedit.value; mainform.temp2minedit.maxvalue:=temp2max+1e-6; temp2scale:=1.0/(temp2max-temp2min); temp2offset:=-temp2scale*temp2min; mainform.temp2LinearAxisTrans.Offset:=temp2offset; mainform.temp2LinearAxisTrans.scale:=temp2scale; end; procedure Tmainform.temp2maxEditKeyPress(Sender: TObject; var Key: char); begin if byte(key)=13 then begin settemp2max; cleandraw; end; end; procedure Tmainform.temp2maxEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if temp2max=mainform.temp2maxedit.value then exit; settemp2max; cleandraw; end; procedure settemp2min; begin temp2min:=mainform.temp2minedit.value; mainform.temp2maxedit.minvalue:=temp2min+1e-6; temp2scale:=1.0/(temp2max-temp2min); temp2offset:=-temp2scale*temp2min; mainform.temp2LinearAxisTrans.Offset:=temp2offset; mainform.temp2LinearAxisTrans.scale:=temp2scale; end; procedure Tmainform.temp2minEditKeyPress(Sender: TObject; var Key: char); begin if byte(key)=13 then begin settemp2min; cleandraw; end; end; procedure Tmainform.Temp2minEditKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if byte(key)=13 then begin settemp2min; cleandraw; end; end; procedure Tmainform.temp2minEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if temp2min=mainform.temp2minedit.value then exit; settemp2min; cleandraw end; procedure Tmainform.NextbuttonClick(Sender: TObject); begin if not running then exit; senddata(SNEXT,0); end; procedure setqmax; begin qmax:=mainform.qmaxedit.value; mainform.qminedit.maxvalue:=qmax+1e-6; qscale:=1.0/(qmax-qmin); qoffset:=-qscale*qmin; mainform.QLinearAxisTrans.Offset:=qoffset; mainform.QLinearAxisTrans.scale:=qscale; range:=qmax-qmin; end; procedure Tmainform.QmaxEditKeyPress(Sender: TObject; var Key: char); begin if byte(key)=13 then begin setqmax; cleandraw; end; end; procedure Tmainform.QmaxEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if qmax=mainform.qmaxedit.value then exit; setqmax; cleandraw; end; procedure setqmin; begin qmin:=mainform.qminedit.value; mainform.qmaxedit.minvalue:=qmin+1e-6; qscale:=1.0/(qmax-qmin); qoffset:=-qscale*qmin; mainform.QLinearAxisTrans.Offset:=qoffset; mainform.QLinearAxisTrans.scale:=qscale; range:=qmax-qmin; cleandraw; end; procedure Tmainform.QminEditKeyPress(Sender: TObject; var Key: char); begin if byte(key)=13 then begin setqmin; cleandraw; end; end; procedure Tmainform.QminEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if qmin=mainform.qminedit.value then exit; setqmin; cleandraw; end; procedure Tmainform.QbuttonMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var m,d:double; i:longint=0; begin m:=(mainform.qminedit.value+mainform.qmaxedit.value)/2; d:=(mainform.qmaxedit.value-mainform.qminedit.value)/2; if Button=mbLeft then d:=d/2.0; if Button=mbRight then d:=d*2.0; if qmin=0 then i:=1; if qmax=0 then i:=2; case i of 0:begin qmin:=m-d; qmax:=qmin+2*d; end; 1:begin qmax:=2*d; end; 2:begin qmin:=-2*d; end; end; mainform.qminedit.value:=qmin; mainform.qmaxedit.value:=qmax; setqmin; setqmax; cleandraw; end; function saveproc:longint; var fmer:text; i,j,io,id,ik,ii:longint; st,s,sst,sss:string; ss,times:string; qqq:data_t; year,month,day,dayw:word; hour,minute,second,sec100: word; modulationstr:string; name:string; begin {$I-} i:=ioresult; inc(savenum); name:=savefilename; if (repeatnum<>1) or autosave then name:=inttostr(savenum)+savefilename; getdate(year,month,day,dayw); gettime(hour,minute,second,sec100); str(year,st); times:=' Date: '+st; str(month,st); times:=times+st; str(day,st); times:=times+st+':'; str(hour,st); times:=times+st; str(minute,st); times:=times+st; assign(fmer,savedirectory+name); rewrite(fmer); writeln(fmer,'DTA measure'); str(savenum,st); writeln(fmer,name); writeln(fmer,ident+times); writeln(fmer,'Lower limit = '+floatTostrF(mintemp,ffFixed,10,1)+' C'); writeln(fmer,'Upper limit = '+floatTostrF(maxtemp,ffFixed,10,1)+' C'); writeln(fmer,'Rate = '+floatTostrF(rate_null,ffFixed,10,2)+' C/min'); writeln(fmer,'Mtime = '+floatTostrF(datat[datapt].time,ffFixed,10,2)+' s'); writeln(fmer,'Mass = '+floatTostrF(mass,ffFixed,10,3)+' mg'); if finalt>startingt then sst:='Heat' else sst:='Cool'; writeln(fmer,'data_number = '+inttostr(datapt-1)); sst:=' Time [s] dT [C] Temp_sample. [C] Temp_ref. [C] Temp_f. [C]'; writeln(fmer,sst); for i:=2 to datapt do begin writeln(fmer,datat[i].time:10:4,datat[i].q:10:4,datat[i].temp1:16:4,datat[i].temp2:16:4,datat[i].tempf:16:4); end; close(fmer); {$I+} saveproc:=ioresult; if saveproc=0 then begin savefileb:=false; if autosave then senddata(SNEXT,0); end else begin showmessage('Error saving file'); end; end; procedure Tmainform.SavebuttonClick(Sender: TObject); var SavedialogManual: TSavedIalog; begin if datapt=0 then exit; if not savefileb then exit; SavedialogManual:=TSavedialog.Create(nil); SavedialogManual.Initialdir:=savedirectory; if SaveDialogManual.execute then begin savedirectory:=SavedialogManual.Initialdir; savefilename:=copy(SaveDialogManual.FileName, savedirectory.Length+1,100); if saveproc<>0 then begin SavedialogManual.free; exit; end; end; mainform.savebutton.Color:=clAqua; mainform.nosavebutton.visible:=false; SavedialogManual.free; senddata(SNEXT,0); end; procedure Tmainform.NoSavebuttonClick(Sender: TObject); begin mainform.savebutton.Color:=clAqua; mainform.nosavebutton.visible:=false; senddata(SNEXT,0); end; procedure Tmainform.PrintClick(Sender: TObject); var r: TRect; d: Integer; begin if not Mainform.PrintDialog.Execute then exit; Printer.BeginDoc; try d:=Printer.XDPI div 2; r := Rect(0, 0, Printer.PageWidth-d, Printer.PageHeight div 2); Mainform.Chart1.Draw(TPrinterDrawer.Create(Printer, true), r); finally Printer.EndDoc; end; end; procedure Tmainform.funcClick(Sender: TObject); begin if running then begin showmessage('Measure is on'); exit; end; if not setfuncenabled then exit; if ProgForm.visible then begin rate:=progform.RateEdit.value; startingt:=progform.startingtEdit.value; finalt:=progform.finaltEdit.value; repeatnum:=progform.repeatnumEdit.value; mainform.func.Color:=clSilver; progform.Timer.enabled:=false; ProgForm.visible:=false; end else begin ProgForm.Memo.Clear; fillproglist; ProgForm.Memo.Lines.LoadFromFile(programsdirectory+programfile); progform.RateEdit.value:=rate; progform.startingtEdit.value:=startingt; progform.finaltEdit.value:=finalt; progform.repeatnumEdit.value:=repeatnum; mainform.func.Color:=clRed; ProgForm.visible:=true; progForm.exitbutton.Caption:='Exit'; progform.Timer.enabled:=true; end; end; procedure heattop; begin sendonb:=true; senddata(SFILL,0); senddata(SRATE,20/6e7); senddata(STO,mainform.heattoEdit.value); senddata(SHOLD,1e32); senddata(SFINISH,0); senddata(SSTART,0); senddata(SSENDDATAON,0); sendonb:=false; end; procedure Tmainform.heattoClick(Sender: TObject); begin if running then begin showmessage('Measure is on'); exit; end; heattop; end; procedure Tmainform.HeattoEditKeyPress(Sender: TObject; var Key: char); begin if running then exit; if byte(key)=13 then heattop; end; procedure Tmainform.HeattoEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if running then exit; heattop; end; procedure haltp; begin if running then begin showmessage('Measure is on'); exit; end; threadonb:=false; mainform.Timer1.Enabled:=false; mainform.Timer2.Enabled:=false; sleep(100); halt; end; procedure Tmainform.FormDestroy(Sender: TObject); begin haltp; end; procedure Tmainform.QuitClick(Sender: TObject); begin haltp; end; procedure Tmainform.TempAbuttonClick(Sender: TObject); begin yaxis[4]:= not yaxis[4]; setyaxis; setbcolors; setdraw; end; procedure settemp1max; begin temp1max:=mainform.temp1maxedit.value; mainform.temp1minedit.maxvalue:=temp1max+1e-6; temp1scale:=1.0/(temp1max-temp1min); temp1offset:=-temp1scale*temp1min; mainform.Temp1LinearAxisTrans.Offset:=temp1offset; mainform.Temp1LinearAxisTrans.scale:=temp1scale; end; procedure Tmainform.Temp1maxEditKeyPress(Sender: TObject; var Key: char); begin if byte(key)=13 then begin settemp1max; cleandraw; end; end; procedure Tmainform.Temp1maxEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if temp1max=mainform.temp1maxedit.value then exit; settemp1max; cleandraw; end; procedure settemp1min; begin temp1min:=mainform.temp1minedit.value; mainform.temp1maxedit.minvalue:=temp1min-1e-6; temp1scale:=1.0/(temp1max-temp1min); temp1offset:=-temp1scale*temp1min; mainform.Temp1LinearAxisTrans.Offset:=temp1offset; mainform.Temp1LinearAxisTrans.scale:=temp1scale; end; procedure Tmainform.Temp1minEditKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if byte(key)=13 then begin settemp1min; cleandraw; end; end; procedure Tmainform.Temp1minEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if temp1min=mainform.temp1minedit.value then exit; settemp1min; cleandraw; end; procedure settemppmin; begin temppmin:=mainform.temppminedit.value; mainform.temppmaxedit.minvalue:=temppmin-1e-6; temppscale:=1.0/(temppmax-temppmin); temppoffset:=-temppscale*temppmin; mainform.TemppLinearAxisTrans.Offset:=temppoffset; mainform.TemppLinearAxisTrans.scale:=temppscale; end; procedure Tmainform.TemppminEditKeyPress(Sender: TObject; var Key: char); begin if byte(key)=13 then begin settemppmin; cleandraw; end; end; procedure Tmainform.TemppminEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if temppmin=mainform.temppminedit.value then exit; settemppmin; cleandraw; end; procedure Tmainform.Timer1Timer(Sender: TObject); begin Timer1.Enabled:=false; Mainform.SelectDirectoryDialog.InitialDir:=studentpath+'measures'+bs; //writeln(studentpath+'measures'+bs); Mainform.SelectDirectoryDialog.Execute; savedirectory:=Mainform.SelectDirectoryDialog.FileName+bs; imagedirectory:=Mainform.SelectDirectoryDialog.FileName+bs; end; procedure Tmainform.Timer2Timer(Sender: TObject); begin Timer2.Enabled:=false; saveproc; end; procedure processcurdata; var param:longint; s:string; begin Mainform.Timeout.caption:=floatTostrF(curdata.time,ffFixed,10,1)+' s'; if curdata.q>100 then Mainform.qout.caption:='out'; if curdata.q<-100 then Mainform.qout.caption:='-out'; if (curdata.q<=100) and (curdata.q>=-100) then Mainform.qout.caption:=floatTostrF(curdata.q,ffFixed,10,2)+' °C'; Mainform.temppout.caption:=floatTostrF(curdata.tempp,ffFixed,10,2)+' °C'; Mainform.temp1out.caption:=floatTostrF(curdata.temp1,ffFixed,10,2)+' °C'; Mainform.temp2out.caption:=floatTostrF(curdata.temp2,ffFixed,10,2)+' °C'; Mainform.tempfout.caption:='T_f='+floatTostrF(curdata.tempf,ffFixed,10,2)+' °C'; Mainform.powerout.caption:='Power='+floatTostrF(curdata.power,ffFixed,5,1); ///+'% P_a='+floatTostrF(curdata.powerback,ffFixed,5,1)+' %'; Mainform.rateout.caption:='Rate='+floatTostrF(curdata.rate,ffFixed,10,1)+' °C/min'; param:=trunc(curdata.param); if (not measureon) and ((param and 256)<>0) then begin datapt:=0; cleandraw; end; measureon:=false; arunning:=false; saverequest:=false; if (param and 256)<>0 then measureon:=true; if (param and 1024)<>0 then saverequest:=true; if (param and 2048)<>0 then arunning:=true; param:=param and 255; if measureon then s:='Measure'; case param of 4:s:='To '+floatTostrF(curdata.paramdata,ffFixed,10,1)+' °C'; 2:begin if (curdata.paramdata>1e25) then s:='Wait' else s:='Hold '+floatTostrF(curdata.paramdata/1e6,ffFixed,10,1)+' s'; curdata.rate:=0; end; 0:s:='Wait'; end; if (not saverequest_old) and saverequest then begin s:='Save?'; saverequest:=false; savefileb:=true; if autosave then mainform.timer2.Enabled:=true else begin mainform.savebutton.Color:=clred; mainform.nosavebutton.visible:=true; end; senddata(SSAVED,0); end; saverequest_old:=saverequest; if (not measureon_old) and measureon then begin //rewrite(filetmp); datanum:=0; adata:=adata0; averagepointer:=0; averagenum:=1; cleandraw; end; measureon_old:=measureon; if (running) and (not arunning) and arunning_old then begin s:='Finished'; if repeatpointer=repeatnum-1 then begin running:=false; mainform.startbutton.Color:=clAqua; mainform.Startbutton.caption:='Start'; //senddata(SHOLD,1e30); end else begin mainform.time_temppLineSeries.clear; mainform.time_temp1LineSeries.clear; mainform.time_temp2LineSeries.clear; mainform.temp_temp1LineSeries.clear; mainform.temp_temppLineSeries.clear; case repeatpointer of 0:begin datap0:=datapt; data0:=datat; mainform.time_q1LineSeries.clear; mainform.temp_q1LineSeries.clear; datapt:=0; end; 1:begin datap1:=datapt; data1:=datat; mainform.time_q2LineSeries.clear; mainform.temp_q2LineSeries.clear; datapt:=0; end; 2:begin datap2:=datapt; data2:=datat; mainform.time_q3LineSeries.clear; mainform.temp_q3LineSeries.clear; datapt:=0; end; 3:begin datap3:=datapt; data3:=datat; end; end; inc(repeatpointer); senddata(SSTART,0); end; end; arunning_old:=arunning; Mainform.progout.caption:=s; if measureon then Mainform.progout.caption:='* '+s end; procedure Tmainform.TimerTimer(Sender: TObject); var i:longint; begin if connect_error=1 Then begin connect_error:=0; ShowMessage('Cannot connect to DTA'); end; if (not datagetonb) and (not sendonb) then begin datagetonb:=true; senddata(SSENDDATA,0); end; setfuncenabled:=true; if messagestr<>'' then begin messagep:=0; Mainform.message.caption:=messagestr; messagestr:=''; end; inc(messagep); if messagep>=1000 then begin Mainform.message.caption:=''; messagep:=0; end; while dataavailable do begin readfifo(curdata); processcurdata; if (running) and measureon then begin //write(filetmp,curdata); inc(datanum); inc(averagepointer); adata.temp1:=adata.temp1+curdata.temp1; adata.temp2:=adata.temp2+curdata.temp2; adata.tempp:=adata.tempp+curdata.tempp; adata.tempf:=adata.tempf+curdata.tempf; adata.time:=adata.time+curdata.time; adata.q:=adata.q+curdata.q; //if curdata.time>mainform.TimemaxEdit.value then //begin //mainform.TimemaxEdit.value:=2*mainform.TimemaxEdit.value; //settimemax; //end; if averagepointer>=averagenum then begin inc(datapt); adata.temp1:=adata.temp1/averagenum; adata.temp2:=adata.temp2/averagenum; adata.tempp:=adata.tempp/averagenum; adata.tempf:=adata.tempf/averagenum; adata.time:=adata.time/averagenum; adata.q:=adata.q/averagenum; adata.rate:=curdata.rate; adata.param:=curdata.param; adata.paramdata:=curdata.paramdata; datat[datapt]:=adata; adata:=adata0; averagepointer:=0; Add_draw(datat[datapt],repeatpointer); if datapt>=DATASIZE then begin for i:=1 to (datapt div 2) do begin datat[i].q:=(datat[2*i-1].q+datat[2*i].q)/2; datat[i].tempp:=(datat[2*i-1].tempp+datat[2*i].tempp)/2; datat[i].temp1:=(datat[2*i-1].temp1+datat[2*i].temp1)/2; datat[i].temp2:=(datat[2*i-1].temp2+datat[2*i].temp2)/2; datat[i].tempf:=(datat[2*i-1].tempf+datat[2*i].tempf)/2; datat[i].time:=(datat[2*i-1].time+datat[2*i].time)/2; end; zero_datanum:=zero_datanum div 2; averagenum:=2*averagenum; datapt:=datapt div 2; cleandraw; end; end; end; end; end; procedure settemppmax; begin temppmax:=mainform.temppmaxedit.value; mainform.temppminedit.maxvalue:=temppmax+1e-6; temppscale:=1.0/(temppmax-temppmin); temppoffset:=-temppscale*temppmin; mainform.TemppLinearAxisTrans.Offset:=temppoffset; mainform.TemppLinearAxisTrans.scale:=temppscale; end; procedure Tmainform.TemppmaxEditKeyPress(Sender: TObject; var Key: char); begin if byte(key)=13 then begin settemppmax; cleandraw; end; end; procedure Tmainform.TemppmaxEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if temppmax=mainform.temppmaxedit.value then exit; settemppmax; cleandraw; end; procedure settimemax; begin timemax:=mainform.timemaxedit.value; mainform.timeminedit.maxvalue:=timemax+1e-6; timescale:=1.0/(timemax-timemin); timeoffset:=-timescale*timemin; mainform.TimeLinearAxisTrans.Offset:=timeoffset; mainform.TimeLinearAxisTrans.scale:=timescale; end; procedure Tmainform.TimemaxEditKeyPress(Sender: TObject; var Key: char); begin if byte(key)=13 then begin settimemax; cleandraw; end; end; procedure Tmainform.TimemaxEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if timemax=mainform.timemaxedit.value then exit; settimemax; cleandraw; end; procedure settimemin; begin timemin:=mainform.timeminedit.value; mainform.timemaxedit.minvalue:=timemin-1e-6; timescale:=1.0/(timemax-timemin); timeoffset:=-timescale*timemin; mainform.TimeLinearAxisTrans.Offset:=timeoffset; mainform.TimeLinearAxisTrans.scale:=timescale; end; procedure Tmainform.TimeminEditKeyPress(Sender: TObject; var Key: char); begin if byte(key)=13 then begin settimemin; cleandraw; end; end; procedure Tmainform.TimeminEditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if timemin=mainform.timeminedit.value then exit; settimemin; cleandraw; end; procedure Tmainform.TimebuttonMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var m,d:double; begin m:=(mainform.timeminedit.value+mainform.timemaxedit.value)/2; d:=(mainform.timemaxedit.value-mainform.timeminedit.value)/2; if Button=mbLeft then d:=d/2.0; if Button=mbRight then d:=d*2.0; if timemin>0 then timemin:=m-d; if timemin<0 then timemin:=0; timemax:=timemin+2*d; mainform.timeminedit.value:=timemin; mainform.timemaxedit.value:=timemax; settimemin; settimemax; cleandraw; end; procedure xxset; begin inc(xaxispointer); if xaxispointer>2 then xaxispointer:=1; setxaxis; if xaxispointer=2 then yaxis[3]:=false; setyaxis; setbcolors; setdraw; end; procedure Tmainform.XaxisbuttonClick(Sender: TObject); begin xxset; end; procedure Tmainform.YaxisbuttonClick(Sender: TObject); begin inc(yaxispointer); if yaxispointer>4 then yaxispointer:=1; setyaxis; end; end.