395 lines
13 KiB
Java
395 lines
13 KiB
Java
package jmri.jmrix.can.cbus;
|
|
|
|
import jmri.*;
|
|
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.node.CbusNode;
|
|
import jmri.jmrix.can.cbus.node.CbusNodeTableDataModel;
|
|
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
|
|
* @author Daniel Bergqvist Copyright (C) 2020
|
|
* @author Andrew Crosland Copyright (C) 2021
|
|
*/
|
|
public class CbusPredefinedMetersTest {
|
|
|
|
private CanSystemConnectionMemo memo;
|
|
private TrafficControllerScaffold tcis;
|
|
private CbusPredefinedMeters mm;
|
|
|
|
@BeforeEach
|
|
public void setUp() {
|
|
JUnitUtil.setUp();
|
|
JUnitUtil.resetInstanceManager();
|
|
JUnitUtil.resetProfileManager();
|
|
JUnitUtil.initConfigureManager();
|
|
|
|
// This test requires a registred connection config since ProxyMeterManager
|
|
// auto creates system meter managers using the connection configs.
|
|
|
|
/* InstanceManager.setDefault(jmri.jmrix.ConnectionConfigManager.class, new jmri.jmrix.ConnectionConfigManager());
|
|
jmri.jmrix.NetworkPortAdapter pa = new jmri.jmrix.can.adapters.gridconnect.net.MergNetworkDriverAdapter();
|
|
pa.setSystemPrefix("M");
|
|
jmri.jmrix.ConnectionConfig cc = new jmri.jmrix.can.adapters.gridconnect.net.MergConnectionConfig(pa);
|
|
InstanceManager.getDefault(jmri.jmrix.ConnectionConfigManager.class).add(cc);
|
|
*/
|
|
memo = new CanSystemConnectionMemo();
|
|
tcis = new TrafficControllerScaffold();
|
|
memo.setTrafficController(tcis);
|
|
memo.setProtocol(jmri.jmrix.can.CanConfigurationManager.MERGCBUS);
|
|
mm = memo.get(CbusPredefinedMeters.class);
|
|
}
|
|
|
|
@AfterEach
|
|
public void tearDown() {
|
|
mm = null;
|
|
tcis.terminateThreads();
|
|
tcis=null;
|
|
memo.dispose();
|
|
memo = null;
|
|
JUnitUtil.tearDown();
|
|
}
|
|
|
|
public double getCurrent() {
|
|
var meter = InstanceManager.getDefault(MeterManager.class).getBySystemName("MVCBUSCurrentMeter");
|
|
Assertions.assertNotNull(meter);
|
|
return meter.getKnownAnalogValue();
|
|
}
|
|
|
|
public double getCurrentExtra() {
|
|
var meter = InstanceManager.getDefault(MeterManager.class).getBySystemName("MVCBUSCurrentMeter2");
|
|
Assertions.assertNotNull(meter);
|
|
return meter.getKnownAnalogValue();
|
|
}
|
|
|
|
public double getVoltage() {
|
|
var meter = InstanceManager.getDefault(MeterManager.class).getBySystemName("MVCBUSVoltageMeter");
|
|
Assertions.assertNotNull(meter);
|
|
return meter.getKnownAnalogValue();
|
|
}
|
|
|
|
private void enable() {
|
|
mm.updateTask.enable(mm.currentMeter);
|
|
mm.updateTask.enable(mm.currentMeterExtra);
|
|
mm.updateTask.enable(mm.voltageMeter);
|
|
}
|
|
|
|
private void disable() {
|
|
mm.updateTask.disable(mm.currentMeter);
|
|
mm.updateTask.disable(mm.currentMeterExtra);
|
|
mm.updateTask.disable(mm.voltageMeter);
|
|
}
|
|
|
|
@Test
|
|
public void testEnableDisable(){
|
|
|
|
Assert.assertEquals("no listener to start",0,tcis.numListeners());
|
|
|
|
enable();
|
|
Assert.assertEquals("listening",1,tcis.numListeners());
|
|
disable();
|
|
Assert.assertEquals("not listening",0,tcis.numListeners());
|
|
|
|
memo.get(CbusPreferences.class).setAllocateNNListener(false);
|
|
memo.get(CbusPreferences.class).setNodeBackgroundFetchDelay(0);
|
|
CbusNodeTableDataModel nodeModel = memo.get(CbusConfigurationManager.class)
|
|
.provide(CbusNodeTableDataModel.class);
|
|
|
|
Assertions.assertEquals(2,tcis.numListeners(),"node table and programmer listening "+tcis.getListeners());
|
|
enable();
|
|
Assert.assertEquals("mm listening",3,tcis.numListeners());
|
|
disable();
|
|
Assert.assertEquals("mm not listening",2,tcis.numListeners());
|
|
|
|
CbusNode testCs = nodeModel.provideNodeByNodeNum(777);
|
|
testCs.setCsNum(0);
|
|
Assert.assertEquals("node + node table listening",3,tcis.numListeners());
|
|
|
|
enable();
|
|
Assert.assertEquals("multimeter listening",4,tcis.numListeners());
|
|
disable();
|
|
Assert.assertEquals("mm not listening",3,tcis.numListeners());
|
|
|
|
nodeModel.dispose();
|
|
testCs.dispose();
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testMultiMCanReply(){
|
|
|
|
memo.get(CbusPreferences.class).setAllocateNNListener(false);
|
|
memo.get(CbusPreferences.class).setNodeBackgroundFetchDelay(0);
|
|
CbusNodeTableDataModel nodeModel = memo.get(CbusConfigurationManager.class)
|
|
.provide(CbusNodeTableDataModel.class);
|
|
|
|
CbusNode testCs = nodeModel.provideNodeByNodeNum(54321);
|
|
testCs.setCsNum(0);
|
|
|
|
enable();
|
|
|
|
CanReply r = new CanReply(tcis.getCanid());
|
|
r.setNumDataElements(7);
|
|
r.setElement(0, CbusConstants.CBUS_ACOF2);
|
|
r.setElement(1, 0xd4); // nn 54322
|
|
r.setElement(2, 0x32); // nn 54322
|
|
r.setElement(3, 0x00); // en 1
|
|
r.setElement(4, 0x01); // en 1
|
|
r.setElement(5, 0x00); // 8mA
|
|
r.setElement(6, 0x08); // 8mA
|
|
mm.reply(r);
|
|
|
|
Assert.assertEquals(0,getCurrent(),0.001 ); // wrong opc
|
|
|
|
r.setElement(0, CbusConstants.CBUS_ACON2);
|
|
mm.reply(r);
|
|
|
|
Assert.assertEquals(0,getCurrent(),0.001 ); // wrong node
|
|
|
|
r.setElement(2, 0x31); // nn 54321
|
|
mm.reply(r);
|
|
Assert.assertEquals(8,getCurrent(),0.001 );
|
|
|
|
r.setElement(5, 0x12); // 4807mA
|
|
r.setElement(6, 0xc7); // 4807mA
|
|
mm.reply(r);
|
|
Assert.assertEquals(4807,getCurrent(),0.001 );
|
|
|
|
CanMessage m = new CanMessage(tcis.getCanid());
|
|
m.setNumDataElements(7);
|
|
m.setElement(0, CbusConstants.CBUS_ACON2);
|
|
m.setElement(1, 0xd4); // nn 54321
|
|
m.setElement(2, 0x31); // nn 54321
|
|
m.setElement(3, 0x00); // en1
|
|
m.setElement(4, 0x01); // en1
|
|
m.setElement(5, 0x00); // 0mA
|
|
m.setElement(6, 0x00); // 0mA
|
|
|
|
mm.message(m);
|
|
Assert.assertEquals(4807,getCurrent(),0.001 ); // CanMessage Ignored
|
|
|
|
r = new CanReply(tcis.getCanid());
|
|
r.setNumDataElements(7);
|
|
r.setElement(0, CbusConstants.CBUS_ACON2);
|
|
r.setElement(1, 0xd4); // nn 54321
|
|
r.setElement(2, 0x31); // nn 54321
|
|
r.setElement(3, 0x00); // en1
|
|
r.setElement(4, 0x01); // en1
|
|
r.setElement(5, 0x00); // 0mA
|
|
r.setElement(6, 0x00); // 0mA
|
|
|
|
mm.reply(r);
|
|
Assert.assertEquals(0,getCurrent(),0.001 );
|
|
|
|
// wrong event num
|
|
r = new CanReply(tcis.getCanid());
|
|
r.setNumDataElements(7);
|
|
r.setElement(0, CbusConstants.CBUS_ACON2);
|
|
r.setElement(1, 0xd4); // nn 54321
|
|
r.setElement(2, 0x31); // nn 54321
|
|
r.setElement(3, 0x00); // en3
|
|
r.setElement(4, 0x03); // en3
|
|
r.setElement(5, 0x12); // 4807mA
|
|
r.setElement(6, 0xc7); // 4807mA
|
|
|
|
mm.reply(r);
|
|
Assert.assertEquals("Wrong event",0,getCurrent(),0.001 );
|
|
r.setElement(4, 0x01); // en1
|
|
r.setRtr(true);
|
|
|
|
mm.reply(r);
|
|
Assert.assertEquals(0,getCurrent(),0.001 );
|
|
|
|
r.setExtended(true);
|
|
r.setRtr(false);
|
|
|
|
mm.reply(r);
|
|
Assert.assertEquals(0,getCurrent(),0.001 );
|
|
|
|
r.setExtended(false);
|
|
mm.reply(r);
|
|
Assert.assertEquals(4807,getCurrent(),0.001 );
|
|
|
|
disable();
|
|
|
|
nodeModel.dispose();
|
|
testCs.dispose();
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testMultiMExtraCanReply(){
|
|
|
|
memo.get(CbusPreferences.class).setAllocateNNListener(false);
|
|
memo.get(CbusPreferences.class).setNodeBackgroundFetchDelay(0);
|
|
CbusNodeTableDataModel nodeModel = memo.get(CbusConfigurationManager.class)
|
|
.provide(CbusNodeTableDataModel.class);
|
|
|
|
CbusNode testCs = nodeModel.provideNodeByNodeNum(54321);
|
|
testCs.setCsNum(0);
|
|
|
|
enable();
|
|
|
|
CanReply r = new CanReply(tcis.getCanid());
|
|
r.setNumDataElements(7);
|
|
r.setElement(0, CbusConstants.CBUS_ACOF2);
|
|
r.setElement(1, 0xd4); // nn 54322
|
|
r.setElement(2, 0x32); // nn 54322
|
|
r.setElement(3, 0x00); // en 3
|
|
r.setElement(4, 0x03); // en 3
|
|
r.setElement(5, 0x00); // 8mA
|
|
r.setElement(6, 0x08); // 8mA
|
|
mm.reply(r);
|
|
|
|
Assert.assertEquals(0,getCurrentExtra(),0.001 ); // wrong opc
|
|
|
|
r.setElement(0, CbusConstants.CBUS_ACON2);
|
|
mm.reply(r);
|
|
|
|
Assert.assertEquals(0,getCurrentExtra(),0.001 ); // wrong node
|
|
|
|
r.setElement(2, 0x31); // nn 54321
|
|
mm.reply(r);
|
|
Assert.assertEquals(8,getCurrentExtra(),0.001 );
|
|
|
|
r.setElement(5, 0x12); // 4807mA
|
|
r.setElement(6, 0xc7); // 4807mA
|
|
mm.reply(r);
|
|
Assert.assertEquals(4807,getCurrentExtra(),0.001 );
|
|
|
|
CanMessage m = new CanMessage(tcis.getCanid());
|
|
m.setNumDataElements(7);
|
|
m.setElement(0, CbusConstants.CBUS_ACON2);
|
|
m.setElement(1, 0xd4); // nn 54321
|
|
m.setElement(2, 0x31); // nn 54321
|
|
r.setElement(3, 0x00); // en 3
|
|
r.setElement(4, 0x03); // en 3
|
|
m.setElement(5, 0x00); // 0mA
|
|
m.setElement(6, 0x00); // 0mA
|
|
|
|
mm.message(m);
|
|
Assert.assertEquals(4807,getCurrentExtra(),0.001 ); // CanMessage Ignored
|
|
|
|
r = new CanReply(tcis.getCanid());
|
|
r.setNumDataElements(7);
|
|
r.setElement(0, CbusConstants.CBUS_ACON2);
|
|
r.setElement(1, 0xd4); // nn 54321
|
|
r.setElement(2, 0x31); // nn 54321
|
|
r.setElement(3, 0x00); // en 3
|
|
r.setElement(4, 0x03); // en 3
|
|
r.setElement(5, 0x00); // 0mA
|
|
r.setElement(6, 0x00); // 0mA
|
|
|
|
mm.reply(r);
|
|
Assert.assertEquals(0,getCurrentExtra(),0.001 );
|
|
|
|
// wrong event num
|
|
r = new CanReply(tcis.getCanid());
|
|
r.setNumDataElements(7);
|
|
r.setElement(0, CbusConstants.CBUS_ACON2);
|
|
r.setElement(1, 0xd4); // nn 54321
|
|
r.setElement(2, 0x31); // nn 54321
|
|
r.setElement(3, 0x00); // en 2
|
|
r.setElement(4, 0x02); // en 2
|
|
r.setElement(5, 0x12); // 4807mA
|
|
r.setElement(6, 0xc7); // 4807mA
|
|
|
|
mm.reply(r);
|
|
Assert.assertEquals("Wrong event",0,getCurrentExtra(),0.001 );
|
|
r.setElement(4, 0x03); // en 3
|
|
r.setRtr(true);
|
|
|
|
mm.reply(r);
|
|
Assert.assertEquals(0,getCurrentExtra(),0.001 );
|
|
|
|
r.setExtended(true);
|
|
r.setRtr(false);
|
|
|
|
mm.reply(r);
|
|
Assert.assertEquals(0,getCurrentExtra(),0.001 );
|
|
|
|
r.setExtended(false);
|
|
mm.reply(r);
|
|
Assert.assertEquals(4807,getCurrentExtra(),0.001 );
|
|
|
|
disable();
|
|
|
|
nodeModel.dispose();
|
|
testCs.dispose();
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testMultiMVoltCanReply(){
|
|
|
|
memo.get(CbusPreferences.class).setAllocateNNListener(false);
|
|
memo.get(CbusPreferences.class).setNodeBackgroundFetchDelay(0);
|
|
CbusNodeTableDataModel nodeModel = memo.get(CbusConfigurationManager.class)
|
|
.provide(CbusNodeTableDataModel.class);
|
|
|
|
CbusNode testCs = nodeModel.provideNodeByNodeNum(54321);
|
|
testCs.setCsNum(0);
|
|
|
|
enable();
|
|
|
|
CanReply r = new CanReply(tcis.getCanid());
|
|
r.setNumDataElements(7);
|
|
r.setElement(0, CbusConstants.CBUS_ACON2);
|
|
r.setElement(1, 0xd4); // nn 54321
|
|
r.setElement(2, 0x31); // nn 54321
|
|
r.setElement(3, 0x00); // en 2
|
|
r.setElement(4, 0x02); // en 2
|
|
r.setElement(5, 0x00); // 12.9V
|
|
r.setElement(6, 0x81); // 12.9V
|
|
//System.out.format("testMultiMVoltCanReply: reply(12.9) volt%n");
|
|
mm.reply(r);
|
|
Assert.assertEquals(12.9,getVoltage(),0.001 );
|
|
|
|
r = new CanReply(tcis.getCanid());
|
|
r.setNumDataElements(7);
|
|
r.setElement(0, CbusConstants.CBUS_ACON2);
|
|
r.setElement(1, 0xd4); // nn 54321
|
|
r.setElement(2, 0x31); // nn 54321
|
|
r.setElement(3, 0x00); // en 2
|
|
r.setElement(4, 0x02); // en 2
|
|
r.setElement(5, 0x01); // 25.6V
|
|
r.setElement(6, 0x00); // 25.6V
|
|
mm.reply(r);
|
|
Assert.assertEquals(25.6,getVoltage(),0.001 );
|
|
|
|
r = new CanReply(tcis.getCanid());
|
|
r.setNumDataElements(7);
|
|
r.setElement(0, CbusConstants.CBUS_ACON2);
|
|
r.setElement(1, 0xd4); // nn 54321
|
|
r.setElement(2, 0x31); // nn 54321
|
|
r.setElement(3, 0x00); // en2
|
|
r.setElement(4, 0x01); // en2
|
|
r.setElement(5, 0x00); // 0V
|
|
r.setElement(6, 0x00); // 0V
|
|
mm.reply(r);
|
|
Assert.assertEquals(0,getCurrent(),0.001 );
|
|
|
|
disable();
|
|
|
|
nodeModel.dispose();
|
|
testCs.dispose();
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testSmallFuncs(){
|
|
Assert.assertEquals("ma units", InstanceManager.getDefault(MeterManager.class).getBySystemName("MVCBUSCurrentMeter").getUnit(), Meter.Unit.Milli);
|
|
}
|
|
|
|
// private static final Logger log = LoggerFactory.getLogger(CbusPredefinedMetersTest.class);
|
|
|
|
}
|