/*
// Copyright (c) 2014 Intel Corporation 
//
// 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 PHYSICAL_DEVICE_H
#define PHYSICAL_DEVICE_H

#include <DisplayPlane.h>
#include <IVsyncControl.h>
#include <IBlankControl.h>
#include <IPrepareListener.h>
#include <VsyncEventObserver.h>
#include <HwcLayerList.h>
#include <Drm.h>
#include <IDisplayDevice.h>

namespace android {
namespace intel {

class IHdcpControl;

class DeviceControlFactory {
public:
    virtual ~DeviceControlFactory(){}
public:
    virtual IVsyncControl* createVsyncControl() = 0;
    virtual IBlankControl* createBlankControl() = 0;
    virtual IHdcpControl* createHdcpControl() = 0;
};

class Hwcomposer;

// Base class for primary and external devices
class PhysicalDevice : public IDisplayDevice {
public:
    PhysicalDevice(uint32_t type, Hwcomposer& hwc, DeviceControlFactory* controlFactory);
    virtual ~PhysicalDevice();
public:
    virtual bool prePrepare(hwc_display_contents_1_t *display);
    virtual bool prepare(hwc_display_contents_1_t *display);
    virtual bool commit(hwc_display_contents_1_t *display, IDisplayContext *context);

    virtual bool vsyncControl(bool enabled);
    virtual bool blank(bool blank);
    virtual bool getDisplaySize(int *width, int *height);
    virtual bool getDisplayConfigs(uint32_t *configs,
                                       size_t *numConfigs);
    virtual bool getDisplayAttributes(uint32_t config,
                                          const uint32_t *attributes,
                                          int32_t *values);
    virtual bool compositionComplete();

    virtual bool setPowerMode(int mode);
    virtual int  getActiveConfig();
    virtual bool setActiveConfig(int index);

    // display config operations
    virtual void removeDisplayConfigs();
    virtual bool detectDisplayConfigs();

    // device related operations
    virtual bool initCheck() const { return mInitialized; }
    virtual bool initialize();
    virtual void deinitialize();
    virtual bool isConnected() const;
    virtual const char* getName() const;
    virtual int getType() const;
    virtual uint32_t getFpsDivider();

    //events
    virtual void onVsync(int64_t timestamp);

    virtual void dump(Dump& d);

protected:
    void onGeometryChanged(hwc_display_contents_1_t *list);
    bool updateDisplayConfigs();
    IVsyncControl* createVsyncControl() {return mControlFactory->createVsyncControl();}
    friend class VsyncEventObserver;

protected:
    uint32_t mType;
    const char *mName;

    Hwcomposer& mHwc;

    // display configs
    Vector<DisplayConfig*> mDisplayConfigs;
    int mActiveDisplayConfig;


    IBlankControl *mBlankControl;
    VsyncEventObserver *mVsyncObserver;

    DeviceControlFactory *mControlFactory;

    // layer list
    HwcLayerList *mLayerList;
    bool mConnected;
    bool mBlank;

    // lock
    Mutex mLock;

    // DPMS on (1) or off (0)
    int mDisplayState;
    bool mInitialized;
    uint32_t mFpsDivider;
};



}
}

#endif /* PHYSICAL_DEVICE_H */
