/*
 * Copyright (C) 2011 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.
 */

#ifndef HW_EMULATOR_CAMERA_EMULATED_FAKE_CAMERA_DEVICE_H
#define HW_EMULATOR_CAMERA_EMULATED_FAKE_CAMERA_DEVICE_H

/*
 * Contains declaration of a class EmulatedFakeCameraDevice that encapsulates
 * a fake camera device.
 */

#include "Converters.h"
#include "EmulatedCameraDevice.h"

/* This is used for debugging format / conversion issues. If EFCD_ROTATE_FRAME is
 * set to 0, the frame content will be always the "checkerboard". Otherwise, if
 * EFCD_ROTATE_FRAME is set to a non-zero value, the frame content will "rotate"
 * from a "checkerboard" frame to a "white/red/green/blue stripes" frame, to a
 * "white/red/green/blue" frame. Frame content rotation helps finding bugs in
 * format conversions.
 */
#define EFCD_ROTATE_FRAME   0

namespace android {

class EmulatedFakeCamera;

/* Encapsulates a fake camera device.
 * Fake camera device emulates a camera device by providing frames containing
 * a black and white checker board, moving diagonally towards the 0,0 corner.
 * There is also a green, or red square that bounces inside the frame, changing
 * its color when bouncing off the 0,0 corner.
 */
class EmulatedFakeCameraDevice : public EmulatedCameraDevice {
public:
    /* Constructs EmulatedFakeCameraDevice instance. */
    explicit EmulatedFakeCameraDevice(EmulatedFakeCamera* camera_hal);

    /* Destructs EmulatedFakeCameraDevice instance. */
    ~EmulatedFakeCameraDevice();

    /***************************************************************************
     * Emulated camera device abstract interface implementation.
     * See declarations of these methods in EmulatedCameraDevice class for
     * information on each of these methods.
     **************************************************************************/

public:
    /* Connects to the camera device.
     * Since there is no real device to connect to, this method does nothing,
     * but changes the state.
     */
    status_t connectDevice();

    /* Disconnects from the camera device.
     * Since there is no real device to disconnect from, this method does
     * nothing, but changes the state.
     */
    status_t disconnectDevice();

    /* Starts the camera device. */
    status_t startDevice(int width, int height, uint32_t pix_fmt);

    /* Stops the camera device. */
    status_t stopDevice();

    /***************************************************************************
     * Worker thread management overrides.
     * See declarations of these methods in EmulatedCameraDevice class for
     * information on each of these methods.
     **************************************************************************/

protected:
    /* Implementation of the frame production routine. */
    bool produceFrame(void* buffer, int64_t* timestamp) override;

    /****************************************************************************
     * Fake camera device private API
     ***************************************************************************/

private:

    /* Draws a black and white checker board in |buffer| with the assumption
     * that the size of buffer matches the current frame buffer size. */
    void drawCheckerboard(void* buffer);

    /* Draws a square of the given color in the current frame buffer.
     * Param:
     *  x, y - Coordinates of the top left corner of the square in the buffer.
     *  size - Size of the square's side.
     *  color - Square's color.
     */
    void drawSquare(void* buffer, int x, int y, int size, const YUVPixel* color);

#if EFCD_ROTATE_FRAME
    void drawSolid(void* buffer, YUVPixel* color);
    void drawStripes(void* buffer);
    int rotateFrame();
#endif  // EFCD_ROTATE_FRAME

    /****************************************************************************
     * Fake camera device data members
     ***************************************************************************/

private:
    /*
     * Pixel colors in YUV format used when drawing the checker board.
     */

    YUVPixel    mBlackYUV;
    YUVPixel    mWhiteYUV;
    YUVPixel    mRedYUV;
    YUVPixel    mGreenYUV;
    YUVPixel    mBlueYUV;
    YUVPixel*   mSquareColor;

    /* Last time the frame has been redrawn. */
    nsecs_t     mLastRedrawn;

    /*
     * Precalculated values related to U/V panes.
     */

    /* U pane inside the framebuffer. */
    ptrdiff_t   mFrameUOffset;

    /* V pane inside the framebuffer. */
    ptrdiff_t   mFrameVOffset;

    /* Defines byte distance between adjacent U, and V values. */
    int         mUVStep;

    /* Defines number of Us and Vs in a row inside the U/V panes.
     * Note that if U/V panes are interleaved, this value reflects the total
     * number of both, Us and Vs in a single row in the interleaved UV pane. */
    int         mUVInRow;

    /*
     * Checkerboard drawing related stuff
     */
    nsecs_t     mLastColorChange;

    double      mCheckX;
    double      mCheckY;
    double      mSquareX;
    double      mSquareY;
    double      mSquareXSpeed;
    double      mSquareYSpeed;

#if EFCD_ROTATE_FRAME
    /* Frame rotation frequency in nanosec (currently - 3 sec) */
    static const nsecs_t    mRotateFreq = 3000000000LL;

    /* Last time the frame has rotated. */
    nsecs_t     mLastRotatedAt;

    /* Type of the frame to display in the current rotation:
     *  0 - Checkerboard.
     *  1 - White/Red/Green/Blue horisontal stripes
     *  2 - Solid color. */
    int         mCurrentFrameType;

    /* Color to use to paint the solid color frame. Colors will rotate between
     * white, red, gree, and blue each time rotation comes to the solid color
     * frame. */
    YUVPixel*   mCurrentColor;
#endif  // EFCD_ROTATE_FRAME
};

}; /* namespace android */

#endif  /* HW_EMULATOR_CAMERA_EMULATED_FAKE_CAMERA_DEVICE_H */
