LANGUAGES C CXX
)
+
set(SCURVE_EXE "scurve-scan")
set(MIMOSIS_LIB "mimosis")
-
+set(ANALYSIS_LIB "analysis")
if(TRBNETTOOLS_DIR)
message(${TRBNETTOOLS_DIR})
if(DABC_DIR)
message(${DABC_DIR})
else()
- message("DABC_DIR not provided. Using /d/jspc37/soft/trb3/dabc")
- set(DABC_DIR "/d/jspc37/soft/trb3/dabc")
+ message("DABC_DIR not provided. Using /d/jspc37/soft/trb3/dabc/build")
+ set(DABC_DIR "/d/jspc37/soft/trb3/dabc/build")
endif()
set(DABC_LIB_DIR ${DABC_DIR}/lib/)
+if(ROOT_DIR)
+ message(${ROOT_DIR})
+else()
+ message("ROOT_DIR not provided. Using /d/jspc37/soft/trb3/rootbuild")
+ set(ROOT_DIR "/d/jspc37/soft/trb3/rootbuild")
+endif()
+
+set(ROOT_LIB_DIR ${ROOT_DIR}/lib/)
+set(ROOT_INCLUDE_DIR ${ROOT_DIR}/include/)
+
+
+
include_directories(
${TRBNET_INCLUDE_DIR}
${DABC_INCLUDE_DIR}
+ ${ROOT_INCLUDE_DIR}
)
link_directories(
${TRBNET_LIB_DIR}
${DABC_LIB_DIR}
+ ${ROOT_LIB_DIR}
)
+
add_executable(
${SCURVE_EXE} ${SCURVE_EXE}.cxx
)
+if(MAKEANALYSIS)
+ message("Build libanalysis.so")
+ add_library(
+ ${ANALYSIS_LIB} SHARED
+ ${ANALYSIS_LIB}.cxx
+ )
+endif()
+
+
add_library(
${MIMOSIS_LIB} SHARED
${MIMOSIS_LIB}.cxx
)
+
target_link_libraries(${SCURVE_EXE}
PRIVATE trbnet
- PRIVATE DabcBase
- PRIVATE DabcHadaq
- PRIVATE DabcMbs
PRIVATE ${MIMOSIS_LIB}
)
-target_link_libraries(${MIMOSIS_LIB}
+target_compile_features(${MIMOSIS_LIB} PRIVATE cxx_std_17)
+
+
+target_link_libraries( ${MIMOSIS_LIB}
PRIVATE trbnet
+ PRIVATE DabcBase
+ PRIVATE DabcHadaq
+ PRIVATE DabcMbs
+ # PRIVATE MathCore
+ # PRIVATE Rint
+ # PRIVATE Core
+ # PRIVATE RIO
+ # PRIVATE Thread
+ # PRIVATE tbb
+ # PRIVATE Cling
+ # PRIVATE Imt
+ # PRIVATE MultiProc
+ # PRIVATE Net
+ # PRIVATE Hist
+ # PRIVATE Matrix
+ # PRIVATE Rint
+ # PRIVATE Cling
+ # PRIVATE Gpad
+ # PRIVATE Graf
)
+
+
+if(MAKEANALYSIS)
+
+ target_compile_features(${ANALYSIS_LIB} PRIVATE cxx_std_17)
+
+ target_link_libraries( ${ANALYSIS_LIB}
+
+ PRIVATE ${MIMOSIS_LIB}
+ PRIVATE MathCore
+ PRIVATE Rint
+ PRIVATE Core
+ PRIVATE RIO
+ PRIVATE Thread
+ PRIVATE tbb
+ PRIVATE Cling
+ PRIVATE Imt
+ PRIVATE MultiProc
+ PRIVATE Net
+ PRIVATE Hist
+ PRIVATE Matrix
+ PRIVATE Rint
+ PRIVATE Cling
+ PRIVATE Gpad
+ PRIVATE Graf
+ PRIVATE trbnet
+ PRIVATE DabcBase
+ PRIVATE DabcHadaq
+ PRIVATE DabcMbs
+ )
+endif()
TCanvas *t2 = new TCanvas();
PixelMatrix->Draw();
- PixelMatrix->SaveAs("NoiseHist.pdf","pdf");
+ t2->SaveAs("NoiseHist.png","png");
delete PixelMatrix;
}
#include <chrono>
#include <iostream>
#include <fstream>
+#include <sstream>
#include <vector>
#include <unistd.h>
#include <math.h>
#include "hadaq/api.h"
#define MIM_I2C_INSTR (0x11<<1)
-#define MIM_I2C_ADD_LSB (0x12<<1)
-#define MIM_I2C_ADD_MSB (0x13<<1)
+#define MIM_I2C_ADD_MSB (0x12<<1)
+#define MIM_I2C_ADD_LSB (0x13<<1)
#define MIM_I2C_WR (0x14<<1)
#define MIM_I2C_RD (0x15<<1)
#define I2C_EXEC 0x1
-#define GEN_PAYLOAD_WR(r,d) static_cast<uint32_t>(((r&0xff)<<24)+((d&0xff)<<16)+(r&0xff00)+MIM_I2C_ADD_LSB)
-#define GEN_PAYLOAD_RD(r) static_cast<uint32_t>(((r&0xff)<<16)+(r&0xff00)+MIM_I2C_ADD_LSB)
+#define GEN_PAYLOAD_WR(r,d) static_cast<uint32_t>(((r&0xff)<<24)+((d&0xff)<<16)+(r&0xff00)+MIM_I2C_ADD_MSB)
+#define GEN_PAYLOAD_RD(r) static_cast<uint32_t>(((r&0xff)<<16)+(r&0xff00)+MIM_I2C_ADD_MSB)
-#define GEN_ADD_LSB(r) static_cast<uint32_t>(((r&0xff00)<<8)+MIM_I2C_ADD_LSB)
-#define GEN_ADD_MSB(r) static_cast<uint32_t>(((r&0xff)<<16)+MIM_I2C_ADD_MSB)
+#define GEN_ADD_MSB(r) static_cast<uint32_t>(((r&0xff00)<<8)+MIM_I2C_ADD_MSB)
+#define GEN_ADD_LSB(r) static_cast<uint32_t>(((r&0xff)<<16)+MIM_I2C_ADD_LSB)
#define GEN_WR(d) static_cast<uint32_t>(((d&0xff)<<16)+MIM_I2C_WR)
+#define GEN_RD static_cast<uint32_t>(MIM_I2C_RD)
// #define SUPERINDEX(x,y,s) ((y*1024+x)*256+s)
-#define SUPERINDEX(x,xL,y,yL,s) (((y-yL)*xL+(x-xL))*256+s)
+#define SUPERINDEX(x,xL,xS,y,yL,s) (((y-yL)*xS+(x-xL))*256+s)
#ifndef SLEEPVAL
#define SLEEPVAL 1000
{
std::string fileName = "scurve-pulses.csv";
- std::ofstream file(fileName);
+ std::ofstream file(fileName, std::ios::app);
char buffer[1000000];
file.rdbuf()->pubsetbuf(buffer, sizeof(buffer));
+ int xSpan = xHig - xLow + 1;
+
for(int y = yLow; y <= yHig; y++) {
for(int x = xLow; x <= xHig; x++) {
file << x << '\t' << y << '\t';
for(int s = 0; s <= 255; s++) {
-
- // auto v = dataArray[SUPERINDEX(x,xLow,y,yLow,s)];
- // file << v << '\t';
-
- file << dataArray[SUPERINDEX(x,xLow,y,yLow,s)] << '\t';
+ file << dataArray[SUPERINDEX(x,xLow,xSpan,y,yLow,s)] << '\t';
}
file << '\n';
}
+
+
void
mimosis::
register_write(
while (readVal!= data)
{
+
mimosis::register_write( fpga, reg, data, sa );
+ // sleep(1);
readVal = mimosis::register_read( fpga, reg, sa );
-
+
cnt++;
if(cnt >= 1000)
{
- std::printf("Cannot write 0x%04x to 0x%04x.\nExiting.\n",data, reg);
+ std::printf("Cannot write 0x%04x to 0x%04x.\nExiting.\n", data, reg);
std::exit(-1);
break;
}
if( singleAccess ) {
std::vector<uint32_t> payload = {
- GEN_ADD_LSB(mim_reg),
- GEN_ADD_MSB(mim_reg)};
+ GEN_ADD_MSB(mim_reg),
+ GEN_ADD_LSB(mim_reg)
+ };
for (auto i: payload)
{
const uint32_t arr[3] = { 0x0, GEN_PAYLOAD_RD(mim_reg), I2C_EXEC };
trb_register_write_mem(fpga, TRB_REG_ADDR, 0, arr, 3);
}
-
- usleep(SLEEPVAL);
-
- {
- const uint32_t arr[3] = { 0x110, MIM_I2C_RD, I2C_EXEC };
- trb_register_write_mem(fpga, TRB_REG_ADDR, 0, arr, 3);
- }
-
usleep(SLEEPVAL);
-
}
+ const uint32_t arr[3] = { 0x110, MIM_I2C_RD, I2C_EXEC };
+ trb_register_write_mem(fpga, TRB_REG_ADDR, 0, arr, 3);
+ usleep(SLEEPVAL);
+
const int size = 2;
uint32_t res[size];
if (status <= 0) return status;
- return res[1] & 0x00ff;
+ return res[1] & 0xff;
}
uint32_t lastMimFraCnt;
+ int cnt = 0;
+
while(modFound == -1)
{
while(true)
hadaq::RawSubevent* sub = nullptr;
- while (((sub = evnt->NextSubevent(sub)) != nullptr) && (sub->GetId() == fpga))
+ // while (((sub = evnt->NextSubevent(sub)) != nullptr) && (sub->GetId() == fpga)) // Does not work!!
+ while ((sub = evnt->NextSubevent(sub)) != nullptr)
{
- unsigned size = sub->GetNrOfDataWords();
- int headerNow = 0;
- uint32_t mimFraCnt;
- unsigned region = 0, column = 0, row = 0;
+ if (sub->GetId() == fpga)
+ {
+ unsigned size = sub->GetNrOfDataWords();
+ int headerNow = 0;
+ uint32_t mimFraCnt;
+ unsigned region = 0, column = 0, row = 0;
- for( unsigned i = 0; i<size; i++)
- {
- uint32_t data = static_cast<uint32_t>(sub->Data(i));
+ for( unsigned i = 0; i<size; i++)
+ {
+ uint32_t data = static_cast<uint32_t>(sub->Data(i));
- if((data & 0xFF000000) == 0xFE000000) {
+ if((data & 0xFF000000) == 0xFE000000) {
- ++headerNow;
+ ++headerNow;
- if(headerNow == 1) {
+ if(headerNow == 1) {
- mimFraCnt = (data & 0xFF0000) >> 16;
- mimFraCnt += (data & 0xFF) << 8;
+ mimFraCnt = (data & 0xFF0000) >> 16;
+ mimFraCnt += (data & 0xFF) << 8;
- } else if(headerNow == 2) {
+ } else if(headerNow == 2) {
- mimFraCnt += data & 0xFF0000;
- mimFraCnt += (data & 0xFF) << 24;
+ mimFraCnt += data & 0xFF0000;
+ mimFraCnt += (data & 0xFF) << 24;
- } else if(headerNow == 3) {
- } else if(headerNow == 4) {
- }
+ } else if(headerNow == 3) {
+ } else if(headerNow == 4) {
+ }
- } else if((data & 0xFF000000) == 0xFF000000) {
+ } else if((data & 0xFF000000) == 0xFF000000) {
- headerNow = 0;
+ headerNow = 0;
- } else {
+ } else {
- if( (data & 0xFF000000) == 0xFD000000 ) {
+ if( (data & 0xFF000000) == 0xFD000000 ) {
- int tmp = (data>>16) & 0xFF;
- if(tmp > 63) continue;
- region = tmp;
+ int tmp = (data>>16) & 0xFF;
+ if(tmp > 63) continue;
+ region = tmp;
- } else {
+ } else {
- decode_pixel(data>>16,column,row,region);
+ decode_pixel(data>>16,column,row,region);
- if(column >= xLow &&
- column <= xHig &&
- row >= yLow &&
- row < yHig &&
- lastMimFraCnt != mimFraCnt &&
- modInd < modN &&
- (row == modY || modY == -1) &&
- (column == modX || modX == -1)) {
+ if(column >= xLow &&
+ column <= xHig &&
+ row >= yLow &&
+ row <= yHig &&
+ lastMimFraCnt != mimFraCnt &&
+ modInd < modN &&
+ (row == modY || modY == -1) &&
+ (column == modX || modX == -1)) {
- modY = row;
- modX = column;
+ modY = row;
+ modX = column;
- modVec[modInd] = mimFraCnt%pulse;
+ modVec[modInd] = mimFraCnt%pulse;
- modInd++;
+ modInd++;
- lastMimFraCnt = mimFraCnt;
+ lastMimFraCnt = mimFraCnt;
- if(modInd == modN) { goto EVALMODS; }
+ if(modInd == modN) { goto EVALMODS; }
+ }
}
- }
- if((data & 0x0000FF00) != 0x0000FC00) {
+ if((data & 0x0000FF00) != 0x0000FC00) {
- decode_pixel(data&0xFFFF,column,row,region);
+ decode_pixel(data&0xFFFF,column,row,region);
- if(column >= xLow &&
- column <= xHig &&
- row >= yLow &&
- row < yHig &&
- lastMimFraCnt != mimFraCnt &&
- modInd < modN &&
- (row == modY || modY == -1) &&
- (column == modX || modX == -1)) {
+ if(column >= xLow &&
+ column <= xHig &&
+ row >= yLow &&
+ row <= yHig &&
+ lastMimFraCnt != mimFraCnt &&
+ modInd < modN &&
+ (row == modY || modY == -1) &&
+ (column == modX || modX == -1)) {
- modY = row;
- modX = column;
+ modY = row;
+ modX = column;
- modVec[modInd] = mimFraCnt%pulse;
+ modVec[modInd] = mimFraCnt%pulse;
- modInd++;
+ modInd++;
- lastMimFraCnt = mimFraCnt;
+ lastMimFraCnt = mimFraCnt;
- if(modInd == modN) { goto EVALMODS; }
+ if(modInd == modN) { goto EVALMODS; }
+ }
}
}
- }
- } // End loop over data in sub event
+ } // End loop over data in sub event
+ }
} // End loop over sub-events in event
}
int arrSize = ySpan*xSpan*256;
int* dataArray = new int[arrSize];
+ printf("ARRAY SIZE: %d\n", arrSize);
+
for(int i = 0; i<arrSize; i++)
dataArray[i] = 0;
- for(int vphfine = vphSta;
+ for(uint32_t vphfine = vphSta;
vphfine <= vphEnd;
vphfine += vphTra)
{
//Set VPH_FINE
mimosis::register_write_sec( fpga, dacs::VPHFINE, vphfine, sa );
+ trb_register_write(fpga, 0x9209, vphfine);
+ usleep(SLEEPVAL);
using namespace std::chrono;
auto start = high_resolution_clock::now();
auto stop = high_resolution_clock::now();
auto duration = duration_cast<microseconds>(stop-start);
- for(int mimTra = 0;
- mimTra<maxCounts;
- mimTra++)
- {
+ int mimTra = 0;
+
+ while( mimTra<maxCounts) {
+
evnt = ref.NextEvent(1.,-1);
if (!evnt) continue;
hadaq::RawSubevent* sub = nullptr;
- while (((sub = evnt->NextSubevent(sub)) != nullptr) && (sub->GetId() == fpga))
+ // while (((sub = evnt->NextSubevent(sub)) != nullptr) && (sub->GetId() == fpga)) // Does not work!!
+ while ((sub = evnt->NextSubevent(sub)) != nullptr)
{
- unsigned size = sub->GetNrOfDataWords();
+ if (sub->GetId() == fpga)
+ {
+ unsigned size = sub->GetNrOfDataWords();
- int headerNow = 0;
+ int headerNow = 0;
- uint32_t mimFraCnt;
+ uint32_t mimFraCnt;
+ uint32_t mimFraCntOpt;
- unsigned region = 0, column = 0, row = 0;
+ unsigned region = 0, column = 0, row = 0;
- for( unsigned i = 0; i<size; i++)
- {
- uint32_t data = static_cast<uint32_t>(sub->Data(i));
+ for( unsigned i = 0; i<size; i++) {
+ uint32_t data = static_cast<uint32_t>(sub->Data(i));
- if((data & 0xFF000000) == 0xFE000000) {
+ if((data & 0xFF000000) == 0xFE000000) {
- ++headerNow;
+ ++headerNow;
- if(headerNow == 1) {
+ if(headerNow == 1) {
- mimFraCnt = (data & 0xFF0000) >> 16;
- mimFraCnt += (data & 0xFF) << 8;
+ mimFraCnt = (data & 0xFF0000) >> 16;
+ mimFraCnt += (data & 0xFF) << 8;
- } else if(headerNow == 2) {
+ } else if(headerNow == 2) {
- mimFraCnt += data & 0xFF0000;
- mimFraCnt += (data & 0xFF) << 24;
+ mimFraCnt += data & 0xFF0000;
+ mimFraCnt += (data & 0xFF) << 24;
- // std::printf("%x\n",mimFraCnt);
+ // std::printf("%x\n",mimFraCnt);
- } else if(headerNow == 3) {
- } else if(headerNow == 4) {
- }
+ } else if(headerNow == 3) {
+ mimFraCntOpt = (data & 0xFF0000) >> 16;
+ mimFraCntOpt += (data & 0xFF) << 8;
+ } else if(headerNow == 4) {
+ mimFraCntOpt += data & 0xFF0000;
+ mimFraCntOpt += (data & 0xFF) << 24;
+ }
- } else if((data & 0xFF000000) == 0xFF000000) {
+ } else if((data & 0xFF000000) == 0xFF000000) {
- headerNow = 0;
- mimTra++;
+ headerNow = 0;
+ if(mimFraCnt%pulse == mod &&
+ mimFraCntOpt == vphfine) mimTra++;
- } else {
+ } else {
- if( (data & 0xFF000000) == 0xFD000000 ) {
+ if( (data & 0xFF000000) == 0xFD000000 ) {
- int tmp = (data>>16) & 0xFF;
- if(tmp > 63) continue;
- region = tmp;
+ int tmp = (data>>16) & 0xFF;
+ if(tmp > 63) continue;
+ region = tmp;
- } else {
+ } else {
+
+ decode_pixel(data>>16,column,row,region);
+
+ if(column >= xLow &&
+ column <= xHig &&
+ row >= yLow &&
+ row <= yHig &&
+ mimFraCnt%pulse == mod &&
+ mimFraCntOpt == vphfine) {
+
+ dataArray[SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine)] += 1;
+
+ // printf("%d %d %d %d %d %d\n",
+ // column, column-xLow, row, row-yLow, vphfine, SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine));
+ }
+
+ int code = (data >> 16) & 0b111;
+
+ if ( code & 0b1) {
+
+ int codeTmp = 1;
+ decode_pixel(((data >> 16) + (codeTmp << 6)), column, row, region);
+
+ if(column >= xLow && column <= xHig &&
+ row >= yLow && row <= yHig &&
+ mimFraCnt%pulse == mod &&
+ mimFraCntOpt == vphfine) {
+
+ dataArray[SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine)] += 1;
+ }
+ }
+
+ if ( code & 0b10) {
+
+ int codeTmp = 2;
+ decode_pixel(((data >> 16) + (codeTmp << 6)), column, row, region);
- decode_pixel(data>>16,column,row,region);
+ if(column >= xLow && column <= xHig &&
+ row >= yLow && row <= yHig &&
+ mimFraCnt%pulse == mod &&
+ mimFraCntOpt == vphfine) {
- if(column >= xLow &&
- column <= xHig &&
- row >= yLow &&
- row < yHig &&
- mimFraCnt%pulse == mod) {
+ dataArray[SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine)] += 1;
+ }
+ }
- // if (vphfine%vphTra == 0)
- dataArray[SUPERINDEX(column,xLow,row,yLow,vphfine)] += 1;
+ if ( code & 0b100) {
+
+ int codeTmp = 3;
+ decode_pixel(((data >> 16) + (codeTmp << 6)), column, row, region);
+
+ if(column >= xLow && column <= xHig &&
+ row >= yLow && row <= yHig &&
+ mimFraCnt%pulse == mod &&
+ mimFraCntOpt == vphfine) {
+
+ dataArray[SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine)] += 1;
+ }
+ }
}
- }
- if((data & 0x0000FF00) != 0x0000FC00) {
+ if((data & 0x0000FF00) != 0x0000FC00) {
+
+ decode_pixel(data&0xFFFF,column,row,region);
+
+ if(column >= xLow &&
+ column <= xHig &&
+ row >= yLow &&
+ row <= yHig &&
+ mimFraCnt%pulse == mod &&
+ mimFraCntOpt == vphfine) {
+
+ dataArray[SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine)] += 1;
+
+ // printf("%d %d %d %d %d %d\n",
+ // column, column-xLow, row, row-yLow, vphfine, SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine));
+ }
+
+ int code = (data & 0xFFFF) & 0b111;
+
+ if ( code & 0b1) {
+
+ int codeTmp = 1;
+ decode_pixel(((data & 0xFFFF) + (codeTmp << 6)), column, row, region);
+
+ if(column >= xLow && column <= xHig &&
+ row >= yLow && row <= yHig &&
+ mimFraCnt%pulse == mod &&
+ mimFraCntOpt == vphfine) {
+
+ dataArray[SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine)] += 1;
+ }
+ }
+
+ if ( code & 0b10) {
+
+ int codeTmp = 2;
+ decode_pixel(((data & 0xFFFF) + (codeTmp << 6)), column, row, region);
- decode_pixel(data&0xFFFF,column,row,region);
+ if(column >= xLow && column <= xHig &&
+ row >= yLow && row <= yHig &&
+ mimFraCnt%pulse == mod &&
+ mimFraCntOpt == vphfine) {
- if(column >= xLow &&
- column <= xHig &&
- row >= yLow &&
- row < yHig &&
- mimFraCnt%pulse == mod) {
+ dataArray[SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine)] += 1;
+ }
+ }
- // if (vphfine%vphTra == 0)
- dataArray[SUPERINDEX(column,xLow,row,yLow,vphfine)] += 1;
+ if ( code & 0b100) {
+
+ int codeTmp = 3;
+ decode_pixel(((data & 0xFFFF) + (codeTmp << 6)), column, row, region);
+
+ if(column >= xLow && column <= xHig &&
+ row >= yLow && row <= yHig &&
+ mimFraCnt%pulse == mod &&
+ mimFraCntOpt == vphfine) {
+
+ dataArray[SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine)] += 1;
+ }
+ }
}
}
- }
- if(mimTra >= maxCounts) {
- goto MAXCOUNTS;
- }
- } // End loop over data in sub event
+ if(mimTra >= maxCounts) {
+ goto MAXCOUNTS;
+ }
+ } // End loop over data in sub event
+ }
} // End loop over sub-events in event
- } //End while duration
+ }
MAXCOUNTS:
- ;
+ trb_register_write(fpga, 0x9209, 0xaaaaaaaa);
}
std::printf("\n");
+
+// void
+// mimosis::
+// loop_vph(
+// char* source,
+// int fpga, bool sa,
+// int yLow, int yHig,
+// int xLow, int xHig,
+// int vphSta, int vphEnd, int vphTra,
+// int maxCounts, int mod, int exp )
+// {
+// #ifdef DEBUG
+// std::printf("loop_vph(): yLow(%4d) yHig(%4d) xLow(%4d) xHig(%4d) vphSta(%4d) vphEnd(%4d) vphTra(%4d) maxCounts(%4d) mod(%8d)\n",
+// yLow,yHig,xLow,xHig,vphSta,vphEnd,vphTra,maxCounts,mod);
+// #endif
+
+// int pulse = static_cast<int>(std::pow(2.0,static_cast<double>(exp)));
+
+// hadaq::ReadoutHandle ref = hadaq::ReadoutHandle::Connect(source);
+// if (ref.null()) return;
+// hadaq::RawEvent *evnt = nullptr;
+
+// int ySpan = yHig - yLow + 1;
+// int xSpan = xHig - xLow + 1;
+
+// int arrSize = ySpan*xSpan*256;
+// int* dataArray = new int[arrSize];
+
+// printf("ARRAY SIZE: %d\n", arrSize);
+
+// for(int i = 0; i<arrSize; i++)
+// dataArray[i] = 0;
+
+// for(uint32_t vphfine = vphSta;
+// vphfine <= vphEnd;
+// vphfine += vphTra)
+// {
+// std::printf("Scan: %3d\r",vphfine);
+// fflush(stdout);
+
+// //Set VPH_FINE
+// mimosis::register_write_sec( fpga, dacs::VPHFINE, vphfine, sa );
+// trb_register_write(fpga, 0x9209, vphfine);
+// usleep(SLEEPVAL);
+
+// using namespace std::chrono;
+// auto start = high_resolution_clock::now();
+// auto stop = high_resolution_clock::now();
+// auto duration = duration_cast<microseconds>(stop-start);
+
+// int mimTra = 0;
+
+// while( mimTra<maxCounts) {
+
+// evnt = ref.NextEvent(1.,-1);
+// if (!evnt) continue;
+
+// hadaq::RawSubevent* sub = nullptr;
+
+// // while (((sub = evnt->NextSubevent(sub)) != nullptr) && (sub->GetId() == fpga)) // Does not work!!
+// while ((sub = evnt->NextSubevent(sub)) != nullptr)
+// {
+// if (sub->GetId() == fpga)
+// {
+// unsigned size = sub->GetNrOfDataWords();
+
+// int headerNow = 0;
+
+// uint32_t mimFraCnt;
+// uint32_t mimFraCntOpt;
+
+// unsigned region = 0, column = 0, row = 0;
+
+// for( unsigned i = 0; i<size; i++) {
+
+// uint32_t data = static_cast<uint32_t>(sub->Data(i));
+
+// if((data & 0xFF000000) == 0xFE000000) {
+
+// ++headerNow;
+
+// if(headerNow == 1) {
+
+// mimFraCnt = (data & 0xFF0000) >> 16;
+// mimFraCnt += (data & 0xFF) << 8;
+
+// } else if(headerNow == 2) {
+
+// mimFraCnt += data & 0xFF0000;
+// mimFraCnt += (data & 0xFF) << 24;
+
+// // std::printf("%x\n",mimFraCnt);
+
+// } else if(headerNow == 3) {
+// mimFraCntOpt = (data & 0xFF0000) >> 16;
+// mimFraCntOpt += (data & 0xFF) << 8;
+// } else if(headerNow == 4) {
+// mimFraCntOpt += data & 0xFF0000;
+// mimFraCntOpt += (data & 0xFF) << 24;
+// }
+
+// } else if((data & 0xFF000000) == 0xFF000000) {
+
+// headerNow = 0;
+// if(mimFraCnt%pulse == mod &&
+// mimFraCntOpt == vphfine) mimTra++;
+
+// } else {
+
+// if( (data & 0xFF000000) == 0xFD000000 ) {
+
+// int tmp = (data>>16) & 0xFF;
+// if(tmp > 63) continue;
+// region = tmp;
+
+// } else {
+
+// decode_pixel(data>>16,column,row,region);
+
+// if(column >= xLow &&
+// column <= xHig &&
+// row >= yLow &&
+// row <= yHig &&
+// mimFraCnt%pulse == mod &&
+// mimFraCntOpt == vphfine) {
+
+// dataArray[SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine)] += 1;
+
+// // printf("%d %d %d %d %d %d\n",
+// // column, column-xLow, row, row-yLow, vphfine, SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine));
+// }
+// }
+
+// if((data & 0x0000FF00) != 0x0000FC00) {
+
+// decode_pixel(data&0xFFFF,column,row,region);
+
+// if(column >= xLow &&
+// column <= xHig &&
+// row >= yLow &&
+// row <= yHig &&
+// mimFraCnt%pulse == mod &&
+// mimFraCntOpt == vphfine) {
+
+// dataArray[SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine)] += 1;
+
+// // printf("%d %d %d %d %d %d\n",
+// // column, column-xLow, row, row-yLow, vphfine, SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine));
+// }
+// }
+// }
+
+// if(mimTra >= maxCounts) {
+// goto MAXCOUNTS;
+// }
+// } // End loop over data in sub event
+// }
+// } // End loop over sub-events in event
+// }
+// MAXCOUNTS:
+// trb_register_write(fpga, 0x9209, 0xaaaaaaaa);
+// }
+// std::printf("\n");
+
+// ref.Disconnect();
+
+// write_data(dataArray, xLow, xHig, yLow, yHig);
+
+// delete [] dataArray;
+// }
+
+
+
+
+
void
adc::
write(
namespace mimosis
{
- void register_write(int fpga, int mim_reg, int mim_data, bool singleaccess);
- void register_write_sec(int fpga, int mim_reg, int mim_data, bool singleaccess);
+ void register_write(
+ int fpga,
+ int mim_reg,
+ int mim_data,
+ bool singleaccess );
- int register_read(int fpga, int mim_reg, bool singleaccess);
+ void register_write_sec(
+ int fpga,
+ int mim_reg,
+ int mim_data,
+ bool singleaccess );
- void instr_write(int fpga, int cmd);
+ int register_read(
+ int fpga,
+ int mim_reg,
+ bool singleaccess );
+
+ void instr_write(
+ int fpga,
+ int cmd );
int find_mod(
char* source,
int fpga,
int yLow, int yHig,
int xLow, int xHig,
- int modPulse);
-
+ int modPulse );
void loop_vph(
char* source,
int vphSta, int vphEnd, int vphTra,
int maxCounts, int mod, int exp );
-
void loop_rows(
int ySta, int yEnd, int yTra,
int xSta, int xEnd,
int vphSta, int vphEnd, int vphTra,
int maxCounts, int exp );
+
};
-#include <cstdio>
-#include <cstring>
-#include <csignal>
-#include <unistd.h>
-#include <stdio.h>
-#include <math.h>
#include <iostream>
-#include <fstream>
-#include <vector>
-#include <chrono>
-#include <array>
-#include <sys/stat.h>
-
-#include <stdbool.h>
-
-//Necessary for readout handler
-#include "hadaq/api.h"
-
-//Necessary to control mimosis and trbnet
-#include "trbnet.h"
-
-//Necessary for mimosis specific functions
#include "mimosis.hpp"
-
-// #define VPHFINE 0x0046
-
-#define SUPERINDEX(x,y,s) ((y*1024+x)*256+s)
-
-using namespace std::chrono;
-
-//Enum to make access to the information vector more clear
-enum params {
- STATE,
- YSTA,
- YEND,
- YTRA,
- XLOW,
- XHIG,
- VPHSTA,
- VPHEND,
- VPHSTEP,
- COUNTS,
- MOD,
- REGION,
- VCASN,
- SINGLEACCESS,
- FPGA
-};
-
-//Collection of data related variables used throughout the programm.
-namespace Data
-{
- std::string source;
- //Main data array holds counts of pulses for every pixel and VPH_FINE
- std::array<unsigned,1024*504*256> dataArray;
-
- //Current state of the programm.
- std::string state;
-
- //Boundaries within pulses were done
- int yLowMax = 503, yHigMax = 0, xLowMax = 1023, xHigMax = 0;
-
- //Directory where data and METADATA will be put.
- std::string dataDir;
-
- //Keep track of VCASN to put in METADATA later.
- std::vector<std::string> vcasnVec;
-
- bool singleAccess = true;
- //Measure time of execution of the programm and put
- //information in METADATA
- decltype(high_resolution_clock::now()) start;
-
- int fpga;
-
- int mod = -1;
-};
-
-
-
-namespace Stats
-{
- int totalFrames = 0;
- int totalFramesSkipped = 0;
-};
-
-
-//Name of PID file.
-const std::string pidName = "/tmp/hldprint-pid";
-
-
-
-bool symlink_exists(const char* path)
-{
- struct stat buf;
- int result;
- result = lstat(path, &buf);
- return (result == 0);
-}
-
-
-
-void mimosis_sec_write(uint16_t fpga, uint16_t reg, uint16_t data, bool sa)
-{
- uint16_t readVal = mimosis::register_read( fpga, reg, sa);
-
- int cnt = 0;
-
- while (readVal!= data)
- {
- mimosis::register_write( fpga, reg, data, sa );
- readVal = mimosis::register_read( fpga, reg, sa );
-
- cnt++;
-
- if(cnt >= 1000)
- {
- std::printf("Cannot write 0x%04x to 0x%04x.\nExiting.\n",data, reg);
- std::exit(-1);
- break;
- }
- }
-}
-
-
-
-std::vector<uint16_t> backup_dacs()
-{
- std::vector<uint16_t> vec;
-
- for(uint16_t reg=dacs::IBIAS;
- reg<=dacs::IBUFBIAS;
- reg++) {
-
- uint16_t readVal = mimosis::register_read(Data::fpga, reg, Data::singleAccess);
- // printf("VAL: %d\n",readVal);
- vec.push_back(readVal);
- }
- return vec;
-}
-
-
-//Write PID to PID-file
-void write_pid(void)
-{
- int pid = (int)getpid();
-
- FILE *pidFile = fopen(pidName.c_str(), "w");
-
- if(pidFile == nullptr) {
- std::printf("ERROR: Couldn't open file.\n");
- std::exit(-1);
- }
-
- fprintf(pidFile, "%d",pid);
-
- fclose(pidFile);
-}
-
-
-
-//Open a pipe and wait for commands and informations
-//from controller script
-std::vector<std::string> await_params()
-{
- //Receiving pipe for informations from controller
- std::string pipeName = "/tmp/scurveipipe";
-
- FILE *iPipe = fopen(pipeName.c_str(), "r");
-
- if(iPipe == nullptr) {
- std::printf("ERROR: Couldn't open file.\n");
- std::exit(-1);
- }
-
-
- //Read from pipe char by char until full frame is reached.
- //Frames start with START and end with END.
- //Information is delimited by '-' characters.
- int buf;
- bool foundFrame = false, foundSta = false, foundEnd = false;
- std::string word;
-
- //Staore all informations, without START and END, in values vector.
- std::vector<std::string> values;
-
- buf = fgetc(iPipe);
-
- while(!foundFrame && buf != EOF)
- {
- char c = static_cast<char>(buf);
-
- if(c == '-') {
- values.push_back(word);
- word = "";
- } else {
- word += c;
- }
-
- if(word == "START") { foundSta = true; }
- if(word == "END") { foundEnd = true; }
-
- buf = fgetc(iPipe);
-
- if(foundSta && foundEnd) {
- foundFrame = true;
- break;
- }
- }
-
- //Delete "START" from first position
- values.erase(values.begin());
-
- // for (const auto& i: values)
- // std::cout << i << '\n';
-
- fclose(iPipe);
-
- //Return the whole array.
- return values;
-}
-
-
-
-//Open a pipe to transmit an acknowledgement to the
-//controller script
-int send_ack()
-{
- //Transmitting pipe to acknowledge receiving and processing of informations
- //A simple 'ACK' indicates the controller successful operation
- std::string pipeName = "/tmp/scurveapipe";
-
- FILE *iPipe = fopen(pipeName.c_str(), "w");
-
- if(iPipe == nullptr) {
- std::printf("ERROR: Couldn't open file.\n");
- std::exit(-1);
- }
-
- std::string msg("ACK");
- fputs(msg.c_str(),iPipe);
- fclose(iPipe);
- return 0;
-}
-
-
-
-//Writing contents of Data::dataArr to file.
-void write_data(std::string reg, std::string vcasn)
-{
- //For each VCASN a new sub dir is created and a csv file with
- //the same name holds the data.
- std::string subDir = Data::dataDir + "/" + reg + "-" + vcasn;
-
- mkdir(subDir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
-
- std::string fileName = subDir + "/" + reg + "-" + vcasn + ".csv";
-
- //Buffered ofstream increases performance.
- //One could also dump the whole array as binary file, but this complicates
- //Post processing a bit.
- //Another option would be to include root and use TTree's.
- std::ofstream file(fileName);
- char buffer[1000000];
- file.rdbuf()->pubsetbuf(buffer, sizeof(buffer));
-
- // std::printf("%d %d %d %d\n", Data::yLowMax, Data::yHigMax, Data::xLowMax, Data::xHigMax);
-
- //Only write relevant data between boundaries of scan.
- for(int y = Data::yLowMax; y <= Data::yHigMax; y++) {
-
- for(int x = Data::xLowMax; x <= Data::xHigMax; x++) {
-
- for(int s = 0; s <= 255; s++) {
-
- auto v = Data::dataArray[SUPERINDEX(x,y,s)];
-
- file << v << '\t';
- // file << s << '\t';
-
- //Reset data to 0
- Data::dataArray[SUPERINDEX(x,y,s)] = 0;
- }
- file << '\n';
- }
- }
- file.close();
-}
-
-
-
-//Decodeing of mimosis words into pixels
-void decode_pixel(const uint32_t& word, unsigned int& column, unsigned int& row, unsigned int& region)
-{
- unsigned int pixelcode = (word >> 6) & 0x3ff;
-
- unsigned int side = 0, topdown = 0;
-
- if((pixelcode&3) == 0x1 || (pixelcode&3) == 0x2) side = 1;
- if((pixelcode&3) == 0x3 || (pixelcode&3) == 0x2) topdown = 1;
-
- row = (pixelcode>>2)*2 + topdown;
- column = (((word>>3)&0x7) + region*8)*2 + side;
-}
-
-
-
-//Main data taking procedure.
-void loop_vph(
- int yLow, int yHig,
- int xLow, int xHig,
- int vphSta, int vphEnd, int vphTra,
- int maxCounts, int mod, int exp)
-{
-#ifdef DEBUG
- std::printf("loop_vph(): yLow(%4d) yHig(%4d) xLow(%4d) xHig(%4d) vphSta(%4d) vphEnd(%4d) vphTra(%4d) maxCounts(%4d) mod(%8d)\n",
- yLow,yHig,xLow,xHig,vphSta,vphEnd,vphTra,maxCounts,mod);
-#endif
-
- int pulse = static_cast<int>(std::pow(2.0,static_cast<double>(exp)));
-
- hadaq::ReadoutHandle ref = hadaq::ReadoutHandle::Connect(Data::source.c_str());
- if (ref.null()) return;
- hadaq::RawEvent *evnt = nullptr;
-
- for(int vphfine = vphSta;
- vphfine <= vphEnd;
- vphfine += vphTra)
- // for(int vphfine = vphSta;
- // vphfine <= vphEnd;
- // vphfine++)
- {
- std::printf("Scan: %3d\r",vphfine);
- fflush(stdout);
-
- //Set VPH_FINE
- mimosis_sec_write( Data::fpga, dacs::VPHFINE, vphfine, Data::singleAccess );
-
- auto start = high_resolution_clock::now();
- auto stop = high_resolution_clock::now();
- auto duration = duration_cast<microseconds>(stop-start);
-
- for(int mimTra = 0;
- mimTra<maxCounts;
- mimTra++)
- {
- evnt = ref.NextEvent(1.,-1);
- if (!evnt) continue;
-
- hadaq::RawSubevent* sub = nullptr;
-
- while (((sub = evnt->NextSubevent(sub)) != nullptr) && (sub->GetId() == Data::fpga))
- {
- unsigned size = sub->GetNrOfDataWords();
-
- int headerNow = 0;
-
- uint32_t mimFraCnt;
-
- unsigned region = 0, column = 0, row = 0;
-
- for( unsigned i = 0; i<size; i++)
- {
- uint32_t data = static_cast<uint32_t>(sub->Data(i));
-
-
- if((data & 0xFF000000) == 0xFE000000) {
-
- ++headerNow;
-
- if(headerNow == 1) {
-
- mimFraCnt = (data & 0xFF0000) >> 16;
- mimFraCnt += (data & 0xFF) << 8;
-
- } else if(headerNow == 2) {
-
- mimFraCnt += data & 0xFF0000;
- mimFraCnt += (data & 0xFF) << 24;
-
- // std::printf("%x\n",mimFraCnt);
-
- } else if(headerNow == 3) {
- } else if(headerNow == 4) {
- }
-
- } else if((data & 0xFF000000) == 0xFF000000) {
-
- headerNow = 0;
- mimTra++;
-
- } else {
-
- if( (data & 0xFF000000) == 0xFD000000 ) {
-
- int tmp = (data>>16) & 0xFF;
- if(tmp > 63) continue;
- region = tmp;
-
- } else {
-
- decode_pixel(data>>16,column,row,region);
-
- if(column >= xLow &&
- column <= xHig &&
- row >= yLow &&
- row < yHig &&
- mimFraCnt%pulse == mod) {
-
- // if (vphfine%vphTra == 0)
- Data::dataArray[SUPERINDEX(column,row,vphfine)] += 1;
- }
- }
-
- if((data & 0x0000FF00) != 0x0000FC00) {
-
- decode_pixel(data&0xFFFF,column,row,region);
-
- if(column >= xLow &&
- column <= xHig &&
- row >= yLow &&
- row < yHig &&
- mimFraCnt%pulse == mod) {
-
- // if (vphfine%vphTra == 0)
- Data::dataArray[SUPERINDEX(column,row,vphfine)] += 1;
- }
- }
- }
-
- if(mimTra >= maxCounts) {
- goto MAXCOUNTS;
- }
- } // End loop over data in sub event
- } // End loop over sub-events in event
- } //End while duration
- MAXCOUNTS:
- ;
- }
- std::printf("\n");
- ref.Disconnect();
-}
-
-
-
-int find_mod(
- int yLow, int yHig,
- int xLow, int xHig,
- int modPulse)
-{
-#ifdef DEBUG
- std::printf("find_mod(): yLow(%4d) yHig(%4d) xLow(%4d) xHig(%4d) modPulse(%4d)\n",
- yLow,yHig,xLow,xHig,modPulse);
-#endif
-
- int pulse = static_cast<int>(std::pow(2.0,static_cast<double>(modPulse)));
-
- int modFound = -1;
-
- const int modN = 2;
- std::vector<int> modVec(modN);
- for(auto& i: modVec) { i = -1; }
- int modInd = 0;
- int modX = -1,modY = -1;
-
- auto backupDacs = backup_dacs();
-
- //Set VPH_FINE to smth high, so pulses get visible
- mimosis_sec_write( Data::fpga, dacs::VPHFINE, 0xff, Data::singleAccess );
-
- hadaq::ReadoutHandle ref = hadaq::ReadoutHandle::Connect(Data::source.c_str());
- if (ref.null()) return -2;
- hadaq::RawEvent *evnt = nullptr;
-
- uint32_t lastMimFraCnt;
-
- while(modFound == -1)
- {
- while(true)
- {
- evnt = ref.NextEvent(1.,-1);
- if (!evnt) continue;
-
- hadaq::RawSubevent* sub = nullptr;
-
- while (((sub = evnt->NextSubevent(sub)) != nullptr) && (sub->GetId() == Data::fpga))
- // while ((sub = evnt->NextSubevent(sub)) != nullptr)
- {
- unsigned size = sub->GetNrOfDataWords();
- int headerNow = 0;
- uint32_t mimFraCnt;
- unsigned region = 0, column = 0, row = 0;
-
- for( unsigned i = 0; i<size; i++)
- {
- uint32_t data = static_cast<uint32_t>(sub->Data(i));
-
- if((data & 0xFF000000) == 0xFE000000) {
-
- ++headerNow;
-
- if(headerNow == 1) {
-
- mimFraCnt = (data & 0xFF0000) >> 16;
- mimFraCnt += (data & 0xFF) << 8;
-
- } else if(headerNow == 2) {
-
- mimFraCnt += data & 0xFF0000;
- mimFraCnt += (data & 0xFF) << 24;
-
- } else if(headerNow == 3) {
- } else if(headerNow == 4) {
- }
-
- } else if((data & 0xFF000000) == 0xFF000000) {
-
- headerNow = 0;
-
- } else {
-
- if( (data & 0xFF000000) == 0xFD000000 ) {
-
- int tmp = (data>>16) & 0xFF;
- if(tmp > 63) continue;
- region = tmp;
-
- } else {
-
- decode_pixel(data>>16,column,row,region);
-
- if(column >= xLow &&
- column <= xHig &&
- row >= yLow &&
- row < yHig &&
- lastMimFraCnt != mimFraCnt &&
- modInd < modN &&
- (row == modY || modY == -1) &&
- (column == modX || modX == -1)) {
-
- modY = row;
- modX = column;
-
- modVec[modInd] = mimFraCnt%pulse;
-
- modInd++;
-
- lastMimFraCnt = mimFraCnt;
-
- if(modInd == modN) { goto EVALMODS; }
- }
- }
-
- if((data & 0x0000FF00) != 0x0000FC00) {
-
- decode_pixel(data&0xFFFF,column,row,region);
-
- if(column >= xLow &&
- column <= xHig &&
- row >= yLow &&
- row < yHig &&
- lastMimFraCnt != mimFraCnt &&
- modInd < modN &&
- (row == modY || modY == -1) &&
- (column == modX || modX == -1)) {
-
- modY = row;
- modX = column;
-
- modVec[modInd] = mimFraCnt%pulse;
-
- modInd++;
-
- lastMimFraCnt = mimFraCnt;
-
- if(modInd == modN) { goto EVALMODS; }
- }
- }
- }
- } // End loop over data in sub event
- } // End loop over sub-events in event
- }
-
- EVALMODS:
-
- int firstMod = modVec[0];
- int wrongMods = 0;
-
- for(int i = 1; i < modN; i++) {
- if(modVec[i] != firstMod) {
- wrongMods++;
- }
- }
-
- if(wrongMods > 0) {
- modInd = 0;
- continue;
- } else if(wrongMods == 0) {
- modFound = firstMod;
- break;
- }
- } //End while mod not found
-
- ref.Disconnect();
-
- int ind = 0;
- for( auto e: backupDacs ) {
- mimosis::register_write(Data::fpga, 0x40+ind, e, Data::singleAccess);
- ind++;
- }
-
- return modFound;
-}
-
-
-
-void loop_rows(
- int ySta, int yEnd, int yTra,
- int xSta, int xEnd,
- int vphSta, int vphEnd, int vphTra,
- int maxCounts, int exp)
-{
-#ifdef DEBUG
- std::printf("loop_rows(): ySta(%4d) yEnd(%4d) yTra(%4d) xSta(%4d) xEnd(%4d) vphSta(%4d) vphEnd(%4d) vphTra(%4d) maxCounts(%8d) exp(%4d)\n",
- ySta,yEnd,yTra,xSta,xEnd,vphSta,vphEnd,vphTra,maxCounts,exp);
-#endif
-
- for(int yOff = ySta;
- yOff <= yEnd;
- yOff += yTra)
- {
- std::printf("Mark pixels: %d - %d, %d - %d\n", yOff, yOff+yTra-1, xSta, xEnd);
-
- int y = yOff;
-
- //Mark pixels for pulsing
- for(; y < yOff + yTra && y <= yEnd; y++)
- {
- Data::yLowMax = y < Data::yLowMax ? y : Data::yLowMax;
- Data::yHigMax = y > Data::yHigMax ? y : Data::yHigMax;
-
- int regAddY = y/8;
- int regBitY = (1<<(y%8));
- int regWordY = (regAddY<<8)+0x84;
-
- mimosis_sec_write(Data::fpga, regWordY, regBitY, Data::singleAccess );
-
- int regAddX;
- int regBitX;
-
- int currRegX = xSta/16;
-
- int word82 = 0;
- int word81 = 0;
-
- for (int x = xSta; x <= xEnd; x++)
- {
- Data::xLowMax = x < Data::xLowMax ? x : Data::xLowMax;
- Data::xHigMax = x > Data::xHigMax ? x : Data::xHigMax;
-
- if((x/16) == currRegX &&
- x != xEnd) {
-
- if (x%2 == 1) { word82 |= (1<<((x/2)%8)); }
- else if (x%2 == 0) { word81 |= (1<<((x/2)%8)); }
-
- } else {
-
- if(word82 == word81) {
-
- int addr = (currRegX<<8) + 0x83;
- mimosis_sec_write( Data::fpga, addr, word81, Data::singleAccess );
- mimosis::instr_write( Data::fpga, 0x05 );
- mimosis_sec_write( Data::fpga, addr, 0, Data::singleAccess );
-
- } else {
- int addr81 = (currRegX<<8) + 0x81;
- int addr82 = (currRegX<<8) + 0x82;
- mimosis_sec_write( Data::fpga, addr81, word81, Data::singleAccess );
- mimosis_sec_write( Data::fpga, addr82, word82, Data::singleAccess );
- mimosis::instr_write( Data::fpga, 0x05 );
- mimosis_sec_write( Data::fpga, addr81, 0, Data::singleAccess );
- mimosis_sec_write( Data::fpga, addr82, 0, Data::singleAccess );
- }
- currRegX = x/16;
-
- word81 = 0;
- word82 = 0;
-
- if (x%2 == 1) { word82 = (1<<((x/2)%8)); }
- else if (x%2 == 0) { word81 = (1<<((x/2)%8)); }
- }
- }
- mimosis_sec_write(Data::fpga, regWordY, 0x0, Data::singleAccess );
- }
-
- Data::mod = Data::mod == -1 ? find_mod(yOff, y, xSta, xEnd, exp) : Data::mod;
- // int mod = find_mod(yOff, y, xSta, xEnd, exp);
-
- mimosis_sec_write( Data::fpga, dacs::VPHFINE, 0, Data::singleAccess );
- sleep(1);
-
- loop_vph(yOff, y, xSta, xEnd, vphSta, vphEnd, vphTra, maxCounts, Data::mod, exp);
-
- mimosis::instr_write( Data::fpga, 0x3f );
- mimosis::instr_write( Data::fpga, 0x04 );
- mimosis::instr_write( Data::fpga, 0x3e );
-
- //Set VPH_FINE back to zero, to get rid of peak at begining of scan
- //Do it double, to be sure
- mimosis_sec_write( Data::fpga, dacs::VPHFINE, 0, Data::singleAccess );
- }
-}
-
-
-
-//Write the METADATA file and put into dataDir.
-void write_meta()
-{
- std::string fileName = Data::dataDir + "/METADATA";
-
- std::ofstream file(fileName);
-
- file << "START:" << '\t' << Data::dataDir << '\n';
-
- file << "VCASN:";
- for(const auto& i: Data::vcasnVec) {
- file << '\t' << i;
- }
- file << '\n';
-
- file << "YMIN:" << '\t' << Data::yLowMax << '\n';
- file << "YMAX:" << '\t' << Data::yHigMax << '\n';
- file << "XMIN:" << '\t' << Data::xLowMax << '\n';
- file << "XMAX:" << '\t' << Data::xHigMax << '\n';
-
- file << "EXITSTATE:" << '\t' << Data::state << '\n';
-
- auto stop = high_resolution_clock::now();
- auto duration = duration_cast<seconds>(stop - Data::start);
- file << "TIME(s):" << '\t' << duration.count() << '\n';
-
- file << "COMMENT:\t<insert comment here>\n";
-
- file.close();
-}
-
-
-
-//Signal handler for clean exit at CTRL-C.
-//Data will be dumped and marked with 'INTERRUPTED',
-//if current state was a data taking state.
-void signal_handler( int signum )
-{
- std::cout << "Interrupt signal (" << signum << ") received Cleaning up...\n";
-
- if(Data::state == "TAKEDATA" ||
- Data::state == "WAITDAQ" ||
- Data::state == "FIT") {
-
- std::string lastReg = "INTERRUPTED";
- std::string lastVca = "INTERRUPTED";
- write_data(lastReg, lastVca);
- std::cout << "Remining data indicated by INTERRUPTED flags.\n";
-
- } else {
- }
-
- //Set VPH_FINE back to zero, to get rid of peak at begining of scan
- //Do it double, to be sure
- mimosis_sec_write( Data::fpga, dacs::VPHFINE, 0, Data::singleAccess );
-
- //Remove pid file
- remove(pidName.c_str());
-
- write_meta();
-
- std::exit(signum);
-}
-
+#include "trbnet.h"
+#include <unistd.h>
-//main. Make initialization and then enter main loop.
-int main(int argc, char* argv[])
+int main(void)
{
- //Read stream url
- Data::source = argv[1];
-
-
- //Initialize trbnet for this run
- int trbnetState = init_ports();
-
-
- //Start clock to report execution time METADATA
- Data::start = high_resolution_clock::now();
-
-
- //Generate the PID file
- write_pid();
-
-
- //Register signal SIGINT and signal handler
- signal(SIGINT, signal_handler);
-
-
- //Declare stateVec, that will hold the
- //informations passed from control script
- std::vector<std::string> stateVec;
-
-
- //Create main data dir by time stamp
- std::time_t time = std::time(0);
- std::tm* now = std::localtime(&time);
-
- Data::dataDir = std::to_string(now->tm_year + 1900) + '-'
- + std::to_string(now->tm_mon + 1) + '-'
- + std::to_string(now->tm_mday) + '-'
- + std::to_string(now->tm_hour) + '-'
- + std::to_string(now->tm_min);
-
- mkdir(Data::dataDir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
-
- const char* linkName = "lastdir";
-
- if(symlink_exists(linkName)) {
- unlink(linkName);
- }
-
- symlink(Data::dataDir.c_str(), linkName);
-
-
- //Initialize data array with 0's
- for(int y = 0; y < 504; y++)
- for(int x = 0; x < 1024; x++)
- for(int s = 0; s < 256; s++)
- Data::dataArray[SUPERINDEX(x,y,s)] = 0;
-
-
- //Main control loop. After init phase,
- //wait for commands from control script
- AWAIT:
- stateVec = await_params();
- Data::state = stateVec[STATE];
- Data::singleAccess = stateVec[SINGLEACCESS] == "1";
- Data::fpga = std::stoi(stateVec[FPGA], nullptr, 10);
-
- if(Data::state == "TAKEDATA") {
-
- loop_rows(
- std::stoi(stateVec[YSTA], nullptr, 10),
- std::stoi(stateVec[YEND], nullptr, 10),
- std::stoi(stateVec[YTRA], nullptr, 10),
- std::stoi(stateVec[XLOW], nullptr, 10),
- std::stoi(stateVec[XHIG], nullptr, 10),
- std::stoi(stateVec[VPHSTA], nullptr, 10),
- std::stoi(stateVec[VPHEND], nullptr, 10),
- std::stoi(stateVec[VPHSTEP], nullptr, 10),
- std::stoi(stateVec[COUNTS], nullptr, 10),
- std::stoi(stateVec[MOD], nullptr, 10)
- );
-
- send_ack();
-
- goto AWAIT;
-
- } else if(Data::state == "FIT") {
-
- std::string regStr = stateVec[REGION];
- std::string vcaStr = stateVec[VCASN];
-
- Data::vcasnVec.push_back(vcaStr);
- std::printf("Write data: %s %s\n",regStr.c_str(),vcaStr.c_str());
-
- write_data(regStr,vcaStr);
- send_ack();
-
- goto AWAIT;
-
- } else if(Data::state == "DONE") {
-
- std::printf("Done.\n");
- send_ack();
-
- remove(pidName.c_str());
-
- write_meta();
-
- return 0;
-
- } else {
-
- //Never happend so far, but just in case,
- //exit cleanly and remove pid file
- std::printf("Received garbage. Exiting.\n");
- remove(pidName.c_str());
+ init_ports();
- return 1;
- }
+ while( true )
+ {
+ printf("%x\n", mimosis::register_read( 0xc200, 0x46, true));
+ sleep(1);
+ }
+
}