1*4d7e907cSAndroid Build Coastguard Worker/* 2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*4d7e907cSAndroid Build Coastguard Worker * 4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*4d7e907cSAndroid Build Coastguard Worker * 8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*4d7e907cSAndroid Build Coastguard Worker * 10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License. 15*4d7e907cSAndroid Build Coastguard Worker */ 16*4d7e907cSAndroid Build Coastguard Worker 17*4d7e907cSAndroid Build Coastguard Workerpackage [email protected]; 18*4d7e907cSAndroid Build Coastguard Worker 19*4d7e907cSAndroid Build Coastguard Worker/** Represents a GNSS navigation message (or a fragment of it). */ 20*4d7e907cSAndroid Build Coastguard Workerinterface IGnssNavigationMessageCallback { 21*4d7e907cSAndroid Build Coastguard Worker /** 22*4d7e907cSAndroid Build Coastguard Worker * Enumeration of available values to indicate the GNSS Navigation message 23*4d7e907cSAndroid Build Coastguard Worker * types. 24*4d7e907cSAndroid Build Coastguard Worker * 25*4d7e907cSAndroid Build Coastguard Worker * For convenience, first byte is the GnssConstellationType on which that signal 26*4d7e907cSAndroid Build Coastguard Worker * is typically transmitted. 27*4d7e907cSAndroid Build Coastguard Worker */ 28*4d7e907cSAndroid Build Coastguard Worker @export(name="", value_prefix="GNSS_NAVIGATION_MESSAGE_TYPE_") 29*4d7e907cSAndroid Build Coastguard Worker enum GnssNavigationMessageType : int16_t { 30*4d7e907cSAndroid Build Coastguard Worker UNKNOWN = 0, 31*4d7e907cSAndroid Build Coastguard Worker /** GPS L1 C/A message contained in the structure. */ 32*4d7e907cSAndroid Build Coastguard Worker GPS_L1CA = 0x0101, 33*4d7e907cSAndroid Build Coastguard Worker /** GPS L2-CNAV message contained in the structure. */ 34*4d7e907cSAndroid Build Coastguard Worker GPS_L2CNAV = 0x0102, 35*4d7e907cSAndroid Build Coastguard Worker /** GPS L5-CNAV message contained in the structure. */ 36*4d7e907cSAndroid Build Coastguard Worker GPS_L5CNAV = 0x0103, 37*4d7e907cSAndroid Build Coastguard Worker /** GPS CNAV-2 message contained in the structure. */ 38*4d7e907cSAndroid Build Coastguard Worker GPS_CNAV2 = 0x0104, 39*4d7e907cSAndroid Build Coastguard Worker /** Glonass L1 CA message contained in the structure. */ 40*4d7e907cSAndroid Build Coastguard Worker GLO_L1CA = 0x0301, 41*4d7e907cSAndroid Build Coastguard Worker /** Beidou D1 message contained in the structure. */ 42*4d7e907cSAndroid Build Coastguard Worker BDS_D1 = 0x0501, 43*4d7e907cSAndroid Build Coastguard Worker /** Beidou D2 message contained in the structure. */ 44*4d7e907cSAndroid Build Coastguard Worker BDS_D2 = 0x0502, 45*4d7e907cSAndroid Build Coastguard Worker /** Galileo I/NAV message contained in the structure. */ 46*4d7e907cSAndroid Build Coastguard Worker GAL_I = 0x0601, 47*4d7e907cSAndroid Build Coastguard Worker /** Galileo F/NAV message contained in the structure. */ 48*4d7e907cSAndroid Build Coastguard Worker GAL_F = 0x0602 49*4d7e907cSAndroid Build Coastguard Worker }; 50*4d7e907cSAndroid Build Coastguard Worker 51*4d7e907cSAndroid Build Coastguard Worker /** 52*4d7e907cSAndroid Build Coastguard Worker * Status of Navigation Message 53*4d7e907cSAndroid Build Coastguard Worker * When a message is received properly without any parity error in its 54*4d7e907cSAndroid Build Coastguard Worker * navigation words, the status must be set to PARITY_PASSED. 55*4d7e907cSAndroid Build Coastguard Worker * If a message is received with words that failed a parity check, but the GNSS 56*4d7e907cSAndroid Build Coastguard Worker * receiver has corrected those words, the status must be set to PARITY_REBUILT. 57*4d7e907cSAndroid Build Coastguard Worker * Do not send any navigation message that contains words with parity errors 58*4d7e907cSAndroid Build Coastguard Worker * that cannot be corrected. 59*4d7e907cSAndroid Build Coastguard Worker */ 60*4d7e907cSAndroid Build Coastguard Worker @export(name="navigation_message_status", value_prefix="NAV_MESSAGE_STATUS_") 61*4d7e907cSAndroid Build Coastguard Worker enum NavigationMessageStatus : uint16_t { 62*4d7e907cSAndroid Build Coastguard Worker PARITY_PASSED = (1 << 0), 63*4d7e907cSAndroid Build Coastguard Worker PARITY_REBUILT = (1 << 1), 64*4d7e907cSAndroid Build Coastguard Worker UNKNOWN = 0 65*4d7e907cSAndroid Build Coastguard Worker }; 66*4d7e907cSAndroid Build Coastguard Worker 67*4d7e907cSAndroid Build Coastguard Worker struct GnssNavigationMessage { 68*4d7e907cSAndroid Build Coastguard Worker /** 69*4d7e907cSAndroid Build Coastguard Worker * Satellite vehicle ID number, as defined in GnssSvInfo::svid 70*4d7e907cSAndroid Build Coastguard Worker * This is a mandatory value. 71*4d7e907cSAndroid Build Coastguard Worker */ 72*4d7e907cSAndroid Build Coastguard Worker int16_t svid; 73*4d7e907cSAndroid Build Coastguard Worker 74*4d7e907cSAndroid Build Coastguard Worker /** 75*4d7e907cSAndroid Build Coastguard Worker * The type of message contained in the structure. 76*4d7e907cSAndroid Build Coastguard Worker * This is a mandatory value. 77*4d7e907cSAndroid Build Coastguard Worker */ 78*4d7e907cSAndroid Build Coastguard Worker GnssNavigationMessageType type; 79*4d7e907cSAndroid Build Coastguard Worker 80*4d7e907cSAndroid Build Coastguard Worker /** 81*4d7e907cSAndroid Build Coastguard Worker * The status of the received navigation message. 82*4d7e907cSAndroid Build Coastguard Worker * No need to send any navigation message that contains words with parity 83*4d7e907cSAndroid Build Coastguard Worker * errors that cannot be corrected. 84*4d7e907cSAndroid Build Coastguard Worker */ 85*4d7e907cSAndroid Build Coastguard Worker bitfield<NavigationMessageStatus> status; 86*4d7e907cSAndroid Build Coastguard Worker 87*4d7e907cSAndroid Build Coastguard Worker /** 88*4d7e907cSAndroid Build Coastguard Worker * Message identifier. It provides an index so the complete Navigation 89*4d7e907cSAndroid Build Coastguard Worker * Message can be assembled. 90*4d7e907cSAndroid Build Coastguard Worker * 91*4d7e907cSAndroid Build Coastguard Worker * - For GNSS L1 C/A subframe 4 and 5, this value corresponds to the 'frame 92*4d7e907cSAndroid Build Coastguard Worker * id' of the navigation message, in the range of 1-25 (Subframe 1, 2, 3 93*4d7e907cSAndroid Build Coastguard Worker * does not contain a 'frame id' and this value can be set to -1.) 94*4d7e907cSAndroid Build Coastguard Worker * 95*4d7e907cSAndroid Build Coastguard Worker * - For Glonass L1 C/A, this refers to the frame ID, in the range of 1-5. 96*4d7e907cSAndroid Build Coastguard Worker * 97*4d7e907cSAndroid Build Coastguard Worker * - For BeiDou D1, this refers to the frame number in the range of 1-24 98*4d7e907cSAndroid Build Coastguard Worker * 99*4d7e907cSAndroid Build Coastguard Worker * - For Beidou D2, this refers to the frame number, in the range of 1-120 100*4d7e907cSAndroid Build Coastguard Worker * 101*4d7e907cSAndroid Build Coastguard Worker * - For Galileo F/NAV nominal frame structure, this refers to the subframe 102*4d7e907cSAndroid Build Coastguard Worker * number, in the range of 1-12 103*4d7e907cSAndroid Build Coastguard Worker * 104*4d7e907cSAndroid Build Coastguard Worker * - For Galileo I/NAV nominal frame structure, this refers to the subframe 105*4d7e907cSAndroid Build Coastguard Worker * number in the range of 1-24 106*4d7e907cSAndroid Build Coastguard Worker */ 107*4d7e907cSAndroid Build Coastguard Worker int16_t messageId; 108*4d7e907cSAndroid Build Coastguard Worker 109*4d7e907cSAndroid Build Coastguard Worker /** 110*4d7e907cSAndroid Build Coastguard Worker * Sub-message identifier. If required by the message 'type', this value 111*4d7e907cSAndroid Build Coastguard Worker * contains a sub-index within the current message (or frame) that is being 112*4d7e907cSAndroid Build Coastguard Worker * transmitted. 113*4d7e907cSAndroid Build Coastguard Worker * 114*4d7e907cSAndroid Build Coastguard Worker * - For GNSS L1 C/A, BeiDou D1 & BeiDou D2, the submessage id corresponds to 115*4d7e907cSAndroid Build Coastguard Worker * the subframe number of the navigation message, in the range of 1-5. 116*4d7e907cSAndroid Build Coastguard Worker * 117*4d7e907cSAndroid Build Coastguard Worker * - For Glonass L1 C/A, this refers to the String number, in the range from 118*4d7e907cSAndroid Build Coastguard Worker * 1-15 119*4d7e907cSAndroid Build Coastguard Worker * 120*4d7e907cSAndroid Build Coastguard Worker * - For Galileo F/NAV, this refers to the page type in the range 1-6 121*4d7e907cSAndroid Build Coastguard Worker * 122*4d7e907cSAndroid Build Coastguard Worker * - For Galileo I/NAV, this refers to the word type in the range 0-10+ 123*4d7e907cSAndroid Build Coastguard Worker * A value of 0 is only allowed if the Satellite is transmiting a Spare Word. 124*4d7e907cSAndroid Build Coastguard Worker */ 125*4d7e907cSAndroid Build Coastguard Worker int16_t submessageId; 126*4d7e907cSAndroid Build Coastguard Worker 127*4d7e907cSAndroid Build Coastguard Worker /** 128*4d7e907cSAndroid Build Coastguard Worker * The data of the reported GNSS message. The bytes (or words) are specified 129*4d7e907cSAndroid Build Coastguard Worker * using big endian format (MSB first). 130*4d7e907cSAndroid Build Coastguard Worker * 131*4d7e907cSAndroid Build Coastguard Worker * - For GNSS L1 C/A, Beidou D1 & Beidou D2, each subframe contains 10 30-bit 132*4d7e907cSAndroid Build Coastguard Worker * words. Each word (30 bits) must fit into the last 30 bits in a 133*4d7e907cSAndroid Build Coastguard Worker * 4-byte word (skip B31 and B32), with MSB first, for a total of 40 134*4d7e907cSAndroid Build Coastguard Worker * bytes, covering a time period of 6, 6, and 0.6 seconds, respectively. 135*4d7e907cSAndroid Build Coastguard Worker * The standard followed is 1995 SPS Signal specification. 136*4d7e907cSAndroid Build Coastguard Worker * 137*4d7e907cSAndroid Build Coastguard Worker * - For Glonass L1 C/A, each string contains 85 data bits, including the 138*4d7e907cSAndroid Build Coastguard Worker * checksum. These bits must fit into 11 bytes, with MSB first (skip 139*4d7e907cSAndroid Build Coastguard Worker * B86-B88), covering a time period of 2 seconds. 140*4d7e907cSAndroid Build Coastguard Worker * The standard followed is Glonass Interface Control Document Edition 5.1. 141*4d7e907cSAndroid Build Coastguard Worker * 142*4d7e907cSAndroid Build Coastguard Worker * - For Galileo F/NAV, each word consists of 238-bit (sync & tail symbols 143*4d7e907cSAndroid Build Coastguard Worker * excluded). Each word must fit into 30-bytes, with MSB first (skip 144*4d7e907cSAndroid Build Coastguard Worker * B239, B240), covering a time period of 10 seconds. The standard 145*4d7e907cSAndroid Build Coastguard Worker * followed is European GNSS(Galileo) Signal in Space Interface 146*4d7e907cSAndroid Build Coastguard Worker * Control Document Issue 1.2. 147*4d7e907cSAndroid Build Coastguard Worker * 148*4d7e907cSAndroid Build Coastguard Worker * - For Galileo I/NAV, each page contains 2 page parts, even and odd, with 149*4d7e907cSAndroid Build Coastguard Worker * a total of 2x114 = 228 bits, (sync & tail excluded) that must fit 150*4d7e907cSAndroid Build Coastguard Worker * into 29 bytes, with MSB first (skip B229-B232). The standard followed 151*4d7e907cSAndroid Build Coastguard Worker * is same as above. 152*4d7e907cSAndroid Build Coastguard Worker * 153*4d7e907cSAndroid Build Coastguard Worker * The data reported here must be the raw data as demodulated by the GNSS 154*4d7e907cSAndroid Build Coastguard Worker * receiver, not data received from an external source (i.e. not from a server 155*4d7e907cSAndroid Build Coastguard Worker * download.) 156*4d7e907cSAndroid Build Coastguard Worker */ 157*4d7e907cSAndroid Build Coastguard Worker vec<uint8_t> data; 158*4d7e907cSAndroid Build Coastguard Worker }; 159*4d7e907cSAndroid Build Coastguard Worker 160*4d7e907cSAndroid Build Coastguard Worker /** 161*4d7e907cSAndroid Build Coastguard Worker * The callback to report an available fragment of a GNSS navigation messages 162*4d7e907cSAndroid Build Coastguard Worker * from the HAL. 163*4d7e907cSAndroid Build Coastguard Worker * 164*4d7e907cSAndroid Build Coastguard Worker * @param message - The GNSS navigation submessage/subframe representation. 165*4d7e907cSAndroid Build Coastguard Worker */ 166*4d7e907cSAndroid Build Coastguard Worker gnssNavigationMessageCb(GnssNavigationMessage message); 167*4d7e907cSAndroid Build Coastguard Worker}; 168