Skip to content

Commit b439b1d

Browse files
committed
Adding initial POC to add support for USB GPS
1 parent cd047f2 commit b439b1d

20 files changed

+229
-50
lines changed

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ repositories {
1313
}
1414

1515
dependencies {
16-
compile("org.projectlombok:lombok:1.16.18")
16+
compile("org.projectlombok:lombok:1.16.20")
1717
compile("org.slf4j:slf4j-api:1.7.25")
1818
compile("org.rxtx:rxtx:2.1.7")
1919

2020
testCompile("ch.qos.logback:logback-classic:1.2.3")
2121

22-
testCompile("com.github.ev3dev-lang-java:ev3dev-lang-java:0.7.0")
22+
compile("com.github.ev3dev-lang-java:ev3dev-lang-java:0.7.0")
2323

2424
testCompile("junit:junit:4.12")
2525
testCompile("org.hamcrest:hamcrest-all:1.3")

config.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
remotes {
33
ev3dev {
4-
host = '192.168.1.143'
4+
host = '192.168.1.206'
55
user = 'robot'
66
password = 'maker'
77
}

gradle/wrapper/gradle-wrapper.jar

2.02 KB
Binary file not shown.
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
#Sun May 07 19:11:30 BST 2017
1+
#Mon Mar 12 19:14:33 GMT 2018
22
distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-4.5.1-all.zip

gradlew

Lines changed: 43 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,43 @@
1-
#!/usr/bin/env bash
1+
#!/usr/bin/env sh
22

33
##############################################################################
44
##
55
## Gradle start up script for UN*X
66
##
77
##############################################################################
88

9-
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10-
DEFAULT_JVM_OPTS=""
9+
# Attempt to set APP_HOME
10+
# Resolve links: $0 may be a link
11+
PRG="$0"
12+
# Need this for relative symlinks.
13+
while [ -h "$PRG" ] ; do
14+
ls=`ls -ld "$PRG"`
15+
link=`expr "$ls" : '.*-> \(.*\)$'`
16+
if expr "$link" : '/.*' > /dev/null; then
17+
PRG="$link"
18+
else
19+
PRG=`dirname "$PRG"`"/$link"
20+
fi
21+
done
22+
SAVED="`pwd`"
23+
cd "`dirname \"$PRG\"`/" >/dev/null
24+
APP_HOME="`pwd -P`"
25+
cd "$SAVED" >/dev/null
1126

1227
APP_NAME="Gradle"
1328
APP_BASE_NAME=`basename "$0"`
1429

30+
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31+
DEFAULT_JVM_OPTS=""
32+
1533
# Use the maximum available, or set MAX_FD != -1 to use that value.
1634
MAX_FD="maximum"
1735

18-
warn ( ) {
36+
warn () {
1937
echo "$*"
2038
}
2139

22-
die ( ) {
40+
die () {
2341
echo
2442
echo "$*"
2543
echo
@@ -30,6 +48,7 @@ die ( ) {
3048
cygwin=false
3149
msys=false
3250
darwin=false
51+
nonstop=false
3352
case "`uname`" in
3453
CYGWIN* )
3554
cygwin=true
@@ -40,31 +59,11 @@ case "`uname`" in
4059
MINGW* )
4160
msys=true
4261
;;
62+
NONSTOP* )
63+
nonstop=true
64+
;;
4365
esac
4466

45-
# For Cygwin, ensure paths are in UNIX format before anything is touched.
46-
if $cygwin ; then
47-
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
48-
fi
49-
50-
# Attempt to set APP_HOME
51-
# Resolve links: $0 may be a link
52-
PRG="$0"
53-
# Need this for relative symlinks.
54-
while [ -h "$PRG" ] ; do
55-
ls=`ls -ld "$PRG"`
56-
link=`expr "$ls" : '.*-> \(.*\)$'`
57-
if expr "$link" : '/.*' > /dev/null; then
58-
PRG="$link"
59-
else
60-
PRG=`dirname "$PRG"`"/$link"
61-
fi
62-
done
63-
SAVED="`pwd`"
64-
cd "`dirname \"$PRG\"`/" >&-
65-
APP_HOME="`pwd -P`"
66-
cd "$SAVED" >&-
67-
6867
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
6968

7069
# Determine the Java command to use to start the JVM.
@@ -90,7 +89,7 @@ location of your Java installation."
9089
fi
9190

9291
# Increase the maximum file descriptors if we can.
93-
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
92+
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
9493
MAX_FD_LIMIT=`ulimit -H -n`
9594
if [ $? -eq 0 ] ; then
9695
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
@@ -114,6 +113,7 @@ fi
114113
if $cygwin ; then
115114
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
116115
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116+
JAVACMD=`cygpath --unix "$JAVACMD"`
117117

118118
# We build the pattern for arguments to be converted via cygpath
119119
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
@@ -154,11 +154,19 @@ if $cygwin ; then
154154
esac
155155
fi
156156

157-
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
158-
function splitJvmOpts() {
159-
JVM_OPTS=("$@")
157+
# Escape application args
158+
save () {
159+
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
160+
echo " "
160161
}
161-
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
162-
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
162+
APP_ARGS=$(save "$@")
163+
164+
# Collect all arguments for the java command, following the shell quoting and substitution rules
165+
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
166+
167+
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
168+
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169+
cd "$(dirname "$0")"
170+
fi
163171

164-
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
172+
exec "$JAVACMD" "$@"

gradlew.bat

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88
@rem Set local scope for the variables with windows NT shell
99
if "%OS%"=="Windows_NT" setlocal
1010

11-
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12-
set DEFAULT_JVM_OPTS=
13-
1411
set DIRNAME=%~dp0
1512
if "%DIRNAME%" == "" set DIRNAME=.
1613
set APP_BASE_NAME=%~n0
1714
set APP_HOME=%DIRNAME%
1815

16+
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17+
set DEFAULT_JVM_OPTS=
18+
1919
@rem Find java.exe
2020
if defined JAVA_HOME goto findJavaFromJavaHome
2121

@@ -46,10 +46,9 @@ echo location of your Java installation.
4646
goto fail
4747

4848
:init
49-
@rem Get command-line arguments, handling Windowz variants
49+
@rem Get command-line arguments, handling Windows variants
5050

5151
if not "%OS%" == "Windows_NT" goto win9xME_args
52-
if "%@eval[2+2]" == "4" goto 4NT_args
5352

5453
:win9xME_args
5554
@rem Slurp the command line arguments.
@@ -60,11 +59,6 @@ set _SKIP=2
6059
if "x%~1" == "x" goto execute
6160

6261
set CMD_LINE_ARGS=%*
63-
goto execute
64-
65-
:4NT_args
66-
@rem Get arguments from the 4NT Shell from JP Software
67-
set CMD_LINE_ARGS=%$
6862

6963
:execute
7064
@rem Setup the command line

lombok.config

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
lombok.nonNull.exceptionType = IllegalArgumentException
2+
lombok.log.fieldName = log
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
package ev3dev.sensors.gps;
2+
3+
import ev3dev.sensors.arduino.bn055.BNO055Listener;
4+
import ev3dev.sensors.arduino.bn055.BNO055ServiceException;
5+
import ev3dev.sensors.arduino.bn055.SerialSensor;
6+
import ev3dev.sensors.arduino.bn055.model.*;
7+
import gnu.io.CommPortIdentifier;
8+
import gnu.io.SerialPort;
9+
import gnu.io.SerialPortEvent;
10+
import gnu.io.SerialPortEventListener;
11+
import lombok.extern.slf4j.Slf4j;
12+
13+
import java.io.BufferedReader;
14+
import java.io.InputStreamReader;
15+
import java.io.OutputStream;
16+
import java.util.ArrayList;
17+
import java.util.Collections;
18+
import java.util.Enumeration;
19+
import java.util.List;
20+
21+
22+
public @Slf4j class SerialGPS implements SerialSensor, SerialPortEventListener {
23+
24+
private BufferedReader input;
25+
private OutputStream output;
26+
private static final int TIME_OUT = 2000;
27+
private static final int DATA_RATE = 115200;
28+
29+
SerialPort serialPort;
30+
31+
private final List<BNO055Listener> listenerList = Collections.synchronizedList(new ArrayList());
32+
33+
private final String USBPort;
34+
35+
public SerialGPS(final String USBPort){
36+
this.USBPort = USBPort;
37+
}
38+
39+
private BNO055Response response;
40+
41+
private void setPortProperty(){
42+
final String ports = System.getProperty("gnu.io.rxtx.SerialPorts");
43+
final String newPorts = ((ports == null) ? "" : (ports + ":")) + this.USBPort;
44+
System.setProperty("gnu.io.rxtx.SerialPorts", newPorts);
45+
}
46+
47+
@Override
48+
public void init() throws BNO055ServiceException {
49+
50+
//System.setProperty("gnu.io.rxtx.SerialPorts", this.USBPort);
51+
this.setPortProperty();
52+
53+
CommPortIdentifier portId = null;
54+
Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();
55+
56+
//First, Find an instance of serial port as set in PORT_NAMES.
57+
while (portEnum.hasMoreElements()) {
58+
CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
59+
if (currPortId.getName().equals(this.USBPort)) {
60+
portId = currPortId;
61+
break;
62+
}
63+
}
64+
65+
if (portId == null) {
66+
log.error("Could not find port.");
67+
throw new BNO055ServiceException("Could not find port.");
68+
}
69+
70+
try {
71+
// open serial port, and use class name for the appName.
72+
serialPort = (SerialPort) portId.open(this.getClass().getName(), TIME_OUT);
73+
74+
// set port parameters
75+
serialPort.setSerialPortParams(DATA_RATE,
76+
SerialPort.DATABITS_8,
77+
SerialPort.STOPBITS_1,
78+
SerialPort.PARITY_NONE);
79+
80+
//TODO: Review??
81+
//serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
82+
83+
// open the streams
84+
input = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
85+
output = serialPort.getOutputStream();
86+
87+
// add event listeners
88+
serialPort.addEventListener(this);
89+
serialPort.notifyOnDataAvailable(true);
90+
} catch (Exception e) {
91+
log.error(e.getLocalizedMessage());
92+
throw new BNO055ServiceException(e);
93+
}
94+
}
95+
96+
/**
97+
* This should be called when you stop using the port.
98+
* This will prevent port locking on platforms like Linux.
99+
*/
100+
public synchronized void close() {
101+
if (serialPort != null) {
102+
serialPort.removeEventListener();
103+
serialPort.close();
104+
}
105+
}
106+
107+
/**
108+
* Handle an event on the serial port. Read the data and print it.
109+
*/
110+
@Override
111+
public synchronized void serialEvent(SerialPortEvent oEvent) {
112+
if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
113+
try {
114+
final String inputLine=input.readLine();
115+
116+
System.out.println(inputLine);
117+
118+
} catch (Exception e) {
119+
log.error(e.getLocalizedMessage());
120+
}
121+
}
122+
}
123+
124+
public synchronized BNO055Response getResponse(){
125+
return response;
126+
}
127+
128+
@Override
129+
public void addListener(BNO055Listener listener) {
130+
listenerList.add(listener);
131+
}
132+
133+
@Override
134+
public void removeListener(BNO055Listener listener) {
135+
listenerList.remove(listener);
136+
}
137+
138+
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package examples;
2+
3+
import ev3dev.sensors.arduino.bn055.BNO055;
4+
import ev3dev.sensors.arduino.bn055.BNO055Listener;
5+
import ev3dev.sensors.arduino.bn055.model.BNO055Response;
6+
import ev3dev.sensors.gps.SerialGPS;
7+
import lombok.extern.slf4j.Slf4j;
8+
9+
public @Slf4j class SerialGPSEventsTest {
10+
11+
public static void main(String[] args) throws Exception {
12+
13+
final String port = "/dev/ttyACM0";
14+
final SerialGPS bno055 = new SerialGPS(port);
15+
bno055.init();
16+
bno055.addListener(new BNO055Listener() {
17+
18+
@Override
19+
public void dataReceived(BNO055Response response) {
20+
log.info("{}", response);
21+
}
22+
23+
});
24+
25+
log.info("Start reading");
26+
for(int x= 0; x<=10; x++){
27+
log.info("Iteration: {}", x);
28+
Thread.sleep(1000);
29+
}
30+
31+
bno055.close();
32+
log.info("Closing connection with Arduino");
33+
34+
}
35+
}

src/main/resources/META-INF/MANIFEST.MF

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@ Manifest-Version: 1.0
22
Implementation-Title: EV3Dev-lang-java / usb-devices
33
Implementation-Version: 0.1.0-SNAPSHOT
44
Implementation-Vendor: Juan Antonio Breña Moral
5+
Main-Class: examples.SerialGPSEventsTest
6+

0 commit comments

Comments
 (0)