1d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang/*
2d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang * Copyright (C) 2014 The Android Open Source Project
3d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang *
4d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang * Licensed under the Apache License, Version 2.0 (the "License");
5d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang * you may not use this file except in compliance with the License.
6d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang * You may obtain a copy of the License at
7d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang *
8d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang *      http://www.apache.org/licenses/LICENSE-2.0
9d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang *
10d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang * Unless required by applicable law or agreed to in writing, software
11d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang * distributed under the License is distributed on an "AS IS" BASIS,
12d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang * See the License for the specific language governing permissions and
14d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang * limitations under the License
15d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang */
16d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
17d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tangpackage android.location;
18d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
19d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tangimport android.annotation.NonNull;
20d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tangimport android.annotation.SystemApi;
21d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tangimport android.os.Parcel;
22d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tangimport android.os.Parcelable;
23d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
24d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tangimport java.security.InvalidParameterException;
25d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
26d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang/**
27d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang * A class containing a GPS satellite Navigation Message.
28d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang *
29d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang * @hide
30d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang */
31d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang@SystemApi
32d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tangpublic class GpsNavigationMessage implements Parcelable {
33d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
34d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    private static final byte[] EMPTY_ARRAY = new byte[0];
35d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
36d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    // The following enumerations must be in sync with the values declared in gps.h
37d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
38d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
39d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * The type of the navigation message is not available or unknown.
40d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
41d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public static final byte TYPE_UNKNOWN = 0;
42d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
43d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
44d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * The Navigation Message is of type L1 C/A.
45d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
46d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public static final byte TYPE_L1CA = 1;
47d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
48d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
49d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * The Navigation Message is of type L1-CNAV.
50d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
51d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public static final byte TYPE_L2CNAV = 2;
52d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
53d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
54d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * The Navigation Message is of type L5-CNAV.
55d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
56d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public static final byte TYPE_L5CNAV = 3;
57d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
58d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
59d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * The Navigation Message is of type CNAV-2.
60d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
61d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public static final byte TYPE_CNAV2 = 4;
62d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
63d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
64d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * The Navigation Message Status is 'unknown'.
65d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
66d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public static final short STATUS_UNKNOWN = 0;
67d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
68d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
69d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * The Navigation Message was received without any parity error in its navigation words.
70d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
71d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public static final short STATUS_PARITY_PASSED = (1<<0);
72d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
73d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
74d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * The Navigation Message was received with words that failed parity check, but the receiver was
75d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * able to correct those words.
76d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
77d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public static final short STATUS_PARITY_REBUILT = (1<<1);
78d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
79d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    // End enumerations in sync with gps.h
80d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
81d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    private byte mType;
82d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    private byte mPrn;
83d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    private short mMessageId;
84d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    private short mSubmessageId;
85d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    private byte[] mData;
86d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    private short mStatus;
87d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
88d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    GpsNavigationMessage() {
89d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        initialize();
90d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
91d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
92d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
93d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * Sets all contents to the values stored in the provided object.
94d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
95d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public void set(GpsNavigationMessage navigationMessage) {
96d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        mType = navigationMessage.mType;
97d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        mPrn = navigationMessage.mPrn;
98d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        mMessageId = navigationMessage.mMessageId;
99d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        mSubmessageId = navigationMessage.mSubmessageId;
100d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        mData = navigationMessage.mData;
101d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        mStatus = navigationMessage.mStatus;
102d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
103d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
104d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
105d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * Resets all the contents to its original state.
106d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
107d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public void reset() {
108d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        initialize();
109d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
110d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
111d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
112d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * Gets the type of the navigation message contained in the object.
113d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
114d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public byte getType() {
115d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        return mType;
116d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
117d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
118d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
119d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * Sets the type of the navigation message.
120d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
121d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public void setType(byte value) {
122d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        mType = value;
123d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
124d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
125d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
126d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * Gets a string representation of the 'type'.
127d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * For internal and logging use only.
128d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
129d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    private String getTypeString() {
130d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        switch (mType) {
131d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            case TYPE_UNKNOWN:
132d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang                return "Unknown";
133d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            case TYPE_L1CA:
134d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang                return "L1 C/A";
135d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            case TYPE_L2CNAV:
136d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang                return "L2-CNAV";
137d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            case TYPE_L5CNAV:
138d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang                return "L5-CNAV";
139d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            case TYPE_CNAV2:
140d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang                return "CNAV-2";
141d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            default:
142d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang                return "<Invalid:" + mType + ">";
143d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        }
144d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
145d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
146d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
147d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * Gets the Pseudo-random number.
148d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * Range: [1, 32].
149d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
150d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public byte getPrn() {
151d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        return mPrn;
152d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
153d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
154d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
155d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * Sets the Pseud-random number.
156d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
157d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public void setPrn(byte value) {
158d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        mPrn = value;
159d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
160d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
161d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
162d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * Gets the Message Identifier.
163d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * It provides an index so the complete Navigation Message can be assembled. i.e. for L1 C/A
164d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * subframe 4 and 5, this value corresponds to the 'frame id' of the navigation message.
165d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * Subframe 1, 2, 3 does not contain a 'frame id' and this might be reported as -1.
166d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
167d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public short getMessageId() {
168d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        return mMessageId;
169d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
170d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
171d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
172d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * Sets the Message Identifier.
173d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
174d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public void setMessageId(short value) {
175d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        mMessageId = value;
176d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
177d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
178d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
179d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * Gets the Sub-message Identifier.
180d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * If required by {@link #getType()}, this value contains a sub-index within the current message
181d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * (or frame) that is being transmitted. i.e. for L1 C/A the sub-message identifier corresponds
182d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * to the sub-frame Id of the navigation message.
183d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
184d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public short getSubmessageId() {
185d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        return mSubmessageId;
186d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
187d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
188d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
189d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * Sets the Sub-message identifier.
190d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
191d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public void setSubmessageId(short value) {
192d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        mSubmessageId = value;
193d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
194d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
195d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
196d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * Gets the data associated with the Navigation Message.
197d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * The bytes (or words) specified using big endian format (MSB first).
198d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
199d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    @NonNull
200d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public byte[] getData() {
201d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        return mData;
202d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
203d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
204d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
205d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * Sets the data associated with the Navigation Message.
206d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
207d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public void setData(byte[] value) {
208d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        if (value == null) {
209d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            throw new InvalidParameterException("Data must be a non-null array");
210d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        }
211d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
212d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        mData = value;
213d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
214d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
215d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
216d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * Gets the Status of the navigation message contained in the object.
217d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
218d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public short getStatus() {
219d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        return mStatus;
220d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
221d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
222d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
223d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * Sets the status of the navigation message.
224d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
225d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public void setStatus(short value) {
226d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        mStatus = value;
227d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
228d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
229d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    /**
230d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * Gets a string representation of the 'status'.
231d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     * For internal and logging use only.
232d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang     */
233d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    private String getStatusString() {
234d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        switch (mStatus) {
235d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            case STATUS_UNKNOWN:
236d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang                return "Unknown";
237d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            case STATUS_PARITY_PASSED:
238d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang                return "ParityPassed";
239d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            case STATUS_PARITY_REBUILT:
240d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang                return "ParityRebuilt";
241d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            default:
242d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang                return "<Invalid:" + mStatus + ">";
243d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        }
244d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
245d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
246d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public static final Creator<GpsNavigationMessage> CREATOR =
247d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            new Creator<GpsNavigationMessage>() {
248d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        @Override
249d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        public GpsNavigationMessage createFromParcel(Parcel parcel) {
250d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            GpsNavigationMessage navigationMessage = new GpsNavigationMessage();
251d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
252d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            navigationMessage.setType(parcel.readByte());
253d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            navigationMessage.setPrn(parcel.readByte());
254d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            navigationMessage.setMessageId((short) parcel.readInt());
255d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            navigationMessage.setSubmessageId((short) parcel.readInt());
256d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
257d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            int dataLength = parcel.readInt();
258d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            byte[] data = new byte[dataLength];
259d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            parcel.readByteArray(data);
260d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            navigationMessage.setData(data);
261d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
262d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            if (parcel.dataAvail() >= Integer.SIZE) {
263d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang                int status = parcel.readInt();
264d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang                navigationMessage.setStatus((short) status);
265d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            } else {
266d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang                navigationMessage.setStatus(STATUS_UNKNOWN);
267d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            }
268d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
269d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            return navigationMessage;
270d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        }
271d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
272d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        @Override
273d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        public GpsNavigationMessage[] newArray(int size) {
274d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            return new GpsNavigationMessage[size];
275d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        }
276d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    };
277d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
278d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public void writeToParcel(Parcel parcel, int flags) {
279d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        parcel.writeByte(mType);
280d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        parcel.writeByte(mPrn);
281d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        parcel.writeInt(mMessageId);
282d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        parcel.writeInt(mSubmessageId);
283d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        parcel.writeInt(mData.length);
284d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        parcel.writeByteArray(mData);
285d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        parcel.writeInt(mStatus);
286d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
287d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
288d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    @Override
289d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public int describeContents() {
290d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        return 0;
291d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
292d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
293d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    @Override
294d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    public String toString() {
295d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        final String format = "   %-15s = %s\n";
296d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        StringBuilder builder = new StringBuilder("GpsNavigationMessage:\n");
297d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
298d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        builder.append(String.format(format, "Type", getTypeString()));
299d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        builder.append(String.format(format, "Prn", mPrn));
300d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        builder.append(String.format(format, "Status", getStatusString()));
301d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        builder.append(String.format(format, "MessageId", mMessageId));
302d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        builder.append(String.format(format, "SubmessageId", mSubmessageId));
303d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
304d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        builder.append(String.format(format, "Data", "{"));
305d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        String prefix = "        ";
306d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        for(byte value : mData) {
307d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            builder.append(prefix);
308d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            builder.append(value);
309d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang            prefix = ", ";
310d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        }
311d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        builder.append(" }");
312d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
313d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        return builder.toString();
314d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
315d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang
316d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    private void initialize() {
317d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        mType = TYPE_UNKNOWN;
318d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        mPrn = 0;
319d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        mMessageId = -1;
320d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        mSubmessageId = -1;
321d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        mData = EMPTY_ARRAY;
322d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang        mStatus = STATUS_UNKNOWN;
323d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang    }
324d46d308562b78af6a06d014e17cb67a6e3103b30Lifu Tang}
325