diff --git a/Config/cameraserver.cfg b/Config/cameraserver.cfg index f3046508..cddfba85 100644 --- a/Config/cameraserver.cfg +++ b/Config/cameraserver.cfg @@ -1,8 +1,8 @@ # configuration file for camera-server # -ARCHON_IP=192.168.1.2 +ARCHON_IP=10.0.0.2 ARCHON_PORT=4242 -DEFAULT_FIRMWARE=/home/user/Software/acf/kpf-getimage-slot5.acf +DEFAULT_FIRMWARE=Config/demo/demo.acf EXPOSE_PARAM=Expose # Archon parameter which triggers exposure IMDIR=/tmp # base directory to save images BASENAME=image # base image filename diff --git a/Config/cryoscope.acf b/Config/cryoscope.acf new file mode 100644 index 00000000..a73e5be6 --- /dev/null +++ b/Config/cryoscope.acf @@ -0,0 +1,777 @@ +[CONFIG] +MOD10\DIO_DIR12=1 +MOD10\DIO_DIR34=1 +MOD10\DIO_POWER=1 +MOD10\DIO_SOURCE1=3 +MOD10\DIO_SOURCE2=3 +MOD10\DIO_SOURCE3=3 +MOD10\VCPU_INREG0=0 +MOD10\VCPU_INREG1=0 +MOD10\VCPU_INREG10=0 +MOD10\VCPU_INREG11=0 +MOD10\VCPU_INREG12=0 +MOD10\VCPU_INREG13=0 +MOD10\VCPU_INREG14=0 +MOD10\VCPU_INREG15=0 +MOD10\VCPU_INREG2=0 +MOD10\VCPU_INREG3=0 +MOD10\VCPU_INREG4=0 +MOD10\VCPU_INREG5=0 +MOD10\VCPU_INREG6=0 +MOD10\VCPU_INREG7=0 +MOD10\VCPU_INREG8=0 +MOD10\VCPU_INREG9=0 +MOD10\VCPU_LINE0="ALIAS r0 TriggerHw ; reads hardware trigger" +MOD10\VCPU_LINE1="ALIAS r1 TriggerSw ; reads software trigger" +MOD10\VCPU_LINE10=";" +MOD10\VCPU_LINE11="DIN_PORT=0x0000 ; digital input port register" +MOD10\VCPU_LINE12="SOFT_TRIG=0x0010 ; software trigger VCPU_INREG0" +MOD10\VCPU_LINE13="DATA_WORD=0x0011 ; VCPU_INREG1 carries the word to write serially" +MOD10\VCPU_LINE14= +MOD10\VCPU_LINE15="; bitmasks" +MOD10\VCPU_LINE16=";" +MOD10\VCPU_LINE17="DATACLK_HI=1" +MOD10\VCPU_LINE18="DATACLK_LO=0" +MOD10\VCPU_LINE19="CSB_HI=2" +MOD10\VCPU_LINE2="ALIAS r2 Once ; allows one-shot software trigger" +MOD10\VCPU_LINE20="CSB_LO=0" +MOD10\VCPU_LINE21="DATAIN_HI=4" +MOD10\VCPU_LINE22="DATAIN_LO=0" +MOD10\VCPU_LINE23="HW_TRIG=0x10 ; hardware trigger bit = DIO5" +MOD10\VCPU_LINE24= +MOD10\VCPU_LINE25="; Initialize Output Ports" +MOD10\VCPU_LINE26=";" +MOD10\VCPU_LINE27="LOAD ClockPort, 0x0101 ; ClockPort = DIO1" +MOD10\VCPU_LINE28="LOAD DataPort, 0x0104 ; DataPort = DIO3" +MOD10\VCPU_LINE29="LOAD SPI, 0x0107 ; CLK=DIO1, CSB=DIO2, DATA=DIO3" +MOD10\VCPU_LINE3="ALIAS r3 Counter ; general purpose counter" +MOD10\VCPU_LINE30= +MOD10\VCPU_LINE31="LOAD Once, 0 ; clear the Once flag" +MOD10\VCPU_LINE32="INPUT TriggerSw, SOFT_TRIG ; read the software trigger once at program start only" +MOD10\VCPU_LINE33="TEST TriggerSw, 1" +MOD10\VCPU_LINE34="IF Z GOTO Init ; if clear then leave the Once flag clear" +MOD10\VCPU_LINE35="LOAD Once, HW_TRIG ; otherwise set the Once flag same as a hardware trigger" +MOD10\VCPU_LINE36= +MOD10\VCPU_LINE37="; Initialize all ports and registers" +MOD10\VCPU_LINE38=";" +MOD10\VCPU_LINE39=Init: +MOD10\VCPU_LINE4="ALIAS r4 Data ; this register caries the data" +MOD10\VCPU_LINE40="OUTPUT SPI, 0x06 ; DATAIN=HI, CSB=HI, CLK=LO (110)" +MOD10\VCPU_LINE41= +MOD10\VCPU_LINE42="; WaitForTrigger" +MOD10\VCPU_LINE43="; Loop here until either a hardware or software trigger is received" +MOD10\VCPU_LINE44=";" +MOD10\VCPU_LINE45=WaitForTriggerLO: +MOD10\VCPU_LINE46=";LOAD Counter, 1 ; initialize Counter for LO state" +MOD10\VCPU_LINE47= +MOD10\VCPU_LINE48=TestTriggerLO: +MOD10\VCPU_LINE49="INPUT TriggerHw, DIN_PORT ; read the hardware trigger" +MOD10\VCPU_LINE5="ALIAS r5 ClockPort ; holds the address for the DATACLK port" +MOD10\VCPU_LINE50="TEST TriggerHw, HW_TRIG ; Z = NOT(TriggerHw & HW_TRIG)" +MOD10\VCPU_LINE51="IF NZ GOTO WaitForTriggerLO ; loop waiting until Trigger==0" +MOD10\VCPU_LINE52=";SUB Counter, 1 ; decrement LO counter" +MOD10\VCPU_LINE53=";IF NZ GOTO TestTriggerLO ; keep checking Trigger until LO for \"Counter\" cycles" +MOD10\VCPU_LINE54= +MOD10\VCPU_LINE55=WaitForTriggerHI: +MOD10\VCPU_LINE56=";LOAD Counter, 1 ; initialize Counter for HI state" +MOD10\VCPU_LINE57= +MOD10\VCPU_LINE58=TestTriggerHI: +MOD10\VCPU_LINE59="INPUT TriggerHw, DIN_PORT ; read the hardware trigger" +MOD10\VCPU_LINE6="ALIAS r7 DataPort ; holds the address for the DATAIN port" +MOD10\VCPU_LINE60="OR TriggerHw, Once ; OR with Once register: TriggerHw=TriggerHw|Once" +MOD10\VCPU_LINE61="TEST TriggerHw, HW_TRIG ; Z = NOT(TriggerHw & HW_TRIG)" +MOD10\VCPU_LINE62="IF Z GOTO WaitForTriggerHI ; loop waiting until Trigger==1" +MOD10\VCPU_LINE63=";SUB Counter, 1 ; increment HI counter" +MOD10\VCPU_LINE64=";IF NZ GOTO TestTriggerHI ; keep checking Trigger until HI for \"Counter\" cycles" +MOD10\VCPU_LINE65= +MOD10\VCPU_LINE66="LOAD Counter, 16 ; initialize Counter to 16 bit word length" +MOD10\VCPU_LINE67= +MOD10\VCPU_LINE68="; SendSerial" +MOD10\VCPU_LINE69="; jump here when a trigger is received to send the serial data word" +MOD10\VCPU_LINE7="ALIAS r9 SPI ; address for CLK/CS/DATA" +MOD10\VCPU_LINE70=";" +MOD10\VCPU_LINE71=SendSerial: +MOD10\VCPU_LINE72="INPUT Data, DATA_WORD ; copy the requested word from the VCPU_INREG" +MOD10\VCPU_LINE73="OUTPUT SPI, 0x04 ; enable CSB: DATAIN=HI, CSB=LO, CLK=LO (100)" +MOD10\VCPU_LINE74= +MOD10\VCPU_LINE75="SendSerialLoop: ; loop over this for each bit in the data word" +MOD10\VCPU_LINE76="OUTPUT SPI, 0x04 ; each bit starts with DATA=HI and CLK=LO" +MOD10\VCPU_LINE77="SLA Data ; shift the MSB of Data into Carry" +MOD10\VCPU_LINE78="IF NC OUTPUT DataPort, DATAIN_LO ; if C is clear then bring DATAIN LO" +MOD10\VCPU_LINE79="OUTPUT ClockPort, DATACLK_HI ; then bring the clock HI" +MOD10\VCPU_LINE8= +MOD10\VCPU_LINE80="SUB Counter, 1 ; decrement bit counter" +MOD10\VCPU_LINE81="IF NZ GOTO SendSerialLoop ; keep looping over all bits in the data word" +MOD10\VCPU_LINE82="LOAD Once, 0 ; clear the Once register to stop software triggers" +MOD10\VCPU_LINE83=GOTO Init +MOD10\VCPU_LINE84= +MOD10\VCPU_LINE9="; Define Constants" +MOD10\VCPU_LINES=85 +BIGBUF=0 +FRAMEMODE=1 +LINECOUNT=2048 +PIXELCOUNT=64 +RAWENABLE=0 +RAWENDLINE=10 +RAWSAMPLES=25600 +RAWSEL=0 +RAWSTARTLINE=0 +RAWSTARTPIXEL=0 +SAMPLEMODE=0 +SHP1=256 +SHP2=992 +SHD1=1000 +SHD2=1000 +TAPLINE0="AM26L,1,0" +TAPLINE1="AM45R,1,0" +TAPLINE2="AM28L,1,0" +TAPLINE3="AM49R,1,0" +TAPLINE4="AM43L,1,0" +TAPLINE5="AM47R,1,0" +TAPLINE6="AM30L,1,0" +TAPLINE7="AM33R,1,0" +TAPLINE8="AM32L,1,0" +TAPLINE9="AM48R,1,0" +TAPLINE10="AM23L,1,0" +TAPLINE11="AM40R,1,0" +TAPLINE12="AM35L,1,0" +TAPLINE13="AM27R,1,0" +TAPLINE14="AM44L,1,0" +TAPLINE15="AM22R,1,0" +TAPLINE16="AM50L,1,0" +TAPLINE17="AM31R,1,0" +TAPLINE18="AM53L,1,0" +TAPLINE19="AM25R,1,0" +TAPLINE20="AM41L,1,0" +TAPLINE21="AM34R,1,0" +TAPLINE22="AM39L,1,0" +TAPLINE23="AM21R,1,0" +TAPLINE24="AM46L,1,0" +TAPLINE25="AM54R,1,0" +TAPLINE26="AM36L,1,0" +TAPLINE27="AM51R,1,0" +TAPLINE28="AM52L,1,0" +TAPLINE29="AM29R,1,0" +TAPLINE30="AM42L,1,0" +TAPLINE31="AM24R,1,0" +TAPLINE32="AM37L,1,0" +TAPLINES=33 +TRIGOUTFORCE=0 +TRIGOUTINVERT=0 +TRIGOUTLEVEL=0 +TRIGOUTPOWER=1 +PARAMETER0="Start=0" +PARAMETER1="Expose=0" +PARAMETER2="ExposeWindow=0" +PARAMETER3="exptime=0" +PARAMETER4="longexposure=0" +PARAMETER5="Abort=0" +PARAMETER6="mode_UTR_RR=1" +PARAMETER7="mode_UTR_GR=0" +PARAMETER8="mode_EnhancedRollingReset=0" +PARAMETER9="mode_VideoRX=0" +PARAMETER10="mode_VideoRXR=0" +PARAMETER11="mode_PermanentReset=0" +PARAMETER12="mode_Guiding=0" +PARAMETER13="exp_PulseWhileGlobReset=0" +PARAMETER14="H2RG_rows=2048" +PARAMETER15="H2RG_rows_skip=0" +PARAMETER16="H2RG_columns=64" +PARAMETER17="H2RG_win_rows=10" +PARAMETER18="H2RG_win_columns=10" +PARAMETER19="H2RGMainReset=0" +PARAMETER20="EnhancedRR_Delta=100" +PARAMETER21="Hold4Programming=0" +PARAMETER22="WindowPixelNb=100" +PARAMETER23="prv_flag_reset=0" +PARAMETERS=24 +LINE0=Init: +LINE1="STATE000; CALL InitClocks" +LINE2="STATE000; CALL wCLKEn" +LINE3="STATE000; CALL ResetRegistersDefault" +LINE4="STATE000; if Start GOTO WaitForExpose" +LINE5="STATE000; GOTO Init" +LINE6=ResetRegHxRG: +LINE7="STATE000; CALL ResetRegistersDefault" +LINE8="STATE000; H2RGMainReset--" +LINE9="STATE000; RETURN ResetRegHxRG" +LINE10=WaitForExpose: +LINE11="STATE000; if Expose CALL SelectMode" +LINE12="STATE000; if H2RGMainReset CALL ResetRegHxRG" +LINE13="STATE000; CALL wResetEN" +LINE14="STATE000; GOTO WaitForExpose" +LINE15=SelectMode: +LINE16="STATE000; if mode_UTR_RR CALL UTR_RR_Sequence" +LINE17="STATE000; if mode_UTR_GR CALL UTR_GR_Sequence" +LINE18="STATE000; if mode_VideoRX CALL VideoRX_Sequence" +LINE19="STATE000; if mode_VideoRXR CALL VideoRXR_Sequence" +LINE20="STATE000; if mode_PermanentReset CALL PGR_Sequence" +LINE21="STATE000; if mode_EnhancedRollingReset CALL EnhancedRR_Sequence" +LINE22="STATE000; if exp_PulseWhileGlobReset CALL Persistence_PulseGlobalReset" +LINE23="STATE000; if mode_Guiding CALL Guiding_Sequence" +LINE24="STATE000; GOTO WaitForExpose" +LINE25=UTR_RR_Sequence: +LINE26="STATE000; prv_flag_reset++" +LINE27="STATE000; CALL UTR_RR_GrabFrame(Expose)" +LINE28="STATE000; GOTO WaitForExpose" +LINE29=UTR_RR_GrabFrame: +LINE30="STATE000; Expose--" +LINE31="STATE000; Expose--" +LINE32="STATE000; if !prv_flag_reset CALL ExposureTimer" +LINE33="STATE000; CALL wFrame" +LINE34="STATE000; CALL StartFrame" +LINE35="STATE000; CALL RR_SkipRow(H2RG_rows_skip)" +LINE36="STATE000; CALL RR_ReadRow(H2RG_rows)" +LINE37="STATE000; CALL PulseVCLK" +LINE38="STATE000; prv_flag_reset--" +LINE39="STATE000; RETURN UTR_RR_GrabFrame" +LINE40=RR_ReadRow: +LINE41="STATE000; CALL wLine" +LINE42="STATE000; CALL StartRow" +LINE43="STATE000; CALL wReadEN" +LINE44="STATE000; if prv_flag_reset CALL ResetPulse" +LINE45="STATE000; if !prv_flag_reset CALL ResetPulse_Dummy" +LINE46="STATE000; CALL ReadPixel_Blank(2)" +LINE47="STATE000; CALL ReadPixel(H2RG_columns)" +LINE48="STATE000; CALL wbHclk" +LINE49="STATE000; CALL wbReadEN" +LINE50="STATE000; RETURN RR_ReadRow" +LINE51=RR_SkipRow: +LINE52="STATE000; CALL StartRow" +LINE53="STATE000; if prv_flag_reset CALL ResetPulse" +LINE54="STATE000; RETURN RR_SkipRow" +LINE55=UTR_GR_Sequence: +LINE56="STATE000; prv_flag_reset++" +LINE57="STATE000; CALL UTR_GR_GrabFrame(Expose)" +LINE58="STATE000; GOTO WaitForExpose" +LINE59=PGR_Sequence: +LINE60="STATE000; CALL wResetEN" +LINE61="STATE000; CALL UTR_GR_GrabFrame(Expose)" +LINE62="STATE000; CALL wbResetEN" +LINE63="STATE000; GOTO WaitForExpose" +LINE64=UTR_GR_GrabFrame: +LINE65="STATE000; Expose--" +LINE66="STATE000; CALL wFrame" +LINE67="STATE000; CALL StartFrame" +LINE68="STATE000; CALL PulseVCLK" +LINE69="STATE000; CALL GR_ReadRow(2048)" +LINE70="STATE000; CALL PulseVCLK" +LINE71="STATE000; prv_flag_reset--" +LINE72="STATE000; RETURN UTR_GR_GrabFrame" +LINE73=GR_ReadRow: +LINE74="STATE000; CALL wLine" +LINE75="STATE000; CALL StartRow" +LINE76="STATE000; CALL wReadEN" +LINE77="STATE000; CALL ReadPixel_Blank(2)" +LINE78="STATE000; CALL ReadPixel(64)" +LINE79="STATE000; CALL wbHclk" +LINE80="STATE000; CALL wbReadEN" +LINE81="STATE000; RETURN GR_ReadRow" +LINE82=VideoRX_Sequence: +LINE83="STATE000; if Expose CALL VideoRX_GrabFrame" +LINE84="STATE000; if Abort CALL AbortSeq" +LINE85="STATE000; GOTO VideoRX_Sequence" +LINE86=VideoRX_GrabFrame: +LINE87="STATE000; CALL wFrame" +LINE88="STATE000; CALL StartFrame" +LINE89="STATE000; CALL RR_SkipRow(H2RG_rows_skip)" +LINE90="STATE000; CALL RX_ReadRow(H2RG_rows)" +LINE91="STATE000; CALL PulseVCLK" +LINE92="STATE000; CALL ExposureTimer" +LINE93="STATE000; RETURN VideoRX_GrabFrame" +LINE94=RX_ReadRow: +LINE95="STATE000; CALL wLine" +LINE96="STATE000; CALL StartRow" +LINE97="STATE000; CALL wReadEN" +LINE98="STATE000; CALL ReadPixel_Blank(2)" +LINE99="STATE000; CALL ReadPixel(H2RG_columns)" +LINE100="STATE000; CALL ResetPulse" +LINE101="STATE000; CALL wbHclk" +LINE102="STATE000; CALL wbReadEN" +LINE103="STATE000; RETURN RX_ReadRow" +LINE104=VideoRXR_Sequence: +LINE105="STATE000; if Expose CALL VideoRXR_GrabFrame" +LINE106="STATE000; if Abort GOTO AbortSeq" +LINE107="STATE000; GOTO VideoRXR_Sequence" +LINE108=VideoRXR_GrabFrame: +LINE109="STATE000; CALL wFrame" +LINE110="STATE000; CALL StartFrame" +LINE111="STATE000; CALL RR_SkipRow(H2RG_rows_skip)" +LINE112="STATE000; CALL RXR_ReadRow(H2RG_rows)" +LINE113="STATE000; CALL PulseVCLK" +LINE114="STATE000; CALL ExposureTimer" +LINE115="STATE000; RETURN VideoRXR_GrabFrame" +LINE116=RXR_ReadRow: +LINE117="STATE000; CALL wLine" +LINE118="STATE000; CALL StartRow" +LINE119="STATE000; CALL wReadEN" +LINE120="STATE000; CALL ReadPixel_Blank(2)" +LINE121="STATE000; CALL ReadPixel(H2RG_columns)" +LINE122="STATE000; CALL ResetPulse" +LINE123="STATE000; CALL LSyncBPulse" +LINE124="STATE000; CALL ReadPixel_Blank(2)" +LINE125="STATE000; CALL ReadPixel(H2RG_columns)" +LINE126="STATE000; CALL wbHclk" +LINE127="STATE000; CALL wbReadEN" +LINE128="STATE000; RETURN RXR_ReadRow" +LINE129=Persistence_PulseGlobalReset: +LINE130="STATE000; CALL wResetEN" +LINE131="STATE000; CALL UTR_GR_GrabFrame(10)" +LINE132="STATE000; CALL wbResetEN" +LINE133="STATE000; CALL UTR_GR_GrabFrame(100)" +LINE134="STATE000; RETURN Persistence_PulseGlobalReset" +LINE135=EnhancedRR_Sequence: +LINE136="STATE000; CALL ConfigureEnhancedMode" +LINE137="STATE000; CALL EnhancedRR_GrabFrame(Expose)" +LINE138="STATE000; GOTO WaitForExpose" +LINE139=EnhancedRR_GrabFrame: +LINE140="STATE000; Expose--" +LINE141="STATE000; CALL wFrame" +LINE142="STATE000; CALL wbFSyncB" +LINE143="STATE000; CALL HDCRR_ReadRow(EnhancedRR_Delta)" +LINE144="STATE000; CALL wFSyncB" +LINE145="STATE000; CALL HDCRR_ReadRow(1948)" +LINE146="STATE000; RETURN EnhancedRR_GrabFrame" +LINE147=HDCRR_ReadRow: +LINE148="STATE000; CALL wLine" +LINE149="STATE000; CALL PulseVCLK" +LINE150="STATE000; CALL wbVReadEdge" +LINE151="STATE000; CALL LSyncBPulse" +LINE152="STATE000; CALL wReadEN" +LINE153="STATE000; CALL ResetPulse" +LINE154="STATE000; CALL ReadPixel_Blank(1)" +LINE155="STATE000; CALL ReadPixel(64)" +LINE156="STATE000; CALL wVReadEdge" +LINE157="STATE000; CALL LSyncBPulse" +LINE158="STATE000; CALL ReadPixel_Blank(1)" +LINE159="STATE000; CALL ReadPixel(64)" +LINE160="STATE000; CALL wbReadEN" +LINE161="STATE000; RETURN HDCRR_ReadRow" +LINE162=Guiding_Sequence: +LINE163="STATE000; if Expose CALL GrabWindow" +LINE164="STATE000; if Abort CALL AbortSeq" +LINE165="STATE000; GOTO Guiding_Sequence" +LINE166=GrabWindow: +LINE167="STATE000; CALL wFrame" +LINE168="STATE000; CALL StartFrame" +LINE169="STATE000; CALL WinRX_ReadRow(H2RG_win_rows)" +LINE170="STATE000; CALL PulseVCLK" +LINE171="STATE000; CALL ExposureTimer" +LINE172="STATE000; RETURN GrabWindow" +LINE173=WinRX_ReadRow: +LINE174="STATE000; CALL wLine" +LINE175="STATE000; CALL StartRow" +LINE176="STATE000; CALL wReadEN" +LINE177="STATE000; CALL ReadPixel_Blank(2)" +LINE178="STATE000; CALL ReadPixel(H2RG_win_columns)" +LINE179="STATE000; CALL ResetPulse" +LINE180="STATE000; CALL wbHclk" +LINE181="STATE000; CALL wbReadEN" +LINE182="STATE000; RETURN WinRX_ReadRow" +LINE183=ExposureTimer: +LINE184="STATE000; if longexposure CALL Sec(exptime)" +LINE185="STATE000; if !longexposure CALL MilliSec(exptime)" +LINE186="STATE000; if Abort GOTO AbortSeq" +LINE187="STATE000; RETURN ExposureTimer" +LINE188=MilliSec: +LINE189="STATE000; CALL wDelay1ms" +LINE190="STATE000; RETURN MilliSec" +LINE191=Sec: +LINE192="STATE000; CALL wDelay1ms(1000)" +LINE193="STATE000; RETURN Sec" +LINE194=AbortSeq: +LINE195="STATE000; CALL InitExposeCpt(1000)" +LINE196="STATE000; CALL InitResetCpt(100)" +LINE197="STATE000; mode_VideoRX--" +LINE198="STATE000; mode_VideoRXR--" +LINE199="STATE000; Abort--" +LINE200="STATE000; GOTO WaitForExpose" +LINE201=InitExposeCpt: +LINE202="STATE000; Expose--" +LINE203="STATE000; RETURN InitExposeCpt" +LINE204=InitResetCpt: +LINE205="STATE000; prv_flag_reset--" +LINE206="STATE000; RETURN InitResetCpt" +LINE207=wDelay1us: +LINE208="STATE000; STATE000(98)" +LINE209="STATE000; RETURN wDelay1us" +LINE210=wDelay10us: +LINE211="STATE000; STATE000(998)" +LINE212="STATE000; RETURN wDelay10us" +LINE213=wDelay1ms: +LINE214="STATE000; STATE000(99998)" +LINE215="STATE000; RETURN wDelay1ms" +LINE216=InitClocks: +LINE217="STATE001; STATE000(99998)" +LINE218="STATE000; RETURN InitClocks" +LINE219=wCLKEn: +LINE220="STATE002; STATE000(999998)" +LINE221="STATE000; RETURN wCLKEn" +LINE222=ResetRegistersDefault: +LINE223="STATE003; STATE000(999999)" +LINE224="STATE004; STATE000(99998)" +LINE225="STATE000; RETURN ResetRegistersDefault" +LINE226=StartFrame: +LINE227="STATE005; STATE000(79)" +LINE228="STATE006; STATE000(918)" +LINE229="STATE000; RETURN StartFrame" +LINE230=StartRow: +LINE231="STATE007; STATE000(79)" +LINE232="STATE008; STATE000(918)" +LINE233="STATE000; RETURN StartRow" +LINE234=PulseVCLK: +LINE235="STATE009; STATE000(79)" +LINE236="STATE010; STATE000(798)" +LINE237="STATE000; RETURN PulseVCLK" +LINE238=wReadEN: +LINE239="STATE011; STATE000(158)" +LINE240="STATE000; RETURN wReadEN" +LINE241=wbReadEN: +LINE242="STATE012; STATE000(158)" +LINE243="STATE000; RETURN wbReadEN" +LINE244=ReadPixel: +LINE245="STATE013;" +LINE246="STATE014; STATE000(78)" +LINE247="STATE015; STATE000(918)" +LINE248="STATE000; RETURN ReadPixel" +LINE249=ReadPixel_Blank: +LINE250="STATE016; STATE000(79)" +LINE251="STATE015; STATE000(918)" +LINE252="STATE000; RETURN ReadPixel_Blank" +LINE253=wbHclk: +LINE254="STATE016; STATE000(78)" +LINE255="STATE000; RETURN wbHclk" +LINE256=ResetPulse: +LINE257="STATE017; STATE000(999)" +LINE258="STATE018; STATE000(78)" +LINE259="STATE000; RETURN ResetPulse" +LINE260=ResetPulse_Dummy: +LINE261="STATE018; STATE000(999)" +LINE262="STATE018; STATE000(78)" +LINE263="STATE000; RETURN ResetPulse_Dummy" +LINE264=wResetEN: +LINE265="STATE017; STATE000(78)" +LINE266="STATE000; RETURN wResetEN" +LINE267=wbResetEN: +LINE268="STATE018; STATE000(78)" +LINE269="STATE000; RETURN wbResetEN" +LINE270=LSyncBPulse: +LINE271="STATE019; STATE000(79)" +LINE272="STATE020; STATE000(78)" +LINE273="STATE000; RETURN LSyncBPulse" +LINE274=wVReadEdge: +LINE275="STATE021; STATE000(78)" +LINE276="STATE000; RETURN wVReadEdge" +LINE277=wbVReadEdge: +LINE278="STATE022; STATE000(78)" +LINE279="STATE000; RETURN wbVReadEdge" +LINE280=wFSyncB: +LINE281="STATE006; STATE000(78)" +LINE282="STATE000; RETURN wFSyncB" +LINE283=wbFSyncB: +LINE284="STATE005; STATE000(78)" +LINE285="STATE000; RETURN wbFSyncB" +LINE286=ConfigureEnhancedMode: +LINE287="STATE023; STATE000(79)" +LINE288="STATE024; STATE000(79)" +LINE289="STATE025; STATE000(78)" +LINE290="STATE000; RETURN ConfigureEnhancedMode" +LINE291=wFrame: +LINE292="STATE026; RETURN wFrame" +LINE293=wLine: +LINE294="STATE027; RETURN wLine" +LINE295=wPixel: +LINE296="STATE028;" +LINE297="STATE014; RETURN wPixel" +LINES=298 +MOD10\LVLC_V1=2.3 +MOD10\LVLC_ORDER1=2 +MOD10\LVLC_LABEL1=Bias Gate +MOD10\LVLC_V2=3.3 +MOD10\LVLC_ORDER2=2 +MOD10\LVLC_LABEL2=Bias Power +MOD10\LVLC_V3=0.55 +MOD10\LVLC_ORDER3=2 +MOD10\LVLC_LABEL3=Diode Sub +MOD10\LVLC_V4=3.3 +MOD10\LVLC_ORDER4=1 +MOD10\LVLC_LABEL4=Digital Supply +MOD10\LVLC_V5=0.3 +MOD10\LVLC_ORDER5=2 +MOD10\LVLC_LABEL5=Diode Reset +MOD10\LVLC_V6=3.3 +MOD10\LVLC_ORDER6=1 +MOD10\LVLC_LABEL6=Analog Supply +MOD10\LVLC_V7=2.9 +MOD10\LVLC_ORDER7=1 +MOD10\LVLC_LABEL7=Preamp neg ref +MOD10\LVLC_V8=3.3 +MOD10\LVLC_ORDER8=2 +MOD10\LVLC_LABEL8=clock enable +MOD10\LVLC_V9=2.0 +MOD10\LVLC_ORDER9=2 +MOD10\LVLC_LABEL9=Preamp enable +MOD10\LVLC_V10=0.0 +MOD10\LVLC_ORDER10=1 +MOD10\LVLC_V11=0.0 +MOD10\LVLC_ORDER11=1 +MOD10\LVLC_V12=0.0 +MOD10\LVLC_ORDER12=1 +MOD10\LVLC_V13=0.0 +MOD10\LVLC_ORDER13=1 +MOD10\LVLC_V14=0.0 +MOD10\LVLC_ORDER14=1 +MOD10\LVLC_V15=0.0 +MOD10\LVLC_ORDER15=1 +MOD10\LVLC_V16=0.0 +MOD10\LVLC_ORDER16=1 +MOD10\LVLC_V17=0.0 +MOD10\LVLC_ORDER17=1 +MOD10\LVLC_V18=0.0 +MOD10\LVLC_ORDER18=1 +MOD10\LVLC_V19=0.0 +MOD10\LVLC_ORDER19=1 +MOD10\LVLC_V20=0.0 +MOD10\LVLC_ORDER20=1 +MOD10\LVLC_V21=0.0 +MOD10\LVLC_ORDER21=1 +MOD10\LVLC_V22=0.0 +MOD10\LVLC_ORDER22=1 +MOD10\LVLC_V23=0.0 +MOD10\LVLC_ORDER23=1 +MOD10\LVLC_V24=0.0 +MOD10\LVLC_ORDER24=1 +MOD10\LVHC_ENABLE1=1 +MOD10\LVHC_V1=3.3 +MOD10\LVHC_IL1=10 +MOD10\LVHC_ORDER1=3 +MOD10\LVHC_LABEL1=PullUp +MOD10\LVHC_ENABLE2=0 +MOD10\LVHC_V2=0.0 +MOD10\LVHC_IL2=50 +MOD10\LVHC_ORDER2=1 +MOD10\LVHC_LABEL2=Misc 1 +MOD10\LVHC_ENABLE3=0 +MOD10\LVHC_V3=0.0 +MOD10\LVHC_IL3=10 +MOD10\LVHC_ORDER3=1 +MOD10\LVHC_LABEL3=Misc 2 +MOD10\LVHC_ENABLE4=0 +MOD10\LVHC_V4=0.0 +MOD10\LVHC_IL4=100 +MOD10\LVHC_ORDER4=1 +MOD10\LVHC_LABEL4=Misc 3 +MOD10\LVHC_ENABLE5=1 +MOD10\LVHC_V5=0.0 +MOD10\LVHC_IL5=10 +MOD10\LVHC_ORDER5=1 +MOD10\LVHC_LABEL5=LED IR +MOD10\LVHC_ENABLE6=1 +MOD10\LVHC_V6=0.0 +MOD10\LVHC_IL6=70 +MOD10\LVHC_ORDER6=1 +MOD10\LVHC_LABEL6=Light Bulb +MOD11\DIO_SOURCE1=0 +MOD11\DIO_DIR1=0 +MOD11\DIO_SOURCE2=0 +MOD11\DIO_DIR2=0 +MOD11\DIO_SOURCE3=0 +MOD11\DIO_DIR3=0 +MOD11\DIO_SOURCE4=0 +MOD11\DIO_DIR4=0 +MOD11\DIO_POWER=0 +STATE0\NAME=STATE000 +STATE0\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE0\CONTROL="0,3F" +STATE0\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE1\NAME=STATE001 +STATE1\MOD11="1,1,0,0,0,0,1,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE1\CONTROL="0,3F" +STATE1\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE2\NAME=STATE002 +STATE2\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE2\CONTROL="0,3F" +STATE2\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,3.3" +STATE3\NAME=STATE003 +STATE3\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE3\CONTROL="0,3F" +STATE3\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE4\NAME=STATE004 +STATE4\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE4\CONTROL="0,3F" +STATE4\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE5\NAME=STATE005 +STATE5\MOD11="1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE5\CONTROL="0,3F" +STATE5\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE6\NAME=STATE006 +STATE6\MOD11="1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE6\CONTROL="0,3F" +STATE6\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE7\NAME=STATE007 +STATE7\MOD11="1,1,1,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE7\CONTROL="0,3F" +STATE7\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE8\NAME=STATE008 +STATE8\MOD11="1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE8\CONTROL="0,3F" +STATE8\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE9\NAME=STATE009 +STATE9\MOD11="1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE9\CONTROL="0,3F" +STATE9\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE10\NAME=STATE010 +STATE10\MOD11="1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE10\CONTROL="0,3F" +STATE10\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE11\NAME=STATE011 +STATE11\MOD11="1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE11\CONTROL="0,3F" +STATE11\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE12\NAME=STATE012 +STATE12\MOD11="1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE12\CONTROL="0,3F" +STATE12\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE13\NAME=STATE013 +STATE13\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE13\CONTROL="8,37" +STATE13\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE14\NAME=STATE014 +STATE14\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE14\CONTROL="0,31" +STATE14\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE15\NAME=STATE015 +STATE15\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE15\CONTROL="0,3F" +STATE15\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE16\NAME=STATE016 +STATE16\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE16\CONTROL="0,3F" +STATE16\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE17\NAME=STATE017 +STATE17\MOD11="1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE17\CONTROL="0,3F" +STATE17\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE18\NAME=STATE018 +STATE18\MOD11="1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE18\CONTROL="0,3F" +STATE18\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE19\NAME=STATE019 +STATE19\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE19\CONTROL="0,3F" +STATE19\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE20\NAME=STATE020 +STATE20\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE20\CONTROL="0,3F" +STATE20\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE21\NAME=STATE021 +STATE21\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE21\CONTROL="0,3F" +STATE21\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE22\NAME=STATE022 +STATE22\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE22\CONTROL="0,3F" +STATE22\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE23\NAME=STATE023 +STATE23\MOD11="1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE23\CONTROL="0,3F" +STATE23\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE24\NAME=STATE024 +STATE24\MOD11="0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE24\CONTROL="0,3F" +STATE24\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE25\NAME=STATE025 +STATE25\MOD11="1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE25\CONTROL="0,3F" +STATE25\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE26\NAME=STATE026 +STATE26\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE26\CONTROL="2,3D" +STATE26\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE27\NAME=STATE027 +STATE27\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE27\CONTROL="4,3B" +STATE27\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE28\NAME=STATE028 +STATE28\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE28\CONTROL="8,37" +STATE28\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATES=29 +[SYSTEM] +BACKPLANE_ID=0000000000000000 +BACKPLANE_REV=0 +BACKPLANE_TYPE=1 +BACKPLANE_VERSION=0.0.0 +MOD10_ID=0000000000000000 +MOD10_REV=0 +MOD10_VERSION=0.0.0 +MOD10_TYPE=9 +MOD11_ID=0000000000000000 +MOD11_REV=0 +MOD11_VERSION=0.0.0 +MOD11_TYPE=10 +[MODE_GUIDING] +ACF:Expose=0 +ACF:LINECOUNT=2048 +ACF:PIXELCOUNT=64 +ACF:mode_EnhancedRollingReset=0 +ACF:mode_Guiding=1 +ACF:mode_UTR_RR=0 +ACF:mode_VideoRX=0 +ACF:mode_VideoRXR=0 +ARCH:HORI_AMPS=1 +ARCH:NUM_DETECT=1 +ARCH:VERT_AMPS=1 +FITS:READOUTMODE=Guiding +[MODE_VIDEORXR] +ACF:Expose=0 +ACF:LINECOUNT=2048 +ACF:PIXELCOUNT=128 +ACF:mode_EnhancedRollingReset=0 +ACF:mode_Guiding=0 +ACF:mode_UTR_RR=0 +ACF:mode_VideoRX=0 +ACF:mode_VideoRXR=1 +ARCH:HORI_AMPS=33 +ARCH:NUM_DETECT=1 +ARCH:VERT_AMPS=1 +FITS:READOUTMODE=VideoRXR +[MODE_VIDEORX] +ACF:Expose=0 +ACF:LINECOUNT=2048 +ACF:PIXELCOUNT=64 +ACF:mode_EnhancedRollingReset=0 +ACF:mode_Guiding=0 +ACF:mode_UTR_RR=0 +ACF:mode_VideoRX=1 +ACF:mode_VideoRXR=0 +ARCH:HORI_AMPS=33 +ARCH:NUM_DETECT=1 +ARCH:VERT_AMPS=1 +FITS:READOUTMODE=VideoRX +[MODE_UTR_RR] +ACF:Expose=0 +ACF:LINECOUNT=2048 +ACF:PIXELCOUNT=64 +ACF:mode_EnhancedRollingReset=0 +ACF:mode_Guiding=0 +ACF:mode_UTR_RR=1 +ACF:mode_VideoRX=0 +ACF:mode_VideoRXR=0 +ARCH:HORI_AMPS=33 +ARCH:NUM_DETECT=1 +ARCH:VERT_AMPS=1 +FITS:READOUTMODE=UpTheRampRollingReset +[MODE_DEFAULT] +ACF:Expose=0 +ACF:LINECOUNT=2048 +ACF:PIXELCOUNT=64 +ACF:mode_EnhancedRollingReset=0 +ACF:mode_Guiding=0 +ACF:mode_UTR_RR=1 +ACF:mode_VideoRX=0 +ACF:mode_VideoRXR=0 +ARCH:HORI_AMPS=33 +ARCH:NUM_DETECT=1 +ARCH:VERT_AMPS=1 +FITS:READOUTMODE=UpTheRampRollingReset diff --git a/Config/cryoscope_100us.acf b/Config/cryoscope_100us.acf new file mode 100644 index 00000000..9bb436b5 --- /dev/null +++ b/Config/cryoscope_100us.acf @@ -0,0 +1,793 @@ +[CONFIG] +MOD10\DIO_DIR12=1 +MOD10\DIO_DIR34=1 +MOD10\DIO_POWER=1 +MOD10\DIO_SOURCE1=3 +MOD10\DIO_SOURCE2=3 +MOD10\DIO_SOURCE3=3 +MOD10\VCPU_INREG0=0 +MOD10\VCPU_INREG1=0 +MOD10\VCPU_INREG10=0 +MOD10\VCPU_INREG11=0 +MOD10\VCPU_INREG12=0 +MOD10\VCPU_INREG13=0 +MOD10\VCPU_INREG14=0 +MOD10\VCPU_INREG15=0 +MOD10\VCPU_INREG2=0 +MOD10\VCPU_INREG3=0 +MOD10\VCPU_INREG4=0 +MOD10\VCPU_INREG5=0 +MOD10\VCPU_INREG6=0 +MOD10\VCPU_INREG7=0 +MOD10\VCPU_INREG8=0 +MOD10\VCPU_INREG9=0 +MOD10\VCPU_LINE0="ALIAS r0 TriggerHw ; reads hardware trigger" +MOD10\VCPU_LINE1="ALIAS r1 TriggerSw ; reads software trigger" +MOD10\VCPU_LINE10=";" +MOD10\VCPU_LINE11="DIN_PORT=0x0000 ; digital input port register" +MOD10\VCPU_LINE12="SOFT_TRIG=0x0010 ; software trigger VCPU_INREG0" +MOD10\VCPU_LINE13="DATA_WORD=0x0011 ; VCPU_INREG1 carries the word to write serially" +MOD10\VCPU_LINE14= +MOD10\VCPU_LINE15="; bitmasks" +MOD10\VCPU_LINE16=";" +MOD10\VCPU_LINE17="DATACLK_HI=1" +MOD10\VCPU_LINE18="DATACLK_LO=0" +MOD10\VCPU_LINE19="CSB_HI=2" +MOD10\VCPU_LINE2="ALIAS r2 Once ; allows one-shot software trigger" +MOD10\VCPU_LINE20="CSB_LO=0" +MOD10\VCPU_LINE21="DATAIN_HI=4" +MOD10\VCPU_LINE22="DATAIN_LO=0" +MOD10\VCPU_LINE23="HW_TRIG=0x10 ; hardware trigger bit = DIO5" +MOD10\VCPU_LINE24= +MOD10\VCPU_LINE25="; Initialize Output Ports" +MOD10\VCPU_LINE26=";" +MOD10\VCPU_LINE27="LOAD ClockPort, 0x0101 ; ClockPort = DIO1" +MOD10\VCPU_LINE28="LOAD DataPort, 0x0104 ; DataPort = DIO3" +MOD10\VCPU_LINE29="LOAD SPI, 0x0107 ; CLK=DIO1, CSB=DIO2, DATA=DIO3" +MOD10\VCPU_LINE3="ALIAS r3 Counter ; general purpose counter" +MOD10\VCPU_LINE30= +MOD10\VCPU_LINE31="LOAD Once, 0 ; clear the Once flag" +MOD10\VCPU_LINE32="INPUT TriggerSw, SOFT_TRIG ; read the software trigger once at program start only" +MOD10\VCPU_LINE33="TEST TriggerSw, 1" +MOD10\VCPU_LINE34="IF Z GOTO Init ; if clear then leave the Once flag clear" +MOD10\VCPU_LINE35="LOAD Once, HW_TRIG ; otherwise set the Once flag same as a hardware trigger" +MOD10\VCPU_LINE36= +MOD10\VCPU_LINE37="; Initialize all ports and registers" +MOD10\VCPU_LINE38=";" +MOD10\VCPU_LINE39=Init: +MOD10\VCPU_LINE4="ALIAS r4 Data ; this register caries the data" +MOD10\VCPU_LINE40="OUTPUT SPI, 0x06 ; DATAIN=HI, CSB=HI, CLK=LO (110)" +MOD10\VCPU_LINE41= +MOD10\VCPU_LINE42="; WaitForTrigger" +MOD10\VCPU_LINE43="; Loop here until either a hardware or software trigger is received" +MOD10\VCPU_LINE44=";" +MOD10\VCPU_LINE45=WaitForTriggerLO: +MOD10\VCPU_LINE46=";LOAD Counter, 1 ; initialize Counter for LO state" +MOD10\VCPU_LINE47= +MOD10\VCPU_LINE48=TestTriggerLO: +MOD10\VCPU_LINE49="INPUT TriggerHw, DIN_PORT ; read the hardware trigger" +MOD10\VCPU_LINE5="ALIAS r5 ClockPort ; holds the address for the DATACLK port" +MOD10\VCPU_LINE50="TEST TriggerHw, HW_TRIG ; Z = NOT(TriggerHw & HW_TRIG)" +MOD10\VCPU_LINE51="IF NZ GOTO WaitForTriggerLO ; loop waiting until Trigger==0" +MOD10\VCPU_LINE52=";SUB Counter, 1 ; decrement LO counter" +MOD10\VCPU_LINE53=";IF NZ GOTO TestTriggerLO ; keep checking Trigger until LO for \"Counter\" cycles" +MOD10\VCPU_LINE54= +MOD10\VCPU_LINE55=WaitForTriggerHI: +MOD10\VCPU_LINE56=";LOAD Counter, 1 ; initialize Counter for HI state" +MOD10\VCPU_LINE57= +MOD10\VCPU_LINE58=TestTriggerHI: +MOD10\VCPU_LINE59="INPUT TriggerHw, DIN_PORT ; read the hardware trigger" +MOD10\VCPU_LINE6="ALIAS r7 DataPort ; holds the address for the DATAIN port" +MOD10\VCPU_LINE60="OR TriggerHw, Once ; OR with Once register: TriggerHw=TriggerHw|Once" +MOD10\VCPU_LINE61="TEST TriggerHw, HW_TRIG ; Z = NOT(TriggerHw & HW_TRIG)" +MOD10\VCPU_LINE62="IF Z GOTO WaitForTriggerHI ; loop waiting until Trigger==1" +MOD10\VCPU_LINE63=";SUB Counter, 1 ; increment HI counter" +MOD10\VCPU_LINE64=";IF NZ GOTO TestTriggerHI ; keep checking Trigger until HI for \"Counter\" cycles" +MOD10\VCPU_LINE65= +MOD10\VCPU_LINE66="LOAD Counter, 16 ; initialize Counter to 16 bit word length" +MOD10\VCPU_LINE67= +MOD10\VCPU_LINE68="; SendSerial" +MOD10\VCPU_LINE69="; jump here when a trigger is received to send the serial data word" +MOD10\VCPU_LINE7="ALIAS r9 SPI ; address for CLK/CS/DATA" +MOD10\VCPU_LINE70=";" +MOD10\VCPU_LINE71=SendSerial: +MOD10\VCPU_LINE72="INPUT Data, DATA_WORD ; copy the requested word from the VCPU_INREG" +MOD10\VCPU_LINE73="OUTPUT SPI, 0x04 ; enable CSB: DATAIN=HI, CSB=LO, CLK=LO (100)" +MOD10\VCPU_LINE74= +MOD10\VCPU_LINE75="SendSerialLoop: ; loop over this for each bit in the data word" +MOD10\VCPU_LINE76="OUTPUT SPI, 0x04 ; each bit starts with DATA=HI and CLK=LO" +MOD10\VCPU_LINE77="SLA Data ; shift the MSB of Data into Carry" +MOD10\VCPU_LINE78="IF NC OUTPUT DataPort, DATAIN_LO ; if C is clear then bring DATAIN LO" +MOD10\VCPU_LINE79="OUTPUT ClockPort, DATACLK_HI ; then bring the clock HI" +MOD10\VCPU_LINE8= +MOD10\VCPU_LINE80="SUB Counter, 1 ; decrement bit counter" +MOD10\VCPU_LINE81="IF NZ GOTO SendSerialLoop ; keep looping over all bits in the data word" +MOD10\VCPU_LINE82="LOAD Once, 0 ; clear the Once register to stop software triggers" +MOD10\VCPU_LINE83=GOTO Init +MOD10\VCPU_LINE84= +MOD10\VCPU_LINE9="; Define Constants" +MOD10\VCPU_LINES=85 +BIGBUF=0 +FRAMEMODE=1 +LINECOUNT=2048 +PIXELCOUNT=64 +RAWENABLE=0 +RAWENDLINE=10 +RAWSAMPLES=25600 +RAWSEL=0 +RAWSTARTLINE=0 +RAWSTARTPIXEL=0 +SAMPLEMODE=0 +SHP1=256 +SHP2=592 +SHD1=600 +SHD2=600 +TAPLINE0="AM26L,1,0" +TAPLINE1="AM45R,1,0" +TAPLINE2="AM28L,1,0" +TAPLINE3="AM49R,1,0" +TAPLINE4="AM43L,1,0" +TAPLINE5="AM47R,1,0" +TAPLINE6="AM30L,1,0" +TAPLINE7="AM33R,1,0" +TAPLINE8="AM32L,1,0" +TAPLINE9="AM48R,1,0" +TAPLINE10="AM23L,1,0" +TAPLINE11="AM40R,1,0" +TAPLINE12="AM35L,1,0" +TAPLINE13="AM27R,1,0" +TAPLINE14="AM44L,1,0" +TAPLINE15="AM22R,1,0" +TAPLINE16="AM50L,1,0" +TAPLINE17="AM31R,1,0" +TAPLINE18="AM53L,1,0" +TAPLINE19="AM25R,1,0" +TAPLINE20="AM41L,1,0" +TAPLINE21="AM34R,1,0" +TAPLINE22="AM39L,1,0" +TAPLINE23="AM21R,1,0" +TAPLINE24="AM46L,1,0" +TAPLINE25="AM54R,1,0" +TAPLINE26="AM36L,1,0" +TAPLINE27="AM51R,1,0" +TAPLINE28="AM52L,1,0" +TAPLINE29="AM29R,1,0" +TAPLINE30="AM42L,1,0" +TAPLINE31="AM24R,1,0" +TAPLINE32="AM37L,1,0" +TAPLINES=33 +TRIGOUTFORCE=0 +TRIGOUTINVERT=0 +TRIGOUTLEVEL=0 +TRIGOUTPOWER=1 +PARAMETER0="Start=0" +PARAMETER1="Expose=0" +PARAMETER2="ExposeWindow=0" +PARAMETER3="exptime=0" +PARAMETER4="longexposure=0" +PARAMETER5="Abort=0" +PARAMETER6="mode_UTR_RR=1" +PARAMETER7="mode_UTR_GR=0" +PARAMETER8="mode_EnhancedRollingReset=0" +PARAMETER9="mode_VideoRX=0" +PARAMETER10="mode_VideoRXR=0" +PARAMETER11="mode_PermanentReset=0" +PARAMETER12="mode_Guiding=0" +PARAMETER13="mode_InterleavedGuiding=0" +PARAMETER14="exp_PulseWhileGlobReset=0" +PARAMETER15="H2RG_rows=2048" +PARAMETER16="H2RG_rows_skip=0" +PARAMETER17="H2RG_columns=64" +PARAMETER18="H2RG_win_rows=10" +PARAMETER19="H2RG_win_columns=10" +PARAMETER20="H2RGMainReset=0" +PARAMETER21="EnhancedRR_Delta=100" +PARAMETER22="Hold4Programming=0" +PARAMETER23="WindowPixelNb=100" +PARAMETER24="prv_flag_reset=0" +PARAMETER25="prv_ghostframe=0" +PARAMETERS=26 +LINE0=Init: +LINE1="STATE000; CALL InitClocks" +LINE2="STATE000; CALL wCLKEn" +LINE3="STATE000; CALL ResetRegistersDefault" +LINE4="STATE000; if Start GOTO WaitForExpose" +LINE5="STATE000; GOTO Init" +LINE6=ResetRegHxRG: +LINE7="STATE000; CALL ResetRegistersDefault" +LINE8="STATE000; H2RGMainReset--" +LINE9="STATE000; RETURN ResetRegHxRG" +LINE10=WaitForExpose: +LINE11="STATE000; if Expose CALL SelectMode" +LINE12="STATE000; if H2RGMainReset CALL ResetRegHxRG" +LINE13="STATE000; prv_ghostframe++" +LINE14="STATE000; if mode_VideoRXR CALL VideoRXR_GrabFrame" +LINE15="STATE000; if mode_VideoRX CALL VideoRX_GrabFrame" +LINE16="STATE000; prv_ghostframe--" +LINE17="STATE000; CALL wResetEN" +LINE18="STATE000; GOTO WaitForExpose" +LINE19=SelectMode: +LINE20="STATE000; if mode_UTR_RR CALL UTR_RR_Sequence" +LINE21="STATE000; if mode_UTR_GR CALL UTR_GR_Sequence" +LINE22="STATE000; if mode_VideoRX CALL VideoRX_Sequence" +LINE23="STATE000; if mode_VideoRXR CALL VideoRXR_Sequence" +LINE24="STATE000; if mode_PermanentReset CALL PGR_Sequence" +LINE25="STATE000; if mode_EnhancedRollingReset CALL EnhancedRR_Sequence" +LINE26="STATE000; if exp_PulseWhileGlobReset CALL Persistence_PulseGlobalReset" +LINE27="STATE000; if mode_Guiding CALL Guiding_Sequence" +LINE28="STATE000; GOTO WaitForExpose" +LINE29=UTR_RR_Sequence: +LINE30="STATE000; prv_flag_reset++" +LINE31="STATE000; CALL UTR_RR_GrabFrame(Expose)" +LINE32="STATE000; GOTO WaitForExpose" +LINE33=UTR_RR_GrabFrame: +LINE34="STATE000; Expose--" +LINE35="STATE000; Expose--" +LINE36="STATE000; if !prv_flag_reset CALL ExposureTimer" +LINE37="STATE000; CALL wFrame" +LINE38="STATE000; CALL StartFrame" +LINE39="STATE000; CALL RR_SkipRow(H2RG_rows_skip)" +LINE40="STATE000; CALL RR_ReadRow(H2RG_rows)" +LINE41="STATE000; CALL PulseVCLK" +LINE42="STATE000; prv_flag_reset--" +LINE43="STATE000; RETURN UTR_RR_GrabFrame" +LINE44=RR_ReadRow: +LINE45="STATE000; CALL wLine" +LINE46="STATE000; CALL StartRow" +LINE47="STATE000; CALL wReadEN" +LINE48="STATE000; if prv_flag_reset CALL ResetPulse" +LINE49="STATE000; if !prv_flag_reset CALL ResetPulse_Dummy" +LINE50="STATE000; CALL ReadPixel_Blank(2)" +LINE51="STATE000; CALL ReadPixel(H2RG_columns)" +LINE52="STATE000; CALL wbHclk" +LINE53="STATE000; CALL wbReadEN" +LINE54="STATE000; RETURN RR_ReadRow" +LINE55=RR_SkipRow: +LINE56="STATE000; CALL StartRow" +LINE57="STATE000; if prv_flag_reset CALL ResetPulse" +LINE58="STATE000; RETURN RR_SkipRow" +LINE59=UTR_GR_Sequence: +LINE60="STATE000; prv_flag_reset++" +LINE61="STATE000; CALL UTR_GR_GrabFrame(Expose)" +LINE62="STATE000; GOTO WaitForExpose" +LINE63=PGR_Sequence: +LINE64="STATE000; CALL wResetEN" +LINE65="STATE000; CALL UTR_GR_GrabFrame(Expose)" +LINE66="STATE000; CALL wbResetEN" +LINE67="STATE000; GOTO WaitForExpose" +LINE68=UTR_GR_GrabFrame: +LINE69="STATE000; Expose--" +LINE70="STATE000; CALL wFrame" +LINE71="STATE000; CALL StartFrame" +LINE72="STATE000; CALL PulseVCLK" +LINE73="STATE000; CALL GR_ReadRow(2048)" +LINE74="STATE000; CALL PulseVCLK" +LINE75="STATE000; prv_flag_reset--" +LINE76="STATE000; RETURN UTR_GR_GrabFrame" +LINE77=GR_ReadRow: +LINE78="STATE000; CALL wLine" +LINE79="STATE000; CALL StartRow" +LINE80="STATE000; CALL wReadEN" +LINE81="STATE000; CALL ReadPixel_Blank(2)" +LINE82="STATE000; CALL ReadPixel(64)" +LINE83="STATE000; CALL wbHclk" +LINE84="STATE000; CALL wbReadEN" +LINE85="STATE000; RETURN GR_ReadRow" +LINE86=VideoRX_Sequence: +LINE87="STATE000; if Expose CALL VideoRX_GrabFrame" +LINE88="STATE000; if Abort CALL AbortSeq" +LINE89="STATE000; if !Expose GOTO WaitForExpose" +LINE90="STATE000; GOTO VideoRX_Sequence" +LINE91=VideoRX_GrabFrame: +LINE92="STATE000; if !prv_ghostframe CALL wFrame" +LINE93="STATE000; CALL StartFrame" +LINE94="STATE000; CALL RR_SkipRow(H2RG_rows_skip)" +LINE95="STATE000; CALL RX_ReadRow(H2RG_rows)" +LINE96="STATE000; CALL PulseVCLK" +LINE97="STATE000; CALL ExposureTimer" +LINE98="STATE000; if !prv_ghostframe CALL DecrExposeCpt" +LINE99="STATE000; RETURN VideoRX_GrabFrame" +LINE100=RX_ReadRow: +LINE101="STATE000; CALL wLine" +LINE102="STATE000; CALL StartRow" +LINE103="STATE000; CALL wReadEN" +LINE104="STATE000; CALL ReadPixel_Blank(2)" +LINE105="STATE000; CALL ReadPixel(H2RG_columns)" +LINE106="STATE000; CALL ResetPulse" +LINE107="STATE000; CALL wbHclk" +LINE108="STATE000; CALL wbReadEN" +LINE109="STATE000; RETURN RX_ReadRow" +LINE110=VideoRXR_Sequence: +LINE111="STATE000; if Expose CALL VideoRXR_GrabFrame" +LINE112="STATE000; if Abort GOTO AbortSeq" +LINE113="STATE000; if !Expose GOTO WaitForExpose" +LINE114="STATE000; GOTO VideoRXR_Sequence" +LINE115=VideoRXR_GrabFrame: +LINE116="STATE000; if !prv_ghostframe CALL wFrame" +LINE117="STATE000; CALL StartFrame" +LINE118="STATE000; CALL RR_SkipRow(H2RG_rows_skip)" +LINE119="STATE000; CALL RXR_ReadRow(H2RG_rows)" +LINE120="STATE000; CALL PulseVCLK" +LINE121="STATE000; CALL ExposureTimer" +LINE122="STATE000; if !prv_ghostframe CALL DecrExposeCpt" +LINE123="STATE000; RETURN VideoRXR_GrabFrame" +LINE124=RXR_ReadRow: +LINE125="STATE000; CALL wLine" +LINE126="STATE000; CALL StartRow" +LINE127="STATE000; CALL wReadEN" +LINE128="STATE000; CALL ReadPixel_Blank(2)" +LINE129="STATE000; CALL ReadPixel(H2RG_columns)" +LINE130="STATE000; CALL ResetPulse" +LINE131="STATE000; CALL LSyncBPulse" +LINE132="STATE000; CALL ReadPixel_Blank(2)" +LINE133="STATE000; CALL ReadPixel(H2RG_columns)" +LINE134="STATE000; CALL wbHclk" +LINE135="STATE000; CALL wbReadEN" +LINE136="STATE000; RETURN RXR_ReadRow" +LINE137=Persistence_PulseGlobalReset: +LINE138="STATE000; CALL wResetEN" +LINE139="STATE000; CALL UTR_GR_GrabFrame(10)" +LINE140="STATE000; CALL wbResetEN" +LINE141="STATE000; CALL UTR_GR_GrabFrame(100)" +LINE142="STATE000; RETURN Persistence_PulseGlobalReset" +LINE143=EnhancedRR_Sequence: +LINE144="STATE000; CALL ConfigureEnhancedMode" +LINE145="STATE000; CALL EnhancedRR_GrabFrame(Expose)" +LINE146="STATE000; GOTO WaitForExpose" +LINE147=EnhancedRR_GrabFrame: +LINE148="STATE000; Expose--" +LINE149="STATE000; CALL wFrame" +LINE150="STATE000; CALL wbFSyncB" +LINE151="STATE000; CALL HDCRR_ReadRow(EnhancedRR_Delta)" +LINE152="STATE000; CALL wFSyncB" +LINE153="STATE000; CALL HDCRR_ReadRow(1948)" +LINE154="STATE000; RETURN EnhancedRR_GrabFrame" +LINE155=HDCRR_ReadRow: +LINE156="STATE000; CALL wLine" +LINE157="STATE000; CALL PulseVCLK" +LINE158="STATE000; CALL wbVReadEdge" +LINE159="STATE000; CALL LSyncBPulse" +LINE160="STATE000; CALL wReadEN" +LINE161="STATE000; CALL ResetPulse" +LINE162="STATE000; CALL ReadPixel_Blank(1)" +LINE163="STATE000; CALL ReadPixel(64)" +LINE164="STATE000; CALL wVReadEdge" +LINE165="STATE000; CALL LSyncBPulse" +LINE166="STATE000; CALL ReadPixel_Blank(1)" +LINE167="STATE000; CALL ReadPixel(64)" +LINE168="STATE000; CALL wbReadEN" +LINE169="STATE000; RETURN HDCRR_ReadRow" +LINE170=Guiding_Sequence: +LINE171="STATE000; if Expose CALL GrabWindow" +LINE172="STATE000; if Abort CALL AbortSeq" +LINE173="STATE000; GOTO Guiding_Sequence" +LINE174=GrabWindow: +LINE175="STATE000; Expose--" +LINE176="STATE000; CALL wFrame" +LINE177="STATE000; CALL StartFrame" +LINE178="STATE000; CALL WinRX_ReadRow(H2RG_win_rows)" +LINE179="STATE000; CALL PulseVCLK" +LINE180="STATE000; CALL ExposureTimer" +LINE181="STATE000; RETURN GrabWindow" +LINE182=WinRX_ReadRow: +LINE183="STATE000; CALL wLine" +LINE184="STATE000; CALL StartRow" +LINE185="STATE000; CALL wReadEN" +LINE186="STATE000; CALL ReadPixel_Blank(2)" +LINE187="STATE000; CALL ReadPixel(H2RG_win_columns)" +LINE188="STATE000; CALL ResetPulse" +LINE189="STATE000; CALL wbHclk" +LINE190="STATE000; CALL wbReadEN" +LINE191="STATE000; RETURN WinRX_ReadRow" +LINE192=ExposureTimer: +LINE193="STATE000; if longexposure CALL Sec(exptime)" +LINE194="STATE000; if !longexposure CALL HectoMicroSec(exptime)" +LINE195="STATE000; if Abort GOTO AbortSeq" +LINE196="STATE000; RETURN ExposureTimer" +LINE197=MilliSec: +LINE198="STATE000; CALL wDelay1ms" +LINE199="STATE000; RETURN MilliSec" +LINE200=HectoMicroSec: +LINE201="STATE000; CALL wDelay1us(100)" +LINE202="STATE000; RETURN HectoMicroSec" +LINE203=Sec: +LINE204="STATE000; CALL wDelay1ms(1000)" +LINE205="STATE000; if Abort GOTO AbortSeq" +LINE206="STATE000; RETURN Sec" +LINE207=AbortSeq: +LINE208="STATE000; CALL DecrExposeCpt(1000)" +LINE209="STATE000; CALL InitResetCpt(100)" +LINE210="STATE000; mode_VideoRX--" +LINE211="STATE000; mode_VideoRXR--" +LINE212="STATE000; mode_Guiding--" +LINE213="STATE000; Abort--" +LINE214="STATE000; GOTO WaitForExpose" +LINE215=DecrExposeCpt: +LINE216="STATE000; Expose--" +LINE217="STATE000; RETURN DecrExposeCpt" +LINE218=InitResetCpt: +LINE219="STATE000; prv_flag_reset--" +LINE220="STATE000; RETURN InitResetCpt" +LINE221=wDelay1us: +LINE222="STATE000; STATE000(98)" +LINE223="STATE000; RETURN wDelay1us" +LINE224=wDelay10us: +LINE225="STATE000; STATE000(998)" +LINE226="STATE000; RETURN wDelay10us" +LINE227=wDelay1ms: +LINE228="STATE000; STATE000(99998)" +LINE229="STATE000; RETURN wDelay1ms" +LINE230=InitClocks: +LINE231="STATE001; STATE000(99998)" +LINE232="STATE000; RETURN InitClocks" +LINE233=wCLKEn: +LINE234="STATE002; STATE000(999998)" +LINE235="STATE000; RETURN wCLKEn" +LINE236=ResetRegistersDefault: +LINE237="STATE003; STATE000(999999)" +LINE238="STATE004; STATE000(99998)" +LINE239="STATE000; RETURN ResetRegistersDefault" +LINE240=StartFrame: +LINE241="STATE005; STATE000(79)" +LINE242="STATE006; STATE000(518)" +LINE243="STATE000; RETURN StartFrame" +LINE244=StartRow: +LINE245="STATE007; STATE000(79)" +LINE246="STATE008; STATE000(518)" +LINE247="STATE000; RETURN StartRow" +LINE248=PulseVCLK: +LINE249="STATE009; STATE000(79)" +LINE250="STATE010; STATE000(798)" +LINE251="STATE000; RETURN PulseVCLK" +LINE252=wReadEN: +LINE253="STATE011; STATE000(158)" +LINE254="STATE000; RETURN wReadEN" +LINE255=wbReadEN: +LINE256="STATE012; STATE000(158)" +LINE257="STATE000; RETURN wbReadEN" +LINE258=ReadPixel: +LINE259="STATE013;" +LINE260="STATE014; STATE000(78)" +LINE261="STATE015; STATE000(518)" +LINE262="STATE000; RETURN ReadPixel" +LINE263=ReadPixel_Blank: +LINE264="STATE016; STATE000(79)" +LINE265="STATE015; STATE000(518)" +LINE266="STATE000; RETURN ReadPixel_Blank" +LINE267=wbHclk: +LINE268="STATE016; STATE000(78)" +LINE269="STATE000; RETURN wbHclk" +LINE270=ResetPulse: +LINE271="STATE017; STATE000(999)" +LINE272="STATE018; STATE000(78)" +LINE273="STATE000; RETURN ResetPulse" +LINE274=ResetPulse_Dummy: +LINE275="STATE018; STATE000(999)" +LINE276="STATE018; STATE000(78)" +LINE277="STATE000; RETURN ResetPulse_Dummy" +LINE278=wResetEN: +LINE279="STATE017; STATE000(78)" +LINE280="STATE000; RETURN wResetEN" +LINE281=wbResetEN: +LINE282="STATE018; STATE000(78)" +LINE283="STATE000; RETURN wbResetEN" +LINE284=LSyncBPulse: +LINE285="STATE019; STATE000(79)" +LINE286="STATE020; STATE000(78)" +LINE287="STATE000; RETURN LSyncBPulse" +LINE288=wVReadEdge: +LINE289="STATE021; STATE000(78)" +LINE290="STATE000; RETURN wVReadEdge" +LINE291=wbVReadEdge: +LINE292="STATE022; STATE000(78)" +LINE293="STATE000; RETURN wbVReadEdge" +LINE294=wFSyncB: +LINE295="STATE006; STATE000(78)" +LINE296="STATE000; RETURN wFSyncB" +LINE297=wbFSyncB: +LINE298="STATE005; STATE000(78)" +LINE299="STATE000; RETURN wbFSyncB" +LINE300=ConfigureEnhancedMode: +LINE301="STATE023; STATE000(79)" +LINE302="STATE024; STATE000(79)" +LINE303="STATE025; STATE000(78)" +LINE304="STATE000; RETURN ConfigureEnhancedMode" +LINE305=wFrame: +LINE306="STATE026; RETURN wFrame" +LINE307=wLine: +LINE308="STATE027; RETURN wLine" +LINE309=wPixel: +LINE310="STATE028;" +LINE311="STATE014; RETURN wPixel" +LINES=312 +MOD10\LVLC_V1=2.3 +MOD10\LVLC_ORDER1=2 +MOD10\LVLC_LABEL1=Bias Gate +MOD10\LVLC_V2=3.3 +MOD10\LVLC_ORDER2=2 +MOD10\LVLC_LABEL2=Bias Power +MOD10\LVLC_V3=0.55 +MOD10\LVLC_ORDER3=2 +MOD10\LVLC_LABEL3=Diode Sub +MOD10\LVLC_V4=3.3 +MOD10\LVLC_ORDER4=1 +MOD10\LVLC_LABEL4=Digital Supply +MOD10\LVLC_V5=0.3 +MOD10\LVLC_ORDER5=2 +MOD10\LVLC_LABEL5=Diode Reset +MOD10\LVLC_V6=3.3 +MOD10\LVLC_ORDER6=1 +MOD10\LVLC_LABEL6=Analog Supply +MOD10\LVLC_V7=2.9 +MOD10\LVLC_ORDER7=1 +MOD10\LVLC_LABEL7=Preamp neg ref +MOD10\LVLC_V8=3.3 +MOD10\LVLC_ORDER8=2 +MOD10\LVLC_LABEL8=clock enable +MOD10\LVLC_V9=2.0 +MOD10\LVLC_ORDER9=2 +MOD10\LVLC_LABEL9=Preamp enable +MOD10\LVLC_V10=0.0 +MOD10\LVLC_ORDER10=1 +MOD10\LVLC_V11=0.0 +MOD10\LVLC_ORDER11=1 +MOD10\LVLC_V12=0.0 +MOD10\LVLC_ORDER12=1 +MOD10\LVLC_V13=0.0 +MOD10\LVLC_ORDER13=1 +MOD10\LVLC_V14=0.0 +MOD10\LVLC_ORDER14=1 +MOD10\LVLC_V15=0.0 +MOD10\LVLC_ORDER15=1 +MOD10\LVLC_V16=0.0 +MOD10\LVLC_ORDER16=1 +MOD10\LVLC_V17=0.0 +MOD10\LVLC_ORDER17=1 +MOD10\LVLC_V18=0.0 +MOD10\LVLC_ORDER18=1 +MOD10\LVLC_V19=0.0 +MOD10\LVLC_ORDER19=1 +MOD10\LVLC_V20=0.0 +MOD10\LVLC_ORDER20=1 +MOD10\LVLC_V21=0.0 +MOD10\LVLC_ORDER21=1 +MOD10\LVLC_V22=0.0 +MOD10\LVLC_ORDER22=1 +MOD10\LVLC_V23=0.0 +MOD10\LVLC_ORDER23=1 +MOD10\LVLC_V24=0.0 +MOD10\LVLC_ORDER24=1 +MOD10\LVHC_ENABLE1=1 +MOD10\LVHC_V1=3.3 +MOD10\LVHC_IL1=10 +MOD10\LVHC_ORDER1=3 +MOD10\LVHC_LABEL1=PullUp +MOD10\LVHC_ENABLE2=0 +MOD10\LVHC_V2=0.0 +MOD10\LVHC_IL2=50 +MOD10\LVHC_ORDER2=1 +MOD10\LVHC_LABEL2=Misc 1 +MOD10\LVHC_ENABLE3=0 +MOD10\LVHC_V3=0.0 +MOD10\LVHC_IL3=10 +MOD10\LVHC_ORDER3=1 +MOD10\LVHC_LABEL3=Misc 2 +MOD10\LVHC_ENABLE4=0 +MOD10\LVHC_V4=0.0 +MOD10\LVHC_IL4=100 +MOD10\LVHC_ORDER4=1 +MOD10\LVHC_LABEL4=Misc 3 +MOD10\LVHC_ENABLE5=1 +MOD10\LVHC_V5=0.0 +MOD10\LVHC_IL5=10 +MOD10\LVHC_ORDER5=1 +MOD10\LVHC_LABEL5=LED IR +MOD10\LVHC_ENABLE6=1 +MOD10\LVHC_V6=0.0 +MOD10\LVHC_IL6=70 +MOD10\LVHC_ORDER6=1 +MOD10\LVHC_LABEL6=Light Bulb +MOD11\DIO_SOURCE1=0 +MOD11\DIO_DIR1=0 +MOD11\DIO_SOURCE2=0 +MOD11\DIO_DIR2=0 +MOD11\DIO_SOURCE3=0 +MOD11\DIO_DIR3=0 +MOD11\DIO_SOURCE4=0 +MOD11\DIO_DIR4=0 +MOD11\DIO_POWER=0 +STATE0\NAME=STATE000 +STATE0\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE0\CONTROL="0,3F" +STATE0\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE1\NAME=STATE001 +STATE1\MOD11="1,1,0,0,0,0,1,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE1\CONTROL="0,3F" +STATE1\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE2\NAME=STATE002 +STATE2\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE2\CONTROL="0,3F" +STATE2\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,3.3" +STATE3\NAME=STATE003 +STATE3\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE3\CONTROL="0,3F" +STATE3\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE4\NAME=STATE004 +STATE4\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE4\CONTROL="0,3F" +STATE4\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE5\NAME=STATE005 +STATE5\MOD11="1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE5\CONTROL="0,3F" +STATE5\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE6\NAME=STATE006 +STATE6\MOD11="1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE6\CONTROL="0,3F" +STATE6\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE7\NAME=STATE007 +STATE7\MOD11="1,1,1,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE7\CONTROL="0,3F" +STATE7\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE8\NAME=STATE008 +STATE8\MOD11="1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE8\CONTROL="0,3F" +STATE8\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE9\NAME=STATE009 +STATE9\MOD11="1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE9\CONTROL="0,3F" +STATE9\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE10\NAME=STATE010 +STATE10\MOD11="1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE10\CONTROL="0,3F" +STATE10\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE11\NAME=STATE011 +STATE11\MOD11="1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE11\CONTROL="0,3F" +STATE11\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE12\NAME=STATE012 +STATE12\MOD11="1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE12\CONTROL="0,3F" +STATE12\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE13\NAME=STATE013 +STATE13\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE13\CONTROL="8,37" +STATE13\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE14\NAME=STATE014 +STATE14\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE14\CONTROL="0,31" +STATE14\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE15\NAME=STATE015 +STATE15\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE15\CONTROL="0,3F" +STATE15\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE16\NAME=STATE016 +STATE16\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE16\CONTROL="0,3F" +STATE16\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE17\NAME=STATE017 +STATE17\MOD11="1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE17\CONTROL="0,3F" +STATE17\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE18\NAME=STATE018 +STATE18\MOD11="1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE18\CONTROL="0,3F" +STATE18\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE19\NAME=STATE019 +STATE19\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE19\CONTROL="0,3F" +STATE19\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE20\NAME=STATE020 +STATE20\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE20\CONTROL="0,3F" +STATE20\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE21\NAME=STATE021 +STATE21\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE21\CONTROL="0,3F" +STATE21\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE22\NAME=STATE022 +STATE22\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE22\CONTROL="0,3F" +STATE22\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE23\NAME=STATE023 +STATE23\MOD11="1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE23\CONTROL="0,3F" +STATE23\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE24\NAME=STATE024 +STATE24\MOD11="0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE24\CONTROL="0,3F" +STATE24\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE25\NAME=STATE025 +STATE25\MOD11="1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE25\CONTROL="0,3F" +STATE25\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE26\NAME=STATE026 +STATE26\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE26\CONTROL="2,3D" +STATE26\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE27\NAME=STATE027 +STATE27\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE27\CONTROL="4,3B" +STATE27\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE28\NAME=STATE028 +STATE28\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE28\CONTROL="8,37" +STATE28\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATES=29 +[SYSTEM] +BACKPLANE_ID=0000000000000000 +BACKPLANE_REV=0 +BACKPLANE_TYPE=1 +BACKPLANE_VERSION=0.0.0 +MOD10_ID=0000000000000000 +MOD10_REV=0 +MOD10_VERSION=0.0.0 +MOD10_TYPE=9 +MOD11_ID=0000000000000000 +MOD11_REV=0 +MOD11_VERSION=0.0.0 +MOD11_TYPE=10 +[MODE_DEFAULT] +ACF:Expose=0 +ACF:LINECOUNT=2048 +ACF:PIXELCOUNT=64 +ACF:mode_EnhancedRollingReset=0 +ACF:mode_Guiding=0 +ACF:mode_UTR_RR=1 +ACF:mode_VideoRX=0 +ACF:mode_VideoRXR=0 +ARCH:HORI_AMPS=33 +ARCH:NUM_DETECT=1 +ARCH:VERT_AMPS=1 +FITS:READOUTMODE=UpTheRampRollingReset +[MODE_UTR_RR] +ACF:Expose=0 +ACF:LINECOUNT=2048 +ACF:PIXELCOUNT=64 +ACF:mode_EnhancedRollingReset=0 +ACF:mode_Guiding=0 +ACF:mode_UTR_RR=1 +ACF:mode_VideoRX=0 +ACF:mode_VideoRXR=0 +ARCH:HORI_AMPS=33 +ARCH:NUM_DETECT=1 +ARCH:VERT_AMPS=1 +FITS:READOUTMODE=UpTheRampRollingReset +[MODE_VIDEORX] +ACF:Expose=0 +ACF:LINECOUNT=2048 +ACF:PIXELCOUNT=64 +ACF:mode_EnhancedRollingReset=0 +ACF:mode_Guiding=0 +ACF:mode_UTR_RR=0 +ACF:mode_VideoRX=1 +ACF:mode_VideoRXR=0 +ARCH:HORI_AMPS=33 +ARCH:NUM_DETECT=1 +ARCH:VERT_AMPS=1 +FITS:READOUTMODE=VideoRX +[MODE_VIDEORXR] +ACF:Expose=0 +ACF:LINECOUNT=2048 +ACF:PIXELCOUNT=128 +ACF:mode_EnhancedRollingReset=0 +ACF:mode_Guiding=0 +ACF:mode_UTR_RR=0 +ACF:mode_VideoRX=0 +ACF:mode_VideoRXR=1 +ARCH:HORI_AMPS=33 +ARCH:NUM_DETECT=1 +ARCH:VERT_AMPS=1 +FITS:READOUTMODE=VideoRXR +[MODE_GUIDING] +ACF:Expose=0 +ACF:LINECOUNT=2048 +ACF:PIXELCOUNT=64 +ACF:mode_EnhancedRollingReset=0 +ACF:mode_Guiding=1 +ACF:mode_UTR_RR=0 +ACF:mode_VideoRX=0 +ACF:mode_VideoRXR=0 +ARCH:HORI_AMPS=1 +ARCH:NUM_DETECT=1 +ARCH:VERT_AMPS=1 +FITS:READOUTMODE=Guiding diff --git a/Config/cryoscope_new.acf b/Config/cryoscope_new.acf new file mode 100644 index 00000000..ed2e28cc --- /dev/null +++ b/Config/cryoscope_new.acf @@ -0,0 +1,673 @@ +[CONFIG] +MOD10\DIO_DIR12=1 +MOD10\DIO_DIR34=1 +MOD10\DIO_POWER=1 +MOD10\DIO_SOURCE1=3 +MOD10\DIO_SOURCE2=3 +MOD10\DIO_SOURCE3=3 +MOD10\VCPU_INREG0=0 +MOD10\VCPU_INREG1=0 +MOD10\VCPU_INREG10=0 +MOD10\VCPU_INREG11=0 +MOD10\VCPU_INREG12=0 +MOD10\VCPU_INREG13=0 +MOD10\VCPU_INREG14=0 +MOD10\VCPU_INREG15=0 +MOD10\VCPU_INREG2=0 +MOD10\VCPU_INREG3=0 +MOD10\VCPU_INREG4=0 +MOD10\VCPU_INREG5=0 +MOD10\VCPU_INREG6=0 +MOD10\VCPU_INREG7=0 +MOD10\VCPU_INREG8=0 +MOD10\VCPU_INREG9=0 +MOD10\VCPU_LINE0="ALIAS r0 TriggerHw ; reads hardware trigger" +MOD10\VCPU_LINE1="ALIAS r1 TriggerSw ; reads software trigger" +MOD10\VCPU_LINE10=";" +MOD10\VCPU_LINE11="DIN_PORT=0x0000 ; digital input port register" +MOD10\VCPU_LINE12="SOFT_TRIG=0x0010 ; software trigger VCPU_INREG0" +MOD10\VCPU_LINE13="DATA_WORD=0x0011 ; VCPU_INREG1 carries the word to write serially" +MOD10\VCPU_LINE14= +MOD10\VCPU_LINE15="; bitmasks" +MOD10\VCPU_LINE16=";" +MOD10\VCPU_LINE17="DATACLK_HI=1" +MOD10\VCPU_LINE18="DATACLK_LO=0" +MOD10\VCPU_LINE19="CSB_HI=2" +MOD10\VCPU_LINE2="ALIAS r2 Once ; allows one-shot software trigger" +MOD10\VCPU_LINE20="CSB_LO=0" +MOD10\VCPU_LINE21="DATAIN_HI=4" +MOD10\VCPU_LINE22="DATAIN_LO=0" +MOD10\VCPU_LINE23="HW_TRIG=0x10 ; hardware trigger bit = DIO5" +MOD10\VCPU_LINE24= +MOD10\VCPU_LINE25="; Initialize Output Ports" +MOD10\VCPU_LINE26=";" +MOD10\VCPU_LINE27="LOAD ClockPort, 0x0101 ; ClockPort = DIO1" +MOD10\VCPU_LINE28="LOAD DataPort, 0x0104 ; DataPort = DIO3" +MOD10\VCPU_LINE29="LOAD SPI, 0x0107 ; CLK=DIO1, CSB=DIO2, DATA=DIO3" +MOD10\VCPU_LINE3="ALIAS r3 Counter ; general purpose counter" +MOD10\VCPU_LINE30= +MOD10\VCPU_LINE31="LOAD Once, 0 ; clear the Once flag" +MOD10\VCPU_LINE32="INPUT TriggerSw, SOFT_TRIG ; read the software trigger once at program start only" +MOD10\VCPU_LINE33="TEST TriggerSw, 1" +MOD10\VCPU_LINE34="IF Z GOTO Init ; if clear then leave the Once flag clear" +MOD10\VCPU_LINE35="LOAD Once, HW_TRIG ; otherwise set the Once flag same as a hardware trigger" +MOD10\VCPU_LINE36= +MOD10\VCPU_LINE37="; Initialize all ports and registers" +MOD10\VCPU_LINE38=";" +MOD10\VCPU_LINE39=Init: +MOD10\VCPU_LINE4="ALIAS r4 Data ; this register caries the data" +MOD10\VCPU_LINE40="OUTPUT SPI, 0x06 ; DATAIN=HI, CSB=HI, CLK=LO (110)" +MOD10\VCPU_LINE41= +MOD10\VCPU_LINE42="; WaitForTrigger" +MOD10\VCPU_LINE43="; Loop here until either a hardware or software trigger is received" +MOD10\VCPU_LINE44=";" +MOD10\VCPU_LINE45=WaitForTriggerLO: +MOD10\VCPU_LINE46=";LOAD Counter, 1 ; initialize Counter for LO state" +MOD10\VCPU_LINE47= +MOD10\VCPU_LINE48=TestTriggerLO: +MOD10\VCPU_LINE49="INPUT TriggerHw, DIN_PORT ; read the hardware trigger" +MOD10\VCPU_LINE5="ALIAS r5 ClockPort ; holds the address for the DATACLK port" +MOD10\VCPU_LINE50="TEST TriggerHw, HW_TRIG ; Z = NOT(TriggerHw & HW_TRIG)" +MOD10\VCPU_LINE51="IF NZ GOTO WaitForTriggerLO ; loop waiting until Trigger==0" +MOD10\VCPU_LINE52=";SUB Counter, 1 ; decrement LO counter" +MOD10\VCPU_LINE53=";IF NZ GOTO TestTriggerLO ; keep checking Trigger until LO for \"Counter\" cycles" +MOD10\VCPU_LINE54= +MOD10\VCPU_LINE55=WaitForTriggerHI: +MOD10\VCPU_LINE56=";LOAD Counter, 1 ; initialize Counter for HI state" +MOD10\VCPU_LINE57= +MOD10\VCPU_LINE58=TestTriggerHI: +MOD10\VCPU_LINE59="INPUT TriggerHw, DIN_PORT ; read the hardware trigger" +MOD10\VCPU_LINE6="ALIAS r7 DataPort ; holds the address for the DATAIN port" +MOD10\VCPU_LINE60="OR TriggerHw, Once ; OR with Once register: TriggerHw=TriggerHw|Once" +MOD10\VCPU_LINE61="TEST TriggerHw, HW_TRIG ; Z = NOT(TriggerHw & HW_TRIG)" +MOD10\VCPU_LINE62="IF Z GOTO WaitForTriggerHI ; loop waiting until Trigger==1" +MOD10\VCPU_LINE63=";SUB Counter, 1 ; increment HI counter" +MOD10\VCPU_LINE64=";IF NZ GOTO TestTriggerHI ; keep checking Trigger until HI for \"Counter\" cycles" +MOD10\VCPU_LINE65= +MOD10\VCPU_LINE66="LOAD Counter, 16 ; initialize Counter to 16 bit word length" +MOD10\VCPU_LINE67= +MOD10\VCPU_LINE68="; SendSerial" +MOD10\VCPU_LINE69="; jump here when a trigger is received to send the serial data word" +MOD10\VCPU_LINE7="ALIAS r9 SPI ; address for CLK/CS/DATA" +MOD10\VCPU_LINE70=";" +MOD10\VCPU_LINE71=SendSerial: +MOD10\VCPU_LINE72="INPUT Data, DATA_WORD ; copy the requested word from the VCPU_INREG" +MOD10\VCPU_LINE73="OUTPUT SPI, 0x04 ; enable CSB: DATAIN=HI, CSB=LO, CLK=LO (100)" +MOD10\VCPU_LINE74= +MOD10\VCPU_LINE75="SendSerialLoop: ; loop over this for each bit in the data word" +MOD10\VCPU_LINE76="OUTPUT SPI, 0x04 ; each bit starts with DATA=HI and CLK=LO" +MOD10\VCPU_LINE77="SLA Data ; shift the MSB of Data into Carry" +MOD10\VCPU_LINE78="IF NC OUTPUT DataPort, DATAIN_LO ; if C is clear then bring DATAIN LO" +MOD10\VCPU_LINE79="OUTPUT ClockPort, DATACLK_HI ; then bring the clock HI" +MOD10\VCPU_LINE8= +MOD10\VCPU_LINE80="SUB Counter, 1 ; decrement bit counter" +MOD10\VCPU_LINE81="IF NZ GOTO SendSerialLoop ; keep looping over all bits in the data word" +MOD10\VCPU_LINE82="LOAD Once, 0 ; clear the Once register to stop software triggers" +MOD10\VCPU_LINE83=GOTO Init +MOD10\VCPU_LINE84= +MOD10\VCPU_LINE9="; Define Constants" +MOD10\VCPU_LINES=85 +BIGBUF=_ARCHON_FRAMEBUFS +FRAMEMODE=_ARCHON_FRAMEMODE +LINECOUNT=_TOTAL_ROWS +PIXELCOUNT=_MAX_XADDR +RAWENABLE=_RAW_ENABLE +RAWENDLINE=_RAW_ENDLINE +RAWSAMPLES=_RAW_SAMPLES +RAWSEL=_RAW_SELECT +RAWSTARTLINE=_RAW_STARTLINE +RAWSTARTPIXEL=_RAW_STARTPIXEL +SAMPLEMODE=_ARCHON_SAMPLE_MODE +SHP1=_FIRST_RESET_SAMPLE +SHP2=_LAST_RESET_SAMPLE +SHD1=_FIRST_VIDEO_SAMPLE +SHD2=_LAST_VIDEO_SAMPLE +TAPLINE0="AM26L,1,0" +TAPLINE1="AM45R,1,0" +TAPLINE2="AM28L,1,0" +TAPLINE3="AM49R,1,0" +TAPLINE4="AM43L,1,0" +TAPLINE5="AM47R,1,0" +TAPLINE6="AM30L,1,0" +TAPLINE7="AM33R,1,0" +TAPLINE8="AM32L,1,0" +TAPLINE9="AM48R,1,0" +TAPLINE10="AM23L,1,0" +TAPLINE11="AM40R,1,0" +TAPLINE12="AM35L,1,0" +TAPLINE13="AM27R,1,0" +TAPLINE14="AM44L,1,0" +TAPLINE15="AM22R,1,0" +TAPLINE16="AM50L,1,0" +TAPLINE17="AM31R,1,0" +TAPLINE18="AM53L,1,0" +TAPLINE19="AM25R,1,0" +TAPLINE20="AM41L,1,0" +TAPLINE21="AM34R,1,0" +TAPLINE22="AM39L,1,0" +TAPLINE23="AM21R,1,0" +TAPLINE24="AM46L,1,0" +TAPLINE25="AM54R,1,0" +TAPLINE26="AM36L,1,0" +TAPLINE27="AM51R,1,0" +TAPLINE28="AM52L,1,0" +TAPLINE29="AM29R,1,0" +TAPLINE30="AM42L,1,0" +TAPLINE31="AM24R,1,0" +TAPLINE32="AM37L,1,0" +TAPLINES=33 +TRIGOUTFORCE=0 +TRIGOUTINVERT=0 +TRIGOUTLEVEL=0 +TRIGOUTPOWER=1 +PARAMETER0="Start=0" +PARAMETER1="Expose=0" +PARAMETER2="ExposeWindow=0" +PARAMETER3="exptime=0" +PARAMETER4="longexposure=0" +PARAMETER5="Abort=0" +PARAMETER6="mode_UTR_RR=1" +PARAMETER7="mode_UTR_GR=0" +PARAMETER8="mode_EnhancedRollingReset=0" +PARAMETER9="mode_VideoRX=0" +PARAMETER10="mode_VideoRXR=0" +PARAMETER11="mode_PermanentReset=0" +PARAMETER12="mode_Guiding=0" +PARAMETER13="mode_InterleavedGuiding=0" +PARAMETER14="exp_PulseWhileGlobReset=0" +PARAMETER15="H2RG_rows=2048" +PARAMETER16="H2RG_rows_skip=0" +PARAMETER17="H2RG_columns=64" +PARAMETER18="H2RG_win_rows=10" +PARAMETER19="H2RG_win_columns=10" +PARAMETER20="H2RGMainReset=0" +PARAMETER21="EnhancedRR_Delta=100" +PARAMETER22="Hold4Programming=0" +PARAMETER23="WindowPixelNb=100" +PARAMETER24="prv_flag_reset=0" +PARAMETER25="prv_ghostframe=0" +PARAMETERS=26 +LINE0=Init: +LINE1="STATE000; CALL InitClocks" +LINE2="STATE000; CALL wCLKEn" +LINE3="STATE000; CALL ResetRegistersDefault" +LINE4="STATE000; if Start GOTO WaitForExpose" +LINE5="STATE000; GOTO Init" +LINE6=ResetRegHxRG: +LINE7="STATE000; CALL ResetRegistersDefault" +LINE8="STATE000; H2RGMainReset--" +LINE9="STATE000; RETURN ResetRegHxRG" +LINE10=WaitForExpose: +LINE11="STATE000; if Expose CALL SelectMode" +LINE12="STATE000; if H2RGMainReset CALL ResetRegHxRG" +LINE13="STATE000; prv_ghostframe++" +LINE14="STATE000; if mode_VideoRXR CALL VideoRXR_GrabFrame" +LINE15="STATE000; if mode_VideoRX CALL VideoRX_GrabFrame" +LINE16="STATE000; prv_ghostframe--" +LINE17="STATE000; CALL wResetEN" +LINE18="STATE000; GOTO WaitForExpose" +LINE19=SelectMode: +LINE20="STATE000; if mode_UTR_RR CALL UTR_RR_Sequence" +LINE21="STATE000; if mode_UTR_GR CALL UTR_GR_Sequence" +LINE22="STATE000; if mode_VideoRX CALL VideoRX_Sequence" +LINE23="STATE000; if mode_VideoRXR CALL VideoRXR_Sequence" +LINE24="STATE000; if mode_PermanentReset CALL PGR_Sequence" +LINE25="STATE000; if mode_EnhancedRollingReset CALL EnhancedRR_Sequence" +LINE26="STATE000; if exp_PulseWhileGlobReset CALL Persistence_PulseGlobalReset" +LINE27="STATE000; if mode_Guiding CALL Guiding_Sequence" +LINE28="STATE000; GOTO WaitForExpose" +LINE29=UTR_RR_Sequence: +LINE30="STATE000; prv_flag_reset++" +LINE31="STATE000; CALL UTR_RR_GrabFrame(Expose)" +LINE32="STATE000; GOTO WaitForExpose" +LINE33=UTR_RR_GrabFrame: +LINE34="STATE000; Expose--" +LINE35="STATE000; Expose--" +LINE36="STATE000; if !prv_flag_reset CALL ExposureTimer" +LINE37="STATE000; CALL wFrame" +LINE38="STATE000; CALL StartFrame" +LINE39="STATE000; CALL RR_SkipRow(H2RG_rows_skip)" +LINE40="STATE000; CALL RR_ReadRow(H2RG_rows)" +LINE41="STATE000; CALL PulseVCLK" +LINE42="STATE000; prv_flag_reset--" +LINE43="STATE000; RETURN UTR_RR_GrabFrame" +LINE44=RR_ReadRow: +LINE45="STATE000; CALL wLine" +LINE46="STATE000; CALL StartRow" +LINE47="STATE000; CALL wReadEN" +LINE48="STATE000; if prv_flag_reset CALL ResetPulse" +LINE49="STATE000; if !prv_flag_reset CALL ResetPulse_Dummy" +LINE50="STATE000; CALL ReadPixel_Blank(2)" +LINE51="STATE000; CALL ReadPixel(H2RG_columns)" +LINE52="STATE000; CALL wbHclk" +LINE53="STATE000; CALL wbReadEN" +LINE54="STATE000; RETURN RR_ReadRow" +LINE55=RR_SkipRow: +LINE56="STATE000; CALL StartRow" +LINE57="STATE000; if prv_flag_reset CALL ResetPulse" +LINE58="STATE000; RETURN RR_SkipRow" +LINE59=UTR_GR_Sequence: +LINE60="STATE000; prv_flag_reset++" +LINE61="STATE000; CALL UTR_GR_GrabFrame(Expose)" +LINE62="STATE000; GOTO WaitForExpose" +LINE63=PGR_Sequence: +LINE64="STATE000; CALL wResetEN" +LINE65="STATE000; CALL UTR_GR_GrabFrame(Expose)" +LINE66="STATE000; CALL wbResetEN" +LINE67="STATE000; GOTO WaitForExpose" +LINE68=UTR_GR_GrabFrame: +LINE69="STATE000; Expose--" +LINE70="STATE000; CALL wFrame" +LINE71="STATE000; CALL StartFrame" +LINE72="STATE000; CALL PulseVCLK" +LINE73="STATE000; CALL GR_ReadRow(2048)" +LINE74="STATE000; CALL PulseVCLK" +LINE75="STATE000; prv_flag_reset--" +LINE76="STATE000; RETURN UTR_GR_GrabFrame" +LINE77=GR_ReadRow: +LINE78="STATE000; CALL wLine" +LINE79="STATE000; CALL StartRow" +LINE80="STATE000; CALL wReadEN" +LINE81="STATE000; CALL ReadPixel_Blank(2)" +LINE82="STATE000; CALL ReadPixel(64)" +LINE83="STATE000; CALL wbHclk" +LINE84="STATE000; CALL wbReadEN" +LINE85="STATE000; RETURN GR_ReadRow" +LINE86=VideoRX_Sequence: +LINE87="STATE000; if Expose CALL VideoRX_GrabFrame" +LINE88="STATE000; if Abort CALL AbortSeq" +LINE89="STATE000; if !Expose GOTO WaitForExpose" +LINE90="STATE000; GOTO VideoRX_Sequence" +LINE91=VideoRX_GrabFrame: +LINE92="STATE000; if !prv_ghostframe CALL wFrame" +LINE93="STATE000; CALL StartFrame" +LINE94="STATE000; CALL RR_SkipRow(H2RG_rows_skip)" +LINE95="STATE000; CALL RX_ReadRow(H2RG_rows)" +LINE96="STATE000; CALL PulseVCLK" +LINE97="STATE000; CALL ExposureTimer" +LINE98="STATE000; if !prv_ghostframe CALL DecrExposeCpt" +LINE99="STATE000; RETURN VideoRX_GrabFrame" +LINE100=RX_ReadRow: +LINE101="STATE000; CALL wLine" +LINE102="STATE000; CALL StartRow" +LINE103="STATE000; CALL wReadEN" +LINE104="STATE000; CALL ReadPixel_Blank(2)" +LINE105="STATE000; CALL ReadPixel(H2RG_columns)" +LINE106="STATE000; CALL ResetPulse" +LINE107="STATE000; CALL wbHclk" +LINE108="STATE000; CALL wbReadEN" +LINE109="STATE000; RETURN RX_ReadRow" +LINE110=VideoRXR_Sequence: +LINE111="STATE000; if Expose CALL VideoRXR_GrabFrame" +LINE112="STATE000; if Abort GOTO AbortSeq" +LINE113="STATE000; if !Expose GOTO WaitForExpose" +LINE114="STATE000; GOTO VideoRXR_Sequence" +LINE115=VideoRXR_GrabFrame: +LINE116="STATE000; if !prv_ghostframe CALL wFrame" +LINE117="STATE000; CALL StartFrame" +LINE118="STATE000; CALL RR_SkipRow(H2RG_rows_skip)" +LINE119="STATE000; CALL RXR_ReadRow(H2RG_rows)" +LINE120="STATE000; CALL PulseVCLK" +LINE121="STATE000; CALL ExposureTimer" +LINE122="STATE000; if !prv_ghostframe CALL DecrExposeCpt" +LINE123="STATE000; RETURN VideoRXR_GrabFrame" +LINE124=RXR_ReadRow: +LINE125="STATE000; CALL wLine" +LINE126="STATE000; CALL StartRow" +LINE127="STATE000; CALL wReadEN" +LINE128="STATE000; CALL ReadPixel_Blank(2)" +LINE129="STATE000; CALL ReadPixel(H2RG_columns)" +LINE130="STATE000; CALL ResetPulse" +LINE131="STATE000; CALL LSyncBPulse" +LINE132="STATE000; CALL ReadPixel_Blank(2)" +LINE133="STATE000; CALL ReadPixel(H2RG_columns)" +LINE134="STATE000; CALL wbHclk" +LINE135="STATE000; CALL wbReadEN" +LINE136="STATE000; RETURN RXR_ReadRow" +LINE137=Persistence_PulseGlobalReset: +LINE138="STATE000; CALL wResetEN" +LINE139="STATE000; CALL UTR_GR_GrabFrame(10)" +LINE140="STATE000; CALL wbResetEN" +LINE141="STATE000; CALL UTR_GR_GrabFrame(100)" +LINE142="STATE000; RETURN Persistence_PulseGlobalReset" +LINE143=EnhancedRR_Sequence: +LINE144="STATE000; CALL ConfigureEnhancedMode" +LINE145="STATE000; CALL EnhancedRR_GrabFrame(Expose)" +LINE146="STATE000; GOTO WaitForExpose" +LINE147=EnhancedRR_GrabFrame: +LINE148="STATE000; Expose--" +LINE149="STATE000; CALL wFrame" +LINE150="STATE000; CALL wbFSyncB" +LINE151="STATE000; CALL HDCRR_ReadRow(EnhancedRR_Delta)" +LINE152="STATE000; CALL wFSyncB" +LINE153="STATE000; CALL HDCRR_ReadRow(1948)" +LINE154="STATE000; RETURN EnhancedRR_GrabFrame" +LINE155=HDCRR_ReadRow: +LINE156="STATE000; CALL wLine" +LINE157="STATE000; CALL PulseVCLK" +LINE158="STATE000; CALL wbVReadEdge" +LINE159="STATE000; CALL LSyncBPulse" +LINE160="STATE000; CALL wReadEN" +LINE161="STATE000; CALL ResetPulse" +LINE162="STATE000; CALL ReadPixel_Blank(1)" +LINE163="STATE000; CALL ReadPixel(64)" +LINE164="STATE000; CALL wVReadEdge" +LINE165="STATE000; CALL LSyncBPulse" +LINE166="STATE000; CALL ReadPixel_Blank(1)" +LINE167="STATE000; CALL ReadPixel(64)" +LINE168="STATE000; CALL wbReadEN" +LINE169="STATE000; RETURN HDCRR_ReadRow" +LINE170=Guiding_Sequence: +LINE171="STATE000; if Expose CALL GrabWindow" +LINE172="STATE000; if Abort CALL AbortSeq" +LINE173="STATE000; GOTO Guiding_Sequence" +LINE174=GrabWindow: +LINE175="STATE000; Expose--" +LINE176="STATE000; CALL wFrame" +LINE177="STATE000; CALL StartFrame" +LINE178="STATE000; CALL WinRX_ReadRow(H2RG_win_rows)" +LINE179="STATE000; CALL PulseVCLK" +LINE180="STATE000; CALL ExposureTimer" +LINE181="STATE000; RETURN GrabWindow" +LINE182=WinRX_ReadRow: +LINE183="STATE000; CALL wLine" +LINE184="STATE000; CALL StartRow" +LINE185="STATE000; CALL wReadEN" +LINE186="STATE000; CALL ReadPixel_Blank(2)" +LINE187="STATE000; CALL ReadPixel(H2RG_win_columns)" +LINE188="STATE000; CALL ResetPulse" +LINE189="STATE000; CALL wbHclk" +LINE190="STATE000; CALL wbReadEN" +LINE191="STATE000; RETURN WinRX_ReadRow" +LINE192=ExposureTimer: +LINE193="STATE000; if longexposure CALL Sec(exptime)" +LINE194="STATE000; if !longexposure CALL MilliSec(exptime)" +LINE195="STATE000; if Abort GOTO AbortSeq" +LINE196="STATE000; RETURN ExposureTimer" +LINE197=MilliSec: +LINE198="STATE000; CALL wDelay1ms" +LINE199="STATE000; RETURN MilliSec" +LINE200=Sec: +LINE201="STATE000; CALL wDelay1ms(1000)" +LINE202="STATE000; if Abort GOTO AbortSeq" +LINE203="STATE000; RETURN Sec" +LINE204=AbortSeq: +LINE205="STATE000; CALL DecrExposeCpt(1000)" +LINE206="STATE000; CALL InitResetCpt(100)" +LINE207="STATE000; mode_VideoRX--" +LINE208="STATE000; mode_VideoRXR--" +LINE209="STATE000; mode_Guiding--" +LINE210="STATE000; Abort--" +LINE211="STATE000; GOTO WaitForExpose" +LINE212=DecrExposeCpt: +LINE213="STATE000; Expose--" +LINE214="STATE000; RETURN DecrExposeCpt" +LINE215=InitResetCpt: +LINE216="STATE000; prv_flag_reset--" +LINE217="STATE000; RETURN InitResetCpt" +LINE218=wDelay1us: +LINE219="STATE000; STATE000(98)" +LINE220="STATE000; RETURN wDelay1us" +LINE221=wDelay10us: +LINE222="STATE000; STATE000(998)" +LINE223="STATE000; RETURN wDelay10us" +LINE224=wDelay1ms: +LINE225="STATE000; STATE000(99998)" +LINE226="STATE000; RETURN wDelay1ms" +LINE227=InitClocks: +LINE228="STATE000; STATE000(99998)" +LINE229="STATE000; RETURN InitClocks" +LINE230=wCLKEn: +LINE231="STATE000; STATE000(999998)" +LINE232="STATE000; RETURN wCLKEn" +LINE233=ResetRegistersDefault: +LINE234="STATE000; STATE000(1099998)" +LINE235="STATE000; RETURN ResetRegistersDefault" +LINE236=StartFrame: +LINE237="STATE000; STATE000(698)" +LINE238="STATE000; RETURN StartFrame" +LINE239=StartRow: +LINE240="STATE000; STATE000(698)" +LINE241="STATE000; RETURN StartRow" +LINE242=PulseVCLK: +LINE243="STATE000; STATE000(878)" +LINE244="STATE000; RETURN PulseVCLK" +LINE245=wReadEN: +LINE246="STATE000; STATE000(158)" +LINE247="STATE000; RETURN wReadEN" +LINE248=wbReadEN: +LINE249="STATE000; STATE000(158)" +LINE250="STATE000; RETURN wbReadEN" +LINE251=ReadPixel: +LINE252="STATE001;" +LINE253="STATE002; STATE000(697)" +LINE254="STATE000; RETURN ReadPixel" +LINE255=ReadPixel_Blank: +LINE256="STATE000; STATE000(698)" +LINE257="STATE000; RETURN ReadPixel_Blank" +LINE258=wbHclk: +LINE259="STATE000; STATE000(78)" +LINE260="STATE000; RETURN wbHclk" +LINE261=ResetPulse: +LINE262="STATE000; STATE000(1078)" +LINE263="STATE000; RETURN ResetPulse" +LINE264=ResetPulse_Dummy: +LINE265="STATE000; STATE000(1078)" +LINE266="STATE000; RETURN ResetPulse_Dummy" +LINE267=wResetEN: +LINE268="STATE000; STATE000(78)" +LINE269="STATE000; RETURN wResetEN" +LINE270=wbResetEN: +LINE271="STATE000; STATE000(78)" +LINE272="STATE000; RETURN wbResetEN" +LINE273=LSyncBPulse: +LINE274="STATE000; STATE000(158)" +LINE275="STATE000; RETURN LSyncBPulse" +LINE276=wVReadEdge: +LINE277="STATE000; STATE000(78)" +LINE278="STATE000; RETURN wVReadEdge" +LINE279=wbVReadEdge: +LINE280="STATE000; STATE000(78)" +LINE281="STATE000; RETURN wbVReadEdge" +LINE282=wFSyncB: +LINE283="STATE000; STATE000(78)" +LINE284="STATE000; RETURN wFSyncB" +LINE285=wbFSyncB: +LINE286="STATE000; STATE000(78)" +LINE287="STATE000; RETURN wbFSyncB" +LINE288=ConfigureEnhancedMode: +LINE289="STATE000; STATE000(238)" +LINE290="STATE000; RETURN ConfigureEnhancedMode" +LINE291=wFrame: +LINE292="STATE003; RETURN wFrame" +LINE293=wLine: +LINE294="STATE004; RETURN wLine" +LINE295=wPixel: +LINE296="STATE001;" +LINE297="STATE002; RETURN wPixel" +LINES=298 +MOD10\LVLC_V1=2.3 +MOD10\LVLC_ORDER1=2 +MOD10\LVLC_LABEL1=Bias Gate +MOD10\LVLC_V2=3.3 +MOD10\LVLC_ORDER2=2 +MOD10\LVLC_LABEL2=Bias Power +MOD10\LVLC_V3=0.55 +MOD10\LVLC_ORDER3=2 +MOD10\LVLC_LABEL3=Diode Sub +MOD10\LVLC_V4=3.3 +MOD10\LVLC_ORDER4=1 +MOD10\LVLC_LABEL4=Digital Supply +MOD10\LVLC_V5=0.3 +MOD10\LVLC_ORDER5=2 +MOD10\LVLC_LABEL5=Diode Reset +MOD10\LVLC_V6=3.3 +MOD10\LVLC_ORDER6=1 +MOD10\LVLC_LABEL6=Analog Supply +MOD10\LVLC_V7=2.9 +MOD10\LVLC_ORDER7=1 +MOD10\LVLC_LABEL7=Preamp neg ref +MOD10\LVLC_V8=3.3 +MOD10\LVLC_ORDER8=2 +MOD10\LVLC_LABEL8=clock enable +MOD10\LVLC_V9=2.0 +MOD10\LVLC_ORDER9=2 +MOD10\LVLC_LABEL9=Preamp enable +MOD10\LVLC_V10=0.0 +MOD10\LVLC_ORDER10=1 +MOD10\LVLC_V11=0.0 +MOD10\LVLC_ORDER11=1 +MOD10\LVLC_V12=0.0 +MOD10\LVLC_ORDER12=1 +MOD10\LVLC_V13=0.0 +MOD10\LVLC_ORDER13=1 +MOD10\LVLC_V14=0.0 +MOD10\LVLC_ORDER14=1 +MOD10\LVLC_V15=0.0 +MOD10\LVLC_ORDER15=1 +MOD10\LVLC_V16=0.0 +MOD10\LVLC_ORDER16=1 +MOD10\LVLC_V17=0.0 +MOD10\LVLC_ORDER17=1 +MOD10\LVLC_V18=0.0 +MOD10\LVLC_ORDER18=1 +MOD10\LVLC_V19=0.0 +MOD10\LVLC_ORDER19=1 +MOD10\LVLC_V20=0.0 +MOD10\LVLC_ORDER20=1 +MOD10\LVLC_V21=0.0 +MOD10\LVLC_ORDER21=1 +MOD10\LVLC_V22=0.0 +MOD10\LVLC_ORDER22=1 +MOD10\LVLC_V23=0.0 +MOD10\LVLC_ORDER23=1 +MOD10\LVLC_V24=0.0 +MOD10\LVLC_ORDER24=1 +MOD10\LVHC_ENABLE1=1 +MOD10\LVHC_V1=3.3 +MOD10\LVHC_IL1=10 +MOD10\LVHC_ORDER1=3 +MOD10\LVHC_LABEL1=PullUp +MOD10\LVHC_ENABLE2=0 +MOD10\LVHC_V2=0.0 +MOD10\LVHC_IL2=50 +MOD10\LVHC_ORDER2=1 +MOD10\LVHC_LABEL2=Misc 1 +MOD10\LVHC_ENABLE3=0 +MOD10\LVHC_V3=0.0 +MOD10\LVHC_IL3=10 +MOD10\LVHC_ORDER3=1 +MOD10\LVHC_LABEL3=Misc 2 +MOD10\LVHC_ENABLE4=0 +MOD10\LVHC_V4=0.0 +MOD10\LVHC_IL4=100 +MOD10\LVHC_ORDER4=1 +MOD10\LVHC_LABEL4=Misc 3 +MOD10\LVHC_ENABLE5=1 +MOD10\LVHC_V5=0.0 +MOD10\LVHC_IL5=10 +MOD10\LVHC_ORDER5=1 +MOD10\LVHC_LABEL5=LED IR +MOD10\LVHC_ENABLE6=1 +MOD10\LVHC_V6=0.0 +MOD10\LVHC_IL6=70 +MOD10\LVHC_ORDER6=1 +MOD10\LVHC_LABEL6=Light Bulb +MOD11\DIO_SOURCE1=0 +MOD11\DIO_DIR1=0 +MOD11\DIO_SOURCE2=0 +MOD11\DIO_DIR2=0 +MOD11\DIO_SOURCE3=0 +MOD11\DIO_DIR3=0 +MOD11\DIO_SOURCE4=0 +MOD11\DIO_DIR4=0 +MOD11\DIO_POWER=0 +STATE0\NAME=STATE000 +STATE0\CONTROL="0,3F" +STATE1\NAME=STATE001 +STATE1\CONTROL="8,37" +STATE2\NAME=STATE002 +STATE2\CONTROL="0,31" +STATE3\NAME=STATE003 +STATE3\CONTROL="2,3D" +STATE4\NAME=STATE004 +STATE4\CONTROL="4,3B" +STATES=5 +[SYSTEM] +BACKPLANE_ID=0000000000000000 +BACKPLANE_REV=0 +BACKPLANE_TYPE=1 +BACKPLANE_VERSION=0.0.0 +MOD10_ID=0000000000000000 +MOD10_REV=0 +MOD10_VERSION=0.0.0 +MOD10_TYPE=9 +MOD11_ID=0000000000000000 +MOD11_REV=0 +MOD11_VERSION=0.0.0 +MOD11_TYPE=10 +[MODE_DEFAULT] +ACF:Expose=0 +ACF:LINECOUNT=2048 +ACF:PIXELCOUNT=64 +ACF:mode_EnhancedRollingReset=0 +ACF:mode_Guiding=0 +ACF:mode_UTR_RR=1 +ACF:mode_VideoRX=0 +ACF:mode_VideoRXR=0 +ARCH:HORI_AMPS=33 +ARCH:NUM_DETECT=1 +ARCH:VERT_AMPS=1 +FITS:READOUTMODE=UpTheRampRollingReset +[MODE_UTR_RR] +ACF:Expose=0 +ACF:LINECOUNT=2048 +ACF:PIXELCOUNT=64 +ACF:mode_EnhancedRollingReset=0 +ACF:mode_Guiding=0 +ACF:mode_UTR_RR=1 +ACF:mode_VideoRX=0 +ACF:mode_VideoRXR=0 +ARCH:HORI_AMPS=33 +ARCH:NUM_DETECT=1 +ARCH:VERT_AMPS=1 +FITS:READOUTMODE=UpTheRampRollingReset +[MODE_VIDEORX] +ACF:Expose=0 +ACF:LINECOUNT=2048 +ACF:PIXELCOUNT=64 +ACF:mode_EnhancedRollingReset=0 +ACF:mode_Guiding=0 +ACF:mode_UTR_RR=0 +ACF:mode_VideoRX=1 +ACF:mode_VideoRXR=0 +ARCH:HORI_AMPS=33 +ARCH:NUM_DETECT=1 +ARCH:VERT_AMPS=1 +FITS:READOUTMODE=VideoRX +[MODE_VIDEORXR] +ACF:Expose=0 +ACF:LINECOUNT=2048 +ACF:PIXELCOUNT=128 +ACF:mode_EnhancedRollingReset=0 +ACF:mode_Guiding=0 +ACF:mode_UTR_RR=0 +ACF:mode_VideoRX=0 +ACF:mode_VideoRXR=1 +ARCH:HORI_AMPS=33 +ARCH:NUM_DETECT=1 +ARCH:VERT_AMPS=1 +FITS:READOUTMODE=VideoRXR +[MODE_GUIDING] +ACF:Expose=0 +ACF:LINECOUNT=2048 +ACF:PIXELCOUNT=64 +ACF:mode_EnhancedRollingReset=0 +ACF:mode_Guiding=1 +ACF:mode_UTR_RR=0 +ACF:mode_VideoRX=0 +ACF:mode_VideoRXR=0 +ARCH:HORI_AMPS=1 +ARCH:NUM_DETECT=1 +ARCH:VERT_AMPS=1 +FITS:READOUTMODE=Guiding diff --git a/Config/h2rg_hispec.cfg b/Config/h2rg_hispec.cfg new file mode 100644 index 00000000..9d4957f7 --- /dev/null +++ b/Config/h2rg_hispec.cfg @@ -0,0 +1,18 @@ +# configuration file for camera-server +# +ARCHON_IP=10.0.0.2 +ARCHON_PORT=4242 +#DEFAULT_FIRMWARE=/home/hsdev/Software/camera-interface/Config/cryoscope.acf +DEFAULT_FIRMWARE=/home/hsdev/Software/camera-interface/Config/cryoscope_100us.acf +EXPOSE_PARAM=Expose # Archon parameter which triggers exposure +IMDIR=/tmp # base directory to save images +BASENAME=image # base image filename +NBPORT=3030 # server non-blocking port +BLKPORT=3031 # server blocking port +#ASYNCGROUP=239.1.1.234 # asynchronous broadcast group (or "none") +#ASYNCPORT=1234 # asynchronous message port (if ASYNCGROUP defined) +ASYNCGROUP=none +LOGPATH=/tmp # fully qualified path to save log files +# READOUT_TIME=0 # Readout time in ms +#LONGEXPOSURE=True # exptimes in seconds (not ms) + diff --git a/Config/hispec_cryoscope.acf b/Config/hispec_cryoscope.acf new file mode 100644 index 00000000..87a1d871 --- /dev/null +++ b/Config/hispec_cryoscope.acf @@ -0,0 +1,790 @@ +[CONFIG] +MOD10\DIO_DIR12=1 +MOD10\DIO_DIR34=1 +MOD10\DIO_POWER=1 +MOD10\DIO_SOURCE1=3 +MOD10\DIO_SOURCE2=3 +MOD10\DIO_SOURCE3=3 +MOD10\VCPU_INREG0=0 +MOD10\VCPU_INREG1=0 +MOD10\VCPU_INREG10=0 +MOD10\VCPU_INREG11=0 +MOD10\VCPU_INREG12=0 +MOD10\VCPU_INREG13=0 +MOD10\VCPU_INREG14=0 +MOD10\VCPU_INREG15=0 +MOD10\VCPU_INREG2=0 +MOD10\VCPU_INREG3=0 +MOD10\VCPU_INREG4=0 +MOD10\VCPU_INREG5=0 +MOD10\VCPU_INREG6=0 +MOD10\VCPU_INREG7=0 +MOD10\VCPU_INREG8=0 +MOD10\VCPU_INREG9=0 +MOD10\VCPU_LINE0="ALIAS r0 TriggerHw ; reads hardware trigger" +MOD10\VCPU_LINE1="ALIAS r1 TriggerSw ; reads software trigger" +MOD10\VCPU_LINE10=";" +MOD10\VCPU_LINE11="DIN_PORT=0x0000 ; digital input port register" +MOD10\VCPU_LINE12="SOFT_TRIG=0x0010 ; software trigger VCPU_INREG0" +MOD10\VCPU_LINE13="DATA_WORD=0x0011 ; VCPU_INREG1 carries the word to write serially" +MOD10\VCPU_LINE14= +MOD10\VCPU_LINE15="; bitmasks" +MOD10\VCPU_LINE16=";" +MOD10\VCPU_LINE17="DATACLK_HI=1" +MOD10\VCPU_LINE18="DATACLK_LO=0" +MOD10\VCPU_LINE19="CSB_HI=2" +MOD10\VCPU_LINE2="ALIAS r2 Once ; allows one-shot software trigger" +MOD10\VCPU_LINE20="CSB_LO=0" +MOD10\VCPU_LINE21="DATAIN_HI=4" +MOD10\VCPU_LINE22="DATAIN_LO=0" +MOD10\VCPU_LINE23="HW_TRIG=0x10 ; hardware trigger bit = DIO5" +MOD10\VCPU_LINE24= +MOD10\VCPU_LINE25="; Initialize Output Ports" +MOD10\VCPU_LINE26=";" +MOD10\VCPU_LINE27="LOAD ClockPort, 0x0101 ; ClockPort = DIO1" +MOD10\VCPU_LINE28="LOAD DataPort, 0x0104 ; DataPort = DIO3" +MOD10\VCPU_LINE29="LOAD SPI, 0x0107 ; CLK=DIO1, CSB=DIO2, DATA=DIO3" +MOD10\VCPU_LINE3="ALIAS r3 Counter ; general purpose counter" +MOD10\VCPU_LINE30= +MOD10\VCPU_LINE31="LOAD Once, 0 ; clear the Once flag" +MOD10\VCPU_LINE32="INPUT TriggerSw, SOFT_TRIG ; read the software trigger once at program start only" +MOD10\VCPU_LINE33="TEST TriggerSw, 1" +MOD10\VCPU_LINE34="IF Z GOTO Init ; if clear then leave the Once flag clear" +MOD10\VCPU_LINE35="LOAD Once, HW_TRIG ; otherwise set the Once flag same as a hardware trigger" +MOD10\VCPU_LINE36= +MOD10\VCPU_LINE37="; Initialize all ports and registers" +MOD10\VCPU_LINE38=";" +MOD10\VCPU_LINE39=Init: +MOD10\VCPU_LINE4="ALIAS r4 Data ; this register caries the data" +MOD10\VCPU_LINE40="OUTPUT SPI, 0x06 ; DATAIN=HI, CSB=HI, CLK=LO (110)" +MOD10\VCPU_LINE41= +MOD10\VCPU_LINE42="; WaitForTrigger" +MOD10\VCPU_LINE43="; Loop here until either a hardware or software trigger is received" +MOD10\VCPU_LINE44=";" +MOD10\VCPU_LINE45=WaitForTriggerLO: +MOD10\VCPU_LINE46=";LOAD Counter, 1 ; initialize Counter for LO state" +MOD10\VCPU_LINE47= +MOD10\VCPU_LINE48=TestTriggerLO: +MOD10\VCPU_LINE49="INPUT TriggerHw, DIN_PORT ; read the hardware trigger" +MOD10\VCPU_LINE5="ALIAS r5 ClockPort ; holds the address for the DATACLK port" +MOD10\VCPU_LINE50="TEST TriggerHw, HW_TRIG ; Z = NOT(TriggerHw & HW_TRIG)" +MOD10\VCPU_LINE51="IF NZ GOTO WaitForTriggerLO ; loop waiting until Trigger==0" +MOD10\VCPU_LINE52=";SUB Counter, 1 ; decrement LO counter" +MOD10\VCPU_LINE53=";IF NZ GOTO TestTriggerLO ; keep checking Trigger until LO for \"Counter\" cycles" +MOD10\VCPU_LINE54= +MOD10\VCPU_LINE55=WaitForTriggerHI: +MOD10\VCPU_LINE56=";LOAD Counter, 1 ; initialize Counter for HI state" +MOD10\VCPU_LINE57= +MOD10\VCPU_LINE58=TestTriggerHI: +MOD10\VCPU_LINE59="INPUT TriggerHw, DIN_PORT ; read the hardware trigger" +MOD10\VCPU_LINE6="ALIAS r7 DataPort ; holds the address for the DATAIN port" +MOD10\VCPU_LINE60="OR TriggerHw, Once ; OR with Once register: TriggerHw=TriggerHw|Once" +MOD10\VCPU_LINE61="TEST TriggerHw, HW_TRIG ; Z = NOT(TriggerHw & HW_TRIG)" +MOD10\VCPU_LINE62="IF Z GOTO WaitForTriggerHI ; loop waiting until Trigger==1" +MOD10\VCPU_LINE63=";SUB Counter, 1 ; increment HI counter" +MOD10\VCPU_LINE64=";IF NZ GOTO TestTriggerHI ; keep checking Trigger until HI for \"Counter\" cycles" +MOD10\VCPU_LINE65= +MOD10\VCPU_LINE66="LOAD Counter, 16 ; initialize Counter to 16 bit word length" +MOD10\VCPU_LINE67= +MOD10\VCPU_LINE68="; SendSerial" +MOD10\VCPU_LINE69="; jump here when a trigger is received to send the serial data word" +MOD10\VCPU_LINE7="ALIAS r9 SPI ; address for CLK/CS/DATA" +MOD10\VCPU_LINE70=";" +MOD10\VCPU_LINE71=SendSerial: +MOD10\VCPU_LINE72="INPUT Data, DATA_WORD ; copy the requested word from the VCPU_INREG" +MOD10\VCPU_LINE73="OUTPUT SPI, 0x04 ; enable CSB: DATAIN=HI, CSB=LO, CLK=LO (100)" +MOD10\VCPU_LINE74= +MOD10\VCPU_LINE75="SendSerialLoop: ; loop over this for each bit in the data word" +MOD10\VCPU_LINE76="OUTPUT SPI, 0x04 ; each bit starts with DATA=HI and CLK=LO" +MOD10\VCPU_LINE77="SLA Data ; shift the MSB of Data into Carry" +MOD10\VCPU_LINE78="IF NC OUTPUT DataPort, DATAIN_LO ; if C is clear then bring DATAIN LO" +MOD10\VCPU_LINE79="OUTPUT ClockPort, DATACLK_HI ; then bring the clock HI" +MOD10\VCPU_LINE8= +MOD10\VCPU_LINE80="SUB Counter, 1 ; decrement bit counter" +MOD10\VCPU_LINE81="IF NZ GOTO SendSerialLoop ; keep looping over all bits in the data word" +MOD10\VCPU_LINE82="LOAD Once, 0 ; clear the Once register to stop software triggers" +MOD10\VCPU_LINE83=GOTO Init +MOD10\VCPU_LINE84= +MOD10\VCPU_LINE9="; Define Constants" +MOD10\VCPU_LINES=85 +BIGBUF=0 +FRAMEMODE=1 +LINECOUNT=2048 +PIXELCOUNT=64 +RAWENABLE=0 +RAWENDLINE=10 +RAWSAMPLES=25600 +RAWSEL=0 +RAWSTARTLINE=0 +RAWSTARTPIXEL=0 +SAMPLEMODE=0 +SHP1=256 +SHP2=692 +SHD1=700 +SHD2=700 +TAPLINE0="AM26L,1,0" +TAPLINE1="AM45R,1,0" +TAPLINE2="AM28L,1,0" +TAPLINE3="AM49R,1,0" +TAPLINE4="AM43L,1,0" +TAPLINE5="AM47R,1,0" +TAPLINE6="AM30L,1,0" +TAPLINE7="AM33R,1,0" +TAPLINE8="AM32L,1,0" +TAPLINE9="AM48R,1,0" +TAPLINE10="AM23L,1,0" +TAPLINE11="AM40R,1,0" +TAPLINE12="AM35L,1,0" +TAPLINE13="AM27R,1,0" +TAPLINE14="AM44L,1,0" +TAPLINE15="AM22R,1,0" +TAPLINE16="AM50L,1,0" +TAPLINE17="AM31R,1,0" +TAPLINE18="AM53L,1,0" +TAPLINE19="AM25R,1,0" +TAPLINE20="AM41L,1,0" +TAPLINE21="AM34R,1,0" +TAPLINE22="AM39L,1,0" +TAPLINE23="AM21R,1,0" +TAPLINE24="AM46L,1,0" +TAPLINE25="AM54R,1,0" +TAPLINE26="AM36L,1,0" +TAPLINE27="AM51R,1,0" +TAPLINE28="AM52L,1,0" +TAPLINE29="AM29R,1,0" +TAPLINE30="AM42L,1,0" +TAPLINE31="AM24R,1,0" +TAPLINE32="AM37L,1,0" +TAPLINES=33 +TRIGOUTFORCE=0 +TRIGOUTINVERT=0 +TRIGOUTLEVEL=0 +TRIGOUTPOWER=1 +PARAMETER0="Start=0" +PARAMETER1="Expose=0" +PARAMETER2="ExposeWindow=0" +PARAMETER3="exptime=0" +PARAMETER4="longexposure=0" +PARAMETER5="Abort=0" +PARAMETER6="mode_UTR_RR=1" +PARAMETER7="mode_UTR_GR=0" +PARAMETER8="mode_EnhancedRollingReset=0" +PARAMETER9="mode_VideoRX=0" +PARAMETER10="mode_VideoRXR=0" +PARAMETER11="mode_PermanentReset=0" +PARAMETER12="mode_Guiding=0" +PARAMETER13="mode_InterleavedGuiding=0" +PARAMETER14="exp_PulseWhileGlobReset=0" +PARAMETER15="H2RG_rows=2048" +PARAMETER16="H2RG_rows_skip=0" +PARAMETER17="H2RG_columns=64" +PARAMETER18="H2RG_win_rows=10" +PARAMETER19="H2RG_win_columns=10" +PARAMETER20="H2RGMainReset=0" +PARAMETER21="EnhancedRR_Delta=100" +PARAMETER22="Hold4Programming=0" +PARAMETER23="WindowPixelNb=100" +PARAMETER24="prv_flag_reset=0" +PARAMETER25="prv_ghostframe=0" +PARAMETERS=26 +LINE0=Init: +LINE1="STATE000; CALL InitClocks" +LINE2="STATE000; CALL wCLKEn" +LINE3="STATE000; CALL ResetRegistersDefault" +LINE4="STATE000; if Start GOTO WaitForExpose" +LINE5="STATE000; GOTO Init" +LINE6=ResetRegHxRG: +LINE7="STATE000; CALL ResetRegistersDefault" +LINE8="STATE000; H2RGMainReset--" +LINE9="STATE000; RETURN ResetRegHxRG" +LINE10=WaitForExpose: +LINE11="STATE000; if Expose CALL SelectMode" +LINE12="STATE000; if H2RGMainReset CALL ResetRegHxRG" +LINE13="STATE000; prv_ghostframe++" +LINE14="STATE000; if mode_VideoRXR CALL VideoRXR_GrabFrame" +LINE15="STATE000; if mode_VideoRX CALL VideoRX_GrabFrame" +LINE16="STATE000; prv_ghostframe--" +LINE17="STATE000; CALL wResetEN" +LINE18="STATE000; GOTO WaitForExpose" +LINE19=SelectMode: +LINE20="STATE000; if mode_UTR_RR CALL UTR_RR_Sequence" +LINE21="STATE000; if mode_UTR_GR CALL UTR_GR_Sequence" +LINE22="STATE000; if mode_VideoRX CALL VideoRX_Sequence" +LINE23="STATE000; if mode_VideoRXR CALL VideoRXR_Sequence" +LINE24="STATE000; if mode_PermanentReset CALL PGR_Sequence" +LINE25="STATE000; if mode_EnhancedRollingReset CALL EnhancedRR_Sequence" +LINE26="STATE000; if exp_PulseWhileGlobReset CALL Persistence_PulseGlobalReset" +LINE27="STATE000; if mode_Guiding CALL Guiding_Sequence" +LINE28="STATE000; GOTO WaitForExpose" +LINE29=UTR_RR_Sequence: +LINE30="STATE000; prv_flag_reset++" +LINE31="STATE000; CALL UTR_RR_GrabFrame(Expose)" +LINE32="STATE000; GOTO WaitForExpose" +LINE33=UTR_RR_GrabFrame: +LINE34="STATE000; Expose--" +LINE35="STATE000; Expose--" +LINE36="STATE000; if !prv_flag_reset CALL ExposureTimer" +LINE37="STATE000; CALL wFrame" +LINE38="STATE000; CALL StartFrame" +LINE39="STATE000; CALL RR_SkipRow(H2RG_rows_skip)" +LINE40="STATE000; CALL RR_ReadRow(H2RG_rows)" +LINE41="STATE000; CALL PulseVCLK" +LINE42="STATE000; prv_flag_reset--" +LINE43="STATE000; RETURN UTR_RR_GrabFrame" +LINE44=RR_ReadRow: +LINE45="STATE000; CALL wLine" +LINE46="STATE000; CALL StartRow" +LINE47="STATE000; CALL wReadEN" +LINE48="STATE000; if prv_flag_reset CALL ResetPulse" +LINE49="STATE000; if !prv_flag_reset CALL ResetPulse_Dummy" +LINE50="STATE000; CALL ReadPixel_Blank(2)" +LINE51="STATE000; CALL ReadPixel(H2RG_columns)" +LINE52="STATE000; CALL wbHclk" +LINE53="STATE000; CALL wbReadEN" +LINE54="STATE000; RETURN RR_ReadRow" +LINE55=RR_SkipRow: +LINE56="STATE000; CALL StartRow" +LINE57="STATE000; if prv_flag_reset CALL ResetPulse" +LINE58="STATE000; RETURN RR_SkipRow" +LINE59=UTR_GR_Sequence: +LINE60="STATE000; prv_flag_reset++" +LINE61="STATE000; CALL UTR_GR_GrabFrame(Expose)" +LINE62="STATE000; GOTO WaitForExpose" +LINE63=PGR_Sequence: +LINE64="STATE000; CALL wResetEN" +LINE65="STATE000; CALL UTR_GR_GrabFrame(Expose)" +LINE66="STATE000; CALL wbResetEN" +LINE67="STATE000; GOTO WaitForExpose" +LINE68=UTR_GR_GrabFrame: +LINE69="STATE000; Expose--" +LINE70="STATE000; CALL wFrame" +LINE71="STATE000; CALL StartFrame" +LINE72="STATE000; CALL PulseVCLK" +LINE73="STATE000; CALL GR_ReadRow(2048)" +LINE74="STATE000; CALL PulseVCLK" +LINE75="STATE000; prv_flag_reset--" +LINE76="STATE000; RETURN UTR_GR_GrabFrame" +LINE77=GR_ReadRow: +LINE78="STATE000; CALL wLine" +LINE79="STATE000; CALL StartRow" +LINE80="STATE000; CALL wReadEN" +LINE81="STATE000; CALL ReadPixel_Blank(2)" +LINE82="STATE000; CALL ReadPixel(64)" +LINE83="STATE000; CALL wbHclk" +LINE84="STATE000; CALL wbReadEN" +LINE85="STATE000; RETURN GR_ReadRow" +LINE86=VideoRX_Sequence: +LINE87="STATE000; if Expose CALL VideoRX_GrabFrame" +LINE88="STATE000; if Abort CALL AbortSeq" +LINE89="STATE000; if !Expose GOTO WaitForExpose" +LINE90="STATE000; GOTO VideoRX_Sequence" +LINE91=VideoRX_GrabFrame: +LINE92="STATE000; if !prv_ghostframe CALL wFrame" +LINE93="STATE000; CALL StartFrame" +LINE94="STATE000; CALL RR_SkipRow(H2RG_rows_skip)" +LINE95="STATE000; CALL RX_ReadRow(H2RG_rows)" +LINE96="STATE000; CALL PulseVCLK" +LINE97="STATE000; CALL ExposureTimer" +LINE98="STATE000; if !prv_ghostframe CALL DecrExposeCpt" +LINE99="STATE000; RETURN VideoRX_GrabFrame" +LINE100=RX_ReadRow: +LINE101="STATE000; CALL wLine" +LINE102="STATE000; CALL StartRow" +LINE103="STATE000; CALL wReadEN" +LINE104="STATE000; CALL ReadPixel_Blank(2)" +LINE105="STATE000; CALL ReadPixel(H2RG_columns)" +LINE106="STATE000; CALL ResetPulse" +LINE107="STATE000; CALL wbHclk" +LINE108="STATE000; CALL wbReadEN" +LINE109="STATE000; RETURN RX_ReadRow" +LINE110=VideoRXR_Sequence: +LINE111="STATE000; if Expose CALL VideoRXR_GrabFrame" +LINE112="STATE000; if Abort GOTO AbortSeq" +LINE113="STATE000; if !Expose GOTO WaitForExpose" +LINE114="STATE000; GOTO VideoRXR_Sequence" +LINE115=VideoRXR_GrabFrame: +LINE116="STATE000; if !prv_ghostframe CALL wFrame" +LINE117="STATE000; CALL StartFrame" +LINE118="STATE000; CALL RR_SkipRow(H2RG_rows_skip)" +LINE119="STATE000; CALL RXR_ReadRow(H2RG_rows)" +LINE120="STATE000; CALL PulseVCLK" +LINE121="STATE000; CALL ExposureTimer" +LINE122="STATE000; if !prv_ghostframe CALL DecrExposeCpt" +LINE123="STATE000; RETURN VideoRXR_GrabFrame" +LINE124=RXR_ReadRow: +LINE125="STATE000; CALL wLine" +LINE126="STATE000; CALL StartRow" +LINE127="STATE000; CALL wReadEN" +LINE128="STATE000; CALL ReadPixel_Blank(2)" +LINE129="STATE000; CALL ReadPixel(H2RG_columns)" +LINE130="STATE000; CALL ResetPulse" +LINE131="STATE000; CALL LSyncBPulse" +LINE132="STATE000; CALL ReadPixel_Blank(2)" +LINE133="STATE000; CALL ReadPixel(H2RG_columns)" +LINE134="STATE000; CALL wbHclk" +LINE135="STATE000; CALL wbReadEN" +LINE136="STATE000; RETURN RXR_ReadRow" +LINE137=Persistence_PulseGlobalReset: +LINE138="STATE000; CALL wResetEN" +LINE139="STATE000; CALL UTR_GR_GrabFrame(10)" +LINE140="STATE000; CALL wbResetEN" +LINE141="STATE000; CALL UTR_GR_GrabFrame(100)" +LINE142="STATE000; RETURN Persistence_PulseGlobalReset" +LINE143=EnhancedRR_Sequence: +LINE144="STATE000; CALL ConfigureEnhancedMode" +LINE145="STATE000; CALL EnhancedRR_GrabFrame(Expose)" +LINE146="STATE000; GOTO WaitForExpose" +LINE147=EnhancedRR_GrabFrame: +LINE148="STATE000; Expose--" +LINE149="STATE000; CALL wFrame" +LINE150="STATE000; CALL wbFSyncB" +LINE151="STATE000; CALL HDCRR_ReadRow(EnhancedRR_Delta)" +LINE152="STATE000; CALL wFSyncB" +LINE153="STATE000; CALL HDCRR_ReadRow(1948)" +LINE154="STATE000; RETURN EnhancedRR_GrabFrame" +LINE155=HDCRR_ReadRow: +LINE156="STATE000; CALL wLine" +LINE157="STATE000; CALL PulseVCLK" +LINE158="STATE000; CALL wbVReadEdge" +LINE159="STATE000; CALL LSyncBPulse" +LINE160="STATE000; CALL wReadEN" +LINE161="STATE000; CALL ResetPulse" +LINE162="STATE000; CALL ReadPixel_Blank(1)" +LINE163="STATE000; CALL ReadPixel(64)" +LINE164="STATE000; CALL wVReadEdge" +LINE165="STATE000; CALL LSyncBPulse" +LINE166="STATE000; CALL ReadPixel_Blank(1)" +LINE167="STATE000; CALL ReadPixel(64)" +LINE168="STATE000; CALL wbReadEN" +LINE169="STATE000; RETURN HDCRR_ReadRow" +LINE170=Guiding_Sequence: +LINE171="STATE000; if Expose CALL GrabWindow" +LINE172="STATE000; if Abort CALL AbortSeq" +LINE173="STATE000; GOTO Guiding_Sequence" +LINE174=GrabWindow: +LINE175="STATE000; Expose--" +LINE176="STATE000; CALL wFrame" +LINE177="STATE000; CALL StartFrame" +LINE178="STATE000; CALL WinRX_ReadRow(H2RG_win_rows)" +LINE179="STATE000; CALL PulseVCLK" +LINE180="STATE000; CALL ExposureTimer" +LINE181="STATE000; RETURN GrabWindow" +LINE182=WinRX_ReadRow: +LINE183="STATE000; CALL wLine" +LINE184="STATE000; CALL StartRow" +LINE185="STATE000; CALL wReadEN" +LINE186="STATE000; CALL ReadPixel_Blank(2)" +LINE187="STATE000; CALL ReadPixel(H2RG_win_columns)" +LINE188="STATE000; CALL ResetPulse" +LINE189="STATE000; CALL wbHclk" +LINE190="STATE000; CALL wbReadEN" +LINE191="STATE000; RETURN WinRX_ReadRow" +LINE192=ExposureTimer: +LINE193="STATE000; if longexposure CALL Sec(exptime)" +LINE194="STATE000; if !longexposure CALL MilliSec(exptime)" +LINE195="STATE000; if Abort GOTO AbortSeq" +LINE196="STATE000; RETURN ExposureTimer" +LINE197=MilliSec: +LINE198="STATE000; CALL wDelay1ms" +LINE199="STATE000; RETURN MilliSec" +LINE200=Sec: +LINE201="STATE000; CALL wDelay1ms(1000)" +LINE202="STATE000; if Abort GOTO AbortSeq" +LINE203="STATE000; RETURN Sec" +LINE204=AbortSeq: +LINE205="STATE000; CALL DecrExposeCpt(1000)" +LINE206="STATE000; CALL InitResetCpt(100)" +LINE207="STATE000; mode_VideoRX--" +LINE208="STATE000; mode_VideoRXR--" +LINE209="STATE000; mode_Guiding--" +LINE210="STATE000; Abort--" +LINE211="STATE000; GOTO WaitForExpose" +LINE212=DecrExposeCpt: +LINE213="STATE000; Expose--" +LINE214="STATE000; RETURN DecrExposeCpt" +LINE215=InitResetCpt: +LINE216="STATE000; prv_flag_reset--" +LINE217="STATE000; RETURN InitResetCpt" +LINE218=wDelay1us: +LINE219="STATE000; STATE000(98)" +LINE220="STATE000; RETURN wDelay1us" +LINE221=wDelay10us: +LINE222="STATE000; STATE000(998)" +LINE223="STATE000; RETURN wDelay10us" +LINE224=wDelay1ms: +LINE225="STATE000; STATE000(99998)" +LINE226="STATE000; RETURN wDelay1ms" +LINE227=InitClocks: +LINE228="STATE001; STATE000(99998)" +LINE229="STATE000; RETURN InitClocks" +LINE230=wCLKEn: +LINE231="STATE002; STATE000(999998)" +LINE232="STATE000; RETURN wCLKEn" +LINE233=ResetRegistersDefault: +LINE234="STATE003; STATE000(999999)" +LINE235="STATE004; STATE000(99998)" +LINE236="STATE000; RETURN ResetRegistersDefault" +LINE237=StartFrame: +LINE238="STATE005; STATE000(79)" +LINE239="STATE006; STATE000(618)" +LINE240="STATE000; RETURN StartFrame" +LINE241=StartRow: +LINE242="STATE007; STATE000(79)" +LINE243="STATE008; STATE000(618)" +LINE244="STATE000; RETURN StartRow" +LINE245=PulseVCLK: +LINE246="STATE009; STATE000(79)" +LINE247="STATE010; STATE000(798)" +LINE248="STATE000; RETURN PulseVCLK" +LINE249=wReadEN: +LINE250="STATE011; STATE000(158)" +LINE251="STATE000; RETURN wReadEN" +LINE252=wbReadEN: +LINE253="STATE012; STATE000(158)" +LINE254="STATE000; RETURN wbReadEN" +LINE255=ReadPixel: +LINE256="STATE013;" +LINE257="STATE014; STATE000(78)" +LINE258="STATE015; STATE000(618)" +LINE259="STATE000; RETURN ReadPixel" +LINE260=ReadPixel_Blank: +LINE261="STATE016; STATE000(79)" +LINE262="STATE015; STATE000(618)" +LINE263="STATE000; RETURN ReadPixel_Blank" +LINE264=wbHclk: +LINE265="STATE016; STATE000(78)" +LINE266="STATE000; RETURN wbHclk" +LINE267=ResetPulse: +LINE268="STATE017; STATE000(999)" +LINE269="STATE018; STATE000(78)" +LINE270="STATE000; RETURN ResetPulse" +LINE271=ResetPulse_Dummy: +LINE272="STATE018; STATE000(999)" +LINE273="STATE018; STATE000(78)" +LINE274="STATE000; RETURN ResetPulse_Dummy" +LINE275=wResetEN: +LINE276="STATE017; STATE000(78)" +LINE277="STATE000; RETURN wResetEN" +LINE278=wbResetEN: +LINE279="STATE018; STATE000(78)" +LINE280="STATE000; RETURN wbResetEN" +LINE281=LSyncBPulse: +LINE282="STATE019; STATE000(79)" +LINE283="STATE020; STATE000(78)" +LINE284="STATE000; RETURN LSyncBPulse" +LINE285=wVReadEdge: +LINE286="STATE021; STATE000(78)" +LINE287="STATE000; RETURN wVReadEdge" +LINE288=wbVReadEdge: +LINE289="STATE022; STATE000(78)" +LINE290="STATE000; RETURN wbVReadEdge" +LINE291=wFSyncB: +LINE292="STATE006; STATE000(78)" +LINE293="STATE000; RETURN wFSyncB" +LINE294=wbFSyncB: +LINE295="STATE005; STATE000(78)" +LINE296="STATE000; RETURN wbFSyncB" +LINE297=ConfigureEnhancedMode: +LINE298="STATE023; STATE000(79)" +LINE299="STATE024; STATE000(79)" +LINE300="STATE025; STATE000(78)" +LINE301="STATE000; RETURN ConfigureEnhancedMode" +LINE302=wFrame: +LINE303="STATE026; RETURN wFrame" +LINE304=wLine: +LINE305="STATE027; RETURN wLine" +LINE306=wPixel: +LINE307="STATE028;" +LINE308="STATE014; RETURN wPixel" +LINES=309 +MOD10\LVLC_V1=2.3 +MOD10\LVLC_ORDER1=2 +MOD10\LVLC_LABEL1=Bias Gate +MOD10\LVLC_V2=3.3 +MOD10\LVLC_ORDER2=2 +MOD10\LVLC_LABEL2=Bias Power +MOD10\LVLC_V3=0.55 +MOD10\LVLC_ORDER3=2 +MOD10\LVLC_LABEL3=Diode Sub +MOD10\LVLC_V4=3.3 +MOD10\LVLC_ORDER4=1 +MOD10\LVLC_LABEL4=Digital Supply +MOD10\LVLC_V5=0.3 +MOD10\LVLC_ORDER5=2 +MOD10\LVLC_LABEL5=Diode Reset +MOD10\LVLC_V6=3.3 +MOD10\LVLC_ORDER6=1 +MOD10\LVLC_LABEL6=Analog Supply +MOD10\LVLC_V7=2.9 +MOD10\LVLC_ORDER7=1 +MOD10\LVLC_LABEL7=Preamp neg ref +MOD10\LVLC_V8=3.3 +MOD10\LVLC_ORDER8=2 +MOD10\LVLC_LABEL8=clock enable +MOD10\LVLC_V9=2.0 +MOD10\LVLC_ORDER9=2 +MOD10\LVLC_LABEL9=Preamp enable +MOD10\LVLC_V10=0.0 +MOD10\LVLC_ORDER10=1 +MOD10\LVLC_V11=0.0 +MOD10\LVLC_ORDER11=1 +MOD10\LVLC_V12=0.0 +MOD10\LVLC_ORDER12=1 +MOD10\LVLC_V13=0.0 +MOD10\LVLC_ORDER13=1 +MOD10\LVLC_V14=0.0 +MOD10\LVLC_ORDER14=1 +MOD10\LVLC_V15=0.0 +MOD10\LVLC_ORDER15=1 +MOD10\LVLC_V16=0.0 +MOD10\LVLC_ORDER16=1 +MOD10\LVLC_V17=0.0 +MOD10\LVLC_ORDER17=1 +MOD10\LVLC_V18=0.0 +MOD10\LVLC_ORDER18=1 +MOD10\LVLC_V19=0.0 +MOD10\LVLC_ORDER19=1 +MOD10\LVLC_V20=0.0 +MOD10\LVLC_ORDER20=1 +MOD10\LVLC_V21=0.0 +MOD10\LVLC_ORDER21=1 +MOD10\LVLC_V22=0.0 +MOD10\LVLC_ORDER22=1 +MOD10\LVLC_V23=0.0 +MOD10\LVLC_ORDER23=1 +MOD10\LVLC_V24=0.0 +MOD10\LVLC_ORDER24=1 +MOD10\LVHC_ENABLE1=1 +MOD10\LVHC_V1=3.3 +MOD10\LVHC_IL1=10 +MOD10\LVHC_ORDER1=3 +MOD10\LVHC_LABEL1=PullUp +MOD10\LVHC_ENABLE2=0 +MOD10\LVHC_V2=0.0 +MOD10\LVHC_IL2=50 +MOD10\LVHC_ORDER2=1 +MOD10\LVHC_LABEL2=Misc 1 +MOD10\LVHC_ENABLE3=0 +MOD10\LVHC_V3=0.0 +MOD10\LVHC_IL3=10 +MOD10\LVHC_ORDER3=1 +MOD10\LVHC_LABEL3=Misc 2 +MOD10\LVHC_ENABLE4=0 +MOD10\LVHC_V4=0.0 +MOD10\LVHC_IL4=100 +MOD10\LVHC_ORDER4=1 +MOD10\LVHC_LABEL4=Misc 3 +MOD10\LVHC_ENABLE5=1 +MOD10\LVHC_V5=0.0 +MOD10\LVHC_IL5=10 +MOD10\LVHC_ORDER5=1 +MOD10\LVHC_LABEL5=LED IR +MOD10\LVHC_ENABLE6=1 +MOD10\LVHC_V6=0.0 +MOD10\LVHC_IL6=70 +MOD10\LVHC_ORDER6=1 +MOD10\LVHC_LABEL6=Light Bulb +MOD11\DIO_SOURCE1=0 +MOD11\DIO_DIR1=0 +MOD11\DIO_SOURCE2=0 +MOD11\DIO_DIR2=0 +MOD11\DIO_SOURCE3=0 +MOD11\DIO_DIR3=0 +MOD11\DIO_SOURCE4=0 +MOD11\DIO_DIR4=0 +MOD11\DIO_POWER=0 +STATE0\NAME=STATE000 +STATE0\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE0\CONTROL="0,3F" +STATE0\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE1\NAME=STATE001 +STATE1\MOD11="1,1,0,0,0,0,1,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE1\CONTROL="0,3F" +STATE1\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE2\NAME=STATE002 +STATE2\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE2\CONTROL="0,3F" +STATE2\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,3.3" +STATE3\NAME=STATE003 +STATE3\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE3\CONTROL="0,3F" +STATE3\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE4\NAME=STATE004 +STATE4\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE4\CONTROL="0,3F" +STATE4\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE5\NAME=STATE005 +STATE5\MOD11="1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE5\CONTROL="0,3F" +STATE5\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE6\NAME=STATE006 +STATE6\MOD11="1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE6\CONTROL="0,3F" +STATE6\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE7\NAME=STATE007 +STATE7\MOD11="1,1,1,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE7\CONTROL="0,3F" +STATE7\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE8\NAME=STATE008 +STATE8\MOD11="1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE8\CONTROL="0,3F" +STATE8\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE9\NAME=STATE009 +STATE9\MOD11="1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE9\CONTROL="0,3F" +STATE9\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE10\NAME=STATE010 +STATE10\MOD11="1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE10\CONTROL="0,3F" +STATE10\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE11\NAME=STATE011 +STATE11\MOD11="1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE11\CONTROL="0,3F" +STATE11\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE12\NAME=STATE012 +STATE12\MOD11="1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE12\CONTROL="0,3F" +STATE12\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE13\NAME=STATE013 +STATE13\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE13\CONTROL="8,37" +STATE13\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE14\NAME=STATE014 +STATE14\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE14\CONTROL="0,31" +STATE14\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE15\NAME=STATE015 +STATE15\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE15\CONTROL="0,3F" +STATE15\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE16\NAME=STATE016 +STATE16\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE16\CONTROL="0,3F" +STATE16\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE17\NAME=STATE017 +STATE17\MOD11="1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE17\CONTROL="0,3F" +STATE17\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE18\NAME=STATE018 +STATE18\MOD11="1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE18\CONTROL="0,3F" +STATE18\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE19\NAME=STATE019 +STATE19\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE19\CONTROL="0,3F" +STATE19\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE20\NAME=STATE020 +STATE20\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE20\CONTROL="0,3F" +STATE20\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE21\NAME=STATE021 +STATE21\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE21\CONTROL="0,3F" +STATE21\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE22\NAME=STATE022 +STATE22\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE22\CONTROL="0,3F" +STATE22\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE23\NAME=STATE023 +STATE23\MOD11="1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE23\CONTROL="0,3F" +STATE23\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE24\NAME=STATE024 +STATE24\MOD11="0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE24\CONTROL="0,3F" +STATE24\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE25\NAME=STATE025 +STATE25\MOD11="1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE25\CONTROL="0,3F" +STATE25\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE26\NAME=STATE026 +STATE26\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE26\CONTROL="2,3D" +STATE26\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE27\NAME=STATE027 +STATE27\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE27\CONTROL="4,3B" +STATE27\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATE28\NAME=STATE028 +STATE28\MOD11="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" +STATE28\CONTROL="8,37" +STATE28\MOD10="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0" +STATES=29 +[SYSTEM] +BACKPLANE_ID=0000000000000000 +BACKPLANE_REV=0 +BACKPLANE_TYPE=1 +BACKPLANE_VERSION=0.0.0 +MOD10_ID=0000000000000000 +MOD10_REV=0 +MOD10_VERSION=0.0.0 +MOD10_TYPE=9 +MOD11_ID=0000000000000000 +MOD11_REV=0 +MOD11_VERSION=0.0.0 +MOD11_TYPE=10 +[MODE_GUIDING] +ACF:Expose=0 +ACF:LINECOUNT=2048 +ACF:PIXELCOUNT=64 +ACF:mode_EnhancedRollingReset=0 +ACF:mode_Guiding=1 +ACF:mode_UTR_RR=0 +ACF:mode_VideoRX=0 +ACF:mode_VideoRXR=0 +ARCH:HORI_AMPS=1 +ARCH:NUM_DETECT=1 +ARCH:VERT_AMPS=1 +FITS:READOUTMODE=Guiding +[MODE_VIDEORXR] +ACF:Expose=0 +ACF:LINECOUNT=2048 +ACF:PIXELCOUNT=128 +ACF:mode_EnhancedRollingReset=0 +ACF:mode_Guiding=0 +ACF:mode_UTR_RR=0 +ACF:mode_VideoRX=0 +ACF:mode_VideoRXR=1 +ARCH:HORI_AMPS=33 +ARCH:NUM_DETECT=1 +ARCH:VERT_AMPS=1 +FITS:READOUTMODE=VideoRXR +[MODE_VIDEORX] +ACF:Expose=0 +ACF:LINECOUNT=2048 +ACF:PIXELCOUNT=64 +ACF:mode_EnhancedRollingReset=0 +ACF:mode_Guiding=0 +ACF:mode_UTR_RR=0 +ACF:mode_VideoRX=1 +ACF:mode_VideoRXR=0 +ARCH:HORI_AMPS=33 +ARCH:NUM_DETECT=1 +ARCH:VERT_AMPS=1 +FITS:READOUTMODE=VideoRX +[MODE_UTR_RR] +ACF:Expose=0 +ACF:LINECOUNT=2048 +ACF:PIXELCOUNT=64 +ACF:mode_EnhancedRollingReset=0 +ACF:mode_Guiding=0 +ACF:mode_UTR_RR=1 +ACF:mode_VideoRX=0 +ACF:mode_VideoRXR=0 +ARCH:HORI_AMPS=33 +ARCH:NUM_DETECT=1 +ARCH:VERT_AMPS=1 +FITS:READOUTMODE=UpTheRampRollingReset +[MODE_DEFAULT] +ACF:Expose=0 +ACF:LINECOUNT=2048 +ACF:PIXELCOUNT=64 +ACF:mode_EnhancedRollingReset=0 +ACF:mode_Guiding=0 +ACF:mode_UTR_RR=1 +ACF:mode_VideoRX=0 +ACF:mode_VideoRXR=0 +ARCH:HORI_AMPS=33 +ARCH:NUM_DETECT=1 +ARCH:VERT_AMPS=1 +FITS:READOUTMODE=UpTheRampRollingReset diff --git a/camerad/CMakeLists.txt b/camerad/CMakeLists.txt index cbd40e25..a0b68117 100644 --- a/camerad/CMakeLists.txt +++ b/camerad/CMakeLists.txt @@ -129,6 +129,7 @@ add_library(camera STATIC find_library(CCFITS_LIB CCfits NAMES libCCfits PATHS /usr/local/lib) find_library(CFITS_LIB cfitsio NAMES libcfitsio PATHS /usr/local/lib) +find_library(ZMQ_LIB zmq NAMES libzmq PATH /usr/local/lib) find_package(Threads) @@ -151,6 +152,7 @@ target_link_libraries(camerad ${CMAKE_THREAD_LIBS_INIT} ${CCFITS_LIB} ${CFITS_LIB} + ${ZMQ_LIB} ) target_link_libraries(camerad ${CARC_BASE}) diff --git a/camerad/archon.cpp b/camerad/archon.cpp index 2637e0f5..b66c47e2 100644 --- a/camerad/archon.cpp +++ b/camerad/archon.cpp @@ -39,6 +39,7 @@ namespace Archon { this->is_longexposure_set = false; this->is_window = false; this->is_autofetch = false; + this->is_zmq = false; this->win_hstart = 0; this->win_hstop = 2047; this->win_vstart = 0; @@ -960,12 +961,20 @@ namespace Archon { // if ( this->logwconfig && cmd.find("WCONFIG")!=std::string::npos ) logwrite( function, strip_newline(cmd) ); + auto write_start = std::chrono::steady_clock::now(); + // send the command // if ( (this->archon.Write(scmd)) == -1) { this->camera.log_error( function, "writing to camera socket"); } + auto write_end = std::chrono::steady_clock::now(); + auto write_duration = std::chrono::duration_cast(write_end - write_start).count(); + + logwrite(function, "Write() took " + std::to_string(write_duration) + " µs"); + + // For the FETCH command we don't wait for a reply, but return immediately. // FETCH results in a binary response which is handled elsewhere (in read_frame). // Must also distinguish this from the FETCHLOG command, for which we do wait @@ -978,30 +987,57 @@ namespace Archon { // For all other commands, receive the reply // + + auto read_start = std::chrono::steady_clock::now(); + + size_t newline_pos; reply.clear(); // zero reply buffer + // do { + // if ( (retval=this->archon.Poll()) <= 0) { + // if (retval==0) { + // message.str(""); + // message << "Poll timeout waiting for response from Archon command (maybe unrecognized command?)"; + // error = TIMEOUT; + // } + // if (retval<0) { + // message.str(""); + // message << "Poll error waiting for response from Archon command"; + // error = ERROR; + // } + // if ( error != NO_ERROR ) this->camera.log_error( function, message.str() ); + // break; + // } + // memset(buffer, '\0', 2048); // init temporary buffer + // retval = this->archon.Read(buffer, 2048); // read into temp buffer + // if (retval <= 0) { + // this->camera.log_error( function, "reading Archon" ); + // break; + // } + // reply.append(buffer); // append read buffer into the reply string + // } while(retval>0 && reply.find('\n') == std::string::npos); do { - if ( (retval=this->archon.Poll()) <= 0) { - if (retval==0) { - message.str(""); - message << "Poll timeout waiting for response from Archon command (maybe unrecognized command?)"; - error = TIMEOUT; - } - if (retval<0) { - message.str(""); - message << "Poll error waiting for response from Archon command"; - error = ERROR; - } - if ( error != NO_ERROR ) this->camera.log_error( function, message.str() ); - break; + memset(buffer, '\0', 2048); // init temporary buffer + retval = this->archon.Read(buffer, 2048); // non-blocking read + + if (retval > 0) { + // Got data, append to reply + reply.append(buffer, retval); } - memset(buffer, '\0', 2048); // init temporary buffer - retval = this->archon.Read(buffer, 2048); // read into temp buffer - if (retval <= 0) { - this->camera.log_error( function, "reading Archon" ); - break; + else if (retval == 0) { + // No data available yet (EAGAIN) + usleep(10); } - reply.append(buffer); // append read buffer into the reply string - } while(retval>0 && reply.find('\n') == std::string::npos); + else { + // retval < 0 => real error + this->camera.log_error(function, "error reading Archon"); + error = ERROR; + break; + } + } while (retval >= 0 && reply.find('\n') == std::string::npos); + + auto read_end = std::chrono::steady_clock::now(); + auto read_duration = std::chrono::duration_cast(read_end - read_start).count(); + logwrite(function, "reading took " + std::to_string(read_duration) + " µs"); // If there was an Archon error then clear the busy flag and get out now // @@ -2262,6 +2298,7 @@ namespace Archon { // send FRAME command to get frame buffer status // + auto t_cmd_start = std::chrono::steady_clock::now(); if (this->is_autofetch) { logwrite( function, "AUTOFETCH MODE: not sending FRAME command"); @@ -2272,6 +2309,13 @@ namespace Archon { } } + auto t_cmd_end = std::chrono::steady_clock::now(); + auto cmd_duration = std::chrono::duration_cast(t_cmd_end - t_cmd_start).count(); + + logwrite(function, "archon_cmd() took " + std::to_string(cmd_duration) + " µs"); + + // logwrite(function, "Frame status: " + reply); + // First Tokenize breaks the single, continuous reply string into vector of individual strings, // from "TIMER=xxxx RBUF=xxxx " to: // tokens[0] : TIMER=xxxx @@ -2820,22 +2864,22 @@ namespace Archon { for (block=0; blockarchon.Poll()) <= 0) { - if (retval==0) { - message.str(""); - message << "Poll timeout waiting for Archon frame data"; - error = ERROR; - } // TODO should error=TIMEOUT? - - if (retval<0) { - message.str(""); - message << "Poll error waiting for Archon frame data"; - error = ERROR; - } - - if ( error != NO_ERROR ) this->camera.log_error( function, message.str() ); - break; // breaks out of for loop - } + // if ( (retval=this->archon.Poll()) <= 0) { + // if (retval==0) { + // message.str(""); + // message << "Poll timeout waiting for Archon frame data"; + // error = ERROR; + // } // TODO should error=TIMEOUT? + + // if (retval<0) { + // message.str(""); + // message << "Poll error waiting for Archon frame data"; + // error = ERROR; + // } + + // if ( error != NO_ERROR ) this->camera.log_error( function, message.str() ); + // break; // breaks out of for loop + // } // Wait for a block+header Bytes to be available // (but don't wait more than 1 second -- this should be tens of microseconds or less) @@ -4527,6 +4571,160 @@ namespace Archon { } /**************** Archon::Interface::autofetch *******************************/ + /**************** Archon::Interface::zmq ******************************/ + /** + * @fn zmq + * @brief turn zmq server on/off + * @param state_in, string "TRUE, FALSE, 0, or 1" + * @return ERROR or NO_ERROR + * + * NOTE: this assumes LVDS is module 10 + * This function does the following: + * 1) turns zmq server on + * + */ + long Interface::zmq(std::string state_in, std::string &state_out) { + std::string function = "Archon::Interface::zmq"; + std::stringstream message; + long error = NO_ERROR; + const std::string& endpoint = "tcp://*:5555"; + + if ( !state_in.empty() ) { + try { + std::transform( state_in.begin(), state_in.end(), state_in.begin(), ::toupper ); // make uppercase + + if ( state_in == "FALSE" || state_in == "0" ) { + // Shut down ZMQ server + if (!this->is_zmq) { + return (error); + } + + this->is_zmq = false; + + if (this->serverThread_.joinable()) { + this->serverThread_.join(); + } + this->publisher_.reset(); + this->context_.reset(); + + if (error != NO_ERROR) { + message << "shutting down ZMQ server: "; + } else { + message << "shutting down ZMQ server: "; + } + + logwrite(function, message.str()); + } else if ( state_in == "TRUE" || state_in == "1" ) { + // Turn on ZMQ server + if (this->is_zmq) { + return (error); + } + + std::lock_guard lock(this->serverMutex_); + + try { + context_ = std::make_unique(1); + this->publisher_ = std::make_unique(*context_, zmq::socket_type::xpub); + this->publisher_->bind(endpoint); + std::cout << "ZMQ server started in XPUB mode on " << endpoint << std::endl; + this->is_zmq = true; + + serverThread_ = std::thread([this]() { + while (this->is_zmq) { + try { + zmq::message_t message; + publisher_->recv(message, zmq::recv_flags::dontwait); // Non-blocking receive + if (message.size() > 0) { + std::string received_message(static_cast(message.data()), message.size()); + // Process subscription messages + std::cout << "Received ZMQ message: " << received_message << std::endl; + } + } catch (const zmq::error_t& e) { + if (e.num() != EWOULDBLOCK) { // Ignore would block errors. + std::cerr << "ZMQ receive error: " << e.what() << std::endl; + } + } + // std::this_thread::sleep_for(std::chrono::milliseconds(10)); // Prevent busy waiting + } + + if(this->publisher_){ + this->publisher_->close(); + } + + if(this->context_){ + this->context_->shutdown(); + } + + std::cout << "ZMQ server stopped." << std::endl; + }); + } catch (const zmq::error_t& e) { + std::cerr << "Error starting ZMQ server: " << e.what() << std::endl; + this->is_zmq = false; // Ensure the flag is reset in case of error. + } + + if (error != NO_ERROR) { + message << "turning on ZMQ server: "; + } else { + message << "turning on ZMQ server: "; + } + + logwrite(function, message.str()); + } else { + message.str(""); message << "ZMQ server " << state_in << " is invalid. Expecting {true,false,0,1}"; + this->camera.log_error( function, message.str() ); + return ERROR; + } + + } catch (...) { + message.str(""); message << "unknown exception converting zmq state " << state_in << " to uppercase"; + this->camera.log_error( function, message.str() ); + return ERROR; + } + } + + state_out = ( this->is_zmq ? "true" : "false" ); + + if (error != NO_ERROR) { + message.str(""); message << "setting autofetch state to " << state_in; + this->camera.log_error( function, message.str() ); + return ERROR; + } + + return (error); + } + /**************** Archon::Interface::zmq *******************************/ + + /**************** Archon::Interface::write_to_zmq **************************/ + /** + * @fn write_to_zmq + * @brief write data on zmq socket + * @param string + * @return ERROR or NO_ERROR + * + */ + long Interface::write_to_zmq(const std::string& message) { + std::string function = "Archon::Interface::write_to_zmq"; + std::lock_guard lock(this->serverMutex_); // Protect access + long error = NO_ERROR; + + if (this->is_zmq && this->publisher_) { + try { + zmq::message_t zmq_message(message.size()); + memcpy(zmq_message.data(), message.data(), message.size()); + publisher_->send(zmq_message, zmq::send_flags::none); + error = NO_ERROR; + } catch (const zmq::error_t& e) { + std::cerr << "Error publishing message: " << e.what() << std::endl; + } + } else { + error = ERROR; + std::cerr << "ZMQ server is not running or publisher is not available." << std::endl; + } + + return (error); + } + /**************** Archon::Interface::get_parameter **************************/ + /**************** Archon::Interface::hexpose ******************************/ /** * @fn hexpose @@ -4690,6 +4888,7 @@ namespace Archon { nread = 0; // Keep track of how many we actually read int ns = nseq; // Iterate with ns, to preserve original request while (ns-- > 0 && this->lastframe < finalframe) { + auto frame_start = std::chrono::high_resolution_clock::now(); // if ( !this->camera.datacube() || this->camera.cubeamps() ) { // this->camera_info.start_time = get_timestamp(); // current system time formatted as YYYY-MM-DDTHH:MM:SS.sss @@ -4700,21 +4899,37 @@ namespace Archon { // this->add_filename_key(); // add filename to system keys database // } + auto exposure_start = std::chrono::high_resolution_clock::now(); + // COMMENTED OUT FOR HISPEC ATC TESTING // wait for the exposure delay to complete (if there is one) - if ( this->camera_info.exposure_time.value() != 0 ) { - error = this->wait_for_exposure(); - if ( error != NO_ERROR ) { - logwrite( function, "ERROR: waiting for exposure" ); - return error; - } - } + // if ( this->camera_info.exposure_time.value() != 0 ) { + // error = this->wait_for_exposure(); + // if ( error != NO_ERROR ) { + // logwrite( function, "ERROR: waiting for exposure" ); + // return error; + // } + // } + // this->camera_info.exposure_time.ms(); + + // wait for exposure time + // std::this_thread::sleep_for( std::chrono::microseconds( this->camera_info.exposure_time.ms() * 100 )); + auto exposure_end = std::chrono::high_resolution_clock::now(); + std::chrono::duration exposure_duration = exposure_end - exposure_start; + + auto readout_start = std::chrono::high_resolution_clock::now(); // Wait for the readout into frame buffer, error = this->hwait_for_readout(); if ( error != NO_ERROR ) { logwrite( function, "ERROR: waiting for readout" ); return error; } + auto readout_end = std::chrono::high_resolution_clock::now(); + std::chrono::duration readout_duration = readout_end - readout_start; + + auto readframe_start = std::chrono::high_resolution_clock::now(); + // Get frame status + error = this->get_frame_status(); // then read the frame buffer to host (and write file) when frame ready. error = hread_frame(); @@ -4722,6 +4937,30 @@ namespace Archon { logwrite( function, "ERROR: reading frame buffer" ); return error; } + auto readframe_end = std::chrono::high_resolution_clock::now(); + std::chrono::duration readframe_duration = readframe_end - readframe_start; + + // std::cout << "Image bitpix: " << std::to_string(this->camera_info.bitpix) << ", data type: " << std::to_string(this->camera_info.datatype) << std::endl; + int16_t *cbuf16s; + cbuf16s = (int16_t *)this->image_data; // cast to 16b signed int + std::stringstream ss; + for (size_t i=0; i < this->camera_info.section_size; i++) { + ss << cbuf16s[i]; + if (i < this->camera_info.section_size - 1) { + ss << ","; + } + } + + auto write_start = std::chrono::high_resolution_clock::now(); + // std::cout << "Image data: " << ss.str() << std::endl; + this->write_to_zmq(ss.str()); + auto write_end = std::chrono::high_resolution_clock::now(); + std::chrono::duration write_duration = write_end - write_start; + + // auto timer_start = std::chrono::high_resolution_clock::now(); + // this->get_timer(&this->start_timer); + // auto timer_end = std::chrono::high_resolution_clock::now(); + // std::chrono::duration timer_duration = timer_end - timer_start; // ASYNC status message on completion of each readout nread++; @@ -4729,6 +4968,18 @@ namespace Archon { this->camera.async.enqueue( message.str() ); logwrite( function, message.str() ); + auto frame_end = std::chrono::high_resolution_clock::now(); + std::chrono::duration frame_duration = frame_end - frame_start; + + // Log frame timing + logwrite(function, "\033[1;31mtiming wait_for_exposure: " + std::to_string(exposure_duration.count()) + " us\033[0m"); + logwrite(function, "\033[1;31mtiming hwait_for_readout: " + std::to_string(readout_duration.count()) + " us\033[0m"); + logwrite(function, "\033[1;31mtiming hread_frame: " + std::to_string(readframe_duration.count()) + " us\033[0m"); + logwrite(function, "\033[1;31mtiming write_to_zmq: " + std::to_string(write_duration.count()) + " us\033[0m"); + // logwrite(function, "\033[1;31mtiming get_timer: " + std::to_string(timer_duration.count()) + " us\033[0m"); + std::chrono::duration rest_duration = frame_duration - (exposure_duration + readout_duration + readframe_duration + write_duration); + logwrite(function, "\033[1;31mtiming rest: " + std::to_string(rest_duration.count()) + " us\033[0m"); + logwrite(function, "\033[1;31mtiming total frame: " + std::to_string(frame_duration.count()) + " us\033[0m"); if (error != NO_ERROR) break; // should be impossible but don't try additional sequences if there were errors } // end of sequence loop, while (ns-- > 0 && this->lastframe < finalframe) @@ -5170,10 +5421,10 @@ namespace Archon { { auto tstart = std::chrono::steady_clock::now(); while (true) { - auto tnow = std::chrono::steady_clock::now(); - auto elapsed = std::chrono::duration_cast(tnow - tstart).count(); - if ( elapsed > waittime ) break; - std::this_thread::sleep_for( std::chrono::microseconds( 10 )); + auto tnow = std::chrono::steady_clock::now(); + auto elapsed = std::chrono::duration_cast(tnow - tstart).count(); + if ( elapsed > waittime ) break; + std::this_thread::sleep_for( std::chrono::microseconds( 10 )); } } @@ -5194,9 +5445,9 @@ namespace Archon { // message.str(""); message << "EXPOSURE:" << (int)(this->camera_info.exposure_time.value() - (this->camera_info.exposure_progress * this->camera_info.exposure_time.value())); this->camera.async.enqueue( message.str() ); -// auto tnow = std::chrono::steady_clock::now(); -// auto elapsed = std::chrono::duration_cast(tnow - tstart).count(); -// if ( elapsed > waittime ) break; + // auto tnow = std::chrono::steady_clock::now(); + // auto elapsed = std::chrono::duration_cast(tnow - tstart).count(); + // if ( elapsed > waittime ) break; std::this_thread::sleep_for( std::chrono::milliseconds( 1 )); } } @@ -5225,15 +5476,15 @@ namespace Archon { // update progress // - this->camera_info.exposure_progress = (double)(archon_time_now - archon_start_time) / (double)(prediction - archon_start_time); - if (this->camera_info.exposure_progress < 0 || this->camera_info.exposure_progress > 1) this->camera_info.exposure_progress=1; + this->camera_info.exposure_progress = (double)(archon_time_now - archon_start_time) / (double)(prediction - archon_start_time); + if (this->camera_info.exposure_progress < 0 || this->camera_info.exposure_progress > 1) this->camera_info.exposure_progress=1; // ASYNC status message reports the elapsed time in the chosen unit // - message.str(""); message << "EXPOSURE:" << (int)(this->camera_info.exposure_time.value() - (this->camera_info.exposure_progress * this->camera_info.exposure_time.value())); - this->camera.async.enqueue( message.str() ); + // message.str(""); message << "EXPOSURE:" << (int)(this->camera_info.exposure_time.value() - (this->camera_info.exposure_progress * this->camera_info.exposure_time.value())); + // this->camera.async.enqueue( message.str() ); - std::cerr << std::setw(3) << (int)(this->camera_info.exposure_progress*100) << "\b\b\b"; // send to stderr in case anyone is watching + // std::cerr << std::setw(3) << (int)(this->camera_info.exposure_progress*100) << "\b\b\b"; // send to stderr in case anyone is watching // Archon timer ticks are in 10 nsec (1e-8) and exposure_time.value() is in msec // so multiply exposure_time.value() by MSEC_TO_TICK. @@ -5245,7 +5496,7 @@ namespace Archon { } // a little pause to slow down the requests to Archon - std::this_thread::sleep_for( std::chrono::microseconds( 100 )); + // std::this_thread::sleep_for( std::chrono::microseconds( 100 )); // There's a limit to how long we let this polling loop last // @@ -5437,7 +5688,8 @@ namespace Archon { message << "waiting for new frame: current frame=" << this->lastframe << " current buffer=" << this->frame.index+1; logwrite(function, message.str()); - usleep( 700 ); // tune for size of window + // usleep( 700 ); // tune for size of window + // std::this_thread::sleep_for( std::chrono::microseconds( this->camera_info.exposure_time.ms() * 1000 )); this->frame.index += 1; diff --git a/camerad/archon.h b/camerad/archon.h index 273104a3..8a232510 100644 --- a/camerad/archon.h +++ b/camerad/archon.h @@ -7,6 +7,7 @@ */ #pragma once +#include #include //!< needed here for types in set_axes() #include #include @@ -86,6 +87,12 @@ namespace Archon { unsigned long int start_timer, finish_timer; //!< Archon internal timer, start and end of exposure int n_hdrshift; //!< number of right-shift bits for Archon buffer in HDR mode + // For ZMQ + std::unique_ptr context_; + std::unique_ptr publisher_; + std::thread serverThread_; + std::mutex serverMutex_; + public: Interface(); @@ -116,6 +123,7 @@ namespace Archon { bool is_longexposure_set; //!< true for long exposure mode (exptime in sec), false for exptime in msec bool is_window; //!< true if in window mode for h2rg, false if not bool is_autofetch; + bool is_zmq; int win_hstart; int win_hstop; int win_vstart; @@ -243,6 +251,10 @@ namespace Archon { long autofetch(std::string state_in, std::string &state_out); + long zmq(std::string state_in, std::string &state_out); + + long int write_to_zmq(const std::string& message); + long video(); long wait_for_exposure(); diff --git a/camerad/camerad.cpp b/camerad/camerad.cpp index 3e0c4c72..24ac93bc 100644 --- a/camerad/camerad.cpp +++ b/camerad/camerad.cpp @@ -759,7 +759,14 @@ void doit(Network::TcpSocket sock) { ret = server.autofetch(args, retstring); if (!retstring.empty()) { sock.Write(retstring); - sock.Write( " "); + sock.Write(" "); + } + } + else if (cmd=="zmq") { + ret = server.zmq(args, retstring); + if (!retstring.empty()) { + sock.Write(retstring); + sock.Write(" "); } } else if ( cmd == "fetchlog" ) { diff --git a/utils/network.cpp b/utils/network.cpp index 2b049b84..ae49189a 100644 --- a/utils/network.cpp +++ b/utils/network.cpp @@ -730,7 +730,7 @@ namespace Network { // restore flags // - if ( flags >= 0 && (fcntl(this->fd, F_SETFL, flags) < 0) ) { + if ( flags >= 0 && (fcntl(this->fd, F_SETFL, flags | O_NONBLOCK) < 0) ) { errstm << "error " << errno << " setting socket file descriptor flags: " << std::strerror(errno); logwrite(function, errstm.str()); return -1; @@ -829,35 +829,62 @@ namespace Network { * buffer and the number of bytes to read. * */ + // int TcpSocket::Read(void* buf, size_t count) { + // std::string function = "Network::TcpSocket::Read[cbuf]"; + // std::stringstream message; + // int nread; + + // // get the time now for timeout purposes + // // + // std::chrono::steady_clock::time_point tstart = std::chrono::steady_clock::now(); + + // while ( ( nread = read( this->fd, buf, count ) ) < 0 ) { + // if ( errno != EAGAIN ) { + // message << "ERROR reading data on fd " << this->fd << ": " << strerror(errno); + // logwrite( function, message.str() ); + // break; + // } + + // // get time now and check for timeout + // // + // std::chrono::steady_clock::time_point tnow = std::chrono::steady_clock::now(); + + // auto elapsed = std::chrono::duration_cast(tnow - tstart).count(); + + // if ( elapsed > POLLTIMEOUT ) { + // message << "ERROR: timeout waiting for data on fd " << this->fd; + // logwrite( function, message.str() ); + // break; + // } + // } + // return( nread ); + // } int TcpSocket::Read(void* buf, size_t count) { std::string function = "Network::TcpSocket::Read[cbuf]"; std::stringstream message; int nread; - // get the time now for timeout purposes - // - std::chrono::steady_clock::time_point tstart = std::chrono::steady_clock::now(); - - while ( ( nread = read( this->fd, buf, count ) ) < 0 ) { - if ( errno != EAGAIN ) { - message << "ERROR reading data on fd " << this->fd << ": " << strerror(errno); - logwrite( function, message.str() ); - break; - } - - // get time now and check for timeout - // - std::chrono::steady_clock::time_point tnow = std::chrono::steady_clock::now(); - - auto elapsed = std::chrono::duration_cast(tnow - tstart).count(); + nread = ::read(this->fd, buf, count); - if ( elapsed > POLLTIMEOUT ) { - message << "ERROR: timeout waiting for data on fd " << this->fd; - logwrite( function, message.str() ); - break; - } + if (nread < 0) { + if (errno == EAGAIN || errno == EWOULDBLOCK) { + // No data ready, return 0 + return 0; + } else { + message << "ERROR reading data on fd " << this->fd << ": " << strerror(errno); + logwrite(function, message.str()); + return -1; + } } - return( nread ); + else if (nread == 0) { + // connection closed + message << "WARNING: connection closed on fd " << this->fd; + logwrite(function, message.str()); + return 0; + } + + // Successfully read nread bytes + return nread; } /**************** Network::TcpSocket::Read **********************************/ diff --git a/utils/network.h b/utils/network.h index e31dfcb7..434fee81 100644 --- a/utils/network.h +++ b/utils/network.h @@ -17,6 +17,7 @@ #include #include #include +#include #include /// for ioctl, FIONREAD #include /// for pollfd @@ -86,6 +87,7 @@ namespace Network { int Listen(); /// create a TCP listening socket int Poll(); /// polls a single file descriptor to wait for incoming data to read int Poll( int timeout ); /// polls a single file descriptor with specified timeout + int PollMicroseconds(int microseconds_total); int Connect(); /// connect to this->host on this->port int Close(); /// close a socket connection int Read(void* buf, size_t count); /// read data from connected socket