00001 #include "ConfigUpdater.h" 00002 #include "../SctApiAccessException.h" 00003 #include "../SctApiCall.h" 00004 00005 #include "Sct_SctApi/SctApi.hh" 00006 #include "Sct/OmniMarshalling.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 SctData::TestResult& t, Sct_SctApi::SctApiIPC_ptr api) const { 00018 unsigned long mid = 0; 00019 APIRETCALL(api, mid, findModuleSerial(t.getModuleName().c_str()), "ConfigUpdater failed to get MID") 00020 return mid; 00021 } 00022 00023 void ConfigUpdater::maskChannels(const SctData::TestResult& t, DefectSeverity s, Sct_SctApi::SctApiIPC_ptr api) const { 00024 const DefectList::DefectCollection& defects = t.getDefects().getAllDefects(); 00025 00026 ModuleConfiguration config; 00027 for (unsigned int i=0; i<nChipModule; ++i) { 00028 config.getChipConfiguration(i).resetMask(); 00029 } 00030 00031 for (DefectList::DefectCollection::const_iterator i=defects.begin(); i!=defects.end(); ++i) { 00032 if (i->getPrototype().getSeverity() >= s) 00033 maskChannels(config, i->getModuleElement()); 00034 } 00035 00036 unsigned int maskArray[nChipModule*4]; 00037 for (unsigned int chip=0; chip<nChipModule; ++chip) { 00038 for (unsigned int i=0; i<4; ++i) 00039 maskArray[chip*4 + i] = config.getABCDModule().chip[chip].basic.mask[i]; 00040 } 00041 00042 Sct_SctApi::DataBlock * newDataBlock = copyArrayToCorba<Sct_SctApi::DataBlock,UINT32>(maskArray, nChipModule*4); 00043 APICALL(api, modifyABCDMask(getMID(t,api),*newDataBlock), "ConfigUpdater could not update masks") 00044 delete newDataBlock; 00045 } 00046 00047 void ConfigUpdater::maskChannels(ModuleConfiguration& config, ModuleElement element) const { 00048 for (unsigned int i=element.getFirst(); i<=element.getLast(); ++i) { 00049 config.getChipConfiguration(i/nChannelChip).mask(i%nChannelChip); 00050 } 00051 } 00052 00053 }