bsptemplate/asspandvariant/template_variant/camerasc/camerasc_plat.h
author Mike Kinghan <mikek@symbian.org>
Thu, 25 Nov 2010 14:35:45 +0000
branchGCC_SURGE
changeset 305 1ba12ef4ef89
parent 31 56f325a607ea
child 258 880ff05ad710
permissions -rw-r--r--
Enhance the base/rom extension to generate the symbol file of the rom built. The symbol file is placed in epoc32/rom/<baseport_name>, along with the rom log and final oby file.

// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
// template\template_variant\camerasc\camerasc_plat.h
// Implementation of the Template shared chunk camera physical device driver (PDD).
// This file is part of the Template Base port
// 
//

#ifndef __CAMERASC_PLAT_H__
#define __CAMERASC_PLAT_H__

#include <drivers/camerasc.h>
#include <pixelformats.h>

// Comment out the first #define, and uncomment the second #define in order to have debug
// output for the shared chunk camera driver
#define __KTRACE_CAM(s)
//#define __KTRACE_CAM(s) s

/** Total number of image capture requests that can be handled by the sensor at one time */
const TInt KTotalCameraRequests = 2;

/** NaviEngine specific panics that can be thrown by the shared chunk camera driver */
enum TTemplateCameraScPddPanic
	{
	/** Start() has been called before SetConfig() */
	ENotConfigured,
	/** Unable to power down the camera hardware */
	ECannotPowerDown,
	/** Buffer passed to DSensorIf::FrameSizeCaps() by LDD is too small */
	ECapsBufferTooSmall
	};

/**
The physical device (factory class) for the NaviEngine shared chunk camera driver.

This class is used by the device driver framework to instantiate one or more shared chunk camera driver
PDDs.  An instance of one PDD is allowed for each physical sensor on the device.
*/
class DTemplateCameraScPddFactory : public DPhysicalDevice
	{
public:

	DTemplateCameraScPddFactory();
	~DTemplateCameraScPddFactory();
	virtual TInt Install();
	virtual void GetCaps(TDes8 &aDes) const;
	virtual TInt Create(DBase*& aChannel, TInt aUnit, const TDesC8* anInfo, const TVersion &aVer);
	virtual TInt Validate(TInt aUnit, const TDesC8* anInfo, const TVersion &aVer);
	TBool IsUnitOpen(TInt aUnit);
	TInt SetUnitOpen(TInt aUnit, TBool aIsOpen);

private:

	/** The DFC queue to be used by both the LDD and the PDD to serialise access to the PDD. */
	TDynamicDfcQue*	iDfcQ;
	/** Mask to keep track of which units have a channel open on them. */
	TUint			iUnitsOpenMask;
	/** A mutex to protect access to the unit information mask. */
	NFastMutex		iUnitInfoMutex;

	friend class DTemplateCameraScPdd;
	};

/**
Defines the interface for notification of an image being captured.

Used by concrete instances of the DSensorIf abstract base class in order to notify an observer class
(typically an DCameraScPdd derived class) that an image has been captured for processing.
*/
class MSensorObserver
	{
public:

	virtual TInt NotifyImageCaptureEvent(TInt aResult, TLinAddr& aLinAddr, TPhysAddr& aPhysAddr) = 0;
	};

