/* 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.message; import dk.dma.ais.binary.BinArray; import dk.dma.ais.binary.SixbitEncoder; import dk.dma.ais.binary.SixbitException; import dk.dma.ais.sentence.Vdm; import dk.dma.enav.model.geometry.Position; /** * AIS message 21 * * Aids-to-navigation report (AtoN) as defined by ITU-R M.1371-4 * */ public class AisMessage21 extends AisMessage implements IPositionMessage, IDimensionMessage, INameMessage { /** serialVersionUID. */ private static final long serialVersionUID = 1L; int atonType; // 5 bits : Type of AtoN String name; // 120 bits : Name of AtoN in ASCII int posAcc; // 1 bit : AisPosition Accuracy AisPosition pos; // : Lat/Long 1/100000 minute int dimBow; // 9 bits : GPS Ant. Distance from Bow int dimStern; // 9 bits : GPS Ant. Distance from Stern int dimPort; // 6 bits : GPS Ant. Distance from Port int dimStarboard; // 6 bits : GPS Ant. Distance from Starboard int posType; // 4 bits : Type of AisPosition Fixing Device int utcSec; // 6 bits : UTC Seconds int offPosition; // 1 bit : Off AisPosition Flag int regional; // 8 bits : Regional Bits int raim; // 1 bit : RAIM Flag int virtual; // 1 bit : Virtual/Pseudo AtoN Flag int assigned; // 1 bit : Assigned Mode Flag int spare1; // 1 bit : Spare String nameExt; // 0-84 bits : Extended name in ASCII int spare2; // 0-6 bits : Spare public AisMessage21() { super(21); } public AisMessage21(Vdm vdm) throws AisMessageException, SixbitException { super(vdm); parse(); } public void parse() throws AisMessageException, SixbitException { BinArray binArray = vdm.getBinArray(); if (binArray.getLength() < 272 || binArray.getLength() > 360) { throw new AisMessageException("Message 21 wrong length " + binArray.getLength()); } super.parse(binArray); this.atonType = (int) binArray.getVal(5); this.name = binArray.getString(20); this.posAcc = (int) binArray.getVal(1); this.pos = new AisPosition(); this.pos.setRawLongitude(binArray.getVal(28)); this.pos.setRawLatitude(binArray.getVal(27)); this.dimBow = (int) binArray.getVal(9); this.dimStern = (int) binArray.getVal(9); this.dimPort = (int) binArray.getVal(6); this.dimStarboard = (int) binArray.getVal(6); this.posType = (int) binArray.getVal(4); this.utcSec = (int) binArray.getVal(6); this.offPosition = (int) binArray.getVal(1); this.regional = (int) binArray.getVal(8); this.raim = (int) binArray.getVal(1); this.virtual = (int) binArray.getVal(1); this.assigned = (int) binArray.getVal(1); this.spare1 = (int) binArray.getVal(1); if (binArray.getLength() > 272) { this.nameExt = binArray.getString((binArray.getLength() - 272) / 6); } } @Override public SixbitEncoder getEncoded() { throw new UnsupportedOperationException(); } public int getAtonType() { return atonType; } public void setAtonType(int atonType) { this.atonType = atonType; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPosAcc() { return posAcc; } public void setPosAcc(int posAcc) { this.posAcc = posAcc; } @Override public Position getValidPosition() { AisPosition pos = this.pos; return pos == null ? null : pos.getGeoLocation(); } public AisPosition getPos() { return pos; } public void setPos(AisPosition pos) { this.pos = pos; } public int getDimBow() { return dimBow; } public void setDimBow(int dimBow) { this.dimBow = dimBow; } public int getDimStern() { return dimStern; } public void setDimStern(int dimStern) { this.dimStern = dimStern; } public int getDimPort() { return dimPort; } public void setDimPort(int dimPort) { this.dimPort = dimPort; } public int getDimStarboard() { return dimStarboard; } public void setDimStarboard(int dimStarboard) { this.dimStarboard = dimStarboard; } public int getPosType() { return posType; } public void setPosType(int posType) { this.posType = posType; } public int getUtcSec() { return utcSec; } public void setUtcSec(int utcSec) { this.utcSec = utcSec; } public int getOffPosition() { return offPosition; } public void setOffPosition(int offPosition) { this.offPosition = offPosition; } public int getRegional() { return regional; } public void setRegional(int regional) { this.regional = regional; } public int getRaim() { return raim; } public void setRaim(int raim) { this.raim = raim; } public int getVirtual() { return virtual; } public void setVirtual(int virtual) { this.virtual = virtual; } public int getAssigned() { return assigned; } public void setAssigned(int assigned) { this.assigned = assigned; } public int getSpare1() { return spare1; } public void setSpare1(int spare1) { this.spare1 = spare1; } public String getNameExt() { return nameExt; } public void setNameExt(String nameExt) { this.nameExt = nameExt; } public int getSpare2() { return spare2; } public void setSpare2(int spare2) { this.spare2 = spare2; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append(super.toString()); builder.append(", assigned="); builder.append(assigned); builder.append(", atonType="); builder.append(atonType); builder.append(", dimBow="); builder.append(dimBow); builder.append(", dimPort="); builder.append(dimPort); builder.append(", dimStarboard="); builder.append(dimStarboard); builder.append(", dimStern="); builder.append(dimStern); builder.append(", name="); builder.append(name); builder.append(", nameExt="); builder.append(nameExt); builder.append(", offPosition="); builder.append(offPosition); builder.append(", pos="); builder.append(pos); builder.append(", posAcc="); builder.append(posAcc); builder.append(", posType="); builder.append(posType); builder.append(", raim="); builder.append(raim); builder.append(", regional="); builder.append(regional); builder.append(", spare1="); builder.append(spare1); builder.append(", spare2="); builder.append(spare2); builder.append(", utcSec="); builder.append(utcSec); builder.append(", virtual="); builder.append(virtual); builder.append("]"); return builder.toString(); } }