BOOL CGatewayCANopenToEpos::Process_UploadSDOSegment(CCommand_PS* pCommand, CDeviceCommandSetManagerBase* pDeviceCommandSetManager, HANDLE hDCS_Handle, HANDLE hTransactionHandle)
{
	const DWORD k_MaxCANopenDataSize = 7;

	//Constants CANopen
	const int k_ParameterIndex_CobIdClientServer = 0;
	const int k_ParameterIndex_CobIdServerClient = 1;
	const int k_ParameterIndex_Toggle = 2;
			
	const int k_ReturnParameterIndex_CobIdServerClient = 0;
	const int k_ReturnParameterIndex_Toggle = 1;
	const int k_ReturnParameterIndex_NonValidNbOfBytes = 2;
	const int k_ReturnParameterIndex_NoMoreSegments = 3;
	const int k_ReturnParameterIndex_SegData = 4;
	const int k_ReturnParameterIndex_AbortCode = 5;

	//Parameter CANopen
	DWORD dCobIdClientServer = 0;
	DWORD dCobIdServerClient = 0;
	BOOL oToggle = FALSE;
		
	//ReturnParameter CANopen
	BYTE uRetNonValidNbOfBytes = 0;
	BOOL oRetNoMoreSegments = FALSE;
	void* pRetSegDataBuffer = NULL;
	DWORD dRetSegDataBufferLength = 0;
	DWORD dSegmentLengthRead = 0;
	DWORD dAbortCode = 0;

	//ReturnParameter Esam
	void* pDataBuffer = NULL;
	DWORD dDataBufferLength = 0;
	
	BOOL oResult = FALSE;
	CErrorInfo errorInfo;

	if(pCommand)
	{
		//Check CriticalSection
		if(!IsLocked(pCommand)) return FALSE;

		//Prepare DataBuffer
		dRetSegDataBufferLength = k_MaxCANopenDataSize;
		pRetSegDataBuffer = malloc(dRetSegDataBufferLength);
		memset(pRetSegDataBuffer,0,dRetSegDataBufferLength);

		//Get ParameterData CANopen
		pCommand->GetParameterData(k_ParameterIndex_CobIdClientServer,&dCobIdClientServer,sizeof(dCobIdClientServer));
		pCommand->GetParameterData(k_ParameterIndex_CobIdServerClient,&dCobIdServerClient,sizeof(dCobIdServerClient));
		pCommand->GetParameterData(k_ParameterIndex_Toggle,&oToggle,sizeof(oToggle));

		//Translate Command
		oResult = GetBufferedData(pRetSegDataBuffer,dRetSegDataBufferLength,&dSegmentLengthRead,&oRetNoMoreSegments);
		if(!oResult)
		{
			oResult = DCS_SegmentedRead(pDeviceCommandSetManager,hDCS_Handle,hTransactionHandle,GetNodeId(dCobIdClientServer),m_oToggle,&oRetNoMoreSegments,&pDataBuffer,&dDataBufferLength,&errorInfo);
			if(oResult)
			{
				m_oToggle = !m_oToggle;
				AddBufferedData(pDataBuffer,dDataBufferLength,oRetNoMoreSegments);
				oResult = GetBufferedData(pRetSegDataBuffer,dRetSegDataBufferLength,&dSegmentLengthRead,&oRetNoMoreSegments);
			}
		}
	
		//CheckSize
		if(oResult && (dSegmentLengthRead <= k_MaxCANopenDataSize)) 
		{
			uRetNonValidNbOfBytes = (BYTE)(k_MaxCANopenDataSize-dSegmentLengthRead);
			dAbortCode = errorInfo.GetErrorCode();
		}
		else if(oResult)
		{
			oResult = FALSE;
			if(m_pErrorHandling) m_pErrorHandling->GetError(k_Error_Internal,&errorInfo);
			dAbortCode = errorInfo.GetErrorCode();
		}
		else
		{
			uRetNonValidNbOfBytes = k_MaxCANopenDataSize;
			dAbortCode = errorInfo.GetErrorCode();
		}

		//Set ReturnParameterData CANopen
		pCommand->SetStatus(oResult,&errorInfo);
		pCommand->SetReturnParameterData(k_ReturnParameterIndex_CobIdServerClient,&dCobIdServerClient,sizeof(dCobIdServerClient));
		pCommand->SetReturnParameterData(k_ReturnParameterIndex_Toggle,&oToggle,sizeof(oToggle));
		pCommand->SetReturnParameterData(k_ReturnParameterIndex_NonValidNbOfBytes,&uRetNonValidNbOfBytes,sizeof(uRetNonValidNbOfBytes));
		pCommand->SetReturnParameterData(k_ReturnParameterIndex_NoMoreSegments,&oRetNoMoreSegments,sizeof(oRetNoMoreSegments));
		pCommand->SetReturnParameterData(k_ReturnParameterIndex_SegData,pRetSegDataBuffer,dSegmentLengthRead);
		pCommand->SetReturnParameterData(k_ReturnParameterIndex_AbortCode,&dAbortCode,sizeof(dAbortCode));
		
		//Free DataBuffer
		if(pRetSegDataBuffer) free(pRetSegDataBuffer);
		if(pDataBuffer) free(pDataBuffer);

		//Unlock CriticalSection
		if(oRetNoMoreSegments || !oResult)
		{
			ResetBufferedData();
			Unlock();
		}

		return oResult;
	}

	return FALSE;
    
}
Example #2
0
void XMp3Decomp::Decompress(XS16* dstWord, XS32 nSamples) 
{

    long            bytesCleared;
    XS32             nBytes  = nSamples * snd->BytesPerBlock();
    XS8              *dstByte = (XS8 *) dstWord;

//    XBOOL            seeking = (!dstWord) ? (true) : false;

	bytesCleared = GetBufferedData(dstByte, nBytes);

	if (!isInitMad())
	{
		if (dstByte)
		{
			memset(dstByte, 0x00, nBytes);
		}
		goto exit_gracefully;
	}
	else
	{
		nBytes -= bytesCleared;

        // dst byte can be zero during seeking
        if (dstByte)
            dstByte += bytesCleared;
	}

	if (m_firstBuf)	// first enter
	{
		// read head. and give data
		bool b = fillBufferMad();
		assert(b);
		m_firstBuf = false;
	}

    // check first if there is any buffered data
    if (bytesCleared == nBytes)
        goto exit_gracefully;
  
	mad_error madError;

	
	while(nBytes > 0)
	{
		int success = mad_frame_decode(&Frame, &Stream);
		madError = Stream.error;
		if (success == 0)
		{
			// do success things.
			mad_synth_frame(&Synth,&Frame);

			struct mad_pcm *pcm = &(Synth.pcm);

			int nchannels = pcm->channels;
//			int nsamples  = pcm->length;

			assert(Synth.pcm.length * nchannels * 2 <= kBufSize);
			assert(Synth.pcm.length > 0);

			XU8* p = pcmBuf;

			for (int i = 0; i < Synth.pcm.length; i++)
			{
				signed int Sample = scale(Synth.pcm.samples[0][i]);
				*p++ = Sample & 0xff;
				*p++ = (Sample >> 8) & 0xff;
				if (nchannels == 2)
				{
					Sample = scale(Synth.pcm.samples[0][i]);
					*p++ = Sample & 0xff;
					*p++ = (Sample >> 8) & 0xff;
				}
			}

			bufLength = Synth.pcm.length * nchannels * 2;

			bytesCleared = GetBufferedData(dstByte, nBytes);
			nBytes -= bytesCleared;
			if (dstByte)
			{
				dstByte += bytesCleared;
            }
		}
BOOL CGatewayCANopenToEpos::Process_DownloadSDOSegment(CCommand_PS* pCommand, CDeviceCommandSetManagerBase* pDeviceCommandSetManager, HANDLE hDCS_Handle, HANDLE hTransactionHandle)
{
	const DWORD k_MaxCANopenDataSize = 7;
	
	//Constants PS CANopen
	const int k_ParameterIndex_CobIdClientServer = 0;
	const int k_ParameterIndex_CobIdServerClient = 1;
	const int k_ParameterIndex_Toggle = 2;
	const int k_ParameterIndex_NonValidNbOfBytes = 3;
	const int k_ParameterIndex_NoMoreSegments = 4;
	const int k_ParameterIndex_SegData = 5;
		
	const int k_ReturnParameterIndex_CobIdServerClient = 0;
	const int k_ReturnParameterIndex_Toggle = 1;
	const int k_ReturnParameterIndex_AbortCode = 2;

	//Parameter CANopen
	DWORD dCobIdClientServer = 0;
	DWORD dCobIdServerClient = 0;
	BOOL oToggle = 0;
	BYTE uNonValidNbOfBytes = 0;
	BOOL oNoMoreSegments = FALSE;
	void* pSegDataBuffer = NULL;
	DWORD dSegDataBufferLength = 0;
		
	//ReturnParameter CANopen
	DWORD dAbortCode = 0;

	//ReturnParameter Esam
	BOOL oRetToggle = FALSE;
	void* pDataBuffer = NULL;
	DWORD dDataBufferLength = 0;
	DWORD dDataLengthRead = 0;
	DWORD dDataLengthWritten = 0;
	
	BOOL oResult = FALSE;
	CErrorInfo errorInfo;

	if(pCommand)
	{
		//Check CriticalSection
		if(!IsLocked(pCommand)) return FALSE;

		//Prepare DataBuffer
		dSegDataBufferLength = pCommand->GetParameterLength(k_ParameterIndex_SegData);
		if(dSegDataBufferLength > 0) pSegDataBuffer = malloc(dSegDataBufferLength);
		dDataBufferLength = m_WriteSegmentSize;
		if(dDataBufferLength > 0) pDataBuffer = malloc(dDataBufferLength);

		//Get ParameterData CANopen
		pCommand->GetParameterData(k_ParameterIndex_CobIdClientServer,&dCobIdClientServer,sizeof(dCobIdClientServer));
		pCommand->GetParameterData(k_ParameterIndex_CobIdServerClient,&dCobIdServerClient,sizeof(dCobIdServerClient));
		pCommand->GetParameterData(k_ParameterIndex_Toggle,&oToggle,sizeof(oToggle));
		pCommand->GetParameterData(k_ParameterIndex_NonValidNbOfBytes,&uNonValidNbOfBytes,sizeof(uNonValidNbOfBytes));
		pCommand->GetParameterData(k_ParameterIndex_NoMoreSegments,&oNoMoreSegments,sizeof(oNoMoreSegments));
		pCommand->GetParameterData(k_ParameterIndex_SegData,pSegDataBuffer,dSegDataBufferLength);

		//Check DataBuffer Length
		dSegDataBufferLength = CheckDataBufferLength(TRUE,uNonValidNbOfBytes,dSegDataBufferLength,k_MaxCANopenDataSize);

		//Translate Command
		oResult = AddBufferedData(pSegDataBuffer,dSegDataBufferLength,oNoMoreSegments);
		if(oResult)
		{
			while(GetBufferedData(pDataBuffer,dDataBufferLength,&dDataLengthRead,&oNoMoreSegments))
			{
				//AbortCommand
				if(m_oAbortCommands)
				{
					if(m_pErrorHandling) m_pErrorHandling->GetError(k_Error_CommandAbortedByUser,&errorInfo);
					oResult = FALSE;
					break;
				}

				oResult = DCS_SegmentedWrite(pDeviceCommandSetManager,hDCS_Handle,hTransactionHandle,GetNodeId(dCobIdClientServer),!oNoMoreSegments,m_oToggle,pDataBuffer,dDataLengthRead,&oRetToggle,&dDataLengthWritten,&errorInfo);
				m_oToggle = !m_oToggle;

				//Update SegmentLength
				if(dDataLengthWritten < dDataLengthRead)
				{
					ReverseBufferedData(dDataLengthRead-dDataLengthWritten);
					oNoMoreSegments = FALSE;
					if(pDataBuffer)
					{
						free(pDataBuffer);
						pDataBuffer = NULL;

						m_WriteSegmentSize = dDataLengthWritten;
						dDataBufferLength = dDataLengthWritten;

						if(dDataBufferLength > 0) pDataBuffer = malloc(dDataBufferLength);
					}
				}
				
				if(oNoMoreSegments) break;
			}
		}
		dAbortCode = errorInfo.GetErrorCode();

		//Set ReturnParameterData CANopen
		pCommand->SetStatus(oResult,&errorInfo);
		pCommand->SetReturnParameterData(k_ReturnParameterIndex_CobIdServerClient,&dCobIdServerClient,sizeof(dCobIdServerClient));
		pCommand->SetReturnParameterData(k_ReturnParameterIndex_Toggle,&oToggle,sizeof(oToggle));
		pCommand->SetReturnParameterData(k_ReturnParameterIndex_AbortCode,&dAbortCode,sizeof(dAbortCode));
		
		//Free DataBuffer
		if(pSegDataBuffer) free(pSegDataBuffer);
		if(pDataBuffer) free(pDataBuffer);

		//Unlock CriticalSection
		if(oNoMoreSegments || !oResult)
		{
			ResetBufferedData();
			Unlock();
		}
		
		return oResult;
	}
	
	return FALSE;	
    
}