'CR1000 Series Datalogger
'NEW PORTABLE SOIL RESPIRATION SYSTEM
'04/04/08 - Giorgio Alberti & Gemini delle Vedove
' Save data on the  CR1000 internal memory
' In automatic mode, Nchambers=2
' In manual mode, Nchambers = 3
'
' IMPORTANT NOTE: CO2dry is set equal to CO2anal because we do not have SBA4 additional sensor
'
' GAUSS NEWTON
'instructions and select Template | Save as Default Template
'date:22/02/2007 from SR_CR1000_A4_3.CR1
' new wiring on multiplexer
'program author:
'@PDeclare Public Variables
'
' ***** FLAGS ******
' Flag 1 = Manual
' Flag 2 = End session
' Falg 3 = Next chamber
' Flag 4 = Closs all cahmbers
' Flag 5 =
' Flag 6 = Calibration
' Flga 7 = Reset setting variables
' Flag 8 = Standby

Public Plot
Public Mode As String * 16
Public Chamber ,Cycle, Nchambers
Public CO2ana,CO2dry,CO2ini,CO2fin
Public Efflux
Public Ea_temptarget,Ea_tempavg
Public sess_hour, Manual, status, resettime,firsttime
Public Tsoilch(3), Tsoil
Public SWCch(3), SWC

Public Trig_CO2Out as BOOLEAN
Public Trig_IRGAread as BOOLEAN
Public Trig_SEfflux as BOOLEAN

Public LoggerID as String * 20

Public Period(3)
Public Vbat,Tref

Public Rhoini,t0

'Public Co_calc(30,2) as FLOAT, Cocalcreg as Float 'FOR Co calculation in Mode Cocalculation using Ct=flinear(time)


Public Flag(8) As Boolean
Public SDMval(16) as LONG
Public nread, mixread,interpread
Public niter, iCx, iCo,ia   ' numero di iterazioni, e val.iniziali parametri

'declare as public rTime to 9
Public rTime(9)
Alias rTime(1) = Year	'assign the alias Year to rTime(1)
Alias rTime(2) = Month	'assign the alias Month to rTime(2)
Alias rTime(3) = Die	'assign the alias Day to rTime(3)
Alias rTime(4) = Hour	'assign the alias Hour to rTime(4)
Alias rTime(5) = Minute	'assign the alias Minute to rTime(5)
Alias rTime(6) = Second	'assign the alias Second to rTime(6)
Alias rTime(7) = uSecond	'assign the alias uSecond to rTime(7)
Alias rTime(8) = WeekDay	'assign the alias WeekDay to rTime(8)
Alias rTime(9) = Day_of_Year	'assign the alias Day_of_Year to rTime(9)

'@A Alias
'Declare Other Variables
Alias SDMval(1)=Ch1
Alias SDMval(2)=Ch2
Alias SDMval(3)=Valve1
Alias SDMval(4)=Valve2
Alias SDMval(5)=SDM5
Alias SDMval(6)=SDM6
Alias SDMval(7)=SDM7
Alias SDMval(8)=SDM8
Alias SDMval(9)=SDM9
Alias SDMval(10)=SDM10
Alias SDMval(11)=SDM11
Alias SDMval(12)=SDM12
Alias SDMval(13)=SDM13
Alias SDMval(14)=pumps
Alias SDMval(15)=PW_IRGA
Alias SDMval(16)=Irga_zero

'Example:
'Dim Counter
Dim i,j, z
public I1,I2,I3,I4,I5,I6

'Declare Constants
'Example:
CONST ON=1
CONST OFF=0
' TDR CS616 Water Content Reflectometry
CONST C0 = -0.0663
CONST C1 = -0.0063
CONST C2 = 0.0007
'
'
'CONST C3 = 0.526
'CONST C4 = -0.052
'CONST C5 = 0.00136

CONST am1632clk=12000		' multiplexer clockuseconds minimum =10000
CONST SoilMet_Out=1800	' SoilMet dataTable Output (sec)
Const automeas=240			'(min) interval Automatic Measurement
Const autostart=235			'(min) into interval Automatic START

