VisClient/org/hfbk/vis/RS232Listener.java

Go to the documentation of this file.
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"); //name this thread
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                                 //out.println("/000");
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 

Generated on Tue Apr 7 17:57:20 2009 for visclient by  doxygen 1.5.1