From adcb1ea71ca7d9c5a5555d20ee2675f1ff3eb0ba Mon Sep 17 00:00:00 2001
From: gerald <gerald.moesenlechner@univie.ac.at>
Date: Wed, 15 Jun 2022 11:39:42 +0200
Subject: [PATCH] Update with fix of angle conversions and typo fixes

---
 CHANGELOG                      |  21 ++++++++++++++++++---
 MANUAL                         |   8 +++++---
 Quaternion_Calculator.py       |  14 +++++++-------
 README                         |   6 +++---
 matlab_model/Example_model.slx | Bin 22940 -> 23063 bytes
 matlab_model/HFS_Wrapper.cpp   |   1 +
 matlab_model/HFS_bus.mat       | Bin 2163 -> 2232 bytes
 src/HFS_API.cpp                |  33 ++++++++++++++++++---------------
 src/HFS_API.hpp                |   6 ++++--
 src/HFS_bus.mat                | Bin 2163 -> 2229 bytes
 src/HFS_config.xml             |   2 +-
 src/detector_features.c        |   2 +-
 src/fcu_algorithms.c           |   3 ++-
 src/utilities.c                |   4 ++--
 test/HFSTest.cpp               |  17 ++++++++++-------
 test/example.cpp               |   9 ++++++---
 16 files changed, 78 insertions(+), 48 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index e2bc13f..f9b825a 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,6 @@
-**************************************
-* ARIEL FGS HFS Repository CHANGELOG *
-**************************************
+*****************************************************************
+* ARIEL FGS HFS Repository, ARIEL-UVIE-PL-ML-001 0.2, CHANGELOG *
+*****************************************************************
 
 ################################################################################
 V0.1:
@@ -27,3 +27,18 @@ V0.1:
       which are both centered on the center of the Detector reference frame.
       Future version shall allow for configurable offsets between the frames.
 ################################################################################
+V0.2:
+15.June, 2022   Gerald Mösenlechner   <gerald.moesenlechner@univie.ac.at>
+
+   Fixed Issues:
+
+    - Fixed conversion from Spacecraft reference frame to detector reference
+      frame.
+
+    - Fixed typo in conversion matrix.
+
+    - Fixed typo in quaternion multiplication.
+
+    - Added validation signal to input parameters of hfs_parameter struct.
+      This should prevent wrong or invalid identification when changing targets.
+################################################################################
diff --git a/MANUAL b/MANUAL
index d788ef1..f9da4e6 100644
--- a/MANUAL
+++ b/MANUAL
@@ -1,6 +1,6 @@
-************************
-* ARIEL FGS HFS MANUAL *
-************************
+*****************************************************
+* ARIEL FGS HFS, , ARIEL-UVIE-PL-ML-001 0.2, MANUAL *
+*****************************************************
 
 The FGS HFS is based on the c++ object "FGS" defined in HFS_API.hpp. The
 constructor for this object has following notation:
@@ -42,6 +42,8 @@ from of a hfs_parameters struct update. The struct is defined as follows:
 
   - unsigned int set_invalid: Flag to set the validity of all measuremets to false
 
+  - unsigned int validation_signal: Singal used for target identification [ADU/s]
+
   - unsigned int mode: Operational mode, defined as an interger due to Simulink
                        not supporting chars. The equiviliant modes and numbers
                        are:
diff --git a/Quaternion_Calculator.py b/Quaternion_Calculator.py
index e34d83e..17aaf40 100644
--- a/Quaternion_Calculator.py
+++ b/Quaternion_Calculator.py
@@ -61,7 +61,7 @@ def mult_quaternion(q1, q2):
 
     q_out = np.zeros(4)
 
-    q_out[0] = q1[0]*q2[0] + dot(q1,q2)
+    q_out[0] = q1[0]*q2[0] - dot(q1,q2)
     vec = q1[0]*q2[1:] + q2[0]*q1[1:] + cross3d(q1[1:], q2[1:])
 
     q_out[1] = vec[0]
@@ -92,9 +92,9 @@ if __name__ == "__main__":
 
     star = star_cat.loc[star_cat['Name'] == id]
     print("Quaternion for Star:", id)
-    star_vec = np.array((np.cos(star.dec)*np.cos(star.ra), np.cos(star.dec)*np.sin(star.ra), np.sin(star.dec)))
+    star_vec = np.array((np.cos(star.dec*(np.pi/180))*np.cos(star.ra*(np.pi/180)), np.cos(star.dec*(np.pi/180))*np.sin(star.ra*(np.pi/180)), np.sin(star.dec*(np.pi/180))))
 
-    sc_vec = np.array((1.00000197, 0, -0.00017)) #target sc-vector
+    sc_vec = np.array((1.001698, 0, -0.0017)) #target sc-vector
 
     quat = calc_quaternion(sc_vec, star_vec)
 
@@ -105,8 +105,8 @@ if __name__ == "__main__":
 
     print("Expected Signals:")
     print("\tFGS1:")
-    print("\t\tTracking:", float(star.FGS1*0.125))
-    print("\t\tAcquisition:", float(star.FGS1*0.5))
+    print("\t\tTracking:", float(star.FGS1*0.125), "ADU")
+    print("\t\tAcquisition:", float(star.FGS1*0.5), "ADU")
     print("\tFGS2:")
-    print("\t\tTracking:", float(star.FGS2*0.125))
-    print("\t\tAcquisition:", float(star.FGS2*0.5))
+    print("\t\tTracking:", float(star.FGS2*0.125), "ADU/s")
+    print("\t\tAcquisition:", float(star.FGS2*0.5), "ADU/s")
diff --git a/README b/README
index 4e41fc6..fc7d1ac 100644
--- a/README
+++ b/README
@@ -1,6 +1,6 @@
-****************************
-* ARIEL FGS HFS Repository *
-****************************
+******************************************************
+* ARIEL FGS HFS Repository, ARIEL-UVIE-PL-ML-001 0.2 *
+******************************************************
 
 This repository contains the HFS, the simulator SW used to simulate the
 behaviour of the FGS IASW for the AOCS closed loop test.
