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 & 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 & 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 & 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 & 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