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

336 lines
8.1 KiB
Plaintext

//////////////////////////////////////////////////////////////////////////
// DCC++ CONTROLLER: Event Handlers
//
// Top-level processing of mouse, keyboard, and serial events.
// Most of the real functionality is contained in other methods,
// functions, and classes called by these handlers
//
//////////////////////////////////////////////////////////////////////////
void mouseDragged(){
if(selectedComponent!=null)
selectedComponent.drag();
}
//////////////////////////////////////////////////////////////////////////
void mousePressed(){
if(activeInputBox!=null){
for(InputBox inputBox : activeInputBox.linkedBoxes)
inputBox.setIntValue(activeInputBox.getIntValue());
}
activeInputBox=null;
if(selectedComponent!=null){
if (keyPressed == true && key == CODED){
if(keyCode == SHIFT){
selectedComponent.shiftPressed();
} else if(keyCode == CONTROL){
msgBoxMain.setMessage("Component Name: "+selectedComponent.componentName,color(30,30,150));
}
}
else if(mouseButton==LEFT){
selectedComponent.pressed();
} else {
selectedComponent.rightClick();
}
}
}
//////////////////////////////////////////////////////////////////////////
void mouseReleased(){
if(selectedComponent!=null)
selectedComponent.released();
}
//////////////////////////////////////////////////////////////////////////
void keyPressed(){
keyCommand(key, keyCode);
}
//////////////////////////////////////////////////////////////////////////
void keyReleased(){
keyCommandReleased(key, keyCode);
}
//////////////////////////////////////////////////////////////////////////
void serialEvent(Serial p){
receivedString(p.readString());
}
//////////////////////////////////////////////////////////////////////////
void clientEvent(Client c){
String s;
s=c.readStringUntil('>');
if(s!=null)
receivedString(s);
}
//////////////////////////////////////////////////////////////////////////
void receivedString(String s){
if(s.charAt(0)!='<')
return;
String c=s.substring(2,s.length()-1);
switch(s.charAt(1)){
case 'i':
baseID=c;
msgBoxMain.setMessage("Found "+baseID,color(0,150,0));
break;
case '*':
msgBoxDiagIn.setMessage(c,color(30,30,150));
break;
case 'r':
String[] cs=splitTokens(c,"|");
callBacks.get(int(cs[0])).execute(int(cs[1]),cs[2]);
break;
case 'T':
int[] n=int(splitTokens(c));
if(n[0]>cabButtons.size())
break;
CabButton t=cabButtons.get(n[0]-1);
if(n[2]==1)
t.speed=n[1];
else
t.speed=-n[1];
break;
case 'Q':
if(sensorsHM.get(int(c))!=null){
sensorsHM.get(int(c)).pressed();
}
break;
case 'Y':
int[] h1=int(splitTokens(c));
if(remoteButtonsHM.get(h1[0])!=null){
if(h1[1]==1)
remoteButtonsHM.get(h1[0]).turnOn();
else
remoteButtonsHM.get(h1[0]).turnOff();
}
break;
case 'H':
int[] h=int(splitTokens(c));
if(trackButtonsHM.get(h[0])!=null){
trackButtonsHM.get(h[0]).update(h[1]);
} else if(remoteButtonsHM.get(h[0])!=null){
if(h[1]==((remoteButtonsHM.get(h[0]).buttonType==ButtonType.T_COMMAND)?1:0))
remoteButtonsHM.get(h[0]).turnOn();
else
remoteButtonsHM.get(h[0]).turnOff();
}
break;
case 'L':
int[] z=int(splitTokens(c));
color tempColor;
tempColor=color(z[0],z[1],z[2]);
colorMode(HSB,1.0,1.0,1.0);
ledColorButton.hue=hue(tempColor);
ledColorButton.sat=saturation(tempColor);
ledColorButton.val=brightness(tempColor);
ledColorButton.update(0);
colorMode(RGB,255);
break;
case 'U':
autoPilot.cabList.clear();
autoPilot.setProgram(AutoProgram.SINGLE_CAB_RUN);
autoPilot.turnOn();
break;
case 'p':
if(c.equals("1")){
powerButton.isOn=true;
msgBoxMain.setMessage("Track Power On",color(30,30,150));
} else if(c.equals("0")){
powerButton.isOn=false;
msgBoxMain.setMessage("Track Power Off",color(30,30,150));
} else if(c.equals("2")){
msgBoxMain.setMessage("MAIN Track Current Overload - Power Off",color(200,30,30));
powerButton.isOn=false;
} else if(c.equals("3")){
msgBoxMain.setMessage("PROG Track Current Overload - Power Off",color(200,30,30));
powerButton.isOn=false;
}
break;
case 'a':
currentMeter.addSample(int(c));
break;
}
} // receivedString
//////////////////////////////////////////////////////////////////////////
void keyCommand(char k, int kC){
if(activeInputBox!=null){
activeInputBox.keyStroke(k, kC);
return;
}
if(k==CODED){
switch(kC){
case UP:
if(throttleA.cabButton!=null){
if(!keyHold)
throttleA.pressed();
throttleA.keyControl(1);
}
break;
case DOWN:
if(throttleA.cabButton!=null){
if(!keyHold)
throttleA.pressed();
throttleA.keyControl(-1);
}
break;
case LEFT:
if(throttleA.cabButton!=null){
throttleA.keyControl(0);
}
break;
case RIGHT:
if(throttleA.cabButton!=null){
throttleA.cabButton.stopThrottle();
}
break;
}
} // key is coded
else{
switch(k){
case 'P':
powerButton.turnOn();
break;
case 'F':
aPort.write("<3>");
break;
case 'f':
aPort.write("<2>");
break;
case ' ':
powerButton.turnOff();
break;
case 'a':
accWindow.toggle();
break;
case 'c':
currentMeter.isOn=!currentMeter.isOn;
break;
case 'e':
extrasWindow.toggle();
break;
case 'x':
autoWindow.toggle();
break;
case 'S':
sensorWindow.toggle();
break;
case 'l':
ledWindow.toggle();
break;
case 's':
portWindow.toggle();
break;
case 'h':
helpWindow.toggle();
break;
case 'q':
imageWindow.toggle();
break;
case 'd':
diagWindow.toggle();
break;
case 'i':
if(layoutBridge.equals(layout2))
layoutBridge.copy(layout);
else
layoutBridge.copy(layout2);
break;
case 'p':
progWindow.toggle();
break;
case 'o':
opWindow.toggle();
break;
case 'n':
if(throttleA.cabButton!=null){
throttleA.cabButton.fbWindow.close();
throttleA.cabButton.fbWindow=throttleA.cabButton.windowList.get((throttleA.cabButton.windowList.indexOf(throttleA.cabButton.fbWindow)+1)%throttleA.cabButton.windowList.size());
throttleA.cabButton.fbWindow.open();
}
break;
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
cabButtons.get(int(k)-int('1')).pressed();
break;
}
} // key not coded
keyHold=true;
} // keyCommand
//////////////////////////////////////////////////////////////////////////
void keyCommandReleased(char k, int kC){
keyHold=false;
if(k==CODED){
switch(kC){
}
} // key is coded
else{
switch(k){
}
} // key not coded
} // keyCommandReleased
//////////////////////////////////////////////////////////////////////////