diff --git a/gen_seq_launcher.m b/gen_seq_launcher.m new file mode 100644 index 0000000000000000000000000000000000000000..e784a76b7d377855f6605a99f716ad8349c4460e --- /dev/null +++ b/gen_seq_launcher.m @@ -0,0 +1,182 @@ +clear all; + +for num_sequences=1:64 + +seq_name = sprintf('seq_launcher_%d.txt',num_sequences); + +header{1} = '#'; +header{2} = '# Description: $description'; +header{3} = '# Author: Giulio Gaio'; +header{4} = '# Date: 22/01/2020'; +header{5} = '#'; +header{6} = sprintf('# This launching sequence starts %d sub-sequences',num_sequences); +header{7} = '#'; + +error_step = 1+1+num_sequences+num_sequences*7+1+num_sequences*7+3; +rollback_step = error_step + 3; +abort_step = rollback_step + 2; +exit_step = abort_step + 2*num_sequences; + + +cnt = 0; +cnt = cnt + 1; +blk{cnt}=sprintf('step%d;(write(this/RetryCounter) = 0) && (write(this/TimeoutMask) = 0) && goto(%d);Resetting internal variables;Error resetting internal variables;-1',cnt,cnt+1); + +cnt = cnt + 1; +blk{cnt} = sprintf('step%d;(read(this/TimeoutMask) > 0) ? goto(-1) : goto(%d);Checking sequences timeout;Sequence timeout error;-1',cnt,cnt+1); + +cnt = cnt + 1; +blk{cnt} = sprintf('step%d;(read(this/RetryCounter) > read(this/MaxRetryCounter)) ? goto(%d) : goto(%d);Checking retry counter;Max number of retries reached;-1',cnt,rollback_step,cnt+1); + +% reset executed flag +for seq=1:num_sequences + cnt = cnt + 1; + blk{cnt} = sprintf('step%d;(write(this/ExecutedSeq%d) = 0) && goto(%d);Resetting $devseq%d$ executed flag;Error resetting $devseq%d executed flag;-1',cnt,seq,cnt+1,seq,seq); +end + +% start sequences +for seq=1:num_sequences + cnt = cnt + 1; + blk{cnt} = sprintf('step%d;((read($devseq%d$/State) == RUNNING) || (read(this/EnableSeq%d) == 0)) ? goto(%d) : goto(%d);Checking $devseq%d$ already running;Error checking $devseq%d$ already running;-1',cnt,seq,seq,cnt+7,cnt+1,seq,seq); + cnt = cnt + 1; + blk{cnt} = sprintf('step%d;((read(this/RetryCounter) == 0) || (read(this/RetryMask) & 0x%x)) ? command($devseq%d$/Start) && sleep($sleep_after_start_cmd) && goto(%d) : goto(%d);Starting $devseq%d$ sequence;Error starting $devseq%d$ sequence;-1;tangoerror=goto(%d)',cnt,2^(seq-1),seq,cnt+1,cnt+6,seq,seq,error_step); + cnt = cnt + 1; + blk{cnt} = sprintf('step%d;(read(this/BlockMask) & 0x%x) ? goto(%d) : goto(%d);Check $devseq%d$ blocking state;Error checking $devseq%d$ blocking;-1',cnt,2^(seq-1),cnt+1,cnt+5,seq,seq); + cnt = cnt + 1; + blk{cnt} = sprintf('step%d;(read($devseq%d$/State) == RUNNING) ? sleep($sleep_wait_refresh_state) && goto(%d) : goto(%d);Waiting $devseq%d$ (blocking);Error waiting $devseq%d$ (blocking);$sequence_timeout000;tangoerror=goto(%d)',cnt,seq,cnt,cnt+1,seq,seq,error_step); + cnt = cnt + 1; + blk{cnt} = sprintf('step%d;read($devseq%d$/State) == FAULT ? goto(%d) : (write(this/ExecutedSeq%d) = 1) && goto(%d);Checking $devseq%d$ state;$devseq%d$ in FAULT state;-1;tangoerror=goto(%d)',cnt,seq,cnt+1,seq,cnt+3,seq,seq,error_step); + cnt = cnt + 1; + blk{cnt} = sprintf('step%d;(read(this/CatchErrorExitMask) & 0x%x) == 0 ? goto(%d) : goto(%d);Checking $devseq%d$ abort;Error checking $devseq%d$ abort;-1;tangoerror=goto(%d)',cnt,2^(seq-1),cnt+1,abort_step,seq,seq,error_step); + cnt = cnt + 1; + blk{cnt} = sprintf('step%d;(read(this/CatchErrorContinueMask) & 0x%x) == 0 ? goto(%d) : goto(%d);Checking $devseq%d$ abort;Error checking $devseq%d$ abort;-1;tangoerror=goto(%d)',cnt,2^(seq-1),error_step,cnt+1,seq,seq,error_step); +end + +cnt = cnt + 1; +blk{cnt} = sprintf('step%d;sleep($sleep_wait_refresh_state) && (write(this/RunningCounter) = 0) && (write(this/ErrorCounter) = 0) && goto(%d);Waiting sequence state update;Error waiting sequence state update;-1',cnt,cnt+1); + +% check RUNNING +for seq=1:num_sequences + cnt = cnt + 1; + blk{cnt} = sprintf('step%d;(read(this/EnableSeq%d) == 0) ? goto(%d) : goto(%d);Checking $devseq%d$ enabled;Error checking $devseq%d$ enabled;-1',cnt,seq,cnt+7,cnt+1,seq,seq); + cnt = cnt + 1; + blk{cnt} = sprintf('step%d;(read($devseq%d$/State) == OFF) ? (write(this/ExecutedSeq%d) = 1) && goto(%d) : goto(%d);Checking $devseq%d$ OFF state;Error checking $devseq%d$ OFF state;-1;tangoerror=goto(%d)',cnt,seq,seq,cnt+6,cnt+1,seq,seq,error_step); + cnt = cnt + 1; + blk{cnt} = sprintf('step%d;read($devseq%d$/State) == FAULT ? goto(%d) : goto(%d);Checking $devseq%d$ FAULT state;Error checking $devseq%d$ FAULT state;-1;tangoerror=goto(%d)',cnt,seq,cnt+1,cnt+3,seq,seq,error_step); + cnt = cnt + 1; + blk{cnt} = sprintf('step%d;(read(this/CatchErrorExitMask) & 0x%x) == 0 ? goto(%d) : goto(%d);Checking $devseq%d$ abort;Error checking $devseq%d$ abort;-1;tangoerror=goto(%d)',cnt,2^(seq-1),cnt+1,abort_step,seq,seq,error_step); + cnt = cnt + 1; + blk{cnt} = sprintf('step%d;(read(this/CatchErrorContinueMask) & 0x%x) == 0 ? (write(this/ErrorCounter) = (read(this/ErrorCounter) + 1)) && goto(%d) : goto(%d);Checking $devseq%d$ abort;Error checking $devseq%d$ abort;-1;tangoerror=goto(%d)',cnt,2^(seq-1),cnt+1,cnt+1,seq,seq,error_step); + cnt = cnt + 1; + blk{cnt} = sprintf('step%d;read($devseq%d$/State) == RUNNING ? (write(this/RunningCounter) = (read(this/RunningCounter) + 1)) && sleep($sleep_wait_refresh_state) && goto(%d) : goto(%d);$devseq%d$ RUNNING;Error RUNNING $devseq%d$;$sequence_timeout000;timeouterror=goto(%d)',cnt,seq,cnt+2,cnt+2,seq,seq,cnt+1); + cnt = cnt + 1; + blk{cnt} = sprintf('step%d;(write(this/TimeoutMask) = (read(this/TimeoutMask) | 0x%x)) && goto(%d);Setting $devseq%d$ timeout mask;Error setting $devseq%d$ timeout mask;-1',cnt,2^(seq-1),cnt+1,seq,seq); +end + +cnt = cnt + 1; +blk{cnt} = sprintf('step%d;(read(this/RunningCounter) == 0) ? goto(%d) : goto(%d);Checking running sequences;Error checking running sequences;-1',cnt, cnt+2, cnt - 7*num_sequences-1); + +cnt = cnt + 1; +blk{cnt} = sprintf('step%d;(write(this/ErrorCounter) = read(this/ErrorCounter) + 1) && goto(%d);Increasing error counter;Error increasing error counter;-1',cnt,cnt+1); + +cnt = cnt + 1; +blk{cnt} = sprintf('step%d;(write(this/RetryCounter) = read(this/RetryCounter) + 1) && goto(%d);Increasing retry counter;Error increasing retry counter;-1',cnt,cnt+1); + +cnt = cnt + 1; +blk{cnt} = sprintf('step%d;read(this/ErrorCounter) == 0 ? goto(%d) : goto(%d);Increasing retry counter;Error increasing retry counter;-1',cnt,exit_step,2); + +cnt = cnt + 1; +blk{cnt} = sprintf('step%d;((read(this/EnableRollback) == 1) && (read(this/EnableSeq%d) == 0)) ? command($devseq%d$/Start) && sleep($sleep_after_start_cmd) && goto(%d) : goto(-1);Executing rollback sequence $devseq%d$;Error executing rollback sequence $devseq%d;-1',cnt,num_sequences,num_sequences,cnt+1,num_sequences,num_sequences); + +cnt = cnt + 1; +blk{cnt} = sprintf('step%d;sleep($sleep_wait_refresh_state) && (read($devseq%d$/State) == RUNNING) ? goto(%d) : goto(-1);Rolling back $devseq%d$ RUNNING;Error rolling back $devseq%d$;$sequence_timeout000;-1',cnt,num_sequences,cnt,num_sequences,num_sequences); + +% abort step +for seq=1:num_sequences + cnt = cnt + 1; + blk{cnt} = sprintf('step%d;sleep($sleep_wait_refresh_state) && ((read($devseq%d$/State) == FAULT) && (read(this/EnableSeq%d) == 1)) ? command($devseq%d$/Acknowledge) && goto(%d) : goto(%d);Acknowleding $devseq%d$;Error acknowledging $devseq%d$;$sequence_timeout000;tangoerror=goto(%d)',cnt,seq,seq,seq,cnt+1,cnt+1,seq,seq,cnt+1); + cnt = cnt + 1; + blk{cnt} = sprintf('step%d;((read($devseq%d$/State) == RUNNING) && (read(this/EnableSeq%d) == 1)) ? command($devseq%d$/Stop) && goto(%d) : goto(%d);Stopping $devseq%d$;Error stopping$devseq%d$;$sequence_timeout000;tangoerror=goto(%d)',cnt,seq,seq,seq,cnt-1,cnt+1,seq,seq,cnt+1); +end + + + +% dynamic attributes +cnt = 0; +cnt = cnt + 1; +footer{cnt} = 'attr;BlockMask;long64;0'; +cnt = cnt + 1; +footer{cnt} = 'attr;RetryMask;long64;0'; +cnt = cnt + 1; +footer{cnt} = 'attr;CatchErrorExitMask;long64;0'; +cnt = cnt + 1; +footer{cnt} = 'attr;CatchErrorContinueMask;long64;0'; +cnt = cnt + 1; +footer{cnt} = 'attr;EnableRollback;bool;0'; +cnt = cnt + 1; +footer{cnt} = 'attr;TimeoutMask;long64;0'; +cnt = cnt + 1; +footer{cnt} = 'attr;ErrorCounter;long;0'; +cnt = cnt + 1; +footer{cnt} = 'attr;RunningCounter;long;0'; +cnt = cnt + 1; +footer{cnt} = 'attr;MaxRetryCounter;long;1'; + + +% check Enable +for seq=1:num_sequences + cnt = cnt + 1; + footer{cnt} = sprintf('attr;EnableSeq%d;bool;1',seq); +end + +% check Executed +for seq=1:num_sequences + cnt = cnt + 1; + footer{cnt} = sprintf('attr;ExecutedSeq%d;bool;0',seq); +end + +cnt = cnt + 1; +footer{cnt} = 'attr;RetryCounter;long;0'; + + +fileID = fopen(seq_name,'w'); +for i=1:size(header,2) + fprintf(fileID,'%s\n',header{i}); +end +for i=1:size(blk,2) + fprintf(fileID,'%s\n',blk{i}); +end +for i=1:size(footer,2) + fprintf(fileID,'%s\n',footer{i}); +end + +fclose(fileID); + +end + +% Dynamic R/W attributes +% +% User +% attr;Block;long;0 +% attr;Retry;long;0 +% attr;EnableRollback;bool;0 +% attr;MaxRetryCounter;long;0 +% attr;EnableSeq1;bool;0 +% attr;EnableSeq2;bool;0 +% ......... +% Internal +% attr;Executed;long;0 +% attr;RetryCounter;long;0 + +% Wildcards +% $description= +% sleep_after_start_cmd=1 +% $sleep_wait_refresh_state=4 +% $sequence_timeout=240 +% $devseq1= +% $devseq2= +% $devseq3= +% ......... + + +