kerneltest/e32test/examples/camera1/camera1.h
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:26:05 +0100
branchRCL_3
changeset 136 743008598095
parent 0 a41df078684a
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// Copyright (c) 2005-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:
// in its implementation.
// 
//

/**
 @file The interface to an example camera device driver which uses Shared Chunks
 @publishedPartner
 @prototype 9.1
*/

#ifndef __CAMERA1_H__
#define __CAMERA1_H__

#include <e32cmn.h>
#include <e32ver.h>
#ifndef __KERNEL_MODE__
#include <e32std.h>
#endif

/**
User interface for 'Camera1'
*/
class RCamera1 : public RBusLogicalChannel
	{
public:
	/**
	Structure for holding driver capabilities information
	(Just a version number in this example.)
	*/
	class TCaps
		{
	public:
		TVersion iVersion;
		};

	/**
	Structure for holding driver configuration data
	*/
	class TConfig
		{
	public:
		TSize iImageSize;			/**< Size of image in pixels */
		TInt iImageBytesPerPixel;	/**< Number of bytes used to represent a single pixel */
		TInt iFrameRate;			/**< Speed to capture images at in frames per second*/
		TInt iNumImageBuffers;		/**< Number of simultanious images the client wishes to process */
		};
	typedef TPckgBuf<TConfig> TConfigBuf;

#ifndef __KERNEL_MODE__
public:
	TInt Open();
	void Close();
	TInt GetConfig(TConfigBuf& aConfig);
	TInt SetConfig(const TConfigBuf& aConfig);
	TInt StartCapture();
	TInt EndCapture();
	void CaptureImage(TRequestStatus& aStatus, TInt aReleaseImage=-1);
	void CaptureImageCancel();
	TInt ReleaseImage(TInt aReleaseImage);
	TInt Duplicate(const RThread& aSrc,TOwnerType aType=EOwnerProcess);
	inline RChunk ImageChunk() const;
private:
	RChunk iChunk;   /**< The chunk into which captured images will be placed */
#endif

public:
	inline static const TDesC& Name();
	inline static TVersion VersionRequired();

private:
	/**
	Enumeration of Control messages.
	*/
	enum TControl
		{
		EGetConfig,
		ESetConfig,
		EStartCapture,
		EEndCapture,
		ECaptureImage,
		EReleaseImage
		};

	/**
	Enumeration of Request messages.
	(None used in this example)
	*/
	enum TRequest
		{
		ENumRequests,
		EAllRequests = (1<<ENumRequests)-1
		};

	// Kernel side LDD channel is a friend
	friend class DCamera1Channel;
	};

/**
  The driver's name

  @return The name of the driver

  @internalComponent
*/
inline const TDesC& RCamera1::Name()
	{
	_LIT(KCamera1Name,"CAMERA1");
	return KCamera1Name;
	}

/**
  The driver's version

  @return The version number of the driver

  @internalComponent
*/
inline TVersion RCamera1::VersionRequired()
	{
	const TInt KMajorVersionNumber=1;
	const TInt KMinorVersionNumber=0;
	const TInt KBuildVersionNumber=KE32BuildVersionNumber;
	return TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber);
	}

/*
  NOTE: The following methods would normally be exported from a seperate client DLL
  but are included inline in this header file for convenience.
*/

#ifndef __KERNEL_MODE__

/**
  Open a logical channel to the driver

  @return One of the system wide error codes.
*/
TInt RCamera1::Open()
	{
	return DoCreate(Name(),VersionRequired(),KNullUnit,NULL,NULL,EOwnerProcess);
	}

/**
  Close a logical channel to the driver
*/
void RCamera1::Close()
	{
	iChunk.Close();
	RBusLogicalChannel::Close();
	}

/**
  Get the current configuration settings.

  @param aConfig A structure which will be filled with the configuration settings.

  @return KErrNone
*/
TInt RCamera1::GetConfig(TConfigBuf& aConfig)
	{
	return DoControl(EGetConfig,(TAny*)&aConfig);
	}