diff --git a/matlab_model/Example_model.slx b/matlab_model/Example_model.slx
index 92b3703ac34c60b2698ebd20e9af98a69b30dab3..a52bffe6762f2ed1b93c45b49d2ad1592cba2c7a 100644
GIT binary patch
delta 9943
zcmbQUnQ{6SM&1B#W)=|!1_lm>=#cXpd0#U!M~9r>{F||wks~_fd`N4Ay!_-kX5;$G
z2|<fgrZRkWQDt#e$eXs;S2@Xglkep}w&x}@*cNO~KeqYtU0?I`I7{__T~m~t8=ot)
zvrJth;@TGXExNo{CbuJD$s{JDD@|_a)ciB&2CRG#cv5PLrla*Wj~6Z1B(0=^)g`j4
zSp2r6iyoT9zS6?*+bXUY;a`qi2Nu3xZ@}(cFJZ`1-j-);z3Aeki#Ip@3kl6XpwY%<
z!LhjT0qc+G)83b_6?{DEqIZQ&<huA#TVw6>yXJ)YUas)H@;c`q!~VB&^M0@2we&@l
zD<kh;MK-RLx8``Wg?3F3u$tz#f~ni^xR^)V1L4n7ckjO6uEGD;pycmV=_A$kb6c)^
zitJzh<NEK&a|IUOQ^gl}9R1;Y=VaQJ?hwJ;va%iRLN{`Ei~Li4-cfVp-(168UXN0b
zom|kr;6X^)>1nq&eoakZkbK<t%zP*N9g4R0j?T>WZ({zjqJ;Tm4%WY*FrUo9c9Rzr
z<Z*S{pKQ1o7#>Z2$0l2UH>^E8_@$700i$E9x|YsWRu^8^T@Ei6g=Ds=<Y{p2_LvyJ
zqj2|x68jC)5)RJ<LB)g#91A_xU*g=mLt+9STL&l05|(?Z_p9p<SwEj!e(vwP@^gRF
zp3VL}d**$groC%_S~3<g>gla3o+g&oci>*_rXQ7!->oYm^)}4q+)(jhN`3e1E8UYz
zy+XW>H*|X&+`V*$<rB|-$Ks8S8&Y@8C`<exeQK(G$+1<RJ}KvFc*P(8Q}LI7eQs%2
zAdBlCX*cUln~zHHN}Vy2F|)3|8|dPqaynb*W!CbR<2B17Lbo*<MksunG~@4l@1M@f
z?&kX4+!r=In)xl>qV&Pi3kA_LXY$^y_iA1@WnTQ1os$y}uS?PUo%iqZszZPH*K=%_
zh_CE3d-lk&_+!z0tLj<NZ~i|$;PtQV#?5;>8{+d8ec`B5d|i;my@+k+wYf^)GkcG6
z86}i;yr?QzJip$pt?iF%dVQ>{-h_gqb|JcQl9G|`jYcxcN=hqk?%a84x{Is4@b9YX
z<HzccT{4|EoxQ-Zs>T1_jCD<a|JK^<{rK|K>U;O@b*-`W+ak>KZAOGa%%7?o+A4o8
zDhq3BYTmtj?dsJ>mCuZ`%nbFd_Uv^t>C2g>Re5iYR?xjWGR7B_(*I?B{BB&hY~Nh@
zjM-6g0sFYqE03$IcTPFpoPU2G>)Id3Ws0-X4uvhr%B=Tz@bHb#@84-w7S`rZHt*fD
z_psPz#RZ4v%#qnMJ@a2cpJB+;!jvV&K|z!Bb|p7Tp4qYWU45xP>-@==vm+ioe!O|d
zR`q;M;lH-_#>U0fny1emzZ)xdXUhEirZtWSPR)_MvN74aHqx8XYF1U%f~}SlyPBGA
zH#IeNmUF+FXBclTTmSaAP)|}!@bP8K)}?<HwL90{BqdwdefHqPISLcZ&wnY7ZTZC3
z*<k+qm0`QjXScNFE_`zQJL@hAPBFYRx$LdxB^#41$IQ-uh^^c?Yv}~(`aG4@?CaU?
z*u<RAP>MWp`kn=wehAA84b$^x`rbe77*fBev21#sT9$G~^ioxw@!9M3O8=KFT&Sq0
z`gDorJi{GD@h?BsO6YKNv@Dw_XsM`}7`vp!!$jWX#?j^9_7v)$FAF<arOK+eYVFm(
zFV>a$d33leypx}w?{6~sZ^_x?my8~MEihDgA$7E@E2;l5i(hfHsMV%<FW=X9ie6%A
z_H-!dI+<c^Hd|Lu&8+2f{-Iqyx9a2lmwPr%nQELSIeEVQ<JiUDr+vsODk^FSeq7kJ
zh~dbrsHo7>L7z0muDAXSx4&+;RjKdSxfu+eo9>ox-Z{f%)3XALQp4lE4mE-8_nB8`
zWqF)En|JEesnUycc5U1FJ!DTF<5VwI7rA};(~sQJ$no8E^p90_=sjzL3ym4x9<`h0
z>Z`X*62H7#<jUp)d-Qr=MssPcTvfD5HLGFz|5cy9Ix4L^G2QE<^X1D+j<_)D`ucWX
zdHOW9V|Dhr(>$*YypJBec#e;`;qvY4$K`gI?!MK3m7&q0Z&gzAnbviMQoRm418+KH
z_f7F~)h+qg7#{8XHz)l-Tg#X2TlYS2lMWV*VP-yEU+<={itlcFdiqI$0Ji4|)w_fE
zdG<|7U~^RPIIuoTRzX}$?9g?t%};ba^HzL!lN3{qZgx96Th~8)#rp%NKg&-(lsC!S
z`|@tFs+^Pit3@Uyq&SDo-8%JZQo!49HJ8qAs>=K&-&oc1VW-8#I@6<f-2;Rabme=T
zbggc4eZG0tMYaBT9i!K&i|60p4Y#U&aO>b9y8!8fw^#F>($dQJRB`28_*uVFW!K9m
z&(x0Y+tA!Q>q30#auubwKmQ+=JbC9ZgNwxBT79FQb`?w48+m8m{8T-0Vb7o9WR^ES
z3b>0E7e2Q6IjL+?VMlAb`@y@r%eR_t4c7S*S@Kl#$jh$V3=KxrFX}_*SAT!kYPwiR
zYB$gSZBhqj7|t*h+|kkeSb>l4sdU-t8mCLwH=21=ZK!T3*na58j|$I7Ng>B&CT6>y
z+>Z8{w$sP|g1ufv2gfR|=s7~aKOUdAc>Vv5?%m<9SQI3MMCG47O%;@uj*d_N{6uHh
zlu(=Q<UNsHUd#L^N&Xh?|F?Ep{oJ{>SMJ|`@AWM8r9(kMCeO#NK%=<_8+PtI`|q`~
zRKf;VPnMH$or2Y~r0>3{TDisd;U{NVj>ldy9#W70?{(9wtH?M}m$ps(!J@C9Iw!<^
znaO8WU3@D!F+Kgc_EZM9C&xBi)L|6AIYqJ8vG$ZqaNvo*8B7oNvt7xLQr&U-N`Pqn
z-?_qjk6Z3CpONZ)W`pXzOKbjpa7;g{RJd!yh7W!7=g)VjvDP!ca`|&!L4koq&D=eK
zy}h3Amj_MHz4I#I-nH5aookN&4i$Kx{=E3^v*i8hzBWpC1EPXODpdc<xW)SF#y^?$
zcF_}m$FBz$E-X2<;Nh1U|2&t;7ME!*wz08!bm>yP@SNtmA3HmJn&*DHXxd>V#^L0}
z%)lrw?{L9ofy%l#i{j-64svpR<>YMiN<MS>(xr%py>@YN-}3S*m9wWh<OTog>h7NW
zl%0*;Q&n}^_Wb*PQ>V50t;w0Xr#9PEoPoXOza-!LYoYOyCRTc^9NPPA<(Gbc_ci-w
z^|oz$dt#4nsh@ZByl>j3p9a@AtmZj5tx#yqtHbU5KiSQf7<NU>UccG!xcVPM)2V+y
zJ@vlwZ`*dggJKuHboP~9y>yA|(!?v>HzM=@2R5IRzwc-NU17`r+uIpfGkY$!{OZ1@
zUn+O2OH*v=R^tPAe@!`cs${|X<hMN*vjnRf4jOc3@i))pa9jMTq269MEjv5AveRi{
z!b7jCvtK#Lf8yc4o_t13RMb}^cJeVBwhqU;w{A(DPBHp;w$A$LxkPr~<L>Odk^j=F
zSXNEy;<}`6p7pwBRj-q;NZ#tt{G9Px3b$09@6YXRWMvPRe5bqY;mqB$x7gh^&GN{-
z5jHWit|%$#Yu{aW<H%=M-Z|92f5B{FBK~M8<JqsDqAs;&{hn0tVdA$NLYwxTd~vsQ
zPT`3?YUT%O6HPyUEiGLW{?9{2WP!TBzyFn(+x&BCt!9=U_^A^9{C$hV1BTmLdA_`@
z)f;RsE<NCUfPaB0>($E)r<#BLo_thQW!koHW%DFTFWx*ISRo&O|H27>cCM2xKN;#}
z-<}HGxTIg>+9Fj){Tp7Yr+3NZIp^Iusi`F7EU($lx9QNF2EPfnHqTHtKiW}Ue&jLd
zv^(Z)&scwnq$E8vzxmKeFzD410cl6!{P$ZIML&BUzyCpePVdw1`~7PT_I*;9;=OWt
zrz?A6N#+VGJ+YnP{O%WiM6E3T`eE|MC41j=R@b|wsd;>|akwTu_p>z%LyAv`QTbFQ
zDW+ya4|8|(RjXHTZS)J)d-9`Z74wnS2Xm$|C7-Dbo&QDC;i>+MzNeKhrqA^;n7!p!
zhug<IewOWdXD%joe0KQv<Hn8I*TN=iJafO;;U*xXz?WC8u_fx<ip9B(emkE2U3Mtd
zZu!g&*V@0aC9$#9zrNI?-NR!Q$9VHi#s4~~qHQY+Cw)2ODU@9maqQpAq^6s$KH(o~
z+z)ZO&N&mxa^?TEobUH7euzyjx@c{8?}shF!It94dmBx)jcb2Anvc@<43Y7^YCSnx
zP`%!___Be(-tXZRHQ`?pBd19opWDb+kYF+8+nvbQ${$twY^O23-S1xZ$|R4Om94G&
z%~d<wxBI4s9erB6xp&{JdspA)NnU2{RNfrCc3t`E)SBwgawmUm+M{vjT6y_uxm{m1
zXB-P;&tldtzI{DUa{b=-_Y&S*xn;5;<G}j;TmK%@4XMBV;FyrjCKKL$X)UK-<w<y+
z3epminl2t_lD9cy)`kV<-Q{o3&90XJ*?vyvaq&8fTko^?_OM=z(we)_W-?2mm*y%C
z(-Q_0vu0;3vye9Dh%TwU`)zCej#br*Ydn_xiCBMa{&(NhU;Ynj8snAtw102=YW~3N
zIg`}0<rxmzY%L5-^-P+N&M>WVNtzhgsbVRR*HYD^wqe!&*{XIzvw!DBuf8>1Y}+}J
z9~u4)vL?&+7>RwmJ>hGH?>f&WA;VL~dcp^vPBw6#aXY--xKQl}e{(XI?Zvjx11dr?
zCXa#yRD@M0T)nc)YU8XY&on$0zB&4RpLMRKI9n)NaAA_dRGFtL+gH>ZT{(3o>`vF8
z7LyBM56&D2_*Ew_VmWL1jQY_2_*Ex4R+V~k%N)CWa-)qi!)LFvtB;;Mtt8v0S5X{x
z{`G?ypFBm+E>+S>QDpeYW29o5sFAAnSkrLQrL1M?3T=1SeKm-i<XoUGT)ZS}dv5$D
z6WtFF%iqN{SMScfdd&9Pvy<~4x7GXXD{=d)G4tSeofD3V!XX!*Dx80q@7JY%E&cPk
z>xXAOEdD6-t}gz8jW_3$Ely#XT{{*sg=)#%aM4uTa!tYUpUVU7U#s?Xs5ed25&TlW
zYL9}6sLo&JjW1s(iC5(C9hYlauJ+}|(vMe`9cO2qzx%*L+r$3+Q9otjiIEG``wV%M
z!SrDAWOfmadhg;}1_Jw@hgaOmPO;TFUBo_Trdejbt;$);#nTT8+e<`mS-5|n(+wLd
zl|~`H2Uopz-+xy(|HG4KOV>5UFMEA@+srl#r^E!QtFJcA^gVoh{(T1i{7<Vr<8L0F
zd~s>+?!R{}c*LA+yJuFuIaMchZf$H$+lKJs;O-S-W&d`+o%h?LeyiykZkBv+!`Cjg
z&zTQaHx;POyJLP_V(G!^<?=Ee?V-s>Pah0y(ny=q_A^wVVnJZ6``-KFweOE4$=$em
z$mekKI)ey3Z(Cl@V2^;w3_{*aD<*LjxLJ63PMV=~t<C7E@D7ozxUgNuXFqPRkIFr^
z!lw8~kP!3KEZ!9w1}C<NDb!C53UUo>N-}dPEfkNvS++Fxsfh1`YZ80sZdhhN@6)}V
zd99+i1F|RNUM>5n{={B*hhh1<oiFx>tgU)id|US{%eyys=anA2GxzKM-Ko*HPCbdg
zea!E{v&xni<=@1W%-#eY5j@1Hd{X;B{zvN#@$2(rz4Tn)Z~A?_FqVJKI-guA>-rEI
z9XIKVE?XD7irzKVdz7`Lz3h*Jm)8O#F=i=s$q6>zjHi~QxCpm(>$Kc9`5Sc3Z^`B-
zp3g*<IwW$jWXzIONS0)tywc@Jk7mq=4^w8&3%$GGouG?T=^VAbzfqpgOpdaim?Xk@
zMn%Z&w32ArdK-&t<|laitfb#0)+`e^{Ys$z*?;FHZW(@aZU{GRd_8$lgY=VGQ<Dy5
zdRdCrFkd`qeJTHarS?VlWJxZwY`Lk?rL`j0%fbV1@BWcHdGYJ7u_jT`YSZe^+$w#0
z_uj2tHRXKjg)ezI^)D<_zWQ^qMd!|Hp~~H{%S)fu{5>Sh`sVk;sarii`L{n<=eqcl
zTNUrOoiCLAe;K#FKmDupf$)!O5_f-d-KkDI`JV}%TtTUI^J%d);K7o~RT5u79r(?K
zl7CtGKs|W>>>&AgAqIvCev@nDmFsVLY`gziJLJsWl~2|&KjPhZc3R4xg!Qua2R^C=
zYlbVEF4!259X)B|^J{<Kf1fjrWm16m4ZpN$UWvBnUfQj<Tc20-p?~?(wKhTTBF|W^
zxw1OTbz$E@pVKqt!<g#7Z4Cc;{K4IWti~&Ci_&`ZJNXx!nyzx{!Q4eH3Kgu^!%wAe
zT2kLW)v$8Ovx`jyNk68@yEBKgZJ#{3e{b`xP_{oe6oY4HwK>}6A1Zlt(fXLY&2)(^
zMhWN44*mEO@1FCrsDV96?Y!QBS~sb;G7-%?zqFlWs4(0(jbUZj)wJl)tGPG4Cva@{
z+0{GQ{pf{HEO)o*KCo?=b++h0hyR2l6$Jv#?&oJZ*1s|QT05aTyl?T&b-958eyI$X
zYx$;4iDqMZ@*pna9BZZ1nVDz9p6A%{r^Z`lN(DYXcBpE}ihHLR<k#(ZdO3H^<kcsA
zA3P{cWf1qWO;7k#VrXN(F{die^2;2n;`%_zE7F!y7V7i#*SPz<4?fIq!DF+1uKK0S
z+z0y0_aC-?+GSjC?sDa<^=ZSKr<}9bYCQaXQGjRbBAJ^<J}YH!nAVtU$sbxfqlMr7
ztaP|hmU8_S0V~s#rkxX)OWK_<Ib^%$MowO%mxEaLxl5NAS|4tTR-U25(7l?cF1su$
zwA4S-<n@o`_g<{}vHg1c^81&Qa|>0()|_k9JheH;^z+SIPB(kzFR1_4{WQ`emb2W`
zIQ`gR(a&o{`q_T;o_a9nT#e+dxv5QzM?Xw^Y%V?3F?wp_{J`veAIjU=omtmUZGC_G
zK;q2^@7MfUX%;(5E_JPFP0|ZG`*Cu%vENR=Z6=pbUH1`ttlM?7)9Laj$@@`!xtyg;
zQGPepaVs6=jy<^N(DUU_WzSnB*1xl?U9v5wrP$4<#Bgz98pBFQ8T+4CKJI-R8nJ%6
z)Q)#nbMwmXs$SS{xXq@~<HV0^99dhH5AT|D*5+0I`I|3GSNE2!zM5SUH8*el#n<mO
z<*j?OR`2}zCF<{c{V-iUx1LpJ9Md*Sy?c^v(W(+&(zna+e15<5{DP`ef1gi$yi>%r
zUPbu$v~5W~OGUmut$W!K{OGcB((T|Rn<eV&o+dezJeAl|-e|i~@}R&T-w9WkxMiO5
zT5T7vJmvSgb={_`la=<|`<d%;WP;^4#|JYFO@3Sn`(gX$@piN8i_Qz)dtJXjO1AU%
ztoHlmw?1w)i+#C2d-=R?sY`d?db#ym?$X=0Zf-5xSa0PvL%nf%u3i1{k6+i{>Ro1^
zwOm{(^5y?ae)3!LXT8f<zJ1op%q$MeH4oF9E#Ex){x-(`a$oqZ>Dhl>r2Do^T(<hw
zO^@GYyq}p$<HIf1t&&XoBWA}xVczGfuRk1l&ZYTsp^RO3w&LQ)yqOzg(lo^XhFP0!
z>0DNSu`hpX_s(k<>-|j5&N#dyU8?VQ&*Mwkf9G5DZ@d(K!u-totmU>1m*qY`bd)~M
zf2(BOe?i;-vh$n&%s2jYY3B~Ns^e@zcjv5s$@@|yXRdO?viuza)8{{5aekiJ)e?Ve
zTer$TjlX_c9seEuHte$a#2TBoE@${ZMP*(uuHgH`vM=}T7ws1xl}x5a)$6Q3^1RB|
zpF5Y~*oT6i_16`;jW={=-#t`4<FQmG!@S%*|CLIVGpvQSoc+3S!`!Lo9K;T9SvP6^
z#b3TY-qY57__yOhtl+)u`wwf}uYW2(eD3uzo4@nzr?<a8+AkGcWA=LWXSd%LhpL0Q
zuV4FORe!GKxzF#jXYSt0Om39;!Q)-RTrXewvg&JxrEzwhqm0pV8@>P6jMpg7$Zq1c
z+icUZ<a~ghTE4xr-Bh0S(%<=8|DIX2>|c#i6wB0u_v^O)tzGi$`p*6FEld|Dz3VA4
z-r4<egIs&Y#uCNW_hqm5*6oj+e#ZIjidez(!RyzhOIfll_x6agyBa)M?h4nDQUSFs
zL6Uv-jXJZHTHSdree!Wv5DzGpdDgAu&sUr0Yx(eefQ>zm?)j~pFOKuf=1-Heaj6Z=
z6hE^+LAynQiM21>!m=sO@ZE9U&Loes+YAkri!ZFR-1dxb<N1?QZWXP0azn6u<1Uli
zO7k+BExv8eaSP$(`ZVKnz#~7&C$bOuR^^LFoUPenQ-7>q>`H~k^owhge;y5Re$^O|
z*I}%GnJ;-=`Ad#<DJ^}^_^#CLN{y1)!;~S|61(b~p@c!iwi8>p7}c+QUN5nvL0NeV
z|H=(cw)X@2Z!%5_>}qh8d3rQK!7nSWXmXL})Oe2V9ghz;nI1l~W5WA{SGLu5v3v&u
zqs~cWv1$JKC~R8KqHeIoe|`&#*L5L*&+QQ>UaH0_u;?q8JvkR}ARy&i+9L6T@dEz@
zb{KKoZ4+YDKN__uMsp|AhpvJh9}il;W8n+SE;#Kv?U-Hr*3H6UVYaCr!pCyvdaRZ8
zZaJXM&><DF(C(UCaNZO3#$*?-G8aZo_TIKO*PjKi8$9C#)+aou?>_Kt?MbFCkIx;B
zE9dYX-?~SkNI@$r(d5&MO>CUAH~H;)Jon2=l@Bf@j8eBN8Rj=Xo$~4Q%^S<tP1kEN
zzifHrtJs<A%{O_LaJ6wYWC=du5aX^FnOdqBW3xKrlbc1{u2*N@aK;Eao2*aW=)7m&
z!Apko+pp}}^Wm9>N&7Rtqc_jgA7bk+(TXs9o!e>1ZIR~}lQFs2H{Sl7^O0QMY8{*N
zEgvku`X4c2kq@uEJ>ij$#uJVMw^%C|Z00?;*E5}k=gqzNXF^&9g3mj2rynuYZdSc>
zr?`IV?q?Qm(NiA%I8xB29{neOduM{E`)sb)vb`?zSIoYze(Q$bqjuh>86uI}Yw9}<
zzR#R@px)Q_T*R*X8;>Oj+FJZ#Gwj$U@hVr!`|%tbb&1V4V?G<`xJa&DaIv}2fZ1}5
zOyKQx8n0VkZV3ASzG~OaRso@`kD;5Sm7diZ>OTIM@gt~-ZGWx)OuOjh6E+taw>es}
zRH>+`r~LX6qrPt=$KA;$+qe!C)UJ<C6q+tq&*;Cyl)wDvfkn+V^QSZD7WZ=ooVlg4
zPnoear#px-Y{BH&?P?C~jQrbk4zREKIWJebLYa+esVC<p$<1d^-}HHAF1$E6P;*Mt
z(VNMs2Xy&YXf%qS{rV^|xVrslnZVVg>3pp_-cEO9R+&(}eL>%`=}VnwKa)tB{?#Ng
zzQd-wXF>h@f@<MY;uDu{u&ykL|GdM+YSEL0M;eavPqR+ZX8)42Y$Mlm27XSFsXe_y
zJgdJNI9naMqdmJQNB3^Q{eNvv8O!-tOfoMu&P?YrIrH|=p<M===NzSDy$oGe`TI65
z`B=F@Bw8=itSjS~S-W6C#pCstzw53mT70ub`1tIHefQOR>c4(Ed}HO=Wk>uJpB`D5
zD6x>W<3vsAtMwYC$IkZ|3eHTn@{zHQJFqe-$!XsfnbV(joj)$-obuiK6U%4)hqh~;
z^Z#7vZ?^Q=)H9rGGz1i0%AENhnfTJFx}9@_Qx&iOj{FVM{t3J1?9e$?vvPkz+Q~cf
zjV<HSJ}Yi)h`DW~BVS})AOB&?)a<UjfQ_NDEj#a)y^?%?xBG0>#?bxCuUPx;SaV(a
z?faeC2bT72`Lj@(>yXg4JvF=!51p`Fk~U%fLbY$|>~mwb*Ez>_Os<HPthgBUL*nVe
z(09Lfe(7sVzgAP|et}^@No&K5=&mE#+^;^*So<STC}s!0Yfbyhe!h8p+g}#chns3$
zVtRi)e%_Y9Umq7%1SuciV(_MVM`L%p`o8D0?^o^TJrLFVZQi9frVP8T9^t*8=il^I
zH!IR4`fUxvm!5?xmv4E0E0r;K_+-F*@AHcKe9M5)$Y*lP3${O>=)Q}68lU2kdxyW)
z+HXEtbH3fDpx@$i^$E=v^P~go|G#heQO#5zJLB<Q^;xEqM8&_|*SkC6z2?K81=A1i
zN;Uu17&+mOdaB{)cXvzU9gp2?YFcdhFh|mO=C*IME^LT-omkMlJ@fGF!iu7$5v{eN
zrX9cDamSi%ex9;T<VIc^!-2G*m!+3x9J;hE!P_##@|DJB!&x%h=F~o`uxs=&nReh;
zos682=EnNu&<}l!R;<odY%5zSTVA%AQD^h3$Q$wsn@(J)Z@cnp;*DFWNvpSCPg?!G
zOeES|{sH$!=2>@N{=eL+C3Et;K&G-#=5n7Uy=_w6TP}u`3unH!k6glO|JRu1b`Q&K
zUBR5~a;LZ6zU8|n_asyQk*?G?@jACAz4)5Ua;J;sj<#@tdHpw5+fwuJ3)AMj>tXpb
zJL>J%U%hdgTcc;Ljaz*?$Zl2Wgev#kZwmJ_wnTmPTYUeWM%LDgug$8@u8YcF`L=HL
zRfiL4yYIgJDzI<$s#??PFW$@6esH<je?3g=^AE{cS?;r5P0v_$y=%JD`rVI%GNxpD
z3I6|=#ChEFUUZAJFqczrT|JvXx8(f}vBi^W)K%iby_Hqh^_49a-~F|0d7xH_=b}B6
z%WsNA^CvgoFq!PH=HQg}N80O+^|4&xQ#=|%D^@;OcT^_((npV=j(Zkr*XB+=*m-t_
zimIHj{OrmvmpYGipTGG0=}&v5J4Y)2NB1QBF}%mzJ+;2bYM;He<ndp6Yvz{KYtOwE
zp}+OD#Ea?~Zd;>MPX|2GOAd1Wr|hJ9sw1)e%GR64+a`Ugns{<j<d($?`y|=dX;&Qz
z3b>;oS^4O|qo=19#`OQnjjXt%9CGZ+yjJz_f<K43PN}R6xpMfyoO7KY*Bo(?zjEZV
zN<_#E%^iZZ&9hG%Oi>875j@Vvr=55>TIN{2%$XRz)2ZM7g)_aY_&+gnnNWwE;)%Dl
zyMlt7e&v6CU){wR^oW6DeGmI9?ejl=I9nWO|Jxkp;yi2J*<&9PHf^v;)$-}Nk?>>Q
zr!!1P)4A4oM}HI#+30MSE;xVQqodX`r@llwoRLV1Iv3NKQpA!KT#y`L`0`9qOK5Es
z`}M1Zm+IxFIIF6d7<GS0i)Uz(Z}bwL()L?3`+#}3ij2&ehWy^#j>m^Ba=6NrtP+2y
zG3N)(es*AfAk%Bc?cBBufA4<~H7Kt?-uXHxE_O%Wj}QNql8&rPVQiY{XpuaxKF`-!
z;%e5}$8Kl0E$dhv+q+86dttB4<E|gwEMB@FD$W-1SR2%5{z&on<eR28IsM{d$>4xQ
z;X|t*`EAR+6Zy~SO%Btgo*Qy^>)FL-ZrHaZbY9?X*$0mL;{9c+Z;D)PQvDLoK6<Ir
zdL;eX0lWFh+-GjZhFT`d+@8VGlA^^e5tYc-aA<+up8LYjdM68}9(?)c!}WUhGxysI
zbB+FrME%*zxY*TOu%5l+S_ns{iq_ErgNj~-n9!JA4;xJnrcTN&v3T7q8|klcZnukd
z`;{#Rie;RmWI6nq)^W$N`aN0nLC?xq{+?>Oqx*@Qm%g&ETzK$ntN-N%N`+E;64%OJ
zIixtL=2}qCv~C9e|0+AoKj>VaV(WRMD>nDd(j;}!vSRL^N3KUdd33Jc<%@GuqiL|s
zd};6Re`Qv=DmH&FPTtia?(LJc<i`)g;zjHRYo>R1)VQ}CKYiZYwV}j@WB>nWs_*UI
z9G@X{YtpN}0K1wS_3nv=|E89x9(I_d!+z?+)(7Q=^FJJ2y;^u;f=lLPm3*%f`>NM%
zL7Vp_i)v~fT71hTXy>0uRjX~Q?$?L(MLam=C?C!^<8tPUMdovBKZbnyCcNG$P<-3>
z^4IUaTQBm<d8_$%-wI*trMogb*_Pf(no#R06*@b3|0DMkr5b&kww|x|NmclzbNlGS
z7RQVSbq+bKlb%L!F0FlD$8B7{mH*d^#V@ztHrkt$qLaBGFM~^X_bCOn3@MK?*+<1*
z^%H_}-p<@xGV}2>?=xjL=Q+o|T|axy*JFLY=jt9B{a-zM&Vj$tXShPuPE9ktnc?PD
zvrlbOcBK8jg>A8HKeARFnp0LVf0F4+=ZYD{ViwCRHpNT&<W_uow03v#>Cd8nxPFSL
zE2bY2SYD`Vf2!9%z@t8T`{cNF*Q7Tq_}Fe{n#7t{U(=%bW`S6rxZKqOpI;#cA5RGH
z|IM=W!drQv#VSQC9Y<gN66dj){D|Wpmzc`D2WKQ#Cgf)vFLU~{nT1Da(_V)aAzIDX
z^mRVid%6j-KXEl*!g=_OwnX7Cqhy&Xh5yI&r+wDkDjetiDdNnBvKeQKv`;dZJ=+#{
zzxS@+nY`_DZvU#+-g)<)?%k+s`A@d(l-}Gs<EGp0Ik(?w@0@z%t<LF5SCY$FSG(He
z-*~ZSTJKtciBBCay}vuRS$6BT$cb}{)^4p^cP*v%_1wz5H^+*rb655{%{$0-Z-W8%
zwu((X-kWyJm3+T<LcYdwuhP5qhPPiwC>2^XU2zg^4XW?H@VUHplZaRSrQ>s--mPCb
z_v@*rcdJ#8TP_#bCZgooQT}ZE-$NV$)0fSXuA9C7tLi3Ymgt!MrpsTxIr7!&*!8PL
z%cR$*R2^TOnSJg4tOq6WuL73*4(()duifiD@yO>3uf?CuTj-s+|J?F5&!@XAEBN>6
zWwh&M`737a$%`-FZZ5y*`lx=Y^q$}Ks7rh{_ZYsE0u5J9uJBn0qBm>$3NmqkhOI(5
z`#(>1@;9zOUHzDS!UK*IdO_k-S8a<7PqX3EkPs-l_3XX3b9AZkrHRkvV()(X@Ur?-
zU-64$3l|v)PI<tv_-$LUtN(iUunW$6HRbys{hz+%$RgwGc6O3GW*CQ=e3`p6CF-L|
z`NBoHJ(uTwX3(vgTp@hBzi?j*i`)6V!hfs}&7V5q)*jvM0$w?yTkZ)2?YraT;{PZ&
z>Wp?k(cZFcizMHCDoHnOK9;6)`tCGSzb8ITr<XA5E@|GKa?yrIFg=~2-lzVLHuIGk
znu{ZDWu(l!GELOaGEMPpVRoQ+rq|ECLh;!;(H~NKesQA=<4sNom<tMqNrAIL)Z}@A
z-C$ZLs1r=@2wDZEQ-kfm^s-<xaA3897Dhb@b_5G*gm{4I;*dbJB|H~H%)!dR6D<Ov
zVvO#S)k8HDK*0?j?Pg+Nc*?=RAk6>)j9}`M@MHlI*~vYjJYZ92hx&u*x1j-G+9Avd
zeVB1Vm?c>1Oqev&FT=^R4JG*lycwAo7~o60CJTm3Gd`QF8?Fgf7#S|jG~IWyg|DIx
zn!*rJGI+_rz+lP9z#s#54+8_lU90^k`}oUYnEWAJn(17?<op2b$rcejV85BnJO3_%
zfq|i#fq_8-#f-eb$^3y@llvkdew!O1&BPNld2OK5<U3HI*Adc8vw|jD2Psb0jD#4c
j6{&qWj)8$;0s{ksK8kT_!IO^%8BT7C6kxj;43Yr=S?=Xl

delta 9913
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
U4EiW0t`3@fA<~g8EEpsT0F6=OyZ`_I

diff --git a/matlab_model/HFS_Wrapper.cpp b/matlab_model/HFS_Wrapper.cpp
index 1bc78a7..8ac8e14 100644
--- a/matlab_model/HFS_Wrapper.cpp
+++ b/matlab_model/HFS_Wrapper.cpp
@@ -73,6 +73,7 @@ void updateFGS(hfs_parameters *update, centroid_packet *output)
   u_new.reset = update -> reset;
   u_new.save = update -> save;
   u_new.set_invalid = update -> set_invalid;
+  u_new.validation_signal = update -> validation_signal;
   u_new.sync_flag = update -> sync_flag;
   
   fgsSim -> set_params(u_new, output);
diff --git a/matlab_model/HFS_bus.mat b/matlab_model/HFS_bus.mat
index 8239bcb877b865fcafbc983448e9ffdcc8988b66..e561d1aa6ab50fce1786f0466ffe151f6eed9389 100644
GIT binary patch
delta 1943
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

delta 1874
zcmdlX_*r0riG*8Grh;!`rGkQ)f}ydMk)f4|g@TcRk<r9J<%tQb6HA`di?cH@RLpsE
zBfDJKRf7G)O_jY#&fH5M$p(H{w_wXX)uoKxLIIb#;vP@pNle+?d6QS|p8f;b5AUS+
zch||p{}R06nKtXcUD~D0?&Vc}&*s?Pu1uRZ_x_v9vAdQ?CR;z3knTIT_@d!4t6Yz-
zb6@<(-c~$Kcj2!yma``REh*7CSN6GH*!I)ci=E4FCHKvm9Bnc2`t`(uxtgZ;BQ2NT
zDo(9evg+gLpTB1JR;l&kTw4FnGvEF5u4?YT_eT_;zxST~U040VpO!Aw#g}{bq+dL+
z$jT`2!<CkMF3ZnWFM1QcLw?g?x#`arDEyglz4m&t<wNJ=xn<Uog1)>iSNV&s3iX@a
ze4<)Etz6sG|Hsp^6?Y%*_S@Yk_s}~~==7%r5#n17PNm+=D!eJ4c%W~0(GlLeOT&80
z!y{Lm+Omuzdd<1y)tj7q9V#Q^LZmKkdVWj%g!pRHbI+s`r|K4MKl1w1ztcC*T-fHw
zTUvk2L^7)B%hSK|?N$$Lmb=?<Cf^9k>N(baMWUB~wPC%Kd|<MP-Kt|5H9be`<x8c*
zlS}qTFG}8Z{Lkwv621N_45j>68%o^=DG2Jl_+yIH;=<T?sr&1WWz<CVzFhWR*Dn6k
z^TlhT-#=GyfA&7$<MYVpaVig`cC~Sq=H5)1>vrY*FUj(ddlpY#{?_{ZW$%=ozy6)f
ze&JrNeWyS0kpy%7@g1$n+!h=5MFg)|yiT^%N9eeS#kNR`ZOzG2GS&wSnfqSz_RT#~
z$ZV0frQi-r-|T~h+!lGP$8*_^>pj{bE3;cyro7>?U%?y3<8cLdQVZ_*%6xBl9LIgU
z_Q4K$8UBXHjs-R;1#gu5{ywO<ap)t51z$t5m`w45iYpH)dMxDF>yHbI^{F5HC}J^>
z?YQv+i;RMlj$}ERb{!e+2Pc{y8(8!;JdSKmo_O?r^YMu9wm-PneAIsZSME>m8)f$2
z7I_={g*P1I-q0_eD6fCe?o(T>j^J@4i@0qCb6AdR7VKf_3qSaA*1?Zfg?kwL%yng0
z3-++`iOVcM7-(YQb>!f|!ejM^0@;p77H|~o;q5DCYj>9sE%+hUr)81#pn_edw19=p
z-9v`AV9xe}J=}e27Euo>_+{Qp%g75HZ-4OP#G#Ld7Iuusmp}NyBQsxGM!e&(lEuCa
z1vQ*~>koW1wb;jad^_9m@*{<uGShWs!Vi43wWwn_-v8jo$p=4X{;iLaI``>*z470_
z7Hb|Ydmr~#_CjX;|BL_ry_vjT`q}H!>$A&s_pS`RHrHg0_va^n1ShHg7Tq4lQ}I#$
z_uHxOk9?Z@&H7N<-9)kY@Ndm8oUMOty8Gg<mBotp`@`=~d%COn*SZSxko#9(P40QB
zIx{ymc;g-sZr4`+SG&~SFS}y8+3TJ}_j>i;^XjErS{FPO=lv~rrLy?d9ew@F>i*~E
zD^zZ(zxUO}vt{ie$@9A3Z<Mcp%`@@!iG3dq|1Fl@pWkd1{Ur6*6HA?c|Bp^ywLd8R
z;q;2)4>te9U)_1V*LHqv-1q9;kEYcMnt9#Xkbm3C{0g(}isJvJ>yLikGjIR#?)2FE
z&+jeRm;E`<tG537ukzBRQAYn_Yeg9t{{Md)aWe0=fq?AoqNMHTF1?LtXkYYV<!RLy
zYx$UVoK#%F_<h3c15sOi9TvstGJazJySmQvo#i*-QyVj<t3*_;e5=;L!EtHwbKds+
z6N+oC7)+joPP{&ESF&}O#dD?K1xy7R^X*ra^OhbDyZ%G8_kPIx<@Il`t3T;C`PX>V
ze#?*QRrWXYR-cmp*LL2tva+kY?Dr}5TQ)&uFW&FHHb4EVdG@ag$B(yIZMM|sd=!{p
zUiB~Y`=hrRHuHY}WZzqN>*MVj>wn9{{_oo3du(^tz1t5$uk5zB;a_Bt@XaE2Pwx8W
z_G#C(HLkrjol&LuZevf1vYV3I<$9Y$L1D?A%M|%5%A7aN_`rGNua$4)v*LwT<u8KI
zwIBVwko#!WUY20}BXcM4omB8so2-;*#H%9b)39bv-^VpZ{9;en=Y16LcZ!%4|Eyl_
zebCnjyfdm4<zD=hH##UZ>tn<Nl?6-WyBVk3f1dER$ll{+=}!4IV((S{KMz=QJ=oxD
zy;F_ZBBu=n+g@1DuYOmUQ*`%zw9S#fnKDmz#p~W%dhM^a!B?l8D}TSZeR-PHucXDa
z`A_~=nG0JgIt)eRyD!Cm(R_aR(a#HQNqhSaT;cv0E@ya%)pMrKFUMUWch^bQWqsng
z9>4lt`lk1#pJk5x+&*DyW!cNCOu_m`mM6_<H&HCApPjzWBBoAin*0%ym#0hidtZOn
zy|CZ#&;32-xA+a;cYpgSp75%5hxBq8{xTDl`^77(l~f9Pk|%%td*G3x+-i%Oo<j?d
z=Y6ifbMMOc_0t|L`a7}fGpEn_i1Sar#@xKy{yu)!{Ao|q!!B#z`aQGv-i7mXpSf=@
z|GDvVNa+#&Hu?AWG(Xm7{8`pqzw~CfXxpiyPkYv{j}HI8?A^UT{|)cypWk=peDaMt
K=E(=1CIA2iFwznL

diff --git a/src/HFS_API.cpp b/src/HFS_API.cpp
index 9dc14d7..6c302c1 100644
--- a/src/HFS_API.cpp
+++ b/src/HFS_API.cpp
@@ -2,7 +2,7 @@
 * @file     HFS_API.cpp
 * @author   Gerald Mösenlechner (gerald.moesenlechner@univie.ac.at)
 * @date     May, 2022
-* @version  0.1
+* @version  0.2
 *
 * @copyright
 * This program is free software; you can redistribute it and/or modify it
@@ -30,7 +30,7 @@
 const char* MODE_ACQU = "Acquisition";
 const char* MODE_TRAC = "Tracking";
 const char* MODE_STBY = "Standby";
-static double ROTMATRIX[9] = {-1, 0, 0, 0, 0.999998, -0.00017, 0, -0.00017, -0.999998};
+static double ROTMATRIX[9] = {-1, 0, 0, 0, 0.999998, -0.0017, 0, -0.0017, -0.999998};
 static double ROTMATRIX_SC[9] = {0, -1, 0, 0, 0, 1, -1, 0, 0};
 
 double smear_kernel_os[125*125];
@@ -366,11 +366,11 @@ int FGS :: perform_algorithm()
     if (med_acq == 1)
     {
       MedFilter3x3(image, dim_x, dim_y, med_threshold, filtered_image);
-      output = SourceDetection(filtered_image, dim_x, dim_y, 0, channel, 10, target_signal, tolerance_acq, 10, iter_acq, 10, 15, target_signal*0.01, val_sigma, pearson_limit);
+      output = SourceDetection(filtered_image, dim_x, dim_y, 0, channel, 10, target_signal*exposure_time, tolerance_acq, 10, iter_acq, 10, 15, target_signal*0.01, val_sigma, pearson_limit);
     }
     else
     {
-      output = SourceDetection(image, dim_x, dim_y, 0, channel, 10, target_signal, tolerance_acq, 10, iter_acq, 10, 15, target_signal*0.01, val_sigma, pearson_limit);
+      output = SourceDetection(image, dim_x, dim_y, 0, channel, 10, target_signal*exposure_time, tolerance_acq, 10, iter_acq, 10, 15, target_signal*0.01, val_sigma, pearson_limit);
     }
   }
   else if (strcmp(mode, MODE_TRAC) == 0)
@@ -748,13 +748,13 @@ int FGS :: transform_to_detector(double (&vec)[3], double* output)
   dmatmult(rot_matrix_sc, vector, &transf_opt);
   dmatmult(rot_matrix_opt, transf_opt, &transf);
 
-  if(abs(transf.data[0]*3600000) < (dim_x/2)*plate_scale)
+  if(abs(transf.data[0]*3600000*(360/TWO_PI)) < (dim_x/2)*plate_scale)
   {
 
-    if(abs(transf.data[1]*3600000) < (dim_y/2)*plate_scale)
+    if(abs(transf.data[1]*3600000*(360/TWO_PI)) < (dim_y/2)*plate_scale)
     {
-      output[0] = transf.data[0]*3600000/plate_scale;
-      output[1] = transf.data[1]*3600000/plate_scale;
+      output[0] = transf.data[0]*(360/TWO_PI)*3600000/plate_scale;
+      output[1] = transf.data[1]*(360/TWO_PI)*3600000/plate_scale;
       return 0;
     }
   }
@@ -792,9 +792,9 @@ int FGS :: transform_star_coordinates(double (&quaternion)[4])
   for(i = 0; i < targets -> number; i++)
   {
     star_quat[0] = 0.;
-    star_quat[1] = cos(targets -> dec[i])*cos(targets -> ra[i]);
-    star_quat[2] = cos(targets -> dec[i])*sin(targets -> ra[i]);
-    star_quat[3] = sin(targets -> dec[i]);
+    star_quat[1] = cos(targets -> dec[i] * (TWO_PI/360))*cos(targets -> ra[i] * (TWO_PI/360));
+    star_quat[2] = cos(targets -> dec[i] * (TWO_PI/360))*sin(targets -> ra[i] * (TWO_PI/360));
+    star_quat[3] = sin(targets -> dec[i] * (TWO_PI/360));
 
     /*apply quaternion to vector*/
     multiply_quaternion(quaternion, star_quat, tmp_quat);
@@ -886,10 +886,11 @@ int FGS :: set_params(hfs_parameters update, centroid_packet *cent_packet)
       centroid.y = (centroid.y - dim_y/2) * plate_scale;
       sync_ctr = 0;
       send_cent = 1;
-      if((strcmp(mode, update_mode_char) != 0) || channel != update.channel)
+      if((strcmp(mode, update_mode_char) != 0) || channel != update.channel || target_signal != update.validation_signal)
       {
         set_mode(update_mode_char);
         set_channel(update.channel);
+        target_signal = update.validation_signal;
       }
     }
     else
@@ -911,10 +912,11 @@ int FGS :: set_params(hfs_parameters update, centroid_packet *cent_packet)
         centroid.y = (centroid.y - dim_y/2) * plate_scale;
         sync_ctr = 0;
         send_cent = 1;
-        if((strcmp(mode, update_mode_char) != 0) || channel != update.channel)
+        if((strcmp(mode, update_mode_char) != 0) || channel != update.channel || target_signal != update.validation_signal)
         {
           set_mode(update_mode_char);
           set_channel(update.channel);
+          target_signal = update.validation_signal;
         }
       }
       else
@@ -935,10 +937,11 @@ int FGS :: set_params(hfs_parameters update, centroid_packet *cent_packet)
       cent_packet -> validity_index = 100.;
       cent_packet -> validity_flag = 0;
       cent_packet -> time = time;
-      if((strcmp(mode, update_mode_char) != 0) || channel != update.channel)
+      if((strcmp(mode, update_mode_char) != 0) || channel != update.channel || target_signal != update.validation_signal)
       {
         set_mode(update_mode_char);
         set_channel(update.channel);
+        target_signal = update.validation_signal;
       }
     }
   }
@@ -1062,7 +1065,7 @@ int multiply_quaternion(double (&quaternion1)[4], double (&quaternion2)[4], doub
   unsigned int i;
 
   cross3(q_vec1, q_vec2, cross);
-  output[0] = s1 * s2 * dot(q_vec1, q_vec2, 3);
+  output[0] = s1 * s2 - dot(q_vec1, q_vec2, 3);
 
   for(i = 0; i < 3; i++)
   {
diff --git a/src/HFS_API.hpp b/src/HFS_API.hpp
index b67dc05..9168df6 100644
--- a/src/HFS_API.hpp
+++ b/src/HFS_API.hpp
@@ -2,7 +2,7 @@
 * @file     HFS_API.hpp
 * @author   Gerald Mösenlechner (gerald.moesenlechner@univie.ac.at)
 * @date     May, 2022
-* @version  0.1
+* @version  0.2
 *
 * @copyright
 * This program is free software; you can redistribute it and/or modify it
@@ -51,6 +51,7 @@
 #define FL_FGS2 27.08 /*Focal lenght in m*/
 #define PS_FGS1 175.0 /*Plate scale in mas/px*/
 #define PS_FGS2 137.1 /*Plate scale in mas/px*/
+#define TWO_PI 6.28318531f
 
 
 extern const char* MODE_ACQU;
@@ -81,6 +82,7 @@ struct hfs_state
  * @param	save: flag for saving the current state of the HFS
  * @param	reset: flag for reseting the HFS
  * @param	set_invalid: flag for setting the validity flag to false
+ * @param validation_signal: Target Signal used for validation and identification
  * @param	mode: operational mode of the FGS 0: Standby, 1: Acquisition, 2: Tracking
  * @note Operational modes are integers as Simulink doesn't support c
  */
@@ -88,7 +90,7 @@ typedef struct{
 	double position_quat[4];
 	double ang_rate[3];
 	double time;
-	unsigned int sync_flag, channel, save, reset, set_invalid;
+	unsigned int sync_flag, channel, save, reset, set_invalid, validation_signal;
 	unsigned int mode;
 } hfs_parameters;
 
diff --git a/src/HFS_bus.mat b/src/HFS_bus.mat
index a453fb79d9832dc08fffe5eb28795fb99963cfd9..d8f28171de2c7b3965bb1d9bf8c45118f6d1fe0b 100644
GIT binary patch
delta 1940
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

delta 1874
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
K=E(=1CIA33KGGNf

diff --git a/src/HFS_config.xml b/src/HFS_config.xml
index c6667a3..f38d22b 100644
--- a/src/HFS_config.xml
+++ b/src/HFS_config.xml
@@ -92,7 +92,7 @@
           Note: must be lower than the integration time (0.5 s) -->
     <delay>0.1</delay>
     <!--  Brightness tolerance for target identification default is 20% -->
-    <tolerance>20</tolerance>
+    <tolerance>50</tolerance>
   </Acquisition>
 
   <!--  Relative path to the star catalouge -->
diff --git a/src/detector_features.c b/src/detector_features.c
index 2c8b82c..90bb675 100644
--- a/src/detector_features.c
+++ b/src/detector_features.c
@@ -2,7 +2,7 @@
 * @file    detector_features.c
 * @author  Gerald Mösenlechner (gerald.moesenlechner@univie.ac.at)
 * @date    May, 2022
-* @version 0.1
+* @version 0.2
 *
 * @copyright
 * This program is free software; you can redistribute it and/or modify it
diff --git a/src/fcu_algorithms.c b/src/fcu_algorithms.c
index 4e0e435..e8d31a5 100644
--- a/src/fcu_algorithms.c
+++ b/src/fcu_algorithms.c
@@ -2,7 +2,7 @@
 * @file    fcu_algorithms.c
 * @author  Gerald Mösenlechner (gerald.moesenlechner@univie.ac.at)
 * @date    May, 2022
-* @version 0.1
+* @version 0.2
 *
 * @copyright
 * This program is free software; you can redistribute it and/or modify it
@@ -1570,5 +1570,6 @@ struct coord SourceDetection(unsigned int *data, unsigned int xdim, unsigned int
   {
     result.validity.flag = 1;
   }
+  result.time = 0.;
   return result;
 }
diff --git a/src/utilities.c b/src/utilities.c
index e374818..c349d21 100644
--- a/src/utilities.c
+++ b/src/utilities.c
@@ -2,7 +2,7 @@
 * @file    utilities.c
 * @author  Gerald Mösenlechner (gerald.moesenlechner@univie.ac.at)
 * @date    May, 2022
-* @version 0.1
+* @version 0.2
 *
 * @copyright
 * This program is free software; you can redistribute it and/or modify it
@@ -88,7 +88,7 @@ void random_poisson_trm(double *matrix, double mean, unsigned int size)
     unsigned int i;
     double k;
     double U, V, slam, loglam, a, b, invalpha, vr, us, enlam, prod, X;
-		
+
     slam = sqrt(mean);
     loglam = log(mean);
     b = 0.931 + 2.53*slam;
diff --git a/test/HFSTest.cpp b/test/HFSTest.cpp
index 72ae1e4..60d592c 100644
--- a/test/HFSTest.cpp
+++ b/test/HFSTest.cpp
@@ -6,6 +6,8 @@
 #include <stdlib.h>
 #include <experimental/filesystem>
 
+#define TWO_PI 6.28318531f
+
 // Registers the fixture into the 'registry'
 CPPUNIT_TEST_SUITE_REGISTRATION(HFSTest);
 
@@ -134,23 +136,23 @@ void HFSTest::testTransformation()
 
   fgs.transform_to_detector(vecx, output);
   CPPUNIT_ASSERT_DOUBLES_EQUAL(output[0], 0, 1e-7);
-  CPPUNIT_ASSERT_DOUBLES_EQUAL(output[1], 0.00017*1e-5*3600000/175.0, 1e-7);
+  CPPUNIT_ASSERT_DOUBLES_EQUAL(output[1], 0.0017*1e-5*(360/TWO_PI)*3600000/175.0, 1e-7);
 
   fgs.transform_to_detector(vecy, output);
-  CPPUNIT_ASSERT_DOUBLES_EQUAL(output[0], 1e-5*3600000/175.0, 1e-7);
+  CPPUNIT_ASSERT_DOUBLES_EQUAL(output[0], 1e-5*(360/TWO_PI)*3600000/175.0, 1e-7);
   CPPUNIT_ASSERT_DOUBLES_EQUAL(output[1], 0, 1e-7);
 
   fgs.transform_to_detector(vecz, output);
   CPPUNIT_ASSERT_DOUBLES_EQUAL(output[0], 0, 1e-7);
-  CPPUNIT_ASSERT_DOUBLES_EQUAL(output[1], 0.999998*1e-5*3600000/175.0, 1e-5);
+  CPPUNIT_ASSERT_DOUBLES_EQUAL(output[1], 0.999998*1e-5*(360/TWO_PI)*3600000/175.0, 1e-5);
 
 }
 
 void HFSTest::testParameterUpdate()
 {
   struct hfs_state state;
-  struct hfs_parameters update;
-  struct centroid_packet output;
+  hfs_parameters update;
+  centroid_packet output;
   char path[] = "./test/HFS_config_test.xml";
   char* real_path = realpath(path, NULL);
   FGS fgs(real_path);
@@ -161,13 +163,14 @@ void HFSTest::testParameterUpdate()
   update.sync_flag = 1;
   update.time = 0.015626;
   update.channel = 1;
-  update.mode = "Standby";
+  update.mode = 0;
   update.save = 0;
   update.reset = 0;
   update.set_invalid = 0;
   update.ang_rate[0] = 1e-5;
   update.ang_rate[1] = 1e-5;
   update.ang_rate[2] = 1e-5;
+  update.validation_signal = 100000;
 
   fgs.set_params(update, &output);
   state = fgs.get_hfs_state();
@@ -177,7 +180,7 @@ void HFSTest::testParameterUpdate()
   state = fgs.get_hfs_state();
   CPPUNIT_ASSERT(strcmp(state.mode, "Standby") == 0);
 
-  update.mode = "Tracking";
+  update.mode = 2;
   update.sync_flag = 0;
   fgs.set_params(update, &output);
   fgs.set_params(update, &output);
diff --git a/test/example.cpp b/test/example.cpp
index e065b9a..8d43b95 100644
--- a/test/example.cpp
+++ b/test/example.cpp
@@ -18,7 +18,7 @@ int main()
   double sum_x_tra, sum_y_tra, sum_x_acq, sum_y_acq; /*Values for mean*/
   /*Quaternion to put WASP-11 in the center of the DRF*/
   /*The resuling measurement of the */
-  double quat[4] = {3.77743614e-01, 4.02209431e-05, -8.95172007e-01,2.36594249e-01 };
+  double quat[4] = {0.8892834993148474, -0.0006038143244162956, 0.2873837014059442, -0.3557880006700909};
   /*Initialise FGS simulator by calling constructor*/
   FGS fgs(real_path);
 
@@ -58,6 +58,9 @@ int main()
   /*mark all cantroid packets as invalid*/
   update.set_invalid = 0;
 
+  /*Set signal for target identification in ADU/s*/
+  update.validation_signal = 100000;
+
   /*Unit quaternion of the current SC attitude in reference to J2000*/
   update.position_quat[0] = quat[0];
   update.position_quat[1] = quat[1];
@@ -170,8 +173,8 @@ int main()
   std::cout << "Sim is " << output.time / (ms_double.count()/1000) << " times faster than real time!\n";
 
   std::cout << "Mean Measurement for Tracking: \n x: " << sum_x_tra/ctr_tra << "\n y: " << sum_y_tra/ctr_tra << "\n\n";
-  std::cout << "Tracking Reference Values: \n x: ~ 248mas\n y: ~ 387mas\n\n";
+  std::cout << "Tracking Reference Values: \n x: ~ 256mas\n y: ~ 983mas\n\n";
 
   std::cout << "Mean Measurement for Acquisition: \n x: " << sum_x_acq/ctr_acq << "\n y: " << sum_y_acq/ctr_acq << "\n\n";
-  std::cout << "Acquisition Reference Values: \n x: ~ 276mas\n y: ~ 267mas\n\n";
+  std::cout << "Acquisition Reference Values: \n x: ~ 237mas\n y: ~ 911mas\n\n";
 }
-- 
GitLab