/* Copyright (c) 2011 Danish Maritime Authority. * * Licensed 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. */ package dk.dma.ais.sentence; import dk.dma.ais.binary.SixbitException; import dk.dma.ais.message.AisMessage; import dk.dma.ais.message.AisMessage14; import dk.dma.ais.message.AisMessage8; /** * Broadcast Binary and safety related Message as defined by IEC 61162 Sentence to encapsulate AIS message 8 and 14 for * sending */ public class Bbm extends SendSentence { public Bbm() { formatter = "BBM"; channel = '0'; } public static boolean isBbm(String line) { return line.indexOf("!AIBBM") >= 0 || line.indexOf("!BSBBM") >= 0; } /** * Get encoded sentence */ @Override public String getEncoded() { super.encode(); return finalEncode(); } public int parse(String line) throws SentenceException, SixbitException { return parse(new SentenceLine(line)); } /** * Implemented parse method. See {@link EncapsulatedSentence} * @throws SixbitException */ @Override public int parse(SentenceLine sl) throws SentenceException, SixbitException { // Do common parsing super.baseParse(sl); // Check VDM / VDO if (!this.formatter.equals("BBM")) { throw new SentenceException("Not BBM sentence"); } // Check that there at least 8 fields if (sl.getFields().size() < 9) { throw new SentenceException("Sentence does not have at least 8 fields"); } // Message id this.msgId = Integer.parseInt(sl.getFields().get(5)); // Padding bits int padBits = Sentence.parseInt(sl.getFields().get(7)); // Six bit field this.sixbitString.append(sl.getFields().get(6)); binArray.appendSixbit(sl.getFields().get(6), padBits); if (completePacket) { return 0; } return 1; } public AisMessage getAisMessage(int mmsi, int repeat) throws SentenceException, SixbitException { AisMessage aisMessage; if (msgId == 14) { AisMessage14 msg14 = new AisMessage14(); msg14.setUserId(mmsi); msg14.setRepeat(repeat); msg14.setMessage(binArray); aisMessage = msg14; } else if (msgId == 8) { AisMessage8 msg8 = new AisMessage8(); msg8.setRepeat(repeat); msg8.setUserId(mmsi); msg8.setBinary(binArray); aisMessage = msg8; } else { throw new SentenceException("BBM can only contain AIS message 8 or 14"); } return aisMessage; } /** * Make a single VDM from this BBM * * @param mmsi * @param repeat * @return * @throws SixbitException * @throws SentenceException */ public Vdm makeVdm(int mmsi, int repeat) throws SixbitException, SentenceException { AisMessage aisMessage = getAisMessage(mmsi, repeat); Vdm vdm = new Vdm(); vdm.setMsgId(getMsgId()); vdm.setMessageData(aisMessage); vdm.setSequence(getSequence()); vdm.setChannel(getChannel()); return vdm; } }