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 }