enhance syncronization -> parameters in setup_sync
-> sp.setup_sync(verbose=args.verbose&0x40,timeOfs=0.03,timeCor=0.0005) - cleanup code - add motion markers - add debug data - rework triggerSync - BUT nothing should change in Sync
This commit is contained in:
@@ -1,12 +1,13 @@
|
||||
#HOST=MOTTEST-CPPM-CRM0573
|
||||
HOST=SAR-CPPM-EXPMX1
|
||||
|
||||
XENOMAI_INC_DIR=/opt/powerpc-465-rootfs/usr/local/xenomai-2.6.2.1/include
|
||||
XENOMAI_LIB_DIR=/opt/powerpc-465-rootfs/usr/local/xenomai-2.6.2.1/lib
|
||||
#XENOMAI_INC_DIR=/opt/powerpc-465-rootfs/usr/local/xenomai-2.6.2.1/include
|
||||
#XENOMAI_LIB_DIR=/opt/powerpc-465-rootfs/usr/local/xenomai-2.6.2.1/lib
|
||||
|
||||
XENOMAI_INC_DIR=/tmp/powerpc-465-rootfs/usr/local/xenomai-2.6.2.1/include
|
||||
XENOMAI_LIB_DIR=/tmp/powerpc-465-rootfs/usr/local/xenomai-2.6.2.1/lib
|
||||
|
||||
INC=-I/opt/eldk-4.2/PPMAC_rootfs-7-wheezy/opt/ppmac/libppmac -I/opt/eldk-4.2/PPMAC_rootfs-7-wheezy/opt/ppmac/rtpmac -I$(XENOMAI_INC_DIR)
|
||||
|
||||
|
||||
LIB=-L/opt/eldk-4.2/PPMAC_rootfs-7-wheezy/opt/ppmac/libppmac -lppmac -L/opt/eldk-4.2/PPMAC_rootfs-7-wheezy/usr/local/xenomai-2.6.2.1/lib -lnative -lxenomai -lpthread_rt -lpthread -lrt -ldl
|
||||
|
||||
CC=/opt/eldk-4.2/usr/bin/ppc_4xxFP-g++
|
||||
@@ -14,8 +15,15 @@ LD=$(CC)
|
||||
|
||||
all: triggerSync
|
||||
|
||||
triggerSync.o: $(XENOMAI_INC_DIR)
|
||||
|
||||
$(XENOMAI_INC_DIR):
|
||||
mkdir -p /tmp/powerpc-465-rootfs/usr/local/xenomai-2.6.2.1/
|
||||
rsync -vai root@$(HOST):/usr/local/xenomai-2.6.2.1/ /tmp/powerpc-465-rootfs/usr/local/xenomai-2.6.2.1/
|
||||
|
||||
|
||||
%.o: %.c
|
||||
$(CC) -g $(INC) -c $^ -o $@
|
||||
$(CC) -g $(INC) -c $< -o $@
|
||||
|
||||
triggerSync: triggerSync.o
|
||||
$(LD) -g $(LIB) $^ -o $@
|
||||
|
||||
Binary file not shown.
@@ -33,11 +33,23 @@
|
||||
extern struct SHM *pshm;
|
||||
static char mode=0;
|
||||
static float mtPt2Pt=40.f; //motion point to point time
|
||||
static float timeOfs=0.f; //time ofset
|
||||
static float timeOfs=0.f; //time ofset (start time adjustment)
|
||||
static float timeCor=0.f; //time correction (frame to frame time adjustment)
|
||||
|
||||
#define CLOCK_RES 1e-9 //Clock resolution is 1 ns by default
|
||||
|
||||
#define SIMFLAG0 (pshm->Coord[1].Q[10])
|
||||
#define SIMFLAG1 (pshm->Coord[1].Q[11])
|
||||
|
||||
//EncTable[20].pEnc= Coord[1].Q[12].a does not work
|
||||
//EncTable[20].pEnc= Sys.Udata[0].a works uint32
|
||||
//EncTable[20].pEnc= Sys.Idata[0].a works int32
|
||||
//EncTable[20].pEnc= Sys.Fdata[0].a works float32
|
||||
//EncTable[20].pEnc= Sys.Ddata[0].a works float64
|
||||
//#define ENCVAL (*((double *)pushm+0))
|
||||
#define ENCVAL (*((unsigned int *)pushm+0))
|
||||
|
||||
|
||||
//#define SIMFLAG0 (pshm->P[10])
|
||||
//#define SIMFLAG1 (pshm->P[11])
|
||||
//Power PMAC Software Reference Manual.pdf Gate3[i].Chan[j].Status -> page 919 UserFlag
|
||||
@@ -76,6 +88,14 @@ void trigsync_func(void *arg)
|
||||
printf("ending trigsync_func because Gather.Enable==0\n");
|
||||
return;
|
||||
}
|
||||
|
||||
//unsigned int lastQ12=0; //Q12 value for further sync
|
||||
double mxActPos,mxDesPos,mxHomePos=pshm->Motor[2].HomePos;
|
||||
double myActPos,myDesPos,myHomePos=pshm->Motor[1].HomePos;
|
||||
|
||||
printf("Wait motion program arrived at start position...\n");
|
||||
while(pshm->Coord[1].Q[0]!=-3)
|
||||
rt_task_wait_period(NULL);
|
||||
pshm->Coord[1].Q[0]=-2;
|
||||
srvPer=pshm->ServoPeriod;
|
||||
|
||||
@@ -93,29 +113,30 @@ void trigsync_func(void *arg)
|
||||
}
|
||||
printf("Flag 0: %.5f ms\n", (rt_timer_read() - rtStart)/1E6);
|
||||
|
||||
pshm->Gather.Enable=2; //start gathering data
|
||||
pshm->Coord[1].Q[0]=-1;
|
||||
if(mode&4)
|
||||
{
|
||||
while(SIMFLAG1)
|
||||
rt_task_wait_period(NULL);
|
||||
while(!SIMFLAG1)
|
||||
rt_task_wait_period(NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
while(FLAG1)
|
||||
rt_task_wait_period(NULL);
|
||||
while(!FLAG1)
|
||||
rt_task_wait_period(NULL);
|
||||
}
|
||||
//puts("waitFlag1");
|
||||
//gate3_1->Chan[1].Status f057f77f
|
||||
//gate3_1->Chan[1].Status f057ff7f
|
||||
//printf("gate3_1->Chan[1].Status %x\n",gate3_1->Chan[1].Status);
|
||||
//FEL shot arrived FLAG1 0->1: first frame trigger before first cristall
|
||||
pshm->Gather.Enable=2; //start gathering data
|
||||
pshm->Coord[1].Q[0]=-1;
|
||||
ENCVAL=0;
|
||||
|
||||
printf("Flag 1: %.5f ms\n", (rt_timer_read() - rtStart)/1E6);
|
||||
rtStart=rtLast=rt_timer_read();
|
||||
scStart=scLast=pshm->ServoCount;
|
||||
mtAct=0.f;
|
||||
pshm->Coord[1].Q[0]=0;
|
||||
srvPer=0.2f;
|
||||
//pshm->Coord[1].DesTimeBase=srvPer; //start motion at default speed
|
||||
pshm->Coord[1].DesTimeBase=srvPer*(mtPt2Pt+timeOfs)/mtPt2Pt; //start motion at default speed
|
||||
if(mode&8)
|
||||
@@ -134,24 +155,53 @@ void trigsync_func(void *arg)
|
||||
else
|
||||
{
|
||||
while(FLAG1)
|
||||
{
|
||||
rt_task_wait_period(NULL);
|
||||
ENCVAL=( (i-1)*mtPt2Pt + (pshm->ServoCount-scLast)*srvPer )*1000;
|
||||
}
|
||||
|
||||
while(!FLAG1)
|
||||
{
|
||||
rt_task_wait_period(NULL);
|
||||
ENCVAL=( (i-1)*mtPt2Pt + (pshm->ServoCount-scLast)*srvPer )*1000;
|
||||
}
|
||||
}
|
||||
//FEL shot arrived
|
||||
//FEL shot arrived FLAG1 0->1
|
||||
//ENCVAL+=mtPt2Pt*1000; //ENCVAL in us
|
||||
ENCVAL=i*mtPt2Pt*1000; //ENCVAL in us
|
||||
rtCur = rt_timer_read();
|
||||
scCur=pshm->ServoCount;
|
||||
//if (lastQ12!=(unsigned int)pshm->Coord[1].Q[12])
|
||||
//{
|
||||
// //'Coord[1].Q[12]=Sys.ServoCount'
|
||||
// //'Coord[1].Q[13]={idxOfPoint}'
|
||||
// //type of pshm->Coord[1].Q[12] is double
|
||||
// lastQ12=(unsigned int)pshm->Coord[1].Q[12]; //saved ServoCount in program code
|
||||
|
||||
// //mxActPos=pshm->Motor[2].ActPos;mxDesPos=pshm->Motor[2].DesPos;
|
||||
// //myActPos=pshm->Motor[1].ActPos;myDesPos=pshm->Motor[1].DesPos;
|
||||
|
||||
// //printf("*** SYNC *** Trigger count:%d, ProgIdx:%d, ServoCount diff:%d-%d=%d", i, (unsigned int)pshm->Coord[1].Q[13], lastQ12,scCur, lastQ12-scCur);
|
||||
// printf("*** SYNC *** Trigger count:%d, myDesPos:%.2f, ServoCount diff:%d-%d=%d\n", i, pshm->Coord[1].Q[13]-myHomePos, lastQ12,scCur, lastQ12-scCur);
|
||||
// //printf(" X,Y ActPos:(%.5g %.5g) DesPos:(%.5g %.5g)\n", mxActPos-mxHomePos, myActPos-myHomePos, mxDesPos-mxHomePos, myDesPos-myHomePos);
|
||||
//}
|
||||
|
||||
rtDiff=rtCur-rtLast;
|
||||
scDiff=scCur-scLast;
|
||||
|
||||
mtAct+=scDiff*srvPer;
|
||||
mtAct+=scDiff*srvPer+timeCor;
|
||||
mtDes=i*mtPt2Pt+timeOfs;
|
||||
srvPer=(mtPt2Pt+mtDes-mtAct)/scDiff;
|
||||
//srvPer=pshm->ServoPeriod; //default speed
|
||||
pshm->Coord[1].DesTimeBase=srvPer;
|
||||
pshm->Coord[1].Q[0]++;
|
||||
if(mode&8)
|
||||
printf("Trigger count:%d, rtDiff:%.3fms scDiff:%d mtAct:%.3f mtDes:%.3f srvPer:%.6f\n", i, rtDiff/1E6,scDiff, mtAct,mtDes,srvPer);
|
||||
{
|
||||
mxActPos=pshm->Motor[2].ActPos;mxDesPos=pshm->Motor[2].DesPos;
|
||||
myActPos=pshm->Motor[1].ActPos;myDesPos=pshm->Motor[1].DesPos;
|
||||
printf(" X,Y ActPos:(%.5g %.5g) DesPos:(%.5g %.5g) ", mxActPos-mxHomePos, myActPos-myHomePos, mxDesPos-mxHomePos, myDesPos-myHomePos);
|
||||
printf("Trigger count:%d, rtDiff:%.3fms scDiff:%d mtAct:%.3f mtDes:%.3f srvPer:%.6f ENCVAL:%u \n", i, rtDiff/1E6,scDiff, mtAct,mtDes,srvPer,ENCVAL);
|
||||
}
|
||||
rtLast=rtCur;
|
||||
scLast=scCur;
|
||||
}
|
||||
@@ -163,12 +213,13 @@ void trigsim_func(void *arg)
|
||||
RT_TASK *curtask;
|
||||
RT_TASK_INFO curtaskinfo;
|
||||
int iret = 0;
|
||||
int loopPeriod=1e7;//Expressed in ticks (this is the default task period)
|
||||
curtask = rt_task_self();
|
||||
rt_task_inquire(curtask, &curtaskinfo);
|
||||
//Print the info
|
||||
//printf("Starting task %s with period of %f ms ....\n", curtaskinfo.name,10*1E6/1E6);
|
||||
printf("Starting task %s with period of %f ms ....\n", curtaskinfo.name,loopPeriod/1E6);
|
||||
//Make the task periodic with a specified loop period
|
||||
//rt_task_set_periodic(NULL, TM_NOW, 10*1E6);
|
||||
//rt_task_set_periodic(NULL, TM_NOW, loopPeriod); //not critical here because not polling but rt_task_sleep_until ...
|
||||
printf("Starting task %s \n", curtaskinfo.name);
|
||||
|
||||
int i,j=0;
|
||||
@@ -180,9 +231,8 @@ void trigsim_func(void *arg)
|
||||
|
||||
for(i=0,rtSlice=rtStart;;i++)
|
||||
{
|
||||
rtSlice=rtStart+i*40*1E6; // a slice is 40 ms
|
||||
//rtSlice=rtStart+i*40.2*1E6; // a slice is 40 ms
|
||||
//rtSlice+=(rand()%(int)(1*1E6)); //0.1ms jitter
|
||||
rtSlice=rtStart+i*mtPt2Pt*1E6; // a slice is mtPt2Pt ms
|
||||
//rtSlice+=(rand()%(int)(1*1E6)); //0.1ms jitter to test sync
|
||||
rt_task_sleep_until(rtSlice); //in ns
|
||||
if(mode&4)
|
||||
{
|
||||
@@ -275,6 +325,11 @@ mode:\n\
|
||||
bit2:4: simulate frame trigger\n\
|
||||
bit3:8: verbose\n\
|
||||
\n\
|
||||
pt2ptTime: point to point time in ms (default=10, float value)\n\
|
||||
timeOfs: once added time offset in ms (default=0, float value)\n\
|
||||
scl: scale factor (so far unused, default=1, float value)\n\
|
||||
\n\
|
||||
\n\
|
||||
simulate start trigger:\n\
|
||||
set pshm->Coord[1].Q[10]=1 to simulate a Jungfrau aquire start\n\
|
||||
\n\
|
||||
@@ -297,7 +352,7 @@ Coord[1].Q[0]= 0 : got frame trigger 0\n\
|
||||
Coord[1].Q[0] is incremented at each trigger\n\
|
||||
sync task ends when Gather.Enable==0\n\
|
||||
";
|
||||
printf("usage:\n%s pt2ptTime timeOfs mode\n",cmd);
|
||||
printf("usage:\n%s mode pt2ptTime timeOfs(default=0) scl(default=1)\n",cmd);
|
||||
puts(s);
|
||||
return -1;
|
||||
}
|
||||
@@ -308,22 +363,21 @@ int main(int argc, char *argv[])
|
||||
int initialized=0;
|
||||
int i;
|
||||
char *s;
|
||||
if(argc!=4)
|
||||
return usage(argv[0]);
|
||||
mtPt2Pt=strtof(argv[1], &s);
|
||||
if (argv[1]==s)
|
||||
return usage(argv[0]);
|
||||
timeOfs=strtof(argv[2], &s);
|
||||
if (argv[2]==s)
|
||||
return usage(argv[0]);
|
||||
mode=(int)strtol(argv[3], &s, 10);
|
||||
if (argv[3]==s)
|
||||
if(argc<2)
|
||||
return usage(argv[0]);
|
||||
mode=(int)strtol(argv[1], &s, 10);
|
||||
if (argc>2)
|
||||
mtPt2Pt=strtof(argv[2], &s);
|
||||
if (argc>3)
|
||||
timeOfs=strtof(argv[3], &s);
|
||||
if (argc>4)
|
||||
timeCor=strtof(argv[4], &s);
|
||||
puts(argv[0]);
|
||||
puts(argv[1]);
|
||||
puts(argv[2]);
|
||||
puts(argv[3]);
|
||||
printf("mtPt2Pt:%g timeOfs:%g mode:%d\n",mtPt2Pt,timeOfs,mode);
|
||||
//puts(argv[2]);
|
||||
//puts(argv[3]);
|
||||
//puts(argv[4]);
|
||||
printf("mode:%d mtPt2Pt:%3.8gms timeOfs:%3.8gms timeCor:%3.8gms\n",mode,mtPt2Pt,timeOfs,timeCor);
|
||||
if ((err = InitLibrary()) != 0) {
|
||||
abort();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user