From a4a2cfab48f6159a64a3679ce23e6a1c95fd3b25 Mon Sep 17 00:00:00 2001 From: galperti <cristian.galperti@epfl.ch> Date: Wed, 22 Jun 2022 17:31:55 +0200 Subject: [PATCH] duplicate template working on a minimal example --- .../algo_cfgtemplate1_harness_run.m | 69 ------------------ algos/cfs-template/algo_cfstemplate1.slx | Bin 20609 -> 0 bytes .../algo_cfstemplate1_harness.slx | Bin 15277 -> 0 bytes .../algo_cfstemplate1_inBus_def.m | 33 --------- algos/cfs-template/algo_cfstemplate1_loadfp.m | 6 -- algos/cfs-template/algo_cfstemplate1_loadtp.m | 11 --- .../algo_cfstemplate1_outBus_def.m | 35 --------- .../algo_cfstemplate1_signal_buses.m | 47 ------------ algos/cfs-template/algo_cfstemplate1_test.m | 7 -- algos/cfs-template/algoobj_cfstemplate1.m | 42 ----------- algos/template/duplicate_template.m | 7 +- 11 files changed, 2 insertions(+), 255 deletions(-) delete mode 100644 algos/cfs-template/algo_cfgtemplate1_harness_run.m delete mode 100644 algos/cfs-template/algo_cfstemplate1.slx delete mode 100644 algos/cfs-template/algo_cfstemplate1_harness.slx delete mode 100644 algos/cfs-template/algo_cfstemplate1_inBus_def.m delete mode 100644 algos/cfs-template/algo_cfstemplate1_loadfp.m delete mode 100644 algos/cfs-template/algo_cfstemplate1_loadtp.m delete mode 100644 algos/cfs-template/algo_cfstemplate1_outBus_def.m delete mode 100644 algos/cfs-template/algo_cfstemplate1_signal_buses.m delete mode 100644 algos/cfs-template/algo_cfstemplate1_test.m delete mode 100644 algos/cfs-template/algoobj_cfstemplate1.m diff --git a/algos/cfs-template/algo_cfgtemplate1_harness_run.m b/algos/cfs-template/algo_cfgtemplate1_harness_run.m deleted file mode 100644 index c24b026..0000000 --- a/algos/cfs-template/algo_cfgtemplate1_harness_run.m +++ /dev/null @@ -1,69 +0,0 @@ -function algo_template_harness_run(obj) -% run harness and check the result - -% load tunable control parameters from mds -shot = 100; % shot reference -obj.actualize(shot); - -% Input Data - must be structure of timeseries matching input bus structure -% time = 0:obj.gettiming.dt:1; -% data = single(sin(2*pi*time*10)'); -% % NB: these struct name and types must match the corresponding data bus -% tsStructData = struct('simple_signal',timeseries(data,time,'Name','Test Input Data')); - -% SimIn object to customize configuration of Simulation run for test -SimIn = Simulink.SimulationInput([obj.getname '_harness']); - -% Create template Input dataset for this model -% Dataset = createInputDataset(obj.getname); - -% assign input data signal to Simulink.Signal object -% DataIn = Simulink.SimulationData.Signal; -% DataIn.Values = tsStructData; - -% assign as first element in input data set -% isig = find(contains(Dataset.getElementNames,'signal_in')); % find input signal index -% Dataset = Dataset.setElement(isig,DataIn); %#ok<FNDSB> -% SimIn.ExternalInput = Dataset; % assign this as external input for simulation - -% Custom parameters for this run to save outport data -SimIn = SimIn.setModelParameter('SaveOutput','on'); % set to save outport signals -SimIn = SimIn.setModelParameter('SignalLogging','on'); % set to save log signals -SimIn = SimIn.setModelParameter('OutputSaveName','SimOut'); -SimIn = SimIn.setModelParameter('SaveFormat','Dataset'); -SimIn = SimIn.setModelParameter('StartTime',num2str(obj.gettiming().t_start)); -SimIn = SimIn.setModelParameter('StopTime',num2str(obj.gettiming().t_stop)); -SimIn = SimIn.setModelParameter('FixedStep',num2str(obj.gettiming().dt)); - -% simulate - simulate only single types to save time -result = sim(SimIn); - -% check output port data -tp = Simulink.data.evalinGlobal(obj.getname,'algo_template_tp.Value'); -fp = Simulink.data.evalinGlobal(obj.getname,'algo_template_fp'); - -input = evalin('base','algo_template_inbus1'); -input1 = input.signal1.Data; -input2 = input.signal2.Data; - -output1 = result.simout.signal1.Data; -output2 = result.simout.signal2.Data; - -size(input1) -size(output1) - -maxerror1 = 0.1; -maxerror2 = 0.1; -assert(max(abs(output1 - input1.*tp.gain))<maxerror1,'Wrong output 1!'); -assert(max(abs(output2 - (input2.*tp.refmodel.gain+fp.refmodel.offset)))<maxerror2,'Wrong output 2!'); - -% check logs which contain a SCDsignal type data -% logsout = result.logsout; -% -% signal = logsout.getElement('SCDsignal type bus').Values.Value; -% Quality = logsout.getElement('SCDsignal type bus').Values.QualityTag; -% State = logsout.getElement('SCDsignal type bus').Values.ProductionState; -% -% assert(all(State .Data == ProductionState.RUNNING),'ProductionState must be RUNNING'); -% assert(all(Quality.Data == QualityTag.GOOD ),'QualityTag must be RUNNING' ); -end diff --git a/algos/cfs-template/algo_cfstemplate1.slx b/algos/cfs-template/algo_cfstemplate1.slx deleted file mode 100644 index 2759c85d3e689413b87a5c682b8a256cc4371ef1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20609 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 IG^C;VAAvxzGynhq diff --git a/algos/cfs-template/algo_cfstemplate1_harness.slx b/algos/cfs-template/algo_cfstemplate1_harness.slx deleted file mode 100644 index 6beba1d4535228191471cd1460a5ca438f669736..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15277 zcmbW8190Wb+OK14V%xTziEU4e727r@n2Bvo?1^pL=EP2BqMLorcQ&&3`Rd-gR&}td z)>FUkx4Zw{FBGIf!BByKfS`aTyyjHUl!=<ufPsM8K!AX7-afT9aWXJAa57*pvUM;~ zaIm#Aac}~dIMTaWTSY02$n`KHJtYj@_qvzRseP65^T<UGAV%UCSugxhjki<?c*$&q zo&@FaG<9)lT{rgpP~Zq*4MV1k>c;ON$lM2;Qgpai<;XF}lqe-9O-3XNkGX4A8>AXU z1s|iOnr#i-4~WVqDwCQTT8_}ST7(8;`&1fB=dPlqu=2?{nr4{a9D(!Z84X>Zswi=L ze6rkBoK?$#U0W@y`2?P`M<D<R0FTfL<ZCHvkOotsCbKJSEd=YRy2?^}Wf-BUx=^n! z-c~V2u-W+B<M^u57`s-CnQg#7D_r3e2i=z=bAc??KOY1zXF98cA4Kvp{FK-7*n?n_ zLl9EY;n1^*^pR96?qQ#=tK*2LXRFL9ai)gApeVJAUQse?t<l$$)^CFyc1_O)fl}-w z3)%?THjID)Sq{P*1pXjbyPo!9-g^b>aM2#IwrCR3#(YA4lChltC&?RF;V<S;WYgsC zdozRhn@RBgYz}MJzZ=9PMo12n2~M;U*<>RB6h?u3%^6a-0JoD=jUu%-dV7+&kpdQ- zrK)c4{;7k{=OEukgN!-KL*S%N_zIU;SNz$Yi;vfW44zWZuv?LVQVTC*%yj~7gBqiZ zF1PrM2<vuM%bi{9DG1AWaI%nRK@(zP3H5?SXA0NlF>vW>S#x4GcG-mLFgqTVuP$?V zm9mT%`C2`K6)^>r+;V<a%l_L3s{B1P=H`1niMFRecGrei$qV=XAi~3OzC#p^+O@l% z^6vMbf9-!-qZdx{Tfb-C8u|a$e^ECl6B|c>t<7&UQ#ZN`A%GDH+_zw<#hS^YQ-Slx zQlN+4h!|8I*_znJd7oSN&d9E8VVN067>4Ls07tAOd_XI_>_HZU&B8S~WEZq|pvZ;s zrYu};g%rmU(huYw2`1-W!%H{z$wF5A1jCiDB8dpfJi&{#bzLPNtYhSrv@=d;fBB}O z{Imt5wUGhkKkF#|77JNol6dO;1*1T#$K*9wh2XD!^I9kn|M<4dGQoj>u-^LS2(Wgx z0@zqGC>xoZ7&}{;h`cSi-?~$;A{(<ph}3poS>-k0*X5@ku5O`jji`#avUUvv8eRS% z9a6XCt9Q~XnJznrzYKfF7&9=MW}t@nScu@0+@+@5f?yxi-C6f-MzuvVlwl&v4~n3s zC81pRwHeD;?^A$1=8cl|UVkfGf^KMm<1=57T0-F$MH1bgwKxszO1hwFAYI`FfKBDk zRfBp1Xk_*QSX~A#7+^DOiZc(Of#Liv<t&~U-y7G<dbBGT7f-3%5U{#~Dc#_<)3F2r zIYOz_&`>lA5h%o5>NDUk5kAGuIS#flbNcbu;l_I3WPe&O?3zAMmuq+3hxH8Q9Iw{a zt!M*BJvy>d%ah4{fM}+K$_{ea4D9riqLUGxNe_R(j51SwWtVm%W`At2P}!>yo}Vw< z9LfYPx01OthiNMHo{wW|F@<JEG8!%+{2WosNRhm@7n=F~!_&bOQ>YCl1E(}<ER*sl zWRj;WBEp;yyUark1+TBYC_D^B&vE12TQd9MKoQYLg#b9PL|nU6X5BCivR_|kXZEL4 zzYsb0jMF$UGcdiD;`^$`L96_LtIXD8;6Uu_9^t056rFlR#=}<Uc2pjtI8UzK!ljUk z!-dLK64X3vQDXvQ{UQaGz$mpVEGtjD(%|UeL2P7>v5#ET+>FDl=Za1ummG@kl31*? zjObj{aHo-3+twTP!|Ocim#$deIrX$6`A)$URs_=3JwZ7cQ+i6}U3n>U<>^CHONbs= zV}SBX<|oMXtO0wUPIo_<JcM-%Isw3z`>bgP&|jzCypBh?_uJH?g!=a`|F@|pY7B6) zb@*-am8(iSrZFP5AE-0lU=u-uN#Mzta!Yz169LAt_|Vg!5fL}pe^geEj<}H5<H>U} zYPl>u-_7_aIb18DkK39rw^pFj--aCv7Ffoqj|4wH9P@0S$$BKzi8lIx#JM`x63FVB z(cRYSbQ{Gr!n)2mA6H^FdVm+)NG+AW%#Jx8|7h+t5xcOaPl}>F|Ml@<okC@h;&DIz z>mt|feIWSdg_iTx-llpMBR121p?Y*&a!vq;{_XIx;8v7L#+frb?7c?Vu@!rh=68OS z4?CnEvCKm-Be}j(>xU@_WP_2a=bXVVe^qdHPZIH@eO_bVcOD+E-zQds1IB=0q6Q(| zVHBZ;*<OUihau}fVSjD5v3_Zm8e)^Yu#!Dve}&ava6UgPUz&?^Ru=>?MPD@V{75L^ zcxcT+UteWC{Hy^t*w{uQmM<I;<fkFQhUk^&M5xPa)`*7|yFLwuSo*W2JdS!Pz}YH^ zB{k~TgBWF(3T>E}eJ{8nA*NFMIf<Ww7`nA7Tv`dY<h*<OlliU(TU@SimwWMtAfb@t zD=K8xnJ`mcVt-;_$aa#w*E*SA+Qy+!WZQ=>o`C+L?iur_JMn59;8Y|rq@oW(v=>Ib zQLJGsCBb3fEGd~)^52Q#(sFr#e8JoTVyq1bF7Z1jy7{+fN?RG>RkB#OdG^@c*EH4& zt$3v4nA~xe#&Ug?uhyGwOepRtlov$T^7ROb?<6nu&sJ%cd}u75R||D(tEZQiT9U2% z;@yH4w~iJlifqCx8Rk#Ew}g`1Yf|8@3t%UjjrVDK@JdG?+`9~=1R*-DxpI_vU@y#c zw_t8--ecgSKH;z24G(y_`usxt>#U6#87K{T+bk<S00CkAdBZd`Ha0OeaJF*#*STa& z!`gO*9qDCVPv}r&3RwEo3A3ua0cIdN3CP)M(FTMS6Gn`CB#25WuXypSas!Wy$K@jz zJR{sOWD)~n%z&r+S^RjBEcFsevX1#2{P;#AC<OI%wSpuE<;nI*<EHXMp(BxV9X3=Z zW+sAu7cAiV0^TTNiM`RTE+`VkrAPS?0wvQQ3kP`EArb>DXP0`MMCYuIod4qEK|m}C zo(R%a_YuUVR~k|FAejbiA@GeTbQ)xi!W8lqw<$eoF9PQ_`3IPs`_uc5h94UfC$oo@ zVg}Ho#Po{w*WAVpvzEd-hr)fhV*waPeYptv3nQ?33tY+CUm_uig4bSv9^`smu!0Dd zttU>u04sRY)kAmRDrv+Zwp(N%xEn(|oS`sJ^*3t_cI-|r075o#+O8|qJM1CEwKLTC zOus!`iBBouNWd+XDZL0?nX7gjf~d#X!N=fYW{f5B&L2ZW{csI%6^!u536e^SAK|tt zPAE`B`sD8gMnilCIo9h60~NysxJUR{<F%EVDMeYBN{FgaK(00CTKN%<Z!{mZ4VA4Y z9k$R@&!f&c><eSaXV1gQ)O&8e0%}QkxwdIBuYn}{r8r{6f&wyHtLJ5HM&lKc?75T) zg;)FZCtnbtpO&h|WE6$Hkj_y1$AY^lyDMB)Rt)FTAIg8}3`4St_kd=#YDDy7dF?!k z#(Xmby;Qx$?-+wpoQlV=E03LE0e$eqHGYXb@<NBf4&PCI`T4xzEMIi1Q$HSd@W^Vw z5(~R)Q;qZ_l#A<SsSsX)+gCwS9@4)SK=q?==ku%X<mxj)6(Fagdf4D(<_y)aXJO5c zhQ9HE+_iU)6<<+n3x?^zhK$~s%Ai7HThTaTHK9ta03N`%l@IYNNSEJ1^ZQKxbgM$b z9cL4;6{+b{wFjJI#Yfq1KTzFx)f}{C8P<lr^B#R$l^fTw<ibcvtGgrLQljv#tDmaT z>6x?OAE%_fGNKZ{D#9+$)yJ!%*iO;>Tw|^YLJkp`@?1uOVXy{-MXnE7F3q8Fh6ph_ z_h3Uf)wP=4ovav7q(MN2F+8T|FB`HZcdM0qm=kLrd(~cpQT*AX*7Y)j{W4=~ZzaX3 zRjIZ$zLrJ2)HFu!n6WuC;^^h8ndCNm$|IdBf!zooh`H2<adE|6Zv>VH`Mb~SED+zy zUK&bE3(e$}kXw18e$aEED(D?0CkeA57BYi;G}XQ!5;s7VO*0hE!H+UapJ|g6Tcuw} zLS(=H1bqi%vE|3wseF5_GFpt^;tv|kQ_#`xba3RI8j4;Ni<{fJus^;9sc&G(vp_ov zeROh}L{BuSox&sjfNANiRl>8au#XstYe<>{ug2wKt&rp%Nk>&6Bbm}90sHxUjw7e0 zyL~uE-1>1Or1(omqWL<x<yY-rVh8Sd_lgX&-x~!LMf`7eaPfnZa3aG+Yht7p0C7$G z9x$+s530M>DJw+=DKSD1YRfT6H!%ARxF^<z0v@MA<oohjJZ+R9(3slGZd(#qa+DwV zKZS}$4z^Aqcs`*zRDoGHEaCG&#^p|(z~){CQqz;ld~g#!Bs!8)P~xI%r5b^jS<!eR zrhZL0d8|eJ#GMn34z21D{Qz1NGvRnyZ#SjaJaD3O%(I0o%%;61udqv(j43!AK{!z_ zbQHdZL7OxdLbTl99dLjTUREmX43c3z09(W`4+8sz4;Y`QFY@QKe)*{-T-5==R8fz2 zh28|>azUCpMmteJvUv{W%|&3%X&^iyGT?S@%LLqlDr8nGhsLA-!W!kUM?VA{1=i_d zWXaDypvHA^Szi${0uaLW4cRoQyO&lBUrA-Z)dc8q7OrJC$Gq-F_RA*}w*4qAfok2A z13!yHs>v3HZwJ1%KOz6Rb=!~Psm{Ow0gW)fJL?)+*&10I0}RX@46J`UZnWV59Jj^p z9-m+$P6}N(SdwQ#!b4RedrV=o^m$TdXH~Q<cB4fbzmZ|3>vf#hgGmTOx+qD{=@Yd* zI(L+^6?K#)$?XMG#YkTkEEms}qLIr0><xTNAYQhW8-Gc^_WTI0OJ?~1Taq{nIXUc& zTkx8r1TAy{Q&CBi<TTW-Vs;a(8A$Q1_y-GH1eE%t>-A;P*^en_7%vHL?p<=`?4$bS zqG-B~N2?#)vu11))n(r4U$SEmND7B|ZRz2Usv%1<`I1u0mXiz#4A`HY36m;7+%{Q! zoq^AgZylKRWq;IYHvnxGap{2=x2f4WAKm`qKS9$_w2wU9F_vW7%}iXeXKjU4h!kxQ zRp^DcXUrHVoX#Kr{F8rinr48g;@A$NzvRw;&7{gWA`L3m-?OU^T$g0O`%7s_-RY!W zflOT3#}xUe;H|I4cbEH8_F1P!QI!Xc{+-7b1oYHVaNSPcOzF{0J%u_|R45IvDyJN& zSoq0G6ALtQwf8AMAYq_ZqBUlA?hsy%E)m_-n$)J@KfoXR!%A21>TJzPJ$Nw(_34(w z;U2k9S!|AUZf!T2!tGoT&Cxb<siZBbh#Z0qB|D(RboRR$d^k(`Mq-UX53Fs)CandE z8^QyK)E@#;)2V;;tkf;_ExT!cSS#j8dua5WE}82fqdNVO*Z4h0kgRZ8s=g*+S!8J{ zX2@fLFS_RRhnl<us^0FjS9>D9yt%n>e#u>t)z(1{pB-%C1Vkom$6VPRPm|6#R%6yv z&z3=oaJqEQ{Z*&I%mvwNoF)}~g<*~$32v|p{neQHDYp`n$t2%GU9E0hzgwCawr$en zcDssaOHLd~M#wnE$>ekFWN^7(CBje1K-=%*1w1AUqeFR&3A5c$ELeq5yA@$m%Vyp8 z%<Km0=Pf(y>+O*Sz6lOoA*)n#`2J$$GiS~o<)3P&EM3x~c6hO?l6m*fVJFKLJO(o6 zC0iCOot6g%%GU>^inJ{o<mHZTcWg@6EgFsoHr7u}S5uPp3k3US*7?WpTtKKceqdGb zq^(D#W_{sPemVZ=Mla&Ir)f0dh%+ihb>y#26vCtc2a^QsoGxy`Pk}{XVknran%sft zkH_=Xkp0Cocb`tInIm{?=MHDbv?VPv76)2%>DNkl*plOZV3#s0lvlLc1K-ION44Y) z*5<j8Yc=*^mN>qTK<pH}yAGCbEKAI4C0tVaT5Kgv577a~t|6OnGTRf24{^(cyu`*s z)GG2$aJnv1GqVqw*~Bgl6Bt(u2|Cd&l7m}N7T*2^SjV~5PWorH-IspMxUC?WFhz<3 zl&f2ahXALJ@>rXU<WwJ=b4bbwr(1sBr`7CHhT@p6AvUN2Yu4p(7rZ4Ce;1~+!9h|- z!_~Mcyr!xlCM*=gWx@M&!Zr2$5u4Ai!~~8eWeT>NdK6~5ek2S_7n@O2Ebett0(p<V zo8DEgmcySyrWbTk%SxYJY7;o(m0vSmTo+KvgUPF4O8P2YJH){!A}-b+t@1_3ec9vB z^SFE<*Y&2hj#@W059nBpT6miVlsg)LAs$mZlNO^=-A1GvG(oA*SKG4#mSwD)6X`;& z>zwJJFb-A&ixE#vw-3l>fiG36U{xo3=s9aYFI1m}ls@~u96ku-u?j4|Oo&n<EiH9P zG+u|o<2QUkT1up!&7`29DCgci#N{6i=e~x|60;rw5X<x>#_9`XktS#2qa`1+()K!7 zbAndmh9D!5#>Ytt7<Ydl%CFRpQ(3@asC&rEJwnrJH#>~ad4;^!Fc`5i=@JQ;em3Cm zTSB?11!4k&4pJY)6{;+_;)rr$BE6Z_5K+KMw;cOUSIklnGdeU7F%w<4;ugu7?$PXy zF>Z-3eglQ=kgxKk%P1C61^Q;4sH)dvD^n$q!jwO0<xtM91Jh!VmvNX5%_YS(->Hoz zr+yg4$q?3D6VArIubb<O^4T3$nV!aCGbJThI?F^yqC&aMsGavNHqFg7-E}@nHf90T zqNgCF4iv<`@q9u}@^HdcCbe8J;^Q1l<agn=K=Jdr>m>&$`>&B$@r_Lvd2B58<bum) zme&5$ZD8F`B^(Y8(ioUsu*IMz__ND!32hlTq8At{e2_NyL0f`skx3p5_8jUu@NTkb zPkv{sJW#l5<t5)EsmHv)Jr4-W>O6;I_m#LI#&l0L#vncc3$kiJKUYU3|BUp)g<^52 znQW8eH~)yuzIUDBN9Hcn2GWh;zjOT)<%VZoP*^=_v|n74YgdKC*JEmzB8g6dQwnv6 z%bK@vx^rd;-1x*8SO;Q6ys!eDC9COEjoC^y%Is}szAacJxCR<JHPCz{Aw`wuY@`hc z%ND!NtvPe|<yUwui?80YvV0C>BY3|q>0G#$xJmE!g3a=#z(z<5b^~@O36s!Hl1~}E z$w7ljZef|Tkc~WfU_XRjj?0K=a;dUk52V8Pt*~t{Ioj_}6~6}X*Y+VCwDh5)qA$Ao zrcf34i>CYQ(3ezwdnS8&sCZJ{&s0vfo{FfgrV82Nd%mZ@u8Pc4d~iV^zyYKi$FRCs zVqEqJnSUg+?Qi**d|q;QOAwRzm3b-EmdThDQE7t+La|4;L)!2|!J(xLllXFPPaP6k zot7Blp+5Lk0k?j%a=8_3A;Vn1FZNIqobawhWXyI{%l@;erfKcaMH`4Uh3<w_zN9Oz zyZ;Z=P<NOs{^7(gLf);m3L9Q9d8#(w=KQu?HW2I`h`qpg)mIT>zUlizE)g+8Xra>? zWoz{A1%1Vw9h`~+wUYRvnb<EF>JKx4M@Twf3%bUCF%E}{oq(M0_(MZIQuGsMl%iR) zJtg=GYTR7=Hok-+NTqmhpD_xge%~?S(P#x&AnRF@5GZNb<3%r+;)v38B3qzJ|AM2t z{B`6o)Gy$P!|b#v(MYdB`8#dABua4=>3G`BB^K9E2eQryHRRG*NHCe$;vjY{#*?+4 z0DxbCMl;CLO7oWgEnT3@1lVrlDmEDG6qvcjQLwd(K~%awd(&{=WP(5~E3%?X)hr~W zBwK`We@-YCrQ5b`=}*3L=C~Cd#VxvvO^c+t<|WP3(JwKxl7uGt1qR7gY+>|4@cWgR zD7ESa<IY4Wqu3-{;1Q~{WfMs{b`uAteKD9SFZKDBn;k(1RavhY8PL}n$dy49#Y+BO zLsl9um1rp^Er|Ml@H3uH-Qo8J++EA6vk8hsqfZoogo}2W1h0~6cPr2)1db-eg3L<i zWg5O)t713RjF5tLAF^gHzkU=mUfUN904w%@o%8gs#3o=JatCdq1|x!o+P!isD2&1} zqS}BH3pSVjd0QuD&rt1s;l$o!i;YN^?xJGKa;k+1R5xbcgS#0}(R&esw3$RJcJ!Mg zoO<@g?M-eMl^a(L80&rU&5Xm-3=5OS9OpKbaDlX7@p7z4D^L8{*S4t=-!fJlyr=F` zmjms)?k8+nD(<D2%79ZZ*i^H+lq$SLcuyKyo#{FLc%YKn#>JD#0d9X?=#xe(^Wxll znY;PUFYJo`OW()5kAkoajjAp_y>$yVW;Bv+ZaO3YZB4|eK8?)9;^0SpN_gSA^RIS0 zOa4$Kg9X}Gx?fQVtMyhm;FtR`0%b!J)fBZC8Bq>&+Ol5K`Jw6=H?YJ2HtnUDTNN;i zH9Jr;w7qSn3x{=mNd^*<3x4(KL%VBRW*e{3FzdGH@1A?wI@X1|f|3k;*HYg$A^0_c znwUbbb~3qvV|!uHAJoy^Dz5@KHn#VS(W>lg+i~0*zMN_XgZG`w+L=dF7>(OzX79)o zesX2RtZQyVK0k0%j4T*%N*9i6d{x`v9`G$$nlNcj174&uo`dlTb_tg|r09lci*gOY zsd*@FKd3?#G}_1$A0!u%;bTC1sW)UuFYhiKAJ#*XT(FKD6g$mdqn?G2hj}`tghx9r z#B|p8uSJIE<Le2bQz<i-inbFaAeZPBf_O>Ouu=_f!$YSJwyN2P4vVLS$AB#LOlG7C z$^P}o6{7AZ&l~0|gmuuy>CBjS!J4<4rDW7PkraBxX?N*xX(L(4nZxu6a@u>YmJ?BL zd2YIGs1=K7XAPlKnYFl2wHol<&2TcmRsQ(Cc98i+4~dkyBXex?BiqHRF9IiLV|?Le z(<)8ve$7|<s#H<HgCFkd4@39x@Q3g4>g67q;PbrsAc5$n45YT#D7r>t1@c0CH%@Y= zfwn?62<5lcu(VK#%HdHzmv6&4_J0DHK9zY}pmKu5aIAj{9F2#b@Bu0pI1q&6Q^@}b zijft!y7M%ge1NIPVw=Q#{=~M=Ro`g3PHnO-xIgB~GI4Ah>wdtv@1B~4f7%Z_^;G&w z)ExF48vhdd`Yxh_xW7F~`WDTxdUL=2#ffEPYhwy9Q#Ns8{Oum({Z(GNM-Zv+{26rw zUo`EeFg9Pp0Tt)-of5AVM_g62Z}*AVNuz5+7qK-7t!8(t-umc>@v&{*5=OTA_`X-Y z3>PSkZmCt)HItL;y_YU+&GeGoEqst+mqx>quOFP1XE%N#fK-~U)fXMYVV#o2!bBj6 z;tHG_AFyr79!|a2_en%M4~Lh*<y=!KOS)59MTC$bGks3V48p7{1dE;DU8voU6-5VT z_(KUY_1Z!%1z?9&)LzszJx2^BVZ79cqc6Iku_IKs+IBSzxsZJK5|$()ObOHf>eg{E zF3zx~_#;x85_3B=uMSAPU^D1u2)6iKw<c;#*mkF3JIk-~NfM!xTgF}?AxpUsh?5($ znY2046I=WXy$#wF^q@QPpS7F<f4yQF2_Uz-y?F&Q-Wv9wy@S6GtfY;p?QdhNJ64U* z%?JlJ*`{aUUPOf>@)d@unh;D+0lcWj9GA+Onm>!yuh+x1*=#^vOFys10X_85N01Qu zXBRV18MZ4VuD6-ICh>&pbZzemkDngMLdl_t)b3<i`cd~4>(&f{Hz-oHkh>);UBcuB zr4j&6^STWX_EUNNuX-aiU29z4Cc-W#5D>wi^}bz&?aTp223C?bP9_ef21fr10!78? z+6FLU2A@Bp<u9FnJa_TO6tE*vCK}gGi*7fp^{HyWY&aRHJhTgoJ&D*ooq2l&a?o=+ zMrX4o7zTwr13L(kepUDqtzdI^k7#~!-zpwl3o6S98w^}O0R6x>aA{~3#r1iT`v8YZ zmXf*Tv)D_g;|@FFuq?(0Ba;p_uiWYMK*l`{l18f9uV9N1ciCm~un#>_KRgO>=Umhx zmC57oG1EY=&ey|gGFNA&IZR7du{N=KAgCqp)oRa7V3&KpE=vr;%7UBXsmCPnDuEb( ziR@j>Zb1%+N&n`nk1b<Y_n{tGUL!OBI|A!D0A&urTF9RIM7Jebqf6$BmXdHtn!|C3 z32kKpF7}nWEO<Xe0aEm5bHcN-3te|kX7R2dJSn;Qq-a7l8_m=Q2?dS*!j5b>t+Xi^ zRv3pAlGkrA-eVDZ8Kn*DtcU0x&<DQc7T1m;rRMmwt}`aAp6#>cGlwR&`C%DfXTs|> z#*5r+R(yZGi$(_Db6nuOnJn|I;r`iV*0#nbRv!UIPHzE70|)otCYfxktZg78T*#Zf z6wd(LK|m#bQamcl2Ge!r2UN~q(Gy}|4jWz`6|-mP8}x>JKCLX>6;%u-o&Tz_c7U-I z3b(CtHgO#N@nSTf)J&(gG$QwO4kDF~c&7zli9T_6=(wz2khjY`;;nwi#RuPG(&HXO zp||2}9XjK>lJUsaz*ZT!dH>;s931nJt6xPTW!g|w;?Cz7QZH`H1#74_d)I?bR}L{Y z8)lxV9J~t3OTR=7`kFifP2&sUM-<~;URAnGjA0c4!f}as2-Y}eOmt1os#!^6B&yT0 zOCvSd-FDd@FoO?#V><j@=$ET-?Xc+2hBrk7rhfLgKzuA9;E{%aC1B@nrGnP^b;7~q zs~<M}8{GWqF$4@g?>58?{L&}Qx54yzYgB(8R68qYGk}dF!^b!8kd3XQ6TnE>+0M?v z#L@BJk*V71%E2*3N@+Uk@zIG|Rpwb11tp0w>2dj?QRzliYC6f8dWD+Cof`Wg8JUR@ z2Kpfx1bRA3N+~+}afX^5C50+zg$wCX*?QIPLct+=feA4IpkiHu7N2*qGS<wAGmST0 zo^OrvpY+MtngNW2Yz(a2Jxm-F{w4ai3Gja_?{Y|fLdIoOdbFfWiVkLwN_Jwj_Aly) zD~*$~%<>3;X3Jt!Io_!Q`)moP@TSV>tr7l{IyqY>6UYA#RU-_NbO?V}BaEzGGcr*- zg$P7FFRlpxPECwmZLa*A3jMeCmp$!2wp5l85&3@?1AS-j@=sczXqNU4mJT6-5{^hp z!QW}2)})#F^rj>Btuef{-(#Hr(V}i*sBH9>(Bh~kX6tP8mgMrbc>h1N$;-mXjWbBl zMZ1nLj7dw<0#hUYeb~CoW&UT1naA_<*S?d=rE*)@_O_=8yoF;?-lS@a*uHK3Hcomf z?r-vRf16Ex3EGx8Oi016!?_FFa}9_EsFfnsC{RJORaD-z$^aL24GvOk<og9zV~Ul! z{@Ezqr{bxUYdqc9LW~$OjC;&nhXzyIkq9*N;J9HIwnqn7wx695$(>S@<A!7Nn40!X zY3t>D{Q;@gWtv%EUkBY$`LM$ZuFV03&Rv4J28Z7vs{;^zwtVxL2(E>;PR&2*GMxc$ zU_4YAZM?P8WihE)Ux`LbicwjI7&U4y0&QK85+o+-XuOKSj4OgN5p0|4{q*x81grzt zoE=|=aO0&bSd})9IZ(|-6}!Zh_d1zYV1^x%>{7KP7?$(W-&92DA>I?3Xf1#U!-mm6 z2#gmtDX-#*;;!<xwU-_-J2mum2=D&t0?25@GVU{lRAarWZXf{ig?1}1pBwLVx#0}R zFcA;_6yzb3^;haIVOWs+IM;gd9a-(u11t(fhWJ4Uq<Qh4R(x)g@Q=7!oo5;NL)s?0 zu;3ZaOjJ{F>yV$Pf?0aM+h-tW(H`C+!i~sY!cp1icDu2AII?7A!M~t&a0IL;J)921 z-w>JJqXYvE58?y+x!MdK16x%x;M}QH9k$LV%g?YzI9^{*DE|832l44zSADZ~4;T;- z?3=aq989bn8R&oeSrD%$-_3~H*C93II&aO?k4es8-W?dO_ym-6R>P+KnokF^u`Wka zRgT#^aCee<J<=pyRGVQn1gS+)M{S;%AD_M5jQWlG@bL=ZARd05EoENc9dI_K$n2Ti zZV1ai`dtfCJRsZwyu6L${xjF7Jg_A5Kx#@$YqAHsIy9C}oZ{F$fXB#53FN8gS5eJL zleRB3;JF3H&<(<R3gP%t7oATriI}S3-nJLMKvq_=nqU@l7VD$nD(JgkMxdJj!4`{2 zIzA(kPy&JIen;gEQPSTNPZ%?bG`TyE_WJz3t63_x<>(dHM<d<dl*ZaXNIds)#)%p^ zYaF{dX51mO)_ux;1V0?Ub$&r{gbKTo)HUS6Xl(&&iK%0M*q&(PbG_DeCm9!Vf}5Zp zrkze-{j{n}aHOG~7~|r8<Q7fd;kR#ppy+%)$fmKQM{BWmS-rk;eF6Q~(Ko5Ldn|h! zb{TjeAoRD<|2@IY$=uo6(8d5@MQ>+gww83DjIxa07f2{86cJ2=M@20a8|?=SE+S3^ z0+SOMJn0G5hM6mvAA~N5L<IvyNeqUB3au;nQOgi&PC`<cA_(JPJgw<^{~7$ghyQpa zh0Dye@>=_m&?Y6&{riN&+mR2SM8sRVaQg+7g2%DEp_IxPCMhe&n-HiI`)84caTbmw z5YPaY*e{QH18^FanAY+}#}+Ef)K8hq`TQMHhxUmx;^gDUcc00Y-H&gfRF+$%V#iX; zu+7sw7D3wRS^;XeGVs{BpXyEGiX2?~9vZv~FWW5YVatEG79+;ko7CuGu(BH}Z>0&> zcr8n6{`BLrLUDL|kGTHSy$7781J`#5#@(glR^WbD$kxQ<q@)tf9X{^el+imnA~=|T z)p=t05Pu2X_e2<)Ec$6BEI$0GRGjuAdIZCm&Jb_A`ZBoCWRHvGmfplc)?$_6<~pyz zf?+Mx9?0+T%E7lnXj$~M+UKRCH=n#8K4@_|^a#OdMUsWCv>wN0r?5KZUO+TZ24T4# zzWYwarF@tsb;08EjEYoRYi)S07FwJ@g*Z|LG?36<Gyj2S{&6PEJ!2wWyXcvGl+ui= zvinYRY`yHmm~5_0h;^xQG?StjA>1Wb4#SEC?c<d_WtSHmoYay$&*;cmd%n+XO$4Q8 z*64_Q@%<rM2bA`9Db<0(0^{nk&G|TFcnk{de$6?b4?LEJJldRIkEsj^*pi#uzLMzP zQbiCorLlABpu^tY79)0bx3F-uMHGLoqD}s&e*(QafXU5N`<73Nf=}6O(xVrJp_Ao- zkU|?&0dYlY;S$uTumgZWK)^D{w9hbW90ll@I5+g%@8M!BnhXBw58Tjhg=$4`L`aH+ zoC;i&Le<qEuSZU!S?}sh*g{QyjDmFrnUZ}zua^M-K?P?Rbn#fP^RVMEBh>r$aV7sS ztIW#Ve0tqy;s}+~e2<<ld`&eyXK=pSNpPb;anQIbu0TeJHzITdK8h)%7_(F;o}p;z z!LFsW9Mn0a>*vqS!*Vk*vR(V47XIh$FFtkt^jD!0KdBNbXp~2o-<%wV1h5%iPx6X> z^kCOYe3-W40JbW@g)q@;IWg3RZxOWQklIO54U^EBM0r6iBTgk-o}vc!0$<&D&w_2? zMLSk=ofdu#*J)1ja8lOht>A%kf`VSg>CLuA`Zk4+$lr2PFS0|Bl<}a<-{4lHT0hS^ zhC%E_i|pbh>uO=vo=)bAou?uloH`y9ky{cM&OiF08-z|o9x`Np=H{Kryy}W<tCK0_ z<-&;d>(Zd=OGCF0{-z{lqpYrWBgEs8&Qa`uUTd_G_4C)TsB*!M&}W*iAaAB;>`+<* zCe6iZx;(c5ynYw?FZ=M^k~$Ta{&S2@h328Bm`IueQl*P)I2?v$6riin9|nc>QNJN! z{(NdDcfMaD9^vLuOc&w`4UXzrO4J2uR{n{z0c&FoyS&gh<(PnC=CKWY>Rc?rz(rsN zgmgOvop!xHm$!bpO>2=!Owf#2fR-W>+AjW6aD;crm0R7r$^cyEI=JK;IVblSE)OWQ zUi^c`qZGbYB|&Iu%@PyK$oI%K7W=O-1(w-0yB{7X%fW_Rm7|LM9JfqF%Df0N)axM8 z(jmk^7EDR>!xrwcklP}R&pf3$I%kQLJd7B|Skdisgc{d_X&yNTo}x`;&8<za+YRz? zo&_^<t=uH78Mu01HMqAzw^oJQNhz)s8`_AAvl6N;d)f~*Ix7hL7t^)KCoz-?<%&XZ z+Frj6;n$B3x3Z4YodP0DBK011IQ6jwHw5<6GF=9IwKZV<5qWbYf)(qe2RG!)7oqE| zc0wbi8jH$(FxB-JTWiD`Fc@n?^#;;TH*D8Pb`vlQMw7n&3ard0REn|^#U8blmMPwu zh^rkT>DmlGXHL{PB!PN{;j9nkQT>69L}u^jG~I^EEOLf6*OV5N+*0z9`%4^1MuYZ# zmXR-X<)eUxGHJ<-l1u@j$6i`MD#I7h?VW<kDTmO<@3(x;lluWv(i6ve0?V3Uz-fAU zr}>L9QYJyIM$e0YvGR)C8kq8u+cqe*Uw#8|L_<gmnL!`Q75ouN*MT<XdrKgqms4js z_J&;ihnomJ${aBo<Dos(zm$>g@ZfR(sKn4NTU^L}~zsmeNBwe=Lm$oD>)dd?v+ zX^AbX$azI;@2a{fI=W9Ksn3N+oJs4Nd8k2)EMO$DSM_j^Rt7XKd(}Pfq*EL{_u2Mt zBNuk86QlbM#^%w&d3EcsT$8V<SU?K_MAN}?4TohkI74AjQi|H?Dz|R&P=Ss0Ja$i* z4mQ8yaAvJ6aBS4^<57BB*VY8dxJ2~dRE`6=c;u(3wD?|O7CJqCiCZDGrj#Z6l@Ve? zEBC9`4a^J|Xf3Xtr}hr>7fJv8)Tpy?_;o)wFHm}F`<-^`l##s$n|bcljf68>qW?i@ z0YNceyw--qnQDWs$q5Pe2Dd`H%)VvLwO1Yp2Z$*^bQ>}iKBu#@`%u`U08MgLi|+>% z%%zGkpnYUc%S<;3gm1u~^}DinHQl$4p0Qy0X(kaZzk>N$8i=KbJ7~Bw{*6Z%h9Y!@ zU0xl-{J0=rf7E48`Z)!OPl;BS&NZ)@d$7i<2|UzuKskAxK4oS2cMY{0=R|0`KOH!# z<Ki-ESTG_Q$zGfmZs#|q>xfDN>G`aP22c3Z1MXLjo7{$?xK6Q?oQrG+#;3P8+Q(M& zrH!eAKiB5czD`b=kg^YY<(2C7pMMSj#Qlg3Ra>8-?boob?C)IVkl|qqjVr5kFKio> zvth*`k!DaM_3Bu9I-7NW)^wh0-VXUJk&F)Jk>U>zIa&}gf)|?sM!*-Fp3bhT>xy;L zCqPu`LxpoHpwR$SWPJsPHvIHSH@nehLE2cC7V2yLfP;+pn$}Vd9rcX3On@4>jn_9v zX;L21tARdR+4kCC%l)9rV&<LRrv)s2G*x1K#eBOj#n7fV2fy-|%GM!iLVeEoa(R4X z6UZ@<Zyc@Q3Q#)P`Fmy(Az)PfI-Oq-200AWlczpg7F;&#ux6vg?WtUsUqXu@<B^!) zT#Ts$JwH7`8az&tlBe$&%OtuKVc6z=sl@vXWdnFpAOMGy5SdnlD~vaqrIG>}34#%7 ziz-l969@AHikxtzM!b}TgueP-53XB4tNl5kVV@Na;an&1BIN~np<+*3i{!_L5_WU^ zbYOspf%v)*cQk-^!ajH$I~bs|$9cCP0=a}kBw~1r+bXXl9|DFVj<0`xg`{{r3gl*< zcKP)X<PeumkDOJQBb~)%jj&dJU7Wxvf!%uu6rT9W@`U%mVF)-Zr+9{GOD~AZg`6Cv zwf1y|asJi^<h-`1!T)jMycdg*X0ui&T|C*GqNbKc{|0{?U>6k=C<3)0B@8VOt!Hb! z*DT<KYh4>zQ-dwGWKz6eqvcNARz1c;Mah9xazB&!1(MSjIP9z9WY>C4?9xcGn0k=H zaO}1zM=?AnRB-+;_KUuG_q`MNkWaG`UAIXuvKg<xuCfd@Yx0k!SMRUBpKZf_WGowL zo*;?V`CeXbB=MHesmO~^F?aP?!gKQBv5;)z<_oV$PZOM%e^ZZGpIaQ8fLC>qr#k?W zm5XZ#3u9(+(cCI$Kar8;n)s$MXnDR`i^0b&kOl<jkkUZ`|Cx-@nVas2#pOsYTi7nA zFiIA9u)`<FSeel4&e775pWfDrUbd_h-LUa9GyN2skEcR7J8dhiVKkgmhtyq<CCjX4 z2QW=iYl2Z^$it?OT`o)!@1?e?U7|(-tD~AuDgPjc9H^IZ@(Q1HXQ_nr8nUbvr}C;x zL(ty$B-l%BQm0_?7%t-w;9Tcn@iMu)CV_?R997ASW1pR3J|5&x{;dcdPu$}2n&Xb$ zCHmFbQ-xyyxp-Mxe|6GobDwiw0^e3_x;@{*B;O<?L``Nx`<;-GI?K`X51oUZIvxAX zj;p@!?$X2cl=#+fw<}BtARyAW^ZoDF{(oPy-sc<r>)O>8uPEKah#LGVHPkXzm`i*d zVub*q9Fq1xsp+r~QXn}fJNNT=%&E%765Qmb`aXU2+CFZ5eUn6e3WqaZj3OV$RRSy( zhsZfK_Mq?KB;?~^3c3syJoFOKSM$kpK7T|0^e!2#&%!8C&_k__jq$`2gl3pHu-ue1 zI}ZCjMbafEUSmqx2N~mN&U^Uz%Pgs3L7z#b>xCG8wpPsp=h~BMF(w7bhpCEEvrTiW z<2nR78f}G9R~eu8mox2?7g1gdOSbtif~a&JeNwAFlpp@gl^BTVNL&ZuWT7;4&Z?Xy zZ&!PcGLX(zn8-vB1!>hy6HaF|R@7sFGWW?6hx!IRI3UNqYJgh(6|T;tiBrF%_o?5W zA)le+#o{@iwxyUm6+>g({h{*G*(#z6wZU*^j?GiMeYk+xt8ERri!A_+CVqhLOeswF zR8ORppYR)eX&wwjn&kNGN60I*odPqLvJ4wzwkF^hHFS?x*uP%KGMmmL>)y<S_hvG( zznklCzWaaK%Os}DqUX)Gs@HeePKlTI`9o1-SB2#xP`@HxoCbU1Lb<J8hEz}Vui$q1 zSGx!4(k7*Z<fZP4<1VB}UQq<}@uG<&SH@{vd7CjAbQ@BAgq;i7QcDjKM_NPFZbJi` zaxcP&EGn)a4n*@~WDC2g(QNwmKKA|>_2>5*Sy)vjsg*+k6JFt460#lKP1wbJW*IeX z9caJI)Ha^dj)^lSpvele*sgNt*H-2u5OFs-Hw)+7-tysq-y%N$z0m5d??7*3@ISBL zZ>4{)@_7$>Un2Ay;oqQ`w_m@5{;6Q-J?ee6&7V+j+W#x+FSR%CneVGy{$N_Z-GYB# zo$qU2-ecZZEc}7lf6EB}8|IJth4-NMN#uWk(%-yqzk~joQvM$DKArIoh&sZbA@7nK z-(%j#0{_4myw%?QuI2Yd@UO_=d&v8^*B_APw;09WA^(Yjz304-NBzOEc&j}7o%7Gp zsrRt=k&-`PcyE5;-(mj{H+fHbA0GIF<Usf*(tn(~|1DVX9{b*_{|6SC=pV5E#mE1i z`raG=2es;-sPBC9?`iM7>3`7piT^?4Uw!NEVej4Hf53+S3HHA`$KS)>JFx$NJCppQ zJNrH0y-)NHfYIAi;ZGjY_g{SP&in0)|9)+~)eHW<W&Opu_nz_o$ne|u|Gk5Dy`?Mv yK3V^l1H^mc`={C;L_5~M5r1Fa|5=&;dd4Y8gTI|%fPm26-i&X5nX&!$-~Rz|?K?^U diff --git a/algos/cfs-template/algo_cfstemplate1_inBus_def.m b/algos/cfs-template/algo_cfstemplate1_inBus_def.m deleted file mode 100644 index 9cf6ec1..0000000 --- a/algos/cfs-template/algo_cfstemplate1_inBus_def.m +++ /dev/null @@ -1,33 +0,0 @@ -% Bus object: SCDalgo_template_inBus -clear elems; -elems(1) = Simulink.BusElement; -elems(1).Name = 'signal1'; -elems(1).Dimensions = 1; -elems(1).DimensionsMode = 'Fixed'; -elems(1).DataType = 'single'; -elems(1).SampleTime = -1; -elems(1).Complexity = 'real'; -elems(1).Min = []; -elems(1).Max = []; -elems(1).DocUnits = ''; -elems(1).Description = ''; - -elems(2) = Simulink.BusElement; -elems(2).Name = 'signal2'; -elems(2).Dimensions = 1; -elems(2).DimensionsMode = 'Fixed'; -elems(2).DataType = 'single'; -elems(2).SampleTime = -1; -elems(2).Complexity = 'real'; -elems(2).Min = []; -elems(2).Max = []; -elems(2).DocUnits = ''; -elems(2).Description = ''; - -algo_template_inBus = Simulink.Bus; -algo_template_inBus.HeaderFile = ''; -algo_template_inBus.Description = ''; -algo_template_inBus.DataScope = 'Auto'; -algo_template_inBus.Alignment = -1; -algo_template_inBus.Elements = elems; -clear elems; diff --git a/algos/cfs-template/algo_cfstemplate1_loadfp.m b/algos/cfs-template/algo_cfstemplate1_loadfp.m deleted file mode 100644 index 2fd64eb..0000000 --- a/algos/cfs-template/algo_cfstemplate1_loadfp.m +++ /dev/null @@ -1,6 +0,0 @@ -function fp = algo_template_loadfp(obj) - -%% Load other fixed parameters -fp.timing = obj.gettiming; -fp.refmodel.offset = 1; % a fixed parameter -end \ No newline at end of file diff --git a/algos/cfs-template/algo_cfstemplate1_loadtp.m b/algos/cfs-template/algo_cfstemplate1_loadtp.m deleted file mode 100644 index 1c08d92..0000000 --- a/algos/cfs-template/algo_cfstemplate1_loadtp.m +++ /dev/null @@ -1,11 +0,0 @@ -function TP = algo_template_loadtp() -% Setup tunable control params - -TP.enable = true; -TP.gain = single(2); -TP.refmodel.gain = single(4); % another gain used in referenced model -TP.rowvect = int32([1 2 3]); -TP.colvect = int16([1 2 3]'); -TP.matrix = int8([1 2; 3 4]); - -end diff --git a/algos/cfs-template/algo_cfstemplate1_outBus_def.m b/algos/cfs-template/algo_cfstemplate1_outBus_def.m deleted file mode 100644 index 3acb8cd..0000000 --- a/algos/cfs-template/algo_cfstemplate1_outBus_def.m +++ /dev/null @@ -1,35 +0,0 @@ -% Bus object: SCDalgo_template_outBus -clear elems; -elems(1) = Simulink.BusElement; -elems(1).Name = 'signal1'; -elems(1).Dimensions = 1; -elems(1).DimensionsMode = 'Fixed'; -%elems(1).DataType = 'Bus:SCDBus_single_11_Vector'; -elems(1).DataType = 'single'; -elems(1).SampleTime = -1; -elems(1).Complexity = 'real'; -elems(1).Min = []; -elems(1).Max = []; -elems(1).DocUnits = ''; -elems(1).Description = ''; - -elems(2) = Simulink.BusElement; -elems(2).Name = 'signal2'; -elems(2).Dimensions = 1; -elems(2).DimensionsMode = 'Fixed'; -%elems(2).DataType = 'Bus:SCDBus_int32_Scalar'; -elems(2).DataType = 'single'; -elems(2).SampleTime = -1; -elems(2).Complexity = 'real'; -elems(2).Min = []; -elems(2).Max = []; -elems(2).DocUnits = ''; -elems(2).Description = ''; - -algo_template_outBus = Simulink.Bus; -algo_template_outBus.HeaderFile = ''; -algo_template_outBus.Description = ''; -algo_template_outBus.DataScope = 'Auto'; -algo_template_outBus.Alignment = -1; -algo_template_outBus.Elements = elems; -clear elems; diff --git a/algos/cfs-template/algo_cfstemplate1_signal_buses.m b/algos/cfs-template/algo_cfstemplate1_signal_buses.m deleted file mode 100644 index 82c52b2..0000000 --- a/algos/cfs-template/algo_cfstemplate1_signal_buses.m +++ /dev/null @@ -1,47 +0,0 @@ -function [busNames,Buses] = algo_template_signal_buses() -% [busNames,Buses] = SCDalgo_template_signal_buses() -% Define some buses needed for the template - -%% Define signal buses for various SCDsignal types -% Data examples for which to create buses -D = {... - ones(11,1,'single'),... - ones(3,3,'single'),... - int32(1)}; - -% Create buses for these signals and add them to the list -[Buses,busNames] = deal(cell(numel(D),1)); % init -for ii = 1:numel(D) - mydata = D{ii}; - mysig = SCDsignal(mydata); % create SCDsignal object for this data example - mybus = mysig.createBus; % create Bus for this signal using object method - % Store - Buses{ii} = mybus; - busNames{ii} = mybus.Description; -end - -%% Add output structure: a bus that includes only SCDsignal data types - -% First add 3 busElements for the three signals defined above -for ii=1:3 -elems(ii) = Simulink.BusElement; -elems(ii).Name = sprintf('signal%d',ii); -elems(ii).Dimensions = 1; -elems(ii).DimensionsMode = 'Fixed'; -elems(ii).DataType = sprintf('Bus: %s',busNames{ii}); -end - -% Define output bus with these elements -outBus = Simulink.Bus; -outBus.HeaderFile = ''; -outBus.Description = ''; -outBus.DataScope = 'Auto'; -outBus.Alignment = -1; -outBus.Elements = elems; -clear elems; - -% append to list -busNames{end+1} = 'algo_template_bus1'; -Buses{end+1} = outBus; - -end diff --git a/algos/cfs-template/algo_cfstemplate1_test.m b/algos/cfs-template/algo_cfstemplate1_test.m deleted file mode 100644 index d37df45..0000000 --- a/algos/cfs-template/algo_cfstemplate1_test.m +++ /dev/null @@ -1,7 +0,0 @@ -classdef algo_template_test < SCDalgo_test - - properties - algoobj = algoobj_template(); - end - -end \ No newline at end of file diff --git a/algos/cfs-template/algoobj_cfstemplate1.m b/algos/cfs-template/algoobj_cfstemplate1.m deleted file mode 100644 index 80ce3b8..0000000 --- a/algos/cfs-template/algoobj_cfstemplate1.m +++ /dev/null @@ -1,42 +0,0 @@ -function obj = algoobj_cfstemplate1() - -%% Doublets SPC controller algorithm -obj = SCDclass_algo('algo_cfstemplate1'); - -%% Timing of the algorithm -obj=obj.settiming(-1,1e-3,1.0); - -%% Fixed parameters init functions -obj=obj.addfpinitfcn('algo_cfstemplate1_loadfp','algo_cfstemplate1_fp'); - -%% Tunable parameters structure name -obj=obj.addtunparamstruct('algo_cfstemplate1_tp', @()algo_cfstemplate1_loadtp(), false); - -%% Tunable parameters -parshot=10; -obj=obj.addparameter(SCDclass_mdsparnumeric('kb1','enable' ,'srcsrv','spcpc171.epfl.ch','srctree','martetest','shot',parshot)); -obj=obj.addparameter(SCDclass_mdsparnumeric('ks1','gain' ,'srcsrv','spcpc171.epfl.ch','srctree','martetest','shot',parshot)); -obj=obj.addparameter(SCDclass_mdsparnumeric('kv1','rowvect' ,'srcsrv','spcpc171.epfl.ch','srctree','martetest','shot',parshot)); -obj=obj.addparameter(SCDclass_mdsparnumeric('kv2','colvect' ,'srcsrv','spcpc171.epfl.ch','srctree','martetest','shot',parshot)); -obj=obj.addparameter(SCDclass_mdsparnumeric('km1','matrix' ,'srcsrv','spcpc171.epfl.ch','srctree','martetest','shot',parshot)); - -%% Wavegens -obj=obj.addwavegenbasetruct('algo_cfstemplate1_inbus'); -obj=obj.addwavegen(SCDclass_mdswgsigsingle( 'ai.ch001','signal1' ,'srcsrv','spcpc171.epfl.ch','srctree','martetest','shot',parshot)); -obj=obj.addwavegen(SCDclass_mdswgsigsingle( 'ai.ch002','signal2' ,'srcsrv','spcpc171.epfl.ch','srctree','martetest','shot',parshot)); - - -%% Buses -obj = obj.addbus('algo_template_inBus', 'algo_template_inBus_def' ); -obj = obj.addbus('algo_template_outBus', 'algo_template_outBus_def' ); - % function handle that returns cell arays of buses and busnames to be - % registered -obj = obj.addbus('',@() algo_template_signal_buses()); - -%% Tasks - -%% Print (optional) -obj.printinfo; - -end - diff --git a/algos/template/duplicate_template.m b/algos/template/duplicate_template.m index 7b021c8..cc801ba 100644 --- a/algos/template/duplicate_template.m +++ b/algos/template/duplicate_template.m @@ -45,7 +45,8 @@ fprintf('Changing block diagrams properties ...\n'); list={{'algo_template/realtime' ,'SampleTime'}, ... {'algo_template/signal_in' ,'OutDataTypeStr'}, ... {'algo_template/signal_out' ,'OutDataTypeStr'}, ... - {'algo_template/Gain' ,'Gain'}, ... + {'algo_template/Gain' ,'Gain'}, ... + {'algo_template/Constant' ,'OutDataTypeStr'}, ... }; load_system(['algo_' name]); for i=1:numel(list) @@ -61,10 +62,6 @@ fprintf('Renaming ''template'' to ''%s'' inside .m files ...\n',name); rncmd=sprintf('cd %s; sed -i ''s/template/%s/g'' *.m', algopath, name); system(rncmd); - eval(sprintf('cd %s',startpath)); - - - end -- GitLab