--- a/baseport/syborg/webcamera/webcamera_ldd.cpp Wed Mar 24 13:46:59 2010 +0900
+++ b/baseport/syborg/webcamera/webcamera_ldd.cpp Mon Oct 18 19:39:25 2010 +0900
@@ -17,46 +17,44 @@
#include <kern_priv.h>
#include "webcamera_ldd.h"
-#include <webcamera_driver.h>
#define DP(format...) Kern::Printf(format)
_LIT(KDriver1PanicCategory,"WebcameraDevice");
/**
- *Create Logic device.
- *
+Create Logic device.
*/
DECLARE_STANDARD_LDD()
{
- DP("DECLARE_STANDARD_LDD()");
- return new DWebcameraLogicalDevice;
+ DP("DECLARE_STANDARD_LDD()");
+ return new DWebcameraLogicalDevice;
}
/**
- Constructor
+Constructor
*/
DWebcameraLogicalDevice::DWebcameraLogicalDevice()
{
DP("DWebcameraLogicalDevice()");
- // Set version number for this device
- iVersion=RWebcameraDevice::VersionRequired();
- // Indicate that we work with a PDD
- iParseMask=KDeviceAllowPhysicalDevice;
+ // Set version number for this device
+ iVersion = RWebcameraDevice::VersionRequired();
+ // Indicate that we work with a PDD
+ iParseMask = KDeviceAllowPhysicalDevice;
}
/**
- Destructor
+Destructor
*/
DWebcameraLogicalDevice::~DWebcameraLogicalDevice()
{
}
/**
- Second stage constructor for DDriver1Factory.
- This must at least set a name for the driver object.
+Second stage constructor for DDriver1Factory.
+This must at least set a name for the driver object.
- @return KErrNone if successful, otherwise one of the other system wide error codes.
+@return KErrNone if successful, otherwise one of the other system wide error codes.
*/
TInt DWebcameraLogicalDevice::Install()
{
@@ -66,521 +64,569 @@
}
/**
- Return the drivers capabilities.
- Called in the response to an RDevice::GetCaps() request.
+Return the drivers capabilities.
+Called in the response to an RDevice::GetCaps() request.
- @param aDes User-side descriptor to write capabilities information into
+@param aDes User-side descriptor to write capabilities information into
*/
void DWebcameraLogicalDevice::GetCaps(TDes8& aDes) const
{
- // Create a capabilities object
+ // Create a capabilities object
RWebcameraDevice::TCaps caps;
- caps.iVersion = iVersion;
- // Write it back to user memory
- Kern::InfoCopy(aDes,(TUint8*)&caps,sizeof(caps));
+ caps.iVersion = iVersion;
+ // Write it back to user memory
+ Kern::InfoCopy(aDes, (TUint8*)&caps, sizeof(caps));
}
/**
- Called by the kernel's device driver framework to create a Logical Channel.
- This is called in the context of the user thread (client) which requested the creation of a Logical Channel
- (E.g. through a call to RBusLogicalChannel::DoCreate)
- The thread is in a critical section.
+Called by the kernel's device driver framework to create a Logical Channel.
+This is called in the context of the user thread (client) which requested the creation of a Logical Channel
+(E.g. through a call to RBusLogicalChannel::DoCreate)
+The thread is in a critical section.
- @param aChannel Set to point to the created Logical Channel
-
- @return KErrNone if successful, otherwise one of the other system wide error codes.
+@param aChannel Set to point to the created Logical Channel
+@return KErrNone if successful, otherwise one of the other system wide error codes.
*/
TInt DWebcameraLogicalDevice::Create(DLogicalChannelBase*& aChannel)
{
DP("DWebcameraLogicalDevice::Create() start");
aChannel = new DWebcameraLogicalChannel;
- if(!aChannel)
+ if (!aChannel)
+ {
return KErrNoMemory;
+ }
+ DP("DWebcameraLogicalDevice::Create() end");
return KErrNone;
- DP("DWebcameraLogicalDevice::Create() end");
}
/**
- Constructor
+Constructor
*/
DWebcameraLogicalChannel::DWebcameraLogicalChannel()
- : iReceiveDataDfc(GetOneFlameDfc, this, 1)
- ,iCaptureDfc(CaptureDfc,this,1)
+ : iReceiveDataDfc(GetFlameDfc, this, 1)
+ , iCaptureDfc(CaptureDfc, this, 1)
{
DP("DWebcameraLogicalChannel::DWebcameraLogicalChannel() start");
- // Get pointer to client threads DThread object
- iClient=&Kern::CurrentThread();
- // Open a reference on client thread so it's control block can't dissapear until
- // this driver has finished with it.
+ // Get pointer to client threads DThread object
+ iClient = &Kern::CurrentThread();
+ // Open a reference on client thread so it's control block can't dissapear until
+ // this driver has finished with it.
((DObject*)iClient)->Open();
-
+ iWebCameraState = RWebcameraDevice::EPowerOff;
+
DP("DWebcameraLogicalChannel::DWebcameraLogicalChannel() end");
}
/**
- Destructor
+Destructor
*/
DWebcameraLogicalChannel::~DWebcameraLogicalChannel()
{
DP("DWebcameraLogicalChannel::~DWebcameraLogicalChannel() start");
- // Cancel all processing that we may be doing
- DoCancel(RWebcameraDevice::EAllRequests);
- if (iComm)
- {
- delete iComm;
- }
- if (iChunk)
- {
- Epoc::FreePhysicalRam(iPhysAddr, iSize);
- }
- // Close our reference on the client thread
- Kern::SafeClose((DObject*&)iClient,NULL);
+ // Cancel all processing that we may be doing
+ DoCancel(RWebcameraDevice::EAllRequests);
+ // Close sharedchunks
+ CloseSharedChunks();
+ // Close our reference on the client thread
+ Kern::SafeClose((DObject*&)iClient, NULL);
+
+ delete iConvert;
+
+ // Buffer Free.
+ Kern::Free(iHeaderPtr);
+ Kern::Free(iDataPtr);
+ Kern::Free(iBmpBuf);
DP("DWebcameraLogicalChannel::~DWebcameraLogicalChannel() end");
}
/**
- Called when a user thread requests a handle to this channel.
+Called when a user thread requests a handle to this channel.
*/
TInt DWebcameraLogicalChannel::RequestUserHandle(DThread* aThread, TOwnerType aType)
- {
- // Make sure that only our client can get a handle
- if (aType!=EOwnerThread || aThread!=iClient)
- return KErrAccessDenied;
- return KErrNone;
- }
+ {
+ // Make sure that only our client can get a handle
+ if (aType != EOwnerThread || aThread != iClient)
+ {
+ return KErrAccessDenied;
+ }
+ return KErrNone;
+ }
/**
- Second stage constructor called by the kernel's device driver framework.
- This is called in the context of the user thread (client) which requested the creation of a Logical Channel
- (E.g. through a call to RBusLogicalChannel::DoCreate)
- The thread is in a critical section.
+Second stage constructor called by the kernel's device driver framework.
+This is called in the context of the user thread (client) which requested the creation of a Logical Channel
+(E.g. through a call to RBusLogicalChannel::DoCreate)
+The thread is in a critical section.
- @param aUnit The unit argument supplied by the client
- @param aInfo The info argument supplied by the client
- @param aVer The version argument supplied by the client
+@param aUnit The unit argument supplied by the client
+@param aInfo The info argument supplied by the client
+@param aVer The version argument supplied by the client
- @return KErrNone if successful, otherwise one of the other system wide error codes.
+@return KErrNone if successful, otherwise one of the other system wide error codes.
*/
TInt DWebcameraLogicalChannel::DoCreate(TInt /*aUnit*/, const TDesC8* /*aInfo*/, const TVersion& aVer)
{
DP("DWebcameraLogicalChannel::DoCreate() start");
- if(!Kern::CurrentThreadHasCapability(ECapability_None,__PLATSEC_DIAGNOSTIC_STRING("Checked by Webcamera")))
- {
- return KErrPermissionDenied;
- }
- // Check version
- if (!Kern::QueryVersionSupported(RWebcameraDevice::VersionRequired(),aVer))
+ if (!Kern::CurrentThreadHasCapability(ECapability_None, __PLATSEC_DIAGNOSTIC_STRING("Checked by Webcamera")))
+ {
+ return KErrPermissionDenied;
+ }
+ // Check version
+ if (!Kern::QueryVersionSupported(RWebcameraDevice::VersionRequired(), aVer))
{
return KErrNotSupported;
}
- // Setup LDD for receiving client messages
+ // Setup LDD for receiving client messages
SetDfcQ(Kern::DfcQue0());
iMsgQ.Receive();
- // Associate DFCs with the same queue we set above to receive client messages on
+ //Associate DFCs with the same queue we set above to receive client messages on
iReceiveDataDfc.SetDfcQ(iDfcQ);
iCaptureDfc.SetDfcQ(iDfcQ);
- // Give PDD a pointer to this channel
- Pdd()->iLdd=this;
-
- //allocate Memory
- iSize=Kern::RoundToPageSize(BUFSIZE);
- TInt rtn=Epoc::AllocPhysicalRam(iSize, iPhysAddr);
- if (rtn != KErrNone)
+ //Give PDD a pointer to this channel
+ Pdd()->iLdd = this;
+ // Create shared chunk.
+ TInt rtn = CreatSharedChunks();
+ if (rtn)
{
return rtn;
}
- rtn=DPlatChunkHw::New(iChunk, iPhysAddr, iSize,EMapAttrUserRw|EMapAttrBufferedC);
- if (rtn != KErrNone)
- {
- if (iPhysAddr)
- {
- Epoc::FreePhysicalRam(iPhysAddr, iSize);
- }
- return rtn;
- }
- iLAdr = reinterpret_cast<TUint8*>(iChunk->LinearAddress());
-
- iComm=HBuf8::New(BUFSIZE);
- if (!iComm)
- {
- return KErrNotSupported;
- }
- iReceiveDataBuffer=iComm;
- iCaptureBuffer=iComm;
DP("DWebcameraLogicalChannel::DoCreate() end");
return KErrNone;
}
/**
- Process a message for this logical channel.
- This function is called in the context of a DFC thread.
+Process a message for this logical channel.
+This function is called in the context of a DFC thread.
- @param aMessage The message to process.
- The iValue member of this distinguishes the message type:
- iValue==ECloseMsg, channel close message
- iValue==KMaxTInt, a 'DoCancel' message
- iValue>=0, a 'DoControl' message with function number equal to iValue
- iValue<0, a 'DoRequest' message with function number equal to ~iValue
+@param aMessage The message to process.
+ The iValue member of this distinguishes the message type:
+ iValue==ECloseMsg, channel close message
+ iValue==KMaxTInt, a 'DoCancel' message
+ iValue>=0, a 'DoControl' message with function number equal to iValue
+ iValue<0, a 'DoRequest' message with function number equal to ~iValue
*/
void DWebcameraLogicalChannel::HandleMsg(TMessageBase* aMsg)
{
DP("DWebcameraLogicalChannel::HandleMsg() start");
- TThreadMessage& m=*(TThreadMessage*)aMsg;
+ TThreadMessage& m = *(TThreadMessage*)aMsg;
- // Get message type
- TInt id=m.iValue;
- DP("id=%d",id);
-
- // Decode the message type and dispatch it to the relevent handler function...
- if (id==(TInt)ECloseMsg)
+ // Get message type
+ TInt id = m.iValue;
+ DP("id=%d",id);
+
+ // Decode the message type and dispatch it to the relevent handler function...
+ if (id == (TInt)ECloseMsg)
{
DoCancel(RWebcameraDevice::EAllRequests);
m.Complete(KErrNone, EFalse);
return;
}
- if(m.Client()!=iClient)
+ if (m.Client() != iClient)
{
Kern::ThreadKill(m.Client(),
EExitPanic,
ERequestFromWrongThread,
KDriver1PanicCategory);
- m.Complete(KErrNone,ETrue);
+ m.Complete(KErrNone, ETrue);
+ return;
+ }
+
+ if (id == KMaxTInt)
+ {
+ DoCancel(m.Int0());
+ m.Complete(KErrNone, ETrue);
return;
}
- if (id==KMaxTInt)
- {
- DoCancel(m.Int0());
- m.Complete(KErrNone,ETrue);
- return;
- }
-
- if (id<0)
+ if (id < 0)
{
// DoRequest
- TRequestStatus* pS=(TRequestStatus*)m.Ptr0();
- TInt rtn =DoRequest(~id,pS,m.Ptr1(),aMsg);
+ TRequestStatus* pS = (TRequestStatus*)m.Ptr0();
+ TInt rtn = DoRequest(~id, pS, m.Ptr1(), aMsg);
if (rtn != KErrNone)
- Kern::RequestComplete(iClient,pS,rtn);
- m.Complete(KErrNone,ETrue);
+ {
+ Kern::RequestComplete(iClient, pS, rtn);
+ }
+ m.Complete(KErrNone, ETrue);
}
else
{
// DoControl
- TInt rtn = DoControl(id,m.Ptr0(),aMsg);
- m.Complete(rtn,ETrue);
+ TInt rtn = DoControl(id, m.Ptr0(), aMsg);
+ m.Complete(rtn, ETrue);
}
DP("DWebcameraLogicalChannel::HandleMsg() end");
}
/**
- Process synchronous 'control' requests
+Process synchronous 'control' requests
*/
-TInt DWebcameraLogicalChannel::DoControl(TInt aFunction, TAny* a1, TAny* a2)
+TInt DWebcameraLogicalChannel::DoControl(TInt aFunction, TAny* a1, TAny* /*a2*/)
{
DP("DWebcameraLogicalChannel::DoControl() start");
TInt rtn;
- TThreadMessage& m=*(TThreadMessage*)a2;
- TRequestStatus* pS=(TRequestStatus*)m.Ptr0();
+ rtn = KErrNone;
switch (aFunction)
{
case RWebcameraDevice::EGetConfig:
// rtn = GetConfig((TDes8*)a1);
rtn = KErrNone;
- if ( rtn != KErrNone )
- {
- Kern::RequestComplete(iClient,pS,rtn);
- }
break;
case RWebcameraDevice::ESetConfig:
- // rtn = SetConfig((const TDesC8*)a1);
- break;
-
+// rtn = SetConfig((const TDesC8*)a1);
+ break;
+ case RWebcameraDevice::EOpenSharedChunck:
+ rtn=OpenSharedChunks((RWebcameraDevice::TChunkInfo*)a1);
+ break;
+ case RWebcameraDevice::EInitViewFinder:
+ rtn = Pdd()->InitViewFinder();
+ iDataPtr = Kern::Alloc(BUFSIZE);
+ iBmpBuf = (TUint8*)Kern::Alloc(BITMAPBUFSIZE);
+ break;
default:
rtn = KErrNotSupported;
- Kern::RequestComplete(iClient,pS,rtn);
break;
}
DP("DWebcameraLogicalChannel::DoControl() end");
return rtn;
-
}
/**
- Process asynchronous requests.
+Process asynchronous requests.
*/
TInt DWebcameraLogicalChannel::DoRequest(TInt aReqNo,
TRequestStatus* aStatus,
TAny* a1,
- TAny* a2)
+ TAny* /*a2*/)
{
- DP("DWebcameraLogicalChannel::DoRequest() start");
TInt rtn;
- TThreadMessage& m=*(TThreadMessage*)a2;
+ iRequesting = ETrue;
+ rtn = KErrNone;
- iRequesting =ETrue;
- rtn = KErrNone;
- DP("aReqNo=%d",aReqNo);
- switch(aReqNo)
+ switch (aReqNo)
{
case RWebcameraDevice::EStart:
- DP("EStart=%d",RWebcameraDevice::EStart);
iReceiveDataStatus = aStatus;
- iReceiving = ETrue ;
- iReceiveDataBuffer->FillZ(iCaptureBuffer->MaxLength());
- iReceiveDataBuffer->Zero();
- DP("iReceiveDataBuffer Len=%d",iReceiveDataBuffer->MaxLength());
- DP("iReceiveDataBuffer Len=%d",iReceiveDataBuffer->Length());
- rtn = Pdd()->StartViewerFinder(iPhysAddr,iSize);
- if ( rtn != KErrNone )
+ iReceiving = ETrue;
+ iWebCameraState = RWebcameraDevice::EStart;
+ iReceiveDataDfc.Add();
+ // Example Platform Security capability check which tests the
+ // client for ECapability_None (which always passes)...
+ if (iRequesting == EFalse)
{
- DP("rtn=%d",rtn);
- iReceiving = EFalse ;
- Kern::RequestComplete(iClient,aStatus,rtn);
+ iReceiving = EFalse;
+ Kern::RequestComplete(iClient,
+ iReceiveDataStatus,
+ iReceiveDataResult);
+ }
+ else
+ {
+ iReceiveDataDescriptor = (TInt*)a1;
+ }
+ break;
+ case RWebcameraDevice::ECapture:
+ iCaptureStatus = aStatus;
+ iWebCameraState = RWebcameraDevice::ECapture;
+ iCaptureDfc.Add();
+ if (iRequesting == EFalse)
+ {
+ Kern::RequestComplete(iClient, iCaptureStatus, iCaptureResult);
}
else
{
- DP("rtn=%d",rtn);
- // Example Platform Security capability check which tests the
- // client for ECapability_None (which always passes)...
- if ( iRequesting == EFalse )
- {
- DP("iRequesting=EFalse");
- iReceiving = EFalse ;
- Kern::RequestComplete(iClient,
- iReceiveDataStatus,
- iReceiveDataResult);
- }
- else
- {
- DP("iRequesting=ETrue");
- iReceiveDataDescriptor=(TDes8*)a1;
- }
+ iCaptureDescriptor=(TInt*)a1;
}
break;
- case RWebcameraDevice::ECapture:
- iCaptureing = ETrue ;
- iCaptureStatus = aStatus;
- iCaptureBuffer->FillZ(iCaptureBuffer->MaxLength());
- iCaptureBuffer->Zero();
- DP("iCaptureBuffer Len=%d",iCaptureBuffer->MaxLength());
- DP("iCaptureBuffer Len=%d",iCaptureBuffer->Length());
- rtn = Pdd()->StartCapture(iPhysAddr,iSize);
- DP("rtn=%d",rtn);
- if ( rtn != KErrNone )
+ case RWebcameraDevice::EPowerOn:
+ if (iPowerOn == EFalse)
{
- iCaptureing = EFalse ;
- Kern::RequestComplete(iClient,aStatus,rtn);
+ iPowerOn = ETrue;
+ iWebCameraState = RWebcameraDevice::EPowerOn;
+ iHeaderPtr = Kern::Alloc(sizeof(TWebcameraUVC));
+ rtn = Pdd()->PowerOn(iHeaderPtr);
+ Kern::RequestComplete(iClient, aStatus, rtn);
}
else
{
- if ( iRequesting == EFalse )
- {
- DP("iRequesting=EFalse");
- iReceiving = EFalse ;
- Kern::RequestComplete(iClient,iCaptureStatus,iCaptureResult);
- }
- else
- {
- DP("Capture iRequesting=ETrue");
- iCaptureDescriptor=(TDes8*)a1;
- }
+ Kern::RequestComplete(iClient, aStatus, KErrAlreadyExists);
}
break;
+ case RWebcameraDevice::EPowerOff:
+ Pdd()->Disconnect();
+ iPowerOn = EFalse;
+ iReceiving = EFalse;
+ iReceiveDataDfc.Cancel();
+ iCaptureDfc.Cancel();
+ iWebCameraState = RWebcameraDevice::EPowerOff;
+ Kern::RequestComplete(iClient, aStatus, rtn);
+ break;
default:
- rtn=KErrNotSupported;
- Kern::RequestComplete(iClient,aStatus,rtn);
+ rtn = KErrNotSupported;
+ Kern::RequestComplete(iClient, aStatus, rtn);
break;
}
iRequesting = EFalse;
-
- DP("DWebcameraLogicalChannel::DoRequest() end");
return rtn;
-
}
/**
- Process cancelling of asynchronous requests.
+Process cancelling of asynchronous requests.
*/
void DWebcameraLogicalChannel::DoCancel(TUint aMask)
{
DP("DWebcameraLogicalChannel::DoCancel() start");
- TInt rtn;
DP("aMask=%d",aMask);
- if (aMask&(1<<RWebcameraDevice::EStart))
- {
+ if (aMask & (1 << RWebcameraDevice::EStart))
+ {
DP("RWebcameraDevice::EStart=%d",RWebcameraDevice::EStart);
if (iReceiveDataStatus)
{
DP("iReceiveDataStatus=%d",iReceiveDataStatus);
Pdd()->Stop(DWebcameraDriverBase::USB_cancel);
- iReceiving = EFalse ;
+ iReceiving = EFalse;
iReceiveDataDfc.Cancel();
- Kern::RequestComplete(iClient,iReceiveDataStatus,KErrCancel);
+ Kern::RequestComplete(iClient, iReceiveDataStatus, KErrCancel);
}
- }
- if (aMask&(1<<RWebcameraDevice::ECapture))
- {
+ }
+ if (aMask&(1<<RWebcameraDevice::ECapture))
+ {
DP("RWebcameraDevice::ECapture=%d",RWebcameraDevice::ECapture);
if (iCaptureStatus)
{
- Pdd()->Stop(DWebcameraDriverBase::USB_cancel);
- iReceiving = EFalse ;
iCaptureDfc.Cancel();
- Kern::RequestComplete(iClient,iCaptureStatus,KErrCancel);
+ Kern::RequestComplete(iClient, iCaptureStatus, KErrCancel);
}
- }
+ }
DP("DWebcameraLogicalChannel::DoCancel() end");
}
/**
- Called by PDD from ISR to indicate that a ReceiveData operation has completed.
+Called by PDD from ISR to indicate that a ReceiveData operation has completed.
*/
void DWebcameraLogicalChannel::GetOneFlameComplete(TInt aDataSize)
- {
- DP("DWebcameraLogicalChannel::GetOneFlameComplete() start");
- DP("datasize=%d",aDataSize);
- iSaveSize=iSize - aDataSize;
- // Queue DFC
- iReceiveDataDfc.Add();
- //set size of received data
- if (iSaveSize > 0)
- {
- iReceiveDataResult = KErrNone;
- }
- else
- {
- iReceiveDataResult = KErrUnknown;//TODO:define of error
- }
- DP("DWebcameraLogicalChannel::GetOneFlameComplete() end");
- }
+ {
+ iSaveSize = iSize - aDataSize;
+ // Queue DFC
+ iWebCameraState = RWebcameraDevice::ETransferData;
+ iReceiveDataDfc.Add();
+ //set size of received data
+ if (iSaveSize > 0)
+ {
+ iReceiveDataResult = KErrNone;
+ }
+ else
+ {
+ iReceiveDataResult = KErrUnknown; //TODO:define of error
+ }
+ }
+
+void DWebcameraLogicalChannel::DoStartViewFinder()
+ {
+ TInt rtn = Pdd()->StartViewerFinder(iDataPtr, BUFSIZE);
+ if (rtn != KErrNone)
+ {
+ DP("rtn=%d",rtn);
+ iReceiving = EFalse;
+ Kern::RequestComplete(iClient, iReceiveDataStatus, rtn);
+ }
+ }
+/**
+DFC Callback which gets triggered after the PDD has signalled that getting oneflame completed.
+This just casts aPtr and calls DoGetOneFlameComplete().
+*/
+void DWebcameraLogicalChannel::GetFlameDfc(TAny* aPtr)
+ {
+ switch (((DWebcameraLogicalChannel*)aPtr)->iWebCameraState)
+ {
+ case RWebcameraDevice::EStart:
+ ((DWebcameraLogicalChannel*)aPtr)->DoStartViewFinder();
+ break;
+ case RWebcameraDevice::ETransferData:
+ ((DWebcameraLogicalChannel*)aPtr)->DoGetOneFlameComplete();
+ break;
+ default:
+ break;
+ }
+ }
+/**
+DFC Callback
+gets Capture image completed.
+This just casts aPtr and calls DoCaptureComplete().
+*/
+void DWebcameraLogicalChannel::CaptureDfc(TAny* aPtr)
+ {
+ DP("DWebcameraLogicalChannel::CaptureDfc() start");
+ ((DWebcameraLogicalChannel*)aPtr)->DoCaptureComplete();
+ DP("DWebcameraLogicalChannel::CaptureDfc() end");
+ }
/**
- Called by PDD from ISR to indicate that a get capture image operation has completed.
-*/
-void DWebcameraLogicalChannel::CaptureComplete(TInt aDataSize)
- {
- DP("DWebcameraLogicalChannel::CaptureComplete() start");
- DP("datasize=%d",aDataSize);
- iSaveSize=iSize - aDataSize;
- // Queue DFC
- iCaptureDfc.Add();
- //set size of received data
- if (iSaveSize > 0)
- {
- iCaptureResult = KErrNone;
- }
- else
- {
- iCaptureResult = KErrUnknown;//TODO:define of error
- }
- DP("DWebcameraLogicalChannel::CaptureComplete() end");
- }
-
-/**
- DFC Callback which gets triggered after the PDD has signalled that getting oneflame completed.
- This just casts aPtr and calls DoGetOneFlameComplete().
-*/
-void DWebcameraLogicalChannel::GetOneFlameDfc(TAny* aPtr)
- {
- DP("DWebcameraLogicalChannel::GetOneFlameDfc() start");
- ((DWebcameraLogicalChannel*)aPtr)->DoGetOneFlameComplete();
- DP("DWebcameraLogicalChannel::GetOneFlameDfc() end");
- }
-
-/**
- DFC Callback which gets triggered after the PDD has signalled that getting Capture image completed.
- This just casts aPtr and calls DoCaptureComplete().
-*/
-void DWebcameraLogicalChannel::CaptureDfc(TAny* aPtr)
- {
- DP("DWebcameraLogicalChannel::CaptureDfc() start");
- ((DWebcameraLogicalChannel*)aPtr)->DoCaptureComplete();
- DP("DWebcameraLogicalChannel::CaptureDfc() end");
- }
-
-/**
- Called from a DFC after the PDD has signalled that getting oneflame completed.
+Called from a DFC after the PDD has signalled that getting oneflame completed.
*/
void DWebcameraLogicalChannel::DoGetOneFlameComplete()
- {
- DP("DWebcameraLogicalChannel::DoGetOneFlameComplete() start");
- iReceiveDataBuffer->Copy(iLAdr,iSaveSize);
- DP("iReceiveDataBuffer Len=%d",iReceiveDataBuffer->Length());
- // Write data to client from our buffer
- TInt result=Kern::ThreadDesWrite(iClient,iReceiveDataDescriptor,*iReceiveDataBuffer,0);
- // Finished with client descriptor, so NULL it to help detect coding errors
- iReceiveDataDescriptor = NULL;
+ {
+ if (!iConvert)
+ {
+ iConvert = new DWebCameraConvert((TWebcameraUVC*)iHeaderPtr);
+ }
+
+ iConvert->ConvertData((TUint8*)iDataPtr, iBmpBuf);
+ kumemget((TAny*)(iChunkLinAddr), iBmpBuf, iSaveSize);
+
+ TInt result = Kern::ThreadRawWrite(iClient, iReceiveDataDescriptor, &iSaveSize,sizeof(TInt), 0);
- // Use result code from PDD if it was an error
- if(iReceiveDataResult!=KErrNone)
- result = iReceiveDataResult;
-
- // Complete clients request
- Kern::RequestComplete(iClient,iReceiveDataStatus,result);
- DP("DWebcameraLogicalChannel::DoGetOneFlameComplete() end");
- }
+ // Finished with client descriptor, so NULL it to help detect coding errors
+ iReceiveDataDescriptor = NULL;
+
+ // Use result code from PDD if it was an error
+ if(iReceiveDataResult != KErrNone)
+ {
+ result = iReceiveDataResult;
+ }
+ // Complete clients request
+ Kern::RequestComplete(iClient, iReceiveDataStatus, result);
+ }
/**
- Called from a DFC after the PDD has signalled that getting Capture image completed.
+Called from a DFC after the PDD has signalled that getting Capture image completed.
*/
void DWebcameraLogicalChannel::DoCaptureComplete()
- {
+ {
DP("DWebcameraLogicalChannel::DoCaptureComplete() start");
- iCaptureBuffer->Copy(iLAdr,iSaveSize);
- DP("iCaptureBuffer Len=%d",iCaptureBuffer->Length());
- // Write data to client from our buffer
- TInt result=Kern::ThreadDesWrite(iClient,iCaptureDescriptor,*iCaptureBuffer,0);
- // Finished with client descriptor, so NULL it to help detect coding errors
- iCaptureDescriptor = NULL;
+
+ TInt result = Kern::ThreadRawWrite(iClient, iCaptureDescriptor, &iSaveSize, sizeof(TInt), 0);
+
+ // Finished with client descriptor, so NULL it to help detect coding errors
+ iCaptureDescriptor = NULL;
- // Use result code from PDD if it was an error
- if(iCaptureResult!=KErrNone)
- result = iCaptureResult;
-
- // Complete clients request
- Kern::RequestComplete(iClient,iCaptureStatus,result);
+ // Use result code from PDD if it was an error
+ if(iCaptureResult != KErrNone)
+ {
+ result = iCaptureResult;
+ }
+ // Complete clients request
+ Kern::RequestComplete(iClient, iCaptureStatus, result);
DP("DWebcameraLogicalChannel::DoCaptureComplete() end");
- }
+ }
/**
- Process a GetConfig control message. This writes the current driver configuration to a
- RWebcameraDevice::TConfigBuf supplied by the client.
+Process a GetConfig control message. This writes the current driver configuration to a
+RWebcameraDevice::TConfigBuf supplied by the client.
*/
TInt DWebcameraLogicalChannel::GetConfig(TDes8* aConfigBuf)
- {
+ {
//unsupported
- }
+ return KErrNotSupported;
+ }
/**
- Process a SetConfig control message. This sets the driver configuration using a
- RWebcameraDevice::TConfigBuf supplied by the client.
+Process a SetConfig control message. This sets the driver configuration using a
+RWebcameraDevice::TConfigBuf supplied by the client.
*/
TInt DWebcameraLogicalChannel::SetConfig(const TDesC8* aConfigBuf)
- {
+ {
//unsupported
- }
+ return KErrNotSupported;
+ }
/**
- Fill a TConfig with the drivers current configuration.
+Fill a TConfig with the drivers current configuration.
*/
/*void DWebcameraLogicalChannel::CurrentConfig(RWebcameraDevice::TConfig& aConfig)
- {
+ {
//unsupported
- }
+ }
*/
+TInt DWebcameraLogicalChannel::CreatSharedChunks()
+ {
+ DP("DWebcameraLogicalChannel::CreatSharedChunks() start");
+
+ iChunk=NULL;
+
+ NKern::ThreadEnterCS();
+
+ iSize = Kern::RoundToPageSize(BITMAPBUFSIZE);
+
+ TChunkCreateInfo info;
+ info.iType = TChunkCreateInfo::ESharedKernelMultiple;
+ info.iMaxSize = iSize;
+ info.iMapAttr = EMapAttrFullyBlocking;
+ info.iOwnsMemory = ETrue;
+ info.iDestroyedDfc = NULL;
+ TInt r = Kern::ChunkCreate(info, iChunk, iChunkLinAddr, iChunkMappingAttr);
+ if (r != KErrNone)
+ {
+ NKern::ThreadLeaveCS();
+ return r;
+ }
+ iPhysAddr = 0x0;
+ r = Kern::ChunkCommitContiguous(iChunk, 0, iSize, iPhysAddr);
+
+ if (r != KErrNone)
+ {
+ Kern::ChunkClose(iChunk);
+ NKern::ThreadLeaveCS();
+ return r;
+ }
+ NKern::ThreadLeaveCS();
+
+ DP("DWebcameraLogicalChannel::CreatSharedChunks() end");
+ return KErrNone;
+ }
+
+TInt DWebcameraLogicalChannel::OpenSharedChunks(RWebcameraDevice::TChunkInfo* aChunkInfo)
+ {
+ DP("DWebcameraLogicalChannel::OpenSharedChunks() start");
+ RWebcameraDevice::TChunkInfo chunkInfo;
+ NKern::ThreadEnterCS();
+ // Make handle to chunifo for current thread
+ TInt r = Kern::MakeHandleAndOpen(iClient, iChunk);
+ if (r >= 0)
+ {
+ chunkInfo.iChunkHandle = r;
+ r = KErrNone;
+ }
+
+ NKern::ThreadLeaveCS();
+
+ if (r != KErrNone)
+ {
+ memclr(&chunkInfo,sizeof(chunkInfo));
+ }
+ TInt result = Kern::ThreadRawWrite(iClient, aChunkInfo, &chunkInfo, sizeof(chunkInfo), 0);
+
+ DP("DWebcameraLogicalChannel::OpenSharedChunks() end");
+ return r;
+ }
+
+void DWebcameraLogicalChannel::ChunkDestroyed()
+ {
+ DP("DWebcameraLogicalChannel::ChunkDestroyed() start");
+ //unsupported
+ DP("DWebcameraLogicalChannel::ChunkDestroyed() end");
+ }
+
+void DWebcameraLogicalChannel::CloseSharedChunks()
+ {
+ DP("DWebcameraLogicalChannel::CloseSharedChunks() start");
+ if (iChunk)
+ {
+ Kern::ChunkClose(iChunk);
+ }
+ DP("DWebcameraLogicalChannel::CloseSharedChunks() end");
+ }
+
/**
- *Get the point to Physical channel.
+Get the point to Physical channel.
*/
DWebcameraDriverBase* DWebcameraLogicalChannel::Pdd()
{
DP("DWebcameraLogicalChannel::Pdd() start");
return (DWebcameraDriverBase*)iPdd;
}
-