Author Topic: RXTX doesn't work in applet [Java]  (Read 4250 times)

0 Members and 1 Guest are viewing this topic.

Offline Fredrik AnderssonTopic starter

  • Robot Overlord
  • ****
  • Posts: 216
  • Helpful? 0
RXTX doesn't work in applet [Java]
« on: February 17, 2008, 03:46:32 PM »
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:
Code: [Select]
/*
 * @(#)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;
Code: [Select]
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?
« Last Edit: February 17, 2008, 03:50:04 PM by Fredrik Andersson »
Current project: Pirrh - Portable Intelligent Round Rolling Hexapod

paulstreats

  • Guest
Re: RXTX doesn't work in applet [Java]
« Reply #1 on: February 17, 2008, 05:51:37 PM »
Look at how it implements 

static CommPortIdentifier portId;
and
portId = (CommPortIdentifier) portList.nextElement();

this should help

Offline Fredrik AnderssonTopic starter

  • Robot Overlord
  • ****
  • Posts: 216
  • Helpful? 0
Re: RXTX doesn't work in applet [Java]
« Reply #2 on: February 18, 2008, 02:31:02 AM »
Sorry, that doesn't solve anything.

You see, something is wrong already at the line "portList = CommPortIdentifier.getPortIdentifiers();".

I'm very used to programming, but not Java, so I'm not sure how linking between differents class files, compiling and such works yet. Could it be that I haven't installed the RXTX library properly? Am i supposed to package the applet with the RXTX library files?
Current project: Pirrh - Portable Intelligent Round Rolling Hexapod

Offline Fredrik AnderssonTopic starter

  • Robot Overlord
  • ****
  • Posts: 216
  • Helpful? 0
Re: RXTX doesn't work in applet [Java]
« Reply #3 on: February 18, 2008, 04:21:19 PM »
The problem is solved. It was due to permission restrictions on Java applets. With a little ugly hack in the java main file of setting permissions, i made it able to use the serial ports.
Current project: Pirrh - Portable Intelligent Round Rolling Hexapod

 


Get Your Ad Here