'OPerational variables
Public chksetupvar as BOOLEAN ' check FOR execution of sub setupvar
Public Ch_list as STRING * 100 , Ch_clTime_List as STRING * 100,Ch_col_ht_List as STRING * 100
Public Ch_seq(12) as LONG
Public col_ht(12)  ' H collare+camera fuori terra -6.6 cm (altezza camera) (cm)
Public CloseInt(12),CloseTime 	' Mode Closechamber
Public seq_Ch,Valve
Public Ncycles

Public Vbase,Vtot
Public Area
Public Ctarget

' Intervalli e tempi a fine intervallo(sec)
'MODE						INTERVAL (sec)					Timer (Timer#,Units)
'Warm						Autom : Fix 20 min			TimerMode (0,sec)
'								Manual=WarmInt
'Zero_IRGA			IRGA_ZeroInt(4sec)			TimerMode (0,sec)
'CloseChamber		CloseInt(Chamber)				TimerMode (0,sec)
'CoCalculation	CoInt										TimerMode (0,sec)>>
'Mixing					MixInt									TimerMode (0,sec)>>
'Interpolation	InterpInt								TimerInterp(2,msec)
'Flushing				FlushInt								TimerMode (0,sec)
' CONT.....
'MODE						TIME Start (sec)				TIME End (sec)											COUNTER
'Warm						TimerMode=0							WarmInt															nread
'Zero_IRGA			TimerMode=0							IRGA_ZeroInt												....
'CloseChamber		TimerMode=0							CloseTime=CloseInt(Chamber)-CoInt		nread>>
'CoCalculation	CloseTime-CoInt					CoTime=CloseTime=CloseInt(Chamber)	nread>>
'Mixing					CloseTime							MixTime=CloseTime+MixInt						nread=0&mixread=0
'Interpolation	MixTime									InterpTime=MixTime+InterpInt				nread>>&interpread=0
'Flushing				TimerMode=0							FlushInt

Public TimerMode as FLOAT,Timerinterp as FLOAT 'TimerCo as FLOAT
Public WarmInt				'Interval FOR warmup in Manual meas.nts
Public OutputTime							'Sec after closure start Output CO2reads
Public IRGA_ZeroInt						'Interval FOR switch zeroing of IRGA
Public CoInt, CoTime					'Mode Cocalculation
Public MixInt,MixTime					' Mode Mixing
Public InterpInt,InterpTime		'Mode Interpolation
Public FlushInt								'Mode Flushing waiting in valve 13
Public runAvgmodule						' counts in runavg

' GaussNewton
Public Cdry(100) as FLOAT, dt as float
Public iter, iread
Public Cx,Co,a, dCx, dCo, da, Ct
Public SCx2,SCo2,Sa2,SCxCo,SCxa,SCoa,Res, SRCx, SRCo, SRa
Public det
Public n,eat,e2at,eant,e2ant

' SUB chktime ' called in mode ="Closechamber"
public waitsec,actualsecond,next_out

'SUB SBAREAD
Public SBA_string as STRING * 80
Public SBA_ID as STRING * 2
Public SBA_vect(12) as FLOAT

alias SBA_vect(1)=dig_ZERO
alias SBA_vect(2)=dig_CO2
alias SBA_vect(3)=dig_CO2AV
alias SBA_vect(4)=IRGA_temp
alias SBA_vect(5)=Ea_mb
alias SBA_vect(6)=Ea_temp
alias SBA_vect(7)=Asba
alias SBA_vect(8)=Bsba
alias SBA_vect(9)=Csba
alias SBA_vect(10)=Dsba
alias SBA_vect(11)=Esba
alias SBA_vect(12)=Press


'@S Define Subroutines

' **********************   SUB 7 - set-up variables   ***********************

