// A set of Faux CL functions. These can be installed as a Library
// or bundled into a package (with Package Creator), to add a set of
// Faux CL functions to an offline version of DigitalMicrograph. This
// enables offline CL script development to avoid wasting column time.

// Executing this script does nothing as there is no main script included
// to call any of these functions

// D. R. G. Mitchell, adminnospam@dmscripting.com (remove the nospam to make this work).
// version:20200724, v2.0, July 2020, www.dmscripting.com

// If you know of other CL functions, please let the author know.


// Default values

number defaultwavelength=560
if(!getpersistentnumbernote("Faux Hardware: Faux CL:Wavelength", defaultwavelength))
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:Wavelength", defaultwavelength)
	}

number defaultmaxwavelength=800
if(!getpersistentnumbernote("Faux Hardware: Faux CL:Maximum Wavelength", defaultmaxwavelength))
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:Maximum Wavelength", defaultmaxwavelength)
	}

number defaultdispersion=5
if(!getpersistentnumbernote("Faux Hardware: Faux CL:Dispersion", defaultdispersion))
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:Dispersion", defaultdispersion)
	}

number defaultdispersionindex=2
if(!getpersistentnumbernote("Faux Hardware: Faux CL:Dispersion Index", defaultdispersionindex))
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:Dispersion Index", defaultdispersionindex)
	}

number defaultlambdamax=840.835
if(!getpersistentnumbernote("Faux Hardware: Faux CL:Maximum Lambda", defaultlambdamax))
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:Maximum Lambda", defaultlambdamax)
	}

number defaultmicroscopehightension=20
if(!getpersistentnumbernote("Faux Hardware: Faux CL:Microscope High Tension", defaultmicroscopehightension))
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:Microscope High Tension", defaultmicroscopehightension)
	}

number defaultgain=100
if(!getpersistentnumbernote("Faux Hardware: Faux CL:Gain", defaultgain))
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:Gain", defaultgain)
	}

number defaultoffset=23
if(!getpersistentnumbernote("Faux Hardware: Faux CL:Offset", defaultoffset))
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:Offset", defaultoffset)
	}

number defaultserialvalue=2324
if(!getpersistentnumbernote("Faux Hardware: Faux CL:Serial Value", defaultserialvalue))
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:Serial Value", defaultserialvalue)
	}

number defaultclisinitialised=1
if(!getpersistentnumbernote("Faux Hardware: Faux CL:CL Is Initialised (0-1)", defaultclisinitialised))
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:CL Is Initialised (0-1)", defaultclisinitialised)
	}

number defaultclismoving=0
if(!getpersistentnumbernote("Faux Hardware: Faux CL:CL Is Moving (0-1)", defaultclismoving))
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:CL Is Moving (0-1)", defaultclismoving)
	}

number defaultspeedindex=5
if(!getpersistentnumbernote("Faux Hardware: Faux CL:Speed Index", defaultspeedindex))
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:Speed Index", defaultspeedindex)
	}

number defaultoptixaxischannel=64
if(!getpersistentnumbernote("Faux Hardware: Faux CL:Optic Axis Channel", defaultoptixaxischannel))
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:Optic Axis Channel", defaultoptixaxischannel)
	}

number defaultfocallength=87
if(!getpersistentnumbernote("Faux Hardware: Faux CL:Focal Length", defaultfocallength))
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:Focal Length", defaultfocallength)
	}

number defaultgratingorder=1
if(!getpersistentnumbernote("Faux Hardware: Faux CL:Grating Order", defaultgratingorder))
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:Grating Order", defaultgratingorder)
	}

number defaultclisatupperlimit=0
if(!getpersistentnumbernote("Faux Hardware: Faux CL:CL Is At Upper Limit (0-1)", defaultclisatupperlimit))
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:CL Is At Upper Limit (0-1)", defaultclisatupperlimit)
	}

number defaultclpmtmode=1
if(!getpersistentnumbernote("Faux Hardware: Faux CL:PMT Mode", defaultclpmtmode))
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:PMT Mode", defaultclpmtmode)
	}

number defaultserialorparallel=0 // 0=serial, 1=parallel - not confirmed in practice
if(!getpersistentnumbernote("Faux Hardware: Faux CL:Collection Mode (0-1)", defaultserialorparallel))
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:Collection Mode (0-1)", defaultserialorparallel)
	}

number defaultmonoorpanchromatic=0 // 0=monochromatic, 1=panchromatic - not confirmed in practice
if(!getpersistentnumbernote("Faux Hardware: Faux CL:Colour Mode (0-1)", defaultmonoorpanchromatic))
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:Colour Mode (0-1)", defaultmonoorpanchromatic)
	}




// Function Library

number clsetwavelength(number wavelength)
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:Wavelength", wavelength)
		result("\nFaux CL - wavelength set to "+wavelength)
		return 1
	}

number clgetmaximumwavelength()
	{
		number maxwavelength
		getpersistentnumbernote("Faux Hardware: Faux CL:Maximum Wavelength", maxwavelength)
		return maxwavelength
	}

number clgetwavelength()
	{
		number currentwavelength
		getpersistentnumbernote("Faux Hardware: Faux CL:Wavelength", currentwavelength)
		return currentwavelength
	}

number clgetdispersion()
	{
		number dispersion
		getpersistentnumbernote("Faux Hardware: Faux CL:Dispersion", dispersion)
		return dispersion
	}

