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 }