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

647 lines
27 KiB
Java

package jmri.jmrix.can.cbus.simulator;
import jmri.jmrix.can.CanMessage;
import jmri.jmrix.can.CanReply;
import jmri.jmrix.can.CanSystemConnectionMemo;
import jmri.jmrix.can.TrafficControllerScaffold;
import jmri.jmrix.can.cbus.CbusConstants;
import jmri.jmrix.can.cbus.simulator.moduletypes.MergCanpan;
import jmri.util.JUnitUtil;
import org.junit.Assert;
import org.junit.jupiter.api.*;
/**
* Tests for CbusDummyNode.
* @author Paul Bender Copyright (C) 2017
* @author Steve Young Copyright (C) 2019
*/
public class CbusDummyNodeTest {
private TrafficControllerScaffold tcis;
private CanSystemConnectionMemo memo;
@Test
public void testCTor() {
CbusDummyNode t = new CbusDummyNode(null, 1);
Assert.assertNotNull("exists",t);
t.dispose();
}
@Test
public void testListeners() {
Assert.assertTrue("0 listeners",tcis.numListeners()==0);
CbusDummyNode t = new CbusDummyNode(memo, 1 );
Assert.assertTrue("1 listener",tcis.numListeners()==1);
var listen = t.getCanListener();
Assertions.assertTrue(listen instanceof CbusSimCanListener );
CbusSimCanListener nodeListener = (CbusSimCanListener) listen;
Assert.assertTrue("start getDelay", nodeListener.getDelay()>0);
nodeListener.setDelay(7);
Assert.assertEquals("getSetDelay", 7,nodeListener.getDelay());
t.dispose();
Assert.assertTrue("0 listeners after dispose",tcis.numListeners()==0);
}
@Test
public void testNodeRequestNumber() {
CbusDummyNode t = new MergCanpan().getNewDummyNode( memo, 1);
var listen = t.getCanListener();
Assertions.assertTrue(listen instanceof CbusSimCanListener );
CbusSimCanListener nodeListener = (CbusSimCanListener) listen;
nodeListener.setDelay(0);
Assert.assertFalse("start getProcessIn", nodeListener.getProcessIn() );
Assert.assertTrue("start getProcessOut", nodeListener.getProcessOut() );
Assert.assertTrue("start getSendIn", nodeListener.getSendIn() );
Assert.assertFalse("start getSendOut", nodeListener.getSendOut() );
Assert.assertFalse("start getsendsWRACKonNVSET", t.getnvWriteInLearnOnly());
Assert.assertFalse("is a CANPAN getsendsWRACKonNVSET",t.getsendsWRACKonNVSET());
Assert.assertEquals(" getNodeType", "CANPAN",t.getNodeStats().getNodeTypeName() );
Assert.assertTrue("canpan getTotalNVs 0",t.getNodeNvManager().getTotalNVs()== 1 );
t.flimButton();
JUnitUtil.waitFor(()->{ return(!tcis.inbound.isEmpty()); }, " reply didn't arrive");
Assert.assertEquals(" 0 outbound not increased", 0,(tcis.outbound.size()));
Assert.assertEquals(" 1 inbound nodenum request ", 1,(tcis.inbound.size()));
Assert.assertEquals("node request inbound", "[5f8] 50 00 01",
tcis.inbound.elementAt(tcis.inbound.size() - 1).toString());
// node in setup mode awaiting node allocation frame or further setup info request
nodeListener.setSendOut(true);
nodeListener.setSendIn(false);
Assert.assertTrue(" getSendOut", nodeListener.getSendOut() );
Assert.assertFalse(" getSendIn", nodeListener.getSendIn() );
nodeListener.setProcessIn(true);
nodeListener.setProcessOut(false);
Assert.assertTrue("start getProcessIn", nodeListener.getProcessIn() );
Assert.assertFalse("start getProcessOut", nodeListener.getProcessOut() );
CanReply r = new CanReply();
r.setHeader(tcis.getCanid());
r.setNumDataElements(1);
r.setElement(0, CbusConstants.CBUS_RQNP);
t.getCanListener().reply(r);
CanMessage m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(1);
m.setElement(0, CbusConstants.CBUS_RQNP);
t.getCanListener().message(m); // should be ignored
JUnitUtil.waitFor(()->{ return(!tcis.outbound.isEmpty()); }, " reply didn't arrive");
Assert.assertEquals(" 1 outbound params request", 1,(tcis.outbound.size() ) );
Assert.assertEquals(" 1 inbound not increased ", 1,(tcis.inbound.size() ) );
Assert.assertEquals("node responds with parameters setup", "[5f8] EF A5 59 1D 80 0D 01 01",
tcis.outbound.elementAt(tcis.outbound.size() - 1).toString());
nodeListener.setProcessIn(false);
nodeListener.setProcessOut(true);
nodeListener.setSendOut(false);
nodeListener.setSendIn(true);
Assert.assertFalse(" getSendOut f", nodeListener.getSendOut() );
Assert.assertTrue(" getSendIn t", nodeListener.getSendIn() );
r = new CanReply();
r.setHeader(tcis.getCanid());
r.setNumDataElements(3);
r.setElement(0, CbusConstants.CBUS_SNN);
r.setElement(1, 0xb1); // nn
r.setElement(2, 0x2c); // nn
t.getCanListener().reply(r); // should be ignored
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(3);
m.setElement(0, CbusConstants.CBUS_SNN);
m.setElement(1, 0xb1);
m.setElement(2, 0x2c);
t.getCanListener().message(m);
JUnitUtil.waitFor(()->{ return(tcis.inbound.size()>1); }, " inbound 2 didn't arrive");
Assert.assertEquals(" 1 outbound not increased", 1,(tcis.outbound.size() ) );
Assert.assertEquals(" 2 inbound ", 2,(tcis.inbound.size() ) );
Assert.assertEquals("node responds confirming node number", "[5f8] 52 B1 2C",
tcis.inbound.elementAt(tcis.inbound.size() - 1).toString());
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(1);
m.setElement(0, CbusConstants.CBUS_QNN);
t.getCanListener().message(m);
Assert.assertEquals(" 1 outbound not increased", 1,(tcis.outbound.size() ) );
JUnitUtil.waitFor(()->{ return(tcis.inbound.size()>2); }, " inbound 3 didn't arrive");
Assert.assertEquals(" 3 inbound ", 3,(tcis.inbound.size() ) );
Assert.assertEquals("node responds to QNN with PNN", "[5f8] B6 B1 2C A5 1D 0D",
tcis.inbound.elementAt(tcis.inbound.size() - 1).toString());
// set node to SLIM to check inbound and outbound listeners
t.setNodeInFLiMMode(false);
t.getCanListener().message(m);
Assert.assertEquals(" 1 outbound not increased", 1,(tcis.outbound.size() ) );
Assert.assertEquals(" 3 inbound not increased", 3,(tcis.inbound.size() ) );
t.dispose();
}
@Test
public void testNodeFetchParameters() {
// dummy CANPAN
CbusDummyNode t = new MergCanpan().getNewDummyNode(memo, 1234);
var listen = t.getCanListener();
Assertions.assertTrue(listen instanceof CbusSimCanListener );
((CbusSimCanListener) listen).setDelay(0);
t.setNodeInFLiMMode(true);
// get event variables with knowledge of index
CanMessage m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(3);
m.setElement(0, CbusConstants.CBUS_RQNPN);
m.setElement(1, 0x04); // node 1234
m.setElement(2, 0xd2); // node 1234
m.setElement(3, 0x00); // parameter index on node, 0 is total parameters
t.getCanListener().message(m);
JUnitUtil.waitFor(()->{ return(!tcis.inbound.isEmpty()); }, " inbound 1 didn't arrive");
Assert.assertEquals(" 1 inbound increase", 1,(tcis.inbound.size() ) );
Assert.assertEquals("node 1234 responds parameter index 0 val 20", "[5f8] 9B 04 D2 00 14",
tcis.inbound.elementAt(tcis.inbound.size() - 1).toString());
m.setElement(3, 0x05); // parameter index on node, 5 is total ev vars per ev
t.getCanListener().message(m);
JUnitUtil.waitFor(()->{ return(tcis.inbound.size()>1); }, " inbound 2 didn't arrive");
Assert.assertEquals(" 2 inbound increase", 2,(tcis.inbound.size() ) );
Assert.assertEquals("node 1234 responds parameter index 5 val 13", "[5f8] 9B 04 D2 05 0D",
tcis.inbound.elementAt(tcis.inbound.size() - 1).toString());
t.dispose();
}
@Test
public void testNodeFetchTeachNV() {
// dummy CANPAN
CbusDummyNode t = new MergCanpan().getNewDummyNode(memo, 1234);
var listen = t.getCanListener();
Assertions.assertTrue(listen instanceof CbusSimCanListener );
((CbusSimCanListener) listen).setDelay(0);
t.setNodeInFLiMMode(true);
// get node variable
CanMessage m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(3);
m.setElement(0, CbusConstants.CBUS_NVRD);
m.setElement(1, 0x04); // node 1234
m.setElement(2, 0xd2); // node 1234
m.setElement(3, 0x00); // NV index on node, 0 is total node variables
t.getCanListener().message(m);
JUnitUtil.waitFor(()->{ return(!tcis.inbound.isEmpty()); }, " inbound 1 didn't arrive");
Assert.assertEquals(" 1 inbound increase", 1,(tcis.inbound.size() ) );
Assert.assertEquals("node 1234 responds nv index 0 val 1", "[5f8] 97 04 D2 00 01",
tcis.inbound.elementAt(tcis.inbound.size() - 1).toString());
m.setElement(3, 0x01); // nv index on node
t.getCanListener().message(m);
JUnitUtil.waitFor(()->{ return(tcis.inbound.size()>1); }, " inbound 2 didn't arrive");
Assert.assertEquals(" 2 inbound increase", 2,(tcis.inbound.size() ) );
Assert.assertEquals("node 1234 responds nv index 1 val 0", "[5f8] 97 04 D2 01 00",
tcis.inbound.elementAt(tcis.inbound.size() - 1).toString());
// set NV1 to 02 ( all states ON )
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(5);
m.setElement(0, CbusConstants.CBUS_NVSET);
m.setElement(1, 0x04); // node 1234
m.setElement(2, 0xd2); // node 1234
m.setElement(3, 0x01); // NV index on node
m.setElement(4, 0x02); // new NV value
t.getCanListener().message(m);
// note CANPAN does not confirm NVSET so no response from node
// re-request NV value 1 to confirm changed and no unexpected inbound
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(3);
m.setElement(0, CbusConstants.CBUS_NVRD);
m.setElement(1, 0x04); // node 1234
m.setElement(2, 0xd2); // node 1234
m.setElement(3, 0x01); // NV index on node
t.getCanListener().message(m);
JUnitUtil.waitFor(()->{ return(tcis.inbound.size()>2); }, " inbound 3 didn't arrive");
Assert.assertEquals(" 3 inbound increase", 3,(tcis.inbound.size() ) );
Assert.assertEquals("node 1234 responds nv index 1 val 2", "[5f8] 97 04 D2 01 02",
tcis.inbound.elementAt(tcis.inbound.size() - 1).toString());
// set NV1 to 255 ( invalid )
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(5);
m.setElement(0, CbusConstants.CBUS_NVSET);
m.setElement(1, 0x04); // node 1234
m.setElement(2, 0xd2); // node 1234
m.setElement(3, 0x77); // NV index on node
m.setElement(4, 0xff); // new NV value
t.getCanListener().message(m);
JUnitUtil.waitFor(()->{ return(tcis.inbound.size()>3); }, " inbound 4 didn't arrive");
Assert.assertEquals(" 4 inbound increase", 4,(tcis.inbound.size() ) );
Assert.assertEquals("node 1234 nv index 77 val ff error 10 Invalid NV Index", "[5f8] 6F 04 D2 0A",
tcis.inbound.elementAt(tcis.inbound.size() - 1).toString());
m.setElement(3, 0x00); // NV index on node
m.setElement(4, 0x01); // new NV value
t.getCanListener().message(m);
JUnitUtil.waitFor(()->{ return(tcis.inbound.size()>4); }, " inbound 5 didn't arrive");
Assert.assertEquals(" 5 inbound increase", 5,(tcis.inbound.size() ) );
Assert.assertEquals("node 1234 nv index 0 val 01 error 10 Invalid NV Index", "[5f8] 6F 04 D2 0A",
tcis.inbound.elementAt(tcis.inbound.size() - 1).toString());
t.dispose();
}
@Test
public void testNodeLearnEvent() {
CbusDummyNode t = new MergCanpan().getNewDummyNode(memo, 1234);
var listen = t.getCanListener();
Assertions.assertTrue(listen instanceof CbusSimCanListener );
((CbusSimCanListener) listen).setDelay(0);
t.setNodeInFLiMMode(true);
Assert.assertEquals(" 0 outbound not increased", 0,(tcis.outbound.size() ) );
Assert.assertEquals(" 0 inbound not increased", 0,(tcis.inbound.size() ) );
// frame to set node into learn
CanMessage m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(3);
m.setElement(0, CbusConstants.CBUS_NNLRN);
m.setElement(1, 0x04);
m.setElement(2, 0xd2);
t.getCanListener().message(m);
Assert.assertTrue("message enter learn mode ",t.getNodeInLearnMode() );
Assert.assertEquals("Initial FLiM getTotalNodeEvents ",-1,t.getNodeEventManager().getTotalNodeEvents() );
// teach the node an event ( CANPAN has 13 event variables hence the loop )
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(7);
m.setElement(0, CbusConstants.CBUS_EVLRN);
m.setElement(1, 0x00); // node 4
m.setElement(2, 0x04); // node 4
m.setElement(3, 0x00); // event 1
m.setElement(4, 0x01); // event 1
m.setElement(5, 0x01); // event variable index - NOT event index on node
m.setElement(6, 0x04); // event variable value
t.getCanListener().message(m);
JUnitUtil.waitFor(()->{ return(!tcis.inbound.isEmpty()); }, " inbound 1 didn't arrive");
Assert.assertEquals(" 1 inbound increased", 1,(tcis.inbound.size() ) );
Assert.assertTrue("1 getTotalNodeEvents ",t.getNodeEventManager().getTotalNodeEvents()== 1 );
Assert.assertEquals("node responds to learn event with write acknowledge", "[5f8] 59 04 D2",
tcis.inbound.elementAt(tcis.inbound.size() - 1).toString());
Assert.assertTrue("after new ev getOutstandingEvVars 1",t.getNodeEventManager().getOutstandingEvVars()== 12 );
m.setElement(5, 0x02); // event variable index - NOT event index on node
m.setElement(6, 0x02); // event variable value
t.getCanListener().message(m);
m.setElement(5, 0x03); // event variable index - NOT event index on node
m.setElement(6, 0x03); // event variable value
t.getCanListener().message(m);
m.setElement(5, 0x04); // event variable index - NOT event index on node
m.setElement(6, 0xff); // event variable value
t.getCanListener().message(m);
m.setElement(5, 0x05); // event variable index - NOT event index on node
m.setElement(6, 0x05); // event variable value
t.getCanListener().message(m);
m.setElement(5, 0x06); // event variable index - NOT event index on node
m.setElement(6, 0x06); // event variable value
t.getCanListener().message(m);
m.setElement(5, 0x07); // event variable index - NOT event index on node
m.setElement(6, 0x07); // event variable value
t.getCanListener().message(m);
m.setElement(5, 0x08); // event variable index - NOT event index on node
m.setElement(6, 0x08); // event variable value
t.getCanListener().message(m);
m.setElement(5, 0x09); // event variable index - NOT event index on node
m.setElement(6, 0x09); // event variable value
t.getCanListener().message(m);
m.setElement(5, 0x0a); // event variable index - NOT event index on node
m.setElement(6, 0x0a); // event variable value
t.getCanListener().message(m);
m.setElement(5, 0x0b); // event variable index - NOT event index on node
m.setElement(6, 0x0b); // event variable value
t.getCanListener().message(m);
m.setElement(5, 0x0c); // event variable index - NOT event index on node
m.setElement(6, 0x0c); // event variable value
t.getCanListener().message(m);
m.setElement(5, 0x0d); // event variable index - NOT event index on node
m.setElement(6, 0x0d); // event variable value
t.getCanListener().message(m);
JUnitUtil.waitFor(()->{ return(tcis.inbound.size()>12); }, " inbound 13 didn't arrive");
// all acknowledgments received from node, assume all WRACKS
Assert.assertEquals(" 13 inbound increased", 13,(tcis.inbound.size() ) );
Assert.assertTrue("still 1 getTotalNodeEvents ",t.getNodeEventManager().getTotalNodeEvents()== 1 );
Assert.assertTrue("after new ev getOutstandingEvVars 0",t.getNodeEventManager().getOutstandingEvVars()== 0 );
// exit learn mode
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(3);
m.setElement(0, CbusConstants.CBUS_NNULN);
m.setElement(1, 0x04);
m.setElement(2, 0xd2);
t.getCanListener().message(m);
Assert.assertFalse("message exit learn mode ",t.getNodeInLearnMode() );
// ask node how many events it has
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(3);
m.setElement(0, CbusConstants.CBUS_RQEVN);
m.setElement(1, 0x04); // node 1234
m.setElement(2, 0xd2); // node 1234
t.getCanListener().message(m);
JUnitUtil.waitFor(()->{ return(tcis.inbound.size()>13); }, " inbound 14 didn't arrive");
Assert.assertEquals(" 14 inbound increased", 14,(tcis.inbound.size() ) );
Assert.assertEquals("node responds to request number of events", "[5f8] 74 04 D2 01",
tcis.inbound.elementAt(tcis.inbound.size() - 1).toString());
// get events stored on node
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(3);
m.setElement(0, CbusConstants.CBUS_NERD);
m.setElement(1, 0x04); // node 1234
m.setElement(2, 0xd2); // node 1234
t.getCanListener().message(m);
JUnitUtil.waitFor(()->{ return(tcis.inbound.size()>14); }, " inbound 15 didn't arrive");
Assert.assertEquals(" 15 inbound increased", 15,(tcis.inbound.size() ) );
Assert.assertEquals("node responds to all event index fetch request", "[5f8] F2 04 D2 00 04 00 01 01",
tcis.inbound.elementAt(tcis.inbound.size() - 1).toString());
// get event variables with knowledge of index
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(5);
m.setElement(0, CbusConstants.CBUS_REVAL);
m.setElement(1, 0x04); // node 1234
m.setElement(2, 0xd2); // node 1234
m.setElement(3, 0x01); // event index on node
m.setElement(4, 0x01); // event variable index on event
t.getCanListener().message(m);
JUnitUtil.waitFor(()->{ return(tcis.inbound.size()>15); }, " inbound 16 didn't arrive");
Assert.assertEquals(" 16 inbound increased", 16,(tcis.inbound.size() ) );
Assert.assertEquals("node 1234 responds event index 1 var 1", "[5f8] B5 04 D2 01 01 04",
tcis.inbound.elementAt(tcis.inbound.size() - 1).toString());
m.setElement(4, 0x04); // event variable index on event
t.getCanListener().message(m);
JUnitUtil.waitFor(()->{ return(tcis.inbound.size()>16); }, " inbound 17 didn't arrive");
Assert.assertEquals(" 17 inbound increased", 17,(tcis.inbound.size() ) );
Assert.assertEquals("node 1234 responds event index 1 var 1", "[5f8] B5 04 D2 01 04 FF",
tcis.inbound.elementAt(tcis.inbound.size() - 1).toString());
// put node into learn mode
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(3);
m.setElement(0, CbusConstants.CBUS_NNLRN);
m.setElement(1, 0x04);
m.setElement(2, 0xd2);
t.getCanListener().message(m);
// delete event on node
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(5);
m.setElement(0, CbusConstants.CBUS_EVULN);
m.setElement(1, 0x00); // node 4
m.setElement(2, 0x04); // node 4
m.setElement(3, 0x00); // event 1
m.setElement(4, 0x01); // event 1
t.getCanListener().message(m);
// exit learn mode
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(3);
m.setElement(0, CbusConstants.CBUS_NNULN);
m.setElement(1, 0x04);
m.setElement(2, 0xd2);
t.getCanListener().message(m);
// ask node how many events it has
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(3);
m.setElement(0, CbusConstants.CBUS_RQEVN);
m.setElement(1, 0x04); // node 1234
m.setElement(2, 0xd2); // node 1234
t.getCanListener().message(m);
JUnitUtil.waitFor(()->{ return(tcis.inbound.size()>17); }, " inbound 18 didn't arrive");
Assert.assertEquals(" 18 inbound increased", 18,(tcis.inbound.size() ) );
Assert.assertEquals("node responds to request number of events", "[5f8] 74 04 D2 00",
tcis.inbound.elementAt(tcis.inbound.size() - 1).toString());
t.dispose();
}
@Test
public void testNodeLearnTwoEventsThenDelete() {
CbusDummyNode t = new MergCanpan().getNewDummyNode(memo, 1234);
var listen = t.getCanListener();
Assertions.assertTrue(listen instanceof CbusSimCanListener );
((CbusSimCanListener) listen).setDelay(0);
t.setNodeInFLiMMode(true);
// frame to set node into learn
CanMessage m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(3);
m.setElement(0, CbusConstants.CBUS_NNLRN);
m.setElement(1, 0x04);
m.setElement(2, 0xd2);
t.getCanListener().message(m);
// teach the node an event
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(7);
m.setElement(0, CbusConstants.CBUS_EVLRN);
m.setElement(1, 0x00); // node 4
m.setElement(2, 0x04); // node 4
m.setElement(3, 0x00); // event 1
m.setElement(4, 0x01); // event 1
m.setElement(5, 0x01); // event variable index - NOT event index on node
m.setElement(6, 0x04); // event variable value
t.getCanListener().message(m);
// teach the node a different event
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(7);
m.setElement(0, CbusConstants.CBUS_EVLRN);
m.setElement(1, 0x00); // node 4
m.setElement(2, 0x04); // node 4
m.setElement(3, 0x00); // event 1
m.setElement(4, 0x02); // event 2
m.setElement(5, 0x01); // event variable index - NOT event index on node
m.setElement(6, 0x04); // event variable value
t.getCanListener().message(m);
// exit learn mode
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(3);
m.setElement(0, CbusConstants.CBUS_NNULN);
m.setElement(1, 0x04);
m.setElement(2, 0xd2);
t.getCanListener().message(m);
// ask node how many events it has
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(3);
m.setElement(0, CbusConstants.CBUS_RQEVN);
m.setElement(1, 0x04); // node 1234
m.setElement(2, 0xd2); // node 1234
t.getCanListener().message(m);
JUnitUtil.waitFor(()->{ return(tcis.inbound.size()>2); }, " inbound 3 didn't arrive");
Assert.assertEquals(" 3 inbound increased", 3,(tcis.inbound.size() ) );
Assert.assertEquals("node responds to request number of events 2", "[5f8] 74 04 D2 02",
tcis.inbound.elementAt(tcis.inbound.size() - 1).toString());
// frame to set node into learn
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(3);
m.setElement(0, CbusConstants.CBUS_NNLRN);
m.setElement(1, 0x04);
m.setElement(2, 0xd2);
t.getCanListener().message(m);
// clear all events
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(3);
m.setElement(0, CbusConstants.CBUS_NNCLR);
m.setElement(1, 0x04);
m.setElement(2, 0xd2);
t.getCanListener().message(m);
// exit learn mode
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(3);
m.setElement(0, CbusConstants.CBUS_NNULN);
m.setElement(1, 0x04);
m.setElement(2, 0xd2);
t.getCanListener().message(m);
// ask node how many events it has
m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(3);
m.setElement(0, CbusConstants.CBUS_RQEVN);
m.setElement(1, 0x04); // node 1234
m.setElement(2, 0xd2); // node 1234
t.getCanListener().message(m);
JUnitUtil.waitFor(()->{ return(tcis.inbound.size()>3); }, " inbound 4 didn't arrive");
Assert.assertEquals(" 4 inbound increased", 4,(tcis.inbound.size() ) );
Assert.assertEquals("node responds 0 events following CBUS_NNCLR", "[5f8] 74 04 D2 00",
tcis.inbound.elementAt(tcis.inbound.size() - 1).toString());
t.dispose();
}
@Test
public void testResponseToNameRequest() {
CbusDummyNode t = new MergCanpan().getNewDummyNode(memo, 1234);
var listen = t.getCanListener();
Assertions.assertTrue(listen instanceof CbusSimCanListener );
((CbusSimCanListener) listen).setDelay(0);
t.setNodeInFLiMMode(true);
t.setNodeInSetupMode(true);
CanMessage m = new CanMessage( tcis.getCanid() );
m.setNumDataElements(1);
m.setElement(0, CbusConstants.CBUS_RQMN);
t.getCanListener().message(m);
JUnitUtil.waitFor(()->{ return(!tcis.inbound.isEmpty()); }, " inbound 1 didn't arrive");
Assert.assertEquals(" 1 inbound increased", 1,(tcis.inbound.size() ) );
Assert.assertEquals("node responds to RQMN 0", "[5f8] E2 50 41 4E 20 20 20 20",
tcis.inbound.elementAt(tcis.inbound.size() - 1).toString());
t.dispose();
}
@BeforeEach
public void setUp() {
JUnitUtil.setUp();
memo = new CanSystemConnectionMemo();
tcis = new TrafficControllerScaffold();
memo.setTrafficController(tcis);
}
@AfterEach
public void tearDown() {
tcis.terminateThreads();
memo.dispose();
tcis = null;
memo = null;
JUnitUtil.tearDown();
}
// private static final Logger log = LoggerFactory.getLogger(CbusDummyNodeTest.class);
}