From 87e8333dfdfc4732126e8b1e1321879edfa58aa2 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 15 Aug 2018 19:02:16 +0200 Subject: [PATCH] slsDetectorSoftware & eiger server: fixed coordinates in 2 d, but switch to row (x), col(y); numdetx and numdety sent to all receivers now, likely bug fix virtual file linked in master for 1 mod jungfrau; xccoord and y coord calculated at setdetector pos and given to listener --- slsDetectorSoftware/commonFiles/versionAPI.h | 2 +- slsDetectorSoftware/eigerDetectorServer/Beb.c | 38 ++++---- .../bin/eigerDetectorServer_developer | Bin 302326 -> 302326 bytes .../eigerDetectorServer/gitInfo.txt | 10 +-- .../eigerDetectorServer/gitInfoEiger.h | 8 +- .../slsDetector/slsDetector.cpp | 15 ++-- slsReceiverSoftware/include/DataProcessor.h | 5 +- slsReceiverSoftware/include/HDF5File.h | 11 ++- slsReceiverSoftware/include/Listener.h | 18 ++++ slsReceiverSoftware/src/DataProcessor.cpp | 15 +--- slsReceiverSoftware/src/HDF5File.cpp | 83 ++++++++++-------- slsReceiverSoftware/src/Listener.cpp | 37 +++++++- .../src/UDPStandardImplementation.cpp | 12 +++ 13 files changed, 156 insertions(+), 98 deletions(-) diff --git a/slsDetectorSoftware/commonFiles/versionAPI.h b/slsDetectorSoftware/commonFiles/versionAPI.h index 33d1355e5..14db9b736 100644 --- a/slsDetectorSoftware/commonFiles/versionAPI.h +++ b/slsDetectorSoftware/commonFiles/versionAPI.h @@ -1,5 +1,5 @@ /** API versions */ #define APIRECEIVER 0x180517 -#define APIEIGER 0x180810 +#define APIEIGER 0x180815 #define APIJUNGFRAU 0x180628 #define APIGOTTHARD 0x180529 diff --git a/slsDetectorSoftware/eigerDetectorServer/Beb.c b/slsDetectorSoftware/eigerDetectorServer/Beb.c index 074980d8c..dc4e139fa 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Beb.c +++ b/slsDetectorSoftware/eigerDetectorServer/Beb.c @@ -1215,8 +1215,10 @@ void Beb_SetDetectorNumber(uint32_t detid) { int Beb_SetDetectorPosition(int pos[]) { if(!Beb_activated) return OK; + cprintf(BLUE,"Got Position values %d %d %d...\n", pos[0],pos[1], pos[2]); - pos[1] = Beb_swap_uint16(pos[1]); + pos[0] = Beb_swap_uint16(pos[0]); + //pos[1] = Beb_swap_uint16(pos[1]); pos[2] = Beb_swap_uint16(pos[2]); int ret = FAIL; @@ -1231,37 +1233,37 @@ int Beb_SetDetectorPosition(int pos[]) { uint32_t value = 0; ret = OK; // x left - int posval = Beb_swap_uint16((Beb_top ? pos[0] : (pos[0]+1))); - value = Beb_Read32(csp0base, UDP_HEADER_A_RIGHT_OFST); - value &= UDP_HEADER_ID_MSK; // to keep previous id value - Beb_Write32(csp0base, UDP_HEADER_A_LEFT_OFST, value | ((posval << UDP_HEADER_X_OFST) & UDP_HEADER_X_MSK)); value = Beb_Read32(csp0base, UDP_HEADER_A_LEFT_OFST); - if((value & UDP_HEADER_X_MSK) != ((posval << UDP_HEADER_X_OFST) & UDP_HEADER_X_MSK)) + value &= UDP_HEADER_ID_MSK; // to keep previous id value + Beb_Write32(csp0base, UDP_HEADER_A_LEFT_OFST, value | ((pos[0] << UDP_HEADER_X_OFST) & UDP_HEADER_X_MSK)); + value = Beb_Read32(csp0base, UDP_HEADER_A_LEFT_OFST); + if((value & UDP_HEADER_X_MSK) != ((pos[0] << UDP_HEADER_X_OFST) & UDP_HEADER_X_MSK)) ret = FAIL; // x right - posval = Beb_swap_uint16((Beb_top ? (pos[0]+1) : pos[0])); - value = Beb_Read32(csp0base, UDP_HEADER_A_LEFT_OFST); - value &= UDP_HEADER_ID_MSK; // to keep previous id value - Beb_Write32(csp0base, UDP_HEADER_A_RIGHT_OFST, value | ((posval << UDP_HEADER_X_OFST) & UDP_HEADER_X_MSK)); value = Beb_Read32(csp0base, UDP_HEADER_A_RIGHT_OFST); - if((value & UDP_HEADER_X_MSK) != ((posval << UDP_HEADER_X_OFST) & UDP_HEADER_X_MSK)) + value &= UDP_HEADER_ID_MSK; // to keep previous id value + Beb_Write32(csp0base, UDP_HEADER_A_RIGHT_OFST, value | ((pos[0] << UDP_HEADER_X_OFST) & UDP_HEADER_X_MSK)); + value = Beb_Read32(csp0base, UDP_HEADER_A_RIGHT_OFST); + if((value & UDP_HEADER_X_MSK) != ((pos[0] << UDP_HEADER_X_OFST) & UDP_HEADER_X_MSK)) ret = FAIL; - // y left + // y left (column) // overwriting z anyway, so no need to look at previous z value - Beb_Write32(csp0base, UDP_HEADER_B_LEFT_OFST, ((pos[1] << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK)); + int posval = Beb_swap_uint16(Beb_top ? pos[1] : (pos[1]+1)); + Beb_Write32(csp0base, UDP_HEADER_B_LEFT_OFST, ((posval << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK)); value = Beb_Read32(csp0base, UDP_HEADER_B_LEFT_OFST); - if(value != ((pos[1] << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK)) + if(value != ((posval << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK)) ret = FAIL; // y right // overwriting z anyway, so no need to look at previous z value - Beb_Write32(csp0base, UDP_HEADER_B_RIGHT_OFST, ((pos[1] << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK)); + posval = Beb_swap_uint16(Beb_top ? (pos[1]+1) : pos[1]); + Beb_Write32(csp0base, UDP_HEADER_B_RIGHT_OFST, ((posval << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK)); value = Beb_Read32(csp0base, UDP_HEADER_B_RIGHT_OFST); - if(value != ((pos[1] << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK)) + if(value != ((posval << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK)) ret = FAIL; @@ -1290,8 +1292,8 @@ int Beb_SetDetectorPosition(int pos[]) { cprintf(BLUE, "Position set to...\n" "Left: [%d, %d, %d]\n" "Right:[%d, %d, %d]\n", - (Beb_top ? pos[0] : (pos[0]+1)), Beb_swap_uint16(pos[1]), Beb_swap_uint16(pos[2]), - (Beb_top ? (pos[0]+1) : pos[0]), Beb_swap_uint16(pos[1]), Beb_swap_uint16(pos[2])); + Beb_swap_uint16(pos[0]), Beb_top ? pos[1] : (pos[1]+1), Beb_swap_uint16(pos[2]), + Beb_swap_uint16(pos[0]), Beb_top ? (pos[1]+1) : pos[1], Beb_swap_uint16(pos[2])); } return ret; diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_developer index fcf3c0bd1354e29fb7ccaba98f29608e68c74ec7..db6e3a38200dc9d0160539cd4a9be2d065a57540 100755 GIT binary patch delta 21009 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 W!BuMLO>HA?YBSp(e$0?J=zjrNYuHr) delta 20954 zcmch9e_T~X^Z(gB7X`w+5+ESx6-iN1K~XVLvCyuGhKhwsdM#8;Oe`!clxt$44;6aQ z!9=B`#G=H&E)^*iCMFpb7A7V>VGku4rS@P!_xs*+&IQ!x^W%^2_v`C5?##~a?Ck99 z?ChSaf4t}Z$9wMC&pWwE{Ic8DtW_>nBmY^25(7Ifv%->U!*k9&=|d&9$0(LtlG#IH ztVr?exser> zz}H<>QihC&&5H4NxYCTj<4S^tt}^(fn&o5H(ky*aM_4iH9$m1sK0_%UG1dpuIriFr z;1+EQxsR`}QKCbh3|QZmCd;YTy^^z8t~?Mf!5IA{Kd2NfR0_4E7b}e+bDVgnDZNaI z2<@X{RZ4v5P$w)?dcBerx`1UXO`!vN<(uVCzSMilAr@=7;y3b9Zmm@^M^5C{2Bm7` zznPy>F=`SE-WE29g(*Q{M_Gi@6t;+26!Yk((vxoT135%`UaRZ$1JrHEF-vj<)Dw6C z@KPNw241M+mB90KydHSAj<*8O(C}wHfT!wsxLHb16m+N>T@M0Z@(yTzotAOX~IFx2tI^GQ2s^e|IQzE2vq1`4o5Q!RN6K25T zbsRHbF*y@U-Kl98MrS|RsP$jK*4`nP-$$rAi_0UC4$Y!e&6*ZRS zDrr&ES%DI{`VnSTf~UOBH&-Z0wE?aN7whfX-kG|e`G=%+!znXRk~U103|l8jrmc%K zHA78Xj7ssUaZ3BW?`uOSr_3(QT2g0zim~vLnEOz~E7p<#<>%=WFh)@H5Wb~aiH-h~ zZ>dvaX6$2<5|i)cTIlIeti)sHSaemaD?Aj-{a2V-<-c~ggP#)9kFhk28n3j>8jm>` z>jRXTvz>+9xYE| z$};yPf@|;t_plHp`GEl}f7`xrrTT$=o{?&N?G6hJ!m6p8@x@3b7Q6+HRt30boshT$ma@*!jVkt_*{Gn)_IR9z>LaEX?U%~8C7oe)7U;$3| z5Tzo16mu5i20ygS)BDzOU-DK8A9`AhD~v`Rt637Ya3bR`HDDzl=37FPrbRF5%kiQG z%c102?&B}DDUFsv7|U%j#tK(r4#$+FKD>aj7-2!ztsP6gE#V}Nrs{+t!c?sZU-9f3 zrD0!`VqAI`&u&zrmx?*0F1^G8_3G}*!DV5PD9rxCtd98`6TfAtN>idL$7A_dd~5l( z-3yhekDB<_nr%q|u3J9uXq)rsCFNhsqm`2@!jxr?4shK(x`P#*^eq;vZC-$DW~g4- zri84tvpgl_v3L2lVz`2E-{@5j^KI2S;gJlYNq6k}x;t0@Z+Gaf_dLip45HDUZO{vQh?!nv`eZZ6#rAUS?cr zR%)I+i-jzDst;IIPtEUCDKoW;N-=A@sO0^0r%DY^?_;oKMw)7<;|Fn;m6 zv$|V7wXQ?8qV;1jPUCv93dZ!ucutvOO&9B0nC{DXPK&l5tuHcTN!Et(!mG3mIzkEA zI3A0gv{CfT-FS%=!X}H9K|h4)zA}81%bivcT`-m*#QLX)Sxyc`PQq%TrFcuvS@c}|$i_`EOQ-l_yYFNo;p|HX{L)s&3PvHDzA&ghs+ zeP$mPq_k$DX^Hn{n+Q`iTSUK>EhWftLLQ4zuKvT(Z~3{7e$iP^`N!O-Y2s_p)K6=% z!&1_a^$250kT6bJ_u^;z1Q)&}Hbde|Lp_7kz2%HO9pu>46r>csbPxE}-2uw&*-3my zxssN>gYRfjH(P@49Ae$K4id79S4Akf+jg-GrD405>%*tDvB8g3#xPD5ux`B4l=Bn@ zw`>=avTh#{nssZkmaEn2$r^G=hFnrT>q1Rb58>#$ZO3thFtNcFu5^r}T;1_Ji&N4_ z4XK5+RQRMZ_X%-L5JNZY+^Ac8!D}6s%XrxakBHbM^oifKj3q19V|`ucPjECSY2I}Q zt|Z%buje}}UOvpb?&zcB>|KUcZreKoLWA=Mz{z6rF+fRj zJ|ayf3?)LfufkvLkHe-ZF~D_Bua3SkufEM+ZrZkQqByuB_wC^?w<4?@7nhuZ>C8<% zwq|)cnwNOI1}_Q5>412&f4{!2r}m3=t=m6>MJg3%yp+C$E zFQzTp?I{%f3JXU-NkLy0bV+OBB`21zI&Ij&7x}I-rSf0^-&L+OiK0w#D^{rxQIsjM zT9H~jUAN1WDGp_o#^Q;5SEUkoNbIaBZl=MOLi7Od|TY|Mjj8s(el~C7O zI#4KBSh^o(i8=fa_)7g@!FPW5FP4L-HAi{SmI|$FY+|umY;zbwf(RDt-g`s0?8Ntl zMa=L2%=qpqmAA5dIp5u=G*kt+hCk$(X^G*(?hHG*cvYkledIwFwXG?@b<9==Td6s6 zoMq|V$0*$^!Y~jdC<`mZ0wh-a&i6E{S;G2{HtA*z>vE8O{2-J_`?x2Am#M+bIzw@< zT%zmvVx8l*6>d&H~qA-`+i7PC7+h^x7T*GH#FP;?Y#GQmXMdAe1m*T}RrL|OlTVx$&g$cXwQ{M8n97!e2_Ki41K>kkLG_I^c^ ziQKK?+;Jp(BIMV7KVDJJ4RH19-@%MLe?@uz`*GWT2vo8g9AVAlT8Bbm7arjIO4V5A z(P7S#(hKfP8QHK<3H-rvh`7Ji(I@Q(5wD7V_)%@r(m0+O;I_)li^9-x7mvdMOg}C{ z3S<3Ii-JG?&I`(v{C_Rv1r6Jp)VkoND{y<$Pm5pz>rYyvf8;1-`6=x6FaDvQ)gZvvHcf2PDOOb(f3V1e4J)Zm>Nv%cA= zB)1OXZ#F4;ts_NI(>jp9*{rm-zU}(vRaHIFruh0$q@DHG`yp3oyDlDi!v7r4qLh?B z7dhd1ZM*(bq=$^RgSW@CJ}hi|D%-~2YO%R7wurM7N|M<@mQ8*J_9TD1f^rP(E8n*p z%)Dg{Mvu`m1nq8UIcOlO6YD)J80;xvn^Z-lgVAC!@j&Hm=D!{bm+W>tAEfBKG^%uB z>4S5@f)7aHx>gQ}Rj5b!=oCds-JoU~Wp-mr`N1}7>4pIV&HS>k#(x;_@?32|X3z#K zj-jyb>|dCfpEFzKnWMUeE0V7vj^yi54&^(uek{vY;mo|)?Zw4b+;E|OpqUN7Miy7r zm(T7`HLlEyd|jCvAAU%yoOO=Ou59dR&$KNAQqz|ANnJN!dg{8UIjLqg%rk8d>elta z6<+p6%5M_SeUtOlcS(6vMR64+--dau5n@NN$z-^Vjp4;jqSluW`$bgurd4RdhrLHx zx3RH3oIAA|=0Y{MLF3WXavKZa!N)Xx?*EO#+}K#p!MEx&bTC=n&?AuY-Pm6&n(}(E zJ^WA|McmF-F%K%bohdAwB73sEp7H8d$JY}Jv5^repFCS+1%(!&}mu66uFT0zUlvAcJCjMq475TE^yrhNdec8ai zC0DKeSf-yOd5oJR8PiX24_Mw!oerBfgG_y}l93lFvJd>BfP(zkR9;$3$$sn#lPJNT zl|VJ`zRboVsirTxABCwOifBsi#}JY!+{C_pC`os2qnX#LNl2*aa9VgjDMqY*ngLOa z*Q#k4>N8Pa)}?-!@JZC?px&=by_#d9KA)2M!$3t;)}Ou250_J70J{fdQ2=|r+u>?6 z|7tU3%dEF;)d1AtHqmh`X^WP2^>FUmL8v{ZXk;d0jUZR?a*Sf zj$od2E}Xg37ekp3`3+~cb6W!i564>A+9+l?8|!1zyyw%OM5w?P)t`~d5-EQ;mN|=> zhO>#hteApEAn=sc*~&+-7um?N7BjEhs`m-fMt%?RqjH@H5Rl`c*9D<&IqIA!`5}00 zX()D41l5FM_K9>Ag@2Zre{yWPy?vAZj?VDP9;x=0-YcW9k!)t)_YlxNnFr@^9%quc z_>Qqv`;LK^w)a{oeR1nPuu?b{7AuKkRxhv;?ai#WX=FXhSI0MRtQ`ihPc36}!m#Uog zgK#t7->yxU>yhn)qON?(oxvXCAJmZZO!ff(pp7hgSvHd`V?kuPAA&VD`QLs|E; zH<^{fV^En*@uDasYYg-9DzDIe*xAerPK(h;Rg~9}X*%1n zS!}M%3{)G-aP;k%%QmtkTgF_7MOY|&fX!$8!+J8rVbmZhj$^xEyXblBB+Do7`Rsju zq?j5OV}#4|SsXvoq!AAXpciEf8mRE!A9>aVUO~Y7pZUwy!hltRE?%=H?@c!YrA}k(eL*kSt)2KdNiEaagcda(NgBl&mW?S zrEEm{T+uwOFV4Pn$r}fVhgoWze8bL?>hJ7m(@!#n;A~X&mM*QlvE79pYCDk>vD;s{ zIiN@6PihFS5c{Gzw3FxRIDOnUQ|dCdV&3A8vC{FeNcvg*vedE5rG_aTeAuj0m!H?& zsLR<7T`(tPPp9XRB@ll7`7HSL(RW>GWg_$BAC*%^BD-(uPbVCjYpu^O??OY1@1{9u zvvf+;08b9y!tKRpELbkcEHzCbkL7Hn>qoVqG2*`tP|R{Hi-}T};}{B|y5;PNVKW?p zw1Lk3(uKxAb)P$Evs8V8QXgeQr%ma!mS(I@OE#UpnP+A$!^E);j|xgd%CJ>W8A2@| zo2mIx_Jm8E7FIsapu`nyfKR68gPSkvn^;dlKCYpH73?nlaUC_RU~~LU;&gIEf9p|9 zm~TEKB!!wj38a`Lb@%2bv5h{Fn!rrtG-?o3lPI)Grm&T4Jc4QRO6J8s!Ev~fJ?#34 z{+;2IR=T7~Rx+g}qfb5+BzLyTn5L^`>1Y+X8tF@A4aKj<_?5Lb>uMw&IQR1(M^@=VF;5`b z38RcBAS=~Y^aOiU=4URD_fyzV$I5LPPqDihKh{Q7sq9TpAF+I5C+lBH5t}~^qRh33 z3h`96mJQ^8U8k0{$X~L_@-!QPBR%_R)PCAXWlv+itI6*f7|D&|oW@7%7vQg#aZDi+JCZ%PtUs-=j+QgQ5 zs>h|SnjRO97gEzE#5@nfL>tJ@f?Y|)7eeL;1FPqf*J zvl*_{-c-3230xwzZDnKb`>fo|A31O?uZcdHfc9&3(fT>A z)-55^b{vE;&oNgzvJFSg$b2`j^>2_p_=Oi6>da zK@mGolgBPNrN20D`p|>B*d4xKG>X#(yfuz12WXr;-z}jGv~>yA$!WoW*+B= zQu-3tAQ6jGz8D#(930t;l6JEZJ_VXbK6qMRz+}y7Y8t6@H@2!oExVDCMv?O#jUbi*9!p1P)7cX?#t6IKl`Kr;(XCI*aH`!3Se=qZJ z!p|eVcBZs_?3C9Fhr6`bx60QcHcJ7U#NlW8uS5A9a^BD0;9r*$oa!)>-slH%|oHeMKiRK+)m*7V3s z>)uFQCAQ2Ee&#{>Z)1BLP;;clx5Z5t=m^Bwkb_X@n{rY1rWFTSPyS7tAiP|sXpuo$BG0XA1rI%Uy7#Y(cHqh&pYd4Pu-V8F9Vn$Vmum-a*4PTo04%><(zvdnGjo02^ zZtYSrh006VB+s3kvHL@+6YQPTCi<)+?{{(fO`!63Ss#}W z*aqMB5Bg98NOp{J-$mEA(N!%EYt@UXO>lcqu}vH)Hr5{x6rw+^vN314p-`NcoDj`? zdBGad?s+yrRWzmyiOw51o0g*M>t$>%dq|jRD&74aOW+3%X*Sz=>ywG}-b!J!iC(!M zISk@haI^HDk1*QZG~@#|!_)s(ewsgJeSi!ji6Y9Oc_GD>vsFHU+O`T;eJPDVAEK}$2=F~9;|R=U8m@eF>unCVqmWa zvO6+#ZDebgQ5+*%JETTf9V2IMaEugT6(et2$X!pGI2Zp?+wn8szF zh*neI5b2DS44-0D^%9|r*6+$-#eK@iv+Jm-V#z~IqStZsVq$uFFFmyty^gb|`<^M@ zJXn&%Q^3xl_&Fht+z?5+Yl6urj~jfZm|Bj*)ls@tsiiHb3MV%|Q@Z0M4y7}dWKzpI ziaaU!%@ltU7Lq9SBd^$n^au-u9^}~v40>a zw47o;`i^Xeq!>twQBBe*sexL)z_dmkB4drZ(7`CiIRtxem?ViiQACHz(x``oVKJzm z&Wr5An@moaYqu1J#J)Z9hPI-Qq%tCFFMb)N2!P%`-| z_P*CyBn$zEto>jb7*%}-ltPD5>Z|AtNX2^L+nyt=RW6rgYGbMX}UEyAc1;RiW;e209FL5+}L)ICnmp3dcvsSYc= zhNA0Ozh1APg@-N>$NbPKlm>3EB{x;OP?_ko8AcjF-OsRn{9FSSoxxPkwUXO+Yy}Q& z6!W`Dx#1Ghru;MbK2velgF?>2#Ab>)%Le&8^q)2Q9%<)UHfH3Y>%vSMCP`uwX9*X< zB;C~C>_|a_G0~(Ol^S${TFXFe8`tYXu#bl|+J!8;m%B{yImphM% zMe^d`S5nY9*4KC7F^unqK8`mn-LT)ckmVfKdLS0}91_gH->Bs}`kgmX+d0<9=YUWf z-PG$DF3|cio;Op-_s9->^j^dCURhM}J(7{Yi~mKp3c4z~%@y6kDC7!mq4DQ2jIdtk zFdY%3!I`qp!^RI$F$(_)S}1A=Hghj0F&AtRXKjlFZm>0<7gx-v9T(Ul^_nDypJ>RT z#0zYwOTh%hUyx;#cLB$4LnT@N$zFABXi^1MG_+Ch5A5!NopgA^Op{r1>Ut*WIqC&x ziu?gN$=g4$Gk8GCY=pnZQ%xh@6q70DA`bpdRCW=RlP&y5HizR1rW*7@CKWUxcV0u; ztJyH+!>`iy+hh@34fa?TojSEWKl2+6*eQ8 z#)EP*OqsFc7gSm({1@a-nN;x$t^-*Va~Z5cO1TVPrmg5Qvl)C=-(+Kb&-}B9(yp+6 zK6mQzNNg)NJ)+>ZoW>qhdW8)bH+sV))qgw^q)18lF9MFA=D$WCoo9^2iKp=-o!7IS zj8~a&-<}t=wfkp{nX>~ouAT8t^{mFzwudeKDsy8#)1ay!8u{J0z5m%n1=rZo8KQrX zrXqAYDq*R5Z0}NM49^$OTs<~)sq;X)K-8`5QitjF=taeUAVLnKhCf)pX+1i*%vqD- zc74MnDQJWEl!s8e&LXGkv)6a8+nFwX^pV|;k@?>UK(BRSVKBF8Vz7a<=ikf)7hjC% zMMnfagO&X?5i!661G#AvcKMw0|HN%+1GW8$M56n9>R#&mL#d|kpA(Rchji*I zRhT8`)fDp=8`Vp^-|N#*tA|m}Uo61a(e?U!oqUFAcK?lPL^qe4s^3z(1$1;9C-|KT zI%`i;(hs#1*Txo;=SAi|4&t2D$KFvDk^$|5kO3M*MrgeaKc$uo6IJacCpD4I?yF{r zL1^ntF`WByr-vx99cSGOl--WC(GE=3+6##;GfRd#k?@N3&`WXl>e8>Ih}E8q)fS_s zxnM*WZA7fA*iS)SwSZQvQyar!u|AM14k$-Pfthfp3)>@k@6jHyw;3jaW$fGmQibNO zPS-oT2wOYt#`ZOCm?U{n1mk|x@He|-hS)v-ad@aEhP**t%|Nmv3+tkiD&Ob7(uhgA zMxmV=iPbfnzCojC=%$+J#)Yx=)niwKCdF{NQ;O68DQkrkp{v?YH!mgGncx2)k(qRf zBKkOtYl6gH|E0w3A$+BiIs_g0n+0sIyn&=R#s^^E=P~Xx39U9B&^~Som8mz&O>5)bVceBHeG{pYT3y`ogm|p3waEMiV-GTiT>b_k(o! z^qqYQE~TbV`8qXy>Dkou<5yDCGk-`GLd@*SILhX{WOPylWLpeIt_EH9+e#Qlq)X1? zR~YG=)yI21WocBSjhX#Ei&AAilK14g6c*-&{K9 z_PfZcwcx^joAs^}f0uP@EH|@X*HC#kK6PTF_)vrgQaM!U-|>lyU49F5cZ}aG#u4e8 znO)uv*|;5DGy?yPBD?ePP98uHkrinFV7zE@Giw$Xq^{{rnCKO1x)@IN-Fd$r`o~%+ z15J05vojwwcqe+O>5ZBFau{}SyTuNci?QG_igV^)AOpe0(Nkv4n{AOUe7_SSX4CDE ztiA|ps{VMGJbLo6{nv$CBv&)LcnrRwC4;-|S^6xp&Fsfxl+=??4Y-)2&(efC7e}mt z71a9*bT6gao_v7Mmk{F|D|MfU(9<0Wq8r4c%S9J58o8J2#d2*?F7BidBM<1LS5l-e z51}k0e}G>cMvX?kf_+3Wz4*TV>%@9t&fdb4w+_8hfg!wOCF5P1s2|#G9_}1pFkYbg zJNWBf7b|p4oz3jRxNwWyWM&OtQb>Q^he|y7bbhgJhbQmtd8o@I;BHs|%f%)N_T;m9 z!!)vb@*%@7wu+&}@o9CwQYE5+dJeG$r(65}=tgy(d=5VGqHAxu$BTP7VdCdci=`h+ ziWj%^z%PH!k5h+|ezff9&6nYbNbJpr^B=P*w>LlDLmar8GgyACpd@cTu-m!O)9r1u za2E-u8gD*=8Fu*aLHIlq(b{9xu(Teu8Fw=~F%M>%Rf}S0Z@g1jNcn88`9Z zW%VKs3Etf|@e073C3vD9ZvqZ^m8i$jH%4?~j!!iXW<8kxnn0%`HwkP7k5Py(Cr@uP zJG(@L5MhuIOH&x=xs)6X5AcKHNmnetel{3h1?6dZ&S2 zPE~&VE?(zJ$s_ntT4Cb7ZQuFxDAuhBll-=aEwCS7D!Vu3K{@Zv)%0i}QnKsBHa&7-cMJd{zz+~)Ys=*1ln!B^1=-tAK(HwPf5M4G zSn&iVaRQS#fk~XeBu-!wCoqW!6$ zPcE{zUw1$~a0iGw2mT+*)-0XxXDcT}{q#(GdwbMPaC6JP>s5JKr zqdIB96CmnTehqjI$h6xnWp?|b0u3zTpd)pNLFu3cF6u!qHgtj|8`p(3$#(k_rFMG? zm?>#`+0sc1p2`<>;IE130%p5?eVE<8u2zHeA_#<{D#W04&;l3rpw|U=LV6%e?<0@L z9lZ?TWp58?LRn+C&#XY%Xt&QX;@<6Mx5t&DG-2k=DC1#`I+V$F`$Lr|GcYr>XJvN# z(iD`{C~HwR*zJiPD6iV>%OQt5+wH6KQHI#rwC2nkSqfdwT-Q~!kEZ%iXToU)qv$k~fPI+bcH z3GJDO-JXyS+R~*i2zA0dkzMMrR!hA>LlyN8G-OzdWfB>GL86?9mr#E1;8@i9=`DnG ztmaekUFzb1H^FF$RQL;Dz-q~GnGc#9gC0qpy|~qGe-2iXD!SC=*zM0lx>Vk!t`K!X zpVlsQ<#u~!14e1EZMe+S8D(GQ>vpv8-aV{F{!<11PZbFeNr5fM@lz?bg}*;>f3uPA zZvk8dv;x|Uyb#R_odLK`6?y~w0D*vDKo}qb5DAE~MgPVhWBBdT2fy=v_z~M#QAE>U zzawc3ucba$Kt|GdQDoBsQH0PlqDZ1$qKKmpL=j16wc@WU=ooXA`dmeAER7dM4lNKx zHa#N>KiZ}7J`hDRofSnE{UwSx>T?bKpJ=1;*FYxH0#O9fGop4)BkdC9llAn0C{xSn ztYF8`U)T6cc)0$@A3VSXGaFj~iw?5=YLHKI+HjrUZkJo; zCBx&KK4Dm)iETg)r&P2_)E*J&k+DFXUQ-(c z)9Rk``%bt>Pffyg8iT?CfL=1nR|4XpN`mle(Y2D{H>MJd=My9K1S1WQvBO;s4S;>3 zDqytnXx43uXvSYdv%R8OR0W`p=D5rEIb|97lp=c7U7p~QWaRf^zufT(S%c(B;@{?UDeXQ(5 zJ$lRQouUMnvU|%{;vv+Wf_Yr&oX0^)>c3VfXogni9H?y6m_sp1!ORlOX|T&Q;Sa+) zrv?l3SEn{D8q5Sb?=8nTr5gEtRysFA?oHEuLO0B61D0g-d`wCbrGY}L<4mZqeBF$F5+}`?bSt`87SJSix?e28~VupPG-zFhW7Q5 zce%!3yU#*M=@Uoi{pAmhgYfMJ6B{Me5*+gMmouFFfCkbYe>vPK*2rh)&{==ET1Sie z%8&6`wdB`N_H#-^!(^J!PoC|PW8`zPCCUHe|6ugTX_^UZs5YVbCOI*{*&V7k!1T`= z*F3&RVuPW?WcUOD>1>rf49sNn&yah| z;E#S@Uc>N@uHMX)mk55ZE%ICr>C3WYe*>Jy_FT3QlxW+zRelKnpxyTGZSpJzTiWi+ zkrS9OXz_OWK3N>PZMm`?M|;~&`5xpAkuS@mkT;~fERRRtQ2eqyM&u1mqC{KME>y=- z{4RMcbGGH|l3&_;C!$)%AA^oMHk|6|cw6(`hD9(ZMNc)1z>oUVrW%F^_|<|PhxmeKhH&gz#7?IwcdpWt z)uXn0szKy7%~K8Mk?>UC3o4eH?*-*d)n>yY6v5L#rP|!?6XQovM6_WN(x0?w!;75P zklPHyOUU=~W?(bo*Sj+zpn!^I8umh5^!?}=N5L`R#gX4E!=zrp2o=GaM#eQp9#lt3 zvs7;UY{UIULrxyG%{HVXflHf%F%0Aui^@VcWeznzXqf2UuNw9U(zNhKUmQshaR%|v zdz<47YL4eN53Sws&$J9P`GBjGH&4j0m5Ty%ub&UY0y|}gYq6W>=EaB#3RBA6fX*x<`HO!w6j{2E=~A1Uyv7Rt4=^4Y|XYM zkZYu*r4X1%!OILU^+KGJnzgwP`Nqfxc~kW=!?WD!D#aukR$$WQiO?{#jp`GzdVy5F z+%VkTP=#J*t=F)LM(&YAZObvDTu#xC8W#1+!X7bd?BRn%pri6fv7R~PwgMxEQ}qhN zaPE7R+E!pqB5ip|h8NhlQPSf}mMwa0&B`Z+j~P8CRHdF=oTO4CZ{Ur&fj8Fn@MDIY G;r|C0=dj=a diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt b/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt index 8b2eccd15..63399ea00 100644 --- a/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt +++ b/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware/eigerDetectorServer URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: c934e92a41da49db07f8d3fed98d88dc39325401 -Revision: 344 -Branch: eigerfeature +Repsitory UUID: b3ccd5e1a137ddb5f11bc88d51a80e9dd777bc09 +Revision: 346 +Branch: developer Last Changed Author: Dhanya_Thattil -Last Changed Rev: 3976 -Last Changed Date: 2018-08-10 17:34:43.000000002 +0200 ./FebRegisterDefs.h +Last Changed Rev: 3980 +Last Changed Date: 2018-08-15 18:03:20.000000002 +0200 ./Beb.c diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h b/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h index 6514f25bd..ebd9ee8b4 100644 --- a/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h +++ b/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h @@ -1,6 +1,6 @@ #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "c934e92a41da49db07f8d3fed98d88dc39325401" +#define GITREPUUID "b3ccd5e1a137ddb5f11bc88d51a80e9dd777bc09" #define GITAUTH "Dhanya_Thattil" -#define GITREV 0x3976 -#define GITDATE 0x20180810 -#define GITBRANCH "eigerfeature" +#define GITREV 0x3980 +#define GITDATE 0x20180815 +#define GITBRANCH "developer" diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 4d83a4da5..d69c306ad 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -3976,14 +3976,10 @@ int slsDetector::configureMAC() { if (thisDetector->myDetectorType == JUNGFRAU || thisDetector->myDetectorType == EIGER) { sendpos = true; - int max = multiDet->getNumberOfDetectors(X); - if(!detId) { - pos[0] = 0; - pos[1] = 0; - } else { - pos[1] = detId / max; - pos[0] = (detId % max) * ((thisDetector->myDetectorType == EIGER) ? 2 : 1); // for horiz. udp ports - } + int max = multiDet->getNumberOfDetectors(Y); + + pos[0] = (detId % max); // row + pos[1] = (detId / max) * ((thisDetector->myDetectorType == EIGER) ? 2 : 1);// col for horiz. udp ports } #ifdef VERBOSE cout << "SLS [" << detId << "] - (" << pos[0] << "," << pos[1] << "," << @@ -5288,8 +5284,7 @@ string slsDetector::setReceiver(string receiverIP) { #endif if(setDetectorType()!= GENERIC){ - if(!detId) - sendMultiDetectorSize(); + sendMultiDetectorSize(); setDetectorId(); setDetectorHostname(); setUDPConnection(); diff --git a/slsReceiverSoftware/include/DataProcessor.h b/slsReceiverSoftware/include/DataProcessor.h index 3b8cdf18b..74fa55c92 100644 --- a/slsReceiverSoftware/include/DataProcessor.h +++ b/slsReceiverSoftware/include/DataProcessor.h @@ -209,6 +209,7 @@ class DataProcessor : private virtual slsReceiverDefs, public ThreadObject { void SetSilentMode(bool mode); + private: /** @@ -335,9 +336,6 @@ class DataProcessor : private virtual slsReceiverDefs, public ThreadObject { /** temporary buffer for processing */ char* tempBuffer; - /** x coord hardcoded ad 1D, if detector does not send them yet **/ - uint16_t xcoordin1D; - /** Activated/Deactivated */ bool* activated; @@ -345,7 +343,6 @@ class DataProcessor : private virtual slsReceiverDefs, public ThreadObject { bool* deactivatedPaddingEnable; - //acquisition start /** Aquisition Started flag */ bool acquisitionStartedFlag; diff --git a/slsReceiverSoftware/include/HDF5File.h b/slsReceiverSoftware/include/HDF5File.h index 2e0a44354..e302f3aa3 100644 --- a/slsReceiverSoftware/include/HDF5File.h +++ b/slsReceiverSoftware/include/HDF5File.h @@ -114,6 +114,9 @@ class HDF5File : private virtual slsReceiverDefs, public File, public HDF5FileSt */ void EndofAcquisition(bool anyPacketsCaught, uint64_t numf); + + private: + /** * Create Virtual File * @param numf number of images caught @@ -121,8 +124,12 @@ class HDF5File : private virtual slsReceiverDefs, public File, public HDF5FileSt */ int CreateVirtualFile(uint64_t numf); - - private: + /** + * Link virtual file in master file + * Only for Jungfrau at the moment for 1 module and 1 data file + * @returns OK or FAIL + */ + int LinkVirtualFileinMasterFile(); /** * Get Type diff --git a/slsReceiverSoftware/include/Listener.h b/slsReceiverSoftware/include/Listener.h index ca4ecb3a0..5a44368b9 100644 --- a/slsReceiverSoftware/include/Listener.h +++ b/slsReceiverSoftware/include/Listener.h @@ -145,6 +145,15 @@ class Listener : private virtual slsReceiverDefs, public ThreadObject { */ int CreateDummySocketForUDPSocketBufferSize(uint32_t s); + /** + * Set xcoord and y coord + * xcoord is in 1d if detector has not send them yet in firmware, + * xcoord is in 2d for jungfrau and eiger (for missing packets/deactivated eiger) + * ycoord when used is in 2d + */ + void SetHardCodedCoords(uint16_t x, uint16_t y); + + private: @@ -244,6 +253,15 @@ class Listener : private virtual slsReceiverDefs, public ThreadObject { /** Deactivated padding enable */ bool* deactivatedPaddingEnable; + /** x coord hardcoded as 1D or 2d, + * if detector does not send them yet or + * missing packets/deactivated (eiger/jungfrau sends 2d pos) **/ + uint16_t xcoord; + + /** y coord hardcoded as 2D, + * deactivated eiger/missing packets (eiger/jungfrau sends 2d pos) **/ + uint16_t ycoord; + // acquisition start /** Aquisition Started flag */ diff --git a/slsReceiverSoftware/src/DataProcessor.cpp b/slsReceiverSoftware/src/DataProcessor.cpp index d772770de..3bae074a5 100644 --- a/slsReceiverSoftware/src/DataProcessor.cpp +++ b/slsReceiverSoftware/src/DataProcessor.cpp @@ -47,7 +47,6 @@ DataProcessor::DataProcessor(int ind, detectorType dtype, Fifo*& f, streamingTimerInMs(timer), currentFreqCount(0), tempBuffer(0), - xcoordin1D(0), activated(act), deactivatedPaddingEnable(depaden), acquisitionStartedFlag(false), @@ -224,8 +223,6 @@ void DataProcessor::SetupFileWriter(bool fwe, int* nd, uint32_t* maxf, fileWriteEnable = fwe; if (g) generalData = g; - // fix xcoord as detector is not providing it right now - xcoordin1D = ((*dindex) * (*nunits)) + index; if (file) { @@ -366,15 +363,6 @@ void DataProcessor::ProcessAnImage(char* buf) { InsertGapPixels(buf + FIFO_HEADER_NUMBYTES + sizeof(sls_receiver_header), *dynamicRange); - // x coord is 0 for detector in pos [0,0,0] - if (xcoordin1D) { - // do nothing as detector has correctly send them - if (header.xCoord || header.yCoord || header.zCoord) - ; - // detector has send all 0's when there should have been a value greater than 0 in some dimension - else - header.xCoord = xcoordin1D; - } // deactivated and padding enabled if ((!(*activated) && *deactivatedPaddingEnable) || @@ -402,10 +390,11 @@ void DataProcessor::ProcessAnImage(char* buf) { (*((uint32_t*)buf)) = revsize; } + // write to file if (file) file->WriteToFile(buf + FIFO_HEADER_NUMBYTES, - sizeof(sls_receiver_header) + (uint32_t)(*((uint32_t*)buf)), + sizeof(sls_receiver_header) + (uint32_t)(*((uint32_t*)buf)), //+ size of data (resizable from previous call back fnum-firstMeasurementIndex, nump); diff --git a/slsReceiverSoftware/src/HDF5File.cpp b/slsReceiverSoftware/src/HDF5File.cpp index 300c42d43..937b52432 100644 --- a/slsReceiverSoftware/src/HDF5File.cpp +++ b/slsReceiverSoftware/src/HDF5File.cpp @@ -170,7 +170,7 @@ void HDF5File::CloseCurrentFile() { pthread_mutex_lock(&Mutex); HDF5FileStatic::CloseDataFile(index, filefd); pthread_mutex_unlock(&Mutex); - for (int i = 0; i < dataset_para.size(); ++i) + for (unsigned int i = 0; i < dataset_para.size(); ++i) delete dataset_para[i]; dataset_para.clear(); if(dataspace_para) {delete dataspace_para;dataspace_para=0;} @@ -190,7 +190,7 @@ void HDF5File::CloseAllFiles() { } pthread_mutex_unlock(&Mutex); - for (int i = 0; i < dataset_para.size(); ++i) + for (unsigned int i = 0; i < dataset_para.size(); ++i) delete dataset_para[i]; dataset_para.clear(); if(dataspace_para) delete dataspace_para; @@ -201,6 +201,7 @@ void HDF5File::CloseAllFiles() { int HDF5File::WriteToFile(char* buffer, int buffersize, uint64_t fnum, uint32_t nump) { + // check if maxframesperfile = 0 for infinite if ((*maxFramesPerFile) && (numFramesInFile >= (*maxFramesPerFile))) { CloseCurrentFile(); @@ -228,12 +229,12 @@ int HDF5File::WriteToFile(char* buffer, int buffersize, uint64_t fnum, uint32_t ((*maxFramesPerFile == 0) ? fnum : fnum%(*maxFramesPerFile)), nPixelsY, ((*dynamicRange==4) ? (nPixelsX/2) : nPixelsX), dataspace, dataset, datatype) == OK) { - sls_receiver_header* header = (sls_receiver_header*) (buffer); - /*header->xCoord = ((*detIndex) * (*numUnitsPerDetector) + index); */ + if (HDF5FileStatic::WriteParameterDatasets(index, dataspace_para, // infinite then no need for %maxframesperfile ((*maxFramesPerFile == 0) ? fnum : fnum%(*maxFramesPerFile)), - dataset_para, header, parameterDataTypes) == OK) { + dataset_para, (sls_receiver_header*) (buffer), + parameterDataTypes) == OK) { pthread_mutex_unlock(&Mutex); return OK; } @@ -277,43 +278,51 @@ void HDF5File::EndofAcquisition(bool anyPacketsCaught, uint64_t numf) { //not created before if (!virtualfd && anyPacketsCaught) { - //only one file and one sub image (link current file in master) - if (((numFilesinAcquisition == 1) && (numDetY*numDetX) == 1)) { - //dataset name - ostringstream osfn; - osfn << "/data"; - if ((*numImages > 1)) osfn << "_f" << setfill('0') << setw(12) << 0; - string dsetname = osfn.str(); - pthread_mutex_lock(&Mutex); - HDF5FileStatic::LinkVirtualInMaster(masterFileName, currentFileName, - dsetname, parameterNames); - pthread_mutex_unlock(&Mutex); - } + // called only by the one maser receiver + if (master && (*detIndex==0)) { - //create virutal file - else - CreateVirtualFile(numf); + //only one file and one sub image (link current file in master) + if (((numFilesinAcquisition == 1) && (numDetY*numDetX) == 1)) { + LinkVirtualFileinMasterFile(); + } + //create virutal file + else{ + CreateVirtualFile(numf);} + } } numFilesinAcquisition = 0; } +// called only by the one maser receiver int HDF5File::CreateVirtualFile(uint64_t numf) { - if (master && (*detIndex==0)) { - pthread_mutex_lock(&Mutex); - int ret = HDF5FileStatic::CreateVirtualDataFile( - virtualfd, masterFileName, - filePath, fileNamePrefix, *fileIndex, (*numImages > 1), - *detIndex, *numUnitsPerDetector, - // infinite images in 1 file, then maxfrperfile = numf - ((*maxFramesPerFile == 0) ? numf+1 : *maxFramesPerFile), - numf+1, - "data", datatype, - numDetY, numDetX, nPixelsY, ((*dynamicRange==4) ? (nPixelsX/2) : nPixelsX), - HDF5_WRITER_VERSION, - parameterNames, parameterDataTypes); - pthread_mutex_unlock(&Mutex); - return ret; - } - return OK; + pthread_mutex_lock(&Mutex); + int ret = HDF5FileStatic::CreateVirtualDataFile( + virtualfd, masterFileName, + filePath, fileNamePrefix, *fileIndex, (*numImages > 1), + *detIndex, *numUnitsPerDetector, + // infinite images in 1 file, then maxfrperfile = numf + ((*maxFramesPerFile == 0) ? numf+1 : *maxFramesPerFile), + numf+1, + "data", datatype, + numDetY, numDetX, nPixelsY, ((*dynamicRange==4) ? (nPixelsX/2) : nPixelsX), + HDF5_WRITER_VERSION, + parameterNames, parameterDataTypes); + pthread_mutex_unlock(&Mutex); + return ret; +} + +// called only by the one maser receiver +int HDF5File::LinkVirtualFileinMasterFile() { + //dataset name + ostringstream osfn; + osfn << "/data"; + if ((*numImages > 1)) osfn << "_f" << setfill('0') << setw(12) << 0; + string dsetname = osfn.str(); + + pthread_mutex_lock(&Mutex); + int ret = HDF5FileStatic::LinkVirtualInMaster(masterFileName, currentFileName, + dsetname, parameterNames); + pthread_mutex_unlock(&Mutex); + return ret; } diff --git a/slsReceiverSoftware/src/Listener.cpp b/slsReceiverSoftware/src/Listener.cpp index 2f9304879..7d8309ae8 100644 --- a/slsReceiverSoftware/src/Listener.cpp +++ b/slsReceiverSoftware/src/Listener.cpp @@ -40,6 +40,8 @@ Listener::Listener(int ind, detectorType dtype, Fifo*& f, runStatus* s, frameDiscardMode(fdp), activated(act), deactivatedPaddingEnable(depaden), + xcoord(0), + ycoord(0), acquisitionStartedFlag(false), measurementStartedFlag(false), firstAcquisitionIndex(0), @@ -292,6 +294,10 @@ int Listener::CreateDummySocketForUDPSocketBufferSize(uint32_t s) { return OK; } +void Listener::SetHardCodedCoords(uint16_t x, uint16_t y) { + xcoord = x; + ycoord = y; +} void Listener::ThreadExecution() { char* buffer; @@ -392,14 +398,21 @@ uint32_t Listener::ListenToAnImage(char* buf) { new_header = (sls_receiver_header*) (buf + FIFO_HEADER_NUMBYTES); // deactivated (eiger) - if (!(*activated)) {cprintf(RED,"deactivated receiver\n"); + if (!(*activated)) { // no padding - if (!(*deactivatedPaddingEnable)) { - return 0;} + if (!(*deactivatedPaddingEnable)) + return 0; // padding without setting bitmask (all missing packets padded in dataProcessor) if (currentFrameIndex >= *numImages) return 0; - new_header->detHeader.frameNumber = currentFrameIndex+1; //(eiger) + + //(eiger) first fnum starts at 1 + if (!currentFrameIndex) { + ++currentFrameIndex; + } + new_header->detHeader.frameNumber = currentFrameIndex; + new_header->detHeader.xCoord = xcoord; + new_header->detHeader.yCoord = ycoord; new_header->detHeader.detType = (uint8_t) generalData->myDetectorType; new_header->detHeader.version = (uint8_t) SLS_DETECTOR_HEADER_VERSION; return generalData->imageSize; @@ -439,6 +452,10 @@ uint32_t Listener::ListenToAnImage(char* buf) { break; } new_header->detHeader.packetNumber = numpackets; + if(isHeaderEmpty) { + new_header->detHeader.xCoord = xcoord; + new_header->detHeader.yCoord = ycoord; + } return generalData->imageSize; } @@ -476,6 +493,8 @@ uint32_t Listener::ListenToAnImage(char* buf) { // -------------------old header ------------------------------------------------------------------------------ else { new_header->detHeader.frameNumber = fnum; + new_header->detHeader.xCoord = xcoord; + new_header->detHeader.yCoord = ycoord; new_header->detHeader.detType = (uint8_t) generalData->myDetectorType; new_header->detHeader.version = (uint8_t) SLS_DETECTOR_HEADER_VERSION; } @@ -510,6 +529,10 @@ uint32_t Listener::ListenToAnImage(char* buf) { break; } new_header->detHeader.packetNumber = numpackets; //number of packets caught + if(isHeaderEmpty) { + new_header->detHeader.xCoord = xcoord; + new_header->detHeader.yCoord = ycoord; + } return generalData->imageSize; //empty packet now, but not empty image } @@ -565,6 +588,10 @@ uint32_t Listener::ListenToAnImage(char* buf) { break; } new_header->detHeader.packetNumber = numpackets; //number of packets caught + if(isHeaderEmpty) { + new_header->detHeader.xCoord = xcoord; + new_header->detHeader.yCoord = ycoord; + } return generalData->imageSize; } @@ -599,6 +626,8 @@ uint32_t Listener::ListenToAnImage(char* buf) { // -------------------old header ------------------------------------------------------------------------------ else { new_header->detHeader.frameNumber = fnum; + new_header->detHeader.xCoord = xcoord; + new_header->detHeader.yCoord = ycoord; new_header->detHeader.detType = (uint8_t) generalData->myDetectorType; new_header->detHeader.version = (uint8_t) SLS_DETECTOR_HEADER_VERSION; } diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index 5b2673a98..9118dcde8 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -424,6 +424,18 @@ void UDPStandardImplementation::setDetectorPositionId(const int i){ &detID, &numThreads, &numberOfFrames, &dynamicRange, &udpPortNum[i], generalData); } + + for (unsigned int i = 0; i < listener.size(); ++i) { + uint16_t x = 0, y = 0; + if (myDetectorType == EIGER || myDetectorType == JUNGFRAU) { + x = detID % numDet[1]; // row + y = (detID / numDet[1]) * ((myDetectorType == EIGER) ? 2 : 1) + i; // col for horiz. udp ports + } + // calculate x in 1d + else + x = detID * numThreads + i; + listener[i]->SetHardCodedCoords(x,y); + } }