Files
ESP32/DCC-Centrale/Firmware/Controller/DCCpp_Controller/dRoutes.pde
2026-02-10 11:05:54 +01:00

139 lines
4.5 KiB
Plaintext

//////////////////////////////////////////////////////////////////////////
// DCC++ CONTROLLER: Class for Route Button
//
// RouteButton - creates a button to activate one or more Track Buttons
// that in turn set one or more TURNOUTS or CROSSOVERS to either an
// open or closed position representing a specific track route
// - tracks may also be added to a route button so that they are highlighted
// on the screen when the route button is first selected
// - track highlights will be color-coded to indicate whether each
// turnout or crossover that in in the route is already set properly,
// or needs to be toggled if that route is activiated
//
// - two types of route buttons are supported:
//
// * large stand-alone button with a text label indicated the name of the route
// * small button placed on a track where the route is obvious and does
// not require a name (such as at the end of a siding)
//
//////////////////////////////////////////////////////////////////////////
class RouteButton extends DccComponent{
int xPos, yPos;
int kWidth, kHeight;
String label="";
boolean routeOn=false;
ArrayList<TrackButton> aTrackButtons = new ArrayList<TrackButton>();
ArrayList<TrackButton> bTrackButtons = new ArrayList<TrackButton>();
ArrayList<Track> rTracks = new ArrayList<Track>();
RouteButton(Track refTrack, int kWidth, int kHeight){
this.xPos=int((refTrack.x[0]+refTrack.x[1])/2.0*refTrack.layout.sFactor+refTrack.layout.xCorner);
this.yPos=int((refTrack.y[0]+refTrack.y[1])/2.0*refTrack.layout.sFactor+refTrack.layout.yCorner);
this.kWidth=kWidth;
this.kHeight=kHeight;
dccComponents.add(this);
}
RouteButton(int xPos, int yPos, int kWidth, int kHeight, String label){
this.xPos=xPos;
this.yPos=yPos;
this.kWidth=kWidth;
this.kHeight=kHeight;
this.label=label;
dccComponents.add(this);
} // RouteButton
//////////////////////////////////////////////////////////////////////////
void addTrackButton(TrackButton trackButton, int tPos){
if(tPos==0){ // specifies that this track button should be set to A when route selected
aTrackButtons.add(trackButton);
trackButton.aRouteButtons.add(this);
} else if (tPos==1) { // specifies that this track button should be set to B when route selected
bTrackButtons.add(trackButton);
trackButton.bRouteButtons.add(this);
}
}
//////////////////////////////////////////////////////////////////////////
void addTrack(Track track){
rTracks.add(track);
}
//////////////////////////////////////////////////////////////////////////
void display(){
if(label.equals("")){
ellipseMode(CENTER);
if(routeOn)
fill(color(0,255,0));
else
fill(color(0,150,0));
noStroke();
ellipse(xPos,yPos,kWidth/2,kHeight/2);
} else{
ellipseMode(CENTER);
if(routeOn)
fill(color(0,200,200));
else
fill(color(0,100,100));
noStroke();
ellipse(xPos,yPos,kWidth,kHeight);
textFont(buttonFont,12);
textAlign(CENTER,CENTER);
fill(color(0));
text(label,xPos,yPos);
}
} // display
//////////////////////////////////////////////////////////////////////////
void check(){
if(selectedComponent==null && (mouseX-xPos)*(mouseX-xPos)/(kWidth*kWidth/4.0)+(mouseY-yPos)*(mouseY-yPos)/(kHeight*kHeight/4.0)<=1){
cursorType=HAND;
selectedComponent=this;
for(Track track : rTracks){
track.hStatus=1;
}
}
else if(previousComponent==this){
for(Track track : rTracks){
track.hStatus=0;
}
}
} // check
//////////////////////////////////////////////////////////////////////////
void pressed(){
for(TrackButton trackButton : aTrackButtons){
if(trackButton.rEnabled)
trackButton.pressed(0);
}
for(TrackButton trackButton : bTrackButtons){
if(trackButton.rEnabled)
trackButton.pressed(1);
}
routeOn=true;
} // pressed
//////////////////////////////////////////////////////////////////////////
void shiftPressed(){
for(TrackButton trackButton : aTrackButtons){
if(trackButton.rEnabled)
trackButton.pressed(1);
}
for(TrackButton trackButton : bTrackButtons){
if(trackButton.rEnabled)
trackButton.pressed(0);
}
routeOn=false;
} // shiftPressed
} // RouteButton Class