/*************************************************************************** * * Title : primFunction_RWFifo.c * Version 0.0, * * Description: RW fifo primitive function. * Related files: * * Author: Lukas Tomasek, tomasekl@fzu.cz * ******************************************************************************/ /****************************************************************************** * Header files * ******************************************************************************/ #include #include #include "primFunc_RWFifo.h" #include "fileUtility.h" #include "globalDefinitions.h" #include "uirUtility.h" #include "primParamsUir.h" #include #include "primFunctionInit.h" #include "RWlists.h" /****************************************************************************** * Global functions * *****************************************************************************/ /*============================================================================= * primFunction_RWFifo() *============================================================================= * * * */ ERROR_ID primFunction_RWFifo(PRIM_FUNC_OPTION funcOption, struct PRIM_TABLE *primTable, void *primitive, UINT32 inputParameter, UINT8 slotNumber){ FILE *file; ERROR_ID errorId=SUCCESS; char errorMessage[200]; int status; char *fileName; struct MSG_HEAD* primHeader=(struct MSG_HEAD*) primitive; UINT32 *primDataPtr=(UINT32*)((UINT32)primHeader+sizeof(struct MSG_HEAD)); struct HOST *host; UINT32 primBodyLength; UINT32 primitiveId; int outputFile; struct PRIM_RWFIFO_PARAMS *RWFifo=&primTable->params.RWFifo; char subdir[PATHNAME_LENGTH]; const int panel=global.panel.primEdit[getPrimArrayId(RW_FIFO)]; UINT32 i, j; UINT32 dataLength; int outFileOption; UINT32 objectId; int paramsLength; unsigned int elementSize; unsigned int fifoIdAndBank; UINT32 expectedBytesXfrd; unsigned int fileSize; struct RW_FIFO_OUT *RWFifoOut; if(R_RW_FIFO!=R_RW_FIFO_HOST){ ERROR_CHECK(PROGRAM_ERROR, primitive RW_FIFO - wrong revision number); return(PROGRAM_ERROR); } switch(funcOption){ case PRIM_PANEL_TO_TABLE: GetCtrlVal(panel, RW_FIFOP_FIFO_ID_AND_BANK, &fifoIdAndBank); RWFifo->inputParams.fifoId=GET_FIFO_ID(fifoIdAndBank); RWFifo->inputParams.bank=GET_FIFO_BANK(fifoIdAndBank); GetCtrlVal(panel, RW_FIFOP_NUM_ELEMENTS, &RWFifo->inputParams.numElements); GetCtrlVal(panel, RW_FIFOP_READ_NOT_WRITE, &RWFifo->inputParams.readNotWrite); RWFifo->inputParams.dataBaseAdr=(UINT32*)DEFAULT; /* list in primBuff !!!!! */ if(RWFifo->inputParams.readNotWrite==1){ /* read */ GetCtrlVal(panel, RW_FIFOP_OUTPUT_OPT, &outFileOption); if(outFileOption){ GetCtrlVal(panel, RW_FIFOP_OUT_FILE, RWFifo->dataFileName); } else { RWFifo->dataFileName[0]=0; } }else{ /* write */ GetCtrlVal(panel, RW_FIFOP_INP_FILE, RWFifo->dataFileName); //GetCtrlVal(panel, RW_FIFOP_FILE_SIZE, &RWFifo->inDataFile.size); if(RWFifo->dataFileName[0]==0){ status=MessagePopup ("WARNING", "Select input data!"); UIR_STATUS_CHECK(status, MessagePopup()); return(PROGRAM_ERROR); }; }; /* NO BREAK HERE!!!*/ case PRIM_PARAMS_TO_TABLE: elementSize=getFifoElementSize(RWFifo->inputParams.fifoId, RWFifo->inputParams.bank); /* add table headers - don't set indexes!!! */ primTable->inPrimHeader.length=SIZEOF(struct MSG_HEAD)+SIZEOF(struct RW_FIFO_IN); if(RWFifo->inputParams.readNotWrite==0){ /* write */ primTable->inPrimHeader.length+=((RWFifo->inputParams.numElements*elementSize+3)/sizeof(UINT32)); } primTable->inPrimHeader.id=RW_FIFO; primTable->inPrimHeader.primRevision=R_RW_FIFO_HOST; primTable->replyLength=SIZEOF(struct MSG_HEAD)+SIZEOF(struct RW_FIFO_OUT); if(RWFifo->inputParams.readNotWrite==1){ /* read */ primTable->replyLength+=((RWFifo->inputParams.numElements*elementSize+3)/sizeof(UINT32)); } break; case PRIM_TABLE_TO_PANEL: if(primTable->inPrimHeader.primRevision!=R_RW_FIFO){ ERROR_CHECK(PROGRAM_ERROR, primitive RW_FIFO - wrong revision number); return(PROGRAM_ERROR); } fifoIdAndBank=GET_FIFO_ID_AND_BANK(RWFifo->inputParams.fifoId, RWFifo->inputParams.bank); SetCtrlVal(panel, RW_FIFOP_FIFO_ID_AND_BANK, fifoIdAndBank); SetCtrlVal(panel, RW_FIFOP_NUM_ELEMENTS, RWFifo->inputParams.numElements); SetCtrlVal(panel, RW_FIFOP_READ_NOT_WRITE, RWFifo->inputParams.readNotWrite); if(RWFifo->inputParams.readNotWrite==1){ /* read */ status=SetCtrlAttribute(panel, RW_FIFOP_NUM_ELEMENTS, ATTR_FRAME_COLOR, 0xCC9966); UIR_STATUS_CHECK(status, SetCtrlAttribute()); status=SetCtrlAttribute(panel, RW_FIFOP_NUM_ELEMENTS, ATTR_CTRL_MODE, VAL_NORMAL); UIR_STATUS_CHECK(status, SetCtrlAttribute()); SetCtrlVal(panel, RW_FIFOP_OUT_FILE, RWFifo->dataFileName); SetCtrlVal(panel, RW_FIFOP_INP_FILE, 0); status=SetInputMode(panel, RW_FIFOP_INP_FILE, 0); UIR_STATUS_CHECK(status, SetInputMode()); //SetCtrlVal(panel, RW_FIFOP_FILE_SIZE, 0); //status=SetInputMode(panel, RW_FIFOP_FILE_SIZE, 0); //UIR_STATUS_CHECK(status, SetInputMode()); if(RWFifo->dataFileName[0]==0){ SetCtrlVal(panel, RW_FIFOP_OUTPUT_OPT, 0); status=SetInputMode(panel, RW_FIFOP_OUT_FILE, 0); UIR_STATUS_CHECK(status, SetInputMode()); }else{ SetCtrlVal(panel, RW_FIFOP_OUTPUT_OPT, 1); status=SetInputMode(panel, RW_FIFOP_OUT_FILE, 1); UIR_STATUS_CHECK(status, SetInputMode()); } status=SetInputMode(panel, RW_FIFOP_OUTPUT_OPT, 1); UIR_STATUS_CHECK(status, SetInputMode()); }else{ /* write */ status=SetCtrlAttribute(panel, RW_FIFOP_NUM_ELEMENTS, ATTR_CTRL_MODE, VAL_INDICATOR); UIR_STATUS_CHECK(status, SetCtrlAttribute()); status=SetCtrlAttribute(panel, RW_FIFOP_NUM_ELEMENTS, ATTR_FRAME_COLOR, VAL_LT_GRAY); UIR_STATUS_CHECK(status, SetCtrlAttribute()); status=SetInputMode(panel, RW_FIFOP_INP_FILE, 1); UIR_STATUS_CHECK(status, SetInputMode()); SetCtrlVal(panel, RW_FIFOP_INP_FILE, RWFifo->dataFileName); //status=SetInputMode(panel, RW_FIFOP_FILE_SIZE, 1); //UIR_STATUS_CHECK(status, SetInputMode()); //SetCtrlVal(panel, RW_FIFOP_FILE_SIZE, RWFifo->inDataFile.size); - dodelat!!! SetCtrlVal(panel, RW_FIFOP_OUTPUT_OPT, 0); status=SetInputMode(panel, RW_FIFOP_OUTPUT_OPT, 0); UIR_STATUS_CHECK(status, SetInputMode()); SetCtrlVal(panel, RW_FIFOP_OUT_FILE, 0); status=SetInputMode(panel, RW_FIFOP_OUT_FILE, 0); UIR_STATUS_CHECK(status, SetInputMode()); } break; case PRIM_BUILD: paramsLength=sizeof(struct RW_FIFO_IN); memcpy(primDataPtr, &RWFifo->inputParams, paramsLength); /* copy parameters */ if(RWFifo->inputParams.readNotWrite==0){ /* write */ primDataPtr+=(paramsLength/sizeof(UINT32)); /* file size is NOT checked again!!! */ elementSize=getFifoElementSize(RWFifo->inputParams.fifoId, RWFifo->inputParams.bank); errorId=readFromBinFile(RWFifo->dataFileName, primDataPtr, RWFifo->inputParams.numElements*elementSize); ERROR_CHECK(errorId, readFromBinFile()); if(errorId!=SUCCESS) return(errorId); } break; case REP_DATA_PROCESS: host=global.host[HOST_INDEX(slotNumber)]; RWFifoOut= (struct RW_FIFO_OUT*) primDataPtr; elementSize=getFifoElementSize(RWFifo->inputParams.fifoId, RWFifo->inputParams.bank); expectedBytesXfrd=RWFifo->inputParams.numElements*elementSize; if(RWFifoOut->bytesXfrd!=expectedBytesXfrd){ ERROR_CHECK(REPLIST_ERROR, RWFifoOut->xfrSize!=expectedBytesXfrd !!!); } if(RWFifo->inputParams.readNotWrite==1){ /* read */ if(RWFifo->dataFileName[0]!=0){ strcpy(subdir, host->dataDir); strcat(subdir, RWFifo->dataFileName); errorId=writeToBinFile(subdir, 0, primDataPtr+1, RWFifoOut->bytesXfrd); ERROR_CHECK(errorId, writeToBinFile()); if(errorId!=SUCCESS) return(errorId); } } break; case WRITE_TO_FILE: file=(FILE*)inputParameter; fprintf(file, "fifoId= %d, bank= %d, readNotWrite= %d, numElements= 0x%X, *dataBaseAdr= 0x%X\n", RWFifo->inputParams.fifoId, RWFifo->inputParams.bank, RWFifo->inputParams.readNotWrite, RWFifo->inputParams.numElements, (UINT32)RWFifo->inputParams.dataBaseAdr); fprintf(file, "dataFileName[]= %s\n", RWFifo->dataFileName); break; case READ_FROM_FILE: file=(FILE*)inputParameter; status=fscanf(file, "fifoId= %d, bank= %d, readNotWrite= %d, numElements= 0x%X, *dataBaseAdr= 0x%X\n", &RWFifo->inputParams.fifoId, &RWFifo->inputParams.bank, &RWFifo->inputParams.readNotWrite, &RWFifo->inputParams.numElements, (UINT32*)&RWFifo->inputParams.dataBaseAdr); if(status==-1) {ERROR_CHECK(FATAL_ERROR, Read from prim file error!); return(FATAL_ERROR);} status=readLineFromIndex(file, strlen("dataFileName[]= "), PATHNAME_LENGTH, RWFifo->dataFileName); if(status!=0) {ERROR_CHECK(FATAL_ERROR, Read from prim file error!); return(FATAL_ERROR);} break; default: ; } return(SUCCESS); } /*============================================================================= * getFifoElementSize() *============================================================================= * * returns fifo element size in bytes. * */ int getFifoElementSize(UINT32 fifoId, UINT32 fifoBank){ if((fifoId==EVENT_MEM)&&(fifoBank==BANK_C)){ return(4); }else{ if(fifoId!=TIM_MEM){ return(6); }else{ return(1); /* TIM_MEM */ } } } /******************************************************************************/