00001 #include "TrimRangeConfigUpdater.h" 00002 #include "ConfigUpdaterManager.h" 00003 #include "../SctApiAccessException.h" 00004 #include "../SctApiCall.h" 00005 00006 #include "Sct_SctApi/Sct_SctApi.hh" 00007 #include "Sct/SctParameters.h" 00008 #include "Sct/SctNames.h" 00009 #include "Sct/OutOfRangeError.h" 00010 #include "SctData/TrimRangeTestResult.h" 00011 #include "SctData/DefectPrototype.h" 00012 #include "CommonWithDsp/ABCD/ABCDscans.h" 00013 00014 using namespace SctData; 00015 using namespace Sct; 00016 00017 namespace SctCalibrationController { 00018 00019 bool TrimRangeConfigUpdater::inMap = ConfigUpdaterManager::instance().setUpdater("SctData::TrimRangeTestResult", shared_ptr<TrimRangeConfigUpdater> (new TrimRangeConfigUpdater() ) ); 00020 00021 void TrimRangeConfigUpdater::update(const TestResult& testresult, Sct_SctApi_T_SctApi& api) const { 00022 const TrimRangeTestResult& t = dynamic_cast<const TrimRangeTestResult&> (testresult) ; 00023 unsigned long mid = getMID(t, api); 00024 short trims[nChannelModule]; 00025 00026 if (t.chipTrim.size()!=Sct::nChipModule) { 00027 throw Sct::OutOfRangeError<int>("Wrong number of chip trims!", __FILE__, __LINE__, t.chipTrim.size(), Sct::nChipModule, Sct::nChipModule); 00028 } 00029 00030 for (unsigned ichip=0; ichip<Sct::nChipModule; ++ichip) { 00031 if (t.chipTrim[ichip].get()){ 00032 unsigned int range = t.chipTrim[ichip]->range; 00033 float target = t.chipTrim[ichip]->target; 00034 SctNames::Mrs() << "CC_UPDATE" << MRS_TEXT("CalibrationController updating trim target and range") 00035 << MRS_PARAM<long>("ModuleID", mid) << MRS_PARAM<long>("Chip", ichip) 00036 << MRS_PARAM<int>("Range", range) << MRS_PARAM<float>("Target(mV)", target) 00037 << MRS_INFORMATION << ENDM; 00038 APICALL(&api, modifyABCDChipVar(&st, mid, ichip, ST_TRIM_RANGE, range), "TrimRangeConfigUpdater failed to set trim range") 00039 APICALL(&api, modifyABCDChipVar(&st, mid, ichip, ST_TARGET, target), "TrimRangeConfigUpdater failed to set trim range") 00040 } else { 00041 std::ostringstream oss; 00042 oss << "CalibrationController could not update trim range for chip " << ichip; 00043 SctNames::Mrs() << "CC_UPDATE" << MRS_TEXT(oss.str().c_str()) 00044 << MRS_PARAM<long>("ModuleID", mid) << MRS_PARAM<long>("Chip#", ichip) 00045 << MRS_DIAGNOSTIC << ENDM; 00046 continue; 00047 } 00048 for (unsigned ichannel=0; ichannel < nChannelChip; ++ ichannel){ 00049 unsigned channelInModule=ichip*nChannelChip+ichannel; 00050 00051 assert(channelInModule<Sct::nChannelModule); 00052 00053 if (t.chipTrim[ichip]->channelTrim.getAt(ichannel).valid){ 00054 trims[channelInModule] = t.chipTrim[ichip]->channelTrim.getAt(ichannel).value.trim ; 00055 }else{ 00056 trims[channelInModule] = 8; 00057 } 00058 } 00059 } 00060 00061 SctNames::Mrs() << "CC_UPDATE" << MRS_TEXT("CalibrationController updating trims") << MRS_PARAM<long>("ModuleID", mid) << MRS_INFORMATION << ENDM; 00062 Sct_SctApi_T_CharBlock data = _Sct_SctApi_T_CharBlock_sequence::Create(nChannelModule, trims); 00063 APICALL(&api, modifyABCDTrims(&st, mid, data), "TrimRangeConfigUpdater failed to set trims") 00064 00065 maskChannels(t, UNUSEABLE, api); 00066 } 00067 00068 }