Skip to content

Commit

Permalink
Initial Upload of DCC++ Controller sketch
Browse files Browse the repository at this point in the history
  • Loading branch information
DccPlusPlus committed Oct 31, 2015
0 parents commit 11d17dd
Show file tree
Hide file tree
Showing 32 changed files with 5,457 additions and 0 deletions.
196 changes: 196 additions & 0 deletions DCCpp_Controller/DCCpp_Controller.pde
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
//////////////////////////////////////////////////////////////////////////
// DCC++ CONTROLLER
// COPYRIGHT (c) 2013-2015 Gregg E. Berman
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see http://www.gnu.org/licenses
//
//////////////////////////////////////////////////////////////////////////
//
// DCC++ CONTROLLER is a Java program written using the 64-bit Processing Library
// and Processing IDE (version 3.01).
//
// DCC++ CONTROLLER provides users with a fully customizeable graphical
// front end for the total control of model trains and model train layouts
// via its companion program, DCC++ BASE STATION.
//
// DCC++ BASE STATION allows a standard Arduino Uno with an Arduino Motor Shield
// to be used as a fully-functioning digital command and control (DCC) base station
// for controlling model train layouts that conform to current National Model
// Railroad Association (NMRA) DCC standards.
//
// DCC++ CONTROLLER communicates with DCC++ BASE STATION using simple text commands sent
// via a standard USB Serial Cord at speeds of up to 115200 Baud. A Bluetooth Wireless
// Connection may be used in place of a USB Serial Cord without any software modification.
//
// This version of DCC++ CONTROLLER supports:
//
// * Multi-Cab / Multi-Throttle configurations using 128-step speed control
// * 2-byte and 4-byte cab addresses
// * Customizable cab function buttons F0-F12
// * User-created multi-layout track plan
// * Customizeable turnouts and crossovers with controls integrated into track plan
// * Customizeable routes with configurable buttons
// * Customizeable routes with route buttons integrated into track plan
// * Master Power Button
// * Customizable key-controls
// * Real-time current monitor
// * Optional track-integrated sensors
// * Optional user-created Auto Pilot routines (when used with track-integrated sensors)
// * Manual activation/de-activation of accessory functions using 512 addresses, each with 4 sub-addresses
// * Programming on the Main Operations Track
// - write configuration variable bytes
// - set/clear specific configuration variable bits
// * Programming on the Programming Track
// - write configuration variable bytes
// - read configuration variable bytes
//
// With the exception of a standard 15V power supply for the Arduino Uno that can
// be purchased in any electronics store, no additional hardware is required.
//
// Neither DCC++ BASE STATION nor DCC++ CONTROLLER use any known proprietary or
// commercial hardware, software, interfaces, specifications, or methods related
// to the control of model trains using NMRA DCC standards. Both programs are wholly
// original, developed by the author, and are not derived from any known commercial,
// free, or open-source model railroad control packages by any other parties.
//
// However, DCC++ BASE STATION and DCC++ CONTROLLER do heavily rely on the IDEs and
// embedded libraries associated with Arduino and Processing. Tremendous thanks to those
// responsible for these terrific open-source initiatives that enable programs like
// DCC++ to be developed and distributed in the same fashion.
//
// REFERENCES:
//
// NMRA DCC Standards: http://www.nmra.org/standards/DCC/standards_rps/DCCStds.html
// Arduino: http://www.arduino.cc/
// Processing: http://processing.org/
// GNU General Public License: http://opensource.org/licenses/GPL-3.0
//
//////////////////////////////////////////////////////////////////////////

import processing.serial.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.*;

final String CONTROLLER_VERSION = "3.0";
final int BASE_BAUD = 115200;
final int SCREEN_WIDTH = 1366;
final int SCREEN_HEIGHT = 768;
final String STATUS_FILE = "dccStatus.xml";

//////////////////////////////////////////////////////////////////////////

void settings(){
size(SCREEN_WIDTH,SCREEN_HEIGHT);
}

//////////////////////////////////////////////////////////////////////////

void setup(){
Initialize();
}

//////////////////////////////////////////////////////////////////////////

void draw(){

background(backgroundColor);

for(DccComponent dcc : dccComponents)
dcc.display();

if(frameCount==1) // if this is the first frame, just display components and return (otherwise user stare at a blank screen while serial is opening
return;

if(frameCount==2) // is this is the second frame, open the serial port --- screen will have already been displayed in prior frame
aPort.open(serialPortXML.getContent());

for(int i=buttonQueue2.size()-1;i>=0;i--){
buttonQueue2.get(i).init();
buttonQueue2.remove(i);
}

for(int i=buttonQueue.size()-1;i>=0;i--){
buttonQueue2.add(buttonQueue.get(i));;
buttonQueue.remove(i);
}

if(!mousePressed){
cursorType=ARROW;
previousComponent=selectedComponent;
selectedComponent=null;

int nComponents = dccComponents.size();

for(int i=nComponents-1;i>=0;i--)
dccComponents.get(i).check();

cursor(cursorType);
}

int m=millis();
if(m-lastTime>250 && aPort!=null && currentMeter.isOn){
lastTime=m;
aPort.write("<c>");
}

msgBoxClock.setMessage(nf(hour(),2)+":"+nf(minute(),2)+":"+nf(second(),2));

if(saveXMLFlag){
try{
saveXML(dccStatusXML,STATUS_FILE);
saveXMLFlag=false;
} catch(Exception e){
println("Couldn't save. Will retry");
}
}

autoPilot.safetyCheck();

} // draw

//////////////////////////////////////////////////////////////////////////

abstract class DccComponent{
Window window=null;
int xPos, yPos;
String componentName="NAME NOT DEFINED";
abstract void display();
void check(){};
void pressed(){};
void shiftPressed(){};
void released(){};
void drag(){};
void init(){};

protected int xWindow(){
if(window==null)
return 0;
return window.xPos;
}

protected int yWindow(){
if(window==null)
return 0;
return window.yPos;
}
}

//////////////////////////////////////////////////////////////////////////

interface CallBack{
void execute(int n, String c);
}

//////////////////////////////////////////////////////////////////////////
Loading

0 comments on commit 11d17dd

Please sign in to comment.