00001 package org.hfbk.vis;
00002
00003
00004 import java.io.FileNotFoundException;
00005 import java.io.IOException;
00006 import java.io.RandomAccessFile;
00007 import java.util.LinkedList;
00008 import java.util.List;
00009
00022 public class RS232Listener extends Thread {
00023
00024 public static RS232Listener instance=new RS232Listener();
00025
00026 RandomAccessFile com;
00027
00028 public static interface Handler{
00029 void handleRS232(RS232Listener listener, String msg);
00030 }
00031
00032 List<Handler> handlers=new LinkedList<Handler>();
00033
00034 RS232Listener() {
00035 super("RS232Listener");
00036 setDaemon(true);
00037
00038 try {
00039 com=new RandomAccessFile("COM1:38400,N,8,1","rw");
00040 } catch (FileNotFoundException e) {
00041 throw new RuntimeException(e);
00042 }
00043 start();
00044 }
00045
00046 public void run() {
00047 print("/");
00048 try{
00049 do{
00050 String msg = com.readLine();
00051 System.out.print("RS232 in:"+msg);
00052
00053 if (check (msg)){
00054 System.out.println(" OK.");
00055
00056 String[] parts=msg.split("/");
00057 msg=parts[0];
00058 for (Handler h: handlers)
00059 h.handleRS232(this, msg);
00060
00061 }else
00062 System.out.println();
00063 }while(true);
00064 } catch (IOException e) {
00065 e.printStackTrace();
00066 }
00067 }
00068
00069
00070
00071 static int checksum(String msg){
00072 int sum=0;
00073 byte[] b=msg.getBytes();
00074 for (int i=0; i<msg.length(); i++)
00075 sum+=b[i];
00076 return (sum & 0xFF);
00077
00078 }
00079 static boolean check(String msg){
00080 String[] parts=msg.split("/");
00081 if (parts.length<2) return false;
00082 parts[0]+="/";
00083 int sum=checksum(parts[0]);
00084 return (sum==Integer.parseInt(parts[1]));
00085 }
00086
00087 static String addChecksum(String s){
00088 int cs=checksum(s);
00089 return String.format(s+"%03d", cs);
00090 }
00091
00096 public void print(String msg){
00097 try {
00098 com.writeChars(addChecksum(msg));
00099 } catch (IOException e) {
00100 e.printStackTrace();
00101 }
00102
00103 System.out.println("RS232out:"+addChecksum(msg));
00104 }
00105
00106 public static void main(String[] args) {
00107 RS232Listener.instance.run();
00108 }
00109
00110 public void addHandler(Handler h) {
00111 handlers.add(h);
00112 }
00113 }
00114
00115
00116
00117