/* Copyright (C) 2015 The Android Open Source Project
 **
 ** This software is licensed under the terms of the GNU General Public
 ** License version 2, as published by the Free Software Foundation, and
 ** may be copied, distributed, and modified under those terms.
 **
 ** This program is distributed in the hope that it will be useful,
 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ** GNU General Public License for more details.
 */

#include "android/automation/AutomationController.h"
#include "android/emulation/control/sensors_agent.h"

#include "android/hw-sensors.h"

int physical_parameter_target_set(int parameterId,
                                  float a,
                                  float b,
                                  float c,
                                  int interpolation_method) {
    return android_physical_model_set(parameterId, a, b, c,
                                      interpolation_method);
}

int physical_parameter_get(int parameterId,
                           float* a,
                           float* b,
                           float* c,
                           int parameter_value_type) {
    return android_physical_model_get(
            parameterId, a, b, c,
            static_cast<ParameterValueType>(parameter_value_type));
}

int coarse_orientation_set(int orientation) {
    return android_sensors_set_coarse_orientation(
            static_cast<AndroidCoarseOrientation>(orientation), 0.f);
}

int sensor_override_set(int sensorId, float a, float b, float c) {
    return android_sensors_override_set(sensorId, a, b, c);
}

int sensor_get(int sensorId, float* a, float* b, float* c) {
    return android_sensors_get(sensorId, a, b, c);
}

int sensor_get_delay_ms() {
    return android_sensors_get_delay_ms();
}

int physical_state_agent_set(const struct QAndroidPhysicalStateAgent* agent) {
    return android_physical_agent_set(agent);
}

void automation_advance_time() {
    android::automation::AutomationController::tryAdvanceTime();
}

static const QAndroidSensorsAgent sQAndroidSensorsAgent = {
        .setPhysicalParameterTarget = physical_parameter_target_set,
        .getPhysicalParameter = physical_parameter_get,
        .setCoarseOrientation = coarse_orientation_set,
        .setSensorOverride = sensor_override_set,
        .getSensor = sensor_get,
        .getDelayMs = sensor_get_delay_ms,
        .setPhysicalStateAgent = physical_state_agent_set,
        .advanceTime = automation_advance_time};
extern "C" const QAndroidSensorsAgent* const gQAndroidSensorsAgent =
        &sQAndroidSensorsAgent;
