From d2fd0cbee95d5f67af71858f0c84f33c5d6d94ba Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Mon, 23 Oct 2017 12:20:18 +0200 Subject: [PATCH] x y and z coordinates are pushed into eiger server and its fixed in appropriate client side as well --- slsDetectorSoftware/eigerDetectorServer/Beb.c | 78 +++++++++++++----- .../eigerDetectorServer/FebRegisterDefs.h | 7 +- .../bin/eigerDetectorServerv3.1.0.21.0 | Bin 293133 -> 293133 bytes .../eigerDetectorServer/gitInfo.txt | 8 +- .../eigerDetectorServer/gitInfoEiger.h | 8 +- .../slsDetector/slsDetector.cpp | 2 +- 6 files changed, 73 insertions(+), 30 deletions(-) diff --git a/slsDetectorSoftware/eigerDetectorServer/Beb.c b/slsDetectorSoftware/eigerDetectorServer/Beb.c index b9b3f42d0..b5d0a0065 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Beb.c +++ b/slsDetectorSoftware/eigerDetectorServer/Beb.c @@ -1136,10 +1136,17 @@ void Beb_SetDetectorNumber(uint32_t detid) { cprintf(BG_RED,"Set Detector ID FAIL\n"); return; }else{ - uint32_t value = Beb_Read32(csp0base, UDP_HEADER_A_OFST); + uint32_t value = Beb_Read32(csp0base, UDP_HEADER_A_LEFT_OFST); value &= UDP_HEADER_X_MSK; // to keep previous x value - Beb_Write32(csp0base, UDP_HEADER_A_OFST, value | ((swapid << UDP_HEADER_ID_OFST) & UDP_HEADER_ID_MSK)); - value = Beb_Read32(csp0base, UDP_HEADER_A_OFST); + Beb_Write32(csp0base, UDP_HEADER_A_LEFT_OFST, value | ((swapid << UDP_HEADER_ID_OFST) & UDP_HEADER_ID_MSK)); + value = Beb_Read32(csp0base, UDP_HEADER_A_LEFT_OFST); + if((value & UDP_HEADER_ID_MSK) != ((swapid << UDP_HEADER_ID_OFST) & UDP_HEADER_ID_MSK)) + cprintf(BG_RED,"Set Detector ID FAIL\n"); + + value = Beb_Read32(csp0base, UDP_HEADER_A_RIGHT_OFST); + value &= UDP_HEADER_X_MSK; // to keep previous x value + Beb_Write32(csp0base, UDP_HEADER_A_RIGHT_OFST, value | ((swapid << UDP_HEADER_ID_OFST) & UDP_HEADER_ID_MSK)); + value = Beb_Read32(csp0base, UDP_HEADER_A_RIGHT_OFST); if((value & UDP_HEADER_ID_MSK) != ((swapid << UDP_HEADER_ID_OFST) & UDP_HEADER_ID_MSK)) cprintf(BG_RED,"Set Detector ID FAIL\n"); @@ -1155,7 +1162,6 @@ int Beb_SetDetectorPosition(int pos[]) { return OK; pos[0] = Beb_swap_uint16(pos[0]); - pos[1] = Beb_swap_uint16(pos[1]); pos[2] = Beb_swap_uint16(pos[2]); int ret = FAIL; @@ -1169,26 +1175,55 @@ int Beb_SetDetectorPosition(int pos[]) { }else{ uint32_t value = 0; ret = OK; - // x - value = Beb_Read32(csp0base, UDP_HEADER_A_OFST); + // x left + 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_OFST, value | ((pos[0] << UDP_HEADER_X_OFST) & UDP_HEADER_X_MSK)); - value = Beb_Read32(csp0base, UDP_HEADER_A_OFST); + 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; - // y - // overwriting z anyway, so no need to look at previous z value - Beb_Write32(csp0base, UDP_HEADER_B_OFST, ((pos[1] << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK)); - value = Beb_Read32(csp0base, UDP_HEADER_B_OFST); - if(value != ((pos[1] << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK)) + // x right + 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 | ((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; - // z - value = Beb_Read32(csp0base, UDP_HEADER_B_OFST); + + + // y left + int posval = Beb_swap_uint16(pos[1]); + // overwriting z anyway, so no need to look at previous z value + 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 != ((posval << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK)) + ret = FAIL; + + // y right + posval = Beb_swap_uint16(pos[1]+1); + // overwriting z anyway, so no need to look at previous z value + 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 != ((posval << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK)) + ret = FAIL; + + + + // z left + value = Beb_Read32(csp0base, UDP_HEADER_B_LEFT_OFST); value &= UDP_HEADER_Y_MSK; // to keep previous y value - Beb_Write32(csp0base, UDP_HEADER_B_OFST, value | ((pos[2] << UDP_HEADER_Z_OFST) & UDP_HEADER_Z_MSK)); - value = Beb_Read32(csp0base, UDP_HEADER_B_OFST); + Beb_Write32(csp0base, UDP_HEADER_B_LEFT_OFST, value | ((pos[2] << UDP_HEADER_Z_OFST) & UDP_HEADER_Z_MSK)); + value = Beb_Read32(csp0base, UDP_HEADER_B_LEFT_OFST); + if((value & UDP_HEADER_Z_MSK) != ((pos[2] << UDP_HEADER_Z_OFST) & UDP_HEADER_Z_MSK)) + ret = FAIL; + + // z right + value = Beb_Read32(csp0base, UDP_HEADER_B_RIGHT_OFST); + value &= UDP_HEADER_Y_MSK; // to keep previous y value + Beb_Write32(csp0base, UDP_HEADER_B_RIGHT_OFST, value | ((pos[2] << UDP_HEADER_Z_OFST) & UDP_HEADER_Z_MSK)); + value = Beb_Read32(csp0base, UDP_HEADER_B_RIGHT_OFST); if((value & UDP_HEADER_Z_MSK) != ((pos[2] << UDP_HEADER_Z_OFST) & UDP_HEADER_Z_MSK)) ret = FAIL; @@ -1196,8 +1231,13 @@ int Beb_SetDetectorPosition(int pos[]) { //close file pointer Beb_close(fd,csp0base); } - if (ret == OK) - printf("Position set to [%d, %d, %d]\n", Beb_swap_uint16(pos[0]), Beb_swap_uint16(pos[1]), Beb_swap_uint16(pos[2])); + if (ret == OK) { + cprintf(BLUE, "Position set to...\n" + "Left: [%d, %d, %d]\n" + "Right:[%d, %d, %d]\n", + Beb_swap_uint16(pos[0]), pos[1], Beb_swap_uint16(pos[2]), + Beb_swap_uint16(pos[0]), pos[1]+1, Beb_swap_uint16(pos[2])); + } return ret; } diff --git a/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h b/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h index db90e07c2..87d4ae70a 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h +++ b/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h @@ -182,8 +182,11 @@ #define TEN_GIGA_RIGHT_FRAME_DELAY_COUNTER 0x1e4 // udp header (position, id) -#define UDP_HEADER_A_OFST 0x00C0 -#define UDP_HEADER_B_OFST 0x00E0 +#define UDP_HEADER_A_LEFT_OFST 0x00C0 +#define UDP_HEADER_B_LEFT_OFST 0x00E0 +#define UDP_HEADER_A_RIGHT_OFST 0x0100 +#define UDP_HEADER_B_RIGHT_OFST 0x0120 + #define UDP_HEADER_X_OFST (0) #define UDP_HEADER_X_MSK (0xFFFF << UDP_HEADER_X_OFST) #define UDP_HEADER_ID_OFST (16) diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.1.0.21.0 b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.1.0.21.0 index c0dd275d75135724173ffa2d7f9f820399055dbf..14a1b6b5e030b43952c2c685e15a5e185f40b1d7 100755 GIT binary patch delta 21002 zcmcht05sGt%!(UKG>^H4q~ zyvW>n7vpoH<)$thP!%P2?G7|S&NNJPos(+O>5@&lvgLB&(|u*T!OrJo?dpzh`9&e! zy}(y0N8K01=Tyn5_l-}Pn{VmJ-7TGT$!UWmDNHi(U`cE1sC#`%s@|xyndiEgbmuRc zB&k-zy@8(qUa8@Jzz+epX?O_m-M|YqJPi0I;CUJz0eqz?MUt|#hDbCl1VgHZM+1Kn zc%p{K0-pfftl{y%hXaq&@Fd{o+>Rrqr!ZqAh}2aV$9QrRsKRjq77HBTx^51gUr^Ney$Fwg+mbBI5m zS0jfHnZf7P$vH#(J?7P$bg%syDoG53G>buo80WjoRYT@_%`XROU8rQYgOqNPI`mU@ zm|rbN4qeLU*U2SA$ME@$a`Vvl_<}&Wbl4caAWUu<=Fb;I$bKPb`GQEfE@UoWkSIqC zUzHNyeD5l1ZS7Z4T99v&bP38>(t={ZsxhSnHo(zZdlg`l1~&i>Q{gxlz^XB&I6uIC zTDu9WsPoj2Xb{{qI1aF+!AT~GH)(JN;CcOMS-A#>0WQ^G z6W~G(hN3KAg;N$mQr*5Dezhc&n%1xT)n#KWXoNRi?VfYY`10Kmx_911u=gChZ(HP{R|T7#1Tn>1J` z7pB2EfP*#oFknBxy%99yg{Gbwp#rd*2G$-D-#@bZW_{i(b=a~SD zGorS?B&AK1^gG8&#+^?q+91q4<02bU<7MxO+q8k?vlCq)uc&@G(=e#18*{O`ML+1uJBZi)}OB*~TkoGX8}&r|+ms*xvT$=*@Q z@TRCAc|xTe74Pf1@l(fyW%IQ6`LhN&a5@awB*#n#77fhTHSN1ro~S3@=g$So-qGXv zGXb(W+Lu3@BRA|1l}n=!dOR1Z1jr6BSbwag;;+wz%1KY&;LjeG<7fB?V`t1*>R6Zc zKREQ2-Jd$hpRJWko*K%R1tl`TFd|9&`J5w|kWz57W z3l;Kb4dscFqJm-eB9BDFy(%OcrYv(C?2zX z6@R`;u3SE!Cwa;tD}2RlVpeQ`(-+mOc$x8}1TlVj(l(!@)X_#b{gSJ77QHSx^_*lh z>CD?(RZmzNU%Sn*?laqYqGbeMDanx*FQIz8Wv=r|Bet8LTshavb!KOWenpKIc*M#W zIrYqDdDr@I^eL)ZKMGCBhzbY!${e{kRavOo)F1iEMp*D^dC-Po>WGT(Vtg4|z(u%b2CfBH6^i`ry>7btYZZcL;oHq%^MzH|eI0Hc9gG ztQ5%wdb&KADzWhWlD9)qIXfMKV=(O~xndKdpAr-Or(Sh1+$nr&&vwESQ`05C` zkd&BFO}H?uPQ@0TD^J>MkxF??-~TvDJIuC8D+Ut1}*g-9-t zTim_P`me@LNK|O%we@oCF@J8+i?iIdKXddb3VEvw!BKXBOhe68S*UY6nN3^R2SOihl%0A;L+xTygS2ncf}7EfsR` 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 == EIGER) ? 2 : 1); // for horiz. udp ports } }