/**
Defines an abstract base class for implementing concrete classes for camera sensors.

This class provides an abstract interface to the sensor;  one class is derived from this and implemented
for each sensor available to the camera driver.
*/
class DSensorIf : public DBase
	{
public:

	/**
	Second phase constructor for the sensor interface.  Acquires any resources required for communication with the sensor.
	When this returns, the sensor is ready for use.
	*/
	virtual TInt DoCreate() = 0;

	/**
	Obtains information regarding the frame sizes and frame rates supported for a given combination of capture mode and pixel format.
	@param	aCaptureMode		The capture mode for which to obtain the information.
	@param	aUidPixelFormat		The pixel format for which to obtain the information.
	@param	aFrameSizeCapsBuf	A referenced to an array of packaged SDevCamFrameSize structures into which to place the information.
	@return	KErrNone if successful, else one of the other system wide error codes.
	*/
	virtual TInt FrameSizeCaps(TDevCamCaptureMode aCaptureMode, TUidPixelFormat aUidPixelFormat, TDes8& aFrameSizeCapsBuf) = 0;

	/**
	Obtains the capabilities of the sensor.  This either interrogates the sensor to find out its capabilities, or hard codes
	them into aCameraCaps, or a combination of the two.
	@param	aCameraCaps		A reference to a ptr to the structure into which to place the capabilities of the sensor.
							This structure is of a variable size and contains the fixed part, followed by an array of
							SDevCamPixelFormat structures.
	@return	The size of the variable length structure pointed to by aCameraCaps if successful, else one of the other
			system wide error codes.
	*/
	virtual TInt GetCaps(TCameraCapsV02*& aCameraCaps) = 0;

	/**
	Powers up the sensor.
	*/
	virtual TInt RequestPower() = 0;

	/**
	Powers down the sensor.
	*/
	virtual TInt RelinquishPower() = 0;

	/**
	Configures the sensor for capture in the configuration previously set by SetConfig(), and begins capture into the
	address pointed to by aLinAddr and aPhysAddr.  Both of these addresses point to the same buffer;  The address used
	by the sensor is hardware dependent.
	@param	aCaptureMode	Whether to capture in video, viewfinder or single image mode.
	@param	aLinAddr		The virtual address of the buffer into which to capture the image.
	@param	aPhysAddr		The physical address of the buffer into which to capture the image.
	@return	KErrNone if successful, otherwise one of the other system wide error codes.
	@pre	SetConfig() must first have been called.
	*/
	virtual TInt Start(TDevCamCaptureMode aCaptureMode, TLinAddr aLinAddr, TPhysAddr aPhysAddr) = 0;

	/**
	Sets the address of the buffer into which the next image will be captured.  If is common for this to be called by Start() as
	well as by the class that owns the sensor interface.
	@param	aLinAddr		The virtual address of the buffer into which to capture the image.
	@param	aPhysAddr		The physical address of the buffer into which to capture the image.
	@return	KErrNone if successful, otherwise one of the other system wide error codes.
	@pre	Start() must first have been called.
	*/
	virtual TInt CaptureNextImage(TLinAddr aLinAddr, TPhysAddr aPhysAddr) = 0;

	/**
	Stops any image capturing that is currently underway.  It is safe to call this without having called Start().
	@return	KErrNone if successful, otherwise one of the other system wide error codes.
	*/
	virtual TInt Stop() = 0;

	/**
	Saves a configuration specifying such details as dimensions and pixel format in which the sensor should
	capture images.  The shared implementation of this contains generic code, but this can be overridden by
	derived classes if desired.
	@param	aConfig	A TCameraConfigV02 structure containing the settings to be used.
	@return	KErrNone if successful, otherwise one of the other system wide error codes.
	*/
	virtual TInt SetConfig(const TCameraConfigV02& aConfig);

protected:

	/** Pointer to the observer to call when a frame of data is available */
	MSensorObserver*	iObserver;
	/** ETrue if capture is under way, else EFalse*/
	TBool				iEnabled;
	/** Width of the frames to be captured in pixels */
	TInt				iWidth;
	/** Height of the frames to be captured in pixels */
	TInt				iHeight;
	/** Number of bytes from the start of one line to the start of the next */
	TInt				iLineOffset;
	/** The number of requests setup ready for transfer */
	TInt				iPendingRequests;
	/** The next request to be setup ready for transfer */
	TUint				iNextRequest;
	/** The configuration in which to capture images */
	TCameraConfigV02	iConfig;
	};

/**
This class provides an abstract interface to the Template sensor.
*/
class DTemplateSensorIf : public DSensorIf
	{
public:

	DTemplateSensorIf(MSensorObserver& aObserver, TDfcQue* aDFCQueue);
	TInt DoCreate();
	~DTemplateSensorIf();
	TInt BufferDoneCallback(TInt aResult);
	void FillBuffer(TLinAddr aBuffer);
	TInt FrameSizeCaps(TDevCamCaptureMode aCaptureMode, TUidPixelFormat aUidPixelFormat, TDes8& aFrameSizeCapsBuf);
	TInt GetCaps(TCameraCapsV02*& aCameraCaps);
	TInt RequestPower();
	TInt RelinquishPower();
	TInt Start(TDevCamCaptureMode aCaptureMode, TLinAddr aLinAddr, TPhysAddr aPhysAddr);
	TInt Stop();
	TInt CaptureNextImage(TLinAddr aLinAddr, TPhysAddr aPhysAddr);

	// Static callbacks for various sensor related asynchronous functions
	static TInt HostPowerCallback(TAny* aPtr, TAny* aPoweredUp);
	static TInt SensorClkReqCallback(TAny* aPtr);

private:

	/** X position at which to display the logo */
	TInt		iX;
	/** Y position at which to display the logo */
	TInt		iY;
	/** Current X direction and speed at which the logo is moving */
	TInt		iXDirection;
	/** Current Y direction and speed at which the logo is moving */
	TInt		iYDirection;
	/** Number of nanokernel ticks that represent the time to capture one frame */
	TInt		iImageTimerTicks;
	/** Timers used for emulating images being captured */
	NTimer		iImageTimers[KTotalCameraRequests];
	/** DFC queue used for completing image capture requests */
	TDfcQue*	iDFCQueue;
	/** DFCs used for image capture timer callbacks happeing in our DFC thread */
	TDfc		*iImageTimerDFCs[KTotalCameraRequests];
    
    /* Used for cheesy animation effect */
    TUint8 iCounter;
    TBool iFlipSwitch;
	};

