/****************************************************************************** * * Title : primFunc_transSerData.c * Version 0.0, * * Description: Set primitive function to transmit serial data to controller * FPGA. * Related files: * * Author: Lukas Tomasek, tomasekl@fzu.cz * ******************************************************************************/ /****************************************************************************** * Header files * ******************************************************************************/ #include #include "primFunc_transSerData.h" #include "globalDefinitions.h" #include "uirUtility.h" #include "primParamsUir.h" #include "mainUir.h" #include #include "primFunctionInit.h" #include "RWlists.h" /****************************************************************************** * Global functions * ******************************************************************************/ /*============================================================================= * primFunction_transSerData() *============================================================================= * * * */ ERROR_ID primFunction_transSerData(PRIM_FUNC_OPTION funcOption, struct PRIM_TABLE *primTable, void *primitive, UINT32 inputParameter, UINT8 slotNumber){ FILE *file; struct MSG_HEAD* primHeader=(struct MSG_HEAD*) primitive; UINT32 *primDataPtr=(UINT32*)((UINT32)primHeader+sizeof(struct MSG_HEAD)); ERROR_ID errorId=SUCCESS; char errorMessage[200]; int status; int i; UINT32 primBodyLength; UINT32 primitiveId; struct PRIM_TRANS_SDATA_PARAMS *transSData=&primTable->params.transSerData; const int panel=global.panel.primEdit[getPrimArrayId(TRANS_SERIAL_DATA)]; UINT32 dataLength; unsigned int p0sets, p1sets; unsigned int p0fileSize, p1fileSize; struct TRANS_SERIAL_DATA_IN *transDataIn; UINT32 listIndex; int ringIndex; struct TRANS_DATA *dataInPtr; if(R_TRANS_SERIAL_DATA!=R_TRANS_SERIAL_DATA_HOST){ ERROR_CHECK(PROGRAM_ERROR, primitive TRANS_SERIAL_DATA - wrong revision number); return(PROGRAM_ERROR); } switch(funcOption){ case PRIM_PANEL_TO_TABLE: GetCtrlVal(panel, X_SER_DATA_CAP_SER_ON, &transSData->inputParams.captureSerOn); GetCtrlVal(panel, X_SER_DATA_P0_FILE, transSData->port0_fileName); GetCtrlVal(panel, X_SER_DATA_P0_SETS, &transSData->inputParams.streamLen[0]); GetCtrlVal(panel, X_SER_DATA_P1_FILE, transSData->port1_fileName); GetCtrlVal(panel, X_SER_DATA_P1_SETS, &transSData->inputParams.streamLen[1]); /* NO BREAK HERE!!!*/ case PRIM_PARAMS_TO_TABLE: /* add table headers - don't set indexes!!! */ primTable->inPrimHeader.length=SIZEOF(struct TRANS_SERIAL_DATA_IN)-SIZEOF(UINT32)+SIZEOF(struct MSG_HEAD)+transSData->inputParams.streamLen[0]+transSData->inputParams.streamLen[1]; primTable->inPrimHeader.id=TRANS_SERIAL_DATA; primTable->inPrimHeader.primRevision=R_TRANS_SERIAL_DATA; primTable->replyLength=0; break; case PRIM_TABLE_TO_PANEL: if(primTable->inPrimHeader.primRevision!=R_TRANS_SERIAL_DATA){ ERROR_CHECK(PROGRAM_ERROR, primitive TRANS_SERIAL_DATA - wrong revision number); return(PROGRAM_ERROR); } SetCtrlVal(panel, X_SER_DATA_CAP_SER_ON, transSData->inputParams.captureSerOn); SetCtrlVal(panel, X_SER_DATA_P0_FILE, transSData->port0_fileName); if(transSData->port0_fileName[0]!=0){ status=SetInputMode(panel, X_SER_DATA_P0_FILE, 1); UIR_STATUS_CHECK(status, SetInputMode()); SetCtrlVal(panel, X_SER_DATA_P0_FILE_OPT, 1); errorId=getFileSize(transSData->port0_fileName, &p0fileSize); ERROR_CHECK(errorId, getFileSize()); if(errorId!=SUCCESS) break; p0sets=((p0fileSize+3)/4); }else{ status=SetInputMode(panel, X_SER_DATA_P0_FILE, 0); UIR_STATUS_CHECK(status, SetInputMode()); SetCtrlVal(panel, X_SER_DATA_P0_FILE_OPT, 0); p0sets=0; } SetCtrlVal(panel, X_SER_DATA_P0_SETS, p0sets); SetCtrlVal(panel, X_SER_DATA_P1_FILE, transSData->port1_fileName); if(transSData->port1_fileName[0]!=0){ status=SetInputMode(panel, X_SER_DATA_P1_FILE, 1); UIR_STATUS_CHECK(status, SetInputMode()); SetCtrlVal(panel, X_SER_DATA_P1_FILE_OPT, 1); errorId=getFileSize(transSData->port1_fileName, &p1fileSize); ERROR_CHECK(errorId, getFileSize()); if(errorId!=SUCCESS) break; p1sets=((p1fileSize+3)/4); }else{ status=SetInputMode(panel, X_SER_DATA_P1_FILE, 0); UIR_STATUS_CHECK(status, SetInputMode()); SetCtrlVal(panel, X_SER_DATA_P1_FILE_OPT, 0); p1sets=0; } SetCtrlVal(panel, X_SER_DATA_P1_SETS, p1sets); /* update length!!!! */ primTable->inPrimHeader.length=SIZEOF(struct TRANS_SERIAL_DATA_IN)-SIZEOF(UINT32)+SIZEOF(struct MSG_HEAD)+transSData->inputParams.streamLen[0]+transSData->inputParams.streamLen[1]; break; case PRIM_BUILD: /* copy params */ transDataIn=(struct TRANS_SERIAL_DATA_IN*)primDataPtr; transDataIn->captureSerOn=transSData->inputParams.captureSerOn; if(transSData->port0_fileName[0]!=0){ errorId=getFileSize(transSData->port0_fileName, &p0fileSize); ERROR_CHECK(errorId, getFileSize()); p0sets=((p0fileSize+3)/4); }else{ p0sets=0; } transDataIn->streamLen[0]=p0sets; if(transSData->port1_fileName[0]!=0){ errorId=getFileSize(transSData->port1_fileName, &p1fileSize); ERROR_CHECK(errorId, getFileSize()); p1sets=((p1fileSize+3)/4); }else{ p1sets=0; } transDataIn->streamLen[1]=p1sets; /*copy data*/ primDataPtr+=SIZEOF(struct TRANS_SERIAL_DATA_IN)-SIZEOF(UINT32); if(p0sets>0){ errorId=readFromBinFile(transSData->port0_fileName, primDataPtr, p0fileSize); ERROR_CHECK(errorId, readFromBinFile()); if(errorId!=SUCCESS){ return(errorId); } primDataPtr+=p0sets; } if(p1sets>0){ errorId=readFromBinFile(transSData->port1_fileName, primDataPtr, p1fileSize); ERROR_CHECK(errorId, readFromBinFile()); if(errorId!=SUCCESS){ return(errorId); } } /* updata length!!!! */ primTable->inPrimHeader.length=SIZEOF(struct TRANS_SERIAL_DATA_IN)-SIZEOF(UINT32)+SIZEOF(struct MSG_HEAD)+p0sets+p1sets; primHeader->length=primTable->inPrimHeader.length; break; case REP_DATA_PROCESS: /* no reply */ break; case WRITE_TO_FILE: file=(FILE*)inputParameter; fprintf(file, "captureSerOn= %d\n", transSData->inputParams.captureSerOn); fprintf(file, "port0_fileName[]= %s\n", transSData->port0_fileName); fprintf(file, "port1_fileName[]= %s\n", transSData->port1_fileName); break; case READ_FROM_FILE: file=(FILE*)inputParameter; status=fscanf(file, "captureSerOn= %d\n", &transSData->inputParams.captureSerOn); if(status==-1) {ERROR_CHECK(FATAL_ERROR, Read from prim file error!); return(FATAL_ERROR);} status=readLineFromIndex(file, strlen("port0_fileName[]= "), PATHNAME_LENGTH, transSData->port0_fileName); if(status!=0) {ERROR_CHECK(FATAL_ERROR, Read from prim file error!); return(FATAL_ERROR);} status=readLineFromIndex(file, strlen("port1_fileName[]= "), PATHNAME_LENGTH, transSData->port1_fileName); if(status!=0) {ERROR_CHECK(FATAL_ERROR, Read from prim file error!); return(FATAL_ERROR);} break; default: ;//error } return(SUCCESS); } /******************************************************************************/