/**
  Set the current configuration settings.

  @param aConfig The new configuration settings to be used.

  @return KErrInUse if image capturing is already in progress
          KErrArgument if any configuration values are invalid.
		  KErrNone otherwise

  @post On success, iChunk will contain the handle of the chunk used to
        contain captured images.
*/
TInt RCamera1::SetConfig(const TConfigBuf& aConfig)
	{
	iChunk.Close(); // The following call will give us a new handle
	return iChunk.SetReturnedHandle(DoControl(ESetConfig,(TAny*)&aConfig));
	}

/**
  Start the image capture process.

  @return KErrNotReady if SetConfig() has not been previously called.
          KErrNone otherwise.

  @pre The driver must have been previousely initialised by a call to SetConfig()
*/
TInt RCamera1::StartCapture()
	{
	return DoControl(EStartCapture);
	}

/**
  End the image capturing process.
  Also performs CaptureImageCancel()
*/
TInt RCamera1::EndCapture()
	{
	return DoControl(EEndCapture);
	}

/**
  Get the next available image and optionally release an already captured image.
  Only one request may be pending at any time.

  @param aStatus The request status signaled when an image is available (or on error).
                 The result value is the offset within iChunk where the capture image resides;
		         or set to one of the system wide error codes when an error occurs:
				 KErrNotReady if StartCapture() hasn't been previousely called,
				 KErrInUse if there is already a pending CaptureImage() request,
				 KErrOverflow if the client already has all the images buffers.

  @param aReleaseImage The chunk offset of an image which the client has finished processing.
                       Set to -1 to indicate 'no image'

  @pre Image capturing must have been started with StartCapture()
*/
void RCamera1::CaptureImage(TRequestStatus& aStatus,TInt aReleaseImage)
	{
	aStatus=KRequestPending;
	DoControl(ECaptureImage,(TAny*)&aStatus,(TAny*)aReleaseImage);
	}

/**
  Cancel a previous CaptureImage() request
*/
void RCamera1::CaptureImageCancel()
	{
	DoCancel(1<<ECaptureImage);
	}

/**
  Release an already captured image.

  This makes the images buffer available again for the driver to capture images into.

  @param aReleaseImage The chunk offset of the image to be released.
                       This is a value returned by a CaptureImage() request.
*/
TInt RCamera1::ReleaseImage(TInt aReleaseImage)
	{
	return DoControl(EReleaseImage,(TAny*)aReleaseImage);
	}

/**
  Override of RHandleBase::Duplicate.
  This takes care of also duplicating other resources owned by this object.
  @param aSrc  A reference to the thread containing the handle which is to be 
               duplicated for this thread.
  @param aType An enumeration whose enumerators define the ownership of this 
               handle. If not explicitly specified, EOwnerProcess is taken
               as default.
  @return KErrNone, if successful; otherwise, one of the other system wide error 
          codes.
  @see RHandleBase::Duplicate
*/
TInt RCamera1::Duplicate(const RThread& aSrc,TOwnerType aType)
	{
	// Duplicate handle to channel
	TInt r=RHandleBase::Duplicate(aSrc,aType);
	if(r==KErrNone && iChunk.Handle()!=KNullHandle)
		{
		// Duplicate handle to chunk
		r = iChunk.Duplicate(aSrc,aType);
		if(r!=KErrNone)
			RHandleBase::Close(); // Undo channel open
		}
	if(r!=KErrNone)
		iChunk.SetHandle(KNullHandle); // On error, clear chunk handle
	return r;
	}

/**
  Obtain the chunk into which captured images will be placed.
  This chunk may change after calls to SetConfig().

  @return The chunk

  @pre The driver must have been configured using SetConfig()
*/
inline RChunk RCamera1::ImageChunk() const
	{
	return iChunk;
	}

#endif  // !__KERNEL_MODE__

#endif