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