Home | History | Annotate | Download | only in Path
      1 /*
      2  * Copyright (C) 2016 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 package com.android.cts.verifier.sensors.sixdof.Utils.Path;
     17 
     18 import com.android.cts.verifier.sensors.sixdof.Utils.Manager;
     19 import com.android.cts.verifier.sensors.sixdof.Utils.MathsUtils;
     20 import com.android.cts.verifier.sensors.sixdof.Utils.Exceptions.WaypointAreaCoveredException;
     21 import com.android.cts.verifier.sensors.sixdof.Utils.Exceptions.WaypointDistanceException;
     22 import com.android.cts.verifier.sensors.sixdof.Utils.Exceptions.WaypointRingNotEnteredException;
     23 import com.android.cts.verifier.sensors.sixdof.Utils.Exceptions.WaypointStartPointException;
     24 import com.android.cts.verifier.sensors.sixdof.Utils.Path.PathUtilityClasses.Waypoint;
     25 
     26 import java.util.ArrayList;
     27 
     28 /**
     29  * Contains all the information of the current path.
     30  */
     31 public abstract class Path {
     32     protected ArrayList<Waypoint> mCurrentPath = new ArrayList<>();
     33     protected ArrayList<Waypoint> mPathMarkers = new ArrayList<>();
     34 
     35     /**
     36      * Creates a waypoint and adds it to the path.
     37      *
     38      * @param coordinates   the coordinates to use for the waypoint.
     39      * @param userGenerated indicates whether the data was user created or system created.
     40      * @param currentLap    the lap the data was created in.
     41      * @throws WaypointDistanceException       if the location is too close to another.
     42      * @throws WaypointAreaCoveredException    if the area covered by the user is too little.
     43      * @throws WaypointStartPointException     if the location is not close enough to the start.
     44      * @throws WaypointRingNotEnteredException if a ring is not entered.
     45      */
     46     public void createWaypointAndAddToPath(
     47             float[] coordinates, boolean userGenerated, Manager.Lap currentLap)
     48             throws WaypointStartPointException, WaypointDistanceException,
     49             WaypointAreaCoveredException, WaypointRingNotEnteredException {
     50         if (userGenerated) {
     51             additionalChecks(coordinates);
     52         }
     53         Waypoint waypoint = new Waypoint(coordinates, userGenerated, currentLap);
     54         mCurrentPath.add(waypoint);
     55         if (waypoint.isUserGenerated()) {
     56             mPathMarkers.add(waypoint);
     57         }
     58     }
     59 
     60     protected float getLengthOfCurrentPath() {
     61         float length = 0.0f;
     62 
     63         // Start at index 1.
     64         for (int i = 1; i < mCurrentPath.size(); i++) {
     65             float distance = MathsUtils.distanceCalculationOnXYPlane(
     66                     mCurrentPath.get(i).getCoordinates(),
     67                     mCurrentPath.get(i - 1).getCoordinates());
     68             length += Math.abs(distance);
     69         }
     70 
     71         return length;
     72     }
     73 
     74     /**
     75      * Abstract method used by classes that extend this one to run additional functionality.
     76      *
     77      * @param coordinates the coordinates for the waypoint.
     78      * @throws WaypointDistanceException       if the location is too close to another.
     79      * @throws WaypointAreaCoveredException    if the area covered by the user is too little.
     80      * @throws WaypointStartPointException     if the location is not close enough to the start.
     81      * @throws WaypointRingNotEnteredException if a ring is not entered.
     82      */
     83     public abstract void additionalChecks(float[] coordinates)
     84             throws WaypointStartPointException, WaypointDistanceException,
     85             WaypointAreaCoveredException, WaypointRingNotEnteredException;
     86 
     87     /**
     88      * Removes the last maker in the current path.
     89      *
     90      * @return true of the first marker false if any other marker.
     91      */
     92     public boolean removeLastMarker() {
     93         Waypoint markerToRemove = mPathMarkers.get(mPathMarkers.size() - 1);
     94         mCurrentPath.remove(markerToRemove);
     95         mPathMarkers.remove(markerToRemove);
     96         return false;
     97     }
     98 
     99     /**
    100      * Returns the current path.
    101      */
    102     public ArrayList<Waypoint> getCurrentPath() {
    103         return new ArrayList<>(mCurrentPath);
    104     }
    105 
    106     /**
    107      * Returns the markers for the current path.
    108      */
    109     public ArrayList<Waypoint> getPathMarkers() {
    110         return new ArrayList<>(mPathMarkers);
    111     }
    112 
    113     /**
    114      * Returns the size of the path.
    115      */
    116     public int getCurrentPathSize() {
    117         return mCurrentPath.size();
    118     }
    119 
    120     /**
    121      * Returns the number if markers.
    122      */
    123     public int getPathMarkersSize() {
    124         return mPathMarkers.size();
    125     }
    126 }
    127