SFELPHOTON-1335:rework triggerSync

This commit is contained in:
2024-10-24 12:10:00 +02:00
parent 786d9c0037
commit cf4a9362f2
7 changed files with 418 additions and 149 deletions

View File

@@ -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.

View File

@@ -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
View 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]
```