/**
* Copyright (c) 2010-2016 by the respective copyright holders.
*
* 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.akm868.internal;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This class is responsible for listening to the network to receive packets
* from the LAN-T Adapter
*
* @author Michael Heckmann
* @since 1.8.0
*/
public class AKM868PacketReceiver implements Runnable {
private static Logger logger = LoggerFactory.getLogger(AKM868PacketReceiver.class);
private AKM868Listener listener;
private boolean running;
private Socket akmSocket = null;
private long timeout;
private BufferedReader akmReader;
private List<AKM868Timer> timerList;
private String deliminator = ","; // default value
public AKM868PacketReceiver(AKM868Listener listener) {
this.listener = listener;
}
public void initializeReceiver(String host, int port, long timeout) {
try {
akmSocket = new Socket(host, port);
akmReader = new BufferedReader(new InputStreamReader(akmSocket.getInputStream()));
logger.debug("Connected to: " + host + ":" + port);
timerList = new ArrayList<AKM868Timer>();
this.timeout = timeout;
} catch (IOException e) {
logger.debug(e.getMessage());
}
}
/**
* Stop the thread
*/
public void stopListener() {
running = false;
if (akmSocket != null) {
try {
akmSocket.close();
} catch (IOException e) {
logger.debug(e.getMessage());
}
}
akmSocket = null;
}
@Override
public void run() {
running = true; // start loop
if (akmSocket == null) {
throw new IllegalStateException(
"Cannot access socket. You must call" + " call initializeListener(..) first!");
}
while (running) {
try {
if (akmReader.ready()) {
logger.debug("Receiving data...");
String line = akmReader.readLine();
logger.debug("Reading from socket: " + line);
String[] elements = line.split(deliminator);
if (elements.length > 5) {
return;
}
String id = elements[2];
String action = elements[3];
String packetValid = elements[4];
if (!packetValid.equalsIgnoreCase("OK")) {
logger.debug("Packet not valid: " + line);
return;
}
if (action.equals("1")) {
logger.debug("Found 1 => KeyPressedShort");
listener.publishKeyPressedShort(id);
}
if (action.equals("5")) {
logger.debug("Found 5 => KeyPressedLong");
listener.publishKeyPressedLong(id);
}
int timerCount = timerList.size();
boolean containsTimer = false;
if (timerList.size() > 0) {
for (int i = 0; i < timerCount; i++) {
if (timerList.get(i).getId() == new Integer(id).intValue()) {
logger.debug("Timer found....restarting timer for id: " + id);
timerList.get(i).restart();
containsTimer = true;
break;
} else {
containsTimer = false;
}
}
if (!containsTimer) {
logger.debug("Timer not found....starting new timer for id: " + id);
timerList.add(new AKM868Timer(new Integer(id).intValue()));
listener.publishUpdate(new Integer(id).toString(), true);
}
} else {
logger.debug("Timer not found....starting new timer for id: " + id);
timerList.add(new AKM868Timer(new Integer(id).intValue()));
listener.publishUpdate(new Integer(id).toString(), true);
}
}
int i = 0;
while (!timerList.isEmpty() & i < timerList.size()) {
if (timerList.get(i).hasTimedOut(timeout)) {
logger.debug("Timed out: " + timerList.get(i).getId());
listener.publishUpdate("" + timerList.get(i).getId(), false);
timerList.remove(i);
i = 0;
} else {
i++;
}
}
} catch (NumberFormatException e) {
logger.debug(e.getMessage());
} catch (IOException e) {
logger.debug(e.getMessage());
}
}
logger.debug("Exiting");
}
}