/*
 * Copyright 2016 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.
 */

package android.hardware.wifi.offload@1.0;

import IOffloadCallback;

interface IOffload {
    /**
     * Configure the offload module to perform scans and filter results
     * Scans must not be triggered due to configuration of the module.
     *
     * @param ScanParam paramters for scanning
     * @param ScanFilter settings to filter scan result
     * @return OffloadStatus indicating status of operation provided by this API
     * If OffloadStatusCode::OK is returned, the operation was successful
     * If OffloadStatusCode::NO_CONNECTION is returned, connection to the hardware is lost
     * If OffloadStatusCode::ERROR is returned, requested operation could not be completed
     */
    @entry
    @callflow(next={"setEventCallback", "subscribeScanResults"})
    configureScans(ScanParam param, ScanFilter filter) generates (OffloadStatus status);

    /**
     * Get scan statistics
     *
     * @return OffloadStatus indicating status of operation provided by this API
     * @return ScanStats statistics of scans performed
     * If OffloadStatusCode::OK is returned, the operation was successful
     * If OffloadStatusCode::NO_CONNECTION is returned, connection to the hardware is lost
     * If OffloadStatusCode::ERROR is returned, requested operation could not be completed
     * If OffloadStatusCode::TIMEOUT is returned, time out waiting for the requested data
     */
    @exit
    @callflow(next={"subscribeScanResults", "unsubscribeScanResults", "getScanStats"})
    getScanStats() generates (OffloadStatus status, ScanStats scanStats);

    /**
     * Subscribe to asynchronous scan events sent by offload module. This enables
     * offload scans to be performed as per scan parameters, filtering the scan
     * results based on configured scan filter and delivering the results after
     * at least delayMs milliseconds from this call. If the client is already
     * subscribed to the scan results, a call to this API must be a no-op.
     *
     * @param delayMs an integer expressing the minimum delay in mS after
     *        subscribing when scan results must be delivered to the client
     * @return OffloadStatus indicating status of operation provided by this API
     * If OffloadStatusCode::OK is returned, the operation was successful
     * If OffloadStatusCode::NO_CONNECTION is returned, connection to the hardware is lost
     * If OffloadStatusCode::ERROR is returned, requested operation could not be completed
     */
    @callflow(next={"unsubscribeScanResults", "getScanStats"})
    subscribeScanResults(uint32_t delayMs) generates (OffloadStatus status);

    /**
     * Unsubscribe to scan events sent by the offload module, hence disabling scans.
     * If the client is already unsubscribed, a call to this API will be a no-op.
     */
    @exit
    @callflow(next={"*"})
    unsubscribeScanResults();

    /**
     * Setup the HIDL interface for reporting asynchronous scan events. A maximum
     * of one callback interface is supported. Only one callback must be registered
     * at any given time. If two consecutive calls are made with different callback
     * interface objects, the latest one must be used to deliver events to client.
     *
     * @param cb An instance of the |IOffloadCallback| HIDL interface object
     */
    @entry
    @callflow(next={"subscribeScanStats", "configureScans"})
    setEventCallback(IOffloadCallback cb);
};
