/*
 * Copyright (C) 2019 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.automotive.can@1.0;

import ICanErrorListener;
import ICanMessageListener;
import ICloseHandle;

/**
 * Represents a CAN bus interface that's up and configured.
 *
 * Configuration part is done in ICanController.
 */
interface ICanBus {
    /**
     * Send CAN message.
     *
     * @param message CAN message to send out
     * @return result OK in the case of success
     *                PAYLOAD_TOO_LONG if the payload is too long
     *                INTERFACE_DOWN if the bus is down
     *                TRANSMISSION_FAILURE in case of transmission failure
     */
    send(CanMessage message) generates (Result result);

    /**
     * Requests HAL implementation to listen for specific CAN messages.
     *
     * HAL is responsible for maintaining listener set and sending out messages
     * to each listener that matches given filter against received message.
     *
     * Empty filter list means no filtering. If two or more listeners requested
     * different filters, HAL server must merge these to fulfill the superset of
     * these filters. HAL must not send out a message to a listener which filter
     * doesn't match given message id.
     *
     * If filtering is not supported at the hardware level (what's strongly
     * recommended), it must be covered in the HAL.
     *
     * @param filter The set of requested filters
     * @param listener The interface to receive the messages on
     * @return result OK in the case of success
     *                INTERFACE_DOWN if the bus is down
     * @return close A handle to call in order to remove the listener
     */
    listen(vec<CanMessageFilter> filter, ICanMessageListener listener)
            generates (Result result, ICloseHandle close);

    /**
     * Adds a new listener for CAN bus or interface errors.
     *
     * If the error is fatal, the client is supposed to drop any references to
     * this specific ICanBus instance (see ICanErrorListener).
     *
     * @param listener The interface to receive the error events on
     * @return close A handle to call in order to remove the listener
     */
    listenForErrors(ICanErrorListener listener) generates (ICloseHandle close);
};