SUB setupvar
	' tempi chiusura stazione camere
	LoggerID=Status.StationName(1,1)
	i=Right (LoggerID,1)
	Select Case i
	Case 1			' staz 1
		Ch_clTime_List= "140,140,140"
	EndSelect
	If Ch_list="" Then	Ch_list="1,2,3"
	If Ch_clTime_List="" Then Ch_clTime_List="151,137,151"
	If Ch_col_ht_List="" Then Ch_col_ht_List="-1.5,-1.5,-1.5"

	SplitStr(Ch_seq(),Ch_list,"",3,0)
	SplitStr(CloseInt(),Ch_clTime_List,"",3,0)
	SplitStr(col_ht(),Ch_col_ht_List,"",3,0)
	j=0
	For i=1 To 3
		If Ch_seq(i)>0 AND Ch_seq(i)<=3 	Then
			j=j+1
			Ch_seq(j)=Ch_seq(i)
		ENDIF
	NEXT i
	For i=j+1 To 3
		If i>3 Then ExitFor
		Ch_seq(i)=0

	Next i
	
	If Manual=ON Then
	  Nchambers=3
	EndIf
	
	If Manual=OFF Then
	  Nchambers=2
	EndIf
	
	Ncycles=1
	runAvgmodule=3
 
	Vbase = 1319.3
	Area = 196.1
	OutputTime=120			' Time (sec) after closure start OUTPUT of CO2Reads
	IRGA_ZeroInt=4		' Interval FOR zeroing SBA4
	MixInt = 30  			' sec. from closure to Interpolation fitting of Ct=f(Time)
	CoInt = 1.60*8				' sec. used FOR interpolation of C0=f(Time) during MixInterval
	InterpInt = 120 	'	sec. used to fit Ct=f(Time)
	WarmInt = 120  		' sec. used to warmup IRGA in Manual Mode
	FlushInt = 5			' sec between chamber's meas.nts

	niter=10
	iCx = 700
	iCo = 420
	ia  = 0.005


	chksetupvar=TRUE


ENDSUB  ' Setupvar

SUB GaussNewton  ' numero di iterazioni, e val.iniziali parametri
	' numero di iterazioni, e val.iniziali parametri

	'Procedura di fit non lineare secondo il modello LI8100
	'Ct=Cx-(Cx-Co)*exp(-a*t)

	dCx=0
	dCo=0
	da=0
	Cx=CO2fin		'ERA iCx
	Co=CO2ini 'ERA iCo
	a=ia
	FOR iter=1 TO niter

		Cx=Cx+dCx
		Co=Co+dCo
		a=a+da
		dt=Timerinterp/1000/interpread
		e2at=exp(2*a*dt)
		eat=exp(a*dt)
		' sum from closure to End of Mixing
		'		n=mixread 'mixread Counter from ClosureTime to MixTime
		n=interpread 'mixread Counter from ClosureTime to MixTime
		e2ant=exp(-2*a*n*dt)
		eant=exp(-a*n*dt)
		SCx2=2*eant/(eat-1)+e2ant/(1-e2at)+(n*e2at-2*eat-n-1)/((eat+1)*(eat-1))
		SCo2=(e2ant-1)/(1-e2at)
		Sa2=(dt*(Cx-Co))^2*(e2ant*(e2at^2*(n+1)^2-e2at*(2*n^2+2*n-1)+n^2)-e2at*(e2at+1))
		Sa2=Sa2/(1-e2at)^3
		SCxCo=eant/(1-eat)+e2ant/(e2at-1)+eat/(e2at-1)
		SCxa =dt*(Cx-Co)*(eant*(n-eat*(n+1))/((eat-1)^2)+e2ant*(e2at*(n+1)-n)/((e2at-1)*(e2at-1))+eat*(e2at+eat+1)/((eat+1)^2*(eat-1)^2))
		SCoa = dt*(Cx-Co)*(e2ant*(n-e2at*(n+1))+e2at)/(e2at-1)^2
		' Sum from end of Mixing to End of Interpolation
		'		n=nread 'nread counter from Closure Time to Interpolation Time
		'		e2ant=exp(-2*a*n*dt)
		'		eant=exp(-a*n*dt)
		'		SCx2=-SCx2+2*eant/(eat-1)+e2ant/(1-e2at)+(n*e2at-2*eat-n-1)/((eat+1)*(eat-1))
		'		SCo2=-SCo2+(e2ant-1)/(1-e2at)
		'		Sa2=-Sa2+(dt*(Cx-Co))^2*(e2ant*(e2at^2*(n+1)^2-e2at*(2*n^2+2*n-1)+n^2)-e2at*(e2at+1))/(1-e2at)^3
		'		SCxCo=-SCxCo+eant/(1-eat)+e2ant/(e2at-1)+eat/(e2at-1)
		'		SCxa =-SCxa+dt*(Cx-Co)*(eant*(n-eat*(n+1))/((eat-1)^2)+e2ant*(e2at*(n+1)-n)/((e2at-1)*(e2at-1))+eat*(e2at+eat+1)/((eat+1)^2*(eat-1)^2))
		'		SCoa =-SCoa+ dt*(Cx-Co)*(e2ant*(n-e2at*(n+1))+e2at)/(e2at-1)^2
		'
		SRCx = 0
		SRCo = 0
		SRa = 0
		FOR iread=1 TO interpread ' only interpolation Mode data
			eant=exp(-a*iread*dt)
			Ct=Cdry(iread)						'vettore delle letture
			Res=Ct-(Cx-(Cx-Co)*eant)
			SRCx=SRCx+(1-eant)* Res
			SRCo=SRCo+eant* Res
			SRa=SRa+(Cx-Co)*iread*dt*eant* Res
		NEXT iread
		det=SCx2*(SCo2*Sa2-SCoa^2)-SCxCo^2*Sa2+SCxa*(2*SCxCo*SCoa-SCxa*SCo2)
		I1=(SCo2*Sa2-SCoa*SCoa)/det
		I2=(SCxa*SCoa-ScxCo*Sa2)/det
		I3=(SCxCo*SCoa-SCxa*SCo2)/det
		I4=(SCx2*Sa2-SCxa*SCxa)/det
		I5=(SCxCo*SCxa-SCx2*SCoa)/det
		I6=(SCx2*SCo2-SCxCo*SCxCo)/det
		dCx=I1*SRCx+I2*SRCo+I3*SRa
		dCo=I2*SRCx+I4*SRCo+I5*SRa
		da=I3*SRCx+I5*SRCo+I6*SRa

	NEXT iter
