View Javadoc
1   /*
2    * Copyright (C) 2018 Alberto Irurueta Carro (alberto@irurueta.com)
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  package com.irurueta.navigation.indoor;
17  
18  import com.irurueta.algebra.Matrix;
19  import com.irurueta.geometry.Point;
20  
21  /**
22   * Contains a located reading associated to a given radio source (e.g. Wi-Fi access point or
23   * bluetooth beacon) containing signal strength and distance to associated radio source.
24   *
25   * @param <S> a {@link RadioSource} type.
26   * @param <P> a {@link Point} type.
27   */
28  public class RangingAndRssiReadingLocated<S extends RadioSource, P extends Point<?>> extends RangingAndRssiReading<S>
29          implements ReadingLocated<P> {
30  
31      /**
32       * Position where Wi-Fi reading was made.
33       */
34      private P position;
35  
36      /**
37       * Covariance of inhomogeneous coordinates of current position
38       * (if available).
39       */
40      private Matrix positionCovariance;
41  
42      /**
43       * Constructor.
44       *
45       * @param source   radio source associated to this reading.
46       * @param distance distance in meters to the radio source.
47       * @param rssi     received signal strength indicator in dBm.
48       * @param position position where reading was made.
49       * @throws IllegalArgumentException if radio source data is null, distance is negative
50       *                                  or position is null.
51       */
52      public RangingAndRssiReadingLocated(final S source, final double distance, final double rssi, final P position) {
53          super(source, distance, rssi);
54  
55          if (position == null) {
56              throw new IllegalArgumentException();
57          }
58  
59          this.position = position;
60      }
61  
62      /**
63       * Constructor.
64       *
65       * @param source                    radio source associated to this reading.
66       * @param distance                  distance in meters to the radio source.
67       * @param rssi                      received signal strength indicator in dBm.
68       * @param position                  position where reading was made.
69       * @param numAttemptedMeasurements  number of attempted measurements used in the RTT exchange.
70       * @param numSuccessfulMeasurements number of successful measurements used to calculate the
71       *                                  distance and standard deviation.
72       * @throws IllegalArgumentException if radio source data is null, distance is negative,
73       *                                  position is null, number of attempted measures is less than 1 or number of
74       *                                  successful measures is negative.
75       */
76      public RangingAndRssiReadingLocated(
77              final S source, final double distance, final double rssi, final P position,
78              final int numAttemptedMeasurements, final int numSuccessfulMeasurements) {
79          super(source, distance, rssi, numAttemptedMeasurements, numSuccessfulMeasurements);
80  
81          if (position == null) {
82              throw new IllegalArgumentException();
83          }
84  
85          this.position = position;
86      }
87  
88      /**
89       * Constructor.
90       *
91       * @param source                    radio source associated to this reading.
92       * @param distance                  distance in meters to the radio source.
93       * @param rssi                      received signal strength indicator in dBm.
94       * @param position                  position where reading was made.
95       * @param distanceStandardDeviation standard deviation of distance, if available.
96       * @param rssiStandardDeviation     standard deviation of RSSI, if available.
97       * @throws IllegalArgumentException if radio source data is null, distance is negative,
98       *                                  position is null or any of the standard deviations is zero or negative.
99       */
100     public RangingAndRssiReadingLocated(
101             final S source, final double distance, final double rssi, final P position,
102             final Double distanceStandardDeviation, final Double rssiStandardDeviation) {
103         super(source, distance, rssi, distanceStandardDeviation, rssiStandardDeviation);
104 
105         if (position == null) {
106             throw new IllegalArgumentException();
107         }
108 
109         this.position = position;
110     }
111 
112     /**
113      * Constructor.
114      *
115      * @param source                    radio source associated to this reading.
116      * @param distance                  distance in meters to the radio source.
117      * @param rssi                      received signal strength indicator in dBm.
118      * @param position                  position where reading was made.
119      * @param distanceStandardDeviation standard deviation of distance, if available.
120      * @param rssiStandardDeviation     standard deviation of RSSI, if available.
121      * @param numAttemptedMeasurements  number of attempted measurements used in the RTT exchange.
122      * @param numSuccessfulMeasurements number of successful measurements used to calculate the
123      *                                  distance and standard deviation.
124      * @throws IllegalArgumentException if radio source data is null, distance is negative,
125      *                                  position is null, any of the standard deviations is zero or negative, number of
126      *                                  attempted measures is less than 1 or number of successful measures is negative.
127      */
128     public RangingAndRssiReadingLocated(
129             final S source, final double distance, final double rssi, final P position,
130             final Double distanceStandardDeviation, final Double rssiStandardDeviation,
131             final int numAttemptedMeasurements, final int numSuccessfulMeasurements) {
132         super(source, distance, rssi, distanceStandardDeviation, rssiStandardDeviation, numAttemptedMeasurements,
133                 numSuccessfulMeasurements);
134 
135         if (position == null) {
136             throw new IllegalArgumentException();
137         }
138 
139         this.position = position;
140     }
141 
142     /**
143      * Constructor.
144      *
145      * @param source             radio source associated to this reading.
146      * @param distance           distance in meters to the radio source.
147      * @param rssi               received signal strength indicator in dBm.
148      * @param position           position where reading was made.
149      * @param positionCovariance covariance of inhomogeneous coordinates of
150      *                           current position (if available).
151      * @throws IllegalArgumentException if radio source data is null, distance is negative
152      *                                  position is null or position covariance has wrong size.
153      */
154     public RangingAndRssiReadingLocated(
155             final S source, final double distance, final double rssi, final P position,
156             final Matrix positionCovariance) {
157         this(source, distance, rssi, position);
158 
159         if (positionCovariance != null) {
160             final var dims = position.getDimensions();
161             if (positionCovariance.getRows() != dims || positionCovariance.getColumns() != dims) {
162                 throw new IllegalArgumentException();
163             }
164         }
165         this.positionCovariance = positionCovariance;
166     }
167 
168     /**
169      * Constructor.
170      *
171      * @param source                    radio source associated to this reading.
172      * @param distance                  distance in meters to the radio source.
173      * @param rssi                      received signal strength indicator in dBm.
174      * @param position                  position where reading was made.
175      * @param positionCovariance        covariance of inhomogeneous coordinates of
176      *                                  current position (if available).
177      * @param numAttemptedMeasurements  number of attempted measurements used in the RTT exchange.
178      * @param numSuccessfulMeasurements number of successful measurements used to calculate the
179      *                                  distance and standard deviation.
180      * @throws IllegalArgumentException if radio source data is null, distance is negative,
181      *                                  position is null, position covariance has wrong size, number of attempted
182      *                                  measures is less than 1 or number of successful measures is negative.
183      */
184     public RangingAndRssiReadingLocated(
185             final S source, final double distance, final double rssi, final P position, final Matrix positionCovariance,
186             final int numAttemptedMeasurements, final int numSuccessfulMeasurements) {
187         this(source, distance, rssi, position, numAttemptedMeasurements, numSuccessfulMeasurements);
188 
189         if (positionCovariance != null) {
190             final var dims = position.getDimensions();
191             if (positionCovariance.getRows() != dims || positionCovariance.getColumns() != dims) {
192                 throw new IllegalArgumentException();
193             }
194         }
195         this.positionCovariance = positionCovariance;
196     }
197 
198     /**
199      * Constructor.
200      *
201      * @param source                    radio source associated to this reading.
202      * @param distance                  distance in meters to the radio source.
203      * @param rssi                      received signal strength indicator in dBm.
204      * @param position                  position where reading was made.
205      * @param distanceStandardDeviation standard deviation of distance, if available.
206      * @param rssiStandardDeviation     standard deviation of RSSI value.
207      * @param positionCovariance        covariance of inhomogeneous coordinates of
208      *                                  current position (if available).
209      * @throws IllegalArgumentException if radio source data is null, distance is negative,
210      *                                  position is null or standard deviation is zero or negative.
211      */
212     public RangingAndRssiReadingLocated(
213             final S source, final double distance, final double rssi, final P position,
214             final Double distanceStandardDeviation, final Double rssiStandardDeviation,
215             final Matrix positionCovariance) {
216         this(source, distance, rssi, position, distanceStandardDeviation, rssiStandardDeviation);
217 
218         if (positionCovariance != null) {
219             final var dims = position.getDimensions();
220             if (positionCovariance.getRows() != dims || positionCovariance.getColumns() != dims) {
221                 throw new IllegalArgumentException();
222             }
223         }
224         this.positionCovariance = positionCovariance;
225     }
226 
227     /**
228      * Constructor.
229      *
230      * @param source                    radio source associated to this reading.
231      * @param distance                  distance in meters to the radio source.
232      * @param rssi                      received signal strength indicator in dBm.
233      * @param position                  position where reading was made.
234      * @param distanceStandardDeviation standard deviation of distance, if available.
235      * @param rssiStandardDeviation     standard deviation of RSSI value.
236      * @param positionCovariance        covariance of inhomogeneous coordinates of
237      *                                  current position (if available).
238      * @param numAttemptedMeasurements  number of attempted measurements used in the RTT exchange.
239      * @param numSuccessfulMeasurements number of successful measurements used to calculate the
240      *                                  distance and standard deviation.
241      * @throws IllegalArgumentException if radio source data is null, distance is negative,
242      *                                  position is null, any of the standard deviations is zero or negative,
243      *                                  position covariance has wrong size, number of attempted
244      *                                  measures is less than 1 or number of successful measures is negative.
245      */
246     public RangingAndRssiReadingLocated(
247             final S source, final double distance, final double rssi, final P position,
248             final Double distanceStandardDeviation, final Double rssiStandardDeviation, final Matrix positionCovariance,
249             final int numAttemptedMeasurements, final int numSuccessfulMeasurements) {
250         this(source, distance, rssi, position, distanceStandardDeviation, rssiStandardDeviation,
251                 numAttemptedMeasurements, numSuccessfulMeasurements);
252 
253         if (positionCovariance != null) {
254             final var dims = position.getDimensions();
255             if (positionCovariance.getRows() != dims || positionCovariance.getColumns() != dims) {
256                 throw new IllegalArgumentException();
257             }
258         }
259         this.positionCovariance = positionCovariance;
260     }
261 
262     /**
263      * Empty constructor.
264      */
265     protected RangingAndRssiReadingLocated() {
266         super();
267     }
268 
269     /**
270      * Gets position where reading was made.
271      *
272      * @return position where reading was made.
273      */
274     public P getPosition() {
275         return position;
276     }
277 
278     /**
279      * Gets covariance of inhomogeneous coordinates of current position (if available).
280      *
281      * @return covariance of position or null.
282      */
283     public Matrix getPositionCovariance() {
284         return positionCovariance;
285     }
286 }