'$INCLUDE: 'c:\qbasic\QB.BI' ' This program designed to be compiled with QB4.0 or QB4.5 ' '***** WARNING WARNING start and compile with the /l /ah option WARNING ***** ' 'This program does the autoguiding with a Connetix B&W QCam and also does 'saves of darkfield and captured images. 'Control of camera and drive this version: 6 bit or 4 bit reads. 'Machine independent timer, clock ticks 18.2 at times per second. 'Original program by Don Davies. 'Program by Marty Niemi and modified for full QB subroutines by Bob May. 'Image write is to 8 bit grayscale Targa format 'This version does the 6 bit image capture as an option. DEFINT A-Z DECLARE SUB LimitAbort () 'Abort guide if move > limit DECLARE SUB Calibrate () 'Calibrate the rate of the motor drive system DECLARE SUB checkey () 'read the keyboard DECLARE SUB ClkTicks () 'do the timing loop with the 18.2/sec. RTC DECLARE SUB DCommand () 'Send a command DECLARE SUB delay () DECLARE SUB DReset () DECLARE SUB DSetup () 'Setup the camera with the variables. DECLARE SUB GetPort () 'Get the port #s DECLARE SUB mouse () 'used with autozero DECLARE SUB scanfield () 'Scan the image in and get the star loc. DECLARE SUB screenboxes () 'setup display areas DECLARE SUB SerialWrite () 'write the data to the serial port scope control DECLARE SUB SetPallete () 'change the palette between white and red CLEAR 'set the integer vals as global DIM SHARED inregs AS RegType, outregs AS RegType DIM SHARED AMilliSecs AS INTEGER, Aggressive AS INTEGER DIM SHARED BPPix AS INTEGER, BPTx AS INTEGER DIM SHARED Col AS INTEGER, CurrentTick AS INTEGER DIM SHARED YCalSec AS INTEGER, DecmFact AS INTEGER DIM SHARED YNeg AS INTEGER DIM SHARED Ysw AS INTEGER '0=rev, 1=norm, 2=off DIM SHARED YPos AS INTEGER, DkCapF AS INTEGER DIM SHARED DkF AS INTEGER, DoDkCapF AS INTEGER DIM SHARED DQCont AS INTEGER, DQexp AS INTEGER DIM SHARED DQOffset AS INTEGER DIM SHARED EndCol AS INTEGER DIM SHARED EndRow AS INTEGER, EndXp AS INTEGER DIM SHARED EndYp AS INTEGER, hi AS INTEGER DIM SHARED HI2 AS INTEGER, HI3 AS INTEGER DIM SHARED IBPP AS INTEGER, Icamon AS INTEGER DIM SHARED IChange AS INTEGER DIM SHARED Inif AS INTEGER, Intens AS INTEGER DIM SHARED Isize AS INTEGER, ITCirF AS INTEGER DIM SHARED ITrkErrLn AS INTEGER, ITrkErrLoc AS INTEGER DIM SHARED ITrkLn AS INTEGER, ih AS INTEGER DIM SHARED ih2 AS INTEGER, ih3 AS INTEGER DIM SHARED Iv AS INTEGER, ivv AS INTEGER DIM SHARED jj AS INTEGER, KKey AS INTEGER DIM SHARED LControl AS INTEGER, LCommand AS INTEGER DIM SHARED LData AS INTEGER, left AS INTEGER DIM SHARED lo AS INTEGER, LocTrackStatus AS INTEGER DIM SHARED LStatus AS INTEGER, MisFrms AS INTEGER DIM SHARED Mxmisfrms AS INTEGER, Nchr AS INTEGER DIM SHARED NT AS INTEGER, NTMax AS INTEGER DIM SHARED OldLeft AS INTEGER DIM SHARED OldSetNumV AS INTEGER, OldPixelsPerLine AS INTEGER DIM SHARED OldTopLine AS INTEGER, pixelsperline AS INTEGER DIM SHARED PSetSw AS INTEGER, QContr AS INTEGER DIM SHARED QDataC AS INTEGER, QDataP AS INTEGER DIM SHARED QExp AS INTEGER, QMode AS INTEGER, QExp2 AS INTEGER DIM SHARED Qoffset AS INTEGER, XCalSec AS INTEGER DIM SHARED XPos AS INTEGER, XNeg AS INTEGER DIM SHARED RedSw AS INTEGER, Row AS INTEGER DIM SHARED SavFrm AS INTEGER, SetNumH AS INTEGER DIM SHARED setnumv AS INTEGER, SData AS INTEGER DIM SHARED setleft AS INTEGER, settopln AS INTEGER, SixBit AS INTEGER DIM SHARED StartXp AS INTEGER, StartYp AS INTEGER DIM SHARED Threshold AS INTEGER, Ticks AS INTEGER DIM SHARED topline AS INTEGER, TrkSw AS INTEGER DIM SHARED WaitTime AS INTEGER, XGoal AS INTEGER DIM SHARED Ygoal AS INTEGER, Xtemp AS INTEGER DIM SHARED Ytemp AS INTEGER, Xt AS INTEGER DIM SHARED Yt AS INTEGER, Xfer AS INTEGER DIM SHARED AvgIdx AS INTEGER, AvgSw AS INTEGER DIM SHARED AvgCtr AS INTEGER, AvgPtr AS INTEGER DIM SHARED AvgTrg AS INTEGER, AvgExp AS INTEGER DIM SHARED MvLimit AS INTEGER, Lx AS INTEGER DIM SHARED MvlimitCtr AS INTEGER, MouseSw AS INTEGER DIM SHARED RecSw AS INTEGER, floor AS INTEGER DIM SHARED FaintSum AS INTEGER, FaintSw AS INTEGER DIM SHARED FaintY AS INTEGER, SavBufSw AS INTEGER DIM SHARED FaintX AS INTEGER, FilterSw AS INTEGER DIM SHARED MedianY AS INTEGER, MedianX AS INTEGER DIM SHARED SortIx AS INTEGER, MedCtr AS INTEGER DIM SHARED MedTmp AS INTEGER DIM SHARED NDelay AS LONG, NPoints AS LONG 'long vars as global DIM SHARED Angle AS SINGLE, DeadBand AS SINGLE 'single vars as global DIM SHARED Yerror AS SINGLE, YNegMag AS SINGLE DIM SHARED dx AS SINGLE, Dy AS SINGLE DIM SHARED TotDx AS SINGLE, TotDy AS SINGLE DIM SHARED YPosMag AS SINGLE, Cs AS SINGLE, YErOld AS SINGLE DIM SHARED YNegCon AS SINGLE, DeltaX AS SINGLE DIM SHARED DeltaY AS SINGLE, YPosCon AS SINGLE DIM SHARED Gamma AS SINGLE, Xerror AS SINGLE DIM SHARED XPosCon AS SINGLE, XPosMag AS SINGLE DIM SHARED XNegCon AS SINGLE, XNegMag AS SINGLE DIM SHARED rec2 AS SINGLE, rec3 AS SINGLE DIM SHARED Sn AS SINGLE DIM SHARED Xp AS SINGLE, Yp AS SINGLE DIM SHARED Boost AS SINGLE, AKSum AS SINGLE DIM SHARED Null AS STRING 'strings as global '$DYNAMIC 'arrays to global DIM SHARED Img1(1 TO 3) AS INTEGER DIM SHARED img2(-1 TO 241, -1 TO 321) AS INTEGER DIM SHARED img3(-1 TO 241, -1 TO 321) AS INTEGER DIM SHARED dark1(1 TO 240, 1 TO 320) AS INTEGER DIM SHARED lookup(0 TO 15) AS INTEGER 'pixel brightness table DIM SHARED Sort(1 TO 9) AS INTEGER 'sort array for median filter DIM SHARED AvgPos(1 TO 14, 1 TO 2) AS SINGLE 'position average table DIM SHARED AK(-1 TO 1, -1 TO 1) AS SINGLE 'Al Kelly's kernel SCREEN 12 CLS DReset SetPallete 'start setting up the variables 'Initialize Al Kelly's kernel AK(-1, -1) = 1: AK(-1, 0) = 1.25: AK(-1, 1) = 1 AK(0, -1) = 1.25: AK(0, 0) = 2: AK(0, 1) = 1.25 AK(1, -1) = 1: AK(1, 0) = 1.25: AK(1, 1) = 1 FilterSw = 1 'default to Faint mode filter Inif = 0 Icamon = 1 'Camon flag permits testing with no camera DkF = 0: DkCapF = 0 'dark sub. flag, dark image capture flag. XPos = 1: XNeg = 2 'Set bits for serial port motor control for YPos = 4: YNeg = 8 'normal direction control XCalSec = 5: YCalSec = 5 'initial Calibration variables DeadBand = 2: Aggressive = 0 Boost = 1 'multiplier for faint stars floor = 4 'set PV below this to zero IBPP = 4: BPPix = 4: BPTx = 8 'Camera parameters nibble mode IChange = 1 Isize = 3 DecmFact = 1 'get every pixel, average 4 if this is a 2 SixBit = 0 NTMax = 80 / DecmFact / DecmFact QMode = 0 Threshold = 4 DQCont = 10 QExp = 80: Qoffset = 222 'initial values for an exposure, blacklevel QContr = 173 'and contrast pixelsperline = 320 'starting with the midsize frame setnumv = 240 '#lines in image. Init val is for med. frame Mxmisfrms = 5 'Tracking error threshold MvLimit = 14 'Limit commanded move to 14 pixels MvlimitCtr = 0 'consecutive moves over limit cause abort XGoal = 162: Ygoal = 122 'PIXEL COORDS OF GOAL for tracking. Center of screen TrkSw = 0: PSetSw = 1 ITCirF = 1: SavFrm = 0 Null = CHR$(0) WaitTime = 2 'RTC Clock ticks for wait Col = 2: Row = 2 'setup partial screen clear call params EndCol = 325: EndRow = 243 FOR I = 0 TO 15 'Generate the lookup table for the shades lookup(I) = 16 - I 'of gray the way the cam put them out. NEXT I lookup(0) = 0 FOR AvgCtr = 1 TO 14 AvgPos(AvgCtr, 1) = 0 'clear the array for averaging AvgPos(AvgCtr, 2) = 0 NEXT AvgCtr AvgCtr = 0 AvgTrg = 1 AvgIdx = 2 inregs.ax = 0: mouse 'initialize mouse via Int Hex 33 IF inregs.ax <> 0 THEN MouseSw = 0 '0 indicates no mouse present ELSE MouseSw = 1 'mouse found END IF GetPort 'get the ports from the user screenboxes LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen 'End of housekeeping 'Main execution loop DO IF TrkSw = 1 AND MisFrms > Mxmisfrms THEN 'See if lock lost LOCATE ITrkErrLn + 1, 63: PRINT "No Lock" IF Lx <> 1 THEN PRINT #1, Null; 'clear the serial port ELSE IF SData = 1 THEN PRINT #1, "#:Qw#"; 'stop W IF SData = 2 THEN PRINT #1, "#:Qe#"; 'stop E IF SData = 4 THEN PRINT #1, "#:Qs#"; 'stop S IF SData = 8 THEN PRINT #1, "#:Qn#"; 'stop N END IF Xerror = 0 Yerror = 0 dx = 0 Dy = 0 Nchr = 0 SOUND 400, 5 'cloud alert END IF scanfield 'Everything happens in the routine LOOP WHILE KKey <> 99 'Exit on Esc key END REM $STATIC DEFSNG A-Z SUB Calibrate 'Calibrate the rate of the motor drive system TrkSw = 0 'make sure tracking is off LOCATE ITrkErrLn + 1, 44 PRINT "Tracking Off" Aggressive = 0 'set to 100% correction rate LOCATE 5, 69: PRINT USING "+##"; Aggressive; LOCATE 7, 45: PRINT "Calibration running"; scanfield 'XPos calibration IF NT < 1 OR NT >= NTMax THEN lo = 10 LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen LOCATE 6, 4: PRINT "NO LOCK ON A STAR HAS BEEN FOUND! " LOCATE 7, 3: PRINT "Please adjust the Exposure and Zero" LOCATE 9, 4: PRINT "settings to obtain a circle around " LOCATE 10, 3: PRINT "the desired guide star before " LOCATE 11, 4: PRINT "running the calibration." LOCATE 12, 3: PRINT "Press the F5 Key to continue." DO WHILE lo = 10 checkey LOOP LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen LOCATE 7, 45: PRINT " "; LOCATE 8, 45: PRINT " "; LOCATE 9, 45: PRINT " "; LOCATE 10, 45: PRINT " "; LOCATE 11, 45: PRINT " "; EXIT SUB END IF StartXp = Xp StartYp = Yp Nchr = XCalSec * 30 SData = XPos SerialWrite scanfield IF NT < 1 OR NT >= NTMax THEN lo = 10 LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen LOCATE 6, 4: PRINT "NO LOCK ON A STAR HAS BEEN FOUND! " LOCATE 7, 3: PRINT "Please adjust the Exposure and Zero" LOCATE 9, 4: PRINT "settings to obtain a circle around " LOCATE 10, 3: PRINT "the desired guide star before " LOCATE 11, 4: PRINT "running the calibration." LOCATE 12, 3: PRINT "Press the F5 Key to continue." DO WHILE lo = 10 checkey LOOP LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen LOCATE 7, 45: PRINT " "; LOCATE 8, 45: PRINT " "; LOCATE 9, 45: PRINT " "; LOCATE 10, 45: PRINT " "; LOCATE 11, 45: PRINT " "; EXIT SUB END IF EndXp = Xp EndYp = Yp DeltaX = EndXp - StartXp DeltaY = EndYp - StartYp 'IF DeltaX > 0 THEN ' lo = 10 ' LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen ' LOCATE 6, 4: PRINT "Please rotate the camera by 180 deg." ' LOCATE 7, 3: PRINT "and press the F5 Key to continue." ' LOCATE 9, 4: PRINT "The X direction of the error was in" ' LOCATE 10, 3: PRINT "the wrong direction for the program." ' LOCATE 12, 4: PRINT "Calibration needs to be run again!" ' DO WHILE lo = 10 ' checkey ' LOOP ' LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen ' LOCATE 7, 45: PRINT " "; ' LOCATE 8, 45: PRINT " "; ' LOCATE 9, 45: PRINT " "; ' LOCATE 10, 45: PRINT " "; ' LOCATE 11, 45: PRINT " "; ' EXIT SUB 'END IF XPosMag = SQR(DeltaX * DeltaX + DeltaY * DeltaY) IF XPosMag > 0 THEN XPosCon = XCalSec / XPosMag ELSE XPosCon = 0 END IF 'Angle (Theta) in radians is from rotation of the chip relative to x y axes IF ABS(DeltaX) > 0 THEN Angle = ATN(DeltaY / DeltaX) ELSE Angle = 0 END IF SData = XNeg SerialWrite LOCATE 8, 45: PRINT "X Pos Cal: "; : PRINT USING "##.## "; XPosCon; LOCATE 12, 45: PRINT "Angle:"; PRINT USING "###.#"; (Angle * 180 / 3.14159); 'convert radians to degrees PRINT CHR$(248); scanfield 'XNeg calibration IF NT < 1 OR NT >= NTMax THEN lo = 10 LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen LOCATE 6, 4: PRINT "NO LOCK ON A STAR HAS BEEN FOUND! " LOCATE 7, 3: PRINT "Please adjust the Exposure and Zero" LOCATE 9, 4: PRINT "settings to obtain a circle around " LOCATE 10, 3: PRINT "the desired guide star before " LOCATE 11, 4: PRINT "running the calibration." LOCATE 12, 3: PRINT "Press the F5 Key to continue." DO WHILE lo = 10 checkey LOOP LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen LOCATE 7, 45: PRINT " "; LOCATE 8, 45: PRINT " "; LOCATE 9, 45: PRINT " "; LOCATE 10, 45: PRINT " "; LOCATE 11, 45: PRINT " "; EXIT SUB END IF StartXp = Xp StartYp = Yp Nchr = XCalSec * 30 SData = XNeg SerialWrite scanfield IF NT < 1 OR NT >= NTMax THEN lo = 10 LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen LOCATE 6, 4: PRINT "NO LOCK ON A STAR HAS BEEN FOUND! " LOCATE 7, 3: PRINT "Please adjust the Exposure and Zero" LOCATE 9, 4: PRINT "settings to obtain a circle around " LOCATE 10, 3: PRINT "the desired guide star before " LOCATE 11, 4: PRINT "running the calibration." LOCATE 12, 3: PRINT "Press the F5 Key to continue." DO WHILE lo = 10 checkey LOOP LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen LOCATE 7, 45: PRINT " "; LOCATE 8, 45: PRINT " "; LOCATE 9, 45: PRINT " "; LOCATE 10, 45: PRINT " "; LOCATE 11, 45: PRINT " "; EXIT SUB END IF EndXp = Xp EndYp = Yp DeltaX = EndXp - StartXp DeltaY = EndYp - StartYp XNegMag = SQR(DeltaX * DeltaX + DeltaY * DeltaY) IF XNegMag > 0 THEN XNegCon = XCalSec / XNegMag ELSE XNegCon = 0 END IF SData = XPos SerialWrite LOCATE 9, 45: PRINT "X Neg Cal: "; : PRINT USING "##.## "; XNegCon; IF Ysw = 2 THEN LOCATE 7, 45: PRINT "Calibration Done "; LOCATE 10, 45: PRINT " "; LOCATE 11, 45: PRINT " "; EXIT SUB 'no dec control END IF scanfield 'YPos calibration IF NT < 1 OR NT >= NTMax THEN lo = 10 LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen LOCATE 6, 4: PRINT "NO LOCK ON A STAR HAS BEEN FOUND! " LOCATE 7, 3: PRINT "Please adjust the Exposure and Zero" LOCATE 9, 4: PRINT "settings to obtain a circle around " LOCATE 10, 3: PRINT "the desired guide star before " LOCATE 11, 4: PRINT "running the calibration." LOCATE 12, 3: PRINT "Press the F5 Key to continue." DO WHILE lo = 10 checkey LOOP LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen LOCATE 7, 45: PRINT " "; LOCATE 8, 45: PRINT " "; LOCATE 9, 45: PRINT " "; LOCATE 10, 45: PRINT " "; LOCATE 11, 45: PRINT " "; EXIT SUB END IF StartXp = Xp StartYp = Yp Nchr = YCalSec * 30 SData = YPos SerialWrite scanfield IF NT < 1 OR NT >= NTMax THEN lo = 10 LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen LOCATE 6, 4: PRINT "NO LOCK ON A STAR HAS BEEN FOUND! " LOCATE 7, 3: PRINT "Please adjust the Exposure and Zero" LOCATE 9, 4: PRINT "settings to obtain a circle around " LOCATE 10, 3: PRINT "the desired guide star before " LOCATE 11, 4: PRINT "running the calibration." LOCATE 12, 3: PRINT "Press the F5 Key to continue." DO WHILE lo = 10 checkey LOOP LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen LOCATE 7, 45: PRINT " "; LOCATE 8, 45: PRINT " "; LOCATE 9, 45: PRINT " "; LOCATE 10, 45: PRINT " "; LOCATE 11, 45: PRINT " "; EXIT SUB END IF EndXp = Xp EndYp = Yp DeltaX = EndXp - StartXp DeltaY = EndYp - StartYp YPosMag = SQR(DeltaX * DeltaX + DeltaY * DeltaY) IF YPosMag > 0 THEN YPosCon = YCalSec / YPosMag ELSE YPosCon = 0 END IF SData = YNeg SerialWrite scanfield 'deadband is Yp in size, DeltaY is how far it got driven off. Yp/DeltaY is 'the further distance it needed to be driven. Yp is also the pixel count 'of the deadband in the DEC distance. IF NT < 1 OR NT >= NTMax THEN lo = 10 LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen LOCATE 6, 4: PRINT "NO LOCK ON A STAR HAS BEEN FOUND! " LOCATE 7, 3: PRINT "Please adjust the Exposure and Zero" LOCATE 9, 4: PRINT "settings to obtain a circle around " LOCATE 10, 3: PRINT "the desired guide star before " LOCATE 11, 4: PRINT "running the calibration." LOCATE 12, 3: PRINT "Press the F5 Key to continue." DO WHILE lo = 10 checkey LOOP LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen LOCATE 7, 45: PRINT " "; LOCATE 8, 45: PRINT " "; LOCATE 9, 45: PRINT " "; LOCATE 10, 45: PRINT " "; LOCATE 11, 45: PRINT " "; EXIT SUB END IF ' IF DeltaY <> 0 THEN 'otherwise a divide by 0 'Bob's backlash stuff ' Nchr = ((Yp - StartYp) / DeltaY) * (YCalSec * 30) ' SData = YNeg ' IF Nchr >= 1 THEN 'we have a whole char to send ' SerialWrite ' END IF ' END IF scanfield IF NT < 1 OR NT >= NTMax THEN lo = 10 LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen LOCATE 6, 4: PRINT "NO LOCK ON A STAR HAS BEEN FOUND! " LOCATE 7, 3: PRINT "Please adjust the Exposure and Zero" LOCATE 9, 4: PRINT "settings to obtain a circle around " LOCATE 10, 3: PRINT "the desired guide star before " LOCATE 11, 4: PRINT "running the calibration." LOCATE 12, 3: PRINT "Press the F5 Key to continue." DO WHILE lo = 10 checkey LOOP LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen LOCATE 7, 45: PRINT " "; LOCATE 8, 45: PRINT " "; LOCATE 9, 45: PRINT " "; LOCATE 10, 45: PRINT " "; LOCATE 11, 45: PRINT " "; EXIT SUB END IF EndYp = Yp DeltaY = EndYp - StartYp LOCATE 10, 45: PRINT "Y Pos Cal: "; : PRINT USING "##.## "; YPosCon; 'YNeg calibration scanfield IF NT < 1 OR NT >= NTMax THEN lo = 10 LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen LOCATE 6, 4: PRINT "NO LOCK ON A STAR HAS BEEN FOUND! " LOCATE 7, 3: PRINT "Please adjust the Exposure and Zero" LOCATE 9, 4: PRINT "settings to obtain a circle around " LOCATE 10, 3: PRINT "the desired guide star before " LOCATE 11, 4: PRINT "running the calibration." LOCATE 12, 3: PRINT "Press the F5 Key to continue." DO WHILE lo = 10 checkey LOOP LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen LOCATE 7, 45: PRINT " "; LOCATE 8, 45: PRINT " "; LOCATE 9, 45: PRINT " "; LOCATE 10, 45: PRINT " "; LOCATE 11, 45: PRINT " "; EXIT SUB END IF StartXp = Xp StartYp = Yp Nchr = YCalSec * 30 SData = YNeg SerialWrite scanfield IF NT < 1 OR NT >= NTMax THEN lo = 10 LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen LOCATE 6, 4: PRINT "NO LOCK ON A STAR HAS BEEN FOUND! " LOCATE 7, 3: PRINT "Please adjust the Exposure and Zero" LOCATE 9, 4: PRINT "settings to obtain a circle around " LOCATE 10, 3: PRINT "the desired guide star before " LOCATE 11, 4: PRINT "running the calibration." LOCATE 12, 3: PRINT "Press the F5 Key to continue." DO WHILE lo = 10 checkey LOOP LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen LOCATE 7, 45: PRINT " "; LOCATE 8, 45: PRINT " "; LOCATE 9, 45: PRINT " "; LOCATE 10, 45: PRINT " "; LOCATE 11, 45: PRINT " "; EXIT SUB END IF EndXp = Xp EndYp = Yp DeltaX = EndXp - StartXp DeltaY = EndYp - StartYp YNegMag = SQR(DeltaX * DeltaX + DeltaY * DeltaY) IF YNegMag > 0 THEN YNegCon = YCalSec / YNegMag ELSE YNegCon = 0 END IF SData = YPos SerialWrite LOCATE 11, 45: PRINT "Y Neg Cal: "; : PRINT USING "##.## "; YNegCon; LOCATE 7, 45: PRINT "Calibration Done "; END SUB SUB checkey 'ROUTINE TO READ THE CURSOR KEYS hi = 0 'multiple use variable DO SELECT CASE INKEY$ CASE "" hi = 2 CASE CHR$(1) 'Ctrl + A is switch for processing filter IF FaintSw = 0 THEN LOCATE 29, 2: PRINT USING "Filter: 1=Faint, 2=Al's, 3=Median: #"; FilterSw; INPUT aaa IF aaa > 0 THEN FilterSw = aaa IF FilterSw > 3 THEN FilterSw = 3 FaintSw = 1 SavBufSw = 1 ELSE FaintSw = 0 SavBufSw = 0 END IF Inif = 0 CLS screenboxes CASE CHR$(5) 'Ctrl + E is manual entry for Eexposure LOCATE 29, 2: PRINT USING "Exposure ##.##"; QExp / 250; INPUT aaa IF aaa <> 0 THEN QExp = aaa * 250 IF QExp < 14 THEN QExp = 14 IF QExp > 8000 THEN QExp = 8000 CLS Inif = 0 screenboxes CASE CHR$(6) 'Ctrl + F is manual entry for Floor LOCATE 29, 2: PRINT USING "Floor 0-64: ##"; floor; INPUT aaa IF aaa > -1 THEN floor = aaa IF floor > 64 THEN floor = 64 CLS Inif = 0 screenboxes CASE CHR$(2) 'Ctrl + B is manual entry for boost LOCATE 29, 2: PRINT USING "Boost 0-5: #.#"; Boost; INPUT aaa IF aaa > -1 THEN Boost = aaa IF Boost > 5 THEN Boost = 5 CLS Inif = 0 screenboxes CASE CHR$(26) 'Ctrl + Z is manual entry for Zero LOCATE 29, 2: PRINT USING "Zero ###"; Qoffset; INPUT aaa IF aaa <> 0 THEN Qoffset = aaa IF Qoffset < 1 THEN Qoffset = 1 IF Qoffset > 245 THEN Qoffset = 245 CLS Inif = 0 screenboxes CASE CHR$(7) 'Ctrl + G is manual entry for Gain LOCATE 29, 2: PRINT USING "Gain ###"; QContr; INPUT aaa IF aaa <> 0 THEN QContr = aaa IF QContr < 11 THEN QContr = 11 IF QContr > 254 THEN QContr = 254 CLS Inif = 0 screenboxes CASE CHR$(12) 'Ctrl + L is manual entry for move limit LOCATE 29, 2: PRINT USING "Move Limit ###"; MvLimit; INPUT aaa IF aaa <> 0 THEN MvLimit = aaa IF MvLimit < 1 THEN MvLimit = 1 IF MvLimit > 200 THEN MvLimit = 200 CLS Inif = 0 screenboxes CASE CHR$(8) 'Ctrl + H is manual entry for Missed Frames limit LOCATE 29, 2: PRINT USING "Missed Frames Limit ##"; Mxmisfrms; INPUT aaa IF aaa <> 0 THEN Mxmisfrms = aaa IF Mxmisfrms < 1 THEN Mxmisfrms = 1 IF Mxmisfrms > 99 THEN Mxmisfrms = 99 CLS Inif = 0 screenboxes CASE "6" 'go to 6 bit reads QMode = &H2 BPPix = &H2 'BPPix is really 6 but you need to divide by 3 for xfrs LOCATE ITrkErrLn, ITrkErrLoc: PRINT "6" SetNumH = pixelsperline * BPPix \ BPTx \ DecmFact DkCapF = 0 DkF = 0 LOCATE ITrkErrLn + 4, 44: PRINT "Dark Frame Sub OFF"; IF Threshold < 15 THEN Threshold = Threshold * 4 LOCATE ITrkErrLn + 3, 60: PRINT USING "##"; Threshold END IF CASE "4" 'go to 4 bit reads QMode = &H0 BPPix = &H4 LOCATE ITrkErrLn, ITrkErrLoc: PRINT "4" SetNumH = pixelsperline * BPPix \ BPTx \ DecmFact DkCapF = 0 DkF = 0 LOCATE ITrkErrLn + 4, 44: PRINT "Dark Frame Sub OFF"; IF Threshold > 14 THEN Threshold = Threshold \ 4 LOCATE ITrkErrLn + 3, 60: PRINT USING "##"; Threshold END IF CASE "h", "H" LINE (Col, Row)-(EndCol, EndRow), 0, BF'clearscreen LOCATE 2, 3: PRINT "By D.Davies, M.Niemi and B.May. Keys "; LOCATE 3, 3: PRINT "are defined below. Ctrl + E,Z,G,L,H "; LOCATE 4, 3: PRINT "to permit manual entry of some values."; LOCATE 5, 3: PRINT "Track will occur when a star is above "; LOCATE 6, 3: PRINT "the threshold within a frame. Use the"; LOCATE 7, 3: PRINT "exposure controls and threshold to "; LOCATE 8, 3: PRINT "adjust things until a circle appears. "; LOCATE 9, 3: PRINT "Exit with the ESC key will save the "; LOCATE 10, 3: PRINT "current program setup information. "; LOCATE 11, 3: PRINT "For more info see: www.ameritech.net "; LOCATE 12, 3: PRINT "/users/mniemi000/auto.html "; LOCATE 13, 3: PRINT "Program date 05/28/01 M.Niemi"; LOCATE 15, 3: PRINT " Press any key to continue"; DO WHILE INKEY$ = "" LOOP LINE (Col, Row)-(EndCol, EndRow), 0, BF'clearscreen CASE Null + CHR$(75) 'left arrow KKey = 2 Nchr = 15 SData = XPos SerialWrite CASE Null + CHR$(77) 'right arrow KKey = 2 Nchr = 15 SData = XNeg SerialWrite CASE Null + CHR$(72) 'up arrow KKey = 2 Nchr = 15 SData = YPos SerialWrite CASE Null + CHR$(80) 'down arrow KKey = 2 Nchr = 15 SData = YNeg SerialWrite CASE Null + CHR$(59) 'X-goal -2 F1 XGoal = XGoal - 2 IChange = 1 IF XGoal < 40 THEN XGoal = 40 KKey = 1 CASE Null + CHR$(60) 'X-goal +2 F2 XGoal = XGoal + 2 IChange = 1 IF XGoal > EndCol - 40 THEN XGoal = EndCol - 40 KKey = 1 CASE Null + CHR$(61) 'Y-goal -2 F3 Ygoal = Ygoal - 2 IChange = 1 IF Ygoal < 40 THEN Ygoal = 40 KKey = 1 CASE Null + CHR$(62) 'Y-goal +2 F4 Ygoal = Ygoal + 2 IChange = 1 IF Ygoal > EndRow - 40 THEN Ygoal = EndRow - 40 KKey = 1 CASE "z" 'Black level down KKey = 1 Qoffset = (Qoffset - 1) IF Qoffset < 1 THEN Qoffset = 1 CASE "Z" 'Black level up KKey = 1 IF Qoffset > 245 THEN Qoffset = 245 Qoffset = (Qoffset + 1) CASE "g" 'Gain down KKey = 1 IF QContr < 11 THEN QContr = 11 QContr = (QContr - DQCont) CASE "G" 'Gain up KKey = 1 IF QContr > 254 - DQCont THEN QContr = 254 - DQCont QContr = (QContr + DQCont) CASE "e" 'Exposure time down KKey = 1 QExp = (QExp - (QExp \ 4)) IF QExp < 14 THEN QExp = 14 CASE "E" 'Exposure time up KKey = 1 IF QExp > 8000 THEN QExp = 8000 QExp = (QExp + (QExp \ 4)) CASE "x" 'X cal down XCalSec = XCalSec - 1 IF XCalSec <= 1 THEN XCalSec = 1 LOCATE 2, 70: PRINT XCalSec; CASE "X" 'X cal up XCalSec = XCalSec + 1 IF XCalSec >= 9 THEN XCalSec = 9 LOCATE 2, 70: PRINT XCalSec; CASE "y" 'DEC cal down YCalSec = YCalSec - 1 IF YCalSec <= 1 THEN YCalSec = 1 LOCATE 3, 70: PRINT YCalSec; CASE "Y" 'DEC cal up YCalSec = YCalSec + 1 IF YCalSec >= 6 THEN YCalSec = 6 LOCATE 3, 70: PRINT YCalSec; CASE "d" 'Deadband down DeadBand = DeadBand - .1 IF DeadBand <= 0 THEN DeadBand = 0 LOCATE 4, 70: PRINT USING "##.#"; DeadBand; CASE "D" 'Deadband up DeadBand = DeadBand + .1 IF DeadBand >= 6 THEN DeadBand = 6 LOCATE 4, 70: PRINT USING "##.#"; DeadBand; CASE "v" 'Aggressive down Aggressive = Aggressive - 1 IF Aggressive <= -9 THEN Aggressive = -9 LOCATE 5, 69: PRINT USING "+##"; Aggressive; CASE "V" 'Aggressive up Aggressive = Aggressive + 1 IF Aggressive >= 9 THEN Aggressive = 9 LOCATE 5, 69: PRINT USING "+##"; Aggressive; CASE "w" 'Wait time down WaitTime = WaitTime - 1 IF WaitTime <= 0 THEN WaitTime = 0 LOCATE 6, 69: PRINT USING "###.##"; WaitTime / 18.2; CASE "W" 'Wait time up WaitTime = WaitTime + 1 IF WaitTime >= 182 THEN WaitTime = 182 LOCATE 6, 69: PRINT USING "###.##"; WaitTime / 18.2; CASE "n", "N" 'Red mode switch IF RedSw = 1 THEN RedSw = 0 ELSE RedSw = 1 SetPallete CASE "c", "C" 'Clear Screen LINE (Col, Row)-(EndCol, EndRow), 0, BF CASE "r", "R" 'Record corrections IF RecSw = 0 THEN OPEN "track.dat" FOR OUTPUT AS #5 LOCATE 29, 42: PRINT "Recording to file Track.dat"; RecSw = 1 ELSE CLOSE #5 LOCATE 29, 42: PRINT " "; RecSw = 0 END IF CASE "t", "T" 'Track toggle on and off. IF TrkSw = 0 THEN LOCATE ITrkErrLn + 1, 44 PRINT "Tracking On" LOCATE 29, 42 PRINT " "; MisFrms = 0 MvlimitCtr = 0 TrkSw = 1 ELSE LOCATE ITrkErrLn + 1, 44 PRINT "Tracking Off" TrkSw = 0 END IF CASE "k", "K" 'toggle averaging LOCATE ITrkErrLn + 2, 63 IF AvgSw = 0 THEN FOR AvgCtr = 1 TO 14 AvgPos(AvgCtr, 1) = 0 AvgPos(AvgCtr, 2) = 0 NEXT AvgCtr AvgCtr = 0 PRINT "Frame Avg ON " AvgSw = 1 ELSE PRINT "Frame Avg OFF" LOCATE 29, 42: PRINT " "; AvgSw = 0 END IF CASE "f", "F" 'Frame size switch SELECT CASE Isize CASE IS = 0 Isize = 3: IChange = 1 LOCATE ITrkErrLn + 2, 44: PRINT "Full Frame "; LINE (Col, Row)-(EndCol, EndRow), 0, BF CASE IS = 1 Isize = 0: IChange = 1 LOCATE ITrkErrLn + 2, 44: PRINT "16 X 16 Frame "; LINE (Col, Row)-(EndCol, EndRow), 0, BF CASE IS = 2 Isize = 1: IChange = 1 LOCATE ITrkErrLn + 2, 44: PRINT "40 X 40 Frame "; LINE (Col, Row)-(EndCol, EndRow), 0, BF CASE IS = 3 Isize = 2: IChange = 1 LOCATE ITrkErrLn + 2, 44: PRINT "80 X 80 Frame "; LINE (Col, Row)-(EndCol, EndRow), 0, BF CASE ELSE END SELECT CASE "p", "P" 'Display the image or not IF PSetSw = 0 THEN PSetSw = 1 ELSE PSetSw = 0 CASE Null + CHR$(63) 'DEC fact. = 1 F5 not listed nor done lo = 0 CASE Null + CHR$(64) 'DEC fact. = 2 F6 not listed CASE Null + CHR$(66) 'Calibrate F8 Calibrate CASE Null + CHR$(67) 'Reverse DEC F9 SELECT CASE Ysw CASE IS = 0 'Y reversed turn off Ysw = 2 YPos = 0 YNeg = 0 LOCATE 7, 69: PRINT "Y Off "; CASE IS = 1 'Y normal turn reversed Ysw = 0 YPos = 8 YNeg = 4 LOCATE 7, 69: PRINT "Y Reversed"; CASE IS = 2 'Y control off turn normal Ysw = 1 YPos = 4 YNeg = 8 LOCATE 7, 69: PRINT "Y Normal "; CASE ELSE END SELECT CASE Null + CHR$(68) 'Capture Darkframe F10 DoDkCapF = 1 CASE "j", "J"' Darkframe Toggle IF DkF = 1 THEN DkF = 0 ELSE DkF = 1 END IF screenboxes CASE "I" AvgTrg = AvgTrg + 1 IF AvgTrg > 14 THEN AvgTrg = 14 LOCATE ITrkErrLn + 3, 78: PRINT USING "##"; AvgTrg CASE "i" AvgTrg = AvgTrg - 1 IF AvgTrg < 2 THEN AvgTrg = 1 LOCATE ITrkErrLn + 3, 78: PRINT USING "##"; AvgTrg CASE "L" Threshold = Threshold + 1 IF BPPix = 2 THEN IF Threshold > 63 THEN Threshold = 63 END IF ELSE IF Threshold > 14 THEN Threshold = 14 END IF END IF LOCATE ITrkErrLn + 3, 60: PRINT USING "##"; Threshold CASE "l" IF Threshold < 1 THEN Threshold = 1 Threshold = Threshold - 1 LOCATE ITrkErrLn + 3, 60: PRINT USING "##"; Threshold CASE "M" AvgIdx = AvgIdx + 1 IF AvgIdx > 14 THEN AvgIdx = 14 LOCATE ITrkErrLn + 2, 78: PRINT USING "##"; AvgIdx CASE "m" AvgIdx = AvgIdx - 1 IF AvgIdx < 2 THEN AvgIdx = 2 LOCATE ITrkErrLn + 2, 78: PRINT USING "##"; AvgIdx CASE "o", "O" 'Circles Toggle IF ITCirF = 0 THEN ITCirF = 1 LOCATE 15, 70: PRINT " " ELSE ITCirF = 0 LOCATE 15, 70: PRINT "circle off" END IF CASE "u", "U" 'interface toggle IF Lx = 0 THEN Lx = 1 CLOSE #1 IF QDataC = 1 THEN COM$ = "COM1: 9600,N,8,1,CD0,CS0,DS0,RS" 'LX200 port only OPEN COM$ FOR RANDOM AS #1 PRINT #1, Null; 'clear the serial port END IF IF QDataC = 2 THEN COM$ = "COM2: 9600,N,8,1,CD0,CS0,DS0,RS" 'LX200 port only OPEN COM$ FOR RANDOM AS #1 PRINT #1, Null; 'clear the serial port END IF LOCATE 18, 63: PRINT "LX-200 Interface" ELSE Lx = 0 CLOSE #1 IF QDataC = 1 THEN COM$ = "COM1: 300,N,8,1,BIN,RS,OP0,DS0" 'Activate the port for output OPEN COM$ FOR RANDOM AS #1 PRINT #1, Null; 'clear the serial port END IF IF QDataC = 2 THEN COM$ = "COM2: 300,N,8,1,BIN,RS,OP0,DS0" OPEN COM$ FOR RANDOM AS #1 PRINT #1, Null; 'clear the serial port END IF LOCATE 18, 63: PRINT "UART Interface " END IF CASE CHR$(27) 'Exit the program OPEN "camcfg.dat" FOR RANDOM AS #4 LEN = 4 PUT #4, 1, QDataC PUT #4, 2, QDataP PUT #4, 3, QExp PUT #4, 4, Qoffset PUT #4, 5, QContr PUT #4, 6, YCalSec PUT #4, 7, XCalSec PUT #4, 8, DeadBand PUT #4, 9, Aggressive PUT #4, 10, WaitTime PUT #4, 11, Threshold PUT #4, 12, Ysw PUT #4, 13, XPosCon PUT #4, 14, XNegCon PUT #4, 15, YPosCon PUT #4, 16, YNegCon PUT #4, 17, AvgSw PUT #4, 18, AvgIdx PUT #4, 19, AvgTrg PUT #4, 20, Lx PUT #4, 21, Mxmisfrms PUT #4, 22, MvLimit PUT #4, 23, QMode PUT #4, 24, BPPix PUT #4, 25, SetNumH CLOSE #4 END CASE ELSE 'other keys END SELECT LOOP UNTIL hi = 2 ' Used Symbols in CAPS 46ABCDEFGhIJkLmNOPQRsTuVWXyZ|ARROWS|Esc| | IF KKey = 1 THEN LOCATE 18, 2: PRINT USING "##.##"; QExp / 250; : PRINT " Sec."; PRINT USING "#######"; Qoffset; QContr; PRINT USING "####.##"; dx; Dy; LINE (Col, Row)-(EndCol, EndRow), 0, BF'clearscreen END IF IF KKey = 2 THEN DEF SEG = 0 'Empty the keyboard buffer for the cursor keys Byte = PEEK(&H41A) POKE (&H41C), Byte END IF KKey = 0 SetNumH = pixelsperline * BPPix \ BPTx \ DecmFact settopln = topline setleft = left \ 2 + 6 END SUB SUB ClkTicks 'do the timing loop with the 18.2/sec. RTC DEF SEG = 0 DO UNTIL Ticks < 1 CurrentTick = PEEK(&H46C) DO WHILE CurrentTick = PEEK(&H46C) LOOP Ticks = Ticks - 1 LOOP DEF SEG 'get back the default segment END SUB SUB DCommand 'Sends a byte out the parallel port IF Icamon <> 1 THEN 'no camera EXIT SUB END IF OUT LData, LCommand AMilliSecs = 5 delay 'delay for 5 counts OUT LControl, &H6 DO WHILE (&H8 AND INP(LStatus)) = 0 'get the Hi nibble LOOP hi = &HF0 AND INP(LStatus) 'and status reg with F0 for the 4 bits OUT LControl, &HE 'toggle the ack bit back again delay DO WHILE (&H8 AND INP(LStatus)) <> 0 'now go for the Lo nibble LOOP lo = &HF0 AND INP(LStatus) 'and status reg with F0 for the 4 bits END SUB SUB delay 'delay for a bit NDelay = 2 * AMilliSecs FOR IDELAY = 1 TO NDelay NEXT IDELAY END SUB SUB DReset 'Reset the camera AMilliSecs = 10 OUT LControl, &H0 'set reset bit low xxxx x0xx delay OUT LControl, &HE END SUB SUB DSetup 'Setup the camera with the variables. IF Icamon <> 1 THEN 'no camera EXIT SUB END IF DReset LCommand = &H11: DCommand 'vertical size LCommand = setnumv: DCommand LCommand = &H13: DCommand LCommand = SetNumH: DCommand LCommand = &HD: DCommand 'first line to send LCommand = settopln: DCommand LCommand = &HF: DCommand 'first pixel to send LCommand = setleft: DCommand LCommand = &H19: DCommand 'contrast LCommand = QContr: DCommand LCommand = &H1F: DCommand 'black level. LCommand = Qoffset: DCommand LCommand = &HB: DCommand 'exposure QExp2 = 255 LCommand = QExp2: DCommand END SUB SUB GetPort 'Get the port address from the bios point in menory OPEN "camcfg.dat" FOR RANDOM AS #4 LEN = 4 GET #4, , QDataC IF EOF(4) = 0 THEN LOCATE 5, 3: PRINT "Getting last setup from disk." GET #4, 1, QDataC GET #4, 2, QDataP GET #4, 3, QExp GET #4, 4, Qoffset GET #4, 5, QContr GET #4, 6, YCalSec GET #4, 7, XCalSec GET #4, 8, DeadBand GET #4, 9, Aggressive GET #4, 10, WaitTime GET #4, 11, Threshold GET #4, 12, Ysw GET #4, 13, XPosCon GET #4, 14, XNegCon GET #4, 15, YPosCon GET #4, 16, YNegCon GET #4, 17, AvgSw GET #4, 18, AvgIdx GET #4, 19, AvgTrg GET #4, 20, Lx GET #4, 21, Mxmisfrms GET #4, 22, MvLimit GET #4, 23, QMode GET #4, 24, BPPix GET #4, 25, SetNumH IF QDataC = 1 THEN IF Lx = 1 THEN COM$ = "COM1: 9600,N,8,1,CD0,CS0,DS0,RS" 'LX200 port only ELSE COM$ = "COM1: 300,N,8,1,BIN,RS,OP0,DS0" 'Activate the port for output END IF OPEN COM$ FOR RANDOM AS #1 PRINT #1, Null; 'clear the serial port END IF IF QDataC = 2 THEN IF Lx = 1 THEN COM$ = "COM2: 9600,N,8,1,CD0,CS0,DS0,RS" 'LX200 port only ELSE COM$ = "COM2: 300,N,8,1,BIN,RS,OP0,DS0" END IF OPEN COM$ FOR RANDOM AS #1 PRINT #1, Null; 'clear any garbage on the port END IF DEF SEG = &H40 'Get the address of the LPT1 port IF QDataP = 1 THEN LData = PEEK(&H8) + (PEEK(&H9) * &H100) ELSE LData = PEEK(&HA) + (PEEK(&HB) * &H100) END IF DEF SEG ELSE QDataC = 0 'make sure the do loop works DO 'Get the serial port number LOCATE 13, 19: PRINT "The only valid Serial Port numbers are 1 or 2" LData = 1 LOCATE 11, 11: INPUT "Which Serial Port do you want to use for the autoguider? ", QDataC IF QDataC = 1 THEN COM$ = "COM1: 300,N,8,1,BIN,RS,OP0,DS0" OPEN COM$ FOR RANDOM AS #1 PRINT #1, Null; 'clear the serial port END IF IF QDataC = 2 THEN COM$ = "COM2: 300,N,8,1,BIN,RS,OP0,DS0" OPEN COM$ FOR RANDOM AS #1 PRINT #1, Null; 'clear the serial port END IF IF (QDataC <> 1) AND (QDataC <> 2) THEN LOCATE 19, 33: PRINT "Not a valid port address at that location!" SOUND 1800, 4 END IF LOOP WHILE QDataC <> 1 AND QDataC <> 2 LOCATE 19, 33: PRINT " " QDataP = 0 'make sure the do loop works DO LOCATE 13, 19: PRINT "The only valid Parallel Port numbers are 1 or 2" LOCATE 11, 11: INPUT "Which Parallel Port do you want to use for the autoguider? ", QDataP DEF SEG = &H40 IF QDataP = 1 THEN LData = PEEK(&H8) + (PEEK(&H9) * &H100) ELSE LData = PEEK(&HA) + (PEEK(&HB) * &H100) END IF IF (QDataP <> 1) AND (QDataP <> 2) THEN LOCATE 19, 33: PRINT "Not a valid port address at that location!" SOUND 1800, 4 END IF DEF SEG LOOP WHILE (QDataP <> 1) AND (QDataP <> 2) LOCATE 13, 19: PRINT " " LOCATE 11, 11: PRINT " " LOCATE 19, 33: PRINT " " END IF CLOSE #4 LStatus = LData + 1: LControl = LData + 2 timeIt = TIMER + 2 'get the time and increment by 2 seconds for checking SELECT CASE Ysw CASE IS = 0 'Y reversed YPos = 0: YPos = YPos XOR 8 YNeg = 0: YNeg = YNeg XOR 4 ' LOCATE 26, 44: PRINT "Y Toggle Reversed"; CASE IS = 1 'Y normal YPos = 0: YPos = YPos XOR 4 YNeg = 0: YNeg = YNeg XOR 8 ' LOCATE 26, 44: PRINT "Y Toggle Normal "; CASE IS = 2 'Y control off YPos = 0: YNeg = 0 'turn off the Y control. ' LOCATE 26, 44: PRINT "Y Toggle Off "; CASE ELSE END SELECT DReset LCommand = &HD 'try and detect the camera OUT LData, LCommand AMilliSecs = 5 delay OUT LControl, &H6 delay OUT LControl, &HE delay LCommand = &H17 OUT LControl, &H6 delay OUT LControl, &HE delay OUT LData, &H11 AMilliSecs = 5 delay 'delay for 5 counts OUT LControl, &H6 FOR Iv = 1 TO 32700 Ix = 0 IF (&H8 AND INP(LStatus)) = 0 THEN Ix = 1 END IF NEXT Iv IF Ix = 1 THEN Icamon = 0 'loop timeout indicates no camera found END IF hi = &HF0 AND INP(LStatus) 'and status reg with F0 for the 4 bits OUT LControl, &HE 'toggle the ack bit back again delay FOR Iv = 1 TO 32700 Ix = 0 IF (&H8 AND INP(LStatus)) <> 0 THEN Ix = 1 END IF NEXT Iv IF Ix = 1 THEN Icamon = 0 'loop timeout indicates no camera found screenboxes END IF END SUB SUB LimitAbort IF TrkSw = 1 THEN MvlimitCtr = MvlimitCtr + 1 'about on second move > Mvlimit pixels IF MvlimitCtr < 2 THEN EXIT SUB IF Lx <> 1 THEN PRINT #1, Null; 'clear the serial port ELSE IF SData = 1 THEN PRINT #1, "#:Qw#"; 'stop W IF SData = 2 THEN PRINT #1, "#:Qe#"; 'stop E IF SData = 4 THEN PRINT #1, "#:Qs#"; 'stop S IF SData = 8 THEN PRINT #1, "#:Qn#"; 'stop N END IF SOUND 400, 5 LOCATE ITrkErrLn + 1, 63: PRINT "ABORTED" LOCATE ITrkErrLn + 1, 44 PRINT "Tracking Off" LOCATE 29, 42 PRINT "Guide Abort 2nd Move > limit of "; PRINT USING "## "; MvLimit; TrkSw = 0 Xerror = 0 Yerror = 0 dx = 0 Dy = 0 Nchr = 0 END IF END SUB SUB mouse IF MouseSw = 0 THEN EXIT SUB 'MouseSw = 0 says mouse not found on init CALL INTERRUPT(&H33, inregs, outregs) END SUB SUB scanfield 'scan in the image into the display IF IChange <> 0 THEN 'else change the size to the next size LINE (Col, Row)-(EndCol, EndRow), 0, BF 'clearscreen FOR Iv = -1 TO 241 'clear image arrays on size change FOR ih = -1 TO 321 img2(Iv, ih) = 0 img3(Iv, ih) = 0 NEXT ih NEXT Iv IF Isize = 3 THEN 'define large area - full image pixelsperline = 320 'number of pixels in a line left = 2 setnumv = 240 'num lines topline = 2 inregs.ax = 7 ' limit mouse x-axis inregs.cx = 44 inregs.dx = 284 mouse inregs.ax = 8 ' limit mouse y-axis inregs.cx = 44 inregs.dx = 204 mouse inregs.ax = 1: mouse ELSEIF Isize = 2 THEN 'medium sized image - 80 X 80 pixels pixelsperline = 80 left = XGoal - (pixelsperline \ 2) setnumv = 80 topline = Ygoal - (setnumv \ 2) ELSEIF Isize = 1 THEN 'small sized image 36x36 pixel image pixelsperline = 40 left = XGoal - (pixelsperline \ 2) setnumv = 40 topline = Ygoal - (setnumv \ 2) inregs.ax = 7 ' limit mouse x-axis inregs.cx = 22 inregs.dx = 304 mouse inregs.ax = 8 ' limit mouse y-axis inregs.cx = 22 inregs.dx = 222 mouse inregs.ax = 1: mouse ELSEIF Isize = 0 THEN 'small sized image 16 X 16 pixel image pixelsperline = 16 left = XGoal - (pixelsperline \ 2) setnumv = 16 topline = Ygoal - (setnumv \ 2) inregs.ax = 7 ' limit mouse x-axis inregs.cx = 16 inregs.dx = 314 mouse inregs.ax = 8 ' limit mouse y-axis inregs.cx = 16 inregs.dx = 230 mouse inregs.ax = 1: mouse END IF SetNumH = pixelsperline * BPPix \ BPTx \ DecmFact setleft = left \ 2 + 6 settopln = topline IChange = 0 END IF IF DoDkCapF = 1 THEN 'get a full frame dark pixelsperline = 320 'number of pixels in a line left = 2 setnumv = 240 'num lines topline = 2 SetNumH = pixelsperline * BPPix \ BPTx \ DecmFact setleft = left \ 2 + 6 settopln = topline IChange = 1 'set flag so we return to the set size END IF Xfer = (pixelsperline * BPPix) \ BPTx 'StartRead get an image IF KKey = 0 THEN 'Skip delay if update because of keystroke Ticks = WaitTime ClkTicks END IF Xp = 0: Yp = 0: Xt = 0: Yt = 0: NT = 0 'reset the star finder vars DSetup 'setup the camera paramaters LOCATE 17, 12: PRINT "Exp" Ticks = QExp \ 14 'delay for exposure time so you get the ClkTicks 'correct image and past 255 do bulb exp. LOCATE 17, 12: PRINT " " LCommand = &H7: DCommand LCommand = QMode: DCommand 'read raw nibbles from the camera FOR Iv = 1 TO setnumv STEP DecmFact FOR ih = 1 TO Xfer STEP DecmFact 'Read a line IF Icamon = 1 THEN 'camera present? '2 reads of 4 bits for 4 bit mode produces 2 pixels OUT LControl, &H6 DO WHILE (&H8 AND INP(LStatus)) = 0 'get the Hi nibble LOOP hi = (INP(LStatus) AND &HF0) OUT LControl, &HE DO WHILE (&H8 AND INP(LStatus)) <> 0 'get the Lo nibble LOOP lo = (INP(LStatus) AND &HF0) \ 16 IF BPPix <> 2 THEN hi = lookup(hi \ 16) lo = lookup(lo) IF floor > 0 THEN 'clip to floor value IF hi < floor THEN hi = 0 END IF IF lo < floor THEN lo = 0 END IF END IF IF Boost <> 1 THEN hi = hi * Boost 'Multiply by boost value lo = lo * Boost IF hi > 15 THEN hi = 15 END IF IF lo > 15 THEN lo = 15 END IF END IF img2(Iv, ih * 2 - 1) = hi img2(Iv, ih * 2) = lo IF SavBufSw = 1 THEN 'Copy array for 3X3 matrix operation img3(Iv, ih * 2 - 1) = hi img3(Iv, ih * 2) = lo END IF IF DoDkCapF = 1 THEN 'move the data to the darkframe buffer dark1(Iv, ih * 2 - 1) = hi dark1(Iv, ih * 2) = lo END IF ELSE Img1(1) = hi + lo 'Combine into first of 3 bytes for 6 bit read OUT LControl, &H6 DO WHILE (&H8 AND INP(LStatus)) = 0 'get the Hi nibble LOOP hi = (INP(LStatus) AND &HF0) OUT LControl, &HE DO WHILE (&H8 AND INP(LStatus)) <> 0 'get the Lo nibble LOOP lo = (INP(LStatus) AND &HF0) \ 16 Img1(2) = hi + lo 'Combine into second of 3 bytes for 6 bit read OUT LControl, &H6 DO WHILE (&H8 AND INP(LStatus)) = 0 'get the Hi nibble LOOP hi = (INP(LStatus) AND &HF0) OUT LControl, &HE DO WHILE (&H8 AND INP(LStatus)) <> 0 'get the Lo nibble LOOP lo = (INP(LStatus) AND &HF0) \ 16 Img1(3) = hi + lo 'Combine into third of 3 bytes for 6 bit read 'decode 3 bytes into 4 pixels hi = &H3F - (Img1(1) \ 4) 'low 2 bits first byte and 4 upper bits of 2nd byte lo = &H3F - (((Img1(1) AND &H3) * 16) OR (Img1(2) \ 16)) IF floor > 0 THEN IF hi < floor THEN hi = 0 END IF IF lo < floor THEN lo = 0 END IF END IF IF Boost <> 1 THEN hi = hi * Boost 'Multiply by boost value lo = lo * Boost IF hi > 63 THEN hi = 63 END IF IF lo > 63 THEN lo = 63 END IF END IF img2(Iv, ih * 4 - 3) = hi img2(Iv, ih * 4 - 2) = lo IF SavBufSw = 1 THEN 'Copy array for 3X3 matrix operation img3(Iv, ih * 4 - 3) = hi img3(Iv, ih * 4 - 2) = lo END IF IF DoDkCapF = 1 THEN 'Move the data to the darkframe buffer dark1(Iv, ih * 4 - 3) = hi dark1(Iv, ih * 4 - 2) = lo END IF 'low 4 bits of 2nd byte and upper 2 bits of byte 3 hi = &H3F - ((Img1(2) AND &HF) * 4) OR (Img1(3) \ 64) lo = &H3F - (Img1(3) AND &H3F) IF floor > 0 THEN IF hi < floor THEN hi = 0 END IF IF lo < floor THEN lo = 0 END IF END IF IF Boost <> 1 THEN hi = hi * Boost 'Multiply by boost value lo = lo * Boost IF hi > 63 THEN hi = 63 END IF IF lo > 63 THEN lo = 63 END IF END IF img2(Iv, ih * 4 - 1) = hi img2(Iv, ih * 4) = lo IF SavBufSw = 1 THEN 'Copy array for 3X3 matrix operation img3(Iv, ih * 4 - 1) = hi img3(Iv, ih * 4) = lo END IF IF DoDkCapF = 1 THEN 'Move the data to the darkframe buffer dark1(Iv, ih * 4 - 1) = hi dark1(Iv, ih * 4) = lo END IF END IF END IF NEXT ih NEXT Iv LineCtr = 0 OUT LControl, &H6 'send end of frame indication AMilliSecs = 5 delay OUT LControl, &HE FOR Iv = 1 TO setnumv STEP DecmFact ivv = Iv + topline '6 bit pixels are a 3 byte read for 4 pixels. FOR ih = 1 TO pixelsperline STEP DecmFact ih2 = ih + left IF DkF = 1 THEN 'If flag is set, do dark frame subtraction img2(Iv, ih) = img2(Iv, ih) - dark1((Iv + topline - 2), (ih + left - 2)) img3(Iv, ih) = img2(Iv, ih) IF img2(Iv, ih) < 0 THEN img2(Iv, ih) = 0 'limit to 0 for lower end img3(Iv, ih) = 0 END IF END IF IF FaintSw = 1 THEN 'Are we are doing image filtering? IF FilterSw = 1 THEN 'ST-4 style faint mode processing FaintSum = 0 FOR FaintY = -1 TO 1 FOR FaintX = -1 TO 1 FaintSum = FaintSum + img3((Iv + FaintY), (ih + FaintX)) NEXT FaintX NEXT FaintY IF FaintSum > 63 THEN FaintSum = 63 END IF img2(Iv, ih) = FaintSum END IF IF FilterSw = 2 THEN 'Al Kelly's kernel using median filter variables AKSum = 0 FOR MedianY = -1 TO 1 FOR MedianX = -1 TO 1 AKSum = AKSum + img3((Iv + MedianY), (ih + MedianX)) * AK(MedianY, MedianX) NEXT MedianX NEXT MedianY IF AKSum > 63 THEN AKSum = 63 END IF img2(Iv, ih) = AKSum 'Single Prec FP sum to integer image array END IF IF FilterSw = 3 THEN 'Median filter processing Sort(1) = img3((Iv - 1), (ih)) Sort(2) = img3(Iv, ih) Sort(3) = img3((Iv + 1), (ih)) IF Sort(2) > Sort(1) AND Sort(2) > Sort(3) THEN img2(Iv, ih) = ((Sort(1) + Sort(3)) \ 2) END IF END IF END IF IF PSetSw = 1 THEN IF BPPix = 2 THEN PSET (ih2, ivv), img2(Iv, ih) \ 4 hi = img2(Iv, ih) ELSE PSET (ih2, ivv), img2(Iv, ih) hi = img2(Iv, ih) END IF END IF IF ivv = Ygoal AND ih2 = XGoal THEN LOCATE 12, 78: PRINT USING "##"; hi; END IF IF Iv > 1 AND ih > 1 THEN IF NT < NTMax THEN IF hi > Threshold THEN NT = NT + 1 Xt = Xt + ih2 Yt = Yt + ivv END IF END IF END IF NEXT ih NEXT Iv LOCATE 29, 22: PRINT "PV > Threshold:"; USING "###"; NT; IF DoDkCapF = 1 THEN DoDkCapF = 0 DkCapF = 1 LOCATE ITrkErrLn + 4, 49: PRINT "Saved Sub OFF"; END IF inregs.ax = 3: mouse 'read the mouse IF outregs.bx = 1 THEN 'left button down ? IChange = 1 Xtemp = outregs.cx 'then set new X and Y goal Ytemp = outregs.dx XGoal = ((Xtemp \ 2) * 2) 'make goal divisable by 2 Ygoal = ((Ytemp \ 2) * 2) END IF LINE (XGoal, Ygoal - 3)-(XGoal, Ygoal + 3), 15 'draw the cross hair LINE (XGoal - 3, Ygoal)-(XGoal + 3, Ygoal), 15 IF NT > 0 AND NT < NTMax THEN Xp = Xt / NT 'get the average values of the points Yp = Yt / NT 'thus getting the center of the image LOCATE ITrkErrLn + 1, 63: PRINT "Lock " IF ITCirF = 1 THEN 'draw the circle if desired IF NT < 10 THEN NT = 10 'limit size of circle to displayable size IF Isize = 1 AND NT > 30 THEN NT = 30 IF Isize = 0 AND NT > 12 THEN NT = 12 IF NT > 50 THEN NT = 50 CIRCLE (Xp, Yp), NT \ 2, 14 END IF dx = XGoal - Xp Dy = Ygoal - Yp END IF IF TrkSw = 0 AND RecSw > 0 THEN PRINT #5, USING "+##.## +##.## notrk"; dx; Dy END IF IF NT >= NTMax THEN 'AUTOMATIC TRACKING COMP..too many points sound warning LOCATE ITrkErrLn + 1, 63: PRINT "No Lock" dx = 0 Dy = 0 END IF IF TrkSw = 1 THEN 'Move the motors for X and Y delta Skip if track is off LOCATE 7, 45: PRINT " "; LOCATE 8, 45: PRINT " "; LOCATE 9, 45: PRINT " "; LOCATE 10, 45: PRINT " "; LOCATE 11, 45: PRINT " "; IF NT > 0 AND NT < NTMax THEN MisFrms = 0 IF AvgSw = 1 THEN AvgExp = AvgExp + 1 AvgCtr = AvgCtr + 1 AvgPos(AvgCtr, 1) = dx AvgPos(AvgCtr, 2) = Dy LOCATE 29, 42: PRINT USING "## ####.## ####.## "; AvgCtr; AvgPos(AvgCtr, 1); AvgPos(AvgCtr, 2); IF AvgCtr = AvgIdx OR AvgCtr > AvgIdx THEN AvgCtr = 0 END IF LOCATE 18, 26: PRINT USING "####.##"; dx; Dy; ELSE MisFrms = MisFrms + 1 LOCATE ITrkErrLn + 1, 63: PRINT " " LOCATE ITrkErrLn + 1, 78: PRINT USING "##"; MisFrms END IF IF AvgSw = 1 AND AvgExp = AvgTrg THEN TotDx = 0 TotDy = 0 FOR AvgPtr = 1 TO AvgIdx TotDx = TotDx + AvgPos(AvgPtr, 1) TotDy = TotDy + AvgPos(AvgPtr, 2) IF RecSw > 0 THEN PRINT #5, USING "+##.## +##.## point"; AvgPos(AvgPtr, 1); AvgPos(AvgPtr, 2) END IF ' PRINT USING "+###.### "; AvgPos(AvgPtr, 1); AvgPos(AvgPtr, 2); AvgPtr; TotDx; TotDy; AvgCtr NEXT AvgPtr dx = TotDx / (AvgPtr - 1) Dy = TotDy / (AvgPtr - 1) ' PRINT USING "+###.### "; TotDx; TotDy; TotDx / (AvgPtr - 1); TotDy / (AvgPtr - 1); AvgPtr - 1 IF AvgCtr = AvgIdx OR AvgCtr > AvgIdx THEN AvgCtr = 0 LOCATE 29, 65: PRINT USING "####.##"; dx; Dy; LOCATE 18, 26: PRINT USING "####.##"; dx; Dy; ELSEIF AvgSw = 1 THEN checkey EXIT SUB END IF AvgExp = 0 Cs = COS(Angle) Sn = SIN(Angle) Xerror = dx * Cs + Dy * Sn Yerror = Dy * Cs - dx * Sn IF ABS(Xerror) > MvLimit OR ABS(Yerror) > MvLimit THEN LimitAbort EXIT SUB END IF IF ABS(Xerror) > DeadBand THEN LOCATE 9, 45: PRINT "Correcting" LOCATE 10, 46: PRINT "X of "; : PRINT USING "###.##"; Xerror; IF Xerror > 0 THEN 'check for polarity SData = XNeg 'we're ahead so slow down Nchr = (ABS(Xerror * XNegCon) * 30) ELSE SData = XPos Nchr = (ABS(Xerror * XPosCon) * 30) END IF SerialWrite END IF IF ABS(Yerror) > DeadBand THEN IF Ysw = 2 THEN 'no DEC tracking LOCATE 7, 45: PRINT "Ignoring"; LOCATE 8, 46: PRINT "Y of "; PRINT USING "###.##"; Yerror; ELSE LOCATE 7, 45: PRINT "Correcting" IF Yerror > 0 THEN 'positive error SData = YNeg Nchr = (ABS(Yerror * YNegCon) * 30) ELSEIF Yerror < 0 THEN SData = YPos Nchr = (ABS(Yerror * YPosCon) * 30) END IF YErOld = Yerror LOCATE 8, 46: PRINT "Y of "; PRINT USING "###.##"; Yerror; SerialWrite END IF END IF IF RecSw > 0 THEN IF AvgSw = 1 THEN PRINT #5, USING "+##.## +##.## avg"; dx; Dy ELSE PRINT #5, USING "+##.## +##.## trk"; dx; Dy END IF END IF ELSE LOCATE 18, 26: PRINT USING "####.##"; dx; Dy; END IF checkey END SUB SUB screenboxes LINE (Col - 1, Row - 1)-(EndCol + 1, EndRow + 1), 15, B 'draw the Image Display Box LINE (340, 205)-(639, 288), 11, B 'draw the Track Control Box ITrkErrLn = 14: ITrkErrLoc = 44 ITrkLn = ITrkErrLn LocTrackStatus = ITrkErrLoc LOCATE ITrkErrLn, ITrkErrLoc IF BPPix = 2 THEN PRINT "6 Bits Per Pixel" ELSE PRINT "4 Bits Per Pixel" END IF IF FaintSw = 1 THEN LOCATE ITrkErrLn, 63 IF FilterSw = 1 THEN PRINT "Faint Mode ON"; END IF IF FilterSw = 2 THEN PRINT "Al's Kernel ON"; END IF IF FilterSw = 3 THEN PRINT "Median Kernel ON"; END IF ELSE LOCATE ITrkErrLn, 63 PRINT "Image Filter OFF"; END IF LOCATE ITrkErrLn + 1, 44 'tracking on/off select IF TrkSw = 0 THEN PRINT "Tracking OFF"; IF TrkSw = 1 THEN PRINT "Tracking ON"; IF Isize = 0 THEN 'print the image capture size pixelsperline = 16 LOCATE ITrkErrLn + 2, 44 PRINT "16 X 16 Frame"; ELSEIF Isize = 1 THEN pixelsperline = 40 LOCATE ITrkErrLn + 2, 44 PRINT "40 X 40 Frame"; ELSEIF Isize = 2 THEN pixelsperline = 80 LOCATE ITrkErrLn + 2, 44 PRINT "80 X 80 Frame"; ELSEIF Isize = 3 THEN pixelsperline = 320 LOCATE ITrkErrLn + 2, 44 PRINT "Full Frame "; END IF LOCATE ITrkErrLn + 3, 63: PRINT "Avg Trigger " LOCATE ITrkErrLn + 3, 78: PRINT USING "##"; AvgTrg IF AvgSw = 1 THEN LOCATE ITrkErrLn + 2, 63 PRINT "Frame Avg ON " END IF IF AvgSw = 0 THEN LOCATE ITrkErrLn + 2, 63 PRINT "Frame Avg OFF" END IF LOCATE ITrkErrLn + 2, 78: PRINT USING "##"; AvgIdx IF DkCapF = 0 THEN 'check for a darkframe in memory LOCATE ITrkErrLn + 4, 44: PRINT "Dark Frame"; ELSE LOCATE ITrkErrLn + 4, 44: PRINT "Dark Saved Sub OFF"; END IF LOCATE ITrkErrLn + 4, 55 IF DkF = 0 THEN PRINT "Sub OFF"; ELSE IF DkCapF = 0 THEN 'check for a darkframe in memory PRINT "Missing"; DkF = 0 ELSE PRINT "Sub ON "; 'no dark found END IF END IF IF Lx = 0 THEN LOCATE 18, 63: PRINT "UART Interface " ELSE LOCATE 18, 63: PRINT "LX-200 Interface" END IF LOCATE ITrkErrLn + 3, 44 PRINT "Threshold Level "; : PRINT USING "##"; Threshold; LINE (1, EndRow + 9)-(EndCol + 1, 288), 11, B 'Camera Parameter box LINE (12, EndRow + 2)-STEP(16, 6), 0, BF 'brightness levels LINE (30, EndRow + 2)-STEP(16, 6), 1, BF LINE (48, EndRow + 2)-STEP(16, 6), 2, BF LINE (66, EndRow + 2)-STEP(16, 6), 3, BF LINE (84, EndRow + 2)-STEP(16, 6), 4, BF LINE (102, EndRow + 2)-STEP(16, 6), 5, BF LINE (120, EndRow + 2)-STEP(16, 6), 6, BF LINE (138, EndRow + 2)-STEP(16, 6), 7, BF LINE (156, EndRow + 2)-STEP(16, 6), 8, BF LINE (174, EndRow + 2)-STEP(16, 6), 9, BF LINE (192, EndRow + 2)-STEP(16, 6), 10, BF LINE (210, EndRow + 2)-STEP(16, 6), 11, BF LINE (228, EndRow + 2)-STEP(16, 6), 12, BF LINE (246, EndRow + 2)-STEP(16, 6), 13, BF LINE (264, EndRow + 2)-STEP(16, 6), 14, BF LINE (282, EndRow + 2)-STEP(16, 6), 15, BF LOCATE 17, 3 PRINT "Exposure Zero Gain X Y "; LOCATE 18, 2: PRINT USING "##.##"; QExp / 250; : PRINT " Sec."; PRINT USING "#######"; Qoffset; QContr; PRINT USING "####.##"; dx; Dy; LINE (340, 0)-(639, 195), 11, B 'Calibration parameter box LOCATE 2, 45: PRINT "X Calibration Seconds: "; XCalSec LOCATE 3, 45: PRINT "Y Calibration Seconds: "; YCalSec LOCATE 4, 45: PRINT "Deadband in Pixels : "; PRINT USING "##.#"; DeadBand; LOCATE 5, 45: PRINT "Aggressivness -9 to +9 :"; LOCATE 5, 69: PRINT USING "+##"; Aggressive; LOCATE 6, 45: PRINT "Delay added to Exp. Sec:"; LOCATE 6, 69: PRINT USING "###.##"; WaitTime / 18.2; IF Inif = 0 THEN 'make the X/Y control part only once LOCATE 7, 65: PRINT "-" LOCATE 11, 65: PRINT "+" SELECT CASE Ysw CASE 0 'reversed LOCATE 7, 69: PRINT "Y Reversed "; CASE 1 'normal LOCATE 7, 69: PRINT "Y Normal "; CASE 2 'off LOCATE 7, 69: PRINT "Y Off "; CASE ELSE END SELECT LOCATE 7, 66: PRINT CHR$(24) LOCATE 8, 66: PRINT CHR$(179); LOCATE 9, 66: PRINT CHR$(179); "Y" LOCATE 10, 66: PRINT CHR$(179); LOCATE 11, 66: PRINT CHR$(25) LOCATE 8, 70: PRINT "-" LOCATE 9, 70: PRINT CHR$(27); CHR$(196); CHR$(196); CHR$(196); CHR$(196); CHR$(196); CHR$(196); CHR$(45); CHR$(26) LOCATE 8, 78: PRINT "+" LOCATE 8, 74: PRINT "X" LOCATE 12, 59: PRINT "Cursor Pixel Value"; Inif = 1 END IF LINE (1, 298)-(639, 464), 11, B 'Control Keys Display Box LOCATE 20, 5: PRINT "Move the Scope Move image area" LOCATE 21, 7: PRINT CHR$(24); " Y Neg F3 Y-2"; LOCATE 22, 3: PRINT CHR$(27); "X Neg - X Pos"; CHR$(26); " F1 X-2 - X+2 F2"; LOCATE 23, 7: PRINT CHR$(25); " Y Pos F4 Y+2"; LINE (3, 300)-(161, 366), 11, B 'Box for the scope move LINE (163, 300)-(322, 366), 11, B 'Box for the image move LOCATE 24, 2: PRINT "E/e Exposure Up/Dn"; LOCATE 25, 2: PRINT "Z/z Zero Up/Dn"; LOCATE 26, 2: PRINT "G/g Gain Up/Dn"; LOCATE 27, 2: PRINT " "; LINE (3, 368)-(161, 432), 11, B LOCATE 24, 22: PRINT "X/x X Cal Up/Dn"; LOCATE 25, 22: PRINT "Y/y Y Cal Up/Dn"; LOCATE 26, 22: PRINT "D/d DeadBand Up/Dn"; LOCATE 27, 22: PRINT "v/V Aggressive U/D"; LINE (163, 368)-(322, 432), 11, B LOCATE 20, 42: PRINT "6/4 Pixel Depth N/n Red Mode Toggle"; LOCATE 21, 42: PRINT "T/t Track Toggle F/f Frame Sz Toggle"; LOCATE 22, 42: PRINT "W/w Delaytime U/D F8 Calibrate "; LOCATE 23, 42: PRINT "L/l Thr Lvl Up/Dn F9 Y Toggle "; LOCATE 24, 42: PRINT "H/h Help Screen F10 Take Darkframe "; LOCATE 25, 42: PRINT "J/j Dk Fr Toggle K/k Fr Avg Toggle "; LOCATE 26, 42: PRINT "I/i Avg Trig Up/Dn M/m Avg Cnt Up/Dn "; LOCATE 27, 42: PRINT "U/u UART or LX-200 R/r Rec. Centroid "; LOCATE 28, 42: PRINT "Esc Quit ^A Filter Toggle "; IF Icamon = 0 THEN LOCATE 28, 2: PRINT "CAMERA NOT FOUND RESTART PGM TO DETECT"; END IF END SUB SUB SerialWrite '1 character at 300 BPS UART clock rate is 1/30 of a second 'motor on time. This is async communications. .6 = clock ticks per 1/30 'second. Nchr = Nchr * (1 + Aggressive / 10) 'adjust move Aggressiveness IF Lx <> 1 THEN 'external UART controller PRINT #1, STRING$(Nchr, CHR$(SData)); PRINT #1, Null; ' LOCATE 29, 44: PRINT Nchr; CHR$(SData + 48); Ticks = Nchr * .6066 ClkTicks ELSE ' At 9600 bps, 10 characters or 100 bits takes about .01 sec to complete ' One clock tick is about .06 seconds so forget about the xmit time savedata = SData IF SData = 1 THEN B$ = "#:Mw#" 'start W IF SData = 2 THEN B$ = "#:Me#" 'start E IF SData = 4 THEN B$ = "#:Ms#" 'start S IF SData = 8 THEN B$ = "#:Mn#" 'start N PRINT #1, "#:RG#"; 'Guide speed only! PRINT #1, B$; 'Note ";" to suppress carriage return Ticks = Nchr * .6066 'wait time still based on 1/30 sec. ClkTicks 'wait IF SData = 1 THEN PRINT #1, "#:Qw#"; 'stop W IF SData = 2 THEN PRINT #1, "#:Qe#"; 'stop E IF SData = 4 THEN PRINT #1, "#:Qs#"; 'stop S IF SData = 8 THEN PRINT #1, "#:Qn#"; 'stop N " Ticks = 1 'wait one tick for motion to stop ClkTicks END IF END SUB SUB SetPallete 'change the palette between white and red Gamma = .9 FOR IP = 0 TO 15 x = IP / 15 Intens = 63 * (x ^ Gamma) PALETTE IP, 65536 * Intens + 256 * Intens + Intens IF RedSw = 1 THEN Intens = Intens * 31 / 47 PALETTE IP, 65536 * 1 + 256 * 1 + Intens END IF NEXT IP END SUB