1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License 15 */ 16 17 package android.location; 18 19 import java.util.List; 20 21 /* 22 * Helper class to store single Satellite info, only used it in the unit test. 23 */ 24 public class SatelliteInfo { 25 private static final int SVID_MAX_BIT_INDEX = 32; 26 private static final int SVID_SHIFT_WIDTH = 8; 27 private static final int CONSTELLATION_TYPE_SHIFT_WIDTH = 4; 28 29 // Index for the bits in mSvidWithFlag 30 private static final int GNSS_SV_FLAGS_HAS_EPHEMERIS_DATA_BIT_INDEX = 0; 31 private static final int GNSS_SV_FLAGS_HAS_ALMANAC_DATA_BIT_INDEX = 1; 32 private static final int GNSS_SV_FLAGS_USED_IN_FIX_BIT_INDEX = 2; 33 private static final int GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY_BIT_INDEX = 3; 34 public int mSvid; 35 public int mSvidWithFlag; 36 public float mCn0DbHz; 37 public float mElevation; 38 public float mAzimuth; 39 public float mCarrierFrequency; 40 41 /* 42 * Flag fields, it stores the same information as svidWithFlag, but in different format, easy for 43 * the unit test. 44 */ 45 public int mConstellationType; 46 public boolean mHasEphemris; 47 public boolean mHasAlmanac; 48 public boolean mUsedInFix; 49 public boolean mHasCarriesFrequency; 50 SatelliteInfo(int svid, int constellationType, boolean hasEphemris, boolean hasAlmanac, boolean usedInFix, boolean hasCarriesFrequency, float cn0, float elevation, float azimuth, float carrierFrequency)51 public SatelliteInfo(int svid, int constellationType, boolean hasEphemris, boolean hasAlmanac, 52 boolean usedInFix, boolean hasCarriesFrequency, float cn0, float elevation, float azimuth, 53 float carrierFrequency) { 54 mSvidWithFlag = 55 setRange(mSvidWithFlag, constellationType, CONSTELLATION_TYPE_SHIFT_WIDTH, SVID_SHIFT_WIDTH); 56 mSvidWithFlag = setRange(mSvidWithFlag, svid, SVID_SHIFT_WIDTH, SVID_MAX_BIT_INDEX); 57 mSvidWithFlag = setBit(mSvidWithFlag, hasEphemris, GNSS_SV_FLAGS_HAS_EPHEMERIS_DATA_BIT_INDEX); 58 mSvidWithFlag = setBit(mSvidWithFlag, hasAlmanac, GNSS_SV_FLAGS_HAS_ALMANAC_DATA_BIT_INDEX); 59 mSvidWithFlag = setBit(mSvidWithFlag, usedInFix, GNSS_SV_FLAGS_USED_IN_FIX_BIT_INDEX); 60 mSvidWithFlag = 61 setBit(mSvidWithFlag, hasCarriesFrequency, GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY_BIT_INDEX); 62 this.mSvid = svid; 63 this.mConstellationType = constellationType; 64 this.mCn0DbHz = cn0; 65 this.mElevation = elevation; 66 this.mAzimuth = azimuth; 67 this.mCarrierFrequency = carrierFrequency; 68 this.mHasEphemris = hasEphemris; 69 this.mHasAlmanac = hasAlmanac; 70 this.mUsedInFix = usedInFix; 71 this.mHasCarriesFrequency = hasCarriesFrequency; 72 } 73 74 /* 75 * Gernerate svidWithFlags array from svInfos 76 */ getSvidWithFlagsArray(List<SatelliteInfo> svInfos)77 public static int[] getSvidWithFlagsArray(List<SatelliteInfo> svInfos) { 78 int[] svidWithFlags = new int[svInfos.size()]; 79 for (int i = 0; i< svInfos.size(); i++) { 80 svidWithFlags[i] = svInfos.get(i).mSvidWithFlag; 81 } 82 return svidWithFlags; 83 } 84 85 /* 86 * Gernerate cn0s array from svInfos 87 */ getCn0sArray(List<SatelliteInfo> svInfos)88 public static float[] getCn0sArray(List<SatelliteInfo> svInfos) { 89 float[] cn0s = new float[svInfos.size()]; 90 for (int i = 0; i< svInfos.size(); i++) { 91 cn0s[i] = svInfos.get(i).mCn0DbHz; 92 } 93 return cn0s; 94 } 95 96 /* 97 * Gernerate elevations array from svInfos 98 */ getElevationsArray(List<SatelliteInfo> svInfos)99 public static float[] getElevationsArray(List<SatelliteInfo> svInfos) { 100 float[] elevations = new float[svInfos.size()]; 101 for (int i = 0; i< svInfos.size(); i++) { 102 elevations[i] = svInfos.get(i).mElevation; 103 } 104 return elevations; 105 } 106 107 /* 108 * Gernerate azimuths array from svInfos 109 */ getAzimuthsArray(List<SatelliteInfo> svInfos)110 public static float[] getAzimuthsArray(List<SatelliteInfo> svInfos) { 111 float[] azimuths = new float[svInfos.size()]; 112 for (int i = 0; i< svInfos.size(); i++) { 113 azimuths[i] = svInfos.get(i).mAzimuth; 114 } 115 return azimuths; 116 } 117 118 /* 119 * Gernerate carrierFrequency array from svInfos 120 */ getCarrierFrequencyArray(List<SatelliteInfo> svInfos)121 public static float[] getCarrierFrequencyArray(List<SatelliteInfo> svInfos) { 122 float[] carrierFrequencies = new float[svInfos.size()]; 123 for (int i = 0; i< svInfos.size(); i++) { 124 carrierFrequencies[i] = svInfos.get(i).mCarrierFrequency; 125 } 126 return carrierFrequencies; 127 } 128 setBit(int targetValue, boolean value, int index)129 private int setBit(int targetValue, boolean value, int index) { 130 if (value) { 131 targetValue = targetValue | (1 << index); 132 } else { 133 targetValue = targetValue & ~(1 << index); 134 } 135 return targetValue; 136 } 137 138 /* 139 * Set the bit in the range [fromIndex, toIndex), index start from the lowest bit. 140 * value -> 1 1 0 1 1 0 1 0 141 * index -> 7 6 5 4 3 2 1 0 142 * This function will set the bit in the range to the lowest X bits of the value. 143 */ setRange(int targetValue, int value, int fromIndex, int toIndex)144 private int setRange(int targetValue, int value, int fromIndex, int toIndex) { 145 int rangeLen = toIndex - fromIndex; 146 int valueMask = (1 << rangeLen) -1; 147 value &= valueMask; 148 value = value << fromIndex; 149 valueMask = valueMask << fromIndex; 150 targetValue &= (~valueMask); 151 targetValue |= value; 152 return targetValue; 153 } 154 155 }