Files
JIMRI/java/test/jmri/jmrix/can/cbus/CbusThrottleManagerTest.java
T
2026-06-17 14:00:51 +02:00

932 lines
45 KiB
Java

package jmri.jmrix.can.cbus;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
import javax.annotation.Nonnull;
import jmri.*;
import jmri.jmrit.throttle.preferences.ThrottlesPreferences;
import jmri.jmrix.can.*;
import jmri.jmrix.can.cbus.node.CbusNode;
import jmri.jmrix.can.cbus.node.CbusNodeTableDataModel;
import jmri.util.JUnitAppender;
import jmri.util.JUnitUtil;
import jmri.util.junit.annotations.DisabledIfHeadless;
import jmri.util.swing.JemmyUtil;
import org.junit.jupiter.api.*;
/**
*
* @author Paul Bender Copyright (C) 2017
*/
public class CbusThrottleManagerTest extends jmri.managers.AbstractThrottleManagerTestBase {
@Test
public void testCbusThrottleManagerCTor() {
assertNotNull( tm, "exists");
}
@Test
public void testIncomingFunctions() {
assumeFalse( Boolean.getBoolean("jmri.skipTestsRequiringSeparateRunning"), "Ignoring intermittent test");
// CbusThrottleManager cbtm = (CbusThrottleManager) tm;
assertNotNull( tm, "exists");
DccLocoAddress addr = new DccLocoAddress(1234,true);
CancelRequestThrottleListen throtListen = new CancelRequestThrottleListen();
tm.requestThrottle(addr,throtListen,true);
assertEquals( "[78] 40 C4 D2",
tc.outbound.elementAt(tc.outbound.size() - 1).toString(),
"address request message 0x40 RLOC Request Loco");
assertEquals( 1, tc.outbound.size(), "count is correct");
// Allocate engine session 1 with all functions set to 0
CanReply r = new CanReply( new int[]{CbusConstants.CBUS_PLOC, 1, 0xc4, 0xd2, 0,0,0 },0x12 );
((CbusThrottleManager)tm).reply(r);
JUnitUtil.waitFor(()-> (tm.getThrottleUsageCount(addr)>0), "throttle didn't create");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(0)), "F0 init");
r = new CanReply( new int[]{CbusConstants.CBUS_DFUN, 1, 0x00, 0x00 },0x12 );
((CbusThrottleManager)tm).reply(r);
r.setElement(2, 1);
r.setElement(3, 0x1f);
((CbusThrottleManager)tm).reply(r);
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(0)), "F0 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(1)), "F1 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(2)), "F2 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(3)), "F3 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(4)), "F4 on");
r.setElement(3, 0x00);
((CbusThrottleManager)tm).reply(r);
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(0)), "F0 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(1)), "F1 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(2)), "F2 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(3)), "F3 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(4)), "F4 off");
r.setElement(2, 2);
r.setElement(3, 0x0f);
((CbusThrottleManager)tm).reply(r);
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(5)), "F5 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(6)), "F6 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(7)), "F7 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(8)), "F8 on");
r.setElement(3, 0x00);
((CbusThrottleManager)tm).reply(r);
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(5)), "F5 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(6)), "F6 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(7)), "F7 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(8)), "F8 off");
r.setElement(2, 3);
r.setElement(3, 0x0f);
((CbusThrottleManager)tm).reply(r);
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(9)), "F9 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(10)), "F10 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(11)), "F11 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(12)), "F12 on");
r.setElement(3, 0x00);
((CbusThrottleManager)tm).reply(r);
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(9)), "F9 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(10)), "F10 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(11)), "F11 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(12)), "F12 off");
r.setElement(2, 4);
r.setElement(3, 0xff);
((CbusThrottleManager)tm).reply(r);
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(13)), "F13 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(14)), "F14 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(15)), "F15 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(16)), "F16 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(17)), "F17 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(18)), "F18 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(19)), "F19 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(20)), "F20 on");
r.setElement(3, 0x00);
((CbusThrottleManager)tm).reply(r);
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(13)), "F13 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(14)), "F14 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(15)), "F15 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(16)), "F16 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(17)), "F17 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(18)), "F18 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(19)), "F19 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(20)), "F20 off");
r.setElement(2, 5);
r.setElement(3, 0xff);
((CbusThrottleManager)tm).reply(r);
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(21)), "F21 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(22)), "F22 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(23)), "F23 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(24)), "F24 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(25)), "F25 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(26)), "F26 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(27)), "F27 on");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(28)), "F28 on");
r.setElement(3, 0x00);
((CbusThrottleManager)tm).reply(r);
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(21)), "F21 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(22)), "F22 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(23)), "F23 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(24)), "F24 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(25)), "F25 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(26)), "F26 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(27)), "F27 off");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.getFunctionString(28)), "F28 off");
}
@Test
public void testIncomingFunctionsDecimal() {
assertNotNull( tm, "exists");
DccLocoAddress addr = new DccLocoAddress(221,true);
CancelRequestThrottleListen throtListen = new CancelRequestThrottleListen();
tm.requestThrottle(addr,throtListen,true);
assertEquals( "[78] 40 C0 DD",
tc.outbound.elementAt(tc.outbound.size() - 1).toString(),
"address request message OPC 0x40 RLOC Request Loco");
assertEquals( 1, tc.outbound.size(), "count is correct");
// Allocate engine session 1 with all functions set to 0
CanReply r = new CanReply( new int[]{CbusConstants.CBUS_PLOC, 1, 0xc0, 0xdd, 0,0,0 },0x12 );
((CbusThrottleManager)tm).reply(r);
JUnitUtil.waitFor(()->{ return(tm.getThrottleInfo(addr,"F0")!=null); }, "throttle not created");
r = new CanReply( new int[]{CbusConstants.CBUS_DFNON, 1, 0 },0x12 );
r.setElement(2, 0xff);
((CbusThrottleManager)tm).reply(r);
JUnitAppender.assertWarnMessageStartingWith("Unhandled update function number: 255");
for ( int i=0 ; (i < 29 ) ; i++){
String _f = "F" + i;
r.setElement(0, CbusConstants.CBUS_DFNON);
r.setElement(2, i);
((CbusThrottleManager)tm).reply(r);
JUnitUtil.waitFor(()->{ return(tm.getThrottleInfo(addr,_f).equals(true)); }, "Function loop on " + i);
// Assert.assertEquals("Function loop on " + i,true,cbtmb.getThrottleInfo(addr,_f));
r.setElement(0, CbusConstants.CBUS_DFNOF);
((CbusThrottleManager)tm).reply(r);
JUnitUtil.waitFor(()->{ return(tm.getThrottleInfo(addr,_f).equals(false)); }, "Function loop off " + i);
}
}
@Test
public void testIncomingSpeedDirection() {
assumeFalse( Boolean.getBoolean("jmri.skipTestsRequiringSeparateRunning"), "Ignoring intermittent test");
CbusThrottleManager cbtmb = (CbusThrottleManager) tm;
assertNotNull( cbtmb, "exists");
DccLocoAddress addr = new DccLocoAddress(422,true);
CancelRequestThrottleListen throtListen = new CancelRequestThrottleListen();
cbtmb.requestThrottle(addr,throtListen,true);
assertEquals( "[78] 40 C1 A6",
tc.outbound.elementAt(tc.outbound.size() - 1).toString(),
"address request message OPC 0x40 RLOC Request Loco");
assertEquals( 1, tc.outbound.size(), "count is correct");
// Allocate engine session 1 with all functions set to 0
CanReply r = new CanReply( new int[]{CbusConstants.CBUS_PLOC, 1, 0xc1, 0xa6, 0,0,0 },0x12 );
((CbusThrottleManager)tm).reply(r);
JUnitUtil.waitFor(()->{ return(cbtmb.getThrottleInfo(addr,"F0")!=null); }, "reply didn't arrive");
assertEquals( 0f, (float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.01f, "speed setting");
assertEquals( (1.0f/126.0f),(float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDINCREMENT),0.1f, "speed increment");
assertEquals( SpeedStepMode.NMRA_DCC_128,cbtmb.getThrottleInfo(addr,Throttle.SPEEDSTEPMODE),
"speed step mode");
r = new CanReply( new int[]{CbusConstants.CBUS_DSPD, 1, 0 },0x12 );
cbtmb.reply(r);
assertEquals( 0.0f, (float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.01f,
"speed setting 0");
JUnitUtil.waitFor(()->{ return(cbtmb.getThrottleInfo(addr,Throttle.ISFORWARD).equals(false)); }, "Throttle didn't update");
assertFalse( (boolean) cbtmb.getThrottleInfo(addr,Throttle.ISFORWARD), "is forward 0");
r = new CanReply( new int[]{CbusConstants.CBUS_DSPD, 77, 77 },0x12 );
cbtmb.reply(r);
assertEquals( 0.0f, (float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.01f,
"different session speed unchanged");
r = new CanReply( new int[]{CbusConstants.CBUS_DSPD, 1, 1 },0x12 );
cbtmb.reply(r);
assertEquals( -1.0f, (float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.01f, "speed setting 1");
assertFalse( (boolean) cbtmb.getThrottleInfo(addr,Throttle.ISFORWARD), "is forward 1");
r.setElement(2, 2);
cbtmb.reply(r);
assertEquals( (1.0f/126.0f), (float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.1f, "speed setting 2");
assertFalse( (boolean) cbtmb.getThrottleInfo(addr,Throttle.ISFORWARD), "is forward 2");
r.setElement(2, 77);
cbtmb.reply(r);
assertEquals( (76.0f/126.0f),(float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.1f, "speed setting 77");
assertFalse( (boolean) cbtmb.getThrottleInfo(addr,Throttle.ISFORWARD), "is forward 77");
r.setElement(2, 126);
cbtmb.reply(r);
assertEquals( (125.0f/126.0f),(float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.1f, "speed setting 126");
assertFalse( (boolean) cbtmb.getThrottleInfo(addr,Throttle.ISFORWARD), "is forward 126");
r.setElement(2, 127);
cbtmb.reply(r);
assertEquals( (1.0f),(float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.01f, "speed setting 127");
assertFalse( (boolean) cbtmb.getThrottleInfo(addr,Throttle.ISFORWARD), "is forward 127");
r.setElement(2, 128);
cbtmb.reply(r);
assertEquals( (0.0f),(float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.01f, "speed setting 128");
assertTrue( (boolean) cbtmb.getThrottleInfo(addr,Throttle.ISFORWARD), "is forward 128");
r.setElement(2, 129);
cbtmb.reply(r);
assertEquals( -1.0f, (float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.01f, "speed setting 129");
assertTrue( (boolean) cbtmb.getThrottleInfo(addr,Throttle.ISFORWARD), "is forward 129");
r.setElement(2, 130);
cbtmb.reply(r);
assertEquals( (1.0f/126.0f),(float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.1f, "speed setting 130");
assertTrue( (boolean) cbtmb.getThrottleInfo(addr,Throttle.ISFORWARD), "is forward 130");
r.setElement(2, 211);
cbtmb.reply(r);
assertEquals( (82.0f/126.0f),(float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.1f, "speed setting 211");
assertTrue( (boolean) cbtmb.getThrottleInfo(addr,Throttle.ISFORWARD), "is forward 211");
r.setElement(2, 254);
cbtmb.reply(r);
assertEquals( (125.0f/126.0f),(float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.1f, "speed setting 254");
assertTrue( (boolean) cbtmb.getThrottleInfo(addr,Throttle.ISFORWARD), "is forward 254");
r.setElement(2, 255);
cbtmb.reply(r);
assertEquals( (1.0f),(float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.01f, "speed setting 255");
assertTrue( (boolean) cbtmb.getThrottleInfo(addr,Throttle.ISFORWARD), "is forward 255");
r = new CanReply( new int[]{CbusConstants.CBUS_ESTOP },0x12 );
cbtmb.reply(r);
assertEquals( (-1.0f),(float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.01f, "speed setting estop");
assertTrue( (boolean) cbtmb.getThrottleInfo(addr,Throttle.ISFORWARD), "estop forward");
r = new CanReply( new int[]{CbusConstants.CBUS_DSPD, 1, 77 },0x12 );
cbtmb.reply(r);
assertEquals( (76.0f/126.0f),(float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.01f, "speed setting before reverse estop 77");
assertFalse( (boolean) cbtmb.getThrottleInfo(addr,Throttle.ISFORWARD), "is forward b4 estop 77");
r = new CanReply( new int[]{CbusConstants.CBUS_ESTOP },0x12 );
cbtmb.reply(r);
assertEquals( (-1.0f),(float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.1f, "speed setting estop");
assertFalse( (boolean) cbtmb.getThrottleInfo(addr,Throttle.ISFORWARD), "estop reverse");
r = new CanReply( new int[]{CbusConstants.CBUS_DSPD, 1, 255 },0x12 );
cbtmb.reply(r);
assertEquals( (1.0f),(float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.01f, "speed setting 255");
assertTrue( (boolean) cbtmb.getThrottleInfo(addr,Throttle.ISFORWARD), "is forward 255");
r = new CanReply( new int[]{CbusConstants.CBUS_RESTP },0x12 );
cbtmb.reply(r);
assertEquals( (-1.0f),(float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.01f, "speed setting r estop");
assertTrue( (boolean) cbtmb.getThrottleInfo(addr,Throttle.ISFORWARD), "restop forward");
r = new CanReply( new int[]{CbusConstants.CBUS_DSPD, 1, 77 },0x12 );
cbtmb.reply(r);
assertEquals( (76.0f/126.0f),(float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.01f, "speed setting before reverse restop 77");
assertFalse( (boolean) cbtmb.getThrottleInfo(addr,Throttle.ISFORWARD), "is forward b4 restop 77");
r = new CanReply( new int[]{CbusConstants.CBUS_RESTP },0x12 );
cbtmb.reply(r);
assertEquals( (-1.0f),(float) cbtmb.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.01f, "speed setting restop");
assertFalse( (boolean) cbtmb.getThrottleInfo(addr,Throttle.ISFORWARD), "restop reverse");
}
@Test
public void testMessage() {
assumeFalse( Boolean.getBoolean("jmri.skipTestsRequiringSeparateRunning"), "Ignoring intermittent test");
assertNotNull( tm, "exists");
DccLocoAddress addr = new DccLocoAddress(1234,true);
CancelRequestThrottleListen throtListen = new CancelRequestThrottleListen();
tm.requestThrottle(addr,throtListen,true);
assertEquals( "[78] 40 C4 D2",
tc.outbound.elementAt(tc.outbound.size() - 1).toString(),
"address request message OPC 0x40 RLOC Request Loco");
assertEquals( 1, tc.outbound.size(), "count is correct");
// Allocate engine session 1 with all functions set to 0
CanReply r = new CanReply( new int[]{CbusConstants.CBUS_PLOC, 1, 0xc4, 0xd2, 0,0,0 },0x12 );
((CbusThrottleManager)tm).reply(r);
JUnitUtil.waitFor(()->{ return(tm.getThrottleInfo(addr,"F0")!=null); }, "Throttle didn't create");
r = new CanReply( new int[]{CbusConstants.CBUS_DSPD, 1, 88 },0x12 );
r.setExtended(true);
((CbusThrottleManager)tm).reply(r);
assertEquals( 0f, (float)tm.getThrottleInfo(addr,Throttle.SPEEDSETTING));
r.setExtended(false);
r.setRtr(true);
((CbusThrottleManager)tm).reply(r);
assertEquals( 0f, (float)tm.getThrottleInfo(addr,Throttle.SPEEDSETTING));
r = new CanReply( new int[]{CbusConstants.CBUS_DSPD, 1, 77 },0x12 );
// rtr and extended both false by default
((CbusThrottleManager)tm).reply(r);
JUnitUtil.waitFor(()->{ return(((float)tm.getThrottleInfo(addr,Throttle.SPEEDSETTING))!=0f); }, "Speed command not received");
assertEquals( (76.0f/126.0f), (float) tm.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.1f, "msg speed setting before reverse estop 77");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.ISFORWARD), "msg is forward b4 estop 77");
CanMessage m = new CanMessage( new int[]{CbusConstants.CBUS_RESTP },0x12 );
((CbusThrottleManager)tm).message(m);
assertEquals( (-1.0f),(float) tm.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.01f, "msg speed setting estop");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.ISFORWARD), "msg estop reverse");
r = new CanReply( new int[]{CbusConstants.CBUS_DSPD, 44, 77 },0x12 );
((CbusThrottleManager)tm).reply(r);
assertEquals( -1.0f, (float) tm.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.01f, "msg speed setting unchanged wrong address");
r = new CanReply( new int[]{CbusConstants.CBUS_DSPD, 1, 77 },0x12 );
((CbusThrottleManager)tm).reply(r);
assertEquals( (76.0f/126.0f),(float) tm.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.1f, "msg speed setting before reverse estop 77");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.ISFORWARD), "msg is forward b4 estop 77");
m = new CanMessage( new int[]{CbusConstants.CBUS_ESTOP },0x12 );
m.setExtended(true);
((CbusThrottleManager)tm).message(m);
assertEquals( (76.0f/126.0f),(float) tm.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.1f, "msg speed setting Extended CAN ignored");
m.setExtended(false);
m.setRtr(true);
((CbusThrottleManager)tm).message(m);
assertEquals( (76.0f/126.0f),(float) tm.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.1f, "msg speed setting Rtr CAN ignored");
m.setRtr(false);
((CbusThrottleManager)tm).message(m);
assertEquals( (-1.0f),(float) tm.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.01f, "msg speed setting estop");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.ISFORWARD), "msg estop reverse");
r = new CanReply( new int[]{CbusConstants.CBUS_DSPD, 1, 77 },0x12 );
((CbusThrottleManager)tm).reply(r);
assertEquals( (76.0f/126.0f),(float) tm.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.1f, "msg speed setting before reverse estop 77");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.ISFORWARD), "msg is forward b4 estop 77");
m = new CanMessage( new int[]{CbusConstants.CBUS_DSPD, 1, 99 },0x12 );
((CbusThrottleManager)tm).message(m);
assertEquals( (76.0f/126.0f),(float) tm.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.1f, "msg speed does not change");
assertFalse( (boolean)tm.getThrottleInfo(addr,Throttle.ISFORWARD), "msg estop reverse");
m.setElement(2, 1);
((CbusThrottleManager)tm).message(m);
assertEquals( -1.0f, (float) tm.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.1f, "msg speed change estop");
assertFalse( (boolean) tm.getThrottleInfo(addr,Throttle.ISFORWARD), "msg estop reverse");
m.setElement(2, 129);
((CbusThrottleManager)tm).message(m);
assertEquals( -1.0f, (float) tm.getThrottleInfo(addr,Throttle.SPEEDSETTING),0.1f, "msg speed change estop");
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.ISFORWARD), "msg estop reverse");
m = new CanMessage( new int[]{CbusConstants.CBUS_KLOC, 22 },0x12 );
((CbusThrottleManager)tm).message(m);
assertTrue( (boolean) tm.getThrottleInfo(addr,Throttle.ISFORWARD), "addr unchanged as no session number match");
m = new CanMessage( new int[]{CbusConstants.CBUS_KLOC, 1 },0x12 );
((CbusThrottleManager)tm).message(m);
assertNull( tm.getThrottleInfo(addr,Throttle.SPEEDSETTING), "session cancelled");
}
@Test
public void testCbdispose() {
DccLocoAddress addr = new DccLocoAddress(555,true);
assertEquals( 0, tm.getThrottleUsageCount(addr), "throttle use 0");
CancelRequestThrottleListen throtListen = new CancelRequestThrottleListen();
tm.requestThrottle(addr,throtListen,true);
assertEquals( "[78] 40 C2 2B",
tc.outbound.elementAt(tc.outbound.size() - 1).toString(),
"address request message OPC 0x40 RLOC Request Loco");
assertEquals( 1, tc.outbound.size(), "count is correct");
// Allocate engine session 1 with all functions set to 0
CanReply r = new CanReply( new int[]{CbusConstants.CBUS_PLOC, 1, 0xc2, 0x2b, 0,0,0 },0x12 );
((CbusThrottleManager)tm).reply(r);
CbusThrottle cbt = new CbusThrottle(memo,addr,1);
JUnitUtil.waitFor(()-> tm.getThrottleUsageCount(addr)>0, "Throttle count did not increase");
assertEquals( 1, tm.getThrottleUsageCount(addr), "throttle use 1");
assertTrue( tm.disposeThrottle(cbt,throtListen));
JUnitUtil.waitFor(()->{ return(tm.getThrottleUsageCount(addr)==0); },
"Throttle Count did not go 0 on dispose, add retry rule for this if regular?");
assertEquals( 0, tm.getThrottleUsageCount(addr), "disposed throttle use 0");
assertNull( tm.getThrottleInfo(addr,Throttle.getFunctionString(28)), "NULL");
assertFalse(tm.disposeThrottle(null,throtListen));
}
private class CancelRequestThrottleListen implements ThrottleListener {
private boolean failedRequest;
String lastNotification = "";
@Override
public void notifyThrottleFound(DccThrottle t){
throttle = t;
lastNotification = "created a throttle";
}
@Override
public void notifyFailedThrottleRequest(LocoAddress address, String reason){
failedRequest = true;
lastNotification = "Throttle request failed for " + address + " because " + reason;
}
@Override
public void notifyDecisionRequired(LocoAddress address, DecisionType question) {
// this is a never-stealing impelementation.
if ( question == DecisionType.STEAL ){
InstanceManager.throttleManagerInstance().cancelThrottleRequest(address, this);
lastNotification = "1: Got a Steal question "+ address;
}
if ( question == DecisionType.SHARE ){
InstanceManager.throttleManagerInstance().cancelThrottleRequest(address, this);
lastNotification = "1: Got a Share question "+ address;
}
if ( question == DecisionType.STEAL_OR_SHARE ){
InstanceManager.throttleManagerInstance().cancelThrottleRequest(address, this);
lastNotification = "1: Got a Steal OR Share question "+ address;
}
}
boolean getFailedRequest() {
return failedRequest;
}
@Nonnull
String getLastNotification() {
return lastNotification;
}
}
private class StealRequestThrottleListen extends CancelRequestThrottleListen{
@Override
public void notifyDecisionRequired(LocoAddress address, DecisionType question) {
if ( question == DecisionType.STEAL ){
InstanceManager.throttleManagerInstance().responseThrottleDecision(address, null, DecisionType.STEAL );
lastNotification = "2: Got a Steal question " + address;
}
if ( question == DecisionType.SHARE ){
InstanceManager.throttleManagerInstance().cancelThrottleRequest(address, this);
lastNotification = "2: Got a Share question " + address;
}
if ( question == DecisionType.STEAL_OR_SHARE ){
InstanceManager.throttleManagerInstance().responseThrottleDecision(address, null, DecisionType.STEAL );
lastNotification = "2: Got a steal OR share question " + address;
}
}
}
// Failed Throttle request when unable to steal / share the session
// as no command station reporting as a node
@Test
public void testCreateCbusThrottleStealScenario1() {
CancelRequestThrottleListen throtListen = new CancelRequestThrottleListen();
memo.setDisabled(true); // disable access to memo.get(CommandStation.class);
tm.requestThrottle(129, throtListen, true);
assertEquals( "[78] 40 C0 81",
tc.outbound.elementAt(tc.outbound.size() - 1).toString(),
"address request message OPC 0x40 RLOC Request Loco");
assertEquals( 1, tc.outbound.size(), "count is correct");
CanReply r = new CanReply( new int[]{CbusConstants.CBUS_ERR, 0xc0, 0x81, 0x02 },0x12 ); // Loco address taken
((CbusThrottleManager)tm).reply(r);
assertEquals( "Throttle request failed for 129(L) because Loco address 129 taken",
throtListen.getLastNotification());
assertTrue( throtListen.getFailedRequest(), "No steal or share request");
}
@Test
public void testCreateCbusThrottleStealScenario2() {
CancelRequestThrottleListen throtListen = new CancelRequestThrottleListen();
CbusNodeTableDataModel nodemodel = memo.get(CbusConfigurationManager.class)
.provide(CbusNodeTableDataModel.class);
// register a command station in the node table so can be found by the Command Station
CbusNode cs = nodemodel.provideNodeByNodeNum(65534);
cs.setCsNum(0); // Command Station 0 is master command station
cs.getNodeParamManager().setParameters(new int[]{7,165,4,10,0,0,255,4}); // in this test we emaulate a CANCMD v4
cs.getNodeNvManager().setNV(2, 0b00000110); // steal + share enabled
tm.requestThrottle(141, throtListen, true);
assertEquals( "[78] 40 C0 8D",
tc.outbound.elementAt(tc.outbound.size() - 1).toString(),
"address request message OPC 0x40 RLOC Request Loco");
assertEquals( 1, tc.outbound.size(), "count is correct");
CanReply r = new CanReply( new int[]{CbusConstants.CBUS_ERR, 0xc0, 0x8d, 0x02 },0x12 ); // Loco address taken
((CbusThrottleManager)tm).reply(r);
assertEquals("1: Got a Steal OR Share question 141(L)",
throtListen.getLastNotification());
// which was cancelled by the throttlelistener
cs.getNodeNvManager().setNV(2, 0b00000010); // steal only enabled
tm.requestThrottle(141, throtListen, true);
assertEquals( "[78] 40 C0 8D",
tc.outbound.elementAt(tc.outbound.size() - 1).toString(),
"address request message OPC 0x40 RLOC Request Loco");
assertEquals( 2, tc.outbound.size(), "count is correct");
r = new CanReply( new int[]{CbusConstants.CBUS_ERR, 0xc0, 0x8d, 0x02 },0x12 ); // Loco address taken
((CbusThrottleManager)tm).reply(r);
assertEquals("1: Got a Steal question 141(L)",
throtListen.getLastNotification());
// which was cancelled by the throttlelistener
cs.getNodeNvManager().setNV(2, 0b00000100); // share only enabled
tm.requestThrottle(141, throtListen, true);
assertEquals( "[78] 40 C0 8D",
tc.outbound.elementAt(tc.outbound.size() - 1).toString(),
"address request message OPC 0x61 RLOC Request Loco");
assertEquals( 3, tc.outbound.size(), "count is correct");
r = new CanReply( new int[]{CbusConstants.CBUS_ERR, 0xc0, 0x8d, 0x02 },0x12 ); // Loco address taken
((CbusThrottleManager)tm).reply(r);
assertEquals("1: Got a Share question 141(L)",
throtListen.getLastNotification());
// which was cancelled by the throttlelistener
nodemodel.dispose();
}
// test default share attempt when no options checked
@Test
public void testCreateCbusThrottleDefaultShareScenario() {
CancelRequestThrottleListen throtListen = new CancelRequestThrottleListen();
CbusNodeTableDataModel nodemodel = memo.get(CbusConfigurationManager.class)
.provide(CbusNodeTableDataModel.class);
// register a command station in the node table so can be found by the Command Station
CbusNode cs = nodemodel.provideNodeByNodeNum(65534);
cs.setCsNum(0); // Command Station 0 is master command station
cs.getNodeParamManager().setParameters(new int[]{7,165,4,10,0,0,255,4}); // in this test we emaulate a CANCMD v4
cs.getNodeNvManager().setNV(2, 0b00000110); // steal + share enabled
((CbusThrottleManager)tm).requestThrottle(141, throtListen, false);
assertEquals( "[78] 40 C0 8D",
tc.outbound.elementAt(tc.outbound.size() - 1).toString(),
"address request message OPC 0x40 RLOC Request Loco"); //
assertEquals( 1, tc.outbound.size(), "count is correct");
CanReply r = new CanReply( new int[]{CbusConstants.CBUS_ERR, 0xc0, 0x8d, 0x02 },0x12 ); // Loco address taken
((CbusThrottleManager)tm).reply(r);
assertEquals( "[78] 61 C0 8D 02",
tc.outbound.elementAt(tc.outbound.size() - 1).toString(),
"address request message OPC 0x40 GLOC Request Share Loco");
assertEquals( 2, tc.outbound.size(), "count is correct");
assertFalse( throtListen.getFailedRequest(), "not yet failed");
r = new CanReply( new int[]{CbusConstants.CBUS_ERR, 0xc0, 0x8d, 0x02 },0x12 ); // Loco address taken
((CbusThrottleManager)tm).reply(r);
assertTrue( throtListen.getFailedRequest(), "Failed on 2nd attempt");
assertEquals("Throttle request failed for 141(L) because Loco address 141 taken",
throtListen.getLastNotification());
nodemodel.dispose();
}
// test steal attempt when silent steal checked
@Test
public void testCreateCbusThrottleSilentStealCheckedScenario() {
CancelRequestThrottleListen throtListen = new CancelRequestThrottleListen();
CbusNodeTableDataModel nodemodel = memo.get(CbusConfigurationManager.class)
.provide(CbusNodeTableDataModel.class);
// register a command station in the node table so can be found by the Command Station
CbusNode cs = new CbusNode(memo, 65534);
cs.setCsNum(0); // Command Station 0 is master command station
// in this test we emulate a CANCMD v4 but with just 10 NVs
cs.getNodeParamManager().setParameters(new int[]{7,165,4,10,0,0,10,4});
// NV2 = steal + share enabled
// set all NVs so Node Manager does not request them from the Node.
int[] nVs = {10,1,0b00000110,3,4,5,6,7,8,9,10};
cs.getNodeNvManager().setNVs(nVs);
nodemodel.addNode(cs);
// set ThrottlesPreferences to steal enabled
InstanceManager.getDefault(ThrottlesPreferences.class).setSilentSteal(true);
tm.requestThrottle(141, throtListen, false);
assertEquals( "[78] 40 C0 8D",
tc.outbound.elementAt(tc.outbound.size() - 1).toString(),
"address request message OPC 0x40 RLOC Request Loco");
assertEquals( 1, tc.outbound.size(), () -> "count is correct "+tc.outbound);
CanReply r = new CanReply( new int[]{CbusConstants.CBUS_ERR, 0xc0, 0x8d, 0x02 },0x12 ); // Loco address taken
((CbusThrottleManager)tm).reply(r);
JUnitUtil.waitFor(()-> tc.outbound.size()>1 , "gloc to request ");
assertEquals( "[78] 61 C0 8D 01",
tc.outbound.elementAt(tc.outbound.size() - 1).toString(),
"address request message OPC 0x40 GLOC Request Steal Loco");
assertEquals( 2, tc.outbound.size(), "count is correct");
assertFalse( throtListen.getFailedRequest(), "not yet failed");
r = new CanReply( new int[]{CbusConstants.CBUS_ERR, 0xc0, 0x8d, 0x02 },0x12 ); // Loco address taken
((CbusThrottleManager)tm).reply(r);
assertTrue( throtListen.getFailedRequest(), "Failed on 2nd attempt");
assertEquals("Throttle request failed for 141(L) because Loco address 141 taken",
throtListen.getLastNotification());
nodemodel.dispose();
}
// test default steal attempt when no options checked
@Test
public void testCreateCbusThrottleDefaultNoShareavailableScenario() {
CancelRequestThrottleListen throtListen = new CancelRequestThrottleListen();
CbusNodeTableDataModel nodemodel = memo.get(CbusConfigurationManager.class)
.provide(CbusNodeTableDataModel.class);
// register a command station in the node table so can be found by the Command Station
CbusNode cs = nodemodel.provideNodeByNodeNum(65534);
cs.setCsNum(0); // Command Station 0 is master command station
cs.getNodeParamManager().setParameters(new int[]{7,165,4,10,0,0,255,4}); // in this test we emaulate a CANCMD v4
cs.getNodeNvManager().setNV(2, 0b00000100); // steal enabled
tm.requestThrottle(141, throtListen, false);
assertEquals( "[78] 40 C0 8D",
tc.outbound.elementAt(tc.outbound.size() - 1).toString(),
"address request message OPC 0x40 RLOC Request Loco");
assertEquals( 1, tc.outbound.size(), "count is correct");
CanReply r = new CanReply( new int[]{CbusConstants.CBUS_ERR, 0xc0, 0x8d, 0x02 },0x12 ); // Loco address taken
((CbusThrottleManager)tm).reply(r);
assertEquals( "[78] 61 C0 8D 02",
tc.outbound.elementAt(tc.outbound.size() - 1).toString(),
"address request message OPC 0x61 GLOC Request Share Loco");
assertEquals( 2, tc.outbound.size(), () -> "count is correct " + tc.outbound.toString());
assertFalse( throtListen.getFailedRequest(), "not yet failed");
r = new CanReply( new int[]{CbusConstants.CBUS_ERR, 0xc0, 0x8d, 0x02 },0x12 ); // Loco address taken
((CbusThrottleManager)tm).reply(r);
assertTrue( throtListen.getFailedRequest(), "Failed on 2nd attempt");
assertEquals("Throttle request failed for 141(L) because Loco address 141 taken",
throtListen.getLastNotification());
nodemodel.dispose();
}
// throttle acquired after 2nd level response
@Test
public void testCreateCbusThrottleSteal() {
StealRequestThrottleListen throtListen = new StealRequestThrottleListen();
CbusNodeTableDataModel nodemodel = memo.get(CbusConfigurationManager.class)
.provide(CbusNodeTableDataModel.class);
// register a command station in the node table so can be found by the Command Station
CbusNode cs = nodemodel.provideNodeByNodeNum(65534);
cs.setCsNum(0); // Command Station 0 is master command station
cs.getNodeParamManager().setParameters(new int[]{7,165,4,10,0,0,255,4}); // in this test we emaulate a CANCMD v4
cs.getNodeNvManager().setNV(2, 0b00000010); // steal enabled
tm.requestThrottle(141, throtListen, true);
assertEquals( "[78] 40 C0 8D",
tc.outbound.elementAt(tc.outbound.size() - 1).toString(),
"address request message OPC 0x40 RLOC Request Loco");
assertEquals( 1, tc.outbound.size(), "count is correct");
CanReply r = new CanReply( new int[]{CbusConstants.CBUS_ERR, 0xc0, 0x8d, 0x02 },0x12 ); // Loco address taken
((CbusThrottleManager)tm).reply(r);
assertEquals("2: Got a Steal question 141(L)",
throtListen.getLastNotification());
// which was confirmed please steal by the throttlelistener
assertEquals( "[78] 61 C0 8D 01",
tc.outbound.elementAt(tc.outbound.size() - 1).toString(),
"steal request message OPC 0x61 GLOC Request Steal Loco");
assertEquals( 2, tc.outbound.size(), "count is correct");
assertFalse( throtListen.getFailedRequest(), "not yet failed");
r = new CanReply();
r.setHeader(tc.getCanid());
r.setNumDataElements(8);
r.setElement(0, CbusConstants.CBUS_PLOC);
r.setElement(1, 0x01); // session 1
r.setElement(2, 0xc0); // dcc ms byte
r.setElement(3, 0x8d); // dcc ls byte
r.setElement(4, 0xa7); // speed direction
r.setElement(5, 0xa2); // function f0 to f4
r.setElement(6, 0x7b); // function f5 to f8
r.setElement(7, 0x00); // function f9 to f12
((CbusThrottleManager)tm).reply(r);
assertEquals("created a throttle",
throtListen.getLastNotification());
assertNotNull(throttle);
throttle.dispose(throtListen);
nodemodel.dispose();
}
@Test
public void testStealShareOptionsEnabled() {
assertTrue( tm.enablePrefSilentStealOption(), "Can Silent Steal");
assertTrue( tm.enablePrefSilentShareOption(), "Can Silent Share");
}
@Test
public void testIsLongAddress() {
assertFalse( CbusThrottleManager.isLongAddress(1), "local isLong 1");
assertFalse( CbusThrottleManager.isLongAddress(127), "local isLong 127");
assertTrue( CbusThrottleManager.isLongAddress(128), "local isLong 128");
assertTrue( CbusThrottleManager.isLongAddress(129), "local isLong 129");
assertFalse( tm.canBeLongAddress(0), "can be long 0");
assertTrue( tm.canBeLongAddress(1), "can be long 1");
}
@Test
public void testNotADccLocoAddress() {
CbusThrottleManager cbtmb = (CbusThrottleManager)tm;
cbtmb.responseThrottleDecision(null,null,null);
JUnitAppender.assertErrorMessageStartsWith("null is not a DccLocoAddress");
}
@Test
@DisabledIfHeadless
public void testCanErrorsReceived() {
CbusThrottleManager ncbtm = (CbusThrottleManager)tm;
CanReply r = new CanReply(
new int[]{CbusConstants.CBUS_ERR, 0x00, 0x00, CbusConstants.ERR_CAN_BUS_ERROR },0x11 );
Thread t1 = new Thread(() -> {
JemmyUtil.pressDialogButton(Bundle.getMessage("CBUS_ERROR"), Bundle.getMessage("ButtonOK"));
});
// pass the message
ncbtm.reply(r);
JUnitUtil.waitFor(()-> !t1.isAlive(), "checkCanErrorDialog finished");
JUnitAppender.assertErrorMessageStartsWith(Bundle.getMessage("ERR_CAN_BUS_ERROR"));
JUnitUtil.resetWindows(false, false); // nameless invisible frame created by creating a dialog with a null parent
}
@Test
@DisabledIfHeadless
public void testInvalidRequestErrorsReceived() {
CbusThrottleManager ncbtm = (CbusThrottleManager)tm;
CanReply r = new CanReply(
new int[]{CbusConstants.CBUS_ERR, 0x00, 0x00, CbusConstants.ERR_INVALID_REQUEST },0x11 );
Thread t1 = new Thread(() -> {
JemmyUtil.pressDialogButton(Bundle.getMessage("CBUS_ERROR"), Bundle.getMessage("ButtonOK"));
});
// pass the message
ncbtm.reply(r);
JUnitUtil.waitFor(()-> !t1.isAlive(), "checkCbusInvalidRequestDialog finished");
JUnitAppender.assertErrorMessageStartsWith(Bundle.getMessage("ERR_INVALID_REQUEST"));
JUnitUtil.resetWindows(false, false); // nameless invisible frame created by creating a dialog with a null parent
}
@Test
@Override
public void testGetThrottleInfo() {
DccLocoAddress addr = new DccLocoAddress(42, false);
assertEquals( 0, tm.getThrottleUsageCount(addr), "throttle use 0");
assertEquals( 0, tm.getThrottleUsageCount(42, false), "throttle use 0");
assertNull( tm.getThrottleInfo(addr, Throttle.getFunctionString(28)), "NULL");
CancelRequestThrottleListen throtListen = new CancelRequestThrottleListen();
tm.requestThrottle(addr, throtListen, true);
assertEquals( "[78] 40 00 2A",
tc.outbound.elementAt(tc.outbound.size() - 1).toString(),
"address request message OPC 0x40 RLOC Request Loco");
assertEquals( 1, tc.outbound.size(), "count is correct");
// Allocate engine session 1 with all functions set to 0
CanReply r = new CanReply( new int[]{CbusConstants.CBUS_PLOC, 1, 0x00, 0x2a, 0,0,0 },0x12 );
((CbusThrottleManager)tm).reply(r);
JUnitUtil.waitFor(()->{ return(tm.getThrottleInfo(addr,Throttle.ISFORWARD)!=null); }, "reply didn't arrive");
assertNotNull( tm.getThrottleInfo(addr,Throttle.ISFORWARD), "is forward");
assertNotNull( tm.getThrottleInfo(addr,Throttle.SPEEDSETTING), "speed setting");
assertNotNull( tm.getThrottleInfo(addr,Throttle.SPEEDINCREMENT), "speed increment");
assertNotNull( tm.getThrottleInfo(addr,Throttle.SPEEDSTEPMODE), "speed step mode");
for ( int i = 0; i<29; i++) {
assertNotNull( tm.getThrottleInfo(addr,Throttle.getFunctionString(i)),
Throttle.getFunctionString(i));
}
assertNull( tm.getThrottleInfo(addr,"NOT A VARIABLE"), "NULL");
assertEquals( 1, tm.getThrottleUsageCount(addr), "throttle use 1 addr");
assertEquals( 1, tm.getThrottleUsageCount(42,false), "throttle use 1 int b");
assertEquals( 0, tm.getThrottleUsageCount(77,true), "throttle use 0");
}
@Test
public void testThrottleAddress10239() {
CbusThrottleManager cbtmb = (CbusThrottleManager) tm;
assertNotNull(cbtmb);
DccLocoAddress addr = new DccLocoAddress(10239,true);
CancelRequestThrottleListen throtListen = new CancelRequestThrottleListen();
cbtmb.requestThrottle(addr,throtListen,true);
assertEquals( "[78] 40 E7 FF",
tc.outbound.elementAt(tc.outbound.size() - 1).toString(),
"address request message OPC 0x40 RLOC Request Loco");
assertEquals( 1, tc.outbound.size(), "count is correct");
}
private CanSystemConnectionMemo memo;
private DccThrottle throttle;
private TrafficControllerScaffold tc;
@BeforeEach
@Override
public void setUp() {
JUnitUtil.setUp();
JUnitUtil.resetInstanceManager();
tc = new TrafficControllerScaffold();
memo = new CanSystemConnectionMemo();
memo.setProtocol(jmri.jmrix.can.CanConfigurationManager.SPROGCBUS);
memo.setTrafficController(tc);
memo.configureManagers();
tm = memo.get(ThrottleManager.class);
}
@AfterEach
public void tearDown() {
tm.dispose();
tm = null;
memo.dispose();
memo = null;
tc.terminateThreads();
tc = null;
JUnitUtil.deregisterBlockManagerShutdownTask();
JUnitUtil.tearDown();
}
// private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(CbusThrottleManagerTest.class);
}