GnssNavigationMessage.java revision 0f1ab04516d3e9a72eda22c998910f49f2bd40bb
14b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa/*
24b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * Copyright (C) 2014 The Android Open Source Project
34b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa *
44b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * Licensed under the Apache License, Version 2.0 (the "License");
54b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * you may not use this file except in compliance with the License.
64b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * You may obtain a copy of the License at
74b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa *
84b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa *      http://www.apache.org/licenses/LICENSE-2.0
94b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa *
104b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * Unless required by applicable law or agreed to in writing, software
114b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * distributed under the License is distributed on an "AS IS" BASIS,
124b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * See the License for the specific language governing permissions and
144b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * limitations under the License
154b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa */
164b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
174b3e3931270f8e406fc806bc7fa1c2788256687ddestradaapackage android.location;
184b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
190f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tangimport android.annotation.TestApi;
20a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tangimport android.annotation.IntDef;
214b3e3931270f8e406fc806bc7fa1c2788256687ddestradaaimport android.annotation.NonNull;
224b3e3931270f8e406fc806bc7fa1c2788256687ddestradaaimport android.os.Parcel;
234b3e3931270f8e406fc806bc7fa1c2788256687ddestradaaimport android.os.Parcelable;
244b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
25a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tangimport java.lang.annotation.Retention;
26a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tangimport java.lang.annotation.RetentionPolicy;
274b3e3931270f8e406fc806bc7fa1c2788256687ddestradaaimport java.security.InvalidParameterException;
284b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
294b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa/**
30120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang * A class containing a GNSS satellite Navigation Message.
314b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa */
32818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tangpublic final class GnssNavigationMessage implements Parcelable {
33c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa
344b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    private static final byte[] EMPTY_ARRAY = new byte[0];
354b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
36a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tang    /** The type of the GPS Clock. */
37a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tang    @Retention(RetentionPolicy.SOURCE)
3876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    @IntDef({TYPE_UNKNOWN, TYPE_GPS_L1CA, TYPE_GPS_L2CNAV, TYPE_GPS_L5CNAV, TYPE_GPS_CNAV2,
3976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        TYPE_GLO_L1CA, TYPE_BDS_D1, TYPE_BDS_D2, TYPE_GAL_I, TYPE_GAL_F})
40818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang    public @interface GnssNavigationMessageType {}
41a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tang
424b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    // The following enumerations must be in sync with the values declared in gps.h
434b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
449363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /** Message type unknown */
4576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int TYPE_UNKNOWN = 0;
469363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /** GPS L1 C/A message contained in the structure.  */
4776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int TYPE_GPS_L1CA = 0x0101;
489363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /** GPS L2-CNAV message contained in the structure. */
4976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int TYPE_GPS_L2CNAV = 0x0102;
509363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /** GPS L5-CNAV message contained in the structure. */
5176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int TYPE_GPS_L5CNAV = 0x0103;
529363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /** GPS CNAV-2 message contained in the structure. */
5376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int TYPE_GPS_CNAV2 = 0x0104;
549363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /** Glonass L1 CA message contained in the structure. */
5576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int TYPE_GLO_L1CA = 0x0301;
569363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /** Beidou D1 message contained in the structure. */
5776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int TYPE_BDS_D1 = 0x0501;
589363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /** Beidou D2 message contained in the structure. */
5976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int TYPE_BDS_D2 = 0x0502;
609363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /** Galileo I/NAV message contained in the structure. */
6176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int TYPE_GAL_I = 0x0601;
629363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /** Galileo F/NAV message contained in the structure. */
6376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int TYPE_GAL_F = 0x0602;
644b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
655e72118f193258259912c0a51688bd4434c8896edestradaa    /**
665e72118f193258259912c0a51688bd4434c8896edestradaa     * The Navigation Message Status is 'unknown'.
675e72118f193258259912c0a51688bd4434c8896edestradaa     */
6876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int STATUS_UNKNOWN = 0;
695e72118f193258259912c0a51688bd4434c8896edestradaa
705e72118f193258259912c0a51688bd4434c8896edestradaa    /**
715e72118f193258259912c0a51688bd4434c8896edestradaa     * The Navigation Message was received without any parity error in its navigation words.
725e72118f193258259912c0a51688bd4434c8896edestradaa     */
7376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int STATUS_PARITY_PASSED = (1<<0);
745e72118f193258259912c0a51688bd4434c8896edestradaa
755e72118f193258259912c0a51688bd4434c8896edestradaa    /**
765e72118f193258259912c0a51688bd4434c8896edestradaa     * The Navigation Message was received with words that failed parity check, but the receiver was
775e72118f193258259912c0a51688bd4434c8896edestradaa     * able to correct those words.
785e72118f193258259912c0a51688bd4434c8896edestradaa     */
7976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int STATUS_PARITY_REBUILT = (1<<1);
805e72118f193258259912c0a51688bd4434c8896edestradaa
814b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    // End enumerations in sync with gps.h
824b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
8376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private int mType;
8476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private int mSvid;
8576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private int mMessageId;
8676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private int mSubmessageId;
874b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    private byte[] mData;
8876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private int mStatus;
894b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
900f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    /**
910f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
920f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     */
930f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
940f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    public GnssNavigationMessage() {
954b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        initialize();
964b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
974b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
984b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
994b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Sets all contents to the values stored in the provided object.
1000f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
1014b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
1020f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
103818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang    public void set(GnssNavigationMessage navigationMessage) {
1044b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        mType = navigationMessage.mType;
105120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        mSvid = navigationMessage.mSvid;
1064b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        mMessageId = navigationMessage.mMessageId;
1074b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        mSubmessageId = navigationMessage.mSubmessageId;
1084b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        mData = navigationMessage.mData;
1095e72118f193258259912c0a51688bd4434c8896edestradaa        mStatus = navigationMessage.mStatus;
1104b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
1114b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
1124b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
1134b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Resets all the contents to its original state.
1140f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
1154b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
1160f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
1174b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    public void reset() {
1184b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        initialize();
1194b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
1204b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
1214b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
1224b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Gets the type of the navigation message contained in the object.
1234b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
124818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang    @GnssNavigationMessageType
12576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getType() {
1264b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        return mType;
1274b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
1284b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
1294b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
1304b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Sets the type of the navigation message.
1310f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
1324b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
1330f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
13476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setType(@GnssNavigationMessageType int value) {
135c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        mType = value;
1364b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
1374b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
1384b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
1394b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Gets a string representation of the 'type'.
1404b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * For internal and logging use only.
1414b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
1424b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    private String getTypeString() {
1434b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        switch (mType) {
14476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            case TYPE_UNKNOWN:
1454b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa                return "Unknown";
14676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            case TYPE_GPS_L1CA:
1479363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang                return "GPS L1 C/A";
14876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            case TYPE_GPS_L2CNAV:
1499363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang                return "GPS L2-CNAV";
15076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            case TYPE_GPS_L5CNAV:
1519363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang                return "GPS L5-CNAV";
15276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            case TYPE_GPS_CNAV2:
1539363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang                return "GPS CNAV2";
15476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            case TYPE_GLO_L1CA:
1559363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang                return "Glonass L1 C/A";
15676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            case TYPE_BDS_D1:
1579363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang                return "Beidou D1";
15876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            case TYPE_BDS_D2:
1599363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang                return "Beidou D2";
16076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            case TYPE_GAL_I:
1619363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang                return "Galileo I";
16276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            case TYPE_GAL_F:
1639363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang                return "Galileo F";
1644b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa            default:
165c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa                return "<Invalid:" + mType + ">";
1664b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        }
1674b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
1684b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
1694b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
1704b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Gets the Pseudo-random number.
1714b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Range: [1, 32].
1724b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
17376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getSvid() {
174120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        return mSvid;
1754b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
1764b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
1774b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
1784b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Sets the Pseud-random number.
1790f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
1804b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
1810f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
18276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setSvid(int value) {
183120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        mSvid = value;
1844b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
1854b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
1864b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
1874b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Gets the Message Identifier.
1884b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * It provides an index so the complete Navigation Message can be assembled. i.e. for L1 C/A
1894b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * subframe 4 and 5, this value corresponds to the 'frame id' of the navigation message.
1904b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Subframe 1, 2, 3 does not contain a 'frame id' and this might be reported as -1.
1914b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
19276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getMessageId() {
1934b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        return mMessageId;
1944b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
1954b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
1964b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
1974b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Sets the Message Identifier.
1980f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
1994b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
2000f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
20176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setMessageId(int value) {
2024b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        mMessageId = value;
2034b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
2044b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
2054b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
2064b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Gets the Sub-message Identifier.
2074b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * If required by {@link #getType()}, this value contains a sub-index within the current message
2084b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * (or frame) that is being transmitted. i.e. for L1 C/A the sub-message identifier corresponds
2094b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * to the sub-frame Id of the navigation message.
2104b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
21176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getSubmessageId() {
2124b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        return mSubmessageId;
2134b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
2144b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
2154b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
2164b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Sets the Sub-message identifier.
2170f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
2184b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
2190f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
22076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setSubmessageId(int value) {
2214b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        mSubmessageId = value;
2224b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
2234b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
2244b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
2254b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Gets the data associated with the Navigation Message.
2264b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * The bytes (or words) specified using big endian format (MSB first).
2274b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
2284b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    @NonNull
2294b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    public byte[] getData() {
2304b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        return mData;
2314b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
2324b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
2334b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
2344b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Sets the data associated with the Navigation Message.
2350f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
2364b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
2370f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
2384b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    public void setData(byte[] value) {
2394b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        if (value == null) {
2404b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa            throw new InvalidParameterException("Data must be a non-null array");
2414b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        }
2424b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
2434b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        mData = value;
2444b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
2454b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
2465e72118f193258259912c0a51688bd4434c8896edestradaa    /**
2475e72118f193258259912c0a51688bd4434c8896edestradaa     * Gets the Status of the navigation message contained in the object.
2485e72118f193258259912c0a51688bd4434c8896edestradaa     */
24976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getStatus() {
2505e72118f193258259912c0a51688bd4434c8896edestradaa        return mStatus;
2515e72118f193258259912c0a51688bd4434c8896edestradaa    }
2525e72118f193258259912c0a51688bd4434c8896edestradaa
2535e72118f193258259912c0a51688bd4434c8896edestradaa    /**
2545e72118f193258259912c0a51688bd4434c8896edestradaa     * Sets the status of the navigation message.
2550f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
2565e72118f193258259912c0a51688bd4434c8896edestradaa     */
2570f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
25876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setStatus(int value) {
2595e72118f193258259912c0a51688bd4434c8896edestradaa        mStatus = value;
2605e72118f193258259912c0a51688bd4434c8896edestradaa    }
2615e72118f193258259912c0a51688bd4434c8896edestradaa
2625e72118f193258259912c0a51688bd4434c8896edestradaa    /**
2635e72118f193258259912c0a51688bd4434c8896edestradaa     * Gets a string representation of the 'status'.
2645e72118f193258259912c0a51688bd4434c8896edestradaa     * For internal and logging use only.
2655e72118f193258259912c0a51688bd4434c8896edestradaa     */
2665e72118f193258259912c0a51688bd4434c8896edestradaa    private String getStatusString() {
2675e72118f193258259912c0a51688bd4434c8896edestradaa        switch (mStatus) {
2685e72118f193258259912c0a51688bd4434c8896edestradaa            case STATUS_UNKNOWN:
2695e72118f193258259912c0a51688bd4434c8896edestradaa                return "Unknown";
2705e72118f193258259912c0a51688bd4434c8896edestradaa            case STATUS_PARITY_PASSED:
2715e72118f193258259912c0a51688bd4434c8896edestradaa                return "ParityPassed";
2725e72118f193258259912c0a51688bd4434c8896edestradaa            case STATUS_PARITY_REBUILT:
2735e72118f193258259912c0a51688bd4434c8896edestradaa                return "ParityRebuilt";
2745e72118f193258259912c0a51688bd4434c8896edestradaa            default:
2755e72118f193258259912c0a51688bd4434c8896edestradaa                return "<Invalid:" + mStatus + ">";
2765e72118f193258259912c0a51688bd4434c8896edestradaa        }
2775e72118f193258259912c0a51688bd4434c8896edestradaa    }
2785e72118f193258259912c0a51688bd4434c8896edestradaa
279818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang    public static final Creator<GnssNavigationMessage> CREATOR =
280818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            new Creator<GnssNavigationMessage>() {
2814b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        @Override
282818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang        public GnssNavigationMessage createFromParcel(Parcel parcel) {
283818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            GnssNavigationMessage navigationMessage = new GnssNavigationMessage();
2844b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
28576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            navigationMessage.setType(parcel.readInt());
28676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            navigationMessage.setSvid(parcel.readInt());
28776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            navigationMessage.setMessageId(parcel.readInt());
28876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            navigationMessage.setSubmessageId(parcel.readInt());
2894b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
2904b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa            int dataLength = parcel.readInt();
2914b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa            byte[] data = new byte[dataLength];
2924b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa            parcel.readByteArray(data);
2934b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa            navigationMessage.setData(data);
2944b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
2955e72118f193258259912c0a51688bd4434c8896edestradaa            if (parcel.dataAvail() >= Integer.SIZE) {
2965e72118f193258259912c0a51688bd4434c8896edestradaa                int status = parcel.readInt();
29776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                navigationMessage.setStatus(status);
2985e72118f193258259912c0a51688bd4434c8896edestradaa            } else {
2995e72118f193258259912c0a51688bd4434c8896edestradaa                navigationMessage.setStatus(STATUS_UNKNOWN);
3005e72118f193258259912c0a51688bd4434c8896edestradaa            }
3015e72118f193258259912c0a51688bd4434c8896edestradaa
3024b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa            return navigationMessage;
3034b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        }
3044b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
3054b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        @Override
306818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang        public GnssNavigationMessage[] newArray(int size) {
307818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            return new GnssNavigationMessage[size];
3084b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        }
3094b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    };
3104b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
311120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang    @Override
3124b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    public void writeToParcel(Parcel parcel, int flags) {
3139363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang        parcel.writeInt(mType);
314120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        parcel.writeInt(mSvid);
3154b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        parcel.writeInt(mMessageId);
3164b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        parcel.writeInt(mSubmessageId);
3174b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        parcel.writeInt(mData.length);
3184b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        parcel.writeByteArray(mData);
3195e72118f193258259912c0a51688bd4434c8896edestradaa        parcel.writeInt(mStatus);
3204b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
3214b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
3224b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    @Override
3234b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    public int describeContents() {
3244b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        return 0;
3254b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
3264b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
3274b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    @Override
3284b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    public String toString() {
3294b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        final String format = "   %-15s = %s\n";
330818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang        StringBuilder builder = new StringBuilder("GnssNavigationMessage:\n");
3314b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
3324b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        builder.append(String.format(format, "Type", getTypeString()));
333120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        builder.append(String.format(format, "Svid", mSvid));
3345e72118f193258259912c0a51688bd4434c8896edestradaa        builder.append(String.format(format, "Status", getStatusString()));
3354b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        builder.append(String.format(format, "MessageId", mMessageId));
3364b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        builder.append(String.format(format, "SubmessageId", mSubmessageId));
3374b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
3384b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        builder.append(String.format(format, "Data", "{"));
3394b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        String prefix = "        ";
3404b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        for(byte value : mData) {
3414b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa            builder.append(prefix);
3424b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa            builder.append(value);
3434b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa            prefix = ", ";
3444b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        }
3454b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        builder.append(" }");
3464b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
3474b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        return builder.toString();
3484b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
3494b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
3504b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    private void initialize() {
35176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mType = TYPE_UNKNOWN;
352120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        mSvid = 0;
3534b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        mMessageId = -1;
3544b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        mSubmessageId = -1;
3554b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        mData = EMPTY_ARRAY;
3565e72118f193258259912c0a51688bd4434c8896edestradaa        mStatus = STATUS_UNKNOWN;
3574b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
3584b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa}
359