647 lines
27 KiB
Java
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);
|
|
|
|
}
|