From c8cc0524ce82e96a67394ab88f6380bfc61bb524 Mon Sep 17 00:00:00 2001 From: Maps Date: Thu, 12 Dec 2024 12:13:28 +0100 Subject: [PATCH] modifications in cpp --- scripts/cpp/CMakeLists.txt | 90 +++- scripts/cpp/analysis.cxx | 2 +- scripts/cpp/mimosis.cxx | 582 +++++++++++++++++------ scripts/cpp/mimosis.hpp | 27 +- scripts/cpp/scurve-scan.cxx | 902 +----------------------------------- 5 files changed, 549 insertions(+), 1054 deletions(-) diff --git a/scripts/cpp/CMakeLists.txt b/scripts/cpp/CMakeLists.txt index 504b66f..a7004f7 100644 --- a/scripts/cpp/CMakeLists.txt +++ b/scripts/cpp/CMakeLists.txt @@ -4,9 +4,10 @@ project(mimosis LANGUAGES C CXX ) + set(SCURVE_EXE "scurve-scan") set(MIMOSIS_LIB "mimosis") - +set(ANALYSIS_LIB "analysis") if(TRBNETTOOLS_DIR) message(${TRBNETTOOLS_DIR}) @@ -23,8 +24,8 @@ set(TRBNET_INCLUDE_DIR ${TRBNETTOOLS_DIR}/libtrbnet/) 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/) @@ -32,33 +33,108 @@ set(DABC_INCLUDE_DIR ${DABC_DIR}/include/) +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() diff --git a/scripts/cpp/analysis.cxx b/scripts/cpp/analysis.cxx index 7613eee..3efe099 100644 --- a/scripts/cpp/analysis.cxx +++ b/scripts/cpp/analysis.cxx @@ -643,7 +643,7 @@ pixel_dump( TCanvas *t2 = new TCanvas(); PixelMatrix->Draw(); - PixelMatrix->SaveAs("NoiseHist.pdf","pdf"); + t2->SaveAs("NoiseHist.png","png"); delete PixelMatrix; } diff --git a/scripts/cpp/mimosis.cxx b/scripts/cpp/mimosis.cxx index febeaeb..4dbefcf 100644 --- a/scripts/cpp/mimosis.cxx +++ b/scripts/cpp/mimosis.cxx @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -11,8 +12,8 @@ #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) @@ -22,15 +23,16 @@ #define I2C_EXEC 0x1 -#define GEN_PAYLOAD_WR(r,d) static_cast(((r&0xff)<<24)+((d&0xff)<<16)+(r&0xff00)+MIM_I2C_ADD_LSB) -#define GEN_PAYLOAD_RD(r) static_cast(((r&0xff)<<16)+(r&0xff00)+MIM_I2C_ADD_LSB) +#define GEN_PAYLOAD_WR(r,d) static_cast(((r&0xff)<<24)+((d&0xff)<<16)+(r&0xff00)+MIM_I2C_ADD_MSB) +#define GEN_PAYLOAD_RD(r) static_cast(((r&0xff)<<16)+(r&0xff00)+MIM_I2C_ADD_MSB) -#define GEN_ADD_LSB(r) static_cast(((r&0xff00)<<8)+MIM_I2C_ADD_LSB) -#define GEN_ADD_MSB(r) static_cast(((r&0xff)<<16)+MIM_I2C_ADD_MSB) +#define GEN_ADD_MSB(r) static_cast(((r&0xff00)<<8)+MIM_I2C_ADD_MSB) +#define GEN_ADD_LSB(r) static_cast(((r&0xff)<<16)+MIM_I2C_ADD_LSB) #define GEN_WR(d) static_cast(((d&0xff)<<16)+MIM_I2C_WR) +#define GEN_RD static_cast(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 @@ -68,19 +70,17 @@ write_data( { 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'; } @@ -90,6 +90,8 @@ write_data( + + void mimosis:: register_write( @@ -138,14 +140,16 @@ register_write_sec( 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; } @@ -164,8 +168,9 @@ register_read( if( singleAccess ) { std::vector 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) { @@ -180,18 +185,13 @@ register_read( 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]; @@ -199,7 +199,7 @@ register_read( if (status <= 0) return status; - return res[1] & 0x00ff; + return res[1] & 0xff; } @@ -248,6 +248,8 @@ find_mod( uint32_t lastMimFraCnt; + int cnt = 0; + while(modFound == -1) { while(true) @@ -257,100 +259,104 @@ find_mod( 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(sub->Data(i)); + for( unsigned i = 0; i(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 } @@ -408,10 +414,12 @@ loop_vph( int arrSize = ySpan*xSpan*256; int* dataArray = new int[arrSize]; + printf("ARRAY SIZE: %d\n", arrSize); + for(int i = 0; i(stop-start); - for(int mimTra = 0; - mimTraNextSubevent(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(sub->Data(i)); + for( unsigned i = 0; i(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"); @@ -534,6 +647,181 @@ loop_vph( + +// 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(std::pow(2.0,static_cast(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(stop-start); + +// int mimTra = 0; + +// while( mimTraNextSubevent(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(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( diff --git a/scripts/cpp/mimosis.hpp b/scripts/cpp/mimosis.hpp index ed75cfa..aebdd79 100644 --- a/scripts/cpp/mimosis.hpp +++ b/scripts/cpp/mimosis.hpp @@ -24,20 +24,33 @@ IBUFBIAS = 0x004e 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, @@ -47,12 +60,12 @@ namespace mimosis 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 ); + }; diff --git a/scripts/cpp/scurve-scan.cxx b/scripts/cpp/scurve-scan.cxx index 7fd8686..1a0d3b6 100644 --- a/scripts/cpp/scurve-scan.cxx +++ b/scripts/cpp/scurve-scan.cxx @@ -1,900 +1,18 @@ -#include -#include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include - -#include - -//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 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 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 backup_dacs() -{ - std::vector 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 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 values; - - buf = fgetc(iPipe); - - while(!foundFrame && buf != EOF) - { - char c = static_cast(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(std::pow(2.0,static_cast(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(stop-start); - - for(int mimTra = 0; - mimTraNextSubevent(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(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(std::pow(2.0,static_cast(modPulse))); - - int modFound = -1; - - const int modN = 2; - std::vector 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(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(stop - Data::start); - file << "TIME(s):" << '\t' << duration.count() << '\n'; - - file << "COMMENT:\t\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 -//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 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); + } + } -- 2.43.0