00001
00002
00003 #include "geometry/DiracChip.hh"
00004 #include "geometry/DiracChannel.hh"
00005
00006 #include <iostream>
00007 #include "tools/Log.hh"
00008 #include "mTypes.h"
00009
00010
00011
00012 using namespace std;
00013
00014
00015 DiracChip::DiracChip(const Board& aBoard, const i32 aCol, const i32 aRow, const ui32 nbColumns, const ui32 nbRows, const i32 aId,const ui32 aSerialNumber)
00016 :Chip(aBoard, aCol, aRow, nbColumns, nbRows, aId, aSerialNumber)
00017 {
00018
00019 init();
00020 bLoThreshold = 0;
00021 bMidThreshold = 0;
00022 bHiThreshold = 0;
00023 aLoThreshold = 0;
00024 aMidThreshold = 0;
00025 aHiThreshold = 0;
00026 };
00027
00028
00029 void DiracChip::init()
00030 {
00031 for (int channelId = 0; channelId <= 63 ; channelId++) {
00032 int map = HRmap(channelId);
00033 DiracChannel *channel = new DiracChannel(*this, map%8, map/8, channelId);
00034 channels.insert(make_pair(channelId,channel));
00035 }
00036 bLoThreshold = 0;
00037 bMidThreshold = 0;
00038 bHiThreshold = 0;
00039 aLoThreshold = 0;
00040 aMidThreshold = 0;
00041 aHiThreshold = 0;
00042 }
00043
00044
00045
00046
00047
00048
00049 int DiracChip::HRmap(int channel)
00050 {
00051
00052
00053 if(channel<0||channel>63)
00054 {
00055 FILE_LOG(logERROR)<<"map error channel="<<channel<<endl;return-1;
00056 }
00057
00058 const int map[64]=
00059 {7, 6, 5, 4, 15,14,13,12,
00060 23,22,21,20,31,30,29,28,
00061 39,38,37,36,47,46,45,44,
00062 55,54,53,52,63,62,61,60,
00063 3 ,2 ,1 ,0, 11,10,9 ,8,
00064 19,18,17,16,27,26,25,24,
00065 35,34,33,32,43,42,41,40,
00066 51,50,49,48,59,58,57,56};
00067
00068 return map[channel];
00069
00070 return -1;
00071 }
00072
00073
00074
00075 DiracChip& DiracChip::operator = (const DiracChip& x) {
00076
00077 FILE_LOG(logINFO) << "DiracChip& DiracChip::operator = (const DiracChip& x) " << endl;
00078 bLoThreshold = x.bLoThreshold;
00079 bMidThreshold = x.bMidThreshold;
00080 bHiThreshold = x.bHiThreshold;
00081 aLoThreshold = x.aLoThreshold;
00082 aMidThreshold = x.aMidThreshold;
00083 aHiThreshold = x.aHiThreshold;
00084 }
00085
00086
00087
00088
00089
00090 bool DiracChip::read(unsigned char *buf) {
00091
00092 char dataBuf[256];
00093 char *dataStr = dataBuf;
00094
00095 for (int dataNum = 0; dataNum < 23; dataNum++) {
00096 unsigned int data = *buf++;
00097 dataStr += sprintf(dataStr, "%02X", data);
00098 }
00099 *dataStr = 0;
00100 dataStr = dataBuf;
00101 unsigned int data;
00102
00103
00104 sscanf(dataStr, "%1x", &data); dataStr++;
00105 gain = data & 0x03;
00106 analogData = (data & 0x08) != 0;
00107
00108
00109 sscanf(dataStr, "%2x", &data); dataStr+=2;
00110 bHiThreshold = data;
00111 sscanf(dataStr, "%2x", &data); dataStr+=2;
00112 bMidThreshold = data;
00113 sscanf(dataStr, "%2x", &data); dataStr+=2;
00114 bLoThreshold = data;
00115
00116 for (int bChNum = 63; bChNum >= 32; bChNum -= 4) {
00117
00118 sscanf(dataStr, "%2x", &data); dataStr+=2;
00119 unsigned char mask = 0x80;
00120 for (int chNum = 0; chNum <= 3; chNum++) {
00121
00122 this->getChannelById(bChNum - chNum).setStimulate((data & mask) != 0);
00123 mask >>= 1;
00124
00125 this->getChannelById(bChNum - chNum).setEnable((data & mask) != 0);
00126
00127 mask >>= 1;
00128 }
00129 }
00130
00131 sscanf(dataStr, "%2x", &data); dataStr+=2;
00132 aHiThreshold = data;
00133 sscanf(dataStr, "%2x", &data); dataStr+=2;
00134 aMidThreshold = data;
00135 sscanf(dataStr, "%2x", &data); dataStr+=2;
00136 aLoThreshold = data;
00137
00138 for (int aChNum = 31; aChNum >= 0; aChNum -= 4) {
00139
00140 sscanf(dataStr, "%2x", &data); dataStr+=2;
00141 unsigned char mask = 0x80;
00142 for (int chNum = 0; chNum <= 3; chNum++) {
00143
00144 this->getChannelById(aChNum - chNum).setStimulate((data & mask) != 0);
00145 mask >>= 1;
00146
00147 this->getChannelById(aChNum - chNum).setEnable ((data & mask) != 0);
00148 mask >>= 1;
00149 }
00150 }
00151
00152 FILE_LOG(logDEBUG1) << " DiracChipConfig read" << endl;
00153 return(true);
00154 };
00155
00156