#include #include #include #include #include #include #include #include #include #include #include #include 'TCP_Funcs.au3' Opt('MustDeclarevars',1) Global $Target[1000],$RA[1000],$Dec[1000],$B[1000],$Priority[1000],$Targetcounts[1000],$Previouscounts[1000],$Tcounts Global $Solve[1000],$Score[1000],$Obsflag[1000],$CanObs[1000],$N,$Ne[1000],$Mode[1000],$Owner[1000],$CurrentCounts[1000] Global $List, $Input2, $Input3, $Input4, $Input5, $Input6, $Input7, $Input10, $Dur, $Direction, $Star Global $Tele, $TheSky, $Cam, $AllDocs, $TheApp, $SlitX, $SlitY, $acNum, $sgNum, $Path, $Nexp = 8, $hList Global $sgprefix, $Obslist, $hLog, $ObsLog, $Status, $Airmass, $Abortflag, $iPID2 Global $Label10, $EPortX, $EPortY, $Label11, $BeginEST, $EndEST Global $BeginSolar, $EndSolar, $Begin, $End, $End2, $flagslit, $Dark, $Textaddress, $SendTo Global $pi = 3.141592654 Global $iEventError = 0 Global $zone = -5 Global $Label12, $WeatherStatus, $DomeStatus, $Label14, $iPIDweather, $TCPCmdSent = "2000/01/01 00:00:00" Global $Domeflag = 0 ;0 is closed, 1 is open Global $Weatherflag = 0 Global $PauseFlag = 0, $PauseTime = "2000/01/01 00:00:00", $CloseFlag = 0, $CloseTime = "2000/01/01 00:00:00" Global $GoToNext = 0 Global $K = 0 Global $PauseStartTime Global $Interrupt = 0 Global $Trackflag = 0 Global $oMyRet[2], $Tcount = 0 Global $oEH Global $SafeMessage = " " Global $GAMpos = 0 Global $NDark, $NBias Global $Label13, $Input15, $Input16, $Input17, $Label16, $Slew_error Global Const $AllowTCPCommands = True ;this script WILL NOT issue any TCP commands unless $AllowTCPCommands is changed to True Global $ChkAD,$isChkAD,$Label17,$Label18,$Label19,$Label20,$Group1,$Radio1,$Radio2,$Radio3,$Radio4,$User,$ChkGAM,$isChkGAM Global $Label21,$LabelSN,$Label23,$Label24,$InputTarget,$InputMin,$InputMax,$ChkCnt,$Label25,$Label26,$ChkAbort Global $isChkAbort,$Browse1,$Browse2,$isChkCnt,$CheckAuto,$isChkAuto,$AutoErr,$ChkMoon,$isChkMoon Global $Q,$Q2,$Label27,$Label28,$Seeing=4.00,$SlitYorig,$Label33,$Label34,$Label35,$Label36 Global $Gexpose = 5.0 Global $Util,$RA2000=0.0,$DEC2000=0.0,$RAnow=0.0,$DECnow=0.0,$Label22,$Label29,$Label30,$Label31 MainGUI() Func MainGUI() Local $Form1, $Label1, $Label2, $Label3, $Label4, $Label5, $sg, $Label6, $Button1, $Button2, $Label7 Local $Label8, $Label9, $nMsg, $line, $M2Serr, $SidTime, $Label15, $Button3, $Button4 Local $Easterr, $Obserr, $Objinfo, $Array, $Body, $Subject, $GAMerr Local $Exposure, $Type, $Shutdown = 0 Local $Readflag = 0 Local $sFilePath,$tPath,$iPathExists,$txt1,$txt2 #Region ### START Koda GUI section ### Form=C:\Users\grayro\Documents\Koda\koda_1.7.3.0\Forms\Robotic_Spectroscopist_v11.kxf $Form1 = GUICreate("The Robotic Spectroscopist v3.2b", 618, 449, 192, 124) GUISetFont(12, 400, 0, "MS Sans Serif") $Label1 = GUICtrlCreateLabel("The Robotic Spectroscopist v3.2b", 8, 8, 482, 44) GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif") $Label2 = GUICtrlCreateLabel("Observing List", 8, 56, 112, 24) $List = GUICtrlCreateInput("h:\Observing_Lists\test1.lst", 136, 56, 265, 28) $Label3 = GUICtrlCreateLabel(" Slit Coordinates: X", 8, 128, 158, 24) $Input2 = GUICtrlCreateInput("200", 176, 128, 65, 28) $Label4 = GUICtrlCreateLabel("Y", 256, 128, 14, 24) $Input3 = GUICtrlCreateInput("135", 280, 128, 73, 28) $Label5 = GUICtrlCreateLabel(" Running Numbers: ac", 8, 160, 184, 24) $Input4 = GUICtrlCreateInput("1", 192, 160, 57, 28) $sg = GUICtrlCreateLabel("sg", 272, 160, 22, 24) $Input5 = GUICtrlCreateInput("18", 305, 160, 39, 28) $Input6 = GUICtrlCreateInput("1", 360, 160, 49, 28) $Label6 = GUICtrlCreateLabel("Path", 16, 192, 38, 24) $Input7 = GUICtrlCreateInput("h:\jul1815", 64, 192, 185, 28) $Button1 = GUICtrlCreateButton("Begin Observing", 16, 224, 217, 57) GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif") $Button2 = GUICtrlCreateButton("Exit", 248, 224, 121, 33) GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif") $Label7 = GUICtrlCreateLabel("Current Object", 8, 320, 113, 24) $Input10 = GUICtrlCreateInput("8", 368, 320, 49, 28) $Label8 = GUICtrlCreateLabel("Exp", 424, 320, 35, 24) $Label9 = GUICtrlCreateLabel("", 128, 320, 228, 28, $SS_SUNKEN) $Status = GUICtrlCreateLabel("Status", 8, 384, 603, 24, $SS_SUNKEN) $Label10 = GUICtrlCreateLabel("East Port Star Pixel: X", 8, 96, 180, 24) $EPortX = GUICtrlCreateInput("838", 192, 96, 65, 28) $EPortY = GUICtrlCreateInput("633", 296, 96, 73, 28) $Label11 = GUICtrlCreateLabel("Y", 272, 96, 14, 24) $Label12 = GUICtrlCreateLabel("Weather Status:", 8, 416, 124, 24) $WeatherStatus = GUICtrlCreateLabel("waiting", 136, 416, 120, 24, $SS_SUNKEN) $DomeStatus = GUICtrlCreateLabel("waiting", 384, 416, 106, 24, $SS_SUNKEN) $Label14 = GUICtrlCreateLabel("Dome Status:", 272, 416, 106, 24) $Label15 = GUICtrlCreateLabel("Messaging", 336, 192, 73, 24) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $Textaddress = GUICtrlCreateInput("Enter Text/email Address", 408, 192, 201, 28) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $Button3 = GUICtrlCreateButton("Test Text Messaging", 408, 216, 201, 25) GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif") $Label13 = GUICtrlCreateLabel("dk", 432, 160, 21, 24) $Input15 = GUICtrlCreateInput("1", 456, 160, 49, 28) $Label16 = GUICtrlCreateLabel("bi", 520, 160, 16, 24) $Input17 = GUICtrlCreateInput("1", 544, 160, 41, 28) $ChkAD = GUICtrlCreateCheckbox("Artificial Dawn", 504, 16, 105, 17) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $ChkGAM = GUICtrlCreateCheckbox("GAM Jog", 504, 32, 97, 17) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $Label17 = GUICtrlCreateLabel("Begin (UT)", 8, 288, 80, 24) $Label18 = GUICtrlCreateLabel(" ", 96, 288, 72, 24, $SS_SUNKEN) $Label19 = GUICtrlCreateLabel("End (UT)", 184, 288, 68, 24) $Label20 = GUICtrlCreateLabel(" ", 264, 288, 76, 24, $SS_SUNKEN) $Group1 = GUICtrlCreateGroup("User", 496, 64, 81, 89) GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif") $Radio1 = GUICtrlCreateRadio("Briley", 504, 80, 57, 17) GUICtrlSetFont(-1, 8, 400, 0, "MS Sans Serif") $Radio2 = GUICtrlCreateRadio("Gray", 504, 96, 65, 17) GUICtrlSetFont(-1, 8, 400, 0, "MS Sans Serif") $Radio3 = GUICtrlCreateRadio("McGahee", 504, 112, 65, 17) GUICtrlSetFont(-1, 8, 400, 0, "MS Sans Serif") $Radio4 = GUICtrlCreateRadio("Other", 504, 128, 65, 17) GUICtrlSetFont(-1, 8, 400, 0, "MS Sans Serif") GUICtrlSetState(-1, $GUI_CHECKED) GUICtrlCreateGroup("", -99, -99, 1, 1) $Label21 = GUICtrlCreateLabel("Total Counts", 376, 272, 79, 20) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $LabelSN = GUICtrlCreateLabel(" 0", 464, 272, 71, 20, $SS_SUNKEN) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $Label23 = GUICtrlCreateLabel("Target Counts", 376, 296, 88, 20) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $InputTarget = GUICtrlCreateInput(" 34000", 464, 296, 73, 24) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $InputMin = GUICtrlCreateInput("3", 576, 272, 25, 24) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $Label25 = GUICtrlCreateLabel("Min", 544, 272, 25, 20) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $Label26 = GUICtrlCreateLabel("Max", 544, 296, 29, 20) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $InputMax = GUICtrlCreateInput("10", 576, 296, 25, 24) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $ChkCnt = GUICtrlCreateCheckbox("Expose to Target Counts", 376, 248, 169, 17) GUICtrlSetState(-1, $GUI_CHECKED) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $Label24 = GUICtrlCreateLabel("Exp:", 576, 256, 30, 20) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $ChkAbort = GUICtrlCreateCheckbox("ABORT", 504, 416, 89, 25, BitOR($GUI_SS_DEFAULT_CHECKBOX,$BS_RIGHTBUTTON)) GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") $Browse1 = GUICtrlCreateButton("Browse", 408, 56, 65, 25) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $Browse2 = GUICtrlCreateButton("Browse", 256, 192, 65, 25) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $CheckAuto = GUICtrlCreateCheckbox("Auto Start", 504, 48, 97, 17) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $ChkMoon = GUICtrlCreateCheckbox("Avoid Moon", 384, 88, 97, 17) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $Button4 = GUICtrlCreateButton("Shutdown after dawn", 248, 256, 121, 25) GUICtrlSetFont(-1, 8, 400, 0, "MS Sans Serif") $Label27 = GUICtrlCreateLabel(" 4.0", 577, 328, 28, 20, $SS_SUNKEN) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $Label28 = GUICtrlCreateLabel("Seeing", 520, 328, 45, 20) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $Label22 = GUICtrlCreateLabel("Score:", 504, 352, 43, 20) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $Label29 = GUICtrlCreateLabel("0.00", 552, 352, 52, 20, $SS_SUNKEN) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $Label30 = GUICtrlCreateLabel("Scope Motors: ", 8, 352, 94, 20) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $Label31 = GUICtrlCreateLabel("off", 104, 352, 18, 20, $SS_SUNKEN) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $Label33 = GUICtrlCreateLabel("2Dcorr?", 136, 352, 51, 20) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $Label34 = GUICtrlCreateLabel("?", 192, 352, 11, 20, $SS_SUNKEN) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $Label35 = GUICtrlCreateLabel("Project:", 216, 352, 49, 20) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $Label36 = GUICtrlCreateLabel("??????????", 272, 352, 74, 20, $SS_SUNKEN) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### $oEH = ObjEvent("AutoIt.Error","MyError") GUICtrlSetData($Status,"Initializing Dome: please wait (~2min)") Scope_Motors("on") DomeControl("close") GUICtrlSetData($Status,"Dome should now be closed!!") Scope_Motors("off") Sleep(1000) $iPIDWeather = ShellExecute("c:\users\observer\Robotic_Weatherman.au3") GUICtrlSetData($Status,"Don't begin until camera has initialized") Connect_Camera() $Cam.Expose(1.0,0) Do Until $Cam.ImageReady $Cam.GuiderExpose(1.0) Sleep(2000) Disconnect_Camera() Sleep(1000) GUICtrlSetData($Status,"Camera has initialized") Sleep(5000) GUICtrlSetData($Status,"Don't press Begin Observing until Robotic Weatherman initializes (~45 sec)") Connect_Everything() While 1 $Path = GUICtrlRead($Input7) $acNum = GUICtrlRead($Input4) $sgprefix = GUICtrlRead($Input5) $sgNum = GUICtrlRead($Input6) $Obslist = GUICtrlRead($List) $Abortflag = 0 GUICtrlSetState($ChkAbort,$GUI_UNCHECKED) $nMsg = GUIGetMsg() If $nMsg == $Radio1 Then $User = 1 GUICtrlSetData($Textaddress,"XXXXXXXXXX@txt.att.net") ElseIf $nMsg == $Radio2 Then $User = 2 GUICtrlSetData($Textaddress,"XXXXXXXXXXX@mms.cricketwireless.net") ElseIf $nMsg == $Radio3 Then $User = 3 GUICtrlSetData($Textaddress,"XXXXXXXXXX@vzwpix.com") ElseIf $nMsg == $Radio4 Then $User = 4 GUICtrlSetData($Textaddress,"Enter Text/email address") EndIf Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $Browse1 $txt1=FileOpenDialog("Open", "C:\","All (*.*)") GUICtrlSetData($List,$txt1) Case $Browse2 $txt2=FileSelectFolder( "Open", "C:\") GUICtrlSetData($Input7,$txt2) Case $Button1 $Easterr = $AutoErr = $M2Serr = $Obserr = $GAMerr = 0 $Path = GUICtrlRead($Input7) $iPathExists = FileExists($Path) While $iPathExists == 0 MsgBox(0,"","Save path does not exist. Please correct manually (browse doesn't work) and then press OK") $Path = GUICtrlRead($Input7) $iPathExists = FileExists($Path) WEnd $SlitYorig = Number(GUICtrlRead($Input3)) GUICtrlSetData($Status,"Checking Telescope setup"); Sleep(2000) CheckTeleSetUp() $SendTo = GUICtrlRead($Textaddress) GUICtrlSetData($Status,"Reading Targets") If $Readflag == 0 Then GUICtrlSetData($Status,"Reading Target File") ReadTargets() GUICtrlSetData($Status,"Determining which targets can be observed") DetermineObservable() $Readflag = 1 EndIf GUICtrlSetData($Status,"Completed Reading Targets") $ObsLog = $Path & "\" & "Log.txt" $hLog = FileOpen($ObsLog,$FO_APPEND) $K = 0 $Domeflag = 0 ;dome is closed $isChkAuto = GUICtrlRead($CheckAuto) GUICtrlSetData($Status,"Entering Main Loop") While 1 $Abortflag = AbortRead() If $Abortflag == 1 Then GUICtrlSetData($Status,"Aborting Observations. Please Exit") ExitLoop EndIf $isChkAD = GUICtrlRead($ChkAD) $isChkGAM = GUICtrlRead($ChkGAM) GUICtrlSetData($Status,"Checking Dark Status") $Dark = IsItDark3() Sleep(3000) $Weatherflag = WeatherRead() If $isChkAD == 1 Then ;implements artificial dawn to enable complete shutdown early $Dark = 2 GUICtrlSetData($Status,"Artificial Dawn!") Sleep(4000) EndIf If $Dark == 0 Then GUICtrlSetData($Status,"Waiting for twilight to end; Start at Sidtime = " & StringFormat("%.2f",$Begin)) Sleep(10000) ContinueLoop ElseIf $Dark == 1 And $Weatherflag == 0 Then GUICtrlSetData($Status,"It is Dark and clear, and we are observing! ") Scope_Motors("on") If $Domeflag == 0 Then DomeControl("open") EndIf Tracking("on") Sleep(2000) If $isChkAuto == 1 Then $AutoErr = AutoStart() If $AutoErr == -1 Then GUICtrlSetData($Status,"AutoStart failed. Moving to Safe Mode") If $Domeflag == 1 Then DomeControl("close") EndIf Slew2Zenith() Tracking("off") Sleep(10000) ExitLoop EndIf EndIf ElseIf $Dark == 1 And $Weatherflag <> 0 Then GUICtrlSetData($Status,"It is Dark. Currently in a weather pause") Sleep(3000) $NDark = Number(GUICtrlRead($Input15)) If $NDark <= 8 Then GUICtrlSetData($Status,"Weather pause: Taking Darks and Biases") $Exposure = 300.0 $Type = "Dark" $NDark = Number(GUICtrlRead($Input15)) GetDark($Exposure,$Type) $NDark = ThreeDigAdj($NDark + 1) GUICtrlSetData($Input15,$NDark) EndIf $NBias = Number(GUICtrlRead($Input17)) If $NBias <= 25 Then $Exposure = 0 $Type = "Bias" $NBias = Number(GUICtrlRead($Input17)) GetDark($Exposure,$Type) $NBias = ThreeDigAdj($NBias + 1) GUICtrlSetData($Input17,$NBias) EndIf ContinueLoop ElseIf $Dark == 2 Then $Easterr = $AutoErr = $M2Serr = $Obserr = $GAMerr = 0 GUICtrlSetData($Status,"Dawn! Ending observations") Scope_Motors("on") DomeControl("close") ;GUICtrlSetData($Status,"Dawn: Turning Tracking off") ;Tracking("off") ;Sleep(3000) GUICtrlSetData($Status,"Shutting Telescope down") ShutdownTele() ;turns tracking off and puts telescope at zenith. Also turns motors off. GUICtrlSetData($Status,"Telescope is at zenith and tracking is off") Sleep(3000) $NDark = Number(GUICtrlRead($Input15)) While $NDark <= 9 FileWriteLine($hLog,"Dark" & $NDark) GUICtrlSetData($Status,"Dawn: Getting Extra Darks") $Exposure = 300.0 $Type = "Dark" $NDark = Number(GUICtrlRead($Input15)) GetDark($Exposure,$Type) $NDark = ThreeDigAdj($NDark + 1) GUICtrlSetData($Input15,$NDark) Wend GUICtrlSetData($Status,"Completed Darks") Sleep(2000) $NBias = Number(GUICtrlRead($Input17)) While $NBias <= 26 GUICtrlSetData($Status,"Dawn: Getting Extra Biases") FileWriteLine($hLog,"Bias" & $NBias) $Exposure = 0.0 $Type = "Bias" $NBias = Number(GUICtrlRead($Input17)) GetDark($Exposure,$Type) $NBias = ThreeDigAdj($NBias + 1) GUICtrlSetData($Input17,$NBias) WEnd GetFlats() GUICtrlSetData($Status,"Calibrations and Observations complete!") Archive_Zip() Lights("on") ExitLoop Else ;We get here if the dark status is unknown, so wait 3 seconds and try again Sleep(3000) $Dark = IsItDark3() If $Dark <> -1 Then ContinueLoop Else GUICtrlSetData($Status,"Dark Status not Known. Moving to Safe Mode") Scope_Motors("on") DomeControl("close") Slew2Zenith() Tracking("off") Sleep(10000) ExitLoop EndIf EndIf If $Weatherflag <> 0 Then ;skips over observations until weather clears Sleep(10000) ContinueLoop EndIf $K = FindNextObject() If $K == 0 Then GUICtrlSetData($Status,"Observations are Complete. Dome Closing and Tracking Off") Sleep(5000) Scope_Motors("on") DomeControl("close") Tracking("off") GUICtrlSetData($Status,"Shutting Telescope down") ShutdownTele() GUICtrlSetData($Status,"Telescope is at zenith and tracking is off") Sleep(3000) $NDark = Number(GUICtrlRead($Input15)) While $NDark <= 9 GUICtrlSetData($Status,"Observations completed: Getting Extra Darks") FileWriteLine($hLog,"Dark" & $NDark) $Exposure = 300.0 $Type = "Dark" $NDark = Number(GUICtrlRead($Input15)) GetDark($Exposure,$Type) $NDark = ThreeDigAdj($NDark + 1) GUICtrlSetData($Input15,$NDark) Wend GUICtrlSetData($Status,"Completed Darks") Sleep(2000) $NBias = Number(GUICtrlRead($Input17)) While $NBias <= 26 GUICtrlSetData($Status,"Observations completed: Getting Extra Biases") FileWriteLine($hLog,"Bias" & $NBias) $Exposure = 0.0 $Type = "Bias" $NBias = Number(GUICtrlRead($Input17)) GetDark($Exposure,$Type) $NBias = ThreeDigAdj($NBias + 1) GUICtrlSetData($Input17,$NBias) WEnd GetFlats() GUICtrlSetData($Status,"Calibrations and Observations complete!") Archive_Zip() ExitLoop EndIf $Interrupt = 0 ;Interrupt flag. If 0, observations not interrupted, 1 => interrupted by clouds $Star = $Target[$K] $Nexp = 6 ;Set guide exposure time according to brightness of star. If $B[$K] <= 9.5 Then $Gexpose = 5.0 ElseIf $B[$K] > 11.0 Then $Gexpose = 15.0 Else $Gexpose = 10.0 EndIf FileWriteLine($hLog,$Star) FileWriteLine($hLog,"Score = " & StringFormat("%.2f",$Score[$K])) GUICtrlSetData($Label9,$Star) GUICtrlSetData($Input10,$Nexp) GUICtrlSetData($Label34,$Solve[$K]) GUICtrlSetData($Label36,$Owner[$K]) GUICtrlSetData($Label29,StringFormat("%.2f",$Score[$K])) $Slew_error = Slew($Star) If $Slew_error == 0 Then ;deal with stars not in TheSky6 database $Obsflag[$K] = 3 FileWriteLine($hLog,"Star not found in TheSky6 catalog") ContinueLoop EndIf GUICtrlSetData($Status,"Dome Slewing") Sleep(15000) GUICtrlSetData($Status,"Acquiring Star in Eastport camera") If $GAMpos <> 2 Then $GAMerr = MoveGAM4to2() If $GAMerr == -1 Then GUICtrlSetData($Status,"GAM Error, Enter Safe Mode") Scope_Motors("on") DomeControl("close") Slew2Zenith() Tracking("off") $SafeMessage = "GAM Error" ExitLoop EndIf EndIf $Easterr = EastPort2() $Q = 0 $Q2 = 0 If $Easterr == 1 Then GUICtrlSetData($Status,"No Bright Star found in Eastport Image. Will retry") FileWriteLine($hLog,"Error: No bright star in Eastport Image") EndIf While $Easterr == 1 And $Q < 2 Sleep(10000) GUICtrlSetData($Status,"Retrying Eastport Camera") FileWriteLine($hLog,"Retrying Eastport Camera") $Easterr = EastPort2() $Q = $Q + 1 Wend If $Easterr == 1 Then GUICtrlSetData($Status,"No Bright Star found in Eastport Image, Enter Safe Mode") FileWriteLine($hLog,"Error: No bright star in Eastport Image") $SafeMessage = "No bright star in Eastport Image" Scope_Motors("on") DomeControl("close") Slew2Zenith() Tracking("off") ExitLoop EndIf While ($Easterr == 2 Or $Easterr == 3) And $Q2 < 2 Sleep(10000) GUICtrlSetData($Status,"Retrying Plate Solve with longer exposure") FileWriteLine($hLog,"Retrying Plate Solve") $Q2 = $Q2 + 1 $Easterr = EastPort2() WEnd If $Easterr == 2 Or $Easterr == 3 Then GUICtrlSetData($Status,"Could not Plate Solve this star, going to next star") FileWriteLine($hLog,"Plate Solve failed for this star") $Obsflag[$K] = 2 Sleep(3000) ContinueLoop EndIf GUICtrlSetData($Status,"Star centered in Eastport image") $Obsflag[$K] = 1 ;indicates that observations are now ongoing Sleep(1000) If $TheSky.dObjectDec < 60.0 And $Solve[$K] == 'n' Then GUICtrlSetData($Status,"Syncing Telescope to Coordinates") $Tele.Sync($RAnow,$DECnow,$Star) EndIf $Obserr = Observe() If $Obserr = 1 Then GUICtrlSetData($Status,"Observations failed: Enter Safe Mode") Sleep(3000) FileWriteLine($hLog,"Error: No star in Guide Camera") Scope_Motors("on") DomeControl("close") Slew2Zenith() Tracking("off") ExitLoop Else If $Interrupt == 0 Then ;normal completion of observations GUICtrlSetData($Status,"Observations for current object completed") $Obsflag[$K] = 2 ;don't observe this star again tonight Else ;observations were interrupted by clouds, set Obsflag so star can be observed again GUICtrlSetData($Status,"Observations for current object interrupted") $Obsflag[$K] = 1 EndIf Sleep(2000) EndIf Wend If $Easterr == 1 Or $AutoErr == -1 Or $M2Serr == 1 Or $Obserr == 1 Or $GAMerr == -1 Or $Dark == -1 Then $SendTo = GUICtrlRead($Textaddress) $GAMpos = 0 GUICtrlSetData($Status,"Safe Mode. Dome closed, Tracking Off." & $SafeMessage) FileWriteLine($hLog,"Safe Mode due to star acquisition errors") $Subject = "RS in Safe Mode" $Body = "RS in Safe Mode. Log in to check on status" SendMessage($SendTo,$Subject,$Body) EndIf FileClose($hLog) Case $Button2 Disconnect_Everything() ProcessClose($iPID2) ProcessClose($iPIDWeather) Exit Case $Button3 $SendTo = GUICtrlRead($Textaddress) $Subject = "Test Message" $Body = "This is a test message from RS" SendMessage($SendTo,$Subject,$Body) Case $Button4 GUICtrlSetData($Status,"Shutting Down with Calibrations") Lights("off") Scope_Motors("on") DomeControl("close") GUICtrlSetData($Status,"Shutting Telescope down") ShutdownTele() GUICtrlSetData($Status,"Telescope is at zenith and tracking is off") Sleep(3000) $NDark = Number(GUICtrlRead($Input15)) While $NDark <= 9 FileWriteLine($hLog,"Dark" & $NDark) GUICtrlSetData($Status,"Getting Extra Darks") $Exposure = 300.0 $Type = "Dark" $NDark = Number(GUICtrlRead($Input15)) GetDark($Exposure,$Type) $NDark = ThreeDigAdj($NDark + 1) GUICtrlSetData($Input15,$NDark) Wend GUICtrlSetData($Status,"Completed Darks") Sleep(2000) $NBias = Number(GUICtrlRead($Input17)) While $NBias <= 26 GUICtrlSetData($Status,"Getting Extra Biases") FileWriteLine($hLog,"Bias" & $NBias) $Exposure = 0.0 $Type = "Bias" $NBias = Number(GUICtrlRead($Input17)) GetDark($Exposure,$Type) $NBias = ThreeDigAdj($NBias + 1) GUICtrlSetData($Input17,$NBias) WEnd GetFlats() GUICtrlSetData($Status,"Calibrations and Observations complete!") Archive_Zip() Lights("on") GUICtrlSetData($Status,"Please Press Exit") EndSwitch WEnd EndFunc Func Connect_Everything() $TheSky = ObjCreate("TheSky6.RASCOMTheSky") $Tele = ObjCreate("TheSky6.RASCOMTele") $Util = ObjCreate("TheSky6.Utils") $TheSky.Connect() $Tele.Connect() If($Tele.IsConnected = 0) Then MsgBox(0,"","Telescope Connection failed") Exit EndIf $Cam = ObjCreate("MaxIm.CCDCamera") $Cam.LinkEnabled = True If $Cam.LinkEnabled = False Then MsgBox(0,"","Camera not ready") Exit EndIf $Cam.DisableAutoShutdown = True If $Cam.GuiderNumX > 500 Then MsgBox(0,"","Guide Camera not specified as Camera 2. Please correct") ProcessClose($iPID2) ProcessClose($iPIDWeather) Exit EndIf Sleep(1000) $TheApp = ObjCreate("MaxIm.Application") If @error <> 0 Then MsgBox(0,"","Could not create MaxIm Application") Exit EndIf $AllDocs = $TheApp.Documents EndFunc Func MyError() Local $sHexNumber ;MsgBox(0,"","Error Captured") $sHexNumber = Hex($oEH.number, 8) $iEventError = 1 EndFunc Func Disconnect_Everything() $Tele.Disconnect() $TheSky.DisConnect() $Cam="" $TheApp="" EndFunc Func Slew($Star) Local $results GUICtrlSetData($Status,"Slewing") GUISetState(@SW_SHOW) $iEventError = 0 $TheSky.GetObjectRaDec($Star) If $iEventError == 1 Then GUICtrlSetData($Status,"Cannot find " & $Star & " in TheSky6 catalog. Using coords in object list") FileWriteLine($hLog,$Star & " cannot be found in TheSky6 catalog. Using list coords") Sleep(1500) $RA2000 = $RA[$K] $DEC2000 = $Dec[$K] $results = $Util.Precess2000toNow($RA2000,$DEC2000) $RAnow = $results[0] $DECnow = $results[1] $iEventError = 0 Else $RAnow = $TheSky.dObjectRa $DECnow = $TheSky.dObjectDec $results = $Util.PrecessNowto2000($TheSky.dObjectRa,$TheSky.dObjectDec) $RA2000 = $results[0] $DEC2000 = $results[1] EndIf If $DECnow <= -25.0 Then GUICtrlSetData($Status,"This star is too far south to observe") FileWriteLine($hLog,$Star & " cannot be observed as it is too far south") Return 0 EndIf $Tele.SlewToRaDec($RAnow,$DECnow,"Object") GUICtrlSetData($Status,"Completed Slew") GUISetState(@SW_SHOW) Return 1 EndFunc Func GuideRelay() If $Cam.GuiderMove($Direction,$Dur) == False Then GUICtrlSetData($Status,"Guider Relay Error. Moving to Safe Mode") $SafeMessage = "Guider Relay Error" Return 1 EndIf While($Cam.GuiderMoving == True) Wend Sleep(500) Return 0 EndFunc Func Take_Guide_Image() Local $I,$hTimer,$NAD If $Cam.GuiderExpose($Gexpose) == False Then GUICtrlSetData($Status,"Guider Camera Error. Putting system in Safe Mode") $SafeMessage = "Guider Camera Error" Sleep(3000) Return 1 EndIf $hTimer = TimerInit() While($Cam.GuiderRunning) If TimerDiff($hTimer) > 30000 Then GUICtrlSetData($Status,"Guider Camera timeout. Putting system in Safe Mode") $SafeMessage = "Guider Camera timeout" Sleep(3000) Return 1 EndIf Wend Sleep(1500) If($AllDocs.Count > 0) Then For $I = 1 To $AllDocs.Count If($AllDocs.Item($I).Displayname = "Autoguider Image") Then $AllDocs.Item($I).SaveFile("C:\Users\observer\guide.fit",3,0,1,0) EndIf Next Else GUICtrlSetData($Status,"Guider Camera Error. No output images. Putting System in Safe Mode") $SafeMessage = "Guider save image error 2" Sleep(3000) Return 1 EndIf Return 0 EndFunc Func Move2Slit() Local $Nt,$Image,$iPID,$sOutput,$Array,$X,$Y,$JX,$JY,$distx,$disty,$GuideErr,$GuideRelayErr,$tempY,$iPIDs,$sOutput2 Local $Gexpose_orig,$GAMerr Local $flag_find_slit = 0 Local $SlitY_findslit Local $FSEerr Local $flagfind = -1 $Nt = 0 $Gexpose_orig = $Gexpose $flagSlit = 0 $Image = "guide.fit" $GuideErr = Take_Guide_Image() If $GuideErr == 1 Then Sleep(2000) $GuideErr = Take_Guide_Image() EndIf If $GuideErr == 1 Then Return 1 EndIf $distx = 10.0 $disty = 10.0 While(($disty > 3.0 Or $distx > 5.0) And $Nt < 15) $SlitX = GUICtrlRead($Input2) $SlitY = Number(GUICtrlRead($Input3)) $flagSlit = 0 GUICtrlSetData($Status,"Analyzing Guider Image") $iPID = Run("starfind3 " & $Image,"c:\users\observer",@SW_HIDE,$STDOUT_CHILD) ProcessWaitClose($iPID) $sOutput = StdOutRead($iPID) If @error Then GUICtrlSetData($Status,"Camera error. Check Guide Camera is selected in Guide Tab") $SafeMessage = "Camera selection error?" Sleep(10000) Return 1 EndIf $Array = StringSplit($sOutput,",") $X = $Array[1] $Y = $Array[2] $flagSlit = $Array[3] GUICtrlSetData($Status,"Analysis complete") If($flagSlit == 0 And $Gexpose > 20) Then GUICtrlSetData($Status,"No star found in Guider Image") $SafeMessage = "No star in Guider" Sleep(5000) Return 1 EndIf If $flagSlit == 0 Then GUICtrlSetData($Status,"No star found in Guider image; retrying GAM") $GAMerr = MoveGAM2to4() GUICtrlSetData($Status,"No star found in Guider Image; increasing exposure") $Gexpose = $Gexpose + 10 $Gexpose_orig = $Gexpose $GuideErr = Take_Guide_Image() ContinueLoop EndIf If($flagSlit == 2) Then $SlitY = $Array[4] ;Guard against a close double being interpreted as the slit If(Abs($SlitY - $SlitYorig) > 5) Then $SlitY = $SlitYorig If $flag_find_slit == 0 Then $FSEerr = FindSlit() $Gexpose = $Gexpose_orig ; reset exposure time to that set above $SlitY_findslit = $SlitY $flag_find_slit = 1 Else $FSEerr = 0 $SlitY = $SlitY_findslit EndIf If $FSEerr == 1 Then $SafeMessage = "Cannot Find Slit" Return 1 EndIf EndIf GUICtrlSetData($Input3,StringFormat("%.1f",$SlitY)) $disty = Abs($Y-$SlitY) $distx = Abs($X-$SlitX) If $disty <= 3.0 And $distx <= 5.0 Then ExitLoop EndIf EndIf $disty = Abs($Y-$SlitY) $distx = Abs($X-$SlitX) $JX = ($X-$SlitX)*0.17 $JY = ($Y-$SlitY)*0.17 GUICtrlSetData($Status,"Attempting to Center Star on Slit N = " & $Nt & " flagslit= " & $flagSlit & " dx= " & StringFormat("%.1f",$distx) & " dy= " & StringFormat("%.1f",$disty) & " A") If $distx > 1.0 Then ;avoid small jogs If($JX < 0.0) Then $Direction = 1 $Dur = Abs($JX)/2.0 If $Dur > 3.0 Then $Dur = 3.0 ;prevent big excursions EndIf $GuideRelayErr = GuideRelay() If $GuideRelayErr == 1 Then Return 1 EndIf EndIf If($JX > 0.0) Then $Direction = 0 $Dur = Abs($JX)/2.0 If $Dur > 3.0 Then $Dur = 3.0 EndIf $GuideRelayErr = GuideRelay() If $GuideRelayErr == 1 Then Return 1 EndIf EndIf EndIf If $disty > 1.0 Then ;avoid small jogs If($JY < 0.0) Then $Direction = 3 $Dur = Abs($JY)/2.0 If $Dur > 3.0 Then $Dur = 3.0 EndIf $GuideRelayErr = GuideRelay() If $GuideRelayErr == 1 Then Return 1 EndIf EndIf If($JY > 0.0) Then $Direction = 2 $Dur = Abs($JY)/2.0 If $Dur > 3.0 Then $Dur = 3.0 EndIf $GuideRelayErr = GuideRelay() If $GuideRelayErr == 1 Then Return 1 EndIf EndIf EndIf GUICtrlSetData($Status,"Attempting to Center Star on Slit N = " & $Nt & " flagslit= " & $flagSlit & " dx= " & StringFormat("%.1f",$distx) & " dy= " & StringFormat("%.1f",$disty) & " B") If $Nt == 0 Then GUICtrlSetData($Status,"Determining seeing") $iPIDs = Run("getseeing " & $Image,"c:\users\observer",@SW_HIDE,$STDOUT_CHILD) ProcessWaitClose($iPIDs) $sOutput2 = StdOutRead($iPIDs) $Seeing = Number($sOutput2) If $Seeing > 6.0 Then $Seeing = 4.0 EndIf If $Seeing == 0.00 Then GUICtrlSetData($Status,"Seeing Determination failed, setting to 4.0 seconds") $Seeing = 4.0 EndIf GUICtrlSetData($Label27,StringFormat("%.1f",$Seeing)) FileWriteLine($hLog,"Seeing = " & StringFormat("%.1f",$Seeing)) Sleep(1000) EndIf $GuideErr = Take_Guide_Image() GUICtrlSetData($Status,"Guider Image obtained") If $GuideErr == 1 Then Return 1 EndIf $Nt = $Nt + 1 Wend If $Nt >= 15 Then GUICtrlSetData($Status,"Slit Centering timeout error") $SafeMessage = "Slit Centering timeout error" Sleep(3000) Return 1 EndIf ;this checks that the algorithm actually found the slit. If it did not, the slit Y-coord was incorrect If $flagslit <> 2 Then GUICtrlSetData($Status,"RS did not locate the slit. Determining Slit position") If $flag_find_slit == 0 Then $FSEerr = FindSlit() $SlitY_findslit = $SlitY $Gexpose = $Gexpose_orig ;reset exposure time to the exposure time determined above $flag_find_slit = 1 Else $FSEerr = 0 $SlitY = $SlitY_findslit EndIf If $FSEerr == 1 Then Return -1 Else $SafeMessage = "M2S could not locate the slit. SlitY = " & $SlitY Sleep(3000) Return 1 EndIf EndIf GUICtrlSetData($Status,"Slit Centering Attempt Completed") GUISetState(@SW_SHOW) Return 0 EndFunc Func FindSlit() Local $GuideErr,$Image,$iPID5,$iPID6,$iPID7,$sOutput $Image = "guide.fit" $Gexpose = 5 $iPID5 = RunWait('"C:\Users\Observer\UU.W32.exe" 192.168.2.78:80 spectro1:XxXxxx 3on',"",@SW_HIDE) ;Lamp on $GuideErr = Take_Guide_Image() $iPID6 = Run("getslit " & $Image,"c:\users\observer",@SW_HIDE,$STDOUT_CHILD) ProcessWaitClose($iPID6) $sOutput = StdOutRead($iPID6) $SlitY = Number($sOutput) $iPID7 = RunWait('"C:\Users\Observer\UU.W32.exe" 192.168.2.78:80 spectro1:XxXxxx 3off',"",@SW_HIDE) ;Lamp off If $SlitY == 0 Then $SlitY = $SlitYorig Return 1 EndIf Return 0 EndFunc Func Begin_Guiding() $SlitX = GUICtrlRead($Input2) $SlitY = Number(GUICtrlRead($Input3)) $Cam.GuiderSetStarPosition($SlitX,$SlitY) $Cam.GuiderTrack($Gexpose) EndFunc Func Stop_Guiding() $Cam.GuiderStop() EndFunc Func Observe() Local $M2Serr,$Cerr,$GAMerr #Check to see if guiding is active If($Cam.GuiderRunning = True) Then $Cam.GuiderStop() EndIf If $GAMpos <> 2 Then $GAMerr = MoveGAM4to2() If $GAMerr == -1 Then $GAMpos = 0 $SafeMessage = "GAM Error" Return 1 EndIf EndIf $Cerr = Comparison() If $Cerr == -1 Then $SafeMessage = "Comparison Error" Return 1 EndIf $GAMerr = MoveGAM2to4() If $GAMerr == -1 Then $GAMpos = 0 $SafeMessage = "GAM Error" Return 1 EndIf GUICtrlSetData($Status,"Taking Guide Camera Image") $M2Serr = Move2Slit() If $M2Serr == 1 Then Return 1 EndIf If $M2Serr == -1 Then ;this comes about when the slit is lost, and RS goes into slit find mode. $M2Serr = Move2Slit() If $M2Serr == 1 Then Return 1 EndIf EndIf Begin_Guiding() $isChkCnt = GUICtrlRead($ChkCnt) If $isChkCnt == 1 Then Acquire_Spectra2() Else Acquire_Spectra() EndIf Stop_Guiding() $GAMerr = MoveGAM4to2() If $GAMerr == -1 Then $GAMpos = 0 $SafeMessage = "GAM Error" Return 1 EndIf $Cerr = Comparison() If $Cerr == -1 Then Return 1 EndIf Return 0 EndFunc Func Acquire_Spectra() Local $Spectrum,$prefix,$I,$Note,$Type,$New,$String,$count1,$counts,$cSN,$sOutput,$iPID7,$snum $Type = "Light" $sgNum = FourDigAdj(GUICtrlRead($Input6)) $prefix = GUICtrlRead($Input5) $counts = 0 $cSN = 0 GUICtrlSetData($LabelSN,StringFormat("%.0f",$counts)) For $I=1 To $Nexp $Abortflag = AbortRead() If $Abortflag == 1 Then ExitLoop EndIf $Weatherflag = WeatherRead() If $Weatherflag >= 1 Then $Interrupt = 1 ; flag that indicates observations were interrupted by clouds. ExitLoop EndIf $Spectrum = $Path & "\" & "sg" & $prefix & "-" & $sgNum & ".fit" $String = _NowTime(5) & " " & $Spectrum FileWriteLine($hLog,$String) $Note = "Acquiring spectrum number " & $I GUICtrlSetData($Status,$Note) GUISetState(@SW_SHOW) Expose($Spectrum,$Star,300.0,$Type) $snum = "sg" & $prefix & "-" & $sgNUM & ".fit" ;Calculate counts and cumulative S/N $iPID7 = Run("SNspectra " & $snum,$Path,@SW_HIDE,$STDOUT_CHILD) ProcessWaitClose($iPID7) $count1 = StdOutRead($iPID7) $counts = $counts + $count1 GUICtrlSetData($LabelSN,StringFormat("%.0f",$counts)) $sgNum = FourDigAdj($sgNum + 1) GUICtrlSetData($Input6,$sgNum) GUISetState(@SW_SHOW) Next FileWriteLine($hLog,"Total counts = " & $counts) GUICtrlSetData($Status,"Completed observing for this object") GUISetState(@SW_SHOW) EndFunc Func Acquire_Spectra2() ;Expose to target count Local $Spectrum,$prefix,$I,$Note,$Type,$New,$String,$count1,$counts,$cSN,$sOutput,$iPID8,$Tcounts,$maxExp,$minExp Local $IDawn,$snum $Type = "Light" $sgNum = FourDigAdj(GUICtrlRead($Input6)) $prefix = GUICtrlRead($Input5) $Tcounts = GUICtrlRead($InputTarget) $minExp = GUICtrlRead($InputMin) $maxExp = GUICtrlRead($InputMax) $counts = $CurrentCounts[$K] = 0 $cSN = 0 GUICtrlSetData($LabelSN,StringFormat("%.0f",$counts)) $I = 1 $IDawn = 0 While 1 If $I > $maxExp Or ($counts >= $Tcounts And $I > $minExp) Then ExitLoop EndIf $Abortflag = AbortRead() If $Abortflag == 1 Then ExitLoop EndIf $Weatherflag = WeatherRead() If $Weatherflag >= 1 Then $Interrupt = 1 ; flag that indicates observations were interrupted by clouds. ExitLoop EndIf ; Check to see if dawn has arrived. If it has, don't take more than 2 exposures into twilight. $Dark = IsItDark3() If $Dark == 2 Then $IDawn = $IDawn + 1 EndIf If $IDawn > 2 Then ExitLoop EndIf $Spectrum = $Path & "\" & "sg" & $prefix & "-" & $sgNum & ".fit" $String = _NowTime(5) & " " & $Spectrum FileWriteLine($hLog,$String) $Note = "Acquiring spectrum number " & $I GUICtrlSetData($Status,$Note) GUISetState(@SW_SHOW) Expose($Spectrum,$Star,300.0,$Type) ;Calculate counts and cumulative S/N $snum = "sg" & $prefix & "-" & $sgNUM & ".fit" $iPID8 = Run("SNspectra " & $snum,$Path,@SW_HIDE,$STDOUT_CHILD) ProcessWaitClose($iPID8) $count1 = StdOutRead($iPID8) $counts = $counts + $count1 $CurrentCounts[$K] = $counts GUICtrlSetData($LabelSN,StringFormat("%.0f",$counts)) $sgNum = FourDigAdj($sgNum + 1) $I = $I + 1 GUICtrlSetData($Input6,$sgNum) GUISetState(@SW_SHOW) WEnd FileWriteLine($hLog,"Total counts = " & $counts) Update_Target() GUICtrlSetData($Status,"Completed observing for this object") GUISetState(@SW_SHOW) EndFunc Func MoveGAM4to2() Local $GAMstat,$Ntry $GAMstat = QueryGAM() If $GAMstat == 2 Then $GAMpos = 2 GUICtrlSetData($Status,"GAM at position 2") Return 0 EndIf MoveGam("2") GUICtrlSetData($Status,"Moving GAM to position 2") Sleep(20000) $GAMstat = QueryGAM() If $GAMstat == -1 Then GUICtrlSetData($Status,"GAM error") $SafeMessage = "GAM move error" $GAMpos = 0 Return -1 EndIf $Ntry = 0 While $GAMstat <> 2 MoveGAM("2") GUICtrlSetData($Status,"Retrying GAM") GUISetState(@SW_SHOW) Sleep(15000) $GAMstat = QueryGAM() $Ntry = $Ntry + 1 If $Ntry == 4 Or $GAMstat == -1 Then GUICtrlSetData($Status,"GAM error") $SafeMessage = "GAM timeout" $GAMpos = 0 Return -1 EndIf Wend $isChkGAM = GUICtrlRead($ChkGAM) If $isChkGAM == 1 Then GUICtrlSetData($Status,"Jogging the GAM") MoveGam("2") Sleep(10000) EndIf $GAMpos = 2 Return 0 EndFunc Func MoveGAM2to4() Local $GAMstat,$Ntry $GAMstat = QueryGAM() If $GAMstat == 4 Then $GAMpos = 4 GUICtrlSetData($Status,"GAM at position 4") Return 0 EndIf MoveGAM("4") GUICtrlSetData($Status,"Moving GAM to position 4") GUISetState(@SW_SHOW) Sleep(20000) $GAMstat = QueryGAM() If $GAMstat == -1 Then GUICtrlSetData($Status,"GAM error") $SafeMessage = "GAM move error" $GAMpos = 0 Return -1 EndIf $Ntry = 0 While $GAMstat <> 4 MoveGAM("4") GUICtrlSetData($Status,"Retrying GAM") GUISetState(@SW_SHOW) Sleep(15000) $GAMstat = QueryGAM() $Ntry = $Ntry + 1 If $Ntry == 4 Or $GAMstat == -1 Then GUICtrlSetData($Status,"GAM error") $SafeMessage = "GAM timeout" $GAMpos = 0 Return -1 EndIf Wend $GAMpos = 4 Return 0 EndFunc Func Comparison() Local $Comp,$GAMstat,$Ntry,$Type $Type = "Arc" $acNum = FourDigAdj(GUICtrlRead($Input4)) $Comp = $Path & "\" & "ac" & $acNum & ".fit" FileWriteLine($hLog,$Comp) GUICtrlSetData($Status,"Taking Comparison") GUISetState(@SW_SHOW) LampOn() Sleep(2000) Expose($Comp,$Star,5.0,$Type) Sleep(2000) LampOff() GUICtrlSetData($Status,"Saving Comparison") GUISetState(@SW_SHOW) Sleep(1000) $acNum = $acNum + 1 GUICtrlSetData($Input4,$acNum) GUISetState(@SW_SHOW) GUICtrlSetData($Status,"Comparison Completed") GUISetState(@SW_SHOW) Return 0 EndFunc Func MoveGAM($GAMpos) Local $Socket Local $String = "" TCPStartup() $Socket = TCPConnect("192.168.2.26", 5003) $String = "#31,1," & $GAMpos & ";" TCPSendMessage($Socket, $String) TCPCloseSocket($Socket) TCPShutdown() EndFunc Func Expose($Imagename,$Object,$Exposure,$Type) Local $Z $Cam.Expose($Exposure, 1) Do Until $Cam.ImageReady $Tele.GetRaDec() $Tele.GetAzAlt() $Z = $pi*(90.0 - $Tele.dAlt)/180.0 $Airmass = 1.0/cos($Z) $Cam.SetFITSKey("OBJECT",$Object) $Cam.SetFITSKey("IMAGETYP",$Type) $Cam.SetFITSKey("RA",$Tele.dRa) $Cam.SetFITSKey("DEC",$Tele.dDec) $Cam.SetFITSKey("AIRMASS",$Airmass) $Cam.SetFITSKey("PROJECT",$Owner[$K]) $Cam.SaveImage($Imagename) EndFunc Func GetDark($Exposure,$Type) Local $Imagename ;use 0 seconds for bias If $Exposure <> 0 Then $NDark = ThreeDigAdj(GUICtrlRead($Input15)) $Imagename = $Path & "\" & "dk-" & $NDark & ".fit" Else $NBias = ThreeDigAdj(GUICtrlRead($Input17)) $Imagename = $Path & "\" & "bi-" & $NBias & ".fit" EndIf $Cam.Expose($Exposure,0) Do Until $Cam.ImageReady $Cam.SetFITSKey("IMAGETYP",$Type) $Cam.SaveImage($Imagename) EndFunc Func GetFlats() Local $Imagename,$Flatexp=10,$F,$NFexp = 20,$iPID5,$iPID6 ;Return comment out when we can start getting flats again! GUICtrlSetData($Status,"Preparing for flats: moving GAM to position 4") MoveGAM2to4() Sleep(2000) GUICtrlSetData($Status,"Turning Flat Lamp on") $iPID5 = RunWait('"C:\Users\Observer\UU.W32.exe" 192.168.2.78:80 spectro1:XxXxxx 3on',"",@SW_HIDE) ;Lamp on Sleep(2000) GUICtrlSetData($Status,"Taking Flats") For $F = 1 to $NFexp $Imagename = $Path & "\" & "fl-" & $F & ".fit" GUICtrlSetData($Status,"Taking Flat " & $F) $Cam.Expose($Flatexp,1) Do Until $Cam.ImageReady $Cam.SetFITSKey("IMAGETYP","Flat") $Cam.SaveImage($Imagename) Next Sleep(1000) GUICtrlSetData($Status,"Turning Flat Lamp off") Sleep(2000) $iPID6 = RunWait('"C:\Users\Observer\UU.W32.exe" 192.168.2.78:80 spectro1:XxXxxx 3off',"",@SW_HIDE) ;Lamp off GUICtrlSetData($Status,"Taking Flat darks") Sleep(1000) For $F = 1 to $NFexp $Imagename = $Path & "\" & "df-" & $F & ".fit" GUICtrlSetData($Status,"Taking Flat Dark " & $F) $Cam.Expose($Flatexp,0) Do Until $Cam.ImageReady $Cam.SetFITSKey("IMAGETYP","Dark") $Cam.SaveImage($Imagename) Next GUICtrlSetData($Status,"Completed Flats") Sleep(1000) EndFunc Func LampOn() Local $iPID $iPID = RunWait('"C:\Users\Observer\UU.W32.exe" 192.168.2.22:80 spectro1:XxXxxx1 1on',"",@SW_HIDE) ;Lamp on EndFunc Func LampOff() Local $iPID $iPID = RunWait('"C:\Users\Observer\UU.W32.exe" 192.168.2.22:80 spectro1:XxXxxx1 1off',"",@SW_HIDE) ;Lamp off EndFunc Func QueryGAM() Local $Data = "" Local $Data2 = "" Local $MaxLength = 512 Local $Num = 0 Local $Array2 Local $A2 = 0 Local $Socket, $String, $Ngamtry = 0 TCPStartup() $Socket = TCPConnect("192.168.2.26", 5003) $String = "#33;" TCPSendMessage($Socket, $String) $Ngamtry = 0 While 1 $Data = TCPRecv($Socket,$MaxLength) If $Data <> "" Then ExitLoop EndIf $Ngamtry = $Ngamtry + 1 If $Ngamtry > 60 Then FileWriteLine($hLog,"GAM communications error 1") ExitLoop EndIf Sleep(500) Wend #MsgBox(0, "GAM Status", $Data) If $Ngamtry > 60 Then TCPCloseSocket($Socket) TCPShutdown() GUICtrlSetData($Status,"GAM timeout error") Return -1 EndIf $Data2 = StringReplace($Data,"-9999","0") $Array2 = StringSplit($Data2,"") ;check the number of items received from the GAM. If it isn't 8, then the GAM is malfunctioning ;shutdown the TCP connection gracefully and go into safemode. $A2 = $Array2[0] If $A2 < 8 Then TCPCloseSocket($Socket) TCPShutdown() GUICtrlSetData($Status,"GAM Communications Error 2 A2 = " & $A2) FileWriteLine($hLog,"GAM communications error 2 A2 = " & $A2) Return -1 EndIf $Num = $Array2[3] #MsgBox(0, "GAM Num", $Num) TCPCloseSocket($Socket) TCPShutdown() Return $Num EndFunc Func EastPort() Local $sData = "" Local $iConnectedSocket = -1 Local $Cmd = "" Local $Socket,$Data,$Exposure="" Local $MaxLength = 512 Local $sData = "" Local $Xstar,$Ystar Local $distx,$disty,$DX,$DY Local $Array, $Flux, $GAMstat, $Ntry, $Etry Local $Xcen = GUICtrlRead($EPortX) Local $Ycen = GUICtrlRead($EPortY) ; should be 633.0 GUICtrlSetData($Status,"Taking Eastport Image") TCPStartup() $Socket = TCPConnect("192.168.2.25",1000) $Exposure = "1,10" ;increase exposure to 20s if no star initially found in Eastport image If $Q > 0 Then $Exposure = "1,20" EndIf Sleep(500) TCPSendMessage($Socket,$Exposure) $Etry = 0 While 1 Sleep(100) $Data = TCPRecv($Socket,$MaxLength) If $Data <> "" Then ExitLoop EndIf $Etry = $Etry + 1 If $Etry > 400 Then ;gives Eastport camera 40 seconds to respond GUICtrlSetData($Status,"Communication Error with Eastport Camera") $SafeMessage = "GAM COM error" TCPCloseSocket($Socket) TCPShutdown() Return 1 EndIf Wend GUICtrlSetData($Status,"Jogging Telescope") $Array = StringSplit($Data,",") $Xstar = Number($Array[1]) $Ystar = Number($Array[2]) $Flux = Number($Array[3]) If $Flux > 9.50 Then GUICtrlSetData($Status,"No bright star found in East port camera") TCPSendMessage($Socket,"Listen") TCPCloseSocket($Socket) TCPShutdown() Return 1 EndIf $DX = $Xstar-$Xcen $DY = $Ystar-$Ycen $distx = Abs($DX)*0.00303 $disty = Abs($DY)*0.00303 If $DX <= 0 Then $Tele.Jog($distx,"East") EndIf If $DX > 0 Then $Tele.Jog($distx,"West") EndIf Sleep(10000) If $DY <= 0 Then $Tele.Jog($disty,"South") EndIf If $DY > 0 Then $Tele.Jog($disty,"North") EndIf TCPSendMessage($Socket,"Listen") ;tells server program to reopen its listening port TCPCloseSocket($Socket) TCPShutdown() Sleep(1000) Return 0 EndFunc Func EastPort2() Local $sData = "" Local $iConnectedSocket = -1 Local $Cmd = "" Local $Socket,$Data,$Exposure="" Local $MaxLength = 512 Local $sData = "" Local $Xstar,$Ystar Local $distx,$disty,$DX,$DY Local $Array, $Flux, $GAMstat, $Ntry, $Etry Local $Xcen = GUICtrlRead($EPortX) Local $Ycen = GUICtrlRead($EPortY) ; should be 633.0 If $Solve[$K] == "n" Then GUICtrlSetData($Status,"Taking Eastport Image") TCPStartup() $Socket = TCPConnect("192.168.2.25",1000) $Exposure = "1,10" ; increase exposure to 20s if no star initially found in Eastport image If $Q > 0 Then $Exposure = "1,20" EndIf Sleep(500) TCPSendMessage($Socket,$Exposure) $Etry = 0 While 1 Sleep(100) $Data = TCPRecv($Socket,$MaxLength) If $Data <> "" Then ExitLoop EndIf $Etry = $Etry + 1 If $Etry > 400 Then ;gives Eastport camera 40 seconds to respond GUICtrlSetData($Status,"Communication Error with Eastport Camera") $SafeMessage = "GAM COM error" TCPSendMessage($Socket,"Listen") TCPCloseSocket($Socket) TCPShutdown() Return 1 EndIf Wend Else GUICtrlSetData($Status,"Eastport Image Cross Correlation") TCPStartup() $Socket = TCPConnect("192.168.2.25",1000) $Exposure = "4,25," & StringFormat("%.6f",$RA2000) & "," & StringFormat("%.6f",$DEC2000) If $Q2 > 0 Then $Exposure = "4,50," & StringFormat("%.6f",$RA2000) & "," & StringFormat("%.6f",$DEC2000) EndIf Sleep(200) GUICtrlSetData($Status,"Sending " & $Exposure & " to Eastport Camera") FileWriteLine($hLog,$Exposure) TCPSendMessage($Socket,$Exposure) $Etry = 0 While 1 Sleep(100) $Data = TCPRecv($Socket,$MaxLength) If $Data <> "" Then ExitLoop EndIf $Etry = $Etry + 1 If $Etry > 3500 Then GUICtrlSetData($Status,"Image Correlation Timeout Error") $SafeMessage = "Image Correlation Error" TCPSendMessage($Socket,"Listen") TCPCloseSocket($Socket) TCPShutdown() Return 2 EndIf WEnd EndIf GUICtrlSetData($Status,"Pixel position of target: " & $Data) FileWriteLine($hLog,$Data) Sleep(2000) $Array = StringSplit($Data,",") $Xstar = Number($Array[1]) $Ystar = Number($Array[2]) FileWriteLine($hLog,"Eastport results " & $Xstar & " " & $Ystar) If $Xstar == 0.0 And $Ystar == 0.0 Then GUICtrlSetData($Status,"Image Correlation Failed!") TCPSendMessage($Socket,"Listen") TCPCloseSocket($Socket) TCPShutdown() Return 3 EndIf If $Solve[$K] == "n" Then $Flux = Number($Array[3]) If $Flux > 9.50 Then GUICtrlSetData($Status,"No bright star found in East port camera") TCPSendMessage($Socket,"Listen") TCPCloseSocket($Socket) TCPShutdown() Return 1 EndIf EndIf GUICtrlSetData($Status,"Jogging Telescope") $DX = $Xstar-$Xcen $DY = $Ystar-$Ycen $distx = Abs($DX)*0.00303 $disty = Abs($DY)*0.00303 If $DX <= 0 Then $Tele.Jog($distx,"East") EndIf If $DX > 0 Then $Tele.Jog($distx,"West") EndIf Sleep(10000) If $DY <= 0 Then $Tele.Jog($disty,"South") EndIf If $DY > 0 Then $Tele.Jog($disty,"North") EndIf TCPSendMessage($Socket,"Listen") ;tells server program to reopen its listening port TCPCloseSocket($Socket) TCPShutdown() Sleep(1000) Return 0 EndFunc Func Tracking($cmd) Local $iPID9 If $cmd == "on" Then Scope_Motors("on") Sleep(1000) $iPID9 = Run('"C:\Users\Observer\UU.W32.exe" 192.168.2.21:80 motors:XxXxxx1 7on',"",@SW_HIDE) Sleep(1000) Else $iPID9 = Run('"C:\Users\Observer\UU.W32.exe" 192.168.2.21:80 motors:XxXxxx1 7off',"",@SW_HIDE) Sleep(1000) ;Scope_Motors("off") Sleep(1000) EndIf EndFunc Func Scope_Motors($cmd) Local $iPID9 If $cmd == "on" Then $iPID9 = Run('"C:\Users\Observer\UU.W32.exe" 192.168.2.21:80 motors:XxXxxx1 8on',"",@SW_HIDE) Sleep(1000) GUICtrlSetData($Label31,"on") Else $iPID9 = Run('"C:\Users\Observer\UU.W32.exe" 192.168.2.21:80 motors:XxXxxx1 8off',"",@SW_HIDE) Sleep(1000) GUICtrlSetData($Label31,"off") EndIf EndFunc Func Lights($cmd) Local $SendStr,$Socket TCPStartup() $Socket = TCPConnect("192.168.2.25",1000) Sleep(500) If $cmd == "on" Then $SendStr = "2,2" TCPSendMessage($Socket,$SendStr) Else $SendStr = "2,3" TCPSendMessage($Socket,$SendStr) EndIf Sleep(3000) TCPSendMessage($Socket,"Listen") Sleep(500) TCPCloseSocket($Socket) TCPShutdown() EndFunc Func AbortRead() Local $Query $Abortflag = 0 $isChkAbort = 0 $isChkAbort = GUICtrlRead($ChkAbort) If $isChkAbort == 1 Then $Query = MsgBox(1,"","Are you certain you want to abort?") If $Query == 2 Then $Abortflag = 0 GUICtrlSetState($ChkAbort,$GUI_UNCHECKED) Else $Abortflag = 1 EndIf EndIf Return $Abortflag EndFunc Func FourDigAdj($nmbr) ;force number to have exactly 4 digits ;$NumOK = 0 If StringIsDigit($nmbr) Then If ((0 <= $nmbr) And ($nmbr <= 9999)) Then $nmbr = Int($nmbr) ;convert to integer If $nmbr < 10 Then ;constrain to exactly 4 digits by prepending zeros $nmbr = "000" & string($nmbr) ElseIf ((10 <= $nmbr) And ($nmbr < 100)) Then $nmbr = "00" & string($nmbr) ElseIf ((100 <= $nmbr) And ($nmbr < 1000)) Then $nmbr = "0" & string($nmbr) EndIf ;$NumOK = 1 Return($nmbr) Else ;number out of range MsgBox(0,"Image Number Error","Image number" & @CRLF & $nmbr & @CRLF & "is out of range!" & @CRLF & @CRLF & "Enter an integer" & @CRLF & "between 0 and 9999.") ;$NumOK = 0 EndIf Else ;"number" not actually a number MsgBox(0,"Image Number Error","Image number" & @CRLF & $nmbr & @CRLF & "is not an integer!" & @CRLF & @CRLF & "Enter an integer" & @CRLF & "between 0 and 9999.") ;$NumOK = 0 EndIf EndFunc Func ThreeDigAdj($nmbr) ;force number to have exactly 3 digits ;$NumOK = 0 If StringIsDigit($nmbr) Then If ((0 <= $nmbr) And ($nmbr <= 999)) Then $nmbr = Int($nmbr) ;convert to integer If $nmbr < 10 Then ;constrain to exactly 3 digits by prepending zeros $nmbr = "00" & string($nmbr) ElseIf ((10 <= $nmbr) And ($nmbr < 100)) Then $nmbr = "0" & string($nmbr) EndIf ;$NumOK = 1 Return($nmbr) Else ;number out of range MsgBox(0,"Image Number Error","Image number" & @CRLF & $nmbr & @CRLF & "is out of range!" & @CRLF & @CRLF & "Enter an integer" & @CRLF & "between 0 and 9999.") ;$NumOK = 0 EndIf Else ;"number" not actually a number MsgBox(0,"Image Number Error","Image number" & @CRLF & $nmbr & @CRLF & "is not an integer!" & @CRLF & @CRLF & "Enter an integer" & @CRLF & "between 0 and 9999.") ;$NumOK = 0 EndIf EndFunc Func ReadTargets() Local $Objinfo,$Array $hList = FileOpen($Obslist,$FO_READ) While $hList == -1 MsgBox(0,"","Cannot Find Observing List. Re-enter Observing list, then click OK") $Obslist = GUICtrlRead($List) $hList = FileOpen($Obslist,$FO_READ) WEnd $N = 1 While 1 $Objinfo = FileReadLine($hList) If @error == -1 Then $N = $N-1 FileClose($hList) Return EndIf $Array = StringSplit($Objinfo,",") $Target[$N] = $Array[1] $RA[$N] = $Array[2] $Dec[$N] = $Array[3] $B[$N] = $Array[4] $Previouscounts[$N] = Number($Array[5]) $Targetcounts[$N] = Number($Array[6]) $Priority[$N] = $Array[7] $Solve[$N] = $Array[8] $Mode[$N] = $Array[9] $Owner[$N] = $Array[10] $Ne[$N] = 6 $Obsflag[$N] = 0 $CanObs[$N] = 0 $Score[$N] = 0 $CurrentCounts[$N] = 0 $N = $N+1 Wend EndFunc Func Update_Target() If $Mode[$K] == 'm' Then Return EndIf $Previouscounts[$K] = $Previouscounts[$K] + $CurrentCounts[$K] If $Previouscounts[$K] >= $Targetcounts[$K] Then $Priority[$K] = 0 EndIf ;write out to observing list _FileWritetoLine($Obslist,$K,$Target[$K] & "," & $RA[$K] & "," & $Dec[$K] & "," & $B[$K] & "," & StringFormat("%.0f",$Previouscounts[$K]) & "," & $Targetcounts[$K] & "," & $Priority[$K] & "," & $Solve[$K] & "," & $Mode[$K] & "," & $Owner[$K],1) Return EndFunc Func DetermineObservable() Local $iPID,$Current,$Array,$Hour,$Minute,$CurrentTime,$SidTime,$SidT,$SidT2 Local $HA,$I $iPID = Run("newtwilight " & "-1","c:\users\observer",@SW_HIDE,$STDOUT_CHILD) ProcessWaitClose($iPID) $BeginSolar = StdOutRead($iPID) GUICtrlSetData($Label18,StringFormat("%.2f",$BeginSolar)) $BeginEST = $BeginSolar + $zone If $BeginEST < 0 Then $BeginEST = $BeginEST + 24.0 EndIf If $BeginEST >= 24.0 Then $BeginEST = $BeginEST - 24.0 EndIf $iPID = Run("newtwilight " & "1","c:\users\observer",@SW_HIDE,$STDOUT_CHILD) ProcessWaitClose($iPID) $EndSolar = StdOutRead($iPID) GUICtrlSetData($Label20,StringFormat("%.2f",$EndSolar)) $EndEST = $EndSolar + $zone If $EndEST < 0 Then $EndEST = $EndEST + 24.0 EndIf If $EndEST >= 24.0 Then $EndEST = $EndEST - 24.0 EndIf ;MsgBox(0,"EndEST",$EndEST) $Current = _NowTime(4) $Array = StringSplit($Current,":") $Hour = $Array[1] $Minute = $Array[2] $CurrentTime = $Hour+$Minute/60.0 ;MsgBox(0,"CT",$CurrentTime) $iPID = Run("siderealtime " & "","c:\users\observer",@SW_HIDE,$STDOUT_CHILD) ProcessWaitClose($iPID) $SidTime = StdOutRead($iPID) $Begin = $SidTime + $BeginSolar - $CurrentTime If $Begin < 0 Then $Begin = $Begin + 24.0 EndIf If $Begin >= 24.0 Then $Begin = $Begin - 24.0 EndIf ;MsgBox(0,"Begin",$Begin) $End = $SidTime + $EndSolar - $CurrentTime If $End < 0 Then $End = $End + 24.0 EndIf If $End >= 24.0 Then $End = $End - 24.0 EndIf ;MsgBox(0,"End",$End) $End2 = $End $SidT = $Begin If $End < $Begin Then $End = $End + 24 EndIf While $SidT < $End $SidT2 = $SidT If $SidT2 > 24.0 Then $SidT2 = $SidT2 - 24.0 EndIf For $I = 1 to $N-1 If $Priority[$I] = 0 Then ;if priority = 0 (don't observe), skip over $CanObs[$I] = 0 ContinueLoop EndIf $HA = $SidT2 - $RA[$I] If $HA < -12 Then $HA = $HA + 24.0 EndIf If Abs($HA) < 2.5 Then $CanObs[$I] = 1 EndIf Next $SidT = $SidT + 0.5 Wend EndFunc Func GetSidTime() Local $iPID,$SidT $iPID = Run("siderealtime " & "","c:\users\observer",@SW_HIDE,$STDOUT_CHILD) ProcessWaitClose($iPID) $SidT = StdOutRead($iPID) Return $SidT EndFunc Func IsItDark3() Local $iPID, $Current, $Array, $Hour, $Minute, $CurrentEST, $Dark ;$Dark = 0 means daytime, $Dark = 1 means dark, $Dark = 2 means after dawn in the morning $Dark = -1 $Current = _NowTime(4) $Array = StringSplit($Current,":") $Hour = $Array[1] $Minute = $Array[2] $CurrentEST = $Hour+$Minute/60.0 + $zone If $CurrentEST < 0 Then $CurrentEST = $CurrentEST + 24.0 EndIf If $CurrentEST >= 24.0 Then $CurrentEST = $CurrentEST - 24.0 EndIf If $CurrentEST <= $BeginEST And $CurrentEST >= $EndEST + 2.0 Then $Dark = 0 ElseIf $CurrentEST >= $EndEST And $CurrentEST <= $EndEST + 2.0 Then $Dark = 2 Else $Dark = 1 EndIf Return $Dark EndFunc Func FindNextObject() Local $iPID,$I,$SidT,$K,$SidT2,$HA,$Time2End,$Pos[1000],$PHA[1000],$J,$L,$neg,$moonRA,$moonDec Local $dRA_degrees,$dDec,$dDistance,$Pr,$S1,$S2,$S3,$S4,$maxscore $isChkMoon = GUICtrlRead($ChkMoon) ; find Moon's RA and Dec $TheSky.GetObjectRaDec("moon") $moonRA = $TheSky.dObjectRa $moonDec = $TheSky.dObjectDec $K = 0 $iPID = Run("siderealtime " & "","c:\users\observer",@SW_HIDE,$STDOUT_CHILD) ProcessWaitClose($iPID) $SidT = StdOutRead($iPID) $Time2End = $End2 - $SidT If $Time2End < -6 Then $Time2End = $Time2End + 24.0 EndIf If $Time2End < 0.25 Then ; End if less than 15 minutes are left, or if already past time $K = 0 Return $K EndIf $J = 1 For $I = 1 to $N $Score[$I] = 0.0 If $CanObs[$I] == 0 OR $Obsflag[$I] == 2 OR $Obsflag[$I] == 3 Then $Score[$I] = 0.0 ContinueLoop EndIf $HA = $SidT - $RA[$I] ;stars to west have positive HA If $HA > 12.0 Then $HA = $HA - 24.0 EndIf If $HA < -12 Then $HA = $HA + 24 EndIf ; determines moon distance and skips over object if the moon is too close $dRA_degrees = 15.0*($RA[$I] - $moonRA) $dDec = ($Dec[$I] - $moonDec) $dDistance = Sqrt($dRA_degrees*$dRA_degrees + $dDec*$dDec) If $dDistance < 7.0 And $isChkMoon == 1 Then $Score[$I] = 0.0 ContinueLoop EndIf If $HA < -2.5 OR $HA > 2.5 Then $S1 = 0.00 Else $S1 = 0.1*$HA + 0.75 ;favor stars west of meridian EndIf If $Seeing <= 3.5 And $B[$I] >= 9.0 Then $S2 = 0.2 ElseIf $Seeing <= 3.5 And $B[$I] < 9.0 Then $S2 = 0.1 EndIf If $Seeing > 3.5 And $B[$I] < 9.0 Then $S2 = 0.2 ElseIf $Seeing > 3.5 And $B[$I] >= 9.0 Then $S2 = 0.1 EndIf If $Seeing <= 3.5 And $Dec[$I] <= 0.0 Then $S3 = 0.2 ElseIf $Seeing <= 3.5 And $Dec[$I] > 0.0 Then $S3 = 0.1 EndIf If $Seeing > 3.5 And $Dec[$I] <= 0.0 Then $S3 = 0.1 ElseIf $Seeing > 3.5 And $Dec[$I] > 0.0 Then $S3 = 0.2 EndIf $S4 = 2.0 - $Priority[$I] $Score[$I] = 0.2*$S1 + $S2 + $S3 + 0.1*$S4 If ABS($HA) > 2.5 Then $Score[$I] = 0.00 EndIf If ABS($HA) <= 2.5 And $Priority[$I] == -1 Then $Score[$I] = 1.0 EndIf ;give top score to priority -1 stars Next $maxscore = 0.00 $K = 0 For $I = 1 to $N If $Obsflag[$I] == 1 Then ContinueLoop EndIf If $maxscore <= $Score[$I] Then $maxscore = $Score[$I] $K = $I EndIf Next If $maxscore == 0 Then $K = 0 EndIf ;make certain that a star with HA > 2.5 is not observed. ; if $K = 0, then check to see if a star can be reobserved If $K == 0 Then $maxscore = 0.00 For $I = 1 to $N If $maxscore <= $Score[$I] Then $maxscore = $Score[$I] $K = $I EndIf Next EndIf If $maxscore == 0 Then $K = 0 EndIf If $K <> 0 Then GUICtrlSetData($InputTarget,$Targetcounts[$K]) $Tcounts = $Targetcounts[$K] EndIf Return $K EndFunc ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;Function: TCP_sendcommand ;Purpose: sends dome or mirror doors command to TCS ;Inputs: $cmd - command type (dome/doors); $state - open/closed ;Outputs: (none) ;Uses: (none) ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Func TCP_sendcommand($cmd_string) Local $Socket Local $String If $AllowTCPCommands == True Then TCPStartup() $Socket = TCPConnect("192.168.2.26",5003) ;create connection $String = "#" & $cmd_string & ";" ;create command string ;MsgBox(0,"",$String) TCPSendMessage($Socket, $String) ;send command TCPCloseSocket($Socket) ;close connection TCPShutdown() EndIf EndFunc Func DomeControl($cmd) Local $TCP_ret If $cmd == "open" Then GUICtrlSetData($DomeStatus,"Opening") $TCP_ret = TCP_sendcommand("30,1") ;open dome Sleep(31000) GUICtrlSetData($DomeStatus,"Opening MD") $TCP_ret = TCP_sendcommand("41,1") ;open mirror doors Sleep(31000) GUICtrlSetData($DomeStatus,"Open") $Domeflag = 1 ;flag tells us dome is open ElseIf $cmd == "close" Then GUICtrlSetData($DomeStatus,"Closing") $TCP_ret = TCP_sendcommand("30,0") ;close dome Sleep(31000) GUICtrlSetData($DomeStatus,"Closing MD") $TCP_ret = TCP_sendcommand("41,0") ;close mirror doors Sleep(31000) GUICtrlSetData($DomeStatus,"Closed") $Domeflag = 0 ;flag tells us dome is closed EndIf Sleep(500) EndFunc Func ShutdownTele() Local $Socket,$String,$iPID5 Tracking("off") Scope_Motors("on") GUICtrlSetData($Status,"Tracking off, sending Telescope to Zenith") TCPStartup() $Socket = TCPConnect("192.168.2.26",5003) ;create connection $String = "#" & "10" & ";" ;set slew to coordinates to zenith TCPSendMessage($Socket, $String) ;send command Sleep(10000) $String = "#" & "12" & ";" ;execute slew TCPSendMessage($Socket, $String) ;send command Sleep(30000) $String = "#" & "21,1" & ";" ;send dome to home GUICtrlSetData($Status,"Sending Dome to Home") TCPSendMessage($Socket, $String) ;send command Sleep(30000) GUICtrlSetData($Status,"Turning Solenoid off") $iPID5 = RunWait('"C:\Users\Observer\UU.W32.exe" 192.168.2.20:80 spectro1:XxXxxx 5off',"",@SW_HIDE) ;Solenoid off Sleep(2000) GUICtrlSetData($Status,"Turning Scope Motors Off") Scope_Motors("off") Sleep(2000) GUICtrlSetData($Status,"Telescope Parked, Dome closed and at Home") ;Lights("on") TCPCloseSocket($Socket) ;close connection TCPShutdown() EndFunc Func Slew2Zenith() Local $Socket,$String,$iPID5 Tracking("off") Scope_Motors("on") GUICtrlSetData($Status,"Tracking off, sending Telescope to Zenith") TCPStartup() $Socket = TCPConnect("192.168.2.26",5003) ;create connection $String = "#" & "10" & ";" ;set slew to coordinates to zenith TCPSendMessage($Socket, $String) ;send command Sleep(10000) $String = "#" & "12" & ";" ;execute slew TCPSendMessage($Socket, $String) ;send command Sleep(30000) TCPCloseSocket($Socket) ;close connection Scope_Motors("off") TCPShutdown() EndFunc Func CheckTeleSetUp() Local $Socket,$String,$iPID4,$SetT,$iPID10,$iPID11 GUICtrlSetData($Status,"Turning Scope Motors On") Scope_Motors("on") Sleep(2000) GUICtrlSetData($Status,"Cycling Power to GAM; Please wait!") $iPID10 = RunWait('"C:\Users\Observer\UU.W32.exe" 192.168.2.78:80 spectro1:XxXxxx 6off',"",@SW_HIDE) ;GAM off Sleep(10000) GUICtrlSetData($Status,"Restoring Power to GAM") $iPID11 = RunWait('"C:\Users\Observer\UU.W32.exe" 192.168.2.78:80 spectro1:XxXxxx 6on',"",@SW_HIDE) ;GAM On Sleep(2000) GUICtrlSetData($Status,"Setting Guide rate to 2sec/sec") TCPStartup() $Socket = TCPConnect("192.168.2.26",5003) ;create connection $String = "#15,2;" ;set guide rate to 2"/sec. TCPSendMessage($Socket, $String) ;send command Sleep(5000) GUICtrlSetData($Status,"Checking camera") Sleep(1000) ;MsgBox(0,"","Cam.CoolerOn = " & $Cam.CoolerOn) If $Cam.CoolerOn == False Then GUICtrlSetData($Status,"Camera cooler is not turned on! Turning on.") $Cam.CoolerOn = True Sleep(1000) EndIf If $Cam.CoolerPower == 0 And $Cam.CoolerOn == True Then GUICtrlSetData($Status,"Camera cooler is not on! Turning on.") $Cam.CoolerOn = False Sleep(1000) $Cam.CoolerOn = True EndIf $SetT = $Cam.TemperatureSetpoint If $SetT > -32.0 Then GUICtrlSetData($Status,"Recommended Camera temperature -35 to -40 C. Setting to -32 C") ;MsgBox(0,"","Please adjust camera set temperature") $Cam.TemperatureSetpoint = -32 Sleep(5000) ;GUICtrlSetData($Status,"Please set Camera to desired temperature") EndIf Sleep(2000) $SetT = $Cam.TemperatureSetpoint $Tcount = 0 If ($Cam.Temperature > $SetT + 0.5) Or ($Cam.Temperature < $SetT - 0.5) Then While ($Cam.Temperature > $SetT + 0.5) Or ($Cam.Temperature < $SetT - 0.5) GUICtrlSetData($Status,"Waiting for Camera to reach setpoint temperature; Don't adjust setpoint!") Sleep(3000) GUICtrlSetData($Status,"Setpoint = " & $SetT & " Temperature = " & StringFormat("%.1f",$Cam.Temperature) & " Don't adjust setpoint! " & $Tcount & " < 200 max") If $Tcount > 200 Then ExitLoop EndIf $Tcount = $Tcount + 1 Sleep(2000) WEnd EndIf GUICtrlSetData($Status,"Camera temperture at setpoint") Sleep(3000) GUICtrlSetData($Status,"Setting Dome to Track") $String = "#21,0;" ;set dome tracking to on. TCPSendMessage($Socket, $String) ;send command Sleep(5000) TCPCloseSocket($Socket) ;close connection TCPShutdown() GUICtrlSetData($Status,"Turning Dome Lights off") Lights("off") Scope_Motors("off") GUICtrlSetData($Status,"Turning Solenoid on") $iPID4 = RunWait('"C:\Users\Observer\UU.W32.exe" 192.168.2.20:80 spectro1:XxXxxx 5on',"",@SW_HIDE) ;Solenoid on EndFunc ;===================================================================================== Func WeatherRead() Local $hWeatherFile, $flag = -1,$ub,$nws,$String Local $WeatherFilePath = "c:\users\observer\weather.txt" Local $weatherstring,$ws ;Local $PauseTotalTime $hWeatherFile = FileOpen($WeatherFilePath,$FO_READ) If $hWeatherFile <> -1 Then $weatherstring = FileRead($hWeatherFile) Fileclose($hWeatherFile) $ws = StringSplit($weatherstring,"") $ub = UBound($ws) $nws = 0 While $ub <> 4 $nws = $nws + 1 If $nws > 5 Then $flag = -1 ExitLoop EndIf Sleep(1000) $hWeatherFile = FileOpen($WeatherFilePath,$FO_READ) $weatherstring = FileRead($hWeatherFile) Fileclose($hWeatherFile) $ws = StringSplit($weatherstring,"") $ub = UBound($ws) WEnd If $ub == 4 Then $flag = $ws[3] Else GUICtrlSetData($Status,"Weather file incorrect. Operate RW manually") EndIf EndIf If $flag == 0 And $Dark == 1 Then ;clear and dark - observe If $PauseFlag == 1 Or $CloseFlag == 1 Then Scope_Motors("on") DomeControl("open") Tracking("on") $String = _NowTime(5) & " Resuming Observations" FileWriteLine($hLog,$String) EndIf GUICtrlSetData($WeatherStatus,"clear") GUICtrlSetData($DomeStatus,"open") $PauseFlag = 0 $PauseTime = "2000/01/01 00:00:00" $CloseFlag = 0 $CloseTime = "2000/01/01 00:00:00" EndIf If $flag == 1 Then ;partly cloudy - pause GUICtrlSetData($WeatherStatus,"cloudy") If $Domeflag == 1 Then GUICtrlSetData($DomeStatus,"Open") Else GUICtrlSetData($DomeStatus,"Closed") EndIf If $PauseFlag == 0 Then ;$PauseStartTime = _NowCalc $PauseFlag = 1 $PauseTime = _NowCalc() GUICtrlSetData($Status,"Pausing observations due to weather conditions") $String = _NowTime(5) & " Starting Weather Pause" FileWriteLine($hLog,$String) Else GUICtrlSetData($Status,"Observations have been paused for " & NiceDateDiff($PauseTime,_NowCalc())) EndIf $CloseFlag = 0 $CloseTime = "2000/01/01 00:00:00" EndIf If $flag == 2 Then ;cloudy - close If $Domeflag <> 0 Then DomeControl("close") Slew2Zenith() EndIf Tracking("off") Scope_Motors("off") GUICtrlSetData($WeatherStatus,"overcast") GUICtrlSetData($DomeStatus,"closed") $PauseFlag = 0 $PauseTime = "2000/01/01 00:00:00" If $CloseFlag == 0 Then $CloseFlag = 1 $CloseTime = _NowCalc() GUICtrlSetData($Status,"Closing dome due to unsafe weather conditions") $String = _NowTime(5) & " Closing dome due to unsafe weather conditions" FileWriteLine($hLog,$String) Else GUICtrlSetData($Status,"Dome has been closed for " & NiceDateDiff($CloseTime,_NowCalc())) EndIf EndIf If $flag == 3 Then GUICtrlSetData($Status,"!!!!!Can not find weather data. Switch to alternate cloud monitor!!") Sleep(5000) EndIf If $flag == -1 Then GUICtrlSetData($Status,"Error - failed to read weather.txt properly") EndIf Return $flag EndFunc Func NiceDateDiff($start,$end) Local $sDiff = _DateDiff("s",$start,$end) Local $mDiff = _DateDiff("n",$start,$end) Local $hDiff = _DateDiff("h",$start,$end) If $hDiff >= 1 Then Return $hDiff & "h " & ($mDiff - ($hDiff * 60)) & "m " & ($sDiff - ($mDiff * 60)) & "s" ElseIf $mDiff >= 1 Then Return $mDiff & "m " & ($sDiff - ($mDiff * 60)) & "s" Else Return $sDiff & "s" EndIf EndFunc Func SendMessage($ToAddress,$Subject,$Body) ;################################## Local $SmtpServer = "smtp.mail.yahoo.com" ; address for the smtp-server to use - REQUIRED Local $FromName = "RS" ; name from who the email was sent Local $FromAddress = "xxxxxxXX@yahoo.com" ; address from where the mail should come ;Local $Subject = "Weather Abort" ; subject from the email - can be anything you want it to be ;Local $Body = "Closing the Dome" ; the messagebody from the mail - can be left blank but then you get a blank mail Local $AttachFiles = "" ; the file you want to attach- leave blank if not needed Local $CcAddress = "" ; address for cc - leave blank if not needed Local $BccAddress = "" ; address for bcc - leave blank if not needed Local $Importance = "High" ; Send message priority: "High", "Normal", "Low" Local $Username = "xxxxxxXX" ; username for the account used from where the mail gets sent - REQUIRED Local $Password = "XXxxxxxX" ; password for the account used from where the mail gets sent - REQUIRED Local $IPPort = 465 ; port used for sending the mail Local $ssl = 1 ; enables/disables secure socket layer sending - put to 1 if using httpS Local $rc $rc = _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl) If @error Then ;MsgBox(0, "Error sending message", "Error code:" & @error & " Description:" & $rc) EndIf EndFunc Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance="Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 0) Local $objEmail = ObjCreate("CDO.Message") $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>' $objEmail.To = $s_ToAddress Local $i_Error = 0 Local $i_Error_desciption = "" If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress $objEmail.Subject = $s_Subject If StringInStr($as_Body, "<") And StringInStr($as_Body, ">") Then $objEmail.HTMLBody = $as_Body Else $objEmail.Textbody = $as_Body & @CRLF EndIf If $s_AttachFiles <> "" Then Local $S_Files2Attach = StringSplit($s_AttachFiles, ";") For $x = 1 To $S_Files2Attach[0] $S_Files2Attach[$x] = _PathFull($S_Files2Attach[$x]) ConsoleWrite('@@ Debug(62) : $S_Files2Attach = ' & $S_Files2Attach & @LF & '>Error code: ' & @error & @LF) ;### Debug Console If FileExists($S_Files2Attach[$x]) Then $objEmail.AddAttachment ($S_Files2Attach[$x]) Else ConsoleWrite('!> File not found to attach: ' & $S_Files2Attach[$x] & @LF) SetError(1) Return 0 EndIf Next EndIf $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer If Number($IPPort) = 0 then $IPPort = 25 $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort ;Authenticated SMTP If $s_Username <> "" Then $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password EndIf If $ssl Then $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True EndIf ;Update settings $objEmail.Configuration.Fields.Update ; Set Email Importance Switch $s_Importance Case "High" $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "High" Case "Normal" $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Normal" Case "Low" $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Low" EndSwitch $objEmail.Fields.Update ; Sent the Message $objEmail.Send If @error Then SetError(2) Return ;$oMyRet[1] EndIf $objEmail="" EndFunc ;==>_INetSmtpMailCom Func Archive_Zip() Local $script,$Array2,$Dir,$iPID4,$hscript,$String2,$iPID5,$nq $script = "C:\users\observer\winsftp.txt" If $User == 4 Then GUICtrlSetData($Status,"Please manually ftp data to desired location") Sleep(5000) Return EndIf $Array2 = StringSplit($Path,"\") $nq = UBound($Array2) - 1 $Dir = $Array2[$nq] GUICtrlSetData($Status,"Tarring and zipping night's data") If $User == 1 Then $iPID4 = RunWait("C:\users\observer\user1.bat " & $Dir,"F:\",@SW_MAXIMIZE) ElseIf $User == 2 Then $iPID4 = RunWait("C:\users\observer\user2.bat " & $Dir,"H:\",@SW_MAXIMIZE) ElseIf $User == 3 Then $iPID4 = RunWait("C:\users\observer\user3.bat " & $Dir,"I:\",@SW_MAXIMIZE) EndIf GUICtrlSetData($Status,"Tar and gzip completed") Sleep(2000) $hscript = FileOpen($script,$FO_OVERWRITE) If $User == 1 Or $User == 2 Then FileWriteLine($hscript,'open sftp://grayro:XxxxxxX@XXX.XX.XX.XX/ -hostkey="ssh-rsa 2048 39:89:ce:1f:1b:6a:70:f8:e9:12:fc:16:ed:33:11:b7"') FileWriteLine($hscript,"cd /home/grayro/GMSpectra") EndIf If $User == 3 Then FileWriteLine($hscript,'open sftp://mcgaheece:XxxxxxX@XXX.XX.XX.XX/ -hostkey="ssh-rsa 2048 39:89:ce:1f:1b:6a:70:f8:e9:12:fc:16:ed:33:11:b7"') FileWriteLine($hscript,"cd /home/mcgaheece/DSOspectra") EndIf If $User == 1 Then $String2 = "put F:\" & $Dir & ".tar.gz" ElseIf $User == 2 Then $String2 = "put H:\" & $Dir & ".tar.gz" ElseIf $User == 3 Then $String2 = "put I:\" & $Dir & ".tar.gz" EndIf FileWriteLine($hscript,$String2) FileWriteLine($hscript,"close") FileWriteLine($hscript,"exit") FileClose($hscript) Sleep(1000) GUICtrlSetData($Status,"FTPing data to external data storage") $iPID5 = RunWait("c:\users\observer\winscp.com /script=c:\users\observer\winsftp.txt","",@SW_MINIMIZE) GUICtrlSetData($Status,"Data transfer complete") EndFunc Func Autostart() Local $GAMerr,$M2Serr,$Easterr,$iPID,$SidT Local $SetStar[12] = ["HD400","HD13013","HD25657","HD41330","HD67587","HD85373","HD103095","HD119035","HD146946","HD162094","HD188875","HD209149"] Local $SetRA[12] = [0.145,2.143,4.093,6.102,8.170,9.873,11.883,13.671,16.296,17.798,19.928,22.007] Local $minHA,$minJ,$J,$L,$setHA Local $sData = "" Local $iConnectedSocket = -1 Local $Cmd = "" Local $Socket,$Data,$Exposure="" Local $MaxLength = 512 Local $sData = "" Local $Xstar,$Ystar Local $Array, $Flux, $GAMstat, $Ntry, $Etry GUICtrlSetData($Status,"Beginning AutoStart Procedure") Sleep(2000) $iPID = Run("siderealtime " & "","c:\users\observer",@SW_HIDE,$STDOUT_CHILD) ProcessWaitClose($iPID) $SidT = StdOutRead($iPID) $minHA = 25.0 $L = -1 For $J=0 To 11 $setHA = $SetRA[$J] - $SidT If $setHA > 12.0 Then $setHA = 24.0 - $setHA EndIf If $setHA < -12.0 Then $setHA = 24.0 + $setHA EndIf If $minHA >= Abs($setHA) Then $minHA = Abs($setHA) $L = $J EndIf Next If $L == -1 Then GUICtrlSetData($Status,"AutoStart failed to select set star") Return(1) EndIf GUICtrlSetData($Status,"Slewing to Set Star " & $SetStar[$L]) Sleep(2000) Slew($SetStar[$L]) ;need to deal with error conditions $GAMErr = MoveGAM4to2() If $GAMErr == -1 Then Return(-1) EndIf $Easterr = EastPort() If $Easterr == 1 Then Return(-1) EndIf $GAMErr = MoveGAM2to4() If $GAMErr == -1 Then Return(-1) EndIf $M2Serr = Move2Slit() If $M2Serr == 1 Then Return(-1) EndIf ;code to sync to star $Tele.Sync($TheSky.dObjectRa,$TheSky.dObjectDec,$Star) ;code to move to position 2, expose EastPort camera, and find pixel position of star $GAMErr = MoveGAM4to2() If $GAMErr == -1 Then Return(-1) EndIf GUICtrlSetData($Status,"Taking Eastport Image") TCPStartup() $Socket = TCPConnect("192.168.2.25",1000) $Exposure = "1,10" Sleep(500) TCPSendMessage($Socket,$Exposure) $Etry = 0 While 1 Sleep(100) $Data = TCPRecv($Socket,$MaxLength) If $Data <> "" Then ExitLoop EndIf $Etry = $Etry + 1 If $Etry > 400 Then ;gives Eastport camera 40 seconds to respond GUICtrlSetData($Status,"Communication Error with Eastport Camera") $SafeMessage = "GAM COM error" TCPSendMessage($Socket,"Listen") TCPCloseSocket($Socket) TCPShutdown() Return -1 EndIf Wend GUICtrlSetData($Status,"Reading Eastport Pixels") $Array = StringSplit($Data,",") $Xstar = Number($Array[1]) $Ystar = Number($Array[2]) $Flux = Number($Array[3]) If $Flux > 9.50 Then GUICtrlSetData($Status,"No bright star found in East port camera") Sleep(2000) TCPSendMessage($Socket,"Listen") TCPCloseSocket($Socket) TCPShutdown() Return -1 EndIf TCPSendMessage($Socket,"Listen") ;tells server program to reopen its listening port TCPCloseSocket($Socket) TCPShutdown() ;Update Eastport pixels GUICtrlSetData($Status,"Updating Eastport pixel positions") Sleep(1000) GUICtrlSetData($EPortX,$Xstar) GUICtrlSetData($EPortY,$Ystar) GUICtrlSetState($CheckAuto,$GUI_UNCHECKED) $isChkAuto = 0 Return(0) EndFunc Func CycleGAM() Local $iPID12,$iPID13 GUICtrlSetData($Status,"Cycling Power to GAM; Please wait!") $iPID12 = RunWait('"C:\Users\Observer\UU.W32.exe" 192.168.2.78:80 spectro1:XxXxxx 6off',"",@SW_HIDE) ;GAM off Sleep(10000) GUICtrlSetData($Status,"Restoring Power to GAM") $iPID13 = RunWait('"C:\Users\Observer\UU.W32.exe" 192.168.2.78:80 spectro1:XxXxxx 6on',"",@SW_HIDE) ;GAM On Sleep(2000) EndFunc Func Connect_Camera() $Cam = ObjCreate("MaxIm.CCDCamera") $Cam.LinkEnabled = True If $Cam.LinkEnabled = False Then MsgBox(0,"","Camera not ready") Exit EndIf $Cam.DisableAutoShutdown = True Sleep(1000) EndFunc Func Disconnect_Camera() $Cam="" EndFunc