/**
The physical device driver for the NaviEngine shared chunk camera driver.

This is the concrete implementation of the abstract DCameraScPdd base class.  One instance of this
class will be created by the factory class per physical sensor on the device.  Only one instance
per sensor can be instantiated at any given time.  Access to the sensor itself is achieved via the
appropriate DSensorIf derived class.
*/
class DTemplateCameraScPdd : public DCameraScPdd, public MSensorObserver
	{
private:

	/** States in which the channel can be */
	enum TState
		{
		/** Channel created but not yet configured */
		EUnconfigured,
		/** Channel configured but idle and not capturing images */
		EConfigured,
		/** Channel capturing images */
		ECapturing
		};

public:

	DTemplateCameraScPdd();
	TInt DoCreate(DTemplateCameraScPddFactory* aPhysicalDevice, TInt aUnit);
	~DTemplateCameraScPdd();
	TDfcQue* DfcQ(TInt aUnit);
	void Caps(TDes8& aCapsBuf) const;
	void GetChunkCreateInfo(TChunkCreateInfo& aChunkCreateInfo);
	TInt SetConfig(const TDesC8& aConfigBuf);
	TInt Start(TDevCamCaptureMode aCaptureMode,TLinAddr aLinAddr, TPhysAddr aPhysAddr);
	TInt CaptureNextImage(TLinAddr aLinAddr, TPhysAddr aPhysAddr);
	TInt Stop();
	void PowerDown();
	TInt CapsSize();
	TInt FrameSizeCaps(TDevCamCaptureMode aCaptureMode, TUidPixelFormat aUidPixelFormat, TDes8& aFrameSizeCapsBuf);

	/**
	Sets the sensor brightness to the desired setting.

	@param aValue A verified brightness setting.
	@return KErrNone if successful, KErrNotSupported if not supported.
	*/
	TInt SetBrightness(TUint aBrightness);

	/**
	Sets the sensor contrast to the desired setting.

	@param aValue A verified contrast setting.
	@return KErrNone if successful, KErrNotSupported if not supported.
	*/
	TInt SetContrast(TUint aContrast);

	/**
	Sets the sensor color effect to the desired setting.

	@param aValue A verified color effect setting.
	@return KErrNone if successful, KErrNotSupported if not supported.
	*/
	TInt SetColorEffect(TUint aColorEffect);

private:

	TInt NotifyImageCaptureEvent(TInt aResult, TLinAddr& aLinAddr, TPhysAddr& aPhysAddr);

private:

	/** The unit number of this channel.  The unit number determines the sensor used. */
	TInt						iUnit;
	/** A pointer to the PDD factory that created this device. */
	DTemplateCameraScPddFactory* iPhysicalDevice;
	/** Ptr to a buffer large enough to hold the variable sized capabilities structure. */
	TUint8*						iCapsBuffer;
	/** The size of the variable sized capabilities structure. */
	TUint						iCapsSize;
	/** The capabilities of this device. */
	TCameraCapsV02*				iCaps;
	/** The current configuration of this device. */
	TCameraConfigV02			iConfig;
	/** The current capture mode of the camera. */
	TDevCamCaptureMode			iCaptureMode;
	/** Abstracted interface to the sensor */
	DSensorIf*					iSensor;
	/** Current state of the channel (configured, capturing etc) */
	TState						iState;
	};

/**
XXX - This structure holds information pertaining to the logo to be rendered in
"photos" returned by the template camera driver.  This structure is temporary and
should be removed when changing this template into a "real" camera driver.
*/
struct SLogo
	{
	TUint	iWidth;
	TUint	iHeight;
	TUint8	iPixelData[80 * 61 * 3 + 1];
    TUint8  iPixelData2[80 * 61 * 3 + 1];
	};

#endif /* __CAMERASC_PLAT_H__ */