I'm starting to go nuts here... :/
I've been trying to learn the RXTX library for java (a serial/parallel communications library) and i managed to get an RXTX Hello World example to compile and run. I made some minor changes to it, like changing the port to USB and changing the message to one that my servo controller would understand, but yeah, that doesn't really matter.
When i got that to work i thought i would implement the code in my IK calculations utility which is an applet. Suddenly, the same code wont work.
This is the Hello World example that worked:
/*
* @(#)SimpleWrite.java 1.12 98/06/25 SMI
*
* Copyright 2003 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license
* to use, modify and redistribute this software in source and binary
* code form, provided that i) this copyright notice and license appear
* on all copies of the software; and ii) Licensee does not utilize the
* software in a manner which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
* LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE
* SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS
* BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES,
* HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING
* OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control
* of aircraft, air traffic, aircraft navigation or aircraft
* communications; or in the design, construction, operation or
* maintenance of any nuclear facility. Licensee represents and
* warrants that it will not use or redistribute the Software for such
* purposes.
*/
import java.io.*;
import java.util.*;
//import javax.comm.*;
import gnu.io.*;
/**
* Class declaration
*
*
* @author
* @version 1.10, 08/04/00
*/
public class SimpleWrite {
static Enumeration portList;
static CommPortIdentifier portId;
static String messageString = "Hello, world!";
static SerialPort serialPort;
static OutputStream outputStream;
static boolean outputBufferEmptyFlag = false;
/**
* Method declaration
*
*
* @param args
*
* @see
*/
public static void main(String[] args) {
boolean portFound = false;
String defaultPort = "/dev/term/a";
if (args.length > 0) {
defaultPort = args[0];
}
portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
if (portId.getName().equals(defaultPort)) {
System.out.println("Found port " + defaultPort);
portFound = true;
try {
serialPort =
(SerialPort) portId.open("SimpleWrite", 2000);
} catch (PortInUseException e) {
System.out.println("Port in use.");
continue;
}
try {
outputStream = serialPort.getOutputStream();
} catch (IOException e) {}
try {
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {}
try {
serialPort.notifyOnOutputEmpty(true);
} catch (Exception e) {
System.out.println("Error setting event notification");
System.out.println(e.toString());
System.exit(-1);
}
System.out.println(
"Writing \""+messageString+"\" to "
+serialPort.getName());
try {
outputStream.write(messageString.getBytes());
} catch (IOException e) {}
try {
Thread.sleep(2000); // Be sure data is xferred before closing
} catch (Exception e) {}
serialPort.close();
System.exit(1);
}
}
}
if (!portFound) {
System.out.println("port " + defaultPort + " not found.");
}
}
}
I tried to comment out more and more of the code and i got to the point where only the line "portList = CommPortIdentifier.getPortIdentifiers();" was left within main(). When i commented out that as well the program initialized and ran fine...
This is the classthat implemets the one above;
import java.lang.Math;
public class Body {
Leg[] Legs;
LegAttachPoint[] LegPoints;
double Radius;
int LegAmount;
Animator Anim;
ServoController servoController;
public Body(double r, int n) {
LegAmount = n;
Legs = new Leg[LegAmount];
LegPoints = new LegAttachPoint[LegAmount];
Radius = r;
int l;
for (l = 0; l < LegAmount; l++) {
LegPoints[l] = new LegAttachPoint(
Math.cos( 2 * Math.PI * (double)l / (double)LegAmount ) * Radius,
0.0,
Math.sin( 2 * Math.PI * (double)l / (double)LegAmount ) * Radius,
2 * Math.PI * (double)l / (double)LegAmount );
Legs[l] = new Leg();
Legs[l].Calculate( 50.0, 100.0, 0.0 );
}
servoController = new ServoController();
servoController.Init( "/dev/ttyUSB0", 115200 );
Anim = new Animator();
}
public void MoveBody( double x, double y, double z ) {
for (int l = 0; l < LegAmount; l++) {
Legs[l].IncPosition(LegPoints[l].TranslateX(LegPoints[l].AttachX + x,LegPoints[l].AttachZ + z),
y,
LegPoints[l].TranslateZ(LegPoints[l].AttachX + x,LegPoints[l].AttachZ + z) );
Legs[l].Calculate();
}
}
public void MoveLeg(double x,double y,double z, int n) {
Legs[n].IncPosition(LegPoints[n].TranslateX(LegPoints[n].AttachX + x,LegPoints[n].AttachZ + z),
y,
LegPoints[n].TranslateZ(LegPoints[n].AttachX + x,LegPoints[n].AttachZ + z) );
Legs[n].Calculate();
}
}
Any ideas of what might be the problem?