ENDSUB	'GaussNewton

' checks time overlapses to avoid skipped record of
' soilmet datatable at any output interval
' enter
' free_min lowerlimit (sec) of time from now
' free_max upperlimit (sec) of time from now to wait
' out_int output interval (sec)
' wait_int is the result : wait (sec) before proceed

Sub chktime(free_min,free_max,out_int,wait_int) ' called in mode ="Closechamber"
	wait_int=0
	actualsecond=Hour*3600+Minute*60+Second 'now
	next_out=actualsecond+out_int-(actualsecond MOD out_int) 'halfhour=1800sec
	free_min=free_min+actualsecond
	free_max=free_max+actualsecond
	if next_out>free_min AND next_out<free_max then
		wait_int=next_out-actualsecond
	else
		wait_int=0
	endif
EndSub

' ********   SUB 2 - close chamber and set variables: Vtot, Tsoil, SWC   *******

SUB Closechamber
	For i=1 To 3
		SDMval(i)=0
	Next i
	SDMval(Valve) = ON
	SDMval(Chamber) = ON
	SWCch = SWCch(Chamber)
	Tsoilch = Tsoilch(Chamber)
	Vtot=col_ht(Chamber)*Area+Vbase
	
	If Chamber=3 Then
	  SDMval(1) = ON
	  SDMval(3) = ON
	EndIf
	
	If Valve=5 Then
	  SDMval(5)=OFF
	EndIf
	
	'			CloseTime=CloseInt(Chamber)
	'			MixTime=CloseTime+MixInt
	'			InterpTime=MixTime+InterpInt

ENDSUB 'Closechamber

SUB SBAread

	SerialFlush (Com4)
	SerialIn (SBA_string,Com4,0,13,80)
	splitstr(SBA_ID,SBA_string,", ",1,7)
	splitstr(SBA_vect(),SBA_string,"",12,0)
	IF SBA_ID="M" THEN
		'	TimerCo=Timer(1,msec,4) NOT USED
		TimerInterp=Timer(2,mSec,4)
		CO2dry=dig_CO2AV/(1-Ea_mb/Press)
	ELSE
		CO2dry=0
	ENDIF