number clgetdispersionindex()
	{
		number dispersionindex
		getpersistentnumbernote("Faux Hardware: Faux CL:Dispersion Index", dispersionindex)
		return dispersionindex
	}


number clgetlambdamax()
	{
		number lambdamax
		getpersistentnumbernote("Faux Hardware: Faux CL:Maximum Lambda", lambdamax)
		return lambdamax
	}

number clgetht()
	{
		number ht
		getpersistentnumbernote("Faux Hardware: Faux CL:Microscope High Tension", ht)
		return ht
	}

void clsetht(number ht)
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:Microscope High Tension", ht)
		Result("\nHT set to : "+ht)
	}

void clsetgain(number gain)
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:Gain", gain)
		Result("\nGain set to : "+gain)
	}

number clgetgain()
	{
		number gain
		getpersistentnumbernote("Faux Hardware: Faux CL:Gain", gain)
		return gain
	}

void clsetoffset(number offset)
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:Offset", offset)
		Result("\nOffset set to : "+offset)
	}

number clgetoffset()
	{
		number offset
		getpersistentnumbernote("Faux Hardware: Faux CL:Offset", offset)
		return offset
	}

number clacquireserial(number dwelltime)
	{
		number serialvalue
		getpersistentnumbernote("Faux Hardware: Faux CL:Serial Value", serialvalue)
		result("\nSerial value of "+serialvalue+" acquired in "+dwelltime+" s")
		return serialvalue
	}

number clacquireserial(number detectorinput, number detectormode, number locking, number dwelltime)
	{
		number serialvalue
		getpersistentnumbernote("Faux Hardware: Faux CL:Serial Value", serialvalue)
		result("\nSerial value of "+serialvalue+" acquired in "+dwelltime+" s")
		result("\nInput = "+detectorinput+" Mode = "+detectormode+" locking = "+locking)
		return serialvalue
	}

number clisinitialized()
	{
		number isinitialised
		getpersistentnumbernote("Faux Hardware: Faux CL:CL Is Initialised (0-1)", isinitialised)
		result("\nCL is initialized = "+isinitialised)
		return isinitialised
	}

number clismoving()
	{
		number ismoving
		getpersistentnumbernote("Faux Hardware: Faux CL:CL Is Moving (0-1)", ismoving)
		result("\nCL is moving = "+ismoving)
		return ismoving
	}

void clsetspeedindex(number speedindex)
	{
		setpersistentnumbernote("Faux Hardware: Faux CL:Speed Index", speedindex)
		result("\nSpeed index set to "+speedindex)
	}

void clstop()
	{
		result("\nCL has been stopped.")
	}

number clgetopticaxischannel(void)
	{
		number optaxischan
		getpersistentnumbernote("Faux Hardware: Faux CL:Optic Axis Channel", optaxischan)
		result("\nOptic Axis Channel = "+optaxischan)
		return optaxischan
	}

number clgetfocallength(void)
	{
		number focallength
		getpersistentnumbernote("Faux Hardware: Faux CL:Focal Length", focallength)
		result("\nFocal Length = "+focallength)
		return focallength
	}

number clgetgratingorder(void)
	{
		number gratingorder
		getpersistentnumbernote("Faux Hardware: Faux CL:Grating Order", gratingorder)
		result("\nGrating Order = "+gratingorder)
		return gratingorder
	}

number clatupperlimit(void)
	{
		number isatupperlimit
		getpersistentnumbernote("Faux Hardware: Faux CL:CL Is At Upper Limit (0-1)", isatupperlimit)
		result("\nCL is at upper limit = "+isatupperlimit)
		return isatupperlimit
	}

number clgetpmtmode(void)
	{
		number pmtmode
		getpersistentnumbernote("Faux Hardware: Faux CL:PMT Mode", pmtmode)
		Result("\nPMT Mode = "+pmtmode)
		return pmtmode
	}

void clsetserialmode(void)
	{
		number mode=0 // serial
		setpersistentnumbernote("Faux Hardware: Faux CL:Collection Mode (0-1)", mode)
		result("\nSerial mode has been set.")
	}
	
void clsetparallelmode(void)
	{
		number mode=1 // parallel
		setpersistentnumbernote("Faux Hardware: Faux CL:Collection Mode (0-1)", mode)
		result("\nParallel mode has been set.")
	}

void clsetmonochromaticmode(void)
	{
		number colour=0 // monochromatic
		setpersistentnumbernote("Faux Hardware: Faux CL:Colour Mode (0-1)", colour)
		result("\nMonochromatic mode has been set.")
	}

void clsetpanchromaticmode(void)
	{
		number colour=1 // panchromatic
		setpersistentnumbernote("Faux Hardware: Faux CL:Colour Mode (0-1)", colour)
		result("\nPPanchromatic mode has been set.")
	}

image clacquireparallel(number exposure, number nFrames, number SpectrumBinning, number VerticalBinning, Number top, number left, number height, number width, number DarkSubtracted)
	{
		image parallelimg

		if(width<1 || height<1)
			{
				result("\nWidth and/or Height parameters are incorrect.")
				exit(0)
			}
			
		parallelimg=realimage("", 4, width, height)
		parallelimg=sin(icol/90)
		Parallelimg=(parallelimg+1)*10000
		return parallelimg
	}



