////////////////////////////////////////////////////////////////////////// // DCC++ CONTROLLER: Configuration and Initialization // // * Defines all global variables and objects // // * Reads and loads previous status data from status files // // * Implements track layout(s), throttles, track buttons, route buttons, // cab buttons, function buttons, windows, current meter, // and all other user-specified components // ////////////////////////////////////////////////////////////////////////// // DECLARE "GLOBAL" VARIABLES and OBJECTS PApplet Applet = this; // Refers to this program --- needed for Serial class int cursorType; String baseID; boolean keyHold=false; boolean saveXMLFlag=false; int lastTime; PFont throttleFont, messageFont, buttonFont; color backgroundColor; XML dccStatusXML, arduinoPortXML, sensorButtonsXML, autoPilotXML, cabDefaultsXML, serverListXML; DccComponent selectedComponent, previousComponent; ArrayList dccComponents = new ArrayList(); ArrayList cabButtons = new ArrayList(); ArrayList callBacks = new ArrayList(); ArrayList buttonQueue = new ArrayList(); ArrayList buttonQueue2 = new ArrayList(); HashMap remoteButtonsHM = new HashMap(); ArrayList msgAutoCab = new ArrayList(); HashMap sensorsHM = new HashMap(); HashMap cabsHM = new HashMap(); HashMap trackButtonsHM = new HashMap(); ArduinoPort aPort; PowerButton powerButton; AutoPilotButton autoPilot; CleaningCarButton cleaningCab; Throttle throttleA; Layout layout,layout2,layoutBridge; MessageBox msgBoxMain, msgBoxDiagIn, msgBoxDiagOut, msgBoxClock; CurrentMeter currentMeter; Window mainWindow, accWindow, progWindow, portWindow, extrasWindow, opWindow, diagWindow, autoWindow, sensorWindow, ledWindow; ImageWindow imageWindow; JPGWindow helpWindow; MessageBox msgAutoState, msgAutoTimer; InputBox activeInputBox; InputBox accAddInput, accSubAddInput; InputBox progCVInput, progHEXInput, progDECInput, progBINInput; InputBox opCabInput, opCVInput, opHEXInput, opDECInput, opBINInput, opBitInput; InputBox shortAddInput, longAddInput; MessageBox activeAddBox; MessageBox portBox, portNumBox; MessageBox ledHueMsg, ledSatMsg, ledValMsg, ledRedMsg, ledGreenMsg, ledBlueMsg; PortScanButton portScanButton; LEDColorButton ledColorButton; // DECLARE TRACK BUTTONS, ROUTE BUTTONS, and CAB BUTTONS WHICH WILL BE DEFINED BELOW AND USED "GLOBALLY" TrackButton tButton1,tButton2,tButton3,tButton4,tButton5; TrackButton tButton6,tButton7,tButton8,tButton9,tButton10; TrackButton tButton20,tButton30,tButton40,tButton50; RouteButton rButton1,rButton2,rButton3,rButton4,rButton5,rButton6,rButton7; RouteButton rButton10,rButton11,rButton12,rButton13,rButton14; RouteButton rButtonR1,rButtonR2,rButton15,rButton16,rButton17,rButtonSpiral,rButtonReset,rButtonBridge; CabButton cab8601,cab54,cab1202,cab1506,cab622,cab2004,cab6021; //////////////////////////////////////////////////////////////////////// // Initialize --- configures everything! //////////////////////////////////////////////////////////////////////// void Initialize(){ colorMode(RGB,255); throttleFont=loadFont("OCRAExtended-26.vlw"); messageFont=loadFont("LucidaConsole-18.vlw"); buttonFont=loadFont("LucidaConsole-18.vlw"); rectMode(CENTER); textAlign(CENTER,CENTER); backgroundColor=color(50,50,60); aPort=new ArduinoPort(); // READ, OR CREATE IF NEEDED, XML DCC STATUS FILE dccStatusXML=loadXML(STATUS_FILE); if(dccStatusXML==null){ dccStatusXML=new XML("dccStatus"); } arduinoPortXML=dccStatusXML.getChild("arduinoPort"); if(arduinoPortXML==null){ arduinoPortXML=dccStatusXML.addChild("arduinoPort"); arduinoPortXML.setContent("Emulator"); } serverListXML=dccStatusXML.getChild("serverList"); if(serverListXML==null){ serverListXML=dccStatusXML.addChild("serverList"); serverListXML.setContent("127.0.0.1"); } sensorButtonsXML=dccStatusXML.getChild("sensorButtons"); if(sensorButtonsXML==null){ sensorButtonsXML=dccStatusXML.addChild("sensorButtons"); } autoPilotXML=dccStatusXML.getChild("autoPilot"); if(autoPilotXML==null){ autoPilotXML=dccStatusXML.addChild("autoPilot"); } cabDefaultsXML=dccStatusXML.getChild("cabDefaults"); if(cabDefaultsXML==null){ cabDefaultsXML=dccStatusXML.addChild("cabDefaults"); } saveXMLFlag=true; // CREATE THE ACCESSORY CONTROL WINDOW accWindow = new Window(500,200,300,160,color(200,200,200),color(200,50,50)); new DragBar(accWindow,0,0,300,10,color(200,50,50)); new CloseButton(accWindow,288,0,10,10,color(200,50,50),color(255,255,255)); new MessageBox(accWindow,150,22,0,0,color(200,200,200),20,"Accessory Control",color(200,50,50)); new MessageBox(accWindow,20,60,-1,0,color(200,200,200),16,"Acc Address (0-511):",color(200,50,50)); accAddInput = new InputBox(accWindow,230,60,16,color(200,200,200),color(50,50,200),3,InputType.DEC); new MessageBox(accWindow,20,90,-1,0,color(200,200,200),16,"Sub Address (0-3):",color(200,50,50)); accSubAddInput = new InputBox(accWindow,230,90,16,color(200,200,200),color(50,50,200),1,InputType.DEC); new AccessoryButton(accWindow,90,130,55,25,100,18,"ON",accAddInput,accSubAddInput); new AccessoryButton(accWindow,210,130,55,25,0,18,"OFF",accAddInput,accSubAddInput); accAddInput.setNextBox(accSubAddInput); accSubAddInput.setNextBox(accAddInput); // CREATE THE SERIAL PORT WINDOW portWindow = new Window(500,200,500,170,color(200,200,200),color(200,50,50)); new DragBar(portWindow,0,0,500,10,color(200,50,50)); new CloseButton(portWindow,488,0,10,10,color(200,50,50),color(255,255,255)); new MessageBox(portWindow,250,22,0,0,color(200,200,200),20,"Select Arduino Port",color(200,50,50)); portScanButton = new PortScanButton(portWindow,100,60,85,20,100,18,"SCAN"); new PortScanButton(portWindow,400,60,85,20,0,18,"CONNECT"); new PortScanButton(portWindow,120,140,15,20,120,18,"<"); new PortScanButton(portWindow,380,140,15,20,120,18,">"); portBox = new MessageBox(portWindow,250,100,380,25,color(250,250,250),20,"",color(50,150,50)); portBox.setMessage("Please press SCAN",color(150,50,50)); portNumBox = new MessageBox(portWindow,250,140,0,0,color(200,200,200),20,"",color(50,50,50)); // CREATE THE PROGRAMMING CVs ON THE PROGRAMMING TRACK WINDOW progWindow = new Window(500,100,500,400,color(200,180,200),color(50,50,200)); new DragBar(progWindow,0,0,500,10,color(50,50,200)); new CloseButton(progWindow,488,0,10,10,color(50,50,200),color(255,255,255)); new RectButton(progWindow,250,30,210,30,40,color(0),18,"Programming Track",ButtonType.TI_COMMAND,101); new MessageBox(progWindow,20,90,-1,0,color(200,180,200),16,"CV (1-1024):",color(50,50,200)); new MessageBox(progWindow,20,130,-1,0,color(200,180,200),16,"Value (HEX):",color(50,50,200)); new MessageBox(progWindow,20,160,-1,0,color(200,180,200),16,"Value (DEC):",color(50,50,200)); new MessageBox(progWindow,20,190,-1,0,color(200,180,200),16,"Value (BIN):",color(50,50,200)); progCVInput = new InputBox(progWindow,150,90,16,color(200,180,200),color(200,50,50),4,InputType.DEC); progHEXInput = new InputBox(progWindow,150,130,16,color(200,180,200),color(200,50,50),2,InputType.HEX); progDECInput = new InputBox(progWindow,150,160,16,color(200,180,200),color(200,50,50),3,InputType.DEC); progBINInput = new InputBox(progWindow,150,190,16,color(200,180,200),color(200,50,50),8,InputType.BIN); progCVInput.setNextBox(progHEXInput); progHEXInput.setNextBox(progDECInput); progDECInput.setNextBox(progBINInput); progDECInput.linkBox(progHEXInput); progBINInput.setNextBox(progHEXInput); progBINInput.linkBox(progHEXInput); new ProgWriteReadButton(progWindow,300,90,65,25,100,14,"READ",progCVInput,progHEXInput); new ProgWriteReadButton(progWindow,390,90,65,25,0,14,"WRITE",progCVInput,progHEXInput); new MessageBox(progWindow,20,240,-1,0,color(200,180,200),16,"ENGINE ADDRESSES",color(50,50,200)); new MessageBox(progWindow,20,280,-1,0,color(200,180,200),16,"Short (1-127):",color(50,50,200)); new MessageBox(progWindow,20,310,-1,0,color(200,180,200),16,"Long (0-10239):",color(50,50,200)); new MessageBox(progWindow,20,340,-1,0,color(200,180,200),16,"Active :",color(50,50,200)); shortAddInput = new InputBox(progWindow,190,280,16,color(200,180,200),color(200,50,50),3,InputType.DEC); longAddInput = new InputBox(progWindow,190,310,16,color(200,180,200),color(200,50,50),5,InputType.DEC); activeAddBox = new MessageBox(progWindow,190,340,-1,0,color(200,180,200),16,"?",color(200,50,50)); new ProgAddReadButton(progWindow,300,240,65,25,100,14,"READ",shortAddInput,longAddInput,activeAddBox); new ProgShortAddWriteButton(progWindow,300,280,65,25,0,14,"WRITE",shortAddInput); new ProgLongAddWriteButton(progWindow,300,310,65,25,0,14,"WRITE",longAddInput); new ProgLongShortButton(progWindow,300,340,65,25,0,14,"Long",activeAddBox); new ProgLongShortButton(progWindow,390,340,65,25,0,14,"Short",activeAddBox); // CREATE THE PROGRAMMING CVs ON THE MAIN OPERATIONS TRACK WINDOW opWindow = new Window(500,100,500,300,color(220,200,200),color(50,50,200)); new DragBar(opWindow,0,0,500,10,color(50,50,200)); new CloseButton(opWindow,488,0,10,10,color(50,50,200),color(255,255,255)); new MessageBox(opWindow,250,30,0,0,color(220,200,200),20,"Operations Programming",color(50,100,50)); new MessageBox(opWindow,20,90,-1,0,color(220,200,200),16,"Cab Number :",color(50,50,200)); new MessageBox(opWindow,20,120,-1,0,color(220,200,200),16,"CV (1-1024):",color(50,50,200)); new MessageBox(opWindow,20,160,-1,0,color(220,200,200),16,"Value (HEX):",color(50,50,200)); new MessageBox(opWindow,20,190,-1,0,color(220,200,200),16,"Value (DEC):",color(50,50,200)); new MessageBox(opWindow,20,220,-1,0,color(220,200,200),16,"Value (BIN):",color(50,50,200)); opCabInput = new InputBox(opWindow,150,90,16,color(220,200,200),color(200,50,50),5,InputType.DEC); opCVInput = new InputBox(opWindow,150,120,16,color(220,200,200),color(200,50,50),4,InputType.DEC); opHEXInput = new InputBox(opWindow,150,160,16,color(220,200,200),color(200,50,50),2,InputType.HEX); opDECInput = new InputBox(opWindow,150,190,16,color(220,200,200),color(200,50,50),3,InputType.DEC); opBINInput = new InputBox(opWindow,150,220,16,color(220,200,200),color(200,50,50),8,InputType.BIN); opCVInput.setNextBox(opHEXInput); opHEXInput.setNextBox(opDECInput); opDECInput.setNextBox(opBINInput); opDECInput.linkBox(opHEXInput); opBINInput.setNextBox(opHEXInput); opBINInput.linkBox(opHEXInput); new OpWriteButton(opWindow,300,90,65,25,0,14,"WRITE",opCVInput,opHEXInput); new MessageBox(opWindow,20,260,-1,0,color(220,200,200),16," Bit (0-7):",color(50,50,200)); opBitInput = new InputBox(opWindow,150,260,16,color(220,200,200),color(200,50,50),1,InputType.DEC); new OpWriteButton(opWindow,300,260,65,25,50,14,"SET",opCVInput,opBitInput); new OpWriteButton(opWindow,390,260,65,25,150,14,"CLEAR",opCVInput,opBitInput); // CREATE THE DCC++ CONTROL <-> DCC++ BASE STATION COMMUNICATION DIAGNOSTICS WINDOW diagWindow = new Window(400,300,500,120,color(175),color(50,200,50)); new DragBar(diagWindow,0,0,500,10,color(50,200,50)); new CloseButton(diagWindow,488,0,10,10,color(50,200,50),color(255,255,255)); new MessageBox(diagWindow,250,20,0,0,color(175),18,"Diagnostics Window",color(50,50,200)); new MessageBox(diagWindow,10,60,-1,0,color(175),18,"Sent:",color(50,50,200)); msgBoxDiagOut=new MessageBox(diagWindow,250,60,0,0,color(175),18,"---",color(50,50,200)); new MessageBox(diagWindow,10,90,-1,0,color(175),18,"Proc:",color(50,50,200)); msgBoxDiagIn=new MessageBox(diagWindow,250,90,0,0,color(175),18,"---",color(50,50,200)); // CREATE THE AUTOPILOT DIAGNOSTICS WINDOW autoWindow = new Window(400,300,500,330,color(175),color(50,200,50)); new DragBar(autoWindow,0,0,500,10,color(50,200,50)); new CloseButton(autoWindow,488,0,10,10,color(50,200,50),color(255,255,255)); new MessageBox(autoWindow,250,20,0,0,color(175),18,"AutoPilot Window",color(50,50,150)); msgAutoState=new MessageBox(autoWindow,0,180,-1,0,color(175),18,"?",color(50,50,250)); msgAutoTimer=new MessageBox(autoWindow,55,310,-1,0,color(175),18,"Timer =",color(50,50,250)); // CREATE THE SENSORS DIAGNOSTICS WINDOW sensorWindow = new Window(400,300,500,350,color(175),color(50,200,50)); new DragBar(sensorWindow,0,0,500,10,color(50,200,50)); new CloseButton(sensorWindow,488,0,10,10,color(50,200,50),color(255,255,255)); new MessageBox(sensorWindow,250,20,0,0,color(175),18,"Sensors Window",color(50,50,150)); // CREATE THE HELP WINDOW helpWindow=new JPGWindow("helpMenu.jpg",1000,650,100,50,color(0,100,0)); // CREATE THE EXTRAS WINDOW: extrasWindow = new Window(500,200,500,250,color(255,255,175),color(100,100,200)); new DragBar(extrasWindow,0,0,500,10,color(100,100,200)); new CloseButton(extrasWindow,488,0,10,10,color(100,100,200),color(255,255,255)); new MessageBox(extrasWindow,250,20,0,0,color(175),18,"Extra Functions",color(50,50,200)); // new RectButton(extrasWindow,260,80,120,50,85,color(0),16,"Sound\nEffects",0); // CREATE THE LED LIGHT-STRIP WINDOW: ledWindow = new Window(500,200,550,425,color(0),color(0,0,200)); new DragBar(ledWindow,0,0,550,10,color(0,0,200)); new CloseButton(ledWindow,538,0,10,10,color(0,0,200),color(200,200,200)); new MessageBox(ledWindow,275,20,0,0,color(175),18,"LED Light Strip",color(200,200,200)); ledColorButton=new LEDColorButton(ledWindow,310,175,30,201,0.0,0.0,1.0); new LEDColorSelector(ledWindow,150,175,100,ledColorButton); new LEDValSelector(ledWindow,50,330,200,30,ledColorButton); ledHueMsg = new MessageBox(ledWindow,360,80,-1,0,color(175),18,"Hue: -",color(200,200,200)); ledSatMsg = new MessageBox(ledWindow,360,115,-1,0,color(175),18,"Sat: -",color(200,200,200)); ledValMsg = new MessageBox(ledWindow,360,150,-1,0,color(175),18,"Val: -",color(200,200,200)); ledRedMsg = new MessageBox(ledWindow,360,185,-1,0,color(175),18,"Red: -",color(200,200,200)); ledGreenMsg = new MessageBox(ledWindow,360,220,-1,0,color(175),18,"Green: -",color(200,200,200)); ledBlueMsg = new MessageBox(ledWindow,360,255,-1,0,color(175),18,"Blue: -",color(200,200,200)); // CREATE TOP-OF-SCREEN MESSAGE BAR AND HELP BUTTON msgBoxMain=new MessageBox(width/2,12,width,25,color(200),20,"Searching for Base Station: "+arduinoPortXML.getContent(),color(30,30,150)); new HelpButton(width-50,12,22,22,150,20,"?"); // CREATE CLOCK msgBoxClock=new MessageBox(30,700,-100,30,backgroundColor,30,"00:00:00",color(255,255,255)); // CREATE POWER BUTTON, QUIT BUTTON, and CURRENT METER powerButton=new PowerButton(75,475,100,30,100,18,"POWER"); new QuitButton(200,475,100,30,250,18,"QUIT"); currentMeter = new CurrentMeter(25,550,150,100,675,5); // CREATE THROTTLE, DEFINE CAB BUTTONS, and SET FUNCTIONS FOR EACH CAB int tAx=175; int tAy=225; int rX=800; int rY=550; throttleA=new Throttle(tAx,tAy,1.3); cab2004 = new CabButton(tAx-125,tAy-150,50,30,150,15,2004,throttleA); cab2004.setThrottleDefaults(100,50,-50,-45); cab2004.functionButtonWindow(220,59,70,340,backgroundColor,backgroundColor); cab2004.setFunction(35,15,60,22,60,10,0,"Headlight",ButtonType.NORMAL,CabFunction.F_LIGHT); cab2004.setFunction(35,45,60,22,60,10,1,"Tailight",ButtonType.NORMAL,CabFunction.R_LIGHT); cab622 = new CabButton(tAx-125,tAy-100,50,30,150,15,622,throttleA); cab622.setThrottleDefaults(53,30,-20,-13); cab622.functionButtonWindow(220,59,70,340,backgroundColor,backgroundColor); cab622.setFunction(35,15,60,22,60,10,0,"Headlight",ButtonType.NORMAL,CabFunction.F_LIGHT); cab622.setFunction(35,45,60,22,60,10,1,"Tailight",ButtonType.NORMAL,CabFunction.R_LIGHT); cab8601 = new CabButton(tAx-125,tAy-50,50,30,150,15,8601,throttleA); cab8601.setThrottleDefaults(77,46,-34,-30); cab8601.functionButtonWindow(220,59,70,340,backgroundColor,backgroundColor); cab8601.setFunction(35,15,60,22,60,10,0,"Lights",ButtonType.NORMAL,CabFunction.F_LIGHT,CabFunction.R_LIGHT); cab6021 = new CabButton(tAx-125,tAy,50,30,150,15,6021,throttleA); cab6021.setThrottleDefaults(50,25,-25,-15); cab6021.functionButtonWindow(220,59,70,340,backgroundColor,backgroundColor); cab6021.setFunction(35,15,60,22,60,10,0,"Headlight",ButtonType.NORMAL,CabFunction.F_LIGHT); cab6021.setFunction(35,45,60,22,60,10,1,"Tailight",ButtonType.NORMAL,CabFunction.R_LIGHT); cab54 = new CabButton(tAx-125,tAy+50,50,30,150,15,54,throttleA); cab54.setThrottleDefaults(34,14,-5,-3); cab54.functionButtonWindow(220,59,70,340,backgroundColor,backgroundColor); cab54.setFunction(35,15,60,22,60,10,10,"Radiator\nFan",ButtonType.NORMAL); cab54.setFunction(35,45,60,22,60,10,11,"Air Fill\n/Release",ButtonType.ONESHOT); cab54.setFunction(35,75,60,22,60,10,14,"Passenger\nDep/Arr",ButtonType.ONESHOT); cab54.setFunction(35,105,60,22,60,10,18,"City\nSounds",ButtonType.ONESHOT); cab54.setFunction(35,135,60,22,60,10,19,"Farm\nSounds",ButtonType.ONESHOT); cab54.setFunction(35,165,60,22,60,10,21,"Lumber\nMill",ButtonType.ONESHOT); cab54.setFunction(35,195,60,22,60,10,20,"Industry\nSounds",ButtonType.ONESHOT); cab54.setFunction(35,225,60,22,60,10,13,"Crossing\nHorn",ButtonType.ONESHOT,CabFunction.S_HORN); cab54.setFunction(35,255,60,22,60,10,22,"Alternate\nHorn",ButtonType.NORMAL); cab54.setFunction(35,285,60,22,60,10,8,"Mute",ButtonType.NORMAL); cab54.functionButtonWindow(220,59,70,340,backgroundColor,backgroundColor); cab54.setFunction(35,15,60,22,60,10,0,"Headlight",ButtonType.NORMAL,CabFunction.F_LIGHT); cab54.setFunction(35,45,60,22,60,10,1,"Bell",ButtonType.NORMAL,CabFunction.BELL); cab54.setFunction(35,75,60,22,60,10,2,"Horn",ButtonType.HOLD,CabFunction.HORN); cab54.setFunction(35,105,60,22,60,10,3,"MARS\nLight",ButtonType.REVERSE,CabFunction.D_LIGHT); cab54.setFunction(35,135,16,22,60,10,9,"1",ButtonType.NORMAL); cab54.setFunction(14,135,16,22,60,10,5,"+",ButtonType.ONESHOT); cab54.setFunction(56,135,16,22,60,10,6,"-",ButtonType.ONESHOT); cab54.setFunction(35,165,60,22,60,10,15,"Freight\nDep/Arr",ButtonType.ONESHOT); cab54.setFunction(35,195,60,22,60,10,16,"Facility\nShop",ButtonType.ONESHOT); cab54.setFunction(35,225,60,22,60,10,17,"Crew\nRadio",ButtonType.ONESHOT); cab54.setFunction(35,255,60,22,60,10,7,"Coupler",ButtonType.ONESHOT); cab54.setFunction(35,285,60,22,60,10,4,"Dynamic\nBrake",ButtonType.NORMAL); cab54.setFunction(35,315,60,22,60,10,12,"Brake\nSqueal",ButtonType.ONESHOT); cab1202 = new CabButton(tAx-125,tAy+100,50,30,150,15,1202,throttleA); cab1202.setThrottleDefaults(34,25,-24,-18); cab1202.functionButtonWindow(220,59,70,340,backgroundColor,backgroundColor); cab1202.setFunction(35,15,60,22,60,10,0,"Headlight",ButtonType.NORMAL,CabFunction.F_LIGHT); cab1202.setFunction(35,45,60,22,60,10,1,"Tailight",ButtonType.NORMAL,CabFunction.R_LIGHT); cab1506 = new CabButton(tAx-125,tAy+150,50,30,150,15,1506,throttleA); cab1506.setThrottleDefaults(61,42,-30,-22); cab1506.functionButtonWindow(220,59,70,340,backgroundColor,backgroundColor); cab1506.setFunction(35,15,60,22,60,10,1,"Headlight",ButtonType.NORMAL,CabFunction.F_LIGHT); cab1506.setFunction(35,45,60,22,60,10,0,"Tailight",ButtonType.NORMAL,CabFunction.R_LIGHT); cab1506.setFunction(35,75,60,22,60,10,3,"D-Lights",ButtonType.NORMAL,CabFunction.D_LIGHT); // CREATE THE IMAGE WINDOW FOR THROTTLE A (must be done AFTER throttle A is defined above) imageWindow=new ImageWindow(throttleA,975,450,200,50,color(200,50,50)); // CREATE AUTO PILOT BUTTON and CLEANING CAR BUTTON (must be done AFTER cab buttons are defined above) autoPilot=new AutoPilotButton(325,550,100,50,30,18,"AUTO\nPILOT"); cleaningCab=new CleaningCarButton(extrasWindow,28,80,80,120,50,40,16,"Cleaning\nCar"); // CREATE MAIN LAYOUT AND DEFINE ALL TRACKS layout=new Layout(325,50,1000,80*25.4,36*25.4); Track bridgeA = new Track(layout,20,450,62,90); Track bridgeB = new Track(bridgeA,1,348,-90); Track bridgeC = new Track(bridgeB,1,399); Track t5A = new Track(bridgeC,1,126); Track loop3A = new Track(t5A,1,682); Track loop3B = new Track(loop3A,1,381,-180); Track loop3C = new Track(loop3B,1,124); Track t20A2 = new Track(loop3C,1,126); Track t20B2 = new Track(loop3C,1,481,15); Track t20B1 = new Track(t20B2,1,481,-15); Track loop2A3A = new Track(t20A2,1,120); Track t30A1 = new Track(loop2A3A,1,126); Track t30A2 = new Track(t30A1,1,126); Track t30B1 = new Track(loop2A3A,1,481,-15); Track t30B4 = new Track(t30B1,1,481,15); Track loop2C = new Track(t30A2,1,122); Track t10A3 = new Track(loop2C,1,126); Track t10B3 = new Track(loop2C,1,481,15); Track t10A4 = new Track(t10A3,1,126); Track t10B2 = new Track(t10B3,1,481,-15); Track loop2D = new Track(t10A4,1,62); Track loop2E = new Track(loop2D,1,315,-165); Track loop2F = new Track(loop2E,1,128); Track loop2G = new Track(loop2F,1,315,-15); Track loop2H = new Track(loop2G,1,742); Track t50A2 = new Track(loop2H,1,126); Track loop2A = new Track(t50A2,1,315,-180); Track loop2B = new Track(loop2A,1,308); Track t30A3 = new Track(loop2B,1,126); Track t30A4 = new Track(t30A3,1,126); Track t30B3 = new Track(loop2B,1,481,15); Track t30B2 = new Track(t30B3,1,481,-15); Track loop1A2A = new Track(t30A4,1,60); Track t40A1 = new Track(loop1A2A,1,126); Track loop1B = new Track(t40A1,1,248); Track loop1C = new Track(loop1B,1,282,-165); Track loop1D = new Track(loop1C,1,128); Track loop1E = new Track(loop1D,1,282,-15); Track t4A = new Track(loop1E,1,126); Track t4B = new Track(loop1E,1,481,-15); Track loop1F = new Track(t4A,1,494); Track t50A1 = new Track(loop1F,1,126); Track t50B1 = new Track(loop1F,1,481,15); Track t50B2 = new Track(t50B1,1,481,-15); Track loop1G = new Track(t50A1,1,122); Track loop1H = new Track(loop1G,1,282,-180); Track loop1I = new Track(loop1H,1,62); Track t1A = new Track(loop1I,1,126); Track t1B = new Track(loop1I,1,481,-15); Track loop1A = new Track(t1A,1,308); Track t40A2 = new Track(loop1A,1,126); Track t40B2 = new Track(loop1A,1,481,15); Track t40B1 = new Track(t40B2,1,481,-15); Track s1A = new Track(t40A2,1,60); Track s1B = new Track(s1A,1,481,-15); Track s1C = new Track(s1B,1,339); Track s1 = new Track(s1C,1,50); Track loop3D = new Track(t20B1,1,370); Track t20A1 = new Track(loop3D,0,126); Track t10A1 = new Track(loop3D,1,126); Track t10B1 = new Track(loop3D,1,481,-15); Track t10B4 = new Track(t10B1,1,481,15); Track t10A2 = new Track(t10A1,1,126); Track loop3E = new Track(t10A2,1,62); Track loop3F = new Track(loop3E,1,381,-180); Track loop3G = new Track(loop3F,1,124); Track loop3H = new Track(loop3G,1,481,15); Track t5B = new Track(loop3H,1,481,-15); Track s7A = new Track(t20A1,1,337); Track s7B = new Track(s7A,1,348,90); Track s7C = new Track(s7B,1,124); Track s7D = new Track(s7C,1,481,15); Track s7E = new Track(s7D,1,124); Track s7 = new Track(s7E,1,62); Track t2A = new Track(t1B,1,126); Track t2B = new Track(t1B,1,481,-15); Track s2_3_4_5A = new Track(t2A,1,64); Track t3A = new Track(s2_3_4_5A,1,126); Track t3B = new Track(s2_3_4_5A,1,481,15); Track s2A = new Track(t3B,1,30); Track s2B = new Track(s2A,1,481,15); Track s2C = new Track(s2B,1,481,-30); Track s2D = new Track(s2C,1,248); Track s2 = new Track(s2D,1,50); Track t6A = new Track(t3A,1,126); Track t6B = new Track(t3A,1,481,-15); Track s3A = new Track(t6A,1,556); Track s3 = new Track(s3A,1,50); Track t9A = new Track(t6B,1,126); Track t9B = new Track(t6B,1,481,15); Track s4A = new Track(t9B,1,479); Track s4 = new Track(s4A,1,50); Track s5A = new Track(t9A,1,481,15); Track s5B = new Track(s5A,1,341); Track s5 = new Track(s5B,1,50); Track rLoopA = new Track(t4B,1,282,-45); Track rLoopB = new Track(rLoopA,1,87); Track t7A = new Track(rLoopB,1,126); Track t7B = new Track(rLoopB,1,481,15); Track rLoopC = new Track(t7A,1,481,15); Track rLoopD = new Track(rLoopC,1,425,15); Track s6A = new Track(t7B,1,60); Track s6B = new Track(s6A,1,282,45); Track s6C = new Track(s6B,1,481,30); Track s6D = new Track(s6C,1,188); Track s6 = new Track(s6D,1,50); Track bridgeD = new Track(bridgeA,0,348,60); // CREATE SECOND LAYOUT FOR SKY BRIDGE AND DEFINE TRACKS layout2=new Layout(325,500,400,80*25.4,36*25.4); layoutBridge=new Layout(layout2); Track bridgeE = new Track(bridgeD,1,348,60,layoutBridge); Track bridgeF = new Track(bridgeE,1,248); Track t8A = new Track(bridgeF,1,200); Track t8B = new Track(bridgeF,1,400,-35); Track bridgeG = new Track(t8A,1,618); Track bridgeH = new Track(bridgeG,1,282,-226); Track bridgeI = new Track(bridgeH,1,558); // DEFINE SENSORS, MAP TO ARDUINO NUMBERS, AND INDICATE THEIR TRACK LOCATIONS new TrackSensor(loop3B,1,30,20,20,1,false); // mappings from Sensor numbers (1..N) to Arduino Pins new TrackSensor(t50A2,1,315,-174,20,20,2,false); new TrackSensor(loop2D,1,315,-47,20,20,3,false); new TrackSensor(loop1B,1,282,-45,20,20,4,false); new TrackSensor(loop3E,1,381,-45,20,20,5,false); new TrackSensor(bridgeA,1,348,-10,20,20,6,false); new TrackSensor(s1A,1,481,-5,20,20,7,true); new TrackSensor(s2B,1,481,-5,20,20,8,true); new TrackSensor(t6A,1,175,20,20,9,true); new TrackSensor(s6A,1,282,10,20,20,10,true); new TrackSensor(loop1G,1,282,-137,20,20,11,false); new TrackSensor(t9B,1,100,20,20,12,true); new TrackSensor(s5A,1,30,20,20,13,true); new TrackSensor(s7A,1,348,50,20,20,14,true); // CREATE TURNOUT BUTTONS and ADD TRACKS FOR EACH TURNOUT tButton1 = new TrackButton(20,20,1); tButton1.addTrack(t1A,0); tButton1.addTrack(t1B,1); tButton2 = new TrackButton(20,82,2); tButton2.addTrack(t2A,0); tButton2.addTrack(t2B,1); tButton3 = new TrackButton(20,20,3); tButton3.addTrack(t3A,0); tButton3.addTrack(t3B,1); tButton4 = new TrackButton(20,20,4); tButton4.addTrack(t4A,0); tButton4.addTrack(t4B,1); tButton5 = new TrackButton(20,20,5); tButton5.addTrack(t5A,0); tButton5.addTrack(t5B,1); tButton6 = new TrackButton(20,20,6); tButton6.addTrack(t6A,0); tButton6.addTrack(t6B,1); tButton7 = new TrackButton(20,20,7); tButton7.addTrack(t7A,0); tButton7.addTrack(t7B,1); tButton8 = new TrackButton(20,20,8); tButton8.addTrack(t8A,0); tButton8.addTrack(t8B,1); tButton9 = new TrackButton(20,20,9); tButton9.addTrack(t9A,0); tButton9.addTrack(t9B,1); tButton10 = new TrackButton(20,20,10); tButton10.addTrack(t10A1,0); tButton10.addTrack(t10A2,0); tButton10.addTrack(t10A3,0); tButton10.addTrack(t10A4,0); tButton10.addTrack(t10B1,1); tButton10.addTrack(t10B2,1); tButton10.addTrack(t10B3,1); tButton10.addTrack(t10B4,1); tButton20 = new TrackButton(20,20,20); tButton20.addTrack(t20A1,0); tButton20.addTrack(t20A2,0); tButton20.addTrack(t20B1,1); tButton20.addTrack(t20B2,1); tButton30 = new TrackButton(20,20,30); tButton30.addTrack(t30A1,0); tButton30.addTrack(t30A2,0); tButton30.addTrack(t30A3,0); tButton30.addTrack(t30A4,0); tButton30.addTrack(t30B1,1); tButton30.addTrack(t30B2,1); tButton30.addTrack(t30B3,1); tButton30.addTrack(t30B4,1); tButton40 = new TrackButton(20,20,40); tButton40.addTrack(t40A1,0); tButton40.addTrack(t40A2,0); tButton40.addTrack(t40B1,1); tButton40.addTrack(t40B2,1); tButton50 = new TrackButton(20,20,50); tButton50.addTrack(t50A1,0); tButton50.addTrack(t50A2,0); tButton50.addTrack(t50B1,1); tButton50.addTrack(t50B2,1); // CREATE ROUTE BUTTONS and ADD TRACKS and TURNOUT BUTTONS rButton1 = new RouteButton(s1,20,20); rButton1.addTrackButton(tButton40,0); rButton1.addTrackButton(tButton1,0); rButton1.addTrack(t1A); rButton1.addTrack(loop1A); rButton1.addTrack(t40A2); rButton1.addTrack(s1A); rButton1.addTrack(s1B); rButton1.addTrack(s1C); rButton1.addTrack(s1); rButton2 = new RouteButton(s2,20,20); rButton2.addTrackButton(tButton3,1); rButton2.addTrackButton(tButton2,0); rButton2.addTrackButton(tButton1,1); rButton2.addTrack(t1B); rButton2.addTrack(t2A); rButton2.addTrack(s2_3_4_5A); rButton2.addTrack(t3B); rButton2.addTrack(s2A); rButton2.addTrack(s2B); rButton2.addTrack(s2C); rButton2.addTrack(s2D); rButton2.addTrack(s2); rButton3 = new RouteButton(s3,20,20); rButton3.addTrackButton(tButton6,0); rButton3.addTrackButton(tButton3,0); rButton3.addTrackButton(tButton2,0); rButton3.addTrackButton(tButton1,1); rButton3.addTrack(t1B); rButton3.addTrack(t2A); rButton3.addTrack(s2_3_4_5A); rButton3.addTrack(t3A); rButton3.addTrack(t6A); rButton3.addTrack(s3A); rButton3.addTrack(s3); rButton4 = new RouteButton(s4,20,20); rButton4.addTrackButton(tButton9,1); rButton4.addTrackButton(tButton6,1); rButton4.addTrackButton(tButton3,0); rButton4.addTrackButton(tButton2,0); rButton4.addTrackButton(tButton1,1); rButton4.addTrack(t1B); rButton4.addTrack(t2A); rButton4.addTrack(s2_3_4_5A); rButton4.addTrack(t3A); rButton4.addTrack(t6B); rButton4.addTrack(t9B); rButton4.addTrack(s4A); rButton4.addTrack(s4); rButton5 = new RouteButton(s5,20,20); rButton5.addTrackButton(tButton9,0); rButton5.addTrackButton(tButton6,1); rButton5.addTrackButton(tButton3,0); rButton5.addTrackButton(tButton2,0); rButton5.addTrackButton(tButton1,1); rButton5.addTrack(t1B); rButton5.addTrack(t2A); rButton5.addTrack(s2_3_4_5A); rButton5.addTrack(t3A); rButton5.addTrack(t6B); rButton5.addTrack(t9A); rButton5.addTrack(s5A); rButton5.addTrack(s5B); rButton5.addTrack(s5); rButton6 = new RouteButton(s6,20,20); rButton6.addTrackButton(tButton7,1); rButton6.addTrackButton(tButton4,1); rButton6.addTrack(t7B); rButton6.addTrack(t4B); rButton6.addTrack(rLoopA); rButton6.addTrack(rLoopB); rButton6.addTrack(s6A); rButton6.addTrack(s6B); rButton6.addTrack(s6C); rButton6.addTrack(s6D); rButton6.addTrack(s6); rButton7 = new RouteButton(s7,20,20); rButton7.addTrackButton(tButton20,0); rButton7.addTrackButton(tButton10,0); rButton7.addTrack(t20A1); rButton7.addTrack(t10A1); rButton7.addTrack(t10A2); rButton7.addTrack(s7A); rButton7.addTrack(s7B); rButton7.addTrack(s7C); rButton7.addTrack(s7D); rButton7.addTrack(s7E); rButton7.addTrack(s7); rButton7.addTrack(loop3D); rButton10 = new RouteButton(rX,rY,80,40,"Inner\nLoop"); rButton10.addTrackButton(tButton50,0); rButton10.addTrackButton(tButton1,0); rButton10.addTrackButton(tButton40,1); rButton10.addTrackButton(tButton4,0); rButton10.addTrack(t40B1); rButton10.addTrack(t40B2); rButton10.addTrack(t4A); rButton10.addTrack(t50A1); rButton10.addTrack(t1A); rButton10.addTrack(loop1A); rButton10.addTrack(loop1B); rButton10.addTrack(loop1C); rButton10.addTrack(loop1D); rButton10.addTrack(loop1E); rButton10.addTrack(loop1F); rButton10.addTrack(loop1G); rButton10.addTrack(loop1H); rButton10.addTrack(loop1I); rButton11 = new RouteButton(rX+200,rY,80,40,"Middle\nLoop"); rButton11.addTrackButton(tButton50,0); rButton11.addTrackButton(tButton30,1); rButton11.addTrackButton(tButton10,0); rButton11.addTrack(t50A2); rButton11.addTrack(t30B3); rButton11.addTrack(t30B2); rButton11.addTrack(t10A3); rButton11.addTrack(t10A4); rButton11.addTrack(loop2A); rButton11.addTrack(loop2B); rButton11.addTrack(loop2C); rButton11.addTrack(loop2D); rButton11.addTrack(loop2E); rButton11.addTrack(loop2F); rButton11.addTrack(loop2G); rButton11.addTrack(loop2H); rButton12 = new RouteButton(rX+400,rY,80,40,"Outer\nLoop"); rButton12.addTrackButton(tButton20,1); rButton12.addTrackButton(tButton5,1); rButton12.addTrackButton(tButton10,0); rButton12.addTrack(t20B2); rButton12.addTrack(t20B1); rButton12.addTrack(t10A1); rButton12.addTrack(t10A2); rButton12.addTrack(t5B); rButton12.addTrack(loop3A); rButton12.addTrack(loop3B); rButton12.addTrack(loop3C); rButton12.addTrack(loop3D); rButton12.addTrack(loop3E); rButton12.addTrack(loop3F); rButton12.addTrack(loop3G); rButton12.addTrack(loop3H); rButton13 = new RouteButton(rX+100,rY,80,40,"Inner/Mid"); rButton13.addTrackButton(tButton50,1); rButton13.addTrackButton(tButton30,0); rButton13.addTrackButton(tButton40,0); rButton13.addTrackButton(tButton4,0); rButton13.addTrack(t40A1); rButton13.addTrack(loop1B); rButton13.addTrack(loop1C); rButton13.addTrack(loop1D); rButton13.addTrack(loop1E); rButton13.addTrack(t4A); rButton13.addTrack(loop1F); rButton13.addTrack(t50B1); rButton13.addTrack(t50B2); rButton13.addTrack(loop2A); rButton13.addTrack(loop2B); rButton13.addTrack(t30A3); rButton13.addTrack(t30A4); rButton13.addTrack(loop1A2A); rButton14 = new RouteButton(rX+300,rY,80,40,"Mid/Outer"); rButton14.addTrackButton(tButton5,1); rButton14.addTrackButton(tButton20,0); rButton14.addTrackButton(tButton30,0); rButton14.addTrackButton(tButton10,1); rButton14.addTrack(t5B); rButton14.addTrack(loop3A); rButton14.addTrack(loop3B); rButton14.addTrack(loop3C); rButton14.addTrack(t20A2); rButton14.addTrack(loop2A3A); rButton14.addTrack(t30A1); rButton14.addTrack(t30A2); rButton14.addTrack(loop2C); rButton14.addTrack(t10B3); rButton14.addTrack(t10B2); rButton14.addTrack(loop3E); rButton14.addTrack(loop3F); rButton14.addTrack(loop3G); rButton14.addTrack(loop3H); rButtonR1 = new RouteButton(rX,rY+60,80,40,"Reverse+"); rButtonR1.addTrackButton(tButton4,1); rButtonR1.addTrackButton(tButton7,0); rButtonR1.addTrackButton(tButton1,0); rButtonR1.addTrack(t4B); rButtonR1.addTrack(rLoopA); rButtonR1.addTrack(rLoopB); rButtonR1.addTrack(t7A); rButtonR1.addTrack(t1A); rButtonR2 = new RouteButton(rX+100,rY+60,80,40,"Reverse-"); rButtonR2.addTrackButton(tButton1,1); rButtonR2.addTrackButton(tButton2,1); rButtonR2.addTrackButton(tButton4,0); rButtonR2.addTrack(t4A); rButtonR2.addTrack(t1B); rButtonR2.addTrack(t2B); rButtonR2.addTrack(rLoopC); rButtonR2.addTrack(rLoopD); rButton15 = new RouteButton(rX+200,rY+60,80,40,"Mid+Outer"); rButton15.addTrackButton(tButton5,1); rButton15.addTrackButton(tButton10,1); rButton15.addTrackButton(tButton20,1); rButton15.addTrackButton(tButton30,1); rButton15.addTrackButton(tButton50,0); rButton15.addTrack(t20B2); rButton15.addTrack(t20B1); rButton15.addTrack(t10B1); rButton15.addTrack(t10B2); rButton15.addTrack(t5B); rButton15.addTrack(loop3A); rButton15.addTrack(loop3B); rButton15.addTrack(loop3C); rButton15.addTrack(loop3D); rButton15.addTrack(loop3E); rButton15.addTrack(loop3F); rButton15.addTrack(loop3G); rButton15.addTrack(loop3H); rButton15.addTrack(t50A2); rButton15.addTrack(t30B3); rButton15.addTrack(t30B2); rButton15.addTrack(t10B3); rButton15.addTrack(t10B4); rButton15.addTrack(loop2A); rButton15.addTrack(loop2B); rButton15.addTrack(loop2C); rButton15.addTrack(loop2D); rButton15.addTrack(loop2E); rButton15.addTrack(loop2F); rButton15.addTrack(loop2G); rButton15.addTrack(loop2H); rButton16 = new RouteButton(rX+300,rY+60,80,40,"In+Outer"); rButton16.addTrackButton(tButton4,0); rButton16.addTrackButton(tButton5,1); rButton16.addTrackButton(tButton10,1); rButton16.addTrackButton(tButton20,0); rButton16.addTrackButton(tButton30,1); rButton16.addTrackButton(tButton40,0); rButton16.addTrackButton(tButton50,1); rButton16.addTrack(t40A1); rButton16.addTrack(loop1B); rButton16.addTrack(loop1C); rButton16.addTrack(loop1D); rButton16.addTrack(loop1E); rButton16.addTrack(t4A); rButton16.addTrack(loop1F); rButton16.addTrack(t50B1); rButton16.addTrack(t50B2); rButton16.addTrack(loop2A); rButton16.addTrack(loop2B); rButton16.addTrack(t30B1); rButton16.addTrack(t30B2); rButton16.addTrack(t30B3); rButton16.addTrack(t30B4); rButton16.addTrack(loop1A2A); rButton16.addTrack(t5B); rButton16.addTrack(loop3A); rButton16.addTrack(loop3B); rButton16.addTrack(loop3C); rButton16.addTrack(t20A2); rButton16.addTrack(loop2A3A); rButton16.addTrack(loop2C); rButton16.addTrack(t10B3); rButton16.addTrack(t10B2); rButton16.addTrack(loop3E); rButton16.addTrack(loop3F); rButton16.addTrack(loop3G); rButton16.addTrack(loop3H); rButton17 = new RouteButton(rX,rY+120,80,40,"Double X"); rButton17.addTrackButton(tButton5,0); rButton17.addTrackButton(tButton20,0); rButton17.addTrackButton(tButton30,1); rButton17.addTrackButton(tButton40,0); rButton17.addTrackButton(tButton50,0); rButton17.addTrackButton(tButton4,1); rButton17.addTrackButton(tButton7,0); rButton17.addTrackButton(tButton1,0); rButton17.addTrack(t4B); rButton17.addTrack(rLoopA); rButton17.addTrack(rLoopB); rButton17.addTrack(t7A); rButton17.addTrack(t1A); rButton17.addTrack(loop1B); rButton17.addTrack(loop1C); rButton17.addTrack(loop1D); rButton17.addTrack(loop1E); rButton17.addTrack(loop1F); rButton17.addTrack(loop1G); rButton17.addTrack(loop1H); rButton17.addTrack(loop1I); rButton17.addTrack(t50A1); rButton17.addTrack(t40A1); rButton17.addTrack(loop1A2A); rButton17.addTrack(t30B4); rButton17.addTrack(t30B1); rButton17.addTrack(loop3A); rButton17.addTrack(loop3B); rButton17.addTrack(loop3C); rButton17.addTrack(t20A2); rButton17.addTrack(loop2A3A); rButton17.addTrack(t5A); rButton17.addTrack(bridgeA); rButton17.addTrack(bridgeB); rButton17.addTrack(bridgeC); rButton17.addTrack(bridgeD); rButton17.addTrack(bridgeE); rButton17.addTrack(bridgeF); rButton17.addTrack(bridgeG); rButton17.addTrack(bridgeH); rButton17.addTrack(bridgeI); rButtonSpiral = new RouteButton(rX+100,rY+120,80,40,"Spiral"); rButtonSpiral.addTrackButton(tButton4,1); rButtonSpiral.addTrackButton(tButton5,0); rButtonSpiral.addTrackButton(tButton7,0); rButtonSpiral.addTrackButton(tButton1,0); rButtonSpiral.addTrackButton(tButton10,0); rButtonSpiral.addTrackButton(tButton20,0); rButtonSpiral.addTrackButton(tButton30,0); rButtonSpiral.addTrackButton(tButton40,0); rButtonSpiral.addTrackButton(tButton50,0); rButtonSpiral.addTrack(t4B); rButtonSpiral.addTrack(rLoopA); rButtonSpiral.addTrack(rLoopB); rButtonSpiral.addTrack(t7A); rButtonSpiral.addTrack(t1A); rButtonSpiral.addTrack(loop1B); rButtonSpiral.addTrack(loop1C); rButtonSpiral.addTrack(loop1D); rButtonSpiral.addTrack(loop1E); rButtonSpiral.addTrack(loop1F); rButtonSpiral.addTrack(loop1G); rButtonSpiral.addTrack(loop1H); rButtonSpiral.addTrack(loop1I); rButtonSpiral.addTrack(t50A1); rButtonSpiral.addTrack(t40A1); rButtonSpiral.addTrack(loop1A2A); rButtonSpiral.addTrack(t30A4); rButtonSpiral.addTrack(t30A3); rButtonSpiral.addTrack(t50A2); rButtonSpiral.addTrack(loop2A); rButtonSpiral.addTrack(loop2B); rButtonSpiral.addTrack(loop2C); rButtonSpiral.addTrack(loop2D); rButtonSpiral.addTrack(loop2E); rButtonSpiral.addTrack(loop2F); rButtonSpiral.addTrack(loop2G); rButtonSpiral.addTrack(loop2H); rButtonSpiral.addTrack(t10A3); rButtonSpiral.addTrack(t10A4); rButtonSpiral.addTrack(t30A1); rButtonSpiral.addTrack(t30A2); rButtonSpiral.addTrack(loop2A3A); rButtonSpiral.addTrack(t20A2); rButtonSpiral.addTrack(loop3A); rButtonSpiral.addTrack(loop3B); rButtonSpiral.addTrack(loop3C); rButtonSpiral.addTrack(t5A); rButtonSpiral.addTrack(bridgeA); rButtonSpiral.addTrack(bridgeB); rButtonSpiral.addTrack(bridgeC); rButtonSpiral.addTrack(bridgeD); rButtonSpiral.addTrack(bridgeE); rButtonSpiral.addTrack(bridgeF); rButtonSpiral.addTrack(bridgeG); rButtonSpiral.addTrack(bridgeH); rButtonSpiral.addTrack(bridgeI); rButtonReset = new RouteButton(rX+400,rY+120,80,40,"RESET"); rButtonReset.addTrackButton(tButton40,0); rButtonReset.addTrackButton(tButton3,0); rButtonReset.addTrackButton(tButton2,0); rButtonReset.addTrackButton(tButton8,0); rButtonReset.addTrackButton(tButton10,0); rButtonReset.addTrackButton(tButton20,0); rButtonReset.addTrackButton(tButton9,0); rButtonReset.addTrackButton(tButton4,0); rButtonReset.addTrackButton(tButton1,0); rButtonReset.addTrackButton(tButton5,0); rButtonReset.addTrackButton(tButton50,0); rButtonReset.addTrackButton(tButton6,0); rButtonReset.addTrackButton(tButton7,0); rButtonReset.addTrackButton(tButton30,0); rButtonReset.addTrack(t1A); rButtonReset.addTrack(t2A); rButtonReset.addTrack(t3A); rButtonReset.addTrack(t4A); rButtonReset.addTrack(t5A); rButtonReset.addTrack(t6A); rButtonReset.addTrack(t7A); rButtonReset.addTrack(t8A); rButtonReset.addTrack(t9A); rButtonReset.addTrack(t10A1); rButtonReset.addTrack(t10A2); rButtonReset.addTrack(t10A3); rButtonReset.addTrack(t10A4); rButtonReset.addTrack(t20A1); rButtonReset.addTrack(t20A2); rButtonReset.addTrack(t30A1); rButtonReset.addTrack(t30A2); rButtonReset.addTrack(t30A3); rButtonReset.addTrack(t30A4); rButtonReset.addTrack(t40A1); rButtonReset.addTrack(t40A2); rButtonReset.addTrack(t50A1); rButtonReset.addTrack(t50A2); rButtonBridge = new RouteButton(bridgeA,20,20); rButtonBridge.addTrackButton(tButton5,0); rButtonBridge.addTrackButton(tButton8,0); rButtonBridge.addTrack(t5A); rButtonBridge.addTrack(bridgeA); rButtonBridge.addTrack(bridgeB); rButtonBridge.addTrack(bridgeC); rButtonBridge.addTrack(bridgeD); rButtonBridge.addTrack(bridgeE); rButtonBridge.addTrack(bridgeF); rButtonBridge.addTrack(bridgeG); rButtonBridge.addTrack(bridgeH); rButtonBridge.addTrack(bridgeI); rButtonBridge.addTrack(t8A); cab622.setSidingDefaults(rButton6,4,10); // must set default sidings AFTER rButtons are defined above cab6021.setSidingDefaults(rButton1,11,7); cab54.setSidingDefaults(rButton2,11,8); cab1506.setSidingDefaults(rButton3,11,9); cab8601.setSidingDefaults(rButton4,11,12); cab1202.setSidingDefaults(rButton5,11,13); cab2004.setSidingDefaults(rButton7,5,14); } // Initialize //////////////////////////////////////////////////////////////////////////