mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-21 19:30:03 +02:00
removed external gui flag, acquiring flag is now not reset in stop acquisition, slsdet does not have acquiring flag anymore, busy accomodating acquiringflag, acquire cleanup, in acquire made lock for receiver more local, moved setacquiringflag false to bottom of acquire
This commit is contained in:
parent
712c9a4524
commit
2227265357
@ -207,7 +207,6 @@ multiSlsDetector::multiSlsDetector(int id) : slsDetectorUtils(), shmId(-1)
|
|||||||
}
|
}
|
||||||
|
|
||||||
thisMultiDetector->acquiringFlag = false;
|
thisMultiDetector->acquiringFlag = false;
|
||||||
thisMultiDetector->externalgui = false;
|
|
||||||
thisMultiDetector->receiver_upstream = false;
|
thisMultiDetector->receiver_upstream = false;
|
||||||
thisMultiDetector->alreadyExisting=1;
|
thisMultiDetector->alreadyExisting=1;
|
||||||
}
|
}
|
||||||
@ -1592,7 +1591,7 @@ int multiSlsDetector::stopAcquisition(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
*stoppedFlag=1;
|
*stoppedFlag=1;
|
||||||
setAcquiringFlag(false);
|
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -6520,11 +6519,6 @@ int multiSlsDetector::pulseChip(int n) {
|
|||||||
|
|
||||||
void multiSlsDetector::setAcquiringFlag(bool b){
|
void multiSlsDetector::setAcquiringFlag(bool b){
|
||||||
thisMultiDetector->acquiringFlag = b;
|
thisMultiDetector->acquiringFlag = b;
|
||||||
for(int idet=0; idet<thisMultiDetector->numberOfDetectors; ++idet){
|
|
||||||
if(detectors[idet]){
|
|
||||||
detectors[idet]->setAcquiringFlag(b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool multiSlsDetector::getAcquiringFlag(){
|
bool multiSlsDetector::getAcquiringFlag(){
|
||||||
@ -6532,10 +6526,12 @@ bool multiSlsDetector::getAcquiringFlag(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void multiSlsDetector::setExternalGuiFlag(bool b){
|
bool multiSlsDetector::isAcquireReady() {
|
||||||
thisMultiDetector->externalgui = b;
|
if (thisMultiDetector->acquiringFlag) {
|
||||||
}
|
std::cout << "Acquire has already started. If previous acquisition terminated unexpectedly, reset busy flag to restart.(sls_detector_put busy 0)" << std::endl;
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
bool multiSlsDetector::getExternalGuiFlag(){
|
thisMultiDetector->acquiringFlag = true;
|
||||||
return thisMultiDetector->externalgui;
|
return OK;
|
||||||
}
|
}
|
||||||
|
@ -1469,18 +1469,10 @@ class multiSlsDetector : public slsDetectorUtils {
|
|||||||
bool getAcquiringFlag();
|
bool getAcquiringFlag();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Set external gui flag in shared memory
|
* Check if acquiring flag is set, set error if set
|
||||||
\param b set external gui flag
|
* \returns FAIL if not ready, OK if ready
|
||||||
*/
|
*/
|
||||||
void setExternalGuiFlag(bool b=false);
|
bool isAcquireReady();
|
||||||
|
|
||||||
/**
|
|
||||||
Get external gui flag from shared memory
|
|
||||||
\returns external gui flag
|
|
||||||
*/
|
|
||||||
bool getExternalGuiFlag();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -774,7 +774,6 @@ int slsDetector::initializeDetectorSize(detectorType type) {
|
|||||||
thisDetector->actionMask=0;
|
thisDetector->actionMask=0;
|
||||||
|
|
||||||
thisDetector->tenGigaEnable=0;
|
thisDetector->tenGigaEnable=0;
|
||||||
thisDetector->acquiringFlag = false;
|
|
||||||
thisDetector->flippedData[0] = 0;
|
thisDetector->flippedData[0] = 0;
|
||||||
thisDetector->flippedData[1] = 0;
|
thisDetector->flippedData[1] = 0;
|
||||||
thisDetector->zmqport = 0;
|
thisDetector->zmqport = 0;
|
||||||
@ -9154,21 +9153,15 @@ int slsDetector::pulseChip(int n) {
|
|||||||
|
|
||||||
|
|
||||||
void slsDetector::setAcquiringFlag(bool b){
|
void slsDetector::setAcquiringFlag(bool b){
|
||||||
thisDetector->acquiringFlag = b;
|
parentDet->setAcquiringFlag(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool slsDetector::getAcquiringFlag(){
|
bool slsDetector::getAcquiringFlag(){
|
||||||
return thisDetector->acquiringFlag;
|
return parentDet->getAcquiringFlag();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void slsDetector::setExternalGuiFlag(bool b){
|
bool slsDetector::isAcquireReady() {
|
||||||
pthread_mutex_lock(&ms);
|
return parentDet->isAcquireReady();
|
||||||
parentDet->setExternalGuiFlag(b);
|
|
||||||
pthread_mutex_unlock(&ms);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool slsDetector::getExternalGuiFlag(){
|
|
||||||
return parentDet->getExternalGuiFlag();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -265,8 +265,6 @@ class slsDetector : public slsDetectorUtils, public energyConversion {
|
|||||||
/** 10 Gbe enable*/
|
/** 10 Gbe enable*/
|
||||||
int tenGigaEnable;
|
int tenGigaEnable;
|
||||||
|
|
||||||
/** flag for acquiring */
|
|
||||||
bool acquiringFlag;
|
|
||||||
/** flipped data across x or y axis */
|
/** flipped data across x or y axis */
|
||||||
int flippedData[2];
|
int flippedData[2];
|
||||||
/** tcp port from gui/different process to receiver (only data) */
|
/** tcp port from gui/different process to receiver (only data) */
|
||||||
@ -1915,16 +1913,10 @@ class slsDetector : public slsDetectorUtils, public energyConversion {
|
|||||||
bool getAcquiringFlag();
|
bool getAcquiringFlag();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Set external gui flag in shared memory
|
* Check if acquiring flag is set, set error if set
|
||||||
\param b set external gui flag
|
* \returns FAIL if not ready, OK if ready
|
||||||
*/
|
*/
|
||||||
void setExternalGuiFlag(bool b=false);
|
bool isAcquireReady();
|
||||||
|
|
||||||
/**
|
|
||||||
Get external gui flag from shared memory
|
|
||||||
\returns external gui flag
|
|
||||||
*/
|
|
||||||
bool getExternalGuiFlag();
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -184,7 +184,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) {
|
|||||||
++i;
|
++i;
|
||||||
|
|
||||||
/*! \page acquisition
|
/*! \page acquisition
|
||||||
- \b busy returns \c 1 if the acquisition is active, \c 0 otherwise. Works when the acquisition is started in blocking mode. Only get! \c Returns \c (int)
|
- <b> busy i</b> sets/gets acquiring flag. \c 1 the acquisition is active, \c 0 otherwise. Acquire command will set this flag to 1 at the beginning and to 0 at the end. Use this to clear flag if acquisition terminated unexpectedly. \c Returns \c (int)
|
||||||
*/
|
*/
|
||||||
descrToFuncMap[i].m_pFuncName="busy"; //
|
descrToFuncMap[i].m_pFuncName="busy"; //
|
||||||
descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdStatus;
|
descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdStatus;
|
||||||
@ -2438,7 +2438,10 @@ string slsDetectorCommand::cmdStatus(int narg, char *args[], int action) {
|
|||||||
}
|
}
|
||||||
else if (cmd=="busy") {
|
else if (cmd=="busy") {
|
||||||
if (action==PUT_ACTION) {
|
if (action==PUT_ACTION) {
|
||||||
return string ("cannot put");
|
int i;
|
||||||
|
if(!sscanf(args[1],"%d",&i))
|
||||||
|
return string("cannot parse busy mode");
|
||||||
|
myDet->setAcquiringFlag(i);
|
||||||
}
|
}
|
||||||
char answer[100];
|
char answer[100];
|
||||||
sprintf(answer,"%d", myDet->getAcquiringFlag());
|
sprintf(answer,"%d", myDet->getAcquiringFlag());
|
||||||
@ -2457,8 +2460,10 @@ string slsDetectorCommand::helpStatus(int narg, char *args[], int action) {
|
|||||||
os << string("status \t gets the detector status - can be: running, error, transmitting, finished, waiting or idle\n");
|
os << string("status \t gets the detector status - can be: running, error, transmitting, finished, waiting or idle\n");
|
||||||
os << string("busy \t gets the status of acquire- can be: 0 or 1. 0 for idle, 1 for running\n");
|
os << string("busy \t gets the status of acquire- can be: 0 or 1. 0 for idle, 1 for running\n");
|
||||||
}
|
}
|
||||||
if (action==PUT_ACTION || action==HELP_ACTION)
|
if (action==PUT_ACTION || action==HELP_ACTION) {
|
||||||
os << string("status \t controls the detector acquisition - can be start or stop \n");
|
os << string("status \t controls the detector acquisition - can be start or stop \n");
|
||||||
|
os << string("busy i\t sets the status of acquire- can be: 0(idle) or 1(running).Command Acquire sets it to 1 at beignning of acquire and back to 0 at the end. Clear Flag for unexpected acquire terminations. \n");
|
||||||
|
}
|
||||||
return os.str();
|
return os.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,475 +42,419 @@ slsDetectorUtils::slsDetectorUtils() {
|
|||||||
|
|
||||||
|
|
||||||
int slsDetectorUtils::acquire(int delflag){
|
int slsDetectorUtils::acquire(int delflag){
|
||||||
//ensure acquire isnt started multiple times by same client
|
|
||||||
if(getAcquiringFlag() == false)
|
//ensure acquire isnt started multiple times by same client
|
||||||
setAcquiringFlag(true);
|
if (isAcquireReady() == FAIL)
|
||||||
else{
|
return FAIL;
|
||||||
std::cout << "Error: Acquire has already been started." << std::endl;
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
struct timespec begin,end;
|
struct timespec begin,end;
|
||||||
clock_gettime(CLOCK_REALTIME, &begin);
|
clock_gettime(CLOCK_REALTIME, &begin);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//not in the loop for real time acqusition yet,
|
|
||||||
//in the real time acquisition loop, processing thread will wait for a post each time
|
//in the real time acquisition loop, processing thread will wait for a post each time
|
||||||
sem_init(&sem_newRTAcquisition,1,0);
|
sem_init(&sem_newRTAcquisition,1,0);
|
||||||
|
|
||||||
|
|
||||||
bool receiver = (setReceiverOnline()==ONLINE_FLAG);
|
bool receiver = (setReceiverOnline()==ONLINE_FLAG);
|
||||||
if(!receiver){
|
if(!receiver){
|
||||||
setDetectorIndex(-1);
|
setDetectorIndex(-1);
|
||||||
}
|
|
||||||
|
|
||||||
int nc=setTimer(CYCLES_NUMBER,-1);
|
|
||||||
int nf=setTimer(FRAME_NUMBER,-1);
|
|
||||||
if (nc==0) nc=1;
|
|
||||||
if (nf==0) nf=1;
|
|
||||||
|
|
||||||
int multiframe = nc*nf;
|
|
||||||
|
|
||||||
// setTotalProgress();
|
|
||||||
//moved these 2 here for measurement change
|
|
||||||
progressIndex=0;
|
|
||||||
*stoppedFlag=0;
|
|
||||||
|
|
||||||
angCalLogClass *aclog=NULL;
|
|
||||||
enCalLogClass *eclog=NULL;
|
|
||||||
// int lastindex=startindex, nowindex=startindex;
|
|
||||||
int connectChannels=0;
|
|
||||||
|
|
||||||
#ifdef VERBOSE
|
|
||||||
cout << "Acquire function "<< delflag << endl;
|
|
||||||
cout << "Stopped flag is "<< stoppedFlag << delflag << endl;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void *status;
|
|
||||||
|
|
||||||
|
|
||||||
if ((*correctionMask&(1<< ANGULAR_CONVERSION)) || (*correctionMask&(1<< I0_NORMALIZATION)) || getActionMode(angCalLog) || (getScanMode(0)==positionScan)|| (getScanMode(1)==positionScan)) {
|
|
||||||
if (connectChannels==0)
|
|
||||||
if (connect_channels) {
|
|
||||||
connect_channels(CCarg);
|
|
||||||
connectChannels=1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (getActionMode(angCalLog)) {
|
|
||||||
aclog=new angCalLogClass(this);
|
|
||||||
}
|
|
||||||
if (getActionMode(enCalLog)) {
|
|
||||||
eclog=new enCalLogClass(this);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
setJoinThread(0);
|
|
||||||
positionFinished(0);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int nm=timerValue[MEASUREMENTS_NUMBER];
|
|
||||||
if (nm<1)
|
|
||||||
nm=1;
|
|
||||||
|
|
||||||
|
|
||||||
int np=getNumberOfPositions();
|
|
||||||
if (np<1)
|
|
||||||
np=1;
|
|
||||||
|
|
||||||
|
|
||||||
int ns0=1;
|
|
||||||
if (*actionMask & (1 << MAX_ACTIONS)) {
|
|
||||||
ns0=getScanSteps(0);
|
|
||||||
if (ns0<1)
|
|
||||||
ns0=1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ns1=1;
|
|
||||||
if (*actionMask & (1 << (MAX_ACTIONS+1))) {
|
|
||||||
ns1=getScanSteps(1);
|
|
||||||
if (ns1<1)
|
|
||||||
ns1=1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(receiver){
|
|
||||||
pthread_mutex_lock(&mg); //cout << "lock"<< endl;
|
|
||||||
if(getReceiverStatus()!=IDLE)
|
|
||||||
if(stopReceiver() == FAIL)
|
|
||||||
*stoppedFlag=1;
|
|
||||||
pthread_mutex_unlock(&mg);//cout << "unlock"<< endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (*threadedProcessing)
|
|
||||||
startThread(delflag);
|
|
||||||
#ifdef VERBOSE
|
|
||||||
cout << " starting thread " << endl;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//resets frames caught in receiver
|
|
||||||
if(receiver){
|
|
||||||
pthread_mutex_lock(&mg); //cout << "lock"<< endl;
|
|
||||||
if (resetFramesCaught() == FAIL)
|
|
||||||
*stoppedFlag=1;
|
|
||||||
pthread_mutex_unlock(&mg);//cout << "unlock"<< endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
for(int im=0;im<nm;++im) {
|
|
||||||
|
|
||||||
#ifdef VERBOSE
|
|
||||||
cout << " starting measurement "<< im << " of " << nm << endl;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
//cout << "data thread started " << endl;
|
|
||||||
|
|
||||||
|
|
||||||
//loop measurements
|
|
||||||
|
|
||||||
// pthread_mutex_lock(&mp);
|
|
||||||
// setStartIndex(*fileIndex);
|
|
||||||
// pthread_mutex_unlock(&mp);
|
|
||||||
|
|
||||||
//cout << "action at start" << endl;
|
|
||||||
if (*stoppedFlag==0) {
|
|
||||||
executeAction(startScript);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int is0=0; is0<ns0; ++is0) {
|
|
||||||
// cout << "scan0 loop" << endl;
|
|
||||||
|
|
||||||
if (*stoppedFlag==0) {
|
|
||||||
executeScan(0,is0);
|
|
||||||
} else
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
|
||||||
for (int is1=0; is1<ns1; ++is1) {
|
|
||||||
// cout << "scan1 loop" << endl;
|
|
||||||
|
|
||||||
if (*stoppedFlag==0) {
|
|
||||||
executeScan(1,is1);
|
|
||||||
} else
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (*stoppedFlag==0) {
|
|
||||||
executeAction(scriptBefore);
|
|
||||||
} else
|
|
||||||
break;
|
|
||||||
|
|
||||||
ResetPositionIndex();
|
|
||||||
|
|
||||||
for (int ip=0; ip<np; ++ip) {
|
|
||||||
|
|
||||||
// cout << "positions " << endl;
|
|
||||||
if (*stoppedFlag==0) {
|
|
||||||
if (getNumberOfPositions()>0) {
|
|
||||||
moveDetector(detPositions[ip]);
|
|
||||||
IncrementPositionIndex();
|
|
||||||
#ifdef VERBOSE
|
|
||||||
std::cout<< "moving to position" << std::endl;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
|
||||||
pthread_mutex_lock(&mp);
|
|
||||||
createFileName();
|
|
||||||
pthread_mutex_unlock(&mp);
|
|
||||||
|
|
||||||
if (*stoppedFlag==0) {
|
|
||||||
executeAction(scriptBefore);
|
|
||||||
} else
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (*stoppedFlag==0) {
|
|
||||||
|
|
||||||
|
|
||||||
executeAction(headerBefore);
|
|
||||||
|
|
||||||
if (*correctionMask&(1<< ANGULAR_CONVERSION) || aclog){// || eclog) {
|
|
||||||
positionFinished(0);
|
|
||||||
setCurrentPosition(getDetectorPosition());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (aclog)
|
|
||||||
aclog->addStep(getCurrentPosition(), getCurrentFileName());
|
|
||||||
|
|
||||||
if (eclog)
|
|
||||||
eclog->addStep(setDAC(-1,THRESHOLD,0), getCurrentFileName());
|
|
||||||
|
|
||||||
|
|
||||||
if (*correctionMask&(1<< I0_NORMALIZATION)) {
|
|
||||||
if (get_i0)
|
|
||||||
get_i0(0, IOarg);
|
|
||||||
}
|
|
||||||
|
|
||||||
setCurrentFrameIndex(0);
|
|
||||||
|
|
||||||
if(receiver)
|
|
||||||
pthread_mutex_lock(&mg); //cout << "lock"<< endl;
|
|
||||||
if (multiframe>1)
|
|
||||||
setFrameIndex(0);
|
|
||||||
else
|
|
||||||
setFrameIndex(-1);
|
|
||||||
|
|
||||||
|
|
||||||
if(receiver){
|
|
||||||
pthread_mutex_unlock(&mg);//cout << "unlock"<< endl;
|
|
||||||
pthread_mutex_lock(&mp);
|
|
||||||
createFileName();
|
|
||||||
pthread_mutex_unlock(&mp);
|
|
||||||
//send receiver file name
|
|
||||||
pthread_mutex_lock(&mg); //cout << "lock"<< endl;
|
|
||||||
setFileName(fileIO::getFileName());
|
|
||||||
|
|
||||||
//start receiver
|
|
||||||
if(startReceiver() == FAIL) {
|
|
||||||
cout << "Start receiver failed " << endl;
|
|
||||||
stopReceiver();
|
|
||||||
*stoppedFlag=1;
|
|
||||||
pthread_mutex_unlock(&mg);//cout << "unlock"<< endl;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#ifdef VERBOSE
|
|
||||||
cout << "Receiver started " << endl;
|
|
||||||
#endif
|
|
||||||
pthread_mutex_unlock(&mg);//cout << "unlock"<< endl;
|
|
||||||
|
|
||||||
//let processing thread listen to these packets
|
|
||||||
sem_post(&sem_newRTAcquisition);
|
|
||||||
}
|
|
||||||
#ifdef VERBOSE
|
|
||||||
cout << "Acquiring " << endl;
|
|
||||||
#endif
|
|
||||||
startAndReadAll();
|
|
||||||
#ifdef VERBOSE
|
|
||||||
cout << "detector finished " << endl;
|
|
||||||
#endif
|
|
||||||
#ifdef VERBOSE
|
|
||||||
cout << "returned! " << endl;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (*correctionMask&(1<< I0_NORMALIZATION)) {
|
|
||||||
if (get_i0)
|
|
||||||
currentI0=get_i0(1,IOarg); // this is the correct i0!!!!!
|
|
||||||
}
|
|
||||||
#ifdef VERBOSE
|
|
||||||
cout << "pos finished? " << endl;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
positionFinished(1);
|
|
||||||
|
|
||||||
#ifdef VERBOSE
|
|
||||||
cout << "done! " << endl;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
if (*threadedProcessing==0){
|
|
||||||
#ifdef VERBOSE
|
|
||||||
cout << "start unthreaded process data " << endl;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
processData(delflag);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else
|
|
||||||
break;
|
|
||||||
|
|
||||||
while (dataQueueSize()) usleep(100000);
|
|
||||||
// cout << "mglock " << endl;;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
pthread_mutex_lock(&mg); //cout << "lock"<< endl;
|
|
||||||
// cout << "done " << endl;;
|
|
||||||
//offline
|
|
||||||
if(!receiver){
|
|
||||||
if ((getDetectorsType()==GOTTHARD) || (getDetectorsType()==MOENCH) || (getDetectorsType()==JUNGFRAU)|| (getDetectorsType()==JUNGFRAUCTB) ){
|
|
||||||
if((*correctionMask)&(1<<WRITE_FILE))
|
|
||||||
closeDataFile();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//online
|
|
||||||
else{
|
|
||||||
if (stopReceiver() == FAIL)
|
|
||||||
*stoppedFlag = 1;
|
|
||||||
// cout<<"***********receiver stopped"<<endl;
|
|
||||||
}
|
|
||||||
pthread_mutex_unlock(&mg);//cout << "unlock"<< endl;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
pthread_mutex_lock(&mp);
|
|
||||||
if (*stoppedFlag==0) {
|
|
||||||
executeAction(headerAfter);
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&mp);
|
|
||||||
// setLastIndex(*fileIndex);
|
|
||||||
} else {
|
|
||||||
// setLastIndex(*fileIndex);
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&mp);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (*stoppedFlag) {
|
|
||||||
#ifdef VERBOSE
|
|
||||||
std::cout<< "exiting since the detector has been stopped" << std::endl;
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
} else if (ip<(np-1)) {
|
|
||||||
// pthread_mutex_lock(&mp);
|
|
||||||
// *fileIndex=setStartIndex();
|
|
||||||
// pthread_mutex_unlock(&mp);
|
|
||||||
}
|
|
||||||
} // loop on position finished
|
|
||||||
|
|
||||||
//script after
|
|
||||||
if (*stoppedFlag==0) {
|
|
||||||
executeAction(scriptAfter);
|
|
||||||
} else
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
|
||||||
if (*stoppedFlag) {
|
|
||||||
#ifdef VERBOSE
|
|
||||||
std::cout<< "exiting since the detector has been stopped" << std::endl;
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
} else if (is1<(ns1-1)) {
|
|
||||||
// pthread_mutex_lock(&mp);
|
|
||||||
// *fileIndex=setStartIndex();
|
|
||||||
// pthread_mutex_unlock(&mp);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
//end scan1 loop is1
|
int nc=setTimer(CYCLES_NUMBER,-1);
|
||||||
|
int nf=setTimer(FRAME_NUMBER,-1);
|
||||||
|
if (nc==0) nc=1;
|
||||||
|
if (nf==0) nf=1;
|
||||||
|
int multiframe = nc*nf;
|
||||||
|
|
||||||
|
progressIndex=0;
|
||||||
|
*stoppedFlag=0;
|
||||||
|
|
||||||
if (*stoppedFlag) {
|
angCalLogClass *aclog=NULL;
|
||||||
#ifdef VERBOSE
|
enCalLogClass *eclog=NULL;
|
||||||
std::cout<< "exiting since the detector has been stopped" << std::endl;
|
int connectChannels=0;
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
} else if (is0<(ns0-1)) {
|
|
||||||
// pthread_mutex_lock(&mp);
|
|
||||||
// *fileIndex=setStartIndex();
|
|
||||||
// pthread_mutex_unlock(&mp);
|
|
||||||
}
|
|
||||||
|
|
||||||
} //end scan0 loop is0
|
|
||||||
|
|
||||||
// pthread_mutex_lock(&mp);
|
|
||||||
// *fileIndex=setLastIndex();
|
|
||||||
// pthread_mutex_unlock(&mp);
|
|
||||||
|
|
||||||
if (*stoppedFlag==0) {
|
|
||||||
executeAction(stopScript);
|
|
||||||
} else{
|
|
||||||
|
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
cout << "findex incremented " << endl;
|
cout << "Acquire function "<< delflag << endl;
|
||||||
#endif
|
cout << "Stopped flag is "<< stoppedFlag << delflag << endl;
|
||||||
if(*correctionMask&(1<<WRITE_FILE))
|
|
||||||
IncrementFileIndex();
|
|
||||||
pthread_mutex_lock(&mg); //cout << "lock"<< endl;
|
|
||||||
setFileIndex(fileIO::getFileIndex());
|
|
||||||
pthread_mutex_unlock(&mg);//cout << "unlock"<< endl;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef VERBOSE
|
|
||||||
cout << "findex incremented " << endl;
|
|
||||||
#endif
|
|
||||||
if(*correctionMask&(1<<WRITE_FILE))
|
|
||||||
IncrementFileIndex();
|
|
||||||
pthread_mutex_lock(&mg); //cout << "lock"<< endl;
|
|
||||||
setFileIndex(fileIO::getFileIndex());
|
|
||||||
pthread_mutex_unlock(&mg);//cout << "unlock"<< endl;
|
|
||||||
|
|
||||||
if (measurement_finished){
|
|
||||||
pthread_mutex_lock(&mg); //cout << "lock"<< endl;
|
|
||||||
measurement_finished(im,*fileIndex,measFinished_p);
|
|
||||||
pthread_mutex_unlock(&mg);//cout << "unlock"<< endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*stoppedFlag) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// loop measurements
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// waiting for the data processing thread to finish!
|
|
||||||
if (*threadedProcessing) {
|
|
||||||
#ifdef VERBOSE
|
|
||||||
cout << "wait for data processing thread" << endl;
|
|
||||||
#endif
|
|
||||||
setJoinThread(1);
|
|
||||||
|
|
||||||
//let processing thread continue and checkjointhread
|
|
||||||
sem_post(&sem_newRTAcquisition);
|
|
||||||
|
|
||||||
pthread_join(dataProcessingThread, &status);
|
|
||||||
#ifdef VERBOSE
|
|
||||||
cout << "data processing thread joined" << endl;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if(progress_call)
|
|
||||||
progress_call(getCurrentProgress(),pProgressCallArg);
|
|
||||||
|
|
||||||
|
|
||||||
if (connectChannels) {
|
|
||||||
if (disconnect_channels)
|
|
||||||
disconnect_channels(DCarg);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aclog)
|
|
||||||
delete aclog;
|
|
||||||
|
|
||||||
if (eclog)
|
|
||||||
delete eclog;
|
|
||||||
#ifdef VERBOSE
|
|
||||||
cout << "acquisition finished callback " << endl;
|
|
||||||
#endif
|
|
||||||
if (acquisition_finished)
|
|
||||||
acquisition_finished(getCurrentProgress(),getDetectorStatus(),acqFinished_p);
|
|
||||||
#ifdef VERBOSE
|
|
||||||
cout << "acquisition finished callback done " << endl;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
setAcquiringFlag(false);
|
void *status;
|
||||||
sem_destroy(&sem_newRTAcquisition);
|
if ((*correctionMask&(1<< ANGULAR_CONVERSION)) || (*correctionMask&(1<< I0_NORMALIZATION)) || getActionMode(angCalLog) || (getScanMode(0)==positionScan)|| (getScanMode(1)==positionScan)) {
|
||||||
|
if (connectChannels==0)
|
||||||
|
if (connect_channels) {
|
||||||
|
connect_channels(CCarg);
|
||||||
|
connectChannels=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (getActionMode(angCalLog)) {
|
||||||
|
aclog=new angCalLogClass(this);
|
||||||
|
}
|
||||||
|
if (getActionMode(enCalLog)) {
|
||||||
|
eclog=new enCalLogClass(this);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
setJoinThread(0);
|
||||||
|
positionFinished(0);
|
||||||
|
|
||||||
|
|
||||||
|
int nm=timerValue[MEASUREMENTS_NUMBER];
|
||||||
|
if (nm<1)
|
||||||
|
nm=1;
|
||||||
|
|
||||||
|
|
||||||
|
int np=getNumberOfPositions();
|
||||||
|
if (np<1)
|
||||||
|
np=1;
|
||||||
|
|
||||||
|
|
||||||
|
int ns0=1;
|
||||||
|
if (*actionMask & (1 << MAX_ACTIONS)) {
|
||||||
|
ns0=getScanSteps(0);
|
||||||
|
if (ns0<1)
|
||||||
|
ns0=1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ns1=1;
|
||||||
|
if (*actionMask & (1 << (MAX_ACTIONS+1))) {
|
||||||
|
ns1=getScanSteps(1);
|
||||||
|
if (ns1<1)
|
||||||
|
ns1=1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// verify receiver is idle
|
||||||
|
if(receiver){
|
||||||
|
pthread_mutex_lock(&mg);
|
||||||
|
if(getReceiverStatus()!=IDLE)
|
||||||
|
if(stopReceiver() == FAIL)
|
||||||
|
*stoppedFlag=1;
|
||||||
|
pthread_mutex_unlock(&mg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (*threadedProcessing)
|
||||||
|
startThread(delflag);
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << " starting thread " << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//resets frames caught in receiver
|
||||||
|
if(receiver){
|
||||||
|
pthread_mutex_lock(&mg);
|
||||||
|
if (resetFramesCaught() == FAIL)
|
||||||
|
*stoppedFlag=1;
|
||||||
|
pthread_mutex_unlock(&mg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for(int im=0;im<nm;++im) {
|
||||||
|
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
clock_gettime(CLOCK_REALTIME, &end);
|
cout << " starting measurement "<< im << " of " << nm << endl;
|
||||||
cout << "Elapsed time for acquisition:" << (( end.tv_sec - begin.tv_sec ) + ( end.tv_nsec - begin.tv_nsec ) / 1000000000.0) << " seconds" << endl;
|
|
||||||
#endif
|
#endif
|
||||||
return OK;
|
|
||||||
|
// start script
|
||||||
|
if (*stoppedFlag==0) {
|
||||||
|
executeAction(startScript);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int is0=0; is0<ns0; ++is0) {
|
||||||
|
|
||||||
|
if (*stoppedFlag==0) {
|
||||||
|
executeScan(0,is0);
|
||||||
|
} else
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
for (int is1=0; is1<ns1; ++is1) {
|
||||||
|
|
||||||
|
if (*stoppedFlag==0) {
|
||||||
|
executeScan(1,is1);
|
||||||
|
} else
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (*stoppedFlag==0) {
|
||||||
|
executeAction(scriptBefore);
|
||||||
|
} else
|
||||||
|
break;
|
||||||
|
|
||||||
|
ResetPositionIndex();
|
||||||
|
|
||||||
|
for (int ip=0; ip<np; ++ip) {
|
||||||
|
|
||||||
|
if (*stoppedFlag==0) {
|
||||||
|
if (getNumberOfPositions()>0) {
|
||||||
|
moveDetector(detPositions[ip]);
|
||||||
|
IncrementPositionIndex();
|
||||||
|
#ifdef VERBOSE
|
||||||
|
std::cout<< "moving to position" << std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
pthread_mutex_lock(&mp);
|
||||||
|
createFileName();
|
||||||
|
pthread_mutex_unlock(&mp);
|
||||||
|
|
||||||
|
// script before
|
||||||
|
if (*stoppedFlag==0) {
|
||||||
|
executeAction(scriptBefore);
|
||||||
|
} else
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
// header before
|
||||||
|
if (*stoppedFlag==0) {
|
||||||
|
executeAction(headerBefore);
|
||||||
|
|
||||||
|
if (*correctionMask&(1<< ANGULAR_CONVERSION) || aclog){
|
||||||
|
positionFinished(0);
|
||||||
|
setCurrentPosition(getDetectorPosition());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aclog)
|
||||||
|
aclog->addStep(getCurrentPosition(), getCurrentFileName());
|
||||||
|
|
||||||
|
if (eclog)
|
||||||
|
eclog->addStep(setDAC(-1,THRESHOLD,0), getCurrentFileName());
|
||||||
|
|
||||||
|
|
||||||
|
if (*correctionMask&(1<< I0_NORMALIZATION)) {
|
||||||
|
if (get_i0)
|
||||||
|
get_i0(0, IOarg);
|
||||||
|
}
|
||||||
|
|
||||||
|
setCurrentFrameIndex(0);
|
||||||
|
|
||||||
|
if(receiver)
|
||||||
|
pthread_mutex_lock(&mg);
|
||||||
|
if (multiframe>1)
|
||||||
|
setFrameIndex(0);
|
||||||
|
else
|
||||||
|
setFrameIndex(-1);
|
||||||
|
|
||||||
|
// file name and start receiver
|
||||||
|
if(receiver){
|
||||||
|
pthread_mutex_unlock(&mg);
|
||||||
|
pthread_mutex_lock(&mp);
|
||||||
|
createFileName();
|
||||||
|
pthread_mutex_unlock(&mp);
|
||||||
|
//send receiver file name
|
||||||
|
pthread_mutex_lock(&mg);
|
||||||
|
setFileName(fileIO::getFileName());
|
||||||
|
|
||||||
|
if(startReceiver() == FAIL) {
|
||||||
|
cout << "Start receiver failed " << endl;
|
||||||
|
stopReceiver();
|
||||||
|
*stoppedFlag=1;
|
||||||
|
pthread_mutex_unlock(&mg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "Receiver started " << endl;
|
||||||
|
#endif
|
||||||
|
pthread_mutex_unlock(&mg);
|
||||||
|
|
||||||
|
//let processing thread listen to these packets
|
||||||
|
sem_post(&sem_newRTAcquisition);
|
||||||
|
}
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "Acquiring " << endl;
|
||||||
|
#endif
|
||||||
|
startAndReadAll();
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "detector finished" << endl;
|
||||||
|
cout << "returned! " << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
if (*correctionMask&(1<< I0_NORMALIZATION)) {
|
||||||
|
if (get_i0)
|
||||||
|
currentI0=get_i0(1,IOarg);
|
||||||
|
}
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "pos finished? " << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
positionFinished(1);
|
||||||
|
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "done! " << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
if (*threadedProcessing==0){
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "start unthreaded process data " << endl;
|
||||||
|
#endif
|
||||||
|
processData(delflag);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else
|
||||||
|
break;
|
||||||
|
|
||||||
|
while (dataQueueSize()) usleep(100000);
|
||||||
|
|
||||||
|
// close file
|
||||||
|
if(!receiver){
|
||||||
|
detectorType type = getDetectorsType();
|
||||||
|
if ((type==GOTTHARD) || (type==MOENCH) || (type==JUNGFRAUCTB) ){
|
||||||
|
if((*correctionMask)&(1<<WRITE_FILE))
|
||||||
|
closeDataFile();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// stop receiver
|
||||||
|
else{
|
||||||
|
pthread_mutex_lock(&mg);
|
||||||
|
if (stopReceiver() == FAIL)
|
||||||
|
*stoppedFlag = 1;
|
||||||
|
pthread_mutex_unlock(&mg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// header after
|
||||||
|
if (*stoppedFlag==0) {
|
||||||
|
pthread_mutex_lock(&mp);
|
||||||
|
executeAction(headerAfter);
|
||||||
|
pthread_mutex_unlock(&mp);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*stoppedFlag) {
|
||||||
|
#ifdef VERBOSE
|
||||||
|
std::cout<< "exiting since the detector has been stopped" << std::endl;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}//end position loop ip
|
||||||
|
|
||||||
|
|
||||||
|
//script after
|
||||||
|
if (*stoppedFlag==0) {
|
||||||
|
executeAction(scriptAfter);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*stoppedFlag) {
|
||||||
|
#ifdef VERBOSE
|
||||||
|
std::cout<< "exiting since the detector has been stopped" << std::endl;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}//end scan1 loop is1
|
||||||
|
|
||||||
|
|
||||||
|
if (*stoppedFlag) {
|
||||||
|
#ifdef VERBOSE
|
||||||
|
std::cout<< "exiting since the detector has been stopped" << std::endl;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}//end scan0 loop is0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (*stoppedFlag==0) {
|
||||||
|
executeAction(stopScript);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*stoppedFlag) {
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "findex incremented " << endl;
|
||||||
|
#endif
|
||||||
|
if(*correctionMask&(1<<WRITE_FILE))
|
||||||
|
IncrementFileIndex();
|
||||||
|
pthread_mutex_lock(&mg);
|
||||||
|
setFileIndex(fileIO::getFileIndex());
|
||||||
|
pthread_mutex_unlock(&mg);
|
||||||
|
#ifdef VERBOSE
|
||||||
|
std::cout<< "exiting since the detector has been stopped" << std::endl;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "findex incremented " << endl;
|
||||||
|
#endif
|
||||||
|
if(*correctionMask&(1<<WRITE_FILE))
|
||||||
|
IncrementFileIndex();
|
||||||
|
pthread_mutex_lock(&mg); //cout << "lock"<< endl;
|
||||||
|
setFileIndex(fileIO::getFileIndex());
|
||||||
|
pthread_mutex_unlock(&mg);//cout << "unlock"<< endl;
|
||||||
|
|
||||||
|
if (measurement_finished){
|
||||||
|
pthread_mutex_lock(&mg); //cout << "lock"<< endl;
|
||||||
|
measurement_finished(im,*fileIndex,measFinished_p);
|
||||||
|
pthread_mutex_unlock(&mg);//cout << "unlock"<< endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*stoppedFlag) {
|
||||||
|
#ifdef VERBOSE
|
||||||
|
std::cout<< "exiting since the detector has been stopped" << std::endl;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}//end measurements loop im
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// waiting for the data processing thread to finish!
|
||||||
|
if (*threadedProcessing) {
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "wait for data processing thread" << endl;
|
||||||
|
#endif
|
||||||
|
setJoinThread(1);
|
||||||
|
|
||||||
|
//let processing thread continue and checkjointhread
|
||||||
|
sem_post(&sem_newRTAcquisition);
|
||||||
|
|
||||||
|
pthread_join(dataProcessingThread, &status);
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "data processing thread joined" << endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(progress_call)
|
||||||
|
progress_call(getCurrentProgress(),pProgressCallArg);
|
||||||
|
|
||||||
|
|
||||||
|
if (connectChannels) {
|
||||||
|
if (disconnect_channels)
|
||||||
|
disconnect_channels(DCarg);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aclog)
|
||||||
|
delete aclog;
|
||||||
|
|
||||||
|
if (eclog)
|
||||||
|
delete eclog;
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "acquisition finished callback " << endl;
|
||||||
|
#endif
|
||||||
|
if (acquisition_finished)
|
||||||
|
acquisition_finished(getCurrentProgress(),getDetectorStatus(),acqFinished_p);
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "acquisition finished callback done " << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
sem_destroy(&sem_newRTAcquisition);
|
||||||
|
|
||||||
|
#ifdef VERBOSE
|
||||||
|
clock_gettime(CLOCK_REALTIME, &end);
|
||||||
|
cout << "Elapsed time for acquisition:" << (( end.tv_sec - begin.tv_sec ) + ( end.tv_nsec - begin.tv_nsec ) / 1000000000.0) << " seconds" << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
setAcquiringFlag(false);
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -899,37 +899,16 @@ virtual int setReceiverSilentMode(int i = -1)=0;
|
|||||||
*/
|
*/
|
||||||
virtual bool getAcquiringFlag() = 0;
|
virtual bool getAcquiringFlag() = 0;
|
||||||
|
|
||||||
/**
|
|
||||||
Set external gui flag in shared memory
|
|
||||||
\param b set external gui flag
|
|
||||||
*/
|
|
||||||
virtual void setExternalGuiFlag(bool b=false) = 0;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Get external gui flag from shared memory
|
* Check if acquiring flag is set, set error if set
|
||||||
\returns external gui flag
|
* \returns FAIL if not ready, OK if ready
|
||||||
*/
|
*/
|
||||||
virtual bool getExternalGuiFlag() = 0;
|
virtual bool isAcquireReady() = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
|
|
||||||
static const int64_t thisSoftwareVersion=0x20141013;
|
static const int64_t thisSoftwareVersion=0x20141013;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user