Main Page | Packages | Class Hierarchy | Compound List | Compound Members

de.stz.bt.fnd.FND_Parser Class Reference

List of all members.

Public Member Functions

int parsePacket (FND_Datagram fndDatagram, byte[] data) throws Exception

Detailed Description

Parses byte data into FND datagrams. This class parses raw byte data (usually from an UDP-paket) into an FND_Datagram.

Author:
Manuel Kempf

J. Seitter

Philipp Haeuser

Version:
Id
FND_Parser.java,v 1.5 2004/11/12 09:08:18 jseitter Exp


Member Function Documentation

int de.stz.bt.fnd.FND_Parser.parsePacket FND_Datagram  fndDatagram,
byte[]  data
throws Exception
 

Parse the raw data into the supplied FND_Datagram.

Parameters:
fndDatagram The FND_Datagram to be filled with the parsed data.
data The raw data to be parsed
Returns:
0 if everything is fine, -1 if the raw data misses the FNd_Datagram specific byte at the beginning of the data.

00047                                                                                 {
00048 
00049     // Check if first incoming byte is 0xF0 (FND-Datagram signature)
00050 
00051 
00052       if (data[0] == (byte) 0xF0) {
00053         logger.debug("UDP Size:           "+data.length);
00054         logger.debug("Datagram type:      FND 1.0");
00055         logger.debug("Datagram size:      " + data[1]);
00056         logger.debug("Datapoint type:      " + ((byte) data[26] >>> 4));
00057         logger.debug("Transport Control:  " + Integer.toHexString((int)data[2]));
00058         logger.debug("Segment Nr:         " + data[3]);
00059         logger.debug("Invoke  ID:         " + data[4]);
00060         logger.debug(
00061           "Central Control:    " + data[5] + ":" + data[6]);
00062         logger.debug(
00063           "Island Control:     " + data[7] + ":" + data[8]);
00064         
00065         String dp_id = null;
00066         byte string[] = new byte[16];
00067         for (int i = 0; i < 16; i++) {
00068           string[i] = data[i + 9];   
00069         }
00070         dp_id = new String(string); // data[9 to 24]
00071         
00072         logger.debug("Datapoint ID:       " + dp_id);
00073         logger.debug("Operation Code:     " + Integer.toHexString((int)data[25])+":"+Integer.toHexString((int)data[26]));
00074         logger.debug("Application Control:" + Integer.toHexString((int)data[27]));
00075         logger.debug("Mask:               " + Integer.toHexString((int)data[28]));
00076         logger.debug("Info_Event:         " + Integer.toHexString((int)data[29]));
00077         logger.debug("Info_Code:          " + Integer.toBinaryString(data[30])+":"+Integer.toBinaryString(data[31]));
00078         logger.debug("Timestamp           " + data[34]+"."+data[33]+"."+(data[32]+2000)+" "+ data[35]+":"+data[36]+":"+data[37]);
00079         logger.debug("Data 1:             " + data[38]);
00080         logger.debug("Data 2:             " + data[39]);
00081   
00082       }
00083     
00084 
00085     if (data[0] != (byte) 0xF0) {
00086       return -1;
00087     }
00088 
00089     try {
00090       fndDatagram.setLen(data[1]); // set length of datagram
00091 
00092       // transportControl tag extraction example:
00093       // transportControl 1011 0110
00094       // 1011 0110 & 0x30   =>   0011 0000
00095       // 0011 0000 >>> 4    =>   0000 0011   -> tag = 3
00096       byte transportControl = data[2];
00097       byte d_r = (byte) (transportControl >>> 6);
00098       // extract d_r - unsigned right shift
00099       byte tag = (byte) ((transportControl & (byte) 0x30) >>> 4);
00100       // extract tag
00101       byte mpr = (byte) ((transportControl & (byte) 0x0C) >>> 2);
00102       // extract mpr
00103       byte seg = (byte) (transportControl & (byte) 0x03); // extract seg
00104       fndDatagram.setTransportControl(d_r, tag, mpr, seg);
00105       fndDatagram.setSegmentNr(data[3]);
00106       fndDatagram.setInvokeID(data[4]);
00107       fndDatagram.setCentralControl(data[5], data[6]);
00108       fndDatagram.setIslandControl(data[7], data[8]);
00109 
00110       byte[] dataPointID = new byte[16];
00111       for (int i = 0; i < dataPointID.length; i++) {
00112         dataPointID[i] = data[i + 9]; // data[9 to 24]
00113       }
00114       fndDatagram.setDataPointID(dataPointID);
00115 
00116       byte operationCode = data[25];
00117       byte fct_id = (byte) (operationCode >>> 4); // unsigned right shift
00118       byte tab_id = (byte) (operationCode & (byte) 0x0F);
00119       operationCode = data[26];
00120       byte dp_type = (byte) (operationCode >>> 4);
00121       byte dp_subtype = (byte) (operationCode & (byte) 0x0F);
00122       fndDatagram.setOperationsCode(fct_id, tab_id, dp_type, dp_subtype);
00123 
00124       byte applicationControl = data[27];
00125       byte prd = (byte) ((applicationControl & (byte) 0xC0) >>> 6);
00126       // binary: 1100 0000
00127       byte rpr = (byte) ((applicationControl & (byte) 0x30) >>> 4);
00128       // binary: 0011 0000
00129       byte emq = (byte) (applicationControl & (byte) 0x0F);
00130       // binary: 0000 1111
00131       fndDatagram.setApplicationControl(prd, rpr, emq);
00132 
00133       byte mask = data[28];
00134       byte val = (byte) ((mask & (byte) 0xC0) >>> 6);
00135       byte apr = (byte) ((mask & (byte) 0x30) >>> 4);
00136       byte mis = (byte) ((mask & (byte) 0x0C) >>> 2);
00137       byte msk = (byte) (mask & (byte) 0x03);
00138       fndDatagram.setMask(val, apr, mis, msk);
00139 
00140       byte infoEvent = data[29];
00141       byte info = (byte) ((infoEvent & (byte) 0xF0) >>> 4);
00142       byte event = (byte) (infoEvent & (byte) 0x0F);
00143       fndDatagram.setInfoEvent(info, event);
00144 
00145       fndDatagram.setInfoCode(data[30], data[31]);
00146 
00147       fndDatagram.setDateTime(
00148         data[32],
00149         data[33],
00150         data[34],
00151         data[35],
00152         data[36],
00153         data[37]);
00154 
00155       // set data part
00156       byte[] dataPart = new byte[data.length - 38];
00157       System.arraycopy(data, 38, dataPart, 0, data.length - 38);
00158       // (Object src, int srcPos, Object dest, int destPos, int length)
00159       fndDatagram.setDataPart(dataPart);
00160     } catch (Exception ex) {
00161       logger.error(
00162         "Error while parsing incoming UDP packet on port \n"
00163           + ex.getMessage());
00164       // TODO handle error
00165       throw ex;
00166     }
00167     return 0;
00168   }


The documentation for this class was generated from the following file:
Generated on Mon Nov 15 08:36:10 2004 for FND4J by doxygen 1.3.3