package uk.co.mmscomputing.device.capi; import uk.co.mmscomputing.device.capi.ctrl.*; import uk.co.mmscomputing.device.capi.plc.*; import uk.co.mmscomputing.device.capi.ncc.*; import uk.co.mmscomputing.device.capi.facility.*; import uk.co.mmscomputing.device.capi.man.*; // manufacturer specific features public class MsgIn implements CapiConstants{ public int len; public int appid; public int cmd; public int scmd; public int msgno; public int lineid; public MsgIn(Rider r){ r.reset(); len =r.readWord(); // 0: len message appid =r.readWord(); // 2: application id cmd =r.read(); // 4: command scmd =r.read(); // 5: sub command (conf/ind) msgno =r.readWord(); // 6: message number lineid =r.readDWord(); // 8: ncci(2),pcli(1),ctrl(1) } // 12: public String toString(){ String s=getClass().getName()+"\n"; s+="length = "+len+"\n"; s+="appid = "+appid+"\n"; s+="cmd = 0x"+Integer.toHexString(cmd)+"\n"; s+="scmd = 0x"+Integer.toHexString(scmd)+"\n"; s+="msgno = "+msgno+"\n"; s+="lineid = 0x"+Integer.toHexString(lineid)+"\n"; return s; } static String[] hexs={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}; static public String toString(byte[] data){ int v; String s="\n"; int i=0; while(i<data.length){ s+=" "; s+=hexs[(data[i]>>4)&0x0F]; s+=hexs[(data[i] )&0x0F]; if(((i+1)%8)==0){s+="\n";} i++; } if(((i+1)%8)!=0){s+="\n";} return s; } static public MsgIn createConf(Rider r,int cmd){ switch(cmd){ case CAPI_CONNECT: return new ConnectConf(r); case CAPI_CONNECT_B3: return new ConnectB3Conf(r); case CAPI_DISCONNECT_B3: return new DisconnectB3Conf(r); case CAPI_DISCONNECT: return new DisconnectConf(r); case CAPI_DATA_B3: return new DataB3Conf(r); case CAPI_LISTEN: return new ListenConf(r); case CAPI_ALERT: return new AlertConf(r); case CAPI_INFO: return new InfoConf(r); case CAPI_FACILITY: return FacilityConf.create(r); case CAPI_RESET_B3: return new ResetB3Conf(r); case CAPI_SELECT_B_PROTOCOL: return new SelectBProtocolConf(r); case CAPI_MANUFACTURER: return ManufacturerConf.create(r); } System.out.println("3\bMsgIn.createConf:\n\tUnknown CONF command in CAPI confirmation ["+Integer.toHexString(cmd)+"]"); return new CapiConfMsg(r); } static public MsgIn createInd(Rider r,int cmd){ switch(cmd){ case CAPI_CONNECT_ACTIVE: return new ConnectActiveInd(r); case CAPI_CONNECT_B3_ACTIVE: return new ConnectB3ActiveInd(r); case CAPI_CONNECT_B3_T90_ACTIVE: return new ConnectB3T90ActiveInd(r); case CAPI_DISCONNECT: return new DisconnectInd(r); case CAPI_DISCONNECT_B3: return new DisconnectB3Ind(r); case CAPI_CONNECT: return new ConnectInd(r); case CAPI_DATA_B3: return new DataB3Ind(r); case CAPI_CONNECT_B3: return new ConnectB3Ind(r); case CAPI_INFO: return new InfoInd(r); case CAPI_FACILITY: return FacilityInd.create(r); case CAPI_RESET_B3: return new ResetB3Ind(r); case CAPI_MANUFACTURER: return ManufacturerInd.create(r); } System.out.println("bMsgIn.createInd:\n\tUnknown IND command in CAPI indication ["+Integer.toHexString(cmd)+"]"); throw new IllegalArgumentException(); } static public MsgIn create(Rider r){ r.skip(4); int cmd =r.read(); int scmd=r.read(); r.skip(6); try{ switch(scmd){ // sub command case CAPI_CONF: return createConf(r,cmd); case CAPI_IND: return createInd(r,cmd); } System.out.println("3\bMsgIn.create : Unknown sub command ["+Integer.toHexString(scmd)+"]"); }catch(IndexOutOfBoundsException ioobe){ ioobe.printStackTrace(); } return new MsgIn(r); } static public MsgIn create(byte[] data){ return create(new Rider(data,0,(data[0]&0x00FF)|((data[0]&0x00FF)<<8))); } }