/******************************************************************************* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. *******************************************************************************/ import java.applet.Applet; import java.applet.AppletContext; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.StringTokenizer; import java.util.TooManyListenersException; import javax.comm.CommPortIdentifier; import javax.comm.CommPortOwnershipListener; import javax.comm.NoSuchPortException; import javax.comm.PortInUseException; import javax.comm.SerialPort; import javax.comm.SerialPortEvent; import javax.comm.SerialPortEventListener; import javax.comm.UnsupportedCommOperationException; import netscape.javascript.JSObject; /** * ShipmentScaleApplet - Applet for reading weight from a scale and input into the browser */ public class ShipmentScaleApplet extends Applet implements SerialPortEventListener, CommPortOwnershipListener { private AppletContext ctx = null; private CommPortIdentifier portId = null; private SerialPort serialPort = null; private boolean portOpen = false; private InputStream in = null; private OutputStream out = null; public void init() { this.ctx = this.getAppletContext(); /* String port = this.getParameter("serialPort"); try { this.configurePort(port); } catch (Exception e) { e.printStackTrace(); } */ try { this.sendFakeMessage(); } catch (IOException e) { e.printStackTrace(); } } public void paint() { } public void configurePort(String port) throws UnsupportedCommOperationException, IOException { try { portId = CommPortIdentifier.getPortIdentifier(port); } catch (NoSuchPortException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { serialPort = (SerialPort) portId.open("SerialScale", 30000); } catch (PortInUseException e) { // TODO Auto-generated catch block e.printStackTrace(); } serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_OUT); in = serialPort.getInputStream(); out = serialPort.getOutputStream(); try { serialPort.addEventListener(this); } catch (TooManyListenersException e) { // TODO Auto-generated catch block e.printStackTrace(); } serialPort.enableReceiveTimeout(30); serialPort.notifyOnDataAvailable(true); serialPort.notifyOnBreakInterrupt(true); portId.addPortOwnershipListener(this); this.portOpen = true; } /* (non-Javadoc) * @see javax.comm.SerialPortEventListener#serialEvent(javax.comm.SerialPortEvent) */ public void serialEvent(SerialPortEvent event) { // Create a StringBuffer and int to receive input data. StringBuffer inputBuffer = new StringBuffer(); int newData = 0; // Determine type of event. switch (event.getEventType()) { // Read data until -1 is returned. If \r is received substitute // \n for correct newline handling. case SerialPortEvent.DATA_AVAILABLE: while (newData != -1) { try { newData = in.read(); if (newData == -1) { break; } if (newData != 32 && newData != 3) { if ('\r' == (char)newData) { inputBuffer.append('|'); } else if ('\n' == (char)newData) { inputBuffer.append(""); } else { inputBuffer.append((char)newData); } //inputBuffer.append("(").append(newData).append(")"); } } catch (IOException ex) { System.err.println(ex); return; } } // Append received data to messageAreaIn. checkResponse(inputBuffer.toString()); break; // If break event append BREAK RECEIVED message. case SerialPortEvent.BI: break; } } /* (non-Javadoc) * @see javax.comm.CommPortOwnershipListener#ownershipChange(int) */ public void ownershipChange(int arg0) { // TODO Auto-generated method stub } // send the code to the scale and requests the weight public void sendMessage() throws IOException { String message = "W\r"; char[] msgChars = message.toCharArray(); for (int i = 0; i < msgChars.length; i++) { out.write((int)msgChars[i]); } out.flush(); serialPort.sendBreak(1000); } public void close() throws IOException { out.close(); in.close(); serialPort.close(); } public static void main(String args[]) throws Exception { ShipmentScaleApplet applet = new ShipmentScaleApplet(); applet.sendMessage(); applet.close(); } // validates the response from the scale and calls the set method private void checkResponse(String response) { StringTokenizer token = new StringTokenizer(response, "|"); if (token != null && token.hasMoreElements()) { String weightStr = token.nextToken(); setWeight(weightStr); } } private void sendFakeMessage() throws IOException { String weight = this.getParameter("fakeWeight"); if (weight == null) { weight = "5"; } setWeight(weight); } // calls the setWeight(weight) JavaScript function on the current page private void setWeight(String weight) { JSObject win = JSObject.getWindow(this); String[] args = { weight }; win.call("setWeight", args); } }