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; }
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; }