/**
* Copyright (c) 2010-2016, openHAB.org and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.openhab.binding.onkyo.internal.eiscp;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.openhab.binding.onkyo.internal.OnkyoEventListener;
import org.openhab.binding.onkyo.internal.OnkyoStatusUpdateEvent;
/**
* <p>
* <b>Note:</b>Onkyo Event notifier for Serial port communications.
* </p>
* <br>
*
* @author Sriram Balakrishnan
* @since 1.9.0
*/
public class EiscpEventNotifier {
String deviceSerialorIp;
private List<OnkyoEventListener> _listeners = new ArrayList<OnkyoEventListener>();
public EiscpEventNotifier(String deviceSerialOrIp) {
this.deviceSerialorIp = deviceSerialOrIp;
}
/**
* Add event listener, which will be invoked when status upadte is received
* from receiver.
**/
public synchronized void addEventListener(OnkyoEventListener listener) {
_listeners.add(listener);
}
/**
* Remove event listener.
**/
public synchronized void removeEventListener(OnkyoEventListener listener) {
_listeners.remove(listener);
}
public void notifyMessage(OnkyoStatusUpdateEvent event, byte[] data, int dataSize) throws EiscpException {
// unit type
@SuppressWarnings("unused")
final byte unitType = data[1];
// data should be end to "[EOF]" or "[EOF][CR]" or
// "[EOF][CR][LF]" characters depend on model
// [EOF] End of File ASCII Code 0x1A
// [CR] Carriage Return ASCII Code 0x0D (\r)
// [LF] Line Feed ASCII Code 0x0A (\n)
int endBytes = 0;
if (data[dataSize - 4] == (byte) 0x1A && data[dataSize - 3] == '\r' && data[dataSize - 2] == '\n'
&& data[dataSize - 1] == 0x00) {
// skip "[EOF][CR][LF][NULL]"
endBytes = 4;
} else if (data[dataSize - 3] == (byte) 0x1A && data[dataSize - 2] == '\r' && data[dataSize - 1] == '\n') {
// skip "[EOF][CR][LF]"
endBytes = 3;
} else if (data[dataSize - 2] == (byte) 0x1A && data[dataSize - 1] == '\r') {
// "[EOF][CR]"
endBytes = 2;
} else if (data[dataSize - 1] == (byte) 0x1A) {
// "[EOF]"
endBytes = 1;
} else {
throw new EiscpException("Illegal end of message");
}
int bytesToCopy = dataSize - 2 - endBytes;
byte[] message = new byte[bytesToCopy];
// skip 2 first bytes and copy all bytes before end bytes
System.arraycopy(data, 2, message, 0, bytesToCopy);
// send message to event listeners
try {
Iterator<OnkyoEventListener> iterator = _listeners.iterator();
while (iterator.hasNext()) {
iterator.next().statusUpdateReceived(event, deviceSerialorIp, new String(message));
}
} catch (Exception e) {
throw new EiscpException("Event listener invoking error", e);
}
}
}