/****************************************************************************** * * Title : primFunc_echo.c * Version 0.0 * * Description: echo primitive function. * Related files: * * Author: Lukas Tomasek, tomasekl@fzu.cz * ******************************************************************************/ /****************************************************************************** * Header files * ******************************************************************************/ #include #include #include "primFunc_echo.h" #include "fileUtility.h" #include "globalDefinitions.h" #include "uirUtility.h" #include "primParamsUir.h" #include #include "primFunctionInit.h" #include "RWlists.h" /****************************************************************************** * Global functions * ******************************************************************************/ /*============================================================================= * primFunction_echo() *============================================================================= * * Echo primitive function * */ ERROR_ID primFunction_echo(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; unsigned int fileSize; struct MSG_HEAD* primHeader=(struct MSG_HEAD*) primitive; UINT32 *primDataPtr=(UINT32*)((UINT32)primHeader+sizeof(struct MSG_HEAD)); UINT32 maxLength; UINT32 primBodyLength; UINT32 primitiveId; int outputFile; struct PRIM_ECHO_PARAMS *echo=&primTable->params.echo; char subdir[PATHNAME_LENGTH]; const int panel=global.panel.primEdit[getPrimArrayId(ECHO)]; UINT32 i; UINT32 dataLength; UINT32 *buffer; if(R_ECHO!=R_ECHO_HOST){ ERROR_CHECK(PROGRAM_ERROR, primitive ECHO - wrong revision number); return(PROGRAM_ERROR); } switch(funcOption){ case PRIM_PANEL_TO_TABLE: GetCtrlVal(panel, PANEL_ECHO_INPUT_OPTION, (int*)&echo->inputDataOption); GetCtrlVal(panel, PANEL_ECHO_TEST_DATA_LENGTH, &echo->testDataLength); switch(echo->inputDataOption){ case TEST_PATTERN: GetCtrlVal(panel, PANEL_ECHO_TEST_PATTERN, &echo->testPattern); break; case FROM_FILE: GetCtrlVal(panel, PANEL_ECHO_INP_FILE, (char*)&echo->inDataFileName); break; default: ERROR_CHECK(PROGRAM_ERROR, wrong echo input option!); break; } /* NO BREAK HERE!!!*/ case PRIM_PARAMS_TO_TABLE: /* add table headers - don't set indexes!!! */ primTable->inPrimHeader.length=echo->testDataLength+SIZEOF(struct MSG_HEAD); primTable->inPrimHeader.id=ECHO; primTable->inPrimHeader.primRevision=R_ECHO_HOST; primTable->replyLength=primTable->inPrimHeader.length; break; case PRIM_TABLE_TO_PANEL: if(primTable->inPrimHeader.primRevision!=R_ECHO){ ERROR_CHECK(PROGRAM_ERROR, primitive ECHO - wrong revision number); return(PROGRAM_ERROR); } SetCtrlVal(panel, PANEL_ECHO_TEST_DATA_LENGTH, echo->testDataLength); SetCtrlVal(panel, PANEL_ECHO_INPUT_OPTION, echo->inputDataOption); switch(echo->inputDataOption){ case TEST_PATTERN: SetCtrlVal(panel, PANEL_ECHO_TEST_PATTERN, echo->testPattern); SetCtrlVal(panel, PANEL_ECHO_INP_FILE, 0); /* no input file */ status=SetInputMode(panel, PANEL_ECHO_TEST_PATTERN, 1); UIR_STATUS_CHECK(status, SetInputMode()); status=SetInputMode(panel, PANEL_ECHO_INP_FILE, 0); UIR_STATUS_CHECK(status, SetInputMode()); status=SetCtrlAttribute(panel, PANEL_ECHO_TEST_DATA_LENGTH, ATTR_CTRL_MODE, VAL_NORMAL); UIR_STATUS_CHECK(status, SetCtrlAttribute()); status=SetCtrlAttribute(panel, PANEL_ECHO_TEST_DATA_LENGTH, ATTR_FRAME_COLOR, 0xCC9966); UIR_STATUS_CHECK(status, SetCtrlAttribute()); break; case FROM_FILE: SetCtrlVal(panel, PANEL_ECHO_INP_FILE, echo->inDataFileName); status=SetInputMode(panel, PANEL_ECHO_TEST_PATTERN, 0); UIR_STATUS_CHECK(status, SetInputMode()); status=SetInputMode(panel, PANEL_ECHO_INP_FILE, 1); status=SetCtrlAttribute(panel, PANEL_ECHO_TEST_DATA_LENGTH, ATTR_CTRL_MODE, VAL_INDICATOR); UIR_STATUS_CHECK(status, SetCtrlAttribute()); status=SetCtrlAttribute(panel, PANEL_ECHO_TEST_DATA_LENGTH, ATTR_FRAME_COLOR, VAL_LT_GRAY); UIR_STATUS_CHECK(status, SetCtrlAttribute()); break; default: ERROR_CHECK(PROGRAM_ERROR, primitive ECHO - inputDataOption); break; } break; case PRIM_BUILD: maxLength=inputParameter; switch(echo->inputDataOption){ case TEST_PATTERN: for(i=0; itestDataLength; ++i){ *(primDataPtr+i)=echo->testPattern; } break; case FROM_FILE: fileName=primTable->params.echo.inDataFileName; /* check file size again */ errorId=getFileSize (fileName, &fileSize); ERROR_CHECK(errorId, getFileSize()); if(errorId!=SUCCESS) return(errorId); /* align on 32 bit boundary */ echo->testDataLength=((fileSize+3)/4); /* updata length!!!! */ primTable->inPrimHeader.length=primTable->inPrimHeader.length=echo->testDataLength+SIZEOF(struct MSG_HEAD); primTable->replyLength=primTable->inPrimHeader.length; if(primTable->inPrimHeader.length>maxLength){ ERROR_CHECK(PROGRAM_ERROR, Echo prim - length exceeded); return(PROGRAM_ERROR); } /* copy data */ errorId=readFromBinFile(fileName, primDataPtr, fileSize); ERROR_CHECK(errorId, readFromBinFile()); if(errorId!=SUCCESS) return(errorId); break; default: ERROR_CHECK(PROGRAM_ERROR, wrong echo input option!); return(PROGRAM_ERROR); } break; case REP_DATA_PROCESS: /* check rest of the file */ dataLength=primHeader->length-SIZEOF(struct MSG_HEAD); if(echo->inputDataOption==TEST_PATTERN){ /* compare the data */ for(i=0; itestPattern){ ERROR_CHECK(PROGRAM_ERROR, Echo error replyData!=inputData!!!); break; } } }else{ /* from file */ buffer=calloc(echo->testDataLength, sizeof(UINT32)); /* allocate and clear memory for data buffer */ if(buffer==NULL){ ERROR_CHECK(PROGRAM_ERROR, calloc()); return(PROGRAM_ERROR); } errorId=readFromBinFile(echo->inDataFileName, buffer, echo->testDataLength*sizeof(UINT32)); ERROR_CHECK(errorId, readFromBinFile()); if(errorId!=SUCCESS){ free(buffer); /* !! */ return(errorId); } for(i=0; itestDataLength; ++i){ /* compare the data */ if((*(primDataPtr+i))!=(*(buffer+i))){ ERROR_CHECK(PROGRAM_ERROR, Echo error replyData!=inputData!!!); free(buffer); /* !! */ return(PROGRAM_ERROR); } } free(buffer); /* !! */ } break; case WRITE_TO_FILE: file=(FILE*)inputParameter; fprintf(file, "inputDataOption= %d\n", echo->inputDataOption); switch(echo->inputDataOption){ case TEST_PATTERN: fprintf(file, "testPattern= 0x%X, testDataLength= 0x%X\n", echo->testPattern, echo->testDataLength); break; case FROM_FILE: fprintf(file, "inDataFileName[]= %s\n", echo->inDataFileName); break; } break; case READ_FROM_FILE: file=(FILE*)inputParameter; status=fscanf(file, "inputDataOption= %d\n", (int*)&echo->inputDataOption); if(status==-1) {ERROR_CHECK(FATAL_ERROR, Read from prim file error!); return(FATAL_ERROR);} switch(echo->inputDataOption){ case TEST_PATTERN: status=fscanf(file, "testPattern= 0x%X, testDataLength= 0x%X\n", &echo->testPattern, &echo->testDataLength); if(status==-1) {ERROR_CHECK(FATAL_ERROR, Read from prim file error!); return(FATAL_ERROR);} break; case FROM_FILE: status=readLineFromIndex(file, strlen("inDataFileName[]= "), 300, echo->inDataFileName); if(status!=0) {ERROR_CHECK(FATAL_ERROR, Read from prim file error!); return(FATAL_ERROR);} break; } break; default: ; } return(SUCCESS); } /******************************************************************************/