/*************************************************************************** * * Title : primFunction_RWmodule.c * Version 0.0, * * Description: * Related files: * * Author: Lukas Tomasek, tomasekl@fzu.cz * ******************************************************************************/ /****************************************************************************** * Header files * ******************************************************************************/ #include #include #include "primFunc_RWmoduleData.h" #include "fileUtility.h" #include "globalDefinitions.h" #include "uirUtility.h" #include "primParamsUir.h" #include #include "primFunctionInit.h" #include "RWlists.h" #if defined(SCT_ROD) #include "rwConfig_sct.h" #elif defined(PIXEL_ROD) #include "rwConfig_pxl.h" #endif /* SCT_ROD or PIXEL_ROD */ /****************************************************************************** * Global functions * ******************************************************************************/ /*============================================================================= * primFunction_RWmoduleData() *============================================================================= * * * */ ERROR_ID primFunction_RWmoduleData(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; long fileSize; struct MSG_HEAD* primHeader=(struct MSG_HEAD*) primitive; UINT32 *primDataPtr=(UINT32*)((UINT32)primHeader+sizeof(struct MSG_HEAD)); struct HOST *host; UINT32 primBodyLength; UINT32 primitiveId; unsigned int paramsLength; int outputFile; struct RW_MODULE_DATA_PARAMS *RWmodule=&primTable->params.RWmodule; char subdir[PATHNAME_LENGTH]; const int panel=global.panel.primEdit[getPrimArrayId(RW_MODULE_DATA)]; UINT32 i, j; UINT32 dataLength; int outFileOption; int readNotWrite; #ifdef PIXEL_ROD PixelModule *pixModule; #endif RwModuleDataOut *RWmoduleOut; if(R_RW_MODULE_DATA!=R_RW_MODULE_DATA_HOST){ ERROR_CHECK(PROGRAM_ERROR, primitive RW_MODULE_DATA - wrong revision number); return(PROGRAM_ERROR); } switch(funcOption){ case PRIM_PANEL_TO_TABLE: GetCtrlVal(panel, RW_MODULEP_READ_NOT_WRITE, &RWmodule->inputParams.fRead); GetCtrlVal(panel, RW_MODULEP_STRUCT_ID, &RWmodule->inputParams.cfgSet); GetCtrlVal(panel, RW_MODULEP_MODULE, &RWmodule->inputParams.module); RWmodule->active=0; RWmodule->groupId=0; RWmodule->pTTC=0; RWmodule->rx[0]=0; #if (defined(SCT_ROD)) RWmodule->rx[1]=0; #endif if(RWmodule->inputParams.fRead==1){ /* read */ GetCtrlVal(panel, RW_MODULEP_OUT_FILE, RWmodule->dataFileName); if(RWmodule->dataFileName[0]==0){ status=MessagePopup ("WARNING", "Select output file!"); UIR_STATUS_CHECK(status, MessagePopup()); return(PROGRAM_ERROR); }; }else{ /* write */ GetCtrlVal(panel, RW_MODULEP_INP_FILE, RWmodule->dataFileName); //For SCT, these are set by the input cfg. file. #ifdef PIXEL_ROD GetCtrlVal(panel, RW_MODULEP_ACTIVE, (int*)&RWmodule->active); GetCtrlVal(panel, RW_MODULEP_GROUP_ID, &RWmodule->groupId); GetCtrlVal(panel, RW_MODULEP_PTTC, &RWmodule->pTTC); GetCtrlVal(panel, RW_MODULEP_RX0, &RWmodule->rx[0]); #endif if(RWmodule->dataFileName[0]==0){ status=MessagePopup ("WARNING", "Select input data file!"); UIR_STATUS_CHECK(status, MessagePopup()); return(PROGRAM_ERROR); }; }; /* NO BREAK HERE!!!*/ case PRIM_PARAMS_TO_TABLE: /* add table headers - don't set indexes!!! */ primTable->inPrimHeader.length=SIZEOF(struct MSG_HEAD)+SIZEOF(RwModuleDataIn); //dpsf: (with dummy ptr): //dpsf: primTable->inPrimHeader.length=SIZEOF(struct MSG_HEAD)+SIZEOF(RwModuleDataIn)-SIZEOF(UINT32); if(RWmodule->inputParams.fRead==0){ /* write */ #if defined(SCT_ROD) primTable->inPrimHeader.length+= SIZEOF(ABCDModule); #elif defined(PIXEL_ROD) primTable->inPrimHeader.length+= SIZEOF(PixelModule); #endif } primTable->inPrimHeader.id=RW_MODULE_DATA; primTable->inPrimHeader.primRevision=R_RW_MODULE_DATA_HOST; if(RWmodule->inputParams.fRead==1){ /* read */ primTable->replyLength=SIZEOF(struct MSG_HEAD)+SIZEOF(RwModuleDataOut); }else{ primTable->replyLength=0; /* write */ } break; case PRIM_TABLE_TO_PANEL: if(primTable->inPrimHeader.primRevision!=R_RW_MODULE_DATA){ ERROR_CHECK(PROGRAM_ERROR, primitive RW_MODULE_DATA - wrong revision number); return(PROGRAM_ERROR); } SetCtrlVal(panel, RW_MODULEP_READ_NOT_WRITE, RWmodule->inputParams.fRead); SetCtrlVal(panel, RW_MODULEP_STRUCT_ID, RWmodule->inputParams.cfgSet); SetCtrlVal(panel, RW_MODULEP_MODULE, RWmodule->inputParams.module); //For SCT, these are set by the input cfg. file. #ifdef PIXEL_ROD readNotWrite=RWmodule->inputParams.readNotWrite; SetCtrlVal(panel, RW_MODULEP_ACTIVE, (int)RWmodule->active); SetCtrlVal(panel, RW_MODULEP_GROUP_ID, RWmodule->groupId); SetCtrlVal(panel, RW_MODULEP_PTTC, RWmodule->pTTC); SetCtrlVal(panel, RW_MODULEP_RX0, RWmodule->rx[0]); SetInputMode(panel, RW_MODULEP_TEXTMSG_2, !readNotWrite); SetInputMode(panel, RW_MODULEP_ACTIVE, !readNotWrite); SetInputMode(panel, RW_MODULEP_GROUP_ID, !readNotWrite); SetInputMode(panel, RW_MODULEP_PTTC, !readNotWrite); SetInputMode(panel, RW_MODULEP_RX0, !readNotWrite); #endif if(RWmodule->inputParams.fRead==1){ /* read */ status=SetInputMode(panel, RW_MODULEP_OUT_FILE, 1); UIR_STATUS_CHECK(status, SetInputMode()); SetCtrlVal(panel, RW_MODULEP_OUT_FILE, RWmodule->dataFileName); SetCtrlVal(panel, RW_MODULEP_INP_FILE, 0); status=SetInputMode(panel, RW_MODULEP_INP_FILE, 0); UIR_STATUS_CHECK(status, SetInputMode()); }else{ /* write */ status=SetInputMode(panel, RW_MODULEP_INP_FILE, 1); UIR_STATUS_CHECK(status, SetInputMode()); SetCtrlVal(panel, RW_MODULEP_INP_FILE, RWmodule->dataFileName); SetCtrlVal(panel, RW_MODULEP_OUT_FILE, 0); status=SetInputMode(panel, RW_MODULEP_OUT_FILE, 0); UIR_STATUS_CHECK(status, SetInputMode()); }; break; case PRIM_BUILD: paramsLength=sizeof(RwModuleDataIn); //dpsf: (with dummy ptr): //dpsf: paramsLength=sizeof(RwModuleDataIn) -sizeof(UINT32); #ifdef PIXEL_ROD host= global.host[HOST_INDEX(slotNumber)]; printf("index. slot, bandwidth, ptr: %d %d %d 0x%x\n", HOST_INDEX(slotNumber), slotNumber, host->bandwidth, &host); #endif memcpy(primDataPtr, &RWmodule->inputParams, paramsLength); /* copy parameters */ if(RWmodule->inputParams.fRead==0){ /* write */ primDataPtr+=(paramsLength/sizeof(UINT32)); #if defined(SCT_ROD) memset(primDataPtr, 0, sizeof(ABCDModule)); status=readConfigModule((ABCDModule*) primDataPtr, RWmodule->dataFileName); if(status!=0){ ERROR_CHECK(PROGRAM_ERROR, readConfigModule()); return(PROGRAM_ERROR); } #elif defined(PIXEL_ROD) memset(primDataPtr, 0, sizeof(PixelModule)); pixModule=(PixelModule*) primDataPtr; status=readConfigModule(pixModule, RWmodule->dataFileName, global.moduleCfgDir); if(status!=0){ ERROR_CHECK(PROGRAM_ERROR, readConfigModule()); return(PROGRAM_ERROR); } pixModule->MCCRegisters.regCSR &= ~0x3; //clear bandwidth field. pixModule->MCCRegisters.regCSR |= (host->bandwidth/40); //add bandwidth. pixModule->active= RWmodule->active; pixModule->groupId= RWmodule->groupId; pixModule->pTTC= RWmodule->pTTC; pixModule->rx= RWmodule->rx[0]; #endif /* SCT_ROD or PIXEL_ROD */ } break; case REP_DATA_PROCESS: host=global.host[HOST_INDEX(slotNumber)]; RWmoduleOut= (RwModuleDataOut *) primDataPtr; if(RWmodule->inputParams.fRead==1){ /* read */ if(RWmodule->dataFileName[0]!=0){ strcpy(subdir, host->dataDir); strcat(subdir, RWmodule->dataFileName); #if defined(SCT_ROD) status=writeConfigModule((ABCDModule*) primDataPtr, subdir); if(status!=0){ ERROR_CHECK(PROGRAM_ERROR, readConfigModule()); return(PROGRAM_ERROR); } #elif defined(PIXEL_ROD) status=writeConfigModule((PixelModule*) primDataPtr, subdir); if(status!=0){ ERROR_CHECK(PROGRAM_ERROR, writeConfigFile()); return(PROGRAM_ERROR); } #endif /* SCT_ROD or PIXEL_ROD */ } } break; case WRITE_TO_FILE: file=(FILE*)inputParameter; fprintf(file, "readNotWrite= %d, structId= %d, moduleNum= %d\n", RWmodule->inputParams.fRead, RWmodule->inputParams.cfgSet, RWmodule->inputParams.module); fprintf(file, "dataFileName[]= %s\n", RWmodule->dataFileName); fprintf(file, "active= %d, groupId= %d, pTTC= %d, rx[]= {0x%x, 0x%x, 0x%x, 0x%x}\n", (int)RWmodule->active, RWmodule->groupId, RWmodule->pTTC, RWmodule->rx[0], RWmodule->rx[1], RWmodule->rx[2], RWmodule->rx[3]); break; case READ_FROM_FILE: file=(FILE*)inputParameter; status=fscanf(file, "readNotWrite= %d, structId= %d, moduleNum= %d\n", &RWmodule->inputParams.fRead, &RWmodule->inputParams.cfgSet, &RWmodule->inputParams.module); if(status==-1) {ERROR_CHECK(FATAL_ERROR, Read from prim file error!); return(FATAL_ERROR);} status=readLineFromIndex(file, strlen("dataFileName[]= "), PATHNAME_LENGTH, RWmodule->dataFileName); if(status!=0) {ERROR_CHECK(FATAL_ERROR, Read from prim file error!); return(FATAL_ERROR);} status=fscanf(file, "active= %d, groupId= %d, pTTC= %d, rx[]= {0x%x, 0x%x, 0x%x, 0x%x}\n", (int*)&RWmodule->active,(int*) &RWmodule->groupId, (int*)&RWmodule->pTTC, (int*)&RWmodule->rx[0], (int*)&RWmodule->rx[1], (int*)&RWmodule->rx[2], (int*)&RWmodule->rx[3]); break; case READ_FROM_FILE_v101: file=(FILE*)inputParameter; status=fscanf(file, "readNotWrite= %d, structId= %d, moduleNum= %d\n", &RWmodule->inputParams.fRead, &RWmodule->inputParams.cfgSet, &RWmodule->inputParams.module); if(status==-1) {ERROR_CHECK(FATAL_ERROR, Read from prim file error!); return(FATAL_ERROR);} status=readLineFromIndex(file, strlen("dataFileName[]= "), PATHNAME_LENGTH, RWmodule->dataFileName); if(status!=0) {ERROR_CHECK(FATAL_ERROR, Read from prim file error!); return(FATAL_ERROR);} break; default: ; } return(SUCCESS); } /******************************************************************************/