From: Ken C. <ke...@us...> - 2008-02-29 04:46:12
|
Update of /cvsroot/jmri/jmri/jmrix/powerline In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv6798/src/jmri/jmrix/powerline Modified Files: SerialLight.java SerialMessage.java Log Message: Dimmable lights added to the Light Table. No help written yet, also only does dimming and min/max, no rate changes. I want to see if I broke things or not. Before next build I want to add some help and fix issue of dim vs on/off. I need someothers to test this if posible. Index: SerialLight.java =================================================================== RCS file: /cvsroot/jmri/jmri/jmrix/powerline/SerialLight.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** SerialLight.java 18 Feb 2008 03:21:28 -0000 1.3 --- SerialLight.java 29 Feb 2008 04:46:07 -0000 1.4 *************** *** 6,9 **** --- 6,10 ---- import jmri.Sensor; import jmri.Turnout; + import java.util.Date; /** *************** *** 50,55 **** // Extract the Bit from the name mBit = SerialAddress.getBitFromSystemName(systemName); - // Set initial state - setState( OFF ); // Set defaults for all other instance variables setControlType( NO_CONTROL ); --- 51,54 ---- *************** *** 59,64 **** --- 58,87 ---- setControlTurnout( null ); setControlTurnoutState( Turnout.CLOSED ); + setCanDim(false); } + private void initDimUse() { + // Set initial state + // address message, then function + int housecode = ((mBit-1)/16)+1; + int devicecode = ((mBit-1)%16)+1; + // first set off + SerialMessage m1 = SerialMessage.getAddress(housecode, devicecode); + SerialMessage m2 = SerialMessage.getFunction(housecode, X10.FUNCTION_OFF); + // send + SerialTrafficController.instance().sendSerialMessage(m1, null); + SerialTrafficController.instance().sendSerialMessage(m2, null); + log.debug("initDimUse: sent off"); + // then set all dim + m1 = SerialMessage.getAddress(housecode, devicecode); + m2 = SerialMessage.getFunctionDim(housecode, X10.FUNCTION_DIM, 22); + // send + SerialTrafficController.instance().sendSerialMessage(m1, null); + SerialTrafficController.instance().sendSerialMessage(m2, null); + log.debug("initDimUse: sent dim reset"); + mDimInit = true; + log.debug("turn on diminit"); + } + /** * System dependent instance variables *************** *** 67,77 **** --- 90,191 ---- protected int mState = OFF; // current state of this light int mBit = 0; // bit within the node + double mCurrentDim = 0; // + double mRequestedDim = 0; + Date mLastDimChange = null; + int mDimRate = 0; + boolean mIsDimmable = true; + boolean mDimInit = false; + double mMinDimValue = 0; + double mMaxDimValue = 1; /** + * set whether to dim or just on/off + */ + public void setCanDim(boolean state) { + if (mIsDimmable != state) { + log.debug("change dimmable to " + state); + } + mIsDimmable = state; + } + + /** + * return is light is set to dim or just on/off + */ + public boolean isCanDim() { + return(mIsDimmable); + } + /** * Return the current state of this Light */ public int getState() { return mState; } + + /** + * Return the last requested dim of this Light + */ + public double getDimRequest() { return mRequestedDim; } + + /** + * Return the current dim of this Light, will differ from request when dim rate in effect + */ + public double getDimCurrent() { return mCurrentDim; } + + /** + * This Light implementation supports dimming + */ + public boolean isDimSupported() { return true; } /** + * Return the current dim rate of this Light + */ + public int getDimRate() { + return mDimRate; + } + public void setDimRate(int newRate) { + if (newRate != mDimRate) { + int oldRate = mDimRate; + mDimRate = newRate; + // notify listeners, if any + firePropertyChange("KnownDimRate", new Integer(oldRate), new Integer(newRate)); + } + } + public boolean hasBeenDimmed() { + return(mDimInit); + } + + /** + * sets the minimum output for a dimmed light + */ + public void setDimMin(double v) { + if (v > 1 || v < 0) { + return; + } + mMinDimValue = v; + } + + /** + * gets the minimum output for a dimmed light + */ + public double getDimMin() { + return(mMinDimValue); + } + + /** + * sets the minimum output for a dimmed light + */ + public void setDimMax(double v) { + if (v > 1 || v < 0) { + return; + } + mMaxDimValue = v; + } + + /** + * gets the minimum output for a dimmed light + */ + public double getDimMax() { + return(mMaxDimValue); + } + + /** * Set the current state of this Light * This routine requests the hardware to change. *************** *** 81,84 **** --- 195,201 ---- */ public void setState(int newState) { + if (log.isDebugEnabled()) { + log.debug("setState(" + newState + ")\nCurrent: " + mState); + } SerialNode mNode = SerialAddress.getNodeFromSystemName(mSystemName); if (mNode == null) { *************** *** 87,101 **** } ! int housecode = ((mBit-1)/16)+1; ! int devicecode = ((mBit-1)%16)+1; ! log.debug("set state "+newState+" house "+housecode+" device "+devicecode); ! // address message, then content ! SerialMessage m1 = SerialMessage.getAddress(housecode, devicecode); int function; ! if (newState==ON) { ! function = X10.FUNCTION_BRIGHT; } else if (newState==OFF) { ! function = X10.FUNCTION_DIM; } else { --- 204,217 ---- } ! // figure out command int function; ! double newDim; ! if (newState == ON) { ! function = X10.FUNCTION_ON; ! newDim = 1; } else if (newState==OFF) { ! function = X10.FUNCTION_OFF; ! newDim = 0; } else { *************** *** 103,117 **** return; } ! SerialMessage m2 = SerialMessage.getFunctionDim(housecode, function, 1); ! // send ! SerialTrafficController.instance().sendSerialMessage(m1, null); ! SerialTrafficController.instance().sendSerialMessage(m2, null); ! if (newState!=mState) { ! int oldState = mState; ! mState = newState; ! // notify listeners, if any ! firePropertyChange("KnownState", new Integer(oldState), new Integer(newState)); ! } } --- 219,340 ---- return; } ! if (mIsDimmable) { ! setDimRequest(newDim); ! } else { ! // reset the dimInit ! if (mDimInit) { ! mDimInit = false; ! log.debug("turn off diminit"); ! } ! int housecode = ((mBit-1)/16)+1; ! int devicecode = ((mBit-1)%16)+1; ! log.debug("set state "+newState+" house "+housecode+" device "+devicecode); ! // address message, then content ! SerialMessage m1 = SerialMessage.getAddress(housecode, devicecode); ! SerialMessage m2 = SerialMessage.getFunction(housecode, function); ! // send ! SerialTrafficController.instance().sendSerialMessage(m1, null); ! SerialTrafficController.instance().sendSerialMessage(m2, null); ! ! if (newState != mState || newDim != mRequestedDim || newDim != mCurrentDim) { ! if (log.isDebugEnabled()) { ! log.debug("setState(" + newState + ")/" + mState + " function: " + function + " newDim: " + newDim + "/" + mRequestedDim); ! } ! int oldState = mState; ! double oldDim = mRequestedDim; ! if (oldState != newState) { ! mState = newState; ! // notify listeners, if any ! firePropertyChange("KnownState", new Integer(oldState), new Integer(newState)); ! } ! if (oldDim != newDim) { ! mCurrentDim = newDim; ! mRequestedDim = newDim; ! firePropertyChange("KnownDim", new Double(oldDim), new Double(newDim)); ! } ! } ! } ! } ! /** ! * Set the current dim of this Light ! * This routine requests the hardware to change. ! * If this is really a change in state of this ! * bit (tested in SerialNode), a Transmit packet ! * will be sent before this Node is next polled. ! */ ! public void setDimRequest(double newDim) { ! if (log.isDebugEnabled()) { ! log.debug("setDim(" + newDim + ") mRequestedDim: " + mRequestedDim); ! } ! SerialNode mNode = SerialAddress.getNodeFromSystemName(mSystemName); ! if (mNode == null) { ! // node does not exist, ignore call ! return; ! } ! if (newDim < 0 || newDim > 1) { ! return ; ! } ! if (!mIsDimmable) { ! log.debug("setDim passing to setState since dim isn't enabled"); ! if (newDim <= 0) { ! setState(OFF); ! } else { ! setState(ON); ! } ! } else { ! if (!mDimInit) { ! initDimUse(); ! } ! ! // figure out the function code ! int function; ! if (newDim >= mCurrentDim) { ! function = X10.FUNCTION_BRIGHT; ! log.debug("function bright"); ! } ! else if (newDim < mCurrentDim) { ! function = X10.FUNCTION_DIM; ! log.debug("function dim"); ! } ! else { ! log.warn("illegal state requested for Light: " + getSystemName()); ! return; ! } ! if (newDim < mMinDimValue) { ! newDim = mMinDimValue; ! } ! if (newDim > mMaxDimValue) { ! newDim = mMaxDimValue; ! } ! int housecode = ((mBit-1)/16)+1; ! int devicecode = ((mBit-1)%16)+1; ! double diffDim = newDim - mRequestedDim; ! int deltaDim = (int)(22 * Math.abs(diffDim)); ! if (deltaDim != 0) { ! // address message, then check status, then function ! SerialMessage m1 = SerialMessage.getAddress(housecode, devicecode); ! SerialMessage m2 = SerialMessage.getFunctionDim(housecode, function, deltaDim); ! // send ! SerialTrafficController.instance().sendSerialMessage(m1, null); ! SerialTrafficController.instance().sendSerialMessage(m2, null); ! } ! ! if (newDim != mRequestedDim) { ! if (log.isDebugEnabled()) { ! log.debug("setDim(" + newDim + ")/" + mRequestedDim + " house " + housecode + " device " + devicecode + " deltaDim: " + deltaDim + " funct: " + function); ! } ! double oldDim = mRequestedDim; ! mRequestedDim = newDim; ! mCurrentDim = newDim; ! if (newDim > 0) { ! mState = ON; ! } else { ! mState = OFF; ! } ! // notify listeners, if any ! firePropertyChange("KnownDim", new Double(oldDim), new Double(newDim)); ! } ! } } Index: SerialMessage.java =================================================================== RCS file: /cvsroot/jmri/jmri/jmrix/powerline/SerialMessage.java,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** SerialMessage.java 18 Feb 2008 12:21:06 -0000 1.5 --- SerialMessage.java 29 Feb 2008 04:46:07 -0000 1.6 *************** *** 35,38 **** --- 35,39 ---- setResponseLength(0); // only polls require a response setBinary(true); + setTimeout(5000); } *************** *** 46,49 **** --- 47,51 ---- setResponseLength(l); setBinary(true); + setTimeout(5000); } *************** *** 61,64 **** --- 63,67 ---- setResponseLength(l); setBinary(true); + setTimeout(5000); } *************** *** 99,102 **** --- 102,116 ---- return m; } + static public SerialMessage getAddressDim(int housecode, int devicecode, int dimcode) { + SerialMessage m = new SerialMessage(2); + m.setInterlocked(true); + if (dimcode > 0) { + m.setElement(0, 0x04 | ((dimcode & 0x1f) << 3)); + } else { + m.setElement(0, 0x04); + } + m.setElement(1,(X10.encode(housecode)<<4)+X10.encode(devicecode)); + return m; + } static public SerialMessage getFunctionDim(int housecode, int function, int dimcode) { SerialMessage m = new SerialMessage(2); |