Esempio n. 1
0
int SendDataPacket (SourceVChan_type* srcVChan, DataPacket_type** dataPacketPtr, BOOL srcVChanNeedsPacket, char** errorMsg)
{
INIT_ERR
	
	size_t				nSinks				= ListNumItems(srcVChan->sinkVChans);
	SinkVChan_type* 	sinkVChan			= NULL;
	size_t				nPacketsSent		= 0;		// counts to how many Sink VChans the packet has been sent successfuly
	size_t				nPacketRecipients	= 0;		// counts the number of packet recipients
	
	
	// set packet counter
	// Note: Since the Source VChan is open, an active Sink VChan is also an open Sink VChan
	
	if (srcVChanNeedsPacket) {
		nPacketRecipients = GetNumOpenSinkVChans(srcVChan)+1;
		nPacketsSent++;
	} else
		nPacketRecipients = GetNumOpenSinkVChans(srcVChan);
		
	if (*dataPacketPtr)
		SetDataPacketCounter(*dataPacketPtr, nPacketRecipients);
		
	// if there are no recipients then dispose of the data packet
	if (!nPacketRecipients) {
		ReleaseDataPacket(dataPacketPtr);
		return 0; 
	}
	
	// send data packet
	for (size_t i = 1; i <= nSinks; i++) {
		sinkVChan = *(SinkVChan_type**)ListGetPtrToItem(srcVChan->sinkVChans,i);
		if (!sinkVChan->baseClass.isOpen) continue; // forward packet only to open Sink VChans connected to this Source VChan
		// put data packet into Sink VChan TSQ
		CmtErrChk( CmtWriteTSQData(sinkVChan->tsqHndl, dataPacketPtr, 1, (int)sinkVChan->writeTimeout, NULL) );
		nPacketsSent++;
	}
	
	*dataPacketPtr = NULL; 	// Data packet is considered to be consumed even if sending to some Sink VChans did not succeed
							// Sink VChans that did receive the data packet, can further process it and release it.
	return 0;

CmtError:
	
Cmt_ERR
	
Error:

	// cleanup
	for (size_t i = 0; i < nPacketRecipients - nPacketsSent; i++)
		ReleaseDataPacket(dataPacketPtr);
	
RETURN_ERR
}
/* In another thread, receives data and writes them into TSQ */
int CVICALLBACK receiveDataWriteToTSQ(void *functionData){
	int storeFileFlag = 0;
	GetCtrlVal(panelHdl, MainPanel_StoreTheData_Switch, &storeFileFlag);
	if(0 == dataSrc){ //read data from [device port]
		if(OpenComConfig(comPort, "", baudRate, parity, 
						 dataBits, stopBits, inQueueSize, outQueueSize) <0)
			showError("Failed to open RS232 port!");
		if(storeFileFlag > 0){
			if( writeFPP >0){
				writeFP = fopen(writeFilePath, "a");
				if(writeFP == NULL) 
					showError("Open WriteFile Failed");
				fseek(writeFP, writeFPP, SEEK_SET);
			}else{	
				SYSTEMTIME localTime;
				char dirName[MAX_PATHNAME_LEN];
				char fileName[200];
				GetProjectDir(dirName);
				strcat(dirName, "\\DataStorage");
				GetLocalTime(&localTime);
				sprintf(fileName, "%04d-%d-%d,%d_%02d_%02d.dat", 
						localTime.wYear, localTime.wMonth, localTime.wDay,
						localTime.wHour, localTime.wMinute, localTime.wSecond);
				MakePathname(dirName, fileName, writeFilePath);
				writeFP = fopen(writeFilePath, "a");
				if(writeFP == NULL) showError("Open WriteFile Failed");
			}
		}//if(storeFileFlag)
	}else if(1 == dataSrc){ //read data from [file]
		loadFP = fopen(loadFilePath, "r");
		if(loadFP == NULL){ 
			showError("Load File Failed");
			return -1;
		}
		fseek(loadFP, loadFPP, SEEK_SET);
	}else{ //[simulating data]
	}
	GetCtrlVal(panelHdl, MainPanel_StoreTheData_Switch, &storeFileFlag);
	while(receiveFlag){
		writeTSQEndFlag = 1;
		switch(dataSrc){
			case 0:
				bytesRead = ComRd(comPort, readData, READ_LENGTH);
				if(storeFileFlag > 0)
					fwrite(readData, sizeof(char), READ_LENGTH, writeFP);
				break;
			case 1:
				Delay(fileLoadSpeed);
				if(!feof(loadFP)){
					bytesRead = fread(readData, sizeof(char), READ_LENGTH, loadFP);
				}else{
					receiveFlag = 0;
					MessagePopup("Reach The End", "All data in this file has been read !");
				}
				break;
			case 2:
				for(int i=0; i<READ_LENGTH; i++)
					readData[i] = 0x80;
				Delay(0.1);
				break;
		}//switch()
		CmtWriteTSQData(tsqHdl, &readData, READ_LENGTH, TSQ_INFINITE_TIMEOUT, NULL);
		writeTSQEndFlag = 0;
	}//while()
	switch(dataSrc){
		case 0:
			//CloseCom(comPort);
			if(storeFileFlag >0){
				if(!feof(writeFP))
					writeFPP = ftell(writeFP);
				fclose(writeFP);
				writeFP = NULL;
			}
			break;
		case 1:
			if(!feof(loadFP))
				loadFPP = ftell(loadFP);
			fclose(loadFP);
			loadFP = NULL;
			break;
	}//switch()
	addLog("End-Acq", 0, panelHdl);
	return 0;
}