From: Bob J. <jac...@us...> - 2002-07-29 06:12:05
|
Update of /cvsroot/jmri/jmri/jmrix/loconet In directory usw-pr-cvs1:/tmp/cvs-serv29358 Modified Files: LnTurnout.java Log Message: explicit handling of SENT feedback Index: LnTurnout.java =================================================================== RCS file: /cvsroot/jmri/jmri/jmrix/loconet/LnTurnout.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -r1.1 -r1.2 *** LnTurnout.java 1 Mar 2002 00:01:38 -0000 1.1 --- LnTurnout.java 29 Jul 2002 06:12:02 -0000 1.2 *************** *** 1,9 **** ! /** ! * LnTurnout.java ! * ! * Description: extend jmri.AbstractTurnout for LocoNet layouts ! * @author Bob Jacobsen Copyright (C) 2001 ! * @version ! */ package jmri.jmrix.loconet; --- 1,3 ---- ! // LnTurnout.java package jmri.jmrix.loconet; *************** *** 11,25 **** import jmri.AbstractTurnout; ! public class LnTurnout extends AbstractTurnout implements LocoNetListener { public LnTurnout(int number) { // a human-readable turnout number must be specified! _number = number; // At construction, register for messages ! LnTrafficController.instance().addLocoNetListener(~0, this); } public int getNumber() { return _number; } public String getSystemName() { return "LT"+getNumber(); } ! // Handle a request to change state by sending a LocoNet command protected void forwardCommandChangeToLayout(int s) throws jmri.JmriException { --- 5,31 ---- import jmri.AbstractTurnout; ! /** ! * Extend jmri.AbstractTurnout for LocoNet layouts ! * <P> ! * This implementation implements the "SENT" feedback, ! * where LocoNet messages originating on the layout can change both KnownState ! * and CommandedState. We change both because we consider a LocoNet message to ! * reflect how the turnout should be, even if its a readback status message. ! * E.g. if you use a DS54 local input to change the state, resulting in a ! * status message, we still consider that to be a commanded state change. ! * ! * @author Bob Jacobsen Copyright (C) 2001 ! * @version $Revision$ ! */public class LnTurnout extends AbstractTurnout implements LocoNetListener { public LnTurnout(int number) { // a human-readable turnout number must be specified! _number = number; // At construction, register for messages ! LnTrafficController.instance().addLocoNetListener(~0, this); } public int getNumber() { return _number; } public String getSystemName() { return "LT"+getNumber(); } ! // Handle a request to change state by sending a LocoNet command protected void forwardCommandChangeToLayout(int s) throws jmri.JmriException { *************** *** 27,35 **** LocoNetMessage l = new LocoNetMessage(4); l.setOpCode(LnConstants.OPC_SW_REQ); ! // compute address fields int hiadr = (_number-1)/128; int loadr = (_number-1)-hiadr*128; ! // set closed (note that this can't handle both! Not sure how to // say that in LocoNet. --- 33,41 ---- LocoNetMessage l = new LocoNetMessage(4); l.setOpCode(LnConstants.OPC_SW_REQ); ! // compute address fields int hiadr = (_number-1)/128; int loadr = (_number-1)-hiadr*128; ! // set closed (note that this can't handle both! Not sure how to // say that in LocoNet. *************** *** 40,47 **** throw new jmri.JmriException("LocoNet turnout logic can't handle both THROWN and CLOSED yet"); } ! // load On/Off with on hiadr |= 0x10; ! // store and send l.setElement(1,loadr); --- 46,53 ---- throw new jmri.JmriException("LocoNet turnout logic can't handle both THROWN and CLOSED yet"); } ! // load On/Off with on hiadr |= 0x10; ! // store and send l.setElement(1,loadr); *************** *** 49,58 **** LnTrafficController.instance().sendLocoNetMessage(l); } ! // implementing classes will typically have a function/listener to get ! // updates from the layout, which will then call // public void firePropertyChange(String propertyName, // Object oldValue, ! // Object newValue) // _once_ if anything has changed state (or set the commanded state directly) public void message(LocoNetMessage l) { --- 55,64 ---- LnTrafficController.instance().sendLocoNetMessage(l); } ! // implementing classes will typically have a function/listener to get ! // updates from the layout, which will then call // public void firePropertyChange(String propertyName, // Object oldValue, ! // Object newValue) // _once_ if anything has changed state (or set the commanded state directly) public void message(LocoNetMessage l) { *************** *** 64,71 **** if (myAddress(sw1, sw2)) { if (log.isDebugEnabled()) log.debug("SW_REQ received with valid address"); ! if ((sw2 & LnConstants.OPC_SW_REQ_DIR)!=0) newCommandedState(CLOSED); ! else newCommandedState(THROWN); } break; --- 70,80 ---- if (myAddress(sw1, sw2)) { if (log.isDebugEnabled()) log.debug("SW_REQ received with valid address"); ! if ((sw2 & LnConstants.OPC_SW_REQ_DIR)!=0) { newCommandedState(CLOSED); ! newKnownState(CLOSED); ! } else { newCommandedState(THROWN); + newKnownState(THROWN); + } } break; *************** *** 79,96 **** if ((sw2 & LnConstants.OPC_SW_REP_INPUTS)==0) { // sort out states ! switch (sw2 & (LnConstants.OPC_SW_REP_CLOSED|LnConstants.OPC_SW_REP_THROWN)) { ! ! case LnConstants.OPC_SW_REP_CLOSED: ! setKnownState(CLOSED); break; ! case LnConstants.OPC_SW_REP_THROWN: ! setKnownState(THROWN); break; ! case LnConstants.OPC_SW_REP_CLOSED|LnConstants.OPC_SW_REP_THROWN: ! setKnownState(CLOSED+THROWN); break; ! default: ! setKnownState(0); break; } --- 88,109 ---- if ((sw2 & LnConstants.OPC_SW_REP_INPUTS)==0) { // sort out states ! switch (sw2 & (LnConstants.OPC_SW_REP_CLOSED|LnConstants.OPC_SW_REP_THROWN)) { ! ! case LnConstants.OPC_SW_REP_CLOSED: ! newCommandedState(CLOSED); ! newKnownState(CLOSED); break; ! case LnConstants.OPC_SW_REP_THROWN: ! newCommandedState(THROWN); ! newKnownState(THROWN); break; ! case LnConstants.OPC_SW_REP_CLOSED|LnConstants.OPC_SW_REP_THROWN: ! newCommandedState(CLOSED+THROWN); ! newKnownState(CLOSED+THROWN); break; ! default: ! newCommandedState(0); ! newKnownState(0); break; } *************** *** 103,117 **** // reach here only in error } ! public void dispose() { LnTrafficController.instance().removeLocoNetListener(~0, this); } ! // data members int _number; // loconet turnout number ! ! private boolean myAddress(int a1, int a2) { // the "+ 1" in the following converts to throttle-visible numbering ! return (((a2 & 0x0f) * 128) + (a1 & 0x7f) + 1) == _number; } static org.apache.log4j.Category log = org.apache.log4j.Category.getInstance(LnTurnout.class.getName()); --- 116,130 ---- // reach here only in error } ! public void dispose() { LnTrafficController.instance().removeLocoNetListener(~0, this); } ! // data members int _number; // loconet turnout number ! ! private boolean myAddress(int a1, int a2) { // the "+ 1" in the following converts to throttle-visible numbering ! return (((a2 & 0x0f) * 128) + (a1 & 0x7f) + 1) == _number; } static org.apache.log4j.Category log = org.apache.log4j.Category.getInstance(LnTurnout.class.getName()); |