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
362b67c07d82f59f9b776414576c21dd31ed9dac48Julius D'souza    /**
37e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * The type of the GNSS Navigation Message
382b67c07d82f59f9b776414576c21dd31ed9dac48Julius D'souza     * @hide
392b67c07d82f59f9b776414576c21dd31ed9dac48Julius D'souza     */
40a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tang    @Retention(RetentionPolicy.SOURCE)
4176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    @IntDef({TYPE_UNKNOWN, TYPE_GPS_L1CA, TYPE_GPS_L2CNAV, TYPE_GPS_L5CNAV, TYPE_GPS_CNAV2,
4276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        TYPE_GLO_L1CA, TYPE_BDS_D1, TYPE_BDS_D2, TYPE_GAL_I, TYPE_GAL_F})
43818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang    public @interface GnssNavigationMessageType {}
44a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tang
454b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    // The following enumerations must be in sync with the values declared in gps.h
464b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
479363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /** Message type unknown */
4876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int TYPE_UNKNOWN = 0;
499363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /** GPS L1 C/A message contained in the structure.  */
5076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int TYPE_GPS_L1CA = 0x0101;
519363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /** GPS L2-CNAV message contained in the structure. */
5276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int TYPE_GPS_L2CNAV = 0x0102;
539363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /** GPS L5-CNAV message contained in the structure. */
5476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int TYPE_GPS_L5CNAV = 0x0103;
559363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /** GPS CNAV-2 message contained in the structure. */
5676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int TYPE_GPS_CNAV2 = 0x0104;
579363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /** Glonass L1 CA message contained in the structure. */
5876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int TYPE_GLO_L1CA = 0x0301;
599363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /** Beidou D1 message contained in the structure. */
6076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int TYPE_BDS_D1 = 0x0501;
619363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /** Beidou D2 message contained in the structure. */
6276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int TYPE_BDS_D2 = 0x0502;
639363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /** Galileo I/NAV message contained in the structure. */
6476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int TYPE_GAL_I = 0x0601;
659363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /** Galileo F/NAV message contained in the structure. */
6676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int TYPE_GAL_F = 0x0602;
674b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
685e72118f193258259912c0a51688bd4434c8896edestradaa    /**
695e72118f193258259912c0a51688bd4434c8896edestradaa     * The Navigation Message Status is 'unknown'.
705e72118f193258259912c0a51688bd4434c8896edestradaa     */
7176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int STATUS_UNKNOWN = 0;
725e72118f193258259912c0a51688bd4434c8896edestradaa
735e72118f193258259912c0a51688bd4434c8896edestradaa    /**
745e72118f193258259912c0a51688bd4434c8896edestradaa     * The Navigation Message was received without any parity error in its navigation words.
755e72118f193258259912c0a51688bd4434c8896edestradaa     */
7676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int STATUS_PARITY_PASSED = (1<<0);
775e72118f193258259912c0a51688bd4434c8896edestradaa
785e72118f193258259912c0a51688bd4434c8896edestradaa    /**
795e72118f193258259912c0a51688bd4434c8896edestradaa     * The Navigation Message was received with words that failed parity check, but the receiver was
805e72118f193258259912c0a51688bd4434c8896edestradaa     * able to correct those words.
815e72118f193258259912c0a51688bd4434c8896edestradaa     */
8276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int STATUS_PARITY_REBUILT = (1<<1);
835e72118f193258259912c0a51688bd4434c8896edestradaa
84e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang    /**
85e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Used for receiving GNSS satellite Navigation Messages from the GNSS engine.
86e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
87e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>You can implement this interface and call
88e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * {@link LocationManager#registerGnssNavigationMessageCallback}.
89e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     */
90e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang    public static abstract class Callback {
91e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang        /**
92cf879db3666523404ff7e15e77b11434732b4a06Wyatt Riley         * The status of GNSS Navigation Message event.
93e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang         * @hide
94e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang         */
95e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang        @Retention(RetentionPolicy.SOURCE)
96e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang        @IntDef({STATUS_NOT_SUPPORTED, STATUS_READY, STATUS_LOCATION_DISABLED})
97e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang        public @interface GnssNavigationMessageStatus {}
98e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang
99e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang        /**
100e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang         * The system does not support tracking of GNSS Navigation Messages.
101e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang         *
102e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang         * This status will not change in the future.
103e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang         */
104e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang        public static final int STATUS_NOT_SUPPORTED = 0;
105e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang
106e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang        /**
107e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang         * GNSS Navigation Messages are successfully being tracked, it will receive updates once
108e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang         * they are available.
109e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang         */
110e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang        public static final int STATUS_READY = 1;
111e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang
112e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang        /**
113e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang         * GNSS provider or Location is disabled, updated will not be received until they are
114e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang         * enabled.
115e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang         */
116e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang        public static final int STATUS_LOCATION_DISABLED = 2;
117e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang
118e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang        /**
119e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang         * Returns the latest collected GNSS Navigation Message.
120e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang         */
121e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang        public void onGnssNavigationMessageReceived(GnssNavigationMessage event) {}
122e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang
123e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang        /**
124e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang         * Returns the latest status of the GNSS Navigation Messages sub-system.
125e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang         */
126e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang        public void onStatusChanged(@GnssNavigationMessageStatus int status) {}
127e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang    }
128e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang
1294b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    // End enumerations in sync with gps.h
1304b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
13176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private int mType;
13276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private int mSvid;
13376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private int mMessageId;
13476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private int mSubmessageId;
1354b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    private byte[] mData;
13676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private int mStatus;
1374b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
1380f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    /**
1390f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
1400f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     */
1410f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
1420f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    public GnssNavigationMessage() {
1434b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        initialize();
1444b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
1454b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
1464b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
1474b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Sets all contents to the values stored in the provided object.
1480f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
1494b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
1500f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
151818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang    public void set(GnssNavigationMessage navigationMessage) {
1524b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        mType = navigationMessage.mType;
153120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        mSvid = navigationMessage.mSvid;
1544b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        mMessageId = navigationMessage.mMessageId;
1554b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        mSubmessageId = navigationMessage.mSubmessageId;
1564b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        mData = navigationMessage.mData;
1575e72118f193258259912c0a51688bd4434c8896edestradaa        mStatus = navigationMessage.mStatus;
1584b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
1594b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
1604b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
1614b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Resets all the contents to its original state.
1620f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
1634b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
1640f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
1654b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    public void reset() {
1664b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        initialize();
1674b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
1684b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
1694b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
1704b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Gets the type of the navigation message contained in the object.
1714b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
172818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang    @GnssNavigationMessageType
17376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getType() {
1744b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        return mType;
1754b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
1764b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
1774b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
1784b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Sets the type of the navigation message.
1790f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
1804b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
1810f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
18276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setType(@GnssNavigationMessageType int value) {
183c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        mType = value;
1844b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
1854b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
1864b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
1874b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Gets a string representation of the 'type'.
1884b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * For internal and logging use only.
1894b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
1904b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    private String getTypeString() {
1914b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        switch (mType) {
19276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            case TYPE_UNKNOWN:
1934b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa                return "Unknown";
19476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            case TYPE_GPS_L1CA:
1959363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang                return "GPS L1 C/A";
19676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            case TYPE_GPS_L2CNAV:
1979363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang                return "GPS L2-CNAV";
19876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            case TYPE_GPS_L5CNAV:
1999363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang                return "GPS L5-CNAV";
20076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            case TYPE_GPS_CNAV2:
2019363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang                return "GPS CNAV2";
20276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            case TYPE_GLO_L1CA:
2039363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang                return "Glonass L1 C/A";
20476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            case TYPE_BDS_D1:
2059363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang                return "Beidou D1";
20676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            case TYPE_BDS_D2:
2079363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang                return "Beidou D2";
20876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            case TYPE_GAL_I:
2099363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang                return "Galileo I";
21076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            case TYPE_GAL_F:
2119363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang                return "Galileo F";
2124b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa            default:
213c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa                return "<Invalid:" + mType + ">";
2144b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        }
2154b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
2164b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
2174b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
218e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Gets the satellite ID.
219e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
220e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>Range varies by constellation.  See definition at {@code GnssStatus#getSvid(int)}
2214b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
22276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getSvid() {
223120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        return mSvid;
2244b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
2254b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
2264b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
227e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Sets the satellite ID.
2280f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
2294b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
2300f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
23176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setSvid(int value) {
232120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        mSvid = value;
2334b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
2344b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
2354b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
236e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Gets the Message identifier.
237e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
238e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>This provides an index to help with complete Navigation Message assembly. Similar
239e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * identifiers within the data bits themselves often supplement this information, in ways even
240e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * more specific to each message type; see the relevant satellite constellation ICDs for
241e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * details.
242e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
243e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <ul>
244e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li> For GPS L1 C/A subframe 4 and 5, this value corresponds to the 'frame id' of the
245e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * navigation message, in the range of 1-25 (Subframe 1, 2, 3 does not contain a 'frame id' and
246e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * this value can be set to -1.)</li>
247e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li> For Glonass L1 C/A, this refers to the frame ID, in the range of 1-5.</li>
248e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li> For BeiDou D1, this refers to the frame number in the range of 1-24</li>
249e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li> For Beidou D2, this refers to the frame number, in the range of 1-120</li>
250e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li> For Galileo F/NAV nominal frame structure, this refers to the subframe number, in the
251e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * range of 1-12</li>
252e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li> For Galileo I/NAV nominal frame structure, this refers to the subframe number in the
253e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * range of 1-24</li>
254e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * </ul>
2554b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
25676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getMessageId() {
2574b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        return mMessageId;
2584b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
2594b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
2604b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
2614b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Sets the Message Identifier.
2620f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
2634b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
2640f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
26576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setMessageId(int value) {
2664b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        mMessageId = value;
2674b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
2684b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
2694b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
270e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Gets the sub-message identifier, relevant to the {@link #getType()} of the message.
271e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
272e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <ul>
273e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li> For GPS L1 C/A, BeiDou D1 &amp; BeiDou D2, the submessage id corresponds to the subframe
274e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * number of the navigation message, in the range of 1-5.</li>
275e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li>For Glonass L1 C/A, this refers to the String number, in the range from 1-15</li>
276e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li>For Galileo F/NAV, this refers to the page type in the range 1-6</li>
277e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li>For Galileo I/NAV, this refers to the word type in the range 1-10+</li>
278e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li>For Galileo in particular, the type information embedded within the data bits may be even
279e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * more useful in interpretation, than the nominal page and word types provided in this
280e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * field.</li>
281e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * </ul>
2824b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
28376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getSubmessageId() {
2844b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        return mSubmessageId;
2854b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
2864b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
2874b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
2884b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Sets the Sub-message identifier.
2890f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
2904b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
2910f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
29276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setSubmessageId(int value) {
2934b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        mSubmessageId = value;
2944b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
2954b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
2964b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
297e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Gets the data of the reported GPS message.
298e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
299e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The bytes (or words) specified using big endian format (MSB first).
300e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
301e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <ul>
302e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li>For GPS L1 C/A, Beidou D1 &amp; Beidou D2, each subframe contains 10 30-bit words. Each
303e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * word (30 bits) should be fit into the last 30 bits in a 4-byte word (skip B31 and B32), with
304e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * MSB first, for a total of 40 bytes, covering a time period of 6, 6, and 0.6 seconds,
305e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * respectively.</li>
306e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li>For Glonass L1 C/A, each string contains 85 data bits, including the checksum.  These
307e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * bits should be fit into 11 bytes, with MSB first (skip B86-B88), covering a time period of 2
308e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * seconds.</li>
309e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li>For Galileo F/NAV, each word consists of 238-bit (sync &amp; tail symbols excluded). Each
310e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * word should be fit into 30-bytes, with MSB first (skip B239, B240), covering a time period of
311e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * 10 seconds.</li>
312e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li>For Galileo I/NAV, each page contains 2 page parts, even and odd, with a total of 2x114 =
313e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * 228 bits, (sync &amp; tail excluded) that should be fit into 29 bytes, with MSB first (skip
314e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * B229-B232).</li>
315e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * </ul>
3164b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
3174b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    @NonNull
3184b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    public byte[] getData() {
3194b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        return mData;
3204b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
3214b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
3224b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    /**
3234b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     * Sets the data associated with the Navigation Message.
3240f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
3254b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa     */
3260f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
3274b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    public void setData(byte[] value) {
3284b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        if (value == null) {
3294b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa            throw new InvalidParameterException("Data must be a non-null array");
3304b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        }
3314b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
3324b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        mData = value;
3334b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
3344b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
3355e72118f193258259912c0a51688bd4434c8896edestradaa    /**
3365e72118f193258259912c0a51688bd4434c8896edestradaa     * Gets the Status of the navigation message contained in the object.
3375e72118f193258259912c0a51688bd4434c8896edestradaa     */
33876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getStatus() {
3395e72118f193258259912c0a51688bd4434c8896edestradaa        return mStatus;
3405e72118f193258259912c0a51688bd4434c8896edestradaa    }
3415e72118f193258259912c0a51688bd4434c8896edestradaa
3425e72118f193258259912c0a51688bd4434c8896edestradaa    /**
3435e72118f193258259912c0a51688bd4434c8896edestradaa     * Sets the status of the navigation message.
3440f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
3455e72118f193258259912c0a51688bd4434c8896edestradaa     */
3460f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
34776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setStatus(int value) {
3485e72118f193258259912c0a51688bd4434c8896edestradaa        mStatus = value;
3495e72118f193258259912c0a51688bd4434c8896edestradaa    }
3505e72118f193258259912c0a51688bd4434c8896edestradaa
3515e72118f193258259912c0a51688bd4434c8896edestradaa    /**
3525e72118f193258259912c0a51688bd4434c8896edestradaa     * Gets a string representation of the 'status'.
3535e72118f193258259912c0a51688bd4434c8896edestradaa     * For internal and logging use only.
3545e72118f193258259912c0a51688bd4434c8896edestradaa     */
3555e72118f193258259912c0a51688bd4434c8896edestradaa    private String getStatusString() {
3565e72118f193258259912c0a51688bd4434c8896edestradaa        switch (mStatus) {
3575e72118f193258259912c0a51688bd4434c8896edestradaa            case STATUS_UNKNOWN:
3585e72118f193258259912c0a51688bd4434c8896edestradaa                return "Unknown";
3595e72118f193258259912c0a51688bd4434c8896edestradaa            case STATUS_PARITY_PASSED:
3605e72118f193258259912c0a51688bd4434c8896edestradaa                return "ParityPassed";
3615e72118f193258259912c0a51688bd4434c8896edestradaa            case STATUS_PARITY_REBUILT:
3625e72118f193258259912c0a51688bd4434c8896edestradaa                return "ParityRebuilt";
3635e72118f193258259912c0a51688bd4434c8896edestradaa            default:
3645e72118f193258259912c0a51688bd4434c8896edestradaa                return "<Invalid:" + mStatus + ">";
3655e72118f193258259912c0a51688bd4434c8896edestradaa        }
3665e72118f193258259912c0a51688bd4434c8896edestradaa    }
3675e72118f193258259912c0a51688bd4434c8896edestradaa
368818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang    public static final Creator<GnssNavigationMessage> CREATOR =
369818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            new Creator<GnssNavigationMessage>() {
3704b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        @Override
371818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang        public GnssNavigationMessage createFromParcel(Parcel parcel) {
372818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            GnssNavigationMessage navigationMessage = new GnssNavigationMessage();
3734b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
37476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            navigationMessage.setType(parcel.readInt());
37576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            navigationMessage.setSvid(parcel.readInt());
37676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            navigationMessage.setMessageId(parcel.readInt());
37776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            navigationMessage.setSubmessageId(parcel.readInt());
3784b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa            int dataLength = parcel.readInt();
3794b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa            byte[] data = new byte[dataLength];
3804b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa            parcel.readByteArray(data);
3814b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa            navigationMessage.setData(data);
3821778b030f7e372d6211ea2f374e89289bc8e8ac3Lifu Tang            navigationMessage.setStatus(parcel.readInt());
3835e72118f193258259912c0a51688bd4434c8896edestradaa
3844b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa            return navigationMessage;
3854b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        }
3864b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
3874b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        @Override
388818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang        public GnssNavigationMessage[] newArray(int size) {
389818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            return new GnssNavigationMessage[size];
3904b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        }
3914b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    };
3924b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
393120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang    @Override
3944b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    public void writeToParcel(Parcel parcel, int flags) {
3959363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang        parcel.writeInt(mType);
396120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        parcel.writeInt(mSvid);
3974b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        parcel.writeInt(mMessageId);
3984b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        parcel.writeInt(mSubmessageId);
3994b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        parcel.writeInt(mData.length);
4004b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        parcel.writeByteArray(mData);
4015e72118f193258259912c0a51688bd4434c8896edestradaa        parcel.writeInt(mStatus);
4024b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
4034b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
4044b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    @Override
4054b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    public int describeContents() {
4064b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        return 0;
4074b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
4084b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
4094b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    @Override
4104b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    public String toString() {
4114b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        final String format = "   %-15s = %s\n";
412818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang        StringBuilder builder = new StringBuilder("GnssNavigationMessage:\n");
4134b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
4144b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        builder.append(String.format(format, "Type", getTypeString()));
415120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        builder.append(String.format(format, "Svid", mSvid));
4165e72118f193258259912c0a51688bd4434c8896edestradaa        builder.append(String.format(format, "Status", getStatusString()));
4174b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        builder.append(String.format(format, "MessageId", mMessageId));
4184b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        builder.append(String.format(format, "SubmessageId", mSubmessageId));
4194b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
4204b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        builder.append(String.format(format, "Data", "{"));
4214b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        String prefix = "        ";
4224b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        for(byte value : mData) {
4234b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa            builder.append(prefix);
4244b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa            builder.append(value);
4254b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa            prefix = ", ";
4264b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        }
4274b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        builder.append(" }");
4284b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
4294b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        return builder.toString();
4304b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
4314b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa
4324b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    private void initialize() {
43376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mType = TYPE_UNKNOWN;
434120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        mSvid = 0;
4354b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        mMessageId = -1;
4364b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        mSubmessageId = -1;
4374b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa        mData = EMPTY_ARRAY;
4385e72118f193258259912c0a51688bd4434c8896edestradaa        mStatus = STATUS_UNKNOWN;
4394b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
4404b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa}
441