/****************************************************************************** * * Title : commandFunc_readWriteMaster.c * Version 0.0 * * Description: Reads/writes data from/to Master DSP memory space. * * * Author: Lukas Tomasek, tomasekl@fzu.cz * ******************************************************************************/ /****************************************************************************** * Header files * ******************************************************************************/ #include #include #include "commandListDefinitions.h" #include "commandFunc_readWriteMaster.h" #include "commandParamsUir.h" #include "globalDefinitions.h" #include "uirUtility.h" #include "mainUir.h" #include "vmeHpiUtility.h" #include "commandStatusMessage.h" #include "RWlists.h" /****************************************************************************** * Global functions * ******************************************************************************/ /*============================================================================= * commandFunction_readWriteMaster() *============================================================================= * * * */ ERROR_ID commandFunction_readWriteMaster(COMMAND_FUNC_OPTION funcOption, struct COMMAND *command, UINT8 slotNumber, FILE *file){ struct HOST *host; const int panel=global.panel.commandEdit[RW_MASTER_COMMAND_ID]; struct RW_MASTER_PARAMS *RWMaster=&command->params.readWriteMaster; int status; ERROR_ID errorId=SUCCESS; long fileSize; int option; UINT32 *buffer; char subdir[PATHNAME_LENGTH]; char inputText[500]; int i; switch(funcOption){ case COMMAND_TO_LIST: GetCtrlVal(panel, RW_MASTERP_READ_NOT_WRITE, &RWMaster->readNotWrite); GetCtrlVal(panel, RW_MASTERP_START_ADDR, &RWMaster->startAddress); GetCtrlVal(panel, RW_MASTERP_LENGTH, &RWMaster->length); GetCtrlVal(panel, RW_MASTERP_BLOCK_ACCESS, &RWMaster->blockAccess); GetCtrlVal(panel, RW_MASTERP_DELAY, &RWMaster->delay); if(RWMaster->length==0) { status = MessagePopup ("WARNING", "DataLength==0!!"); UIR_STATUS_CHECK(status, MessagePopup()); return(PROGRAM_WARNING); } if(RWMaster->readNotWrite==0){ /* write */ GetCtrlVal(panel, RW_MASTERP_INP_OPTION, &RWMaster->write.dataNotFile); if(RWMaster->write.dataNotFile){ /* one word */ GetCtrlVal(panel, RW_MASTERP_INPUT_DATA, &RWMaster->write.data); }else{ /* from file */ GetCtrlVal(panel, RW_MASTERP_INP_FILE, RWMaster->write.fileName); if(RWMaster->write.fileName[0]==0) { status = MessagePopup ("WARNING", "No InputDataFile selected!!"); UIR_STATUS_CHECK(status, MessagePopup()); return(PROGRAM_WARNING); } } }else{ /* read */ GetCtrlVal(panel, RW_MASTERP_OUTPUT_OPT, &option); if(option){ GetCtrlVal(panel, RW_MASTERP_WRITE_OR_APPEND, &RWMaster->read.appendNotWrite); GetCtrlVal(panel, RW_MASTERP_OUT_FILE, RWMaster->read.fileName); } else { RWMaster->read.fileName[0]=0; } GetCtrlVal(panel, RW_MASTERP_COMP_OPTION, &RWMaster->read.compareWithData); GetCtrlVal(panel, RW_MASTERP_COMP_DATA, &RWMaster->read.compData); GetCtrlVal(panel, RW_MASTERP_DATA_MASK, &RWMaster->read.dataMask); } break; case LIST_TO_COMMAND: SetCtrlVal(panel, RW_MASTERP_READ_NOT_WRITE, RWMaster->readNotWrite); SetCtrlVal(panel, RW_MASTERP_START_ADDR, RWMaster->startAddress); SetCtrlVal(panel, RW_MASTERP_LENGTH, RWMaster->length); SetCtrlVal(panel, RW_MASTERP_BLOCK_ACCESS, RWMaster->blockAccess); SetCtrlVal(panel, RW_MASTERP_DELAY, RWMaster->delay); status=SetInputMode(panel, RW_MASTERP_DELAY, !RWMaster->blockAccess); UIR_STATUS_CHECK(status, SetInputMode()); if(RWMaster->readNotWrite==0){ /* write */ status=SetCtrlAttribute(panel, RW_MASTERP_LENGTH, ATTR_CTRL_MODE, VAL_INDICATOR); UIR_STATUS_CHECK(status, SetCtrlAttribute()); status=SetCtrlAttribute(panel, RW_MASTERP_LENGTH, ATTR_FRAME_COLOR, VAL_LT_GRAY); UIR_STATUS_CHECK(status, SetCtrlAttribute()); SetCtrlVal(panel, RW_MASTERP_INP_OPTION, RWMaster->write.dataNotFile); status=SetInputMode(panel, RW_MASTERP_INP_OPTION, 1); UIR_STATUS_CHECK(status, SetInputMode()); if(RWMaster->write.dataNotFile){ /* one word */ SetCtrlVal(panel, RW_MASTERP_INPUT_DATA, RWMaster->write.data); status=SetInputMode(panel, RW_MASTERP_INPUT_DATA, 1); UIR_STATUS_CHECK(status, SetInputMode()); status=SetInputMode(panel, RW_MASTERP_INP_FILE, 0); UIR_STATUS_CHECK(status, SetInputMode()); }else{ /* from file */ SetCtrlVal(panel, RW_MASTERP_INP_FILE, RWMaster->write.fileName); status=SetInputMode(panel, RW_MASTERP_INP_FILE, 1); UIR_STATUS_CHECK(status, SetInputMode()); status=SetInputMode(panel, RW_MASTERP_INPUT_DATA, 0); UIR_STATUS_CHECK(status, SetInputMode()); } status=SetInputMode(panel, RW_MASTERP_OUTPUT_OPT, 0); UIR_STATUS_CHECK(status, SetInputMode()); status=SetInputMode(panel, RW_MASTERP_WRITE_OR_APPEND, 0); UIR_STATUS_CHECK(status, SetInputMode()); status=SetInputMode(panel, RW_MASTERP_OUT_FILE, 0); UIR_STATUS_CHECK(status, SetInputMode()); SetCtrlVal(panel, RW_MASTERP_COMP_DATA, 0); status=SetInputMode(panel, RW_MASTERP_COMP_OPTION, 0); UIR_STATUS_CHECK(status, SetInputMode()); SetCtrlVal(panel, RW_MASTERP_COMP_DATA, 0); status=SetInputMode(panel, RW_MASTERP_COMP_DATA, 0); UIR_STATUS_CHECK(status, SetInputMode()); status=SetInputMode(panel, RW_MASTERP_DATA_MASK, 0); UIR_STATUS_CHECK(status, SetInputMode()); }else{ /* read */ status=SetCtrlAttribute(panel, RW_MASTERP_LENGTH, ATTR_FRAME_COLOR, 0xCC9966); UIR_STATUS_CHECK(status, SetCtrlAttribute()); status=SetCtrlAttribute(panel, RW_MASTERP_LENGTH, ATTR_CTRL_MODE, VAL_NORMAL); UIR_STATUS_CHECK(status, SetCtrlAttribute()); SetCtrlVal(panel, RW_MASTERP_WRITE_OR_APPEND, RWMaster->read.appendNotWrite); status=SetInputMode(panel, RW_MASTERP_INPUT_DATA, 0); UIR_STATUS_CHECK(status, SetInputMode()); status=SetInputMode(panel, RW_MASTERP_INP_FILE, 0); UIR_STATUS_CHECK(status, SetInputMode()); status=SetInputMode(panel, RW_MASTERP_INP_OPTION, 0); UIR_STATUS_CHECK(status, SetInputMode()); status=SetInputMode(panel, RW_MASTERP_WRITE_OR_APPEND, 1); UIR_STATUS_CHECK(status, SetInputMode()); status=SetInputMode(panel, RW_MASTERP_OUTPUT_OPT, 1); UIR_STATUS_CHECK(status, SetInputMode()); SetCtrlVal(panel, RW_MASTERP_OUT_FILE, RWMaster->read.fileName); if(RWMaster->read.fileName[0]==0){ SetCtrlVal(panel, RW_MASTERP_OUTPUT_OPT, 0); status=SetInputMode(panel, RW_MASTERP_OUT_FILE, 0); UIR_STATUS_CHECK(status, SetInputMode()); }else{ SetCtrlVal(panel, RW_MASTERP_OUTPUT_OPT, 1); status=SetInputMode(panel, RW_MASTERP_OUT_FILE, 1); UIR_STATUS_CHECK(status, SetInputMode()); } SetCtrlVal(panel, RW_MASTERP_COMP_OPTION, RWMaster->read.compareWithData); status=SetInputMode(panel, RW_MASTERP_COMP_OPTION, (RWMaster->length<=4)); UIR_STATUS_CHECK(status, SetInputMode()); SetCtrlVal(panel, RW_MASTERP_COMP_DATA, RWMaster->read.compData); status=SetInputMode(panel, RW_MASTERP_COMP_DATA, RWMaster->read.compareWithData); UIR_STATUS_CHECK(status, SetInputMode()); SetCtrlVal(panel, RW_MASTERP_DATA_MASK, RWMaster->read.dataMask); status=SetInputMode(panel, RW_MASTERP_DATA_MASK, RWMaster->read.compareWithData); UIR_STATUS_CHECK(status, SetInputMode()); } break; case COMMAND_EXECUTION: host=global.host[HOST_INDEX(slotNumber)]; errorId=setHpicMaster(host->slotNumber); HOST_ERROR_CHECK(errorId, host, setHpicMaster()); if(errorId!=SUCCESS) return(COMMAND_ERROR); if(RWMaster->readNotWrite){ /* read */ buffer=malloc(RWMaster->length); if(buffer==NULL){ HOST_ERROR_CHECK(PROGRAM_ERROR, host, malloc()); return(COMMAND_ERROR); } if(RWMaster->blockAccess){ errorId=RWmaster(READ, host->slotNumber, RWMaster->startAddress, buffer, RWMaster->length/4, HPIA_AUTOINCREMENT, 0); HOST_ERROR_CHECK(errorId, host, RWmaster()); if(errorId!=SUCCESS){ free(buffer); return(COMMAND_ERROR); } }else{ for(i=0; i<(RWMaster->length/4); ++i){ Sleep(RWMaster->delay); errorId=RWmaster(READ, host->slotNumber, RWMaster->startAddress+4*i, buffer+i, 1, NO_HPIA_AUTOINCREMENT, 0); HOST_ERROR_CHECK(errorId, host, RWmaster()); if(errorId!=SUCCESS){ free(buffer); return(COMMAND_ERROR); } } } if(RWMaster->read.fileName[0]!=0){ strcpy(subdir, host->dataDir); strcat(subdir, RWMaster->read.fileName); errorId=writeToBinFile(subdir, RWMaster->read.appendNotWrite, buffer, RWMaster->length); HOST_ERROR_CHECK(errorId, host, writeToBinFile()); if(errorId!=SUCCESS){ free(buffer); return(COMMAND_ERROR); } } if(RWMaster->read.compareWithData){ /* compare data */ if(((*buffer)&RWMaster->read.dataMask)!=(RWMaster->read.compData&RWMaster->read.dataMask)){ sprintf(inputText,"##READ MASTER DATA COMPARISON(@addr:0x%X) - read(0x%X) and comp(0x%X, mask 0x%X) data are NOT equal!!\n", RWMaster->startAddress, *buffer, RWMaster->read.compData, RWMaster->read.dataMask); errorId=commandStatusMessage(host, host->commandStatusFile, inputText); HOST_ERROR_CHECK(errorId, host, commandStatusMessage()); free(buffer); return(COMMAND_ERROR); } } }else{ /* write */ if(RWMaster->write.dataNotFile){ errorId=RWmaster(WRITE, host->slotNumber, RWMaster->startAddress, &RWMaster->write.data, RWMaster->length/4, HPIA_AUTOINCREMENT, 0); HOST_ERROR_CHECK(errorId, host, RWmaster()); if(errorId!=SUCCESS) return(COMMAND_ERROR); }else{ buffer=malloc(RWMaster->length); if(buffer==NULL){ HOST_ERROR_CHECK(PROGRAM_ERROR, host, malloc()); return(COMMAND_ERROR); } errorId=readFromBinFile(RWMaster->write.fileName, buffer, RWMaster->length); HOST_ERROR_CHECK(errorId, host, readFromBinFile()); if(errorId!=SUCCESS){ free(buffer); return(COMMAND_ERROR); } if(RWMaster->blockAccess){ errorId=RWmaster(WRITE, host->slotNumber, RWMaster->startAddress, buffer, RWMaster->length/4, HPIA_AUTOINCREMENT, 0); HOST_ERROR_CHECK(errorId, host, RWmaster()); if(errorId!=SUCCESS){ free(buffer); return(COMMAND_ERROR); } }else{ for(i=0; i<(RWMaster->length/4); ++i){ Sleep(RWMaster->delay); errorId=RWmaster(WRITE, host->slotNumber, RWMaster->startAddress+4*i, buffer+i, 1, NO_HPIA_AUTOINCREMENT, 0); HOST_ERROR_CHECK(errorId, host, RWmaster()); if(errorId!=SUCCESS){ free(buffer); return(COMMAND_ERROR); } } } } } if(buffer!=NULL) free(buffer); /* !!!! */ break; case SAVE_CMD_TO_FILE: fprintf(file, "readNotWrite= %d, startAddress= 0x%X, length= 0x%X, blockAccess= %d, delay= %d\n", RWMaster->readNotWrite, RWMaster->startAddress, RWMaster->length, RWMaster->blockAccess, RWMaster->delay); if(RWMaster->readNotWrite==0){ /* write */ fprintf(file, "dataNotFile= %d, data= 0x%X\n", RWMaster->write.dataNotFile, RWMaster->write.data); fprintf(file, "fileName[]= %s\n", RWMaster->write.fileName); }else{ /* read */ fprintf(file, "compareWithData= %d, compData= 0x%X, dataMask= 0x%X, appendNotWrite= %d\n", RWMaster->read.compareWithData, RWMaster->read.compData, RWMaster->read.dataMask, RWMaster->read.appendNotWrite); fprintf(file, "fileName[]= %s\n", RWMaster->read.fileName); } break; case LOAD_CMD_FROM_FILE: status=fscanf(file, "readNotWrite= %d, startAddress= 0x%X, length= 0x%X, blockAccess= %d, delay= %d\n", &RWMaster->readNotWrite, &RWMaster->startAddress, &RWMaster->length, &RWMaster->blockAccess, &RWMaster->delay); if(status==-1) {ERROR_CHECK(FATAL_ERROR, Read from cmd file error!); return(FATAL_ERROR);} if(RWMaster->readNotWrite==0){ /* write */ status=fscanf(file, "dataNotFile= %d, data= 0x%X\n", &RWMaster->write.dataNotFile, &RWMaster->write.data); if(status==-1) {ERROR_CHECK(FATAL_ERROR, Read from cmd file error!); return(FATAL_ERROR);} status=readLineFromIndex(file, strlen("fileName[]= "), PATHNAME_LENGTH, RWMaster->write.fileName); if(status!=0) {ERROR_CHECK(FATAL_ERROR, Read from cmd file error!); return(FATAL_ERROR);} }else{ /* read */ status=fscanf(file, "compareWithData= %d, compData= 0x%X, dataMask= 0x%X, appendNotWrite= %d\n", &RWMaster->read.compareWithData, &RWMaster->read.compData, &RWMaster->read.dataMask, &RWMaster->read.appendNotWrite); if(status==-1) {ERROR_CHECK(FATAL_ERROR, Read from cmd file error!); return(FATAL_ERROR);} status=readLineFromIndex(file, strlen("fileName[]= "), PATHNAME_LENGTH, RWMaster->read.fileName); if(status!=0) {ERROR_CHECK(FATAL_ERROR, Read from cmd file error!); return(FATAL_ERROR);} } break; default: ; } return(SUCCESS); } /******************************************************************************/