diff --git a/src/java/jssc/SerialPort.java b/src/java/jssc/SerialPort.java index a162480..b8e8e6a 100644 --- a/src/java/jssc/SerialPort.java +++ b/src/java/jssc/SerialPort.java @@ -24,6 +24,8 @@ */ package jssc; +import java.lang.reflect.Method; + /** * * @author scream3r @@ -940,27 +942,7 @@ public class SerialPort { * @throws SerialPortException */ public void addEventListener(SerialPortEventListener listener) throws SerialPortException { - checkPortOpened("addEventListener()"); - if(!eventListenerAdded){ - if(maskAssigned){ - eventListener = listener; - eventThread = getNewEventThread(); - eventThread.setName("EventThread " + portName); - eventThread.start(); - eventListenerAdded = true; - } - else { - setEventsMask(MASK_RXCHAR); - eventListener = listener; - eventThread = getNewEventThread(); - eventThread.setName("EventThread " + portName); - eventThread.start(); - eventListenerAdded = true; - } - } - else { - throw new SerialPortException(portName, "addEventListener()", SerialPortException.TYPE_LISTENER_ALREADY_ADDED); - } + addEventListener(listener, MASK_RXCHAR, false); } /** @@ -974,9 +956,29 @@ public class SerialPort { * @throws SerialPortException */ public void addEventListener(SerialPortEventListener listener, int mask) throws SerialPortException { + addEventListener(listener, mask, true); + } + + /** + * Internal method. Add event listener. Object of "SerialPortEventListener" type shall be sent + * to the method. This object shall be properly described, as it will be in + * charge for handling of occurred events. Also events mask shall be sent to + * this method, to do it use variables with prefix "MASK_" for example "MASK_RXCHAR". If + * overwriteMask == true and mask has been already assigned it value will be rewrited by mask + * value, if overwriteMask == false and mask has been already assigned the new mask value will be ignored, + * if there is no assigned mask to this serial port the mask value will be used for setting it up in spite of + * overwriteMask value + * + * @see #setEventsMask(int) setEventsMask(int mask) + * + * @throws SerialPortException + */ + private void addEventListener(SerialPortEventListener listener, int mask, boolean overwriteMask) throws SerialPortException { checkPortOpened("addEventListener()"); if(!eventListenerAdded){ - setEventsMask(mask); + if((maskAssigned && overwriteMask) || !maskAssigned) { + setEventsMask(mask); + } eventListener = listener; eventThread = getNewEventThread(); eventThread.setName("EventThread " + portName); @@ -1064,6 +1066,24 @@ public class SerialPort { for(int i = 0; i < eventArray.length; i++){ if(eventArray[i][0] > 0 && !threadTerminated){ eventListener.serialEvent(new SerialPortEvent(portName, eventArray[i][0], eventArray[i][1])); + //FIXME + /*try { + Class c = eventListener.getClass(); + + Method[] methods = c.getMethods(); + for(Method method : methods){ + System.out.println(method); + } + + Class[] params = new Class[]{SerialPortException.class}; + Method method = c.getMethod("error", params); + System.out.println(method); + method.setAccessible(true); + method.invoke(eventListener, new Object[]{new SerialPortException("port", "method", "exception")}); + } + catch (Exception ex) { + System.out.println(ex); + }*/ } } }