00001 #include "ConfigUpdater.h" 00002 #include "../SctApiAccessException.h" 00003 #include "../SctApiCall.h" 00004 00005 #include "Sct_SctApi/Sct_SctApi.hh" 00006 #include "Sct/ILUMarshalling.h" 00007 #include "SctData/TestResult.h" 00008 #include "SctData/DefectList.h" 00009 #include "SctData/ModuleConfiguration.h" 00010 #include "SctData/ModuleElement.h" 00011 00012 using namespace SctData; 00013 using namespace Sct; 00014 00015 namespace SctCalibrationController { 00016 00017 unsigned long ConfigUpdater::getMID(const TestResult& t, Sct_SctApi_T_SctApi& api) const { 00018 unsigned long mid = 0; 00020 APIRETCALL(&api, mid, findModuleSerial(&st, const_cast<char*> ( t.getModuleName().c_str())), "ConfigUpdater failed to get MID") 00021 return mid; 00022 } 00023 00024 void ConfigUpdater::maskChannels(const TestResult& t, DefectSeverity s, Sct_SctApi_T_SctApi& api) const { 00025 const DefectList::DefectCollection& defects = t.getDefects().getAllDefects(); 00026 00027 ModuleConfiguration config; 00028 for (unsigned int i=0; i<nChipModule; ++i) { 00029 config.getChipConfiguration(i).resetMask(); 00030 } 00031 00032 for (DefectList::DefectCollection::const_iterator i=defects.begin(); i!=defects.end(); ++i) { 00033 if (i->getPrototype().getSeverity() >= s) 00034 maskChannels(config, i->getModuleElement()); 00035 } 00036 00037 unsigned int maskArray[nChipModule*4]; 00038 for (unsigned int chip=0; chip<nChipModule; ++chip) { 00039 for (unsigned int i=0; i<4; ++i) 00040 maskArray[chip*4 + i] = config.getABCDModule().chip[chip].basic.mask[i]; 00041 } 00042 00043 APICALL(&api, modifyABCDMask(&st, getMID(t, api), copyArrayToILU<_Sct_SctApi_T_DataBlock_sequence, UINT32>(maskArray, nChipModule*4)), "ConfigUpdater could not update masks") 00044 } 00045 00046 void ConfigUpdater::maskChannels(ModuleConfiguration& config, ModuleElement element) const { 00047 for (unsigned int i=element.getFirst(); i<=element.getLast(); ++i) { 00048 config.getChipConfiguration(i/nChannelChip).mask(i%nChannelChip); 00049 } 00050 } 00051 00052 }