Factor out all general jlibarduino code

This commit is contained in:
2015-06-25 15:58:30 +01:00
parent 55d51fdcd2
commit 0e8f953f0f
12 changed files with 65 additions and 279 deletions

View File

@@ -1,29 +1,32 @@
package com.github.boukefalos.tm1638; package com.github.boukefalos.tm1638;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tm1638.Tm1638.Color; import tm1638.Tm1638.Color;
import tm1638.Tm1638.Command; import tm1638.Tm1638.Command;
import tm1638.Tm1638.Command.Type; import tm1638.Tm1638.Command.Type;
import tm1638.Tm1638.Construct; import tm1638.Tm1638.Construct;
import tm1638.Tm1638.Echo;
import tm1638.Tm1638.Ping; import tm1638.Tm1638.Ping;
import tm1638.Tm1638.SetLed; import tm1638.Tm1638.SetLed;
import base.Sender;
public abstract class AbstractTM1638 implements TM1638, Sender { import com.github.boukefalos.arduino.AbstractArduino;
public static final int BUFFER_SIZE = 1024; import com.google.protobuf.InvalidProtocolBufferException;
protected Logger logger = LoggerFactory.getLogger(getClass());
public void start() {} public abstract class AbstractTM1638 extends AbstractArduino implements TM1638 {
public void input(byte[] buffer) {
public void stop() {} System.out.println(new String(buffer));
try {
public void exit() { ByteArrayInputStream input = new ByteArrayInputStream(buffer);
stop(); Echo echo = Echo.parseDelimitedFrom(input);
System.out.println(echo.getMessage());
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} }
public void command(Command command) { public void command(Command command) {

View File

@@ -1,138 +0,0 @@
package com.github.boukefalos.tm1638;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.TooManyListenersException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import purejavacomm.CommPortIdentifier;
import purejavacomm.PortInUseException;
import purejavacomm.SerialPort;
import purejavacomm.SerialPortEvent;
import purejavacomm.SerialPortEventListener;
import purejavacomm.UnsupportedCommOperationException;
import tm1638.Tm1638.Echo;
import base.work.Listen;
import com.github.boukefalos.tm1638.exception.ArduinoException;
public class Arduino implements SerialPortEventListener {
public static final int BUFFER_SIZE = 1024;
public static final int TIME_OUT = 1000;
public static final String PORT_NAMES[] = {
"tty.usbmodem", // Mac OS X
"usbdev", // Linux
"tty", // Linux
"serial", // Linux
"COM3", // Windows
};
protected static Logger logger = LoggerFactory.getLogger(Arduino.class);
protected static Arduino arduino;
protected int bufferSize;
protected SerialPort port = null;
protected InputStream inputStream = null;
protected ArrayList<Listen<Object>> listenList = new ArrayList<Listen<Object>>();
protected Arduino(int bufferSize) {
this.bufferSize = bufferSize;
}
public void register(Listen<Object> listen) {
listenList.add(listen);
}
public void remove(Listen<Object> listen) {
listenList.remove(listen);
}
public static Arduino getInstance() {
return getInstance(BUFFER_SIZE);
}
public static Arduino getInstance(int bufferSize) {
if (arduino == null) {
arduino = new Arduino(bufferSize);
}
return arduino;
}
protected void connect() throws ArduinoException {
CommPortIdentifier portid = null;
Enumeration<?> portEnum = CommPortIdentifier.getPortIdentifiers();
while (portEnum.hasMoreElements()) {
portid = (CommPortIdentifier)portEnum.nextElement();
if (portid != null) {
System.out.println("Trying: " + portid.getName());
for ( String portName: PORT_NAMES) {
if (portid.getName().equals(portName) || portid.getName().contains(portName)) {
try {
port = (SerialPort) portid.open("", TIME_OUT);
port.setFlowControlMode(
SerialPort.FLOWCONTROL_XONXOFF_IN +
SerialPort.FLOWCONTROL_XONXOFF_OUT);
inputStream = port.getInputStream();
System.out.println( "Connected on port: " + portid.getName());
port.addEventListener(this);
} catch (UnsupportedCommOperationException | PortInUseException | IOException | TooManyListenersException e) {
throw new ArduinoException("Failed to connect");
}
port.notifyOnDataAvailable(true);
return;
}
}
}
}
throw new ArduinoException("No Arduino available");
}
public void serialEvent(SerialPortEvent event) {
try {
switch (event.getEventType()) {
case SerialPortEvent.DATA_AVAILABLE:
// Where should this be parsed, or should byte[] be passed directly?
Echo echo = Echo.parseDelimitedFrom(inputStream);
System.err.println(echo.getMessage());
for (Listen<Object> listen : listenList) {
listen.add(echo);
}
break;
default:
break;
}
} catch (IOException e) {
logger.error("", e);
}
}
public InputStream getInputStream() throws ArduinoException {
if (port == null) {
connect();
}
try {
return port.getInputStream();
} catch (IOException e) {
throw new ArduinoException("Failed to get inputstream");
}
}
public OutputStream getOutputStream() throws ArduinoException {
if (port == null) {
connect();
}
try {
return port.getOutputStream();
} catch (IOException e) {
throw new ArduinoException("Failed to get inputstream");
}
}
public void close() {
port.close();
}
}

View File

@@ -2,69 +2,29 @@ package com.github.boukefalos.tm1638;
import java.util.Properties; import java.util.Properties;
import org.picocontainer.Parameter;
import org.picocontainer.PicoCompositionException; import org.picocontainer.PicoCompositionException;
import org.picocontainer.parameters.ComponentParameter;
import org.picocontainer.parameters.ConstantParameter;
import tm1638.Tm1638.Echo;
import base.exception.LoaderException; import base.exception.LoaderException;
import base.loader.AbstractLoader;
import com.github.boukefalos.tm1638.exception.ArduinoException; import com.github.boukefalos.arduino.exception.ArduinoException;
import com.github.boukefalos.arduino.port.ParsingPort;
import com.github.boukefalos.tm1638.implementation.Local; import com.github.boukefalos.tm1638.implementation.Local;
import com.github.boukefalos.tm1638.implementation.Remote; import com.github.boukefalos.tm1638.implementation.Remote;
public class Loader extends AbstractLoader<Loader> { public class Loader extends com.github.boukefalos.arduino.Loader {
protected static final String PROPERTIES_FILE = "TM1638.properties"; protected static final String PROPERTIES_FILE = "TM1638.properties";
public Loader(Properties properties) throws LoaderException { public Loader(Properties properties) throws LoaderException {
super(); super(Local.class, Remote.class, Server.class, properties);
pico.addComponent(ParsingPort.getInstance(Echo.class));
/* Add implementation */
switch (properties.getProperty("implementation")) {
case "local":
pico.addComponent(TM1638.class, Local.class);
break;
case "remote":
pico.addComponent(TM1638.class, Remote.class);
/* Add remote duplex implementation */
try {
String protocol = properties.getOrDefault("server.protocol", "tcp").toString();
String implementation = properties.getOrDefault("tcp.implementation", "socket").toString();
String host = properties.getProperty("remote.host");
int port = Integer.valueOf(properties.getProperty("remote.port"));
addClientDuplex(protocol, implementation, host, port);
} catch (NumberFormatException e) {
throw new LoaderException("Failed to parse remote.port");
}
break;
}
/* Add server */
if (properties.getProperty("server") != null) {
boolean direct = Boolean.parseBoolean(properties.getOrDefault("server.direct", Server.DIRECT).toString());
pico.addComponent(Server.class, Server.class, new Parameter[] {
new ComponentParameter(),
new ComponentParameter(),
new ConstantParameter(direct)});
/* Add server forwarder implementation */
try {
String protocol = properties.getOrDefault("server.protocol", "tcp").toString();
String implementation = properties.getOrDefault("tcp.implementation", "socket").toString();
int port = Integer.valueOf(properties.getProperty("server.port"));
addServerDuplex(protocol, implementation, port);
} catch (NumberFormatException e) {
throw new LoaderException("Failed to parse server.port");
}
}
} }
public TM1638 getTM1638() throws ArduinoException { public TM1638 getTM1638() throws ArduinoException {
try { try {
return pico.getComponent(TM1638.class); return pico.getComponent(TM1638.class);
} catch (PicoCompositionException e) { } catch (PicoCompositionException e) {
logger.error("", e);
throw new ArduinoException("Failed to load"); throw new ArduinoException("Failed to load");
} }
} }
@@ -73,6 +33,7 @@ public class Loader extends AbstractLoader<Loader> {
try { try {
return pico.getComponent(Server.class); return pico.getComponent(Server.class);
} catch (PicoCompositionException e) { } catch (PicoCompositionException e) {
logger.error("", e);
throw new ArduinoException("Failed to load"); throw new ArduinoException("Failed to load");
} }
} }

View File

@@ -7,42 +7,16 @@ import tm1638.Tm1638.Color;
import tm1638.Tm1638.Command; import tm1638.Tm1638.Command;
import tm1638.Tm1638.Ping; import tm1638.Tm1638.Ping;
import tm1638.Tm1638.SetLed; import tm1638.Tm1638.SetLed;
import base.Control;
import base.Duplex; import base.Duplex;
import base.Receiver;
import base.exception.worker.ActivateException;
import base.exception.worker.DeactivateException;
import base.work.Listen;
import com.github.boukefalos.tm1638.exception.ArduinoException; import com.github.boukefalos.arduino.exception.ArduinoException;
public class Server extends Listen<Object> implements Control, Receiver {
protected static final boolean DIRECT = false;
public class Server extends com.github.boukefalos.arduino.Server {
protected TM1638 tm1638; protected TM1638 tm1638;
protected Duplex duplex;
protected boolean direct;
public Server(TM1638 tm1638, Duplex duplex) {
this(tm1638, duplex, DIRECT);
}
public Server(TM1638 tm1638, Duplex duplex, boolean direct) { public Server(TM1638 tm1638, Duplex duplex, boolean direct) {
super(tm1638, duplex, direct);
this.tm1638 = tm1638; this.tm1638 = tm1638;
this.duplex = duplex;
this.direct = direct;
tm1638.register(this); // Arduino > [input()]
duplex.register(this); // Client > [receive()]
}
public void activate() throws ActivateException {
duplex.start();
super.activate();
}
public void deactivate() throws DeactivateException {
duplex.stop();
super.deactivate();
} }
public void receive(byte[] buffer) { public void receive(byte[] buffer) {
@@ -84,13 +58,4 @@ public class Server extends Listen<Object> implements Control, Receiver {
} }
} }
} }
public void input(byte[] buffer) {
// Arduino > [Server] > Client
try {
duplex.send(buffer);
} catch (IOException e) {
logger.error("", e);
}
}
} }

View File

@@ -1,17 +1,10 @@
package com.github.boukefalos.tm1638; package com.github.boukefalos.tm1638;
import com.github.boukefalos.tm1638.exception.ArduinoException;
import tm1638.Tm1638.Color; import tm1638.Tm1638.Color;
import base.Control;
import base.work.Listen;
public interface TM1638 extends Control { import com.github.boukefalos.arduino.Arduino;
public void register(Listen<Object> listen);
public void remove(Listen<Object> listen);
public void send(byte[] buffer) throws ArduinoException;
public interface TM1638 extends Arduino {
public void construct(int dataPin, int clockPin, int strobePin); public void construct(int dataPin, int clockPin, int strobePin);
public void ping(int i); public void ping(int i);
public void setLed(Color color, int pos); public void setLed(Color color, int pos);

View File

@@ -1,11 +0,0 @@
package com.github.boukefalos.tm1638.exception;
import java.io.IOException;
public class ArduinoException extends IOException {
protected static final long serialVersionUID = 1L;
public ArduinoException(String message) {
super(message);
}
}

View File

@@ -2,32 +2,38 @@ package com.github.boukefalos.tm1638.implementation;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.ArrayList;
import tm1638.Tm1638.Echo;
import base.work.Listen; import base.work.Listen;
import com.github.boukefalos.arduino.exception.ArduinoException;
import com.github.boukefalos.arduino.port.ParsingPort;
import com.github.boukefalos.arduino.port.Port;
import com.github.boukefalos.tm1638.AbstractTM1638; import com.github.boukefalos.tm1638.AbstractTM1638;
import com.github.boukefalos.tm1638.Arduino;
import com.github.boukefalos.tm1638.exception.ArduinoException;
public class Local extends AbstractTM1638 { public class Local extends AbstractTM1638 {
protected Arduino arduino; protected Port arduino;
protected OutputStream outputStream; protected OutputStream outputStream;
protected ArrayList<Listen<Object>> listenList;
public Local() throws Exception { public Local() throws ArduinoException {
this(Arduino.getInstance()); this(ParsingPort.getInstance(Echo.class));
} }
public Local(Arduino arduino) throws ArduinoException { public Local(Port arduino) throws ArduinoException {
this.arduino = arduino; this.arduino = arduino;
outputStream = arduino.getOutputStream(); outputStream = arduino.getOutputStream();
listenList = new ArrayList<Listen<Object>>();
arduino.register(this);
} }
public void register(Listen<Object> listen) { public void register(Listen<Object> listen) {
arduino.register(listen); listenList.add(listen);
} }
public void remove(Listen<Object> listen) { public void remove(Listen<Object> listen) {
arduino.remove(listen); listenList.remove(listen);
} }
public void stop() { public void stop() {

View File

@@ -7,8 +7,8 @@ import base.Duplex;
import base.Receiver; import base.Receiver;
import base.work.Listen; import base.work.Listen;
import com.github.boukefalos.arduino.exception.ArduinoException;
import com.github.boukefalos.tm1638.AbstractTM1638; import com.github.boukefalos.tm1638.AbstractTM1638;
import com.github.boukefalos.tm1638.exception.ArduinoException;
public class Remote extends AbstractTM1638 implements Receiver { public class Remote extends AbstractTM1638 implements Receiver {
protected Duplex duplex; protected Duplex duplex;
@@ -43,7 +43,7 @@ public class Remote extends AbstractTM1638 implements Receiver {
public void receive(byte[] buffer) { public void receive(byte[] buffer) {
// Arduino > Server > [Client] // Arduino > Server > [Client]
// Should decode here? // Should give option to decode here?
for (Listen<Object> listen : listenList) { for (Listen<Object> listen : listenList) {
listen.add(buffer); listen.add(buffer);
} }

View File

@@ -14,8 +14,9 @@ public class TestLocal extends Listen<Object> {
} }
public static void main(TM1638 TM1638) throws InterruptedException { public static void main(TM1638 TM1638) throws InterruptedException {
TM1638.register(new TestLocal()); TM1638.register(new TestLocal());
TM1638.construct(8, 9, 7); TM1638.start();
TM1638.construct(8, 9, 7);
int i = 123; int i = 123;
while (i < 10000) { while (i < 10000) {

View File

@@ -2,19 +2,20 @@ package test;
import java.util.Properties; import java.util.Properties;
import base.exception.LoaderException;
import base.exception.worker.ActivateException; import base.exception.worker.ActivateException;
import com.github.boukefalos.arduino.exception.ArduinoException;
import com.github.boukefalos.tm1638.Loader; import com.github.boukefalos.tm1638.Loader;
import com.github.boukefalos.tm1638.Server; import com.github.boukefalos.tm1638.Server;
import com.github.boukefalos.tm1638.TM1638; import com.github.boukefalos.tm1638.TM1638;
import com.github.boukefalos.tm1638.exception.ArduinoException;
public class TestRemoteImplementation extends TestLocal { public class TestRemoteImplementation extends TestLocal {
protected TM1638 tm1638; protected TM1638 tm1638;
public TestRemoteImplementation(Loader loader) throws ArduinoException { public TestRemoteImplementation(Loader loader) throws ArduinoException {
tm1638 = loader.getTM1638(); tm1638 = loader.getTM1638();
tm1638.register(this); //tm1638.register(this);
} }
public void activate() throws ActivateException { public void activate() throws ActivateException {
@@ -26,10 +27,14 @@ public class TestRemoteImplementation extends TestLocal {
Loader localLoader = new Loader(localProperties); Loader localLoader = new Loader(localProperties);
Loader remoteLoader = new Loader(remoteProperties); Loader remoteLoader = new Loader(remoteProperties);
Server server = localLoader.getServer(); try {
server.start(); Server server = localLoader.getServer();
TM1638 TM1638 = remoteLoader.getTM1638();
TM1638 TM1638 = remoteLoader.getTM1638(); server.start();
main(TM1638); main(TM1638);
} catch (ArduinoException e) {
e.printStackTrace();
return;
}
} }
} }

View File

@@ -2,7 +2,7 @@ package test;
import java.util.Properties; import java.util.Properties;
import com.github.boukefalos.tm1638.exception.ArduinoException; import com.github.boukefalos.arduino.exception.ArduinoException;
public class TestTcpImplementation { public class TestTcpImplementation {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {

View File

@@ -6,6 +6,7 @@ public class TestUdpImplementation {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
Properties localProperties = new Properties(); Properties localProperties = new Properties();
localProperties.setProperty("implementation", "local"); localProperties.setProperty("implementation", "local");
localProperties.setProperty("protocol", "udp");
localProperties.setProperty("server", "true"); localProperties.setProperty("server", "true");
localProperties.setProperty("server.direct", "false"); localProperties.setProperty("server.direct", "false");
localProperties.setProperty("server.port", "8883"); localProperties.setProperty("server.port", "8883");