# Copyright 2014 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import its.image
import its.caps
import its.device
import its.objects
import its.target
import time
import pylab
import os.path
import matplotlib
import matplotlib.pyplot
import numpy

def main():
    """Test if the gyro has stable output when device is stationary.
    """
    NAME = os.path.basename(__file__).split(".")[0]

    # Number of samples averaged together, in the plot.
    N = 20

    # Pass/fail thresholds for gyro drift
    MEAN_THRESH = 0.01
    VAR_THRESH = 0.001

    with its.device.ItsSession() as cam:
        props = cam.get_camera_properties()
        # Only run test if the appropriate caps are claimed.
        its.caps.skip_unless(its.caps.sensor_fusion(props))

        print "Collecting gyro events"
        cam.start_sensor_events()
        time.sleep(5)
        gyro_events = cam.get_sensor_events()["gyro"]

    nevents = (len(gyro_events) / N) * N
    gyro_events = gyro_events[:nevents]
    times = numpy.array([(e["time"] - gyro_events[0]["time"])/1000000000.0
                         for e in gyro_events])
    xs = numpy.array([e["x"] for e in gyro_events])
    ys = numpy.array([e["y"] for e in gyro_events])
    zs = numpy.array([e["z"] for e in gyro_events])

    # Group samples into size-N groups and average each together, to get rid
    # of individual random spikes in the data.
    times = times[N/2::N]
    xs = xs.reshape(nevents/N, N).mean(1)
    ys = ys.reshape(nevents/N, N).mean(1)
    zs = zs.reshape(nevents/N, N).mean(1)

    pylab.plot(times, xs, 'r', label="x")
    pylab.plot(times, ys, 'g', label="y")
    pylab.plot(times, zs, 'b', label="z")
    pylab.xlabel("Time (seconds)")
    pylab.ylabel("Gyro readings (mean of %d samples)"%(N))
    pylab.legend()
    matplotlib.pyplot.savefig("%s_plot.png" % (NAME))

    for samples in [xs,ys,zs]:
        assert(samples.mean() < MEAN_THRESH)
        assert(numpy.var(samples) < VAR_THRESH)

if __name__ == '__main__':
    main()