ENDSUB ' Sbaread

'Define Data Tables

DataTable (CO2read,Trig_CO2Out,300*12*6)
	'CardOut (0,-1)
  
  Sample (1,Plot,Long)
	Sample (1,TimerInterp,Long)
	Sample (1,TimerMode,Long)
	Sample (1,Mode,String)
	sample (1,Chamber,Long)
	sample (1,Cycle,Long)
	sample (1,nread,Long)
	sample (1,interpread,Long)
	Sample (1,CO2dry,IEEE4)
	Sample (1,Ea_temp,FP2)
	Sample (1,Ea_mb,FP2)
	Sample (1,Press,FP2)
	Sample (1,CO2ana,IEEE4)

EndTable 'CO2read

DataTable (Effl_Out,Trig_SEfflux,12*12*6)
	'CardOut (0,-1)

	Sample (6,rTime(),IEEE4)
	'	Sample (1,TimerInterp,IEEE4)
	Sample (1,Plot,Long)
	Sample (1,TimerMode,Long)
	Sample (1,Mode,String)
	sample (1,Chamber,Long)
	sample (1,Cycle,Long)
	sample (1,nread,Long)
	Sample (1,Efflux,IEEE4)
	Sample(1,CO2ini,IEEE4)
	Sample (1,CO2fin,IEEE4)
	Sample (1,Co,IEEE4)
	Sample (1,Cx,IEEE4)
	Sample (1,a,IEEE4)
	Sample(1,t0,IEEE4)
	Sample (1,Rhoini,IEEE4)
	Sample (1,Vtot,FP2)
	Sample (1,Tsoil,FP2)
	Sample (1,SWC,FP2)

EndTable


'Main Program

BeginProg
	Timer(0,sec,2)
	SerialOpen (Com4,9600,7,0,100)
	PortsConfig (&B10111000,&B01111111)

	Scan (1000,mSec,5,0)
		RealTime (rTime())
		'AM16/32
		Battery (Vbat)
		PanelTemp (Tref,250)
		
		If IfTime (0,30,sec) AND Trig_IRGAread=FALSE Then
		  
		  'Type T (copper-constantan) Thermocouple measurements Tsoil on the AM16/32 Multiplexer:
		  TCDiff (Tsoilch(1),3,mV2_5C,1,TypeT,TRef,True ,0,250,1.0,0)
			
		  ' Read CS616 Water Content Reflectometry
		  CS616 (Period(),3,7,6,4,1.0,0)
		  SWCch(1)=C0 + C1 * Period(1) + C2 * Period(1)^2
		  SWCch(2)=C0 + C1 * Period(2) + C2 * Period(2)^2
		  SWCch(3)=C0 + C1 * Period(3) + C2 * Period(2)^2

    EndIf

	' ****************************** DO OUTPUT ***************************************
    
		VoltDiff (CO2ana,1,mV5000,6,True ,0,250,0.2,0)'CO2 analogic on Ch6
		If Trig_IRGAread=TRUE Then Call SBAread
		nread=nread+1
		TimerMode=Timer(0,sec,4)
		IF Mode="Interpolation" THEN interpread=interpread+1
		
		CO2dry=CO2ana	
		CallTable CO2read

		' Read sensors

		' test IF Time FOR measurementmode
		' -------------- Manual or automated start -------------------------
		If Flag(1) Then		' Manual start
			status=1000
			IF manual = OFF THEN
				Mode ="Warm"
				manual = ON
				Nchambers=3
				firsttime = ON
				sess_hour = Hour

				seq_Ch=0:Cycle=1
			ENDIF
		else

			' power up 5 min before in automatic
			'			IF PW_IRGA=0 THEN
			IF TimeInToInterval(autostart,automeas,Min) THEN
				Mode = "Warm"
				firsttime = ON
			ENDIF
			'			ENDIF
			' start sutomatic measurements
			IF iftime(0,automeas,Min) THEN
				status = 0
				sess_hour = Hour
				manual = OFF
				Nchambers=2
				Mode = "Zero_IRGA"
				firsttime = ON
			ENDIF
			IF manual = ON THEN
				Mode = "Standby"
				manual = OFF
			ENDIF
		EndIf 'end FLAG1 HIGH
		If Flag(2) Then' end session
			Flag(2)=FALSE
			Mode="Standby"
		ENDIF
		If Flag(3) Then' NEXT CHAMBER
			Flag(3)=FALSE
			Mode="Flushing"
			firsttime=ON
		EndIf
		If Flag(4) Then 'Close chambers
		  Mode="Standby"
		  SDMval(1)=ON
		  SDMval(2)=ON
		Else
		    If Mode="Standby"
		    SDMval(1)=OFF
		    SDMval(2)=OFF
		    EndIf		  
		EndIf
		If flag(6) Then			'calibration
			mode="Calibration"
			if firsttime=OFF then firsttime=ON
		ENDIF
		If Flag(7) Then'reset operational variables

			call (setupvar)
			flag(7)=False
		ENDIF
		if Flag(8) then Mode="Standby"
		IF chksetupvar=FALSE THEN Call setupvar


		'@M				' MODE CONTROL  ######################
		If Mode="" Then
			Mode="Standby"
			Chamber=1
		ENDIF
		If Mode= "Calibration" Then
			IF firsttime=ON THEN
				firsttime=OFF
				Trig_IRGAread= True
				Pumps=ON
				PW_IRGA=ON
				Valve1=ON
			ENDIF
			' ****** continuous operations *********
			If flag(6)=FALSE THEN Mode="Standby"

		ENDIF	'Calibration mode
		' Standby MODE
		IF Mode="Standby" THEN
			' ****** continuous operations *********
			If Chamber<>0 OR pumps=1 OR valve1=1 Then
				For i=1 TO 16
					SDMval(i)=0
				NEXT i
				Chamber=0
				Valve=3
				seq_Ch=0:Cycle=1
				Flag(1)=FALSE
				Trig_CO2Out=FALSE
				Trig_SEfflux=FALSE
				Trig_IRGAread=FALSE
			EndIf
			PW_IRGA=1
		ENDIF	'Standby Mode
		' ======================
		' Warm MODE
		IF Mode="Warm" THEN
			' ****** continuous operations *********
			if firsttime=ON then
				Valve1=1
				PW_IRGA=1
				Timer(0,sec,2)
				firsttime=OFF
				Trig_IRGAread=FALSE
			ENDIF
			IF Timer(0,sec,4)>4 AND Timer(0,sec,4)<=10 THEN
				pumps=1
			ENDIF
			IF Flag(1)=True AND Timer(0,sec,4)>=WarmInt THEN
				seq_Ch=0:Cycle=1
				Mode="Zero_IRGA"
				firsttime=ON
			ENDIF
		ENDIF 'warm Mode
		' ======================
		' Zero_IRGA MODE
		IF Mode="Zero_IRGA" THEN
			IF firsttime=ON THEN
				firsttime=OFF
				Timer(0,sec,2)
				Irga_zero=1
				'Trig_IRGAread=FALSE
			ENDIF
			' ****** continuous operations *********
			IF Timer(0,sec,4)>=IRGA_ZeroInt THEN
				Irga_zero=0
				Mode="Closechamber"
				firsttime=ON
				'moved from closechamber mode
				seq_Ch=seq_Ch+1
				IF seq_Ch>Nchambers THEN
					seq_Ch=1
					Cycle=Cycle+1
					if Cycle>Ncycles THEN
						Mode="Standby"
					ENDIF
				ENDIF
				Chamber=Ch_seq(seq_Ch)
				Valve=Ch_seq(seq_Ch)+2
				CloseTime=CloseInt(Chamber)
				OutputTime=CloseTime-CoInt
			ENDIF
		ENDIF ' Zero_IRGA Mode
		' ======================
		' Closechamber MODE
		IF Mode="Closechamber" THEN
			IF firsttime = ON THEN

				' check half hour time for soilmet output
				' avoids losses of data in soilmet datatable and CO2readings
				waitsec=0
				I1=OutputTime-1  								'lower_limit (sec)
				I2=CloseTime+MixInt+InterpInt+5	'Upper_limit (sec)
				I3=SoilMet_Out									'interval to check (sec)
				waitsec=-1											'SUBROUTINE _output (sec)

				call chktime(I1,I2,I3,waitsec)
				IF waitsec>0 THEN
					Trig_IRGAread=FALSE
					waitsec=waitsec-1
					pumps=0
					ContinueScan

				ELSE

					firsttime=OFF
					'set closure, calc. Vtot, mixing & obslength Times
					pumps=1

					call Closechamber
					Timer(0,sec,2) 'azzera Timer
					nread=0
				ENDIF
			ENDIF 'firsttime=ON
			' ****** continuous operations *********
			IF Timer(0,sec,4)>=OutputTime THEN
				Trig_IRGAread=True
				Trig_CO2Out=TRUE
			ENDIF
			If Timer(0,sec,4)>=CloseTime-CoInt Then
				Mode="CoCalculation"
				firsttime=ON
			EndIf
		EndIf' close chamber mode
		' ======================
		' CoCalculation MODE
		IF Mode="CoCalculation" THEN
			' ****** continuous operations *********
			AvgRun (CO2ini,1,CO2dry,5)
			Rhoini=0.12028*Press/(Ea_temp+273)
			IF Timer(0,sec,4)>=CloseTime THEN
				Mode="Mixing"
				firsttime=ON
			ENDIF
		ENDIF 		'CoCalculation & closureTime
		' ======================
		' Mixing MODE
		If Mode="Mixing" THEN
			IF firsttime=ON THEN
				nread=0
				MixTime=CloseTime+MixInt
				firsttime=OFF
			ENDIF
			' ****** continuous operations *********
			IF timer(0,sec,4)>=MixTime THEN
				mixread=nread
				Mode="Interpolation"
				firsttime=ON
			ENDIF
		ENDIF ' Mixing Mode
		' ======================
		' Interpolation MODE
		If Mode="Interpolation" THEN
			IF firsttime=ON THEN
				firsttime=OFF
				interpread=0
				Timer(2,mSec,2)
				InterpTime=MixTime+InterpInt
			EndIf
			' ****** continuous operations *********
			If interpread>0 Then Cdry(interpread)=CO2dry
			If Timer(0,sec,4)>=InterpTime Then
				Mode="Flushing"
				firsttime=ON
			EndIf
		EndIf ' Interpolation Mode
		' ======================
		' Flushing MODE
		If Mode="Flushing" Then
			' ****** continuous operations *********
			FOR i=1 TO 12
				SDMval(i)=0
			NEXT i
			valve1=1
			SDMCD16AC (SDMval(),1,0)
			If firsttime=ON Then
				firsttime=OFF
				Timer(0,sec,2)
				Trig_CO2Out=FALSE:
				Trig_IRGAread=FALSE ' STOP CO2 Readings
				CO2fin=CO2dry

				call GaussNewton
				t0=-LN(-(CO2ini-Cx)/(Cx-Co))/a
				'CO2ini 'computed at the end of closure chamber

				Efflux=a*(Cx-Co)*Vtot/Area*Rhoini
				Trig_SEfflux=TRUE
        Tsoil=Tsoilch(chamber)
        SWC=SWCch(chamber)
        
				CallTable Effl_Out
				

				Trig_SEfflux=FALSE
				Timer(2,msec,3)  ' STOP   TimerInterp
				If Nchambers=1 AND Cycle<Ncycles Then FlushInt=CloseTime+20
			EndIf
			If Timer(0,sec,4)>=FlushInt  Then
				Mode="Zero_IRGA"
				firsttime=ON
			ENDIF
			IF  seq_Ch>=Nchambers AND Cycle>=Ncycles Then	Mode="Standby"
		ENDIF	' Flushing mode
		' ======================
		SDMCD16AC (SDMval(),1,0)
	NextScan ' 1 sec scan
	'
EndProg

