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

199 lines
6.8 KiB
Java

package jmri.jmrix.can.cbus.node;
import java.util.ArrayList;
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.*;
import jmri.util.JUnitUtil;
import org.junit.Assert;
import org.junit.jupiter.api.*;
/**
*
* @author Paul Bender Copyright (C) 2017
* @author Steve Young Copyright (C) 2019
*/
public class CbusNodeEventManagerTest {
@Test
public void testCTor() {
Assert.assertNotNull("exists",t);
}
@Test
public void testSendEventsToNode(){
Assert.assertEquals("events unset",-1,t.getTotalNodeEvents());
Assert.assertEquals("outstanding ev vars unset",-1,t.getOutstandingEvVars());
Assert.assertNull("null node event", t.getNodeEventByIndex(789));
CbusNodeEvent ev = t.provideNodeEvent(123, 456);
ev.setEvArr(new int[]{1,255,0,4,5});
Assert.assertEquals("events set",1,t.getTotalNodeEvents());
Assert.assertEquals("outstanding ev vars 0",0,t.getOutstandingEvVars());
ArrayList<CbusNodeEvent> emptyList = new ArrayList<>();
t.sendNewEvSToNode(emptyList); // does nothing
ArrayList<CbusNodeEvent> list = t.getEventArray();
Assert.assertNotNull(list);
t.resetNodeEvents();
Assert.assertEquals("0 events set",-1,t.getTotalNodeEvents());
Assert.assertEquals("outstanding ev vars 0",-1,t.getOutstandingEvVars());
t.sendNewEvSToNode(list);
JUnitUtil.waitFor(()->{ return(tcis.outbound.size()>2); }, " outbound 3 didn't arrive");
Assert.assertEquals("Node 7961 enter learn mode", "[5f8] 53 1F 19",
tcis.outbound.elementAt(tcis.outbound.size() - 2).toString());
// also forward this outgoing message to Node Canlistener
CanMessage mLearn = new CanMessage(0x12);
mLearn.setNumDataElements(3);
mLearn.setElement(0, 0x53); // Node enter in learn mode
mLearn.setElement(1, 0x1F); // ev node 123
mLearn.setElement(2, 0x19); // ev node 123
nodeToEdit.getCanListener().message(mLearn);
Assert.assertEquals("Learn et event n123 e456 evar1 val 1 ", "[5f8] D2 00 7B 01 C8 01 01",
tcis.outbound.elementAt(tcis.outbound.size() - 1).toString());
// also forward this outgoing message to Node Canlistener
CanMessage m = new CanMessage(0x12);
m.setNumDataElements(7);
m.setElement(0, 0xD2); // teach event in learn mode
m.setElement(1, 0x00); // ev node 123
m.setElement(2, 0x7B); // ev node 123
m.setElement(3, 0x01); // ev num 456
m.setElement(4, 0xC8); // ev num 456
m.setElement(5, 0x01); // ev index 1
m.setElement(6, 0x01); // value 1
nodeToEdit.getCanListener().message(m);
Assert.assertEquals("1 event set",1,t.getTotalNodeEvents());
Assert.assertEquals("outstanding ev vars 4",4,t.getOutstandingEvVars());
// confirm write from physical node to CanListener
CanReply wrack = new CanReply(0x12);
wrack.setNumDataElements(3);
wrack.setElement(0, CbusConstants.CBUS_WRACK);
wrack.setElement(1, 0x1C); // Node 7423
wrack.setElement(2, 0xFF); // Node 7423
nodeToEdit.getCanListener().reply(wrack);
JUnitUtil.waitFor(()->{ return(tcis.outbound.size()>3); }, " outbound 4 didn't arrive");
Assert.assertEquals("Learn event n123 e456 evar2 val 255", "[5f8] D2 00 7B 01 C8 02 FF",
tcis.outbound.elementAt(tcis.outbound.size() - 1).toString());
m.setElement(5, 0x02); // ev index 1
m.setElement(6, 0xff); // value 1
nodeToEdit.getCanListener().message(m);
Assert.assertEquals("outstanding ev vars 3",3,t.getOutstandingEvVars());
nodeToEdit.getCanListener().reply(wrack);
JUnitUtil.waitFor(()->{ return(tcis.outbound.size()>4); }, " outbound 5 didn't arrive");
Assert.assertEquals("Learn event n123 e456 evar3 val0", "[5f8] D2 00 7B 01 C8 03 00",
tcis.outbound.elementAt(tcis.outbound.size() - 1).toString());
m.setElement(5, 0x03); // ev index 3
m.setElement(6, 0x00); // value 0
nodeToEdit.getCanListener().message(m);
Assert.assertEquals("outstanding ev vars 2",2,t.getOutstandingEvVars());
nodeToEdit.getCanListener().reply(wrack);
JUnitUtil.waitFor(()->{ return(tcis.outbound.size()>5); }, " outbound 6 didn't arrive");
Assert.assertEquals("Learn event n123 e456 evar4 val4", "[5f8] D2 00 7B 01 C8 04 04",
tcis.outbound.elementAt(tcis.outbound.size() - 1).toString());
m.setElement(5, 0x04); // ev index 4
m.setElement(6, 0x04); // value 4
nodeToEdit.getCanListener().message(m);
Assert.assertEquals("outstanding ev vars 1",1,t.getOutstandingEvVars());
nodeToEdit.getCanListener().reply(wrack);
JUnitUtil.waitFor(()->{ return(tcis.outbound.size()>6); }, " outbound 7 didn't arrive");
Assert.assertEquals("Learn event n123 e456 evar5 val5", "[5f8] D2 00 7B 01 C8 05 05",
tcis.outbound.elementAt(tcis.outbound.size() - 1).toString());
m.setElement(5, 0x05); // ev index 5
m.setElement(6, 0x05); // value 5
nodeToEdit.getCanListener().message(m);
Assert.assertEquals("outstanding ev vars 0",0,t.getOutstandingEvVars());
nodeToEdit.getCanListener().reply(wrack);
JUnitUtil.waitFor(()->{ return(tcis.outbound.size()>7); }, " outbound 8 didn't arrive");
Assert.assertEquals("Learn 7961 exit learn mode", "[5f8] 54 1F 19",
tcis.outbound.elementAt(tcis.outbound.size() - 1).toString());
}
private CbusNodeEventManager t;
private CbusNode nodeToEdit;
private CbusNodeTableDataModel nodeModel;
private CanSystemConnectionMemo memo;
private TrafficControllerScaffold tcis;
@BeforeEach
public void setUp() {
JUnitUtil.setUp();
memo = new CanSystemConnectionMemo();
tcis = new TrafficControllerScaffold();
memo.setTrafficController(tcis);
memo.setProtocol(jmri.jmrix.can.CanConfigurationManager.MERGCBUS);
memo.get(CbusPreferences.class).setNodeBackgroundFetchDelay(0);
nodeModel = memo.get(CbusConfigurationManager.class)
.provide(CbusNodeTableDataModel.class);
nodeToEdit = nodeModel.provideNodeByNodeNum(7961);
t = nodeToEdit.getNodeEventManager();
// set node to 3 node vars , param6, 5 ev vars per event
nodeToEdit.getNodeParamManager().setParameters(new int[]{8,1,2,3,4,5,3,7,8});
}
@AfterEach
public void tearDown() {
nodeToEdit.dispose();
tcis.terminateThreads();
memo.dispose();
tcis = null;
memo = null;
JUnitUtil.tearDown();
}
// private static final Logger log = LoggerFactory.getLogger(CbusNodeEventManagerTest.class);
}