Fiz a depuração no método e pelo que notei ele sempre cai no:
if (atual == anterior || atual == null) {
return null;
}
Segue a classe CLPEventMulticaster:
public final class CLPEventMulticaster implements CLPListener {
protected static CLPListener add(CLPListener atual, CLPListener proximo) {
if (atual == null) {
return proximo;
}
if (proximo == null) {
return atual;
}
return new CLPEventMulticaster(atual, proximo);
}
protected static CLPListener remove(CLPListener atual, CLPListener anterior) {
if (atual == anterior || atual == null) {
return null;
}
if (atual instanceof CLPEventMulticaster) {
return ((CLPEventMulticaster) atual).remove(anterior);
}
return atual;
}
private final CLPListener a;
private final CLPListener b;
private CLPEventMulticaster(CLPListener a, CLPListener b) {
this.a = a;
this.b = b;
}
@Override
public void generalEmergency(CLPEvent event) {
a.generalEmergency(event);
b.generalEmergency(event);
}
@Override
public void generalEmergencyApproved(CLPEvent event) {
a.generalEmergencyApproved(event);
b.generalEmergencyApproved(event);
}
@Override
public void securityCurtain(CLPEvent event) {
a.securityCurtain(event);
b.securityCurtain(event);
}
@Override
public void securityCurtainApproved(CLPEvent event) {
a.securityCurtainApproved(event);
b.securityCurtainApproved(event);
}
@Override
public void engineOverload(CLPEvent event) {
a.engineOverload(event);
b.engineOverload(event);
}
@Override
public void failedMachine(CLPEvent event) {
a.failedMachine(event);
b.failedMachine(event);
}
@Override
public void feedPositionOK(CLPEvent event) {
a.feedPositionOK(event);
b.feedPositionOK(event);
}
@Override
public void tablePositioning(CLPEvent event) {
a.tablePositioning(event);
b.tablePositioning(event);
}
@Override
public void positionTable(CLPEvent event) {
a.positionTable(event);
b.positionTable(event);
}
@Override
public void machineStopped(CLPEvent event) {
a.machineStopped(event);
b.machineStopped(event);
}
@Override
public void machineInMotion(CLPEvent event) {
a.machineInMotion(event);
b.machineInMotion(event);
}
@Override
public void resetFailed(CLPEvent event) {
a.resetFailed(event);
b.resetFailed(event);
}
@Override
public void resetFailedOff(CLPEvent event) {
a.resetFailedOff(event);
b.resetFailedOff(event);
}
@Override
public void machineOK(CLPEvent event) {
a.machineOK(event);
b.machineOK(event);
}
@Override
public void machineOFF(CLPEvent event) {
a.machineOFF(event);
b.machineOFF(event);
}
@Override
public void machineReference(CLPEvent event) {
a.machineReference(event);
b.machineReference(event);
}
@Override
public void machineReferenceOff(CLPEvent event) {
a.machineReferenceOff(event);
b.machineReferenceOff(event);
}
private CLPListener remove(CLPListener listener) {
if (listener == a) {
return b;
}
if (listener == b) {
return a;
}
CLPListener primeiro = remove(a, listener);
CLPListener segundo = remove(b, listener);
if (primeiro == a && segundo == b) {
return this;
}
return add(primeiro, segundo);
}
}
Segue a classe CLPMonitor:
public class CLPMonitor {
private Protocol protocol;
private CLPListener listener;
private static CLPMonitor eagerInstance = null;
public static synchronized CLPMonitor getEagerInstance() {
if (eagerInstance == null) {
eagerInstance = new CLPMonitor();
}
return eagerInstance;
}
private CLPMonitor() {
}
public void start() {
protocol = ActionMachineBuilder.getConnection();
clpMonitor();
}
public void addCLPListener(CLPListener listener) {
this.listener = CLPEventMulticaster.add(this.listener, listener);
}
public void removeCLPListener() {
this.listener = CLPEventMulticaster.remove(this.listener, listener);
}
public void clpMonitor() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
if (ProtocolConstants.isdemonstrationmode) {
sleep(100);
return;
}
protocol.connect();
while (true) {
if (protocol.readBoolean(4099, 2)) {
listener.machineReference(new CLPEvent(4099, 2));
} else {
listener.machineReferenceOff(new CLPEvent(4099, 2));
}
if (protocol.readBoolean(4099, 9)) {
listener.generalEmergency(new CLPEvent(4099, 9));
} else {
listener.generalEmergencyApproved(new CLPEvent(4099, 9));
}
if (protocol.readBoolean(4140, 6)) {
listener.engineOverload(new CLPEvent(4140, 6));
}
if (protocol.readBoolean(4099, 8)) {
listener.failedMachine(new CLPEvent(4099, 8));
}
if (!protocol.readBoolean(4100, 2)) {
listener.tablePositioning(new CLPEvent(4100, 2));
}
if (protocol.readBoolean(4100, 7)) {
listener.positionTable(new CLPEvent(4100, 7));
}
if (protocol.readBoolean(4100, 4) && !protocol.readBoolean(4099, 9)) {
listener.securityCurtain(new CLPEvent(4100, 4));
} else {
listener.securityCurtainApproved(new CLPEvent(4100, 4));
}
if (protocol.readBoolean(4100, 3) && !protocol.readBoolean(4100, 4)) {
listener.resetFailed(new CLPEvent(4100, 3));
} else {
listener.resetFailedOff(new CLPEvent(4100, 3));
}
if (protocol.readBoolean(4099, 6)) {
listener.feedPositionOK(new CLPEvent(4099, 6));
}
if (protocol.readBoolean(4099, 15)) {
listener.machineStopped(new CLPEvent(4099, 15));
} else {
listener.machineInMotion(new CLPEvent(4099, 15));
}
if (protocol.readBoolean(4099, 14)) {
listener.machineOK(new CLPEvent(4099, 14));
} else {
listener.machineOFF(new CLPEvent(4099, 14));
}
}
} catch (IOException e) {
// ignored
protocol.disconnect();
}
}
});
thread.start();
}
Segue uma tela (AppMenuPane - tela principal do sistema):
public class AppMenuPane extends JPanel {
private JPanel bottomMenu;
private Protocol modbus;
public AppMenuPane() {
setLayout(new BorderLayout());
modbus = ActionMachineBuilder.getConnection();
modbus.disconnect();
bottomMenu = new MenuPanePane(new FormLayout("0dlu,pref,0dlu,pref,0dlu,pref,0dlu,pref,0dlu,pref,0dlu,pref,0dlu,pref,0dlu,pref,0dlu,pref,0dlu", "0dlu,pref,0dlu"));
add(bottomMenu, BorderLayout.SOUTH);
// neste bottomMenu tem os botões que acessam as outras telas do sistema
}
@Override
public void setVisible(boolean bln) {
super.setVisible(bln);
if (bln) {
enabledButtons();
try {
modbus.connect();
} catch (IOException ex) {
//
}
CLPMonitor.getEagerInstance().addCLPListener(new CLPListener() {
@Override
public void generalEmergency(CLPEvent event) {
disableButtons();
}
@Override
public void generalEmergencyApproved(CLPEvent event) {
enabledButtons();
}
@Override
public void securityCurtain(CLPEvent event) {
disableButtons();
}
@Override
public void securityCurtainApproved(CLPEvent event) {
try {
modbus.writeBoolean(4097, 9, false);
sleep(200);
} catch (IOException ex) {
//Logger.getLogger(AppMenuPane.class.getName()).log(Level.SEVERE, null, ex);
}
enabledButtons();
}
@Override
public void engineOverload(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void failedMachine(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void feedPositionOK(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void tablePositioning(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void positionTable(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void machineStopped(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void machineInMotion(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void resetFailed(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void resetFailedOff(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void machineOK(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void machineOFF(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void machineReference(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void machineReferenceOff(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
});
} else {
modbus.disconnect();
}
}
}
Segue outra tela (IOPane):
public class IOPane extends JPanel {
private JButton backButton;
private MenuPanePane bottomMenu;
private Protocol modbus;
public IOPane() {
setLayout(new BorderLayout());
modbus = ActionMachineBuilder.getConnection();
modbus.disconnect();
// aqui tem umas tabelas
bottomMenu = new MenuPanePane(new FormLayout("0dlu,pref,0dlu,pref,0dlu,fill:pref:grow,0dlu,pref,0dlu", "0dlu,pref,0dlu"));
add(bottomMenu, BorderLayout.SOUTH);
backButton = ButtonUtility.makeButton();
backButton.setText("Voltar");
backButton.setPreferredSize(new Dimension(bw, bh));
backButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
ModuleManager.getInstance().backToLastModule();
}
});
bottomMenu.add(backButton, new CellConstraints(8, 2));
}
@Override
public void setVisible(boolean bln) {
super.setVisible(bln);
if (bln) {
try {
modbus.connect();
} catch (IOException ex) {
//Logger.getLogger(IOPane.class.getName()).log(Level.SEVERE, null, ex);
}
CLPMonitor.getEagerInstance().addCLPListener(new CLPListener() {
@Override
public void generalEmergency(CLPEvent event) {
backButton.setEnabled(false);
}
@Override
public void generalEmergencyApproved(CLPEvent event) {
backButton.setEnabled(true);
}
@Override
public void securityCurtain(CLPEvent event) {
backButton.setEnabled(false);
}
@Override
public void securityCurtainApproved(CLPEvent event) {
try {
modbus.writeBoolean(4097, 9, false);
sleep(200);
} catch (IOException ex) {
//Logger.getLogger(IOPane.class.getName()).log(Level.SEVERE, null, ex);
}
backButton.setEnabled(true);
}
@Override
public void engineOverload(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void failedMachine(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void feedPositionOK(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void tablePositioning(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void positionTable(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void machineStopped(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void machineInMotion(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void resetFailed(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void resetFailedOff(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void machineOK(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void machineOFF(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void machineReference(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void machineReferenceOff(CLPEvent event) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
});
} else {
modbus.disconnect();
}
}
}
Bom, no geral as telas seguem sempre essa mesma estrutura, algumas delas ao clicar no botão de voltar irão retornar sempre para a tela principal (AppMenuPane), outras delas irão voltar para a tela aberta anteriormente (sistema de histórico de telas).
Outra coisa, tenho uma “tela” que nada verdade é um um painel de menu, que fica visível durante todo o tempo, nele eu também tenho um addCLPListener, será que isso não pode ser um problema?