SFELPHOTON-1335:rework triggerSync
This commit is contained in:
@@ -1,32 +1,110 @@
|
||||
Activate an user servoloop
|
||||
--------------------------
|
||||
triggerSync
|
||||
===========
|
||||
```
|
||||
PBTools/pbtools/usr_servo_phase$ make
|
||||
PBTools/pbtools/usr_servo_phase/usrServoSample$ make
|
||||
scp userservo_util userphase_util usrServoSample/usralgo.ko root@MOTTEST-CPPM-CRM0573:/tmp
|
||||
|
||||
rmmod usralgo
|
||||
insmod /tmp/usralgo.ko
|
||||
|
||||
cat /proc/kallsyms | grep MyUserAlgoFunctionName (e.g. cat /proc/kallsyms | grep usr_servo_ctrl_2)
|
||||
a10385ca r __kstrtab_usr_servo_ctrl_2 [usralgo]
|
||||
a1038570 r __ksymtab_usr_servo_ctrl_2 [usralgo]
|
||||
a103812c T usr_servo_ctrl_2 [usralgo]
|
||||
|
||||
UserAlgo.ServoCtrlAddr[1] = $a103812c
|
||||
Motor[1].Ctrl =UserAlgo.ServoCtrlAddr[1].a
|
||||
|
||||
.. but this can not be set directly in gpascii.
|
||||
|
||||
root@:/opt/ppmac#
|
||||
LD_LIBRARY_PATH=/opt/ppmac/libppmac/ /tmp/userservo_util -d 1
|
||||
rmmod usralgo
|
||||
insmod /tmp/usralgo.ko
|
||||
LD_LIBRARY_PATH=/opt/ppmac/libppmac/ /tmp/userservo_util -l 1 usr_servo_ctrl_2
|
||||
LD_LIBRARY_PATH=/opt/ppmac/libppmac/ /tmp/userservo_util -e 1
|
||||
|
||||
gpascii:
|
||||
Motor[1].Ctrl =UserAlgo.ServoCtrlAddr[1]
|
||||
samples: root@:/opt/ppmac#
|
||||
/tmp/triggerSync 40 11 trigger all 40 ms, simulated start, use real frame triggers, verbose
|
||||
/tmp/triggerSync 40 14 trigger all 40 ms, simulated start and frame triggers, no sync, verbose
|
||||
/tmp/triggerSync 40 15 trigger all 40 ms, simulated start and frame triggers, with sync, verbose
|
||||
/tmp/triggerSync 40 7 trigger all 40 ms, simulated start and frame triggers, with sync, minimal verbose
|
||||
|
||||
|
||||
For real triggers, deltatau is using flags from the EVR-card:
|
||||
|
||||
#define SIMFLAG0 (pshm->Coord[1].Q[10])
|
||||
#define SIMFLAG1 (pshm->Coord[1].Q[11])
|
||||
|
||||
//Power PMAC Software Reference Manual.pdf Gate3[i].Chan[j].Status -> page 919 UserFlag
|
||||
#define FLAG0 (gate3_1->Chan[0].Status&0x800)
|
||||
#define FLAG1 (gate3_1->Chan[1].Status&0x800)
|
||||
|
||||
|
||||
work of triggerSync program:
|
||||
- wait for [SIM]FLAG0 (arm trigger)
|
||||
- once armed, each [SIM]FLAG1 trigger is a frame trigger.
|
||||
|
||||
SIMFLAG[0|1] are vairables Coord[1].Q[10] and Coord[1].Q[11]
|
||||
|
||||
the EVR flags are set in;
|
||||
caqtdm -attach -macro SYS=SAR-EXPMX,DEVICE=EVR0,FF=PCIe G_EVR_main.ui
|
||||
|
||||
FLAG0 == Gate3[1].Chan[0].UserFlag == FrontUnivOut4 -> Pulser0 -> (active Low, 5000us delay 0us) Map: 214
|
||||
FLAG1 == Gate3[1].Chan[1].UserFlag == FrontUnivOut5 -> Pulser1 -> (active Low, 5000us delay 750us) Map: 40
|
||||
|
||||
Pulser 0: event 214 is 'ESC multipurpose event. In this case used as: start motion'
|
||||
Pulser 1: maps event 40 = 'ESA_detector 100 Hz' >>> should be 77='ESC detector'
|
||||
|
||||
event 214 is set with the CTA. For tests one can set manually
|
||||
caput SAR-EXPMX-EVR0:FrontUnivOut4-Src-Scale-SP 9 # Force High(0) -> arm event, before start motion
|
||||
caput SAR-EXPMX-EVR0:FrontUnivOut4-Src-Scale-SP 8 # Force Low(1) -> trigger motion
|
||||
caput SAR-EXPMX-EVR0:FrontUnivOut4-Src-Pulse-SP 0 # set back to Pulser 0 -> reset for CTA usage
|
||||
|
||||
This are values how they should be:
|
||||
caget SAR-EXPMX-EVR0:FrontUnivOut4-Src-Pulse-RB SAR-EXPMX-EVR0:FrontUnivOut5-Src-Pulse-RB \
|
||||
SAR-EXPMX-EVR0:Pul0-Polarity-Sel SAR-EXPMX-EVR0:Pul0-Delay-RB SAR-EXPMX-EVR0:Pul0-Width-RB \
|
||||
SAR-EXPMX-EVR0:Pul1-Polarity-Sel SAR-EXPMX-EVR0:Pul1-Delay-RB SAR-EXPMX-EVR0:Pul1-Width-RB \
|
||||
SAR-EXPMX-EVR0:Pul0-Evt-Trig0-SP SAR-EXPMX-EVR0:Pul1-Evt-Trig0-SP
|
||||
|
||||
SAR-EXPMX-EVR0:FrontUnivOut4-Src-Pulse-RB "Pulser 0"
|
||||
SAR-EXPMX-EVR0:FrontUnivOut5-Src-Pulse-RB "Pulser 1"
|
||||
SAR-EXPMX-EVR0:Pul0-Polarity-Sel "Active Low"
|
||||
SAR-EXPMX-EVR0:Pul0-Delay-RB 0.000 us
|
||||
SAR-EXPMX-EVR0:Pul0-Width-RB 5000.000 us
|
||||
SAR-EXPMX-EVR0:Pul1-Polarity-Sel "Active Low"
|
||||
SAR-EXPMX-EVR0:Pul1-Delay-RB 750.000 us
|
||||
SAR-EXPMX-EVR0:Pul1-Width-RB 5000.000 us
|
||||
SAR-EXPMX-EVR0:Pul0-Evt-Trig0-SP 214
|
||||
SAR-EXPMX-EVR0:Pul1-Evt-Trig0-SP 40
|
||||
```
|
||||
|
||||
testing simulated start triggers
|
||||
--------------------------------
|
||||
```
|
||||
Gather.Enable=1 // else triggerSync stops if value is 0
|
||||
Coord[1].Q[0]=-3 // simulate motion ready
|
||||
Coord[1].Q[10]=0 // turn off simulated start event
|
||||
|
||||
root@:/opt/ppmac#
|
||||
LD_LIBRARY_PATH=/opt/ppmac/libppmac/ /tmp/triggerSync 14 10 0 # trigger all 10 ms, simulated start and frame triggers , no sync , verbose
|
||||
LD_LIBRARY_PATH=/opt/ppmac/libppmac/ /tmp/triggerSync 15 10 0 # trigger all 10 ms, simulated start and frame triggers , with sync, verbose
|
||||
LD_LIBRARY_PATH=/opt/ppmac/libppmac/ /tmp/triggerSync 11 10 0 # trigger all 10 ms, simulated start, real frame triggers , with sync, verbose
|
||||
LD_LIBRARY_PATH=/opt/ppmac/libppmac/ /tmp/triggerSync 7 10 0 # trigger all 10 ms, simulated start and frame triggers , with sync, minimal verbose
|
||||
|
||||
....
|
||||
Coord[1].Q[10]=1 # turn on simulated start event
|
||||
.s.s.s.s.
|
||||
Coord[1].Q[10]=0 # turn off simulated start event
|
||||
....
|
||||
Coord[1].Q[10]=1 # turn on simulated start event
|
||||
.s.s.s.s.
|
||||
Coord[1].Q[0]=0 # simulate ready at start position
|
||||
.s.s.s.x.........
|
||||
Gather.Enable=0 # end triggerSync
|
||||
```
|
||||
|
||||
testing real start triggers
|
||||
---------------------------
|
||||
```
|
||||
Gather.Enable=1 // else triggerSync stops if value is 0
|
||||
Coord[1].Q[0]=0 // simulate motion not ready (!=-3)
|
||||
|
||||
caget SAR-EXPMX-EVR0:FrontUnivOut4-Src-Pulse-RB
|
||||
->SAR-EXPMX-EVR0:FrontUnivOut4-Src-Pulse-RB "Pulser 0"
|
||||
|
||||
# set start EVT to value 0 (=Force Hi)
|
||||
caput SAR-EXPMX-EVR0:FrontUnivOut4-Src-Scale-SP 9
|
||||
|
||||
root@:/opt/ppmac#
|
||||
LD_LIBRARY_PATH=/opt/ppmac/libppmac/ /tmp/triggerSync 9 10 0 # trigger all 10 ms, real start and frame triggers, with sync, verbose
|
||||
LD_LIBRARY_PATH=/opt/ppmac/libppmac/ /tmp/triggerSync 1 10 0 # trigger all 10 ms, real start and frame triggers, with sync, minimal verbose
|
||||
|
||||
Coord[1].Q[0]=-3 // simulate motion ready
|
||||
|
||||
Coord[1].Q[0] // changed to -2 to indicate 'wait for start EVT
|
||||
|
||||
# set start EVT to value 1 (=Force Lo)
|
||||
caput SAR-EXPMX-EVR0:FrontUnivOut4-Src-Scale-SP 8
|
||||
# reset EVT default value (Pulser 0)
|
||||
caput SAR-EXPMX-EVR0:FrontUnivOut4-Src-Pulse-SP 0
|
||||
|
||||
Gather.Enable=0 # end triggerSync
|
||||
```
|
||||
|
||||
Binary file not shown.
@@ -91,7 +91,7 @@ void trigsync_func(void *arg)
|
||||
srvPer=pshm->ServoPeriod;
|
||||
|
||||
rtStart=rt_timer_read();
|
||||
printf("Wait for 'arm' event...\n");
|
||||
printf("Wait for 'acquire start' event...\n");
|
||||
if(mode&2)
|
||||
{
|
||||
while(!SIMFLAG0)
|
||||
@@ -217,44 +217,41 @@ void trigsim_func(void *arg)
|
||||
rt_task_sleep_until(rtSlice); //in ns
|
||||
if(mode&4)
|
||||
{
|
||||
SIMFLAG1=1;
|
||||
SIMFLAG1=1; //set frame event on
|
||||
//while(rt_timer_read()-rtStart<1E6*40*i)
|
||||
// rt_task_wait_period(NULL);
|
||||
rt_task_sleep_until(rtSlice+5*1E6); //in ns
|
||||
SIMFLAG1=0;
|
||||
SIMFLAG1=0; //set frame event off
|
||||
if(mode&8)
|
||||
{putchar('.');fflush(stdout);}
|
||||
{putchar('.');fflush(stdout);} //indicates frame event has been generated (toggle on/off)
|
||||
}
|
||||
//if(pshm->Coord[1].DesTimeBase==0)
|
||||
if(SIMFLAG0==1)
|
||||
if(SIMFLAG0==1) //if start event on
|
||||
{
|
||||
if(j)
|
||||
if(pshm->Coord[1].Q[0]>=0) //îf moved bejond start position, the start event was consumed
|
||||
{
|
||||
SIMFLAG0=0;j=0;
|
||||
SIMFLAG0=0; //set start event off
|
||||
if(mode&8){
|
||||
putchar('x');fflush(stdout); //indicates start event has been turned off
|
||||
}
|
||||
}
|
||||
else if(mode&8){
|
||||
putchar('s');fflush(stdout); //indicates start event is on
|
||||
}
|
||||
else if(mode&8)
|
||||
{putchar('x');fflush(stdout);}
|
||||
j++;
|
||||
}
|
||||
if(!pshm->Gather.Enable)
|
||||
{
|
||||
if((mode&4) && j<10)
|
||||
{
|
||||
putchar('o');
|
||||
putchar('o'); //indicates Gather.Enable==0 and trigsim_func will end after further 10 simulated frame triggers
|
||||
j++;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
//if(pshm->Coord[1].Q[10]==2)
|
||||
// break;
|
||||
}
|
||||
printf("trigsim_func done\n");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void trigsync_run()
|
||||
{
|
||||
RT_TASK trigsync_task;
|
||||
@@ -275,7 +272,7 @@ void trigsync_run()
|
||||
rt_task_start(&trigsync_task, &trigsync_func, 0); //Since task starts in suspended mode, start task
|
||||
}
|
||||
|
||||
if(mode&2)
|
||||
if(mode&6)
|
||||
{
|
||||
rt_task_create(&trigsim_task, strSim, 0, 50, T_JOINABLE);
|
||||
rt_task_start(&trigsim_task, &trigsim_func, 0);
|
||||
@@ -288,7 +285,7 @@ void trigsync_run()
|
||||
printf("trigsync_task done\n");
|
||||
}
|
||||
|
||||
if(mode&2)
|
||||
if(mode&6)
|
||||
{
|
||||
rt_task_join(&trigsim_task);
|
||||
printf("trigsim_task done\n");
|
||||
@@ -311,27 +308,31 @@ 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\
|
||||
simulate frame trigger\n\
|
||||
is output to pshm->Coord[1].Q[11]\n\
|
||||
mode examples:\n\
|
||||
1: synchronize real frame and start triggers\n\
|
||||
3: synchronize real frame and simulated start triggers\n\
|
||||
6: simulated frame and start triggers (no sync)\n\
|
||||
7: synchronize simulated frame and start triggers\n\
|
||||
\n\
|
||||
in simulate mode:\n\
|
||||
set pshm->Coord[1].Q[10]=1 to simulate a Jungfrau aquire start\n\
|
||||
set pshm->Coord[1].Q[10]=2 to stop simulate trigger generation\n\
|
||||
Coord[1].Q[11] is the simulated frame trigger\n\
|
||||
Acquire start event:\n\
|
||||
SIM: Coord[1].Q[10]\n\
|
||||
EVR: Gate3[1].Chan[0].UserFlag == (gate3_1->Chan[0].Status&0x800)\n\
|
||||
\n\
|
||||
in synchronize mode\n\
|
||||
Coord[1].Q[0]=-2 : trigsync_func start, Wait for 'arm' trigger\n\
|
||||
Coord[1].Q[0]=-1 : got 'arm' trigger, wait frame trigger\n\
|
||||
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\
|
||||
Frame event:\n\
|
||||
SIM: Coord[1].Q[11]\n\
|
||||
EVR: Gate3[1].Chan[1].UserFlag == (gate3_1->Chan[0].Status&0x800)\n\
|
||||
\n\
|
||||
Coord[1].Q[0] : sync points indicator: (at whick point is the motion program) (mode=2)\n\
|
||||
val: desc set in code\n\
|
||||
-3: motion armed at start position motion code MXMotion.py:setup_sync\n\
|
||||
-2: wait for 'aquire start' event triggerSync.c:trigsync_func(mode&1==sync mode) or motion code MXMotion.py:setup_sync\n\
|
||||
-1: start gathering data triggerSync.c:trigsync_func(mode&1==sync mode) or motion code MXMotion.py:setup_sync\n\
|
||||
0: got first frame trigger triggerSync.c:trigsync_func(mode&1==sync mode)\n\
|
||||
idx: index of frame during run triggerSync.c:trigsync_func(mode&1==sync mode)\n\
|
||||
\n\
|
||||
\n\
|
||||
exec ends the tasks ends\n\
|
||||
tasks ends (trigsync_func and trigsim_func) when Gather.Enable==0\n\
|
||||
";
|
||||
printf("usage:\n%s mode pt2ptTime timeOfs(default=0) scl(default=1)\n",cmd);
|
||||
puts(s);
|
||||
|
||||
32
src/usrServo/Readme.md
Normal file
32
src/usrServo/Readme.md
Normal file
@@ -0,0 +1,32 @@
|
||||
Activate an user servoloop
|
||||
--------------------------
|
||||
```
|
||||
PBTools/pbtools/usr_servo_phase$ make
|
||||
PBTools/pbtools/usr_servo_phase/usrServoSample$ make
|
||||
scp userservo_util userphase_util usrServoSample/usralgo.ko root@MOTTEST-CPPM-CRM0573:/tmp
|
||||
|
||||
rmmod usralgo
|
||||
insmod /tmp/usralgo.ko
|
||||
|
||||
cat /proc/kallsyms | grep MyUserAlgoFunctionName (e.g. cat /proc/kallsyms | grep usr_servo_ctrl_2)
|
||||
a10385ca r __kstrtab_usr_servo_ctrl_2 [usralgo]
|
||||
a1038570 r __ksymtab_usr_servo_ctrl_2 [usralgo]
|
||||
a103812c T usr_servo_ctrl_2 [usralgo]
|
||||
|
||||
UserAlgo.ServoCtrlAddr[1] = $a103812c
|
||||
Motor[1].Ctrl =UserAlgo.ServoCtrlAddr[1].a
|
||||
|
||||
.. but this can not be set directly in gpascii.
|
||||
|
||||
root@:/opt/ppmac#
|
||||
LD_LIBRARY_PATH=/opt/ppmac/libppmac/ /tmp/userservo_util -d 1
|
||||
rmmod usralgo
|
||||
insmod /tmp/usralgo.ko
|
||||
LD_LIBRARY_PATH=/opt/ppmac/libppmac/ /tmp/userservo_util -l 1 usr_servo_ctrl_2
|
||||
LD_LIBRARY_PATH=/opt/ppmac/libppmac/ /tmp/userservo_util -e 1
|
||||
|
||||
gpascii:
|
||||
Motor[1].Ctrl =UserAlgo.ServoCtrlAddr[1]
|
||||
|
||||
|
||||
```
|
||||
Reference in New Issue
Block a user