From b11b2dcfa983d5506a82019956b88079275e9770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A4=20Marie?= Date: Wed, 31 Jan 2018 11:45:34 +0100 Subject: [PATCH] in between stage --- .../mythen3DetectorServer/bf_init.sh | 1 + .../mythen3DetectorServer/err.txt | 602 ++ .../mythen3FunctionList.c | 1201 ++++ .../mythen3FunctionList.h | 249 + .../mythen3RegisterDefs.h | 551 ++ .../mythen3DetectorServer/mythen3Server | Bin 0 -> 92440 bytes .../mythen3DetectorServer/mythen3Server.gdb | Bin 0 -> 435662 bytes .../mythen3Server_defs.h | 93 + .../mythen3Server_funcs.c | 4916 +++++++++++++++++ .../mythen3Server_funcs.h | 94 + 10 files changed, 7707 insertions(+) create mode 100755 slsDetectorSoftware/mythen3DetectorServer/bf_init.sh create mode 100644 slsDetectorSoftware/mythen3DetectorServer/err.txt create mode 100644 slsDetectorSoftware/mythen3DetectorServer/mythen3FunctionList.c create mode 100644 slsDetectorSoftware/mythen3DetectorServer/mythen3FunctionList.h create mode 100644 slsDetectorSoftware/mythen3DetectorServer/mythen3RegisterDefs.h create mode 100755 slsDetectorSoftware/mythen3DetectorServer/mythen3Server create mode 100755 slsDetectorSoftware/mythen3DetectorServer/mythen3Server.gdb create mode 100644 slsDetectorSoftware/mythen3DetectorServer/mythen3Server_defs.h create mode 100755 slsDetectorSoftware/mythen3DetectorServer/mythen3Server_funcs.c create mode 100755 slsDetectorSoftware/mythen3DetectorServer/mythen3Server_funcs.h diff --git a/slsDetectorSoftware/mythen3DetectorServer/bf_init.sh b/slsDetectorSoftware/mythen3DetectorServer/bf_init.sh new file mode 100755 index 000000000..88eccadb4 --- /dev/null +++ b/slsDetectorSoftware/mythen3DetectorServer/bf_init.sh @@ -0,0 +1 @@ +export PATH=/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin:$PATH diff --git a/slsDetectorSoftware/mythen3DetectorServer/err.txt b/slsDetectorSoftware/mythen3DetectorServer/err.txt new file mode 100644 index 000000000..530f6676f --- /dev/null +++ b/slsDetectorSoftware/mythen3DetectorServer/err.txt @@ -0,0 +1,602 @@ +rm -rf mythen3Server *.o +echo slsDetectorServer.o mythen3Server_funcs.o communication_funcs.o mythen3FunctionList.o +slsDetectorServer.o mythen3Server_funcs.o communication_funcs.o mythen3FunctionList.o +bfin-uclinux-gcc slsDetectorServer.c mythen3Server_funcs.c communication_funcs.c mythen3FunctionList.c -Wall -DVIRTUAL -DDACS_INT -DMYTHEN3D -DVERBOSE -DSLS_DETECTOR_FUNCTION_LIST -lm -I. -I../../slsReceiverSoftware/include/ -o mythen3Server +In file included from /afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:27, + from communication_funcs.h:7, + from mythen3Server_funcs.c:5: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/uio.h: In function ‘setDAC’: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/uio.h:40: error: storage class specified for parameter ‘readv’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/uio.h:50: error: storage class specified for parameter ‘writev’ +In file included from /afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:35, + from communication_funcs.h:7, + from mythen3Server_funcs.c:5: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/bits/socket.h:36: error: storage class specified for parameter ‘socklen_t’ +In file included from /afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/bits/socket.h:142, + from /afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:35, + from communication_funcs.h:7, + from mythen3Server_funcs.c:5: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/bits/sockaddr.h:29: error: storage class specified for parameter ‘sa_family_t’ +In file included from /afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:35, + from communication_funcs.h:7, + from mythen3Server_funcs.c:5: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/bits/socket.h:147: error: expected specifier-qualifier-list before ‘sa_family_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/bits/socket.h:164: error: expected specifier-qualifier-list before ‘sa_family_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/bits/socket.h:223: error: expected specifier-qualifier-list before ‘socklen_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/bits/socket.h:271: error: storage class specified for parameter ‘__cmsg_nxthdr’ +In file included from communication_funcs.h:7, + from mythen3Server_funcs.c:5: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:100: error: storage class specified for parameter ‘socket’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:107: error: storage class specified for parameter ‘socketpair’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:110: error: expected declaration specifiers or ‘...’ before ‘socklen_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:111: error: storage class specified for parameter ‘bind’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:115: error: expected declaration specifiers or ‘...’ before ‘socklen_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:115: error: storage class specified for parameter ‘getsockname’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:124: error: expected declaration specifiers or ‘...’ before ‘socklen_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:124: error: storage class specified for parameter ‘connect’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:129: error: expected declaration specifiers or ‘...’ before ‘socklen_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:129: error: storage class specified for parameter ‘getpeername’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:136: error: storage class specified for parameter ‘send’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:143: error: storage class specified for parameter ‘recv’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:152: error: expected declaration specifiers or ‘...’ before ‘socklen_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:152: error: storage class specified for parameter ‘sendto’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:163: error: expected declaration specifiers or ‘...’ before ‘socklen_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:163: error: storage class specified for parameter ‘recvfrom’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:172: error: storage class specified for parameter ‘sendmsg’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:179: error: storage class specified for parameter ‘recvmsg’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:187: error: expected declaration specifiers or ‘...’ before ‘socklen_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:187: error: storage class specified for parameter ‘getsockopt’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:193: error: expected declaration specifiers or ‘...’ before ‘socklen_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:193: error: storage class specified for parameter ‘setsockopt’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:199: error: storage class specified for parameter ‘listen’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:210: error: expected declaration specifiers or ‘...’ before ‘socklen_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:210: error: storage class specified for parameter ‘accept’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:218: error: storage class specified for parameter ‘shutdown’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/socket.h:231: error: storage class specified for parameter ‘isfdtype’ +In file included from /afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/arpa/inet.h:23, + from communication_funcs.h:10, + from mythen3Server_funcs.c:5: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netinet/in.h:93: error: storage class specified for parameter ‘in_port_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netinet/in.h:137: error: storage class specified for parameter ‘in_addr_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netinet/in.h:140: error: expected specifier-qualifier-list before ‘in_addr_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netinet/in.h:207: error: storage class specified for parameter ‘in6addr_any’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netinet/in.h:208: error: storage class specified for parameter ‘in6addr_loopback’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netinet/in.h:223: error: expected specifier-qualifier-list before ‘sa_family_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netinet/in.h:238: error: expected specifier-qualifier-list before ‘sa_family_t’ +In file included from /afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/arpa/inet.h:23, + from communication_funcs.h:10, + from mythen3Server_funcs.c:5: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netinet/in.h:357: error: storage class specified for parameter ‘ntohl’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netinet/in.h:359: error: storage class specified for parameter ‘ntohs’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netinet/in.h:361: error: storage class specified for parameter ‘htonl’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netinet/in.h:363: error: storage class specified for parameter ‘htons’ +In file included from /afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/arpa/inet.h:23, + from communication_funcs.h:10, + from mythen3Server_funcs.c:5: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netinet/in.h:431: error: storage class specified for parameter ‘bindresvport’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netinet/in.h:435: error: storage class specified for parameter ‘bindresvport6’ +In file included from communication_funcs.h:10, + from mythen3Server_funcs.c:5: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/arpa/inet.h:35: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘inet_addr’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/arpa/inet.h:38: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘inet_lnaof’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/arpa/inet.h:42: error: expected ‘)’ before ‘__net’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/arpa/inet.h:46: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘inet_netof’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/arpa/inet.h:50: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘inet_network’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/arpa/inet.h:54: error: storage class specified for parameter ‘inet_ntoa’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/arpa/inet.h:56: error: storage class specified for parameter ‘inet_ntoa_r’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/arpa/inet.h:62: error: storage class specified for parameter ‘inet_pton’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/arpa/inet.h:68: error: expected declaration specifiers or ‘...’ before ‘socklen_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/arpa/inet.h:69: error: storage class specified for parameter ‘inet_ntop’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/arpa/inet.h:76: error: storage class specified for parameter ‘inet_aton’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/arpa/inet.h:80: error: expected ‘)’ before ‘__net’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/arpa/inet.h:86: error: storage class specified for parameter ‘inet_net_ntop’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/arpa/inet.h:92: error: storage class specified for parameter ‘inet_net_pton’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/arpa/inet.h:98: error: storage class specified for parameter ‘inet_nsap_addr’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/arpa/inet.h:103: error: storage class specified for parameter ‘inet_nsap_ntoa’ +In file included from /afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:33, + from communication_funcs.h:11, + from mythen3Server_funcs.c:5: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/rpc/netdb.h:53: error: storage class specified for parameter ‘setrpcent’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/rpc/netdb.h:54: error: storage class specified for parameter ‘endrpcent’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/rpc/netdb.h:55: error: storage class specified for parameter ‘getrpcbyname’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/rpc/netdb.h:56: error: storage class specified for parameter ‘getrpcbynumber’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/rpc/netdb.h:57: error: storage class specified for parameter ‘getrpcent’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/rpc/netdb.h:62: error: storage class specified for parameter ‘getrpcbyname_r’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/rpc/netdb.h:66: error: storage class specified for parameter ‘getrpcbynumber_r’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/rpc/netdb.h:69: error: storage class specified for parameter ‘getrpcent_r’ +In file included from communication_funcs.h:11, + from mythen3Server_funcs.c:5: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:60: error: storage class specified for parameter ‘h_errno’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:66: error: storage class specified for parameter ‘__h_errno_location’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:93: error: storage class specified for parameter ‘herror’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:96: error: storage class specified for parameter ‘hstrerror’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:116: error: storage class specified for parameter ‘sethostent’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:122: error: storage class specified for parameter ‘endhostent’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:129: error: storage class specified for parameter ‘gethostent’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:137: error: storage class specified for parameter ‘gethostbyaddr’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:143: error: storage class specified for parameter ‘gethostbyname’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:154: error: storage class specified for parameter ‘gethostbyname2’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:169: error: storage class specified for parameter ‘gethostent_r’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:176: error: storage class specified for parameter ‘gethostbyaddr_r’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:182: error: storage class specified for parameter ‘gethostbyname_r’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:188: error: storage class specified for parameter ‘gethostbyname2_r’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:197: error: storage class specified for parameter ‘setnetent’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:203: error: storage class specified for parameter ‘endnetent’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:210: error: storage class specified for parameter ‘getnetent’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:217: error: storage class specified for parameter ‘getnetbyaddr’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:223: error: storage class specified for parameter ‘getnetbyname’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:272: error: storage class specified for parameter ‘setservent’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:278: error: storage class specified for parameter ‘endservent’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:285: error: storage class specified for parameter ‘getservent’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:293: error: storage class specified for parameter ‘getservbyname’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:300: error: storage class specified for parameter ‘getservbyport’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:313: error: storage class specified for parameter ‘getservent_r’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:319: error: storage class specified for parameter ‘getservbyname_r’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:324: error: storage class specified for parameter ‘getservbyport_r’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:341: error: storage class specified for parameter ‘setprotoent’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:347: error: storage class specified for parameter ‘endprotoent’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:354: error: storage class specified for parameter ‘getprotoent’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:360: error: storage class specified for parameter ‘getprotobyname’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:366: error: storage class specified for parameter ‘getprotobynumber’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:379: error: storage class specified for parameter ‘getprotoent_r’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:384: error: storage class specified for parameter ‘getprotobyname_r’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:389: error: storage class specified for parameter ‘getprotobynumber_r’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:446: error: storage class specified for parameter ‘ruserpass’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:464: error: storage class specified for parameter ‘rcmd’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:495: error: storage class specified for parameter ‘rexec’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:508: error: expected declaration specifiers or ‘...’ before ‘sa_family_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:508: error: storage class specified for parameter ‘rexec_af’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:519: error: storage class specified for parameter ‘ruserok’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:543: error: storage class specified for parameter ‘rresvport’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:568: error: expected specifier-qualifier-list before ‘socklen_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:640: error: storage class specified for parameter ‘getaddrinfo’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:643: error: storage class specified for parameter ‘freeaddrinfo’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:646: error: storage class specified for parameter ‘gai_strerror’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:653: error: expected declaration specifiers or ‘...’ before ‘socklen_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:654: error: expected declaration specifiers or ‘...’ before ‘socklen_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:655: error: expected declaration specifiers or ‘...’ before ‘socklen_t’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/netdb.h:655: error: storage class specified for parameter ‘getnameinfo’ +In file included from communication_funcs.h:13, + from mythen3Server_funcs.c:5: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:256: error: storage class specified for parameter ‘access’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:299: error: storage class specified for parameter ‘lseek’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:318: error: storage class specified for parameter ‘close’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:325: error: storage class specified for parameter ‘read’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:331: error: storage class specified for parameter ‘write’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:382: error: storage class specified for parameter ‘pipe’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:391: error: storage class specified for parameter ‘alarm’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:403: error: storage class specified for parameter ‘sleep’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:411: error: storage class specified for parameter ‘ualarm’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:418: error: storage class specified for parameter ‘usleep’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:427: error: storage class specified for parameter ‘pause’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:432: error: storage class specified for parameter ‘chown’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:436: error: storage class specified for parameter ‘fchown’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:442: error: storage class specified for parameter ‘lchown’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:455: error: storage class specified for parameter ‘chdir’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:459: error: storage class specified for parameter ‘fchdir’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:469: error: storage class specified for parameter ‘getcwd’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:488: error: storage class specified for parameter ‘dup’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:491: error: storage class specified for parameter ‘dup2’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:494: error: storage class specified for parameter ‘__environ’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:503: error: storage class specified for parameter ‘execve’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:515: error: storage class specified for parameter ‘execv’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:520: error: storage class specified for parameter ‘execle’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:525: error: storage class specified for parameter ‘execl’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:530: error: storage class specified for parameter ‘execvp’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:536: error: storage class specified for parameter ‘execlp’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:541: error: storage class specified for parameter ‘nice’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:546: error: storage class specified for parameter ‘_exit’ +In file included from communication_funcs.h:13, + from mythen3Server_funcs.c:5: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:556: error: storage class specified for parameter ‘pathconf’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:559: error: storage class specified for parameter ‘fpathconf’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:562: error: storage class specified for parameter ‘sysconf’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:566: error: storage class specified for parameter ‘confstr’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:571: error: storage class specified for parameter ‘getpid’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:574: error: storage class specified for parameter ‘getppid’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:579: error: storage class specified for parameter ‘getpgrp’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:589: error: storage class specified for parameter ‘__getpgid’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:598: error: storage class specified for parameter ‘setpgid’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:615: error: storage class specified for parameter ‘setpgrp’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:632: error: storage class specified for parameter ‘setsid’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:640: error: storage class specified for parameter ‘getuid’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:643: error: storage class specified for parameter ‘geteuid’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:646: error: storage class specified for parameter ‘getgid’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:649: error: storage class specified for parameter ‘getegid’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:654: error: storage class specified for parameter ‘getgroups’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:665: error: storage class specified for parameter ‘setuid’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:670: error: storage class specified for parameter ‘setreuid’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:675: error: storage class specified for parameter ‘seteuid’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:682: error: storage class specified for parameter ‘setgid’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:687: error: storage class specified for parameter ‘setregid’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:692: error: storage class specified for parameter ‘setegid’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:732: error: storage class specified for parameter ‘vfork’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:738: error: storage class specified for parameter ‘ttyname’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:743: error: storage class specified for parameter ‘ttyname_r’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:747: error: storage class specified for parameter ‘isatty’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:759: error: storage class specified for parameter ‘link’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:772: error: storage class specified for parameter ‘symlink’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:779: error: storage class specified for parameter ‘readlink’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:794: error: storage class specified for parameter ‘unlink’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:803: error: storage class specified for parameter ‘rmdir’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:807: error: storage class specified for parameter ‘tcgetpgrp’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:810: error: storage class specified for parameter ‘tcsetpgrp’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:817: error: storage class specified for parameter ‘getlogin’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:825: error: storage class specified for parameter ‘getlogin_r’ +In file included from /afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:840, + from communication_funcs.h:13, + from mythen3Server_funcs.c:5: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/bits/getopt.h:61: error: storage class specified for parameter ‘optarg’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/bits/getopt.h:75: error: storage class specified for parameter ‘optind’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/bits/getopt.h:80: error: storage class specified for parameter ‘opterr’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/bits/getopt.h:84: error: storage class specified for parameter ‘optopt’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/bits/getopt.h:155: error: storage class specified for parameter ‘getopt’ +In file included from communication_funcs.h:13, + from mythen3Server_funcs.c:5: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:848: error: storage class specified for parameter ‘gethostname’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:856: error: storage class specified for parameter ‘sethostname’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:860: error: storage class specified for parameter ‘sethostid’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:867: error: storage class specified for parameter ‘getdomainname’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:869: error: storage class specified for parameter ‘setdomainname’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:875: error: storage class specified for parameter ‘vhangup’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:896: error: storage class specified for parameter ‘acct’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:900: error: storage class specified for parameter ‘getusershell’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:901: error: storage class specified for parameter ‘endusershell’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:902: error: storage class specified for parameter ‘setusershell’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:908: error: storage class specified for parameter ‘daemon’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:915: error: storage class specified for parameter ‘chroot’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:919: error: storage class specified for parameter ‘getpass’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:928: error: storage class specified for parameter ‘fsync’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:935: error: storage class specified for parameter ‘gethostid’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:938: error: storage class specified for parameter ‘sync’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:943: error: storage class specified for parameter ‘getpagesize’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:948: error: storage class specified for parameter ‘getdtablesize’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:954: error: storage class specified for parameter ‘truncate’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:975: error: storage class specified for parameter ‘ftruncate’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:995: error: storage class specified for parameter ‘brk’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:1001: error: storage class specified for parameter ‘sbrk’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:1016: error: storage class specified for parameter ‘syscall’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:1039: error: storage class specified for parameter ‘lockf’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/unistd.h:1071: error: storage class specified for parameter ‘fdatasync’ +In file included from communication_funcs.h:15, + from mythen3Server_funcs.c:5: +sls_detector_defs.h:594: error: expected declaration specifiers before ‘;’ token +In file included from mythen3Server_funcs.c:5: +communication_funcs.h:24: error: storage class specified for parameter ‘intType’ +communication_funcs.h:34: error: expected declaration specifiers or ‘...’ before ‘intType’ +communication_funcs.h:35: error: expected declaration specifiers or ‘...’ before ‘intType’ +communication_funcs.h:36: error: expected declaration specifiers or ‘...’ before ‘intType’ +In file included from mythen3RegisterDefs.h:5, + from mythen3Server_funcs.c:7: +sls_detector_defs.h:594: error: expected declaration specifiers before ‘;’ token +In file included from mythen3Server_funcs.c:7: +mythen3RegisterDefs.h:456: warning: empty declaration +In file included from blackfin.h:7, + from mythen3Server_funcs.c:8: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/fcntl.h:74: error: storage class specified for parameter ‘fcntl’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/fcntl.h:93: error: storage class specified for parameter ‘open’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/fcntl.h:138: error: storage class specified for parameter ‘creat’ +In file included from blackfin.h:8, + from mythen3Server_funcs.c:8: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:59: error: storage class specified for parameter ‘mmap’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:77: error: storage class specified for parameter ‘munmap’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:82: error: storage class specified for parameter ‘mprotect’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:97: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:104: error: storage class specified for parameter ‘madvise’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:134: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:135: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:136: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:137: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:148: error: storage class specified for parameter ‘mincore’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:168: error: storage class specified for parameter ‘shm_open’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:171: error: storage class specified for parameter ‘shm_unlink’ +In file included from mythen3Server_funcs.c:8: +blackfin.h:12: error: parameter ‘CSP0BASE’ is initialized +blackfin.h:23: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +blackfin.h:34: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +blackfin.h:45: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +blackfin.h:56: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +blackfin.h:68: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +blackfin.h:86: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +blackfin.h:105: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +blackfin.h:114: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +blackfin.h:123: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +In file included from mythen3Server_funcs.c:11: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:40: error: storage class specified for parameter ‘memcpy’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:44: error: storage class specified for parameter ‘memmove’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:53: error: storage class specified for parameter ‘memccpy’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:59: error: storage class specified for parameter ‘memset’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:63: error: storage class specified for parameter ‘memcmp’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:67: error: storage class specified for parameter ‘memchr’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:85: error: storage class specified for parameter ‘strcpy’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:89: error: storage class specified for parameter ‘strncpy’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:93: error: storage class specified for parameter ‘strcat’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:96: error: storage class specified for parameter ‘strncat’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:100: error: storage class specified for parameter ‘strcmp’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:103: error: storage class specified for parameter ‘strncmp’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:107: error: storage class specified for parameter ‘strcoll’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:111: error: storage class specified for parameter ‘strxfrm’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:131: error: storage class specified for parameter ‘strdup’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:168: error: storage class specified for parameter ‘strchr’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:171: error: storage class specified for parameter ‘strrchr’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:185: error: storage class specified for parameter ‘strcspn’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:189: error: storage class specified for parameter ‘strspn’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:192: error: storage class specified for parameter ‘strpbrk’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:195: error: storage class specified for parameter ‘strstr’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:200: error: storage class specified for parameter ‘strtok’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:214: error: storage class specified for parameter ‘strtok_r’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:247: error: storage class specified for parameter ‘strlen’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:260: error: storage class specified for parameter ‘strerror’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:286: error: storage class specified for parameter ‘__glibc_strerror_r’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:288: error: storage class specified for parameter ‘strerror_r’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:307: error: storage class specified for parameter ‘bcopy’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:310: error: storage class specified for parameter ‘bzero’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:314: error: storage class specified for parameter ‘bcmp’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:318: error: storage class specified for parameter ‘index’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:322: error: storage class specified for parameter ‘rindex’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:339: error: storage class specified for parameter ‘ffs’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:353: error: storage class specified for parameter ‘strcasecmp’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:357: error: storage class specified for parameter ‘strncasecmp’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:377: error: storage class specified for parameter ‘strsep’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:430: error: storage class specified for parameter ‘strlcat’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:432: error: storage class specified for parameter ‘strlcpy’ +mythen3Server_funcs.c:16: error: storage class specified for parameter ‘lockStatus’ +mythen3Server_funcs.c:17: error: storage class specified for parameter ‘lastClientIP’ +mythen3Server_funcs.c:18: error: storage class specified for parameter ‘thisClientIP’ +mythen3Server_funcs.c:19: error: storage class specified for parameter ‘differentClients’ +mythen3Server_funcs.c:40: error: parameter ‘myDetectorType’ is initialized +mythen3Server_funcs.c:45: error: parameter ‘dataBytes’ is initialized +mythen3Server_funcs.c:46: error: parameter ‘isControlServer’ is initialized +mythen3Server_funcs.c:47: error: parameter ‘debugflag’ is initialized +mythen3Server_funcs.c:49: error: parameter ‘N_DAC’ is initialized +mythen3Server_funcs.c:50: error: parameter ‘N_PWR’ is initialized +mythen3Server_funcs.c:52: error: parameter ‘vPowerLimit’ is initialized +mythen3Server_funcs.c:56: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:61: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:69: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:92: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:124: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:203: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:295: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:321: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:361: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:380: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:408: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:462: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:505: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:579: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:642: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:724: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:836: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:855: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:874: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:894: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:1239: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:1340: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:1398: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:1441: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:1459: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:1478: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:1549: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:1620: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:1641: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:1717: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:1784: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:1805: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:2020: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:2135: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:2155: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:2221: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:2278: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:2349: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:2386: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:2425: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:2475: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:2502: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:2532: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:2577: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:2595: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:2686: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:2766: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:2865: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:2949: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:3049: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:3128: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:3215: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:3229: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:3271: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:3286: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:3350: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:3359: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:3489: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:3618: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:3696: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:3747: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:3796: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:3857: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:3911: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:3971: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:4031: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:4102: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:4121: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:4179: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:4238: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:4290: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:4344: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:4397: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:4471: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:4515: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:4604: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:4747: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:4792: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:4858: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:4918: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:4963: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3Server_funcs.c:5007: error: old-style parameter declarations in prototyped function definition +mythen3Server_funcs.c:5005: error: expected ‘{’ at end of input +communication_funcs.c: In function ‘receiveModuleGeneral’: +communication_funcs.c:540: warning: unused variable ‘id’ +In file included from blackfin.h:7, + from commonServerFunctions.h:5, + from AD9257.h:6, + from mythen3FunctionList.c:5: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/fcntl.h: In function ‘setDAC’: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/fcntl.h:74: error: storage class specified for parameter ‘fcntl’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/fcntl.h:93: error: storage class specified for parameter ‘open’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/fcntl.h:138: error: storage class specified for parameter ‘creat’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/fcntl.h:167: error: storage class specified for parameter ‘lockf’ +In file included from blackfin.h:8, + from commonServerFunctions.h:5, + from AD9257.h:6, + from mythen3FunctionList.c:5: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:59: error: storage class specified for parameter ‘mmap’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:77: error: storage class specified for parameter ‘munmap’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:82: error: storage class specified for parameter ‘mprotect’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:97: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:104: error: storage class specified for parameter ‘madvise’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:134: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:135: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:136: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:137: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:148: error: storage class specified for parameter ‘mincore’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:168: error: storage class specified for parameter ‘shm_open’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/sys/mman.h:171: error: storage class specified for parameter ‘shm_unlink’ +In file included from commonServerFunctions.h:5, + from AD9257.h:6, + from mythen3FunctionList.c:5: +blackfin.h:12: error: parameter ‘CSP0BASE’ is initialized +blackfin.h:23: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +blackfin.h:34: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +blackfin.h:45: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +blackfin.h:56: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +blackfin.h:68: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +blackfin.h:86: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +blackfin.h:105: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +blackfin.h:114: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +blackfin.h:123: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +In file included from AD9257.h:6, + from mythen3FunctionList.c:5: +commonServerFunctions.h:9: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +In file included from mythen3FunctionList.c:5: +AD9257.h:80: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +AD9257.h:89: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +In file included from mythen3FunctionList.c:8: +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:40: error: storage class specified for parameter ‘memcpy’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:44: error: storage class specified for parameter ‘memmove’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:53: error: storage class specified for parameter ‘memccpy’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:59: error: storage class specified for parameter ‘memset’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:63: error: storage class specified for parameter ‘memcmp’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:67: error: storage class specified for parameter ‘memchr’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:85: error: storage class specified for parameter ‘strcpy’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:89: error: storage class specified for parameter ‘strncpy’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:93: error: storage class specified for parameter ‘strcat’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:96: error: storage class specified for parameter ‘strncat’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:100: error: storage class specified for parameter ‘strcmp’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:103: error: storage class specified for parameter ‘strncmp’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:107: error: storage class specified for parameter ‘strcoll’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:111: error: storage class specified for parameter ‘strxfrm’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:131: error: storage class specified for parameter ‘strdup’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:168: error: storage class specified for parameter ‘strchr’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:171: error: storage class specified for parameter ‘strrchr’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:185: error: storage class specified for parameter ‘strcspn’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:189: error: storage class specified for parameter ‘strspn’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:192: error: storage class specified for parameter ‘strpbrk’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:195: error: storage class specified for parameter ‘strstr’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:200: error: storage class specified for parameter ‘strtok’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:214: error: storage class specified for parameter ‘strtok_r’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:247: error: storage class specified for parameter ‘strlen’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:260: error: storage class specified for parameter ‘strerror’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:286: error: storage class specified for parameter ‘__glibc_strerror_r’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:288: error: storage class specified for parameter ‘strerror_r’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:307: error: storage class specified for parameter ‘bcopy’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:310: error: storage class specified for parameter ‘bzero’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:314: error: storage class specified for parameter ‘bcmp’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:318: error: storage class specified for parameter ‘index’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:322: error: storage class specified for parameter ‘rindex’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:339: error: storage class specified for parameter ‘ffs’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:353: error: storage class specified for parameter ‘strcasecmp’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:357: error: storage class specified for parameter ‘strncasecmp’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:377: error: storage class specified for parameter ‘strsep’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:430: error: storage class specified for parameter ‘strlcat’ +/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin/../bfin-uclinux/runtime/usr/include/string.h:432: error: storage class specified for parameter ‘strlcpy’ +mythen3FunctionList.c:11: error: parameter ‘nChans’ is initialized +mythen3FunctionList.c:12: error: parameter ‘nChips’ is initialized +mythen3FunctionList.c:13: error: parameter ‘nDacs’ is initialized +mythen3FunctionList.c:14: error: parameter ‘nAdcs’ is initialized +mythen3FunctionList.c:15: error: parameter ‘allSelected’ is initialized +mythen3FunctionList.c:16: error: parameter ‘noneSelected’ is initialized +mythen3FunctionList.c:18: error: parameter ‘detectorModules’ is initialized +mythen3FunctionList.c:19: error: parameter ‘detectorChips’ is initialized +mythen3FunctionList.c:20: error: parameter ‘detectorChans’ is initialized +mythen3FunctionList.c:21: error: parameter ‘detectorDacs’ is initialized +mythen3FunctionList.c:22: error: parameter ‘detectorAdcs’ is initialized +mythen3FunctionList.c:24: error: parameter ‘nModY’ is initialized +mythen3FunctionList.c:25: error: parameter ‘nModX’ is initialized +mythen3FunctionList.c:26: error: parameter ‘dynamicRange’ is initialized +mythen3FunctionList.c:27: error: parameter ‘dataBytes’ is initialized +mythen3FunctionList.c:28: error: parameter ‘masterMode’ is initialized +mythen3FunctionList.c:29: error: parameter ‘syncMode’ is initialized +mythen3FunctionList.c:30: error: parameter ‘timingMode’ is initialized +mythen3FunctionList.c:37: error: storage class specified for parameter ‘dataBytes’ +mythen3FunctionList.c:37: error: redefinition of parameter ‘dataBytes’ +mythen3FunctionList.c:27: error: previous definition of ‘dataBytes’ was here +mythen3FunctionList.c:40: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:89: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:110: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:116: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:127: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:136: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:145: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:164: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:176: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:188: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:197: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:203: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:235: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:256: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:356: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:492: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:500: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:507: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:514: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:520: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:525: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:530: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:535: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:542: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:550: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:557: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:568: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:576: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:583: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:590: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:599: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:668: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:682: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:688: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:696: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:702: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:716: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:724: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:730: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:736: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:741: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:746: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:751: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:756: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:760: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:761: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:762: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:763: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:764: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:765: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:766: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:767: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:775: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:785: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:836: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:954: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:1086: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token +mythen3FunctionList.c:1197: error: old-style parameter declarations in prototyped function definition +mythen3FunctionList.c:1193: error: expected ‘{’ at end of input +make: *** [mythen3Server] Error 1 diff --git a/slsDetectorSoftware/mythen3DetectorServer/mythen3FunctionList.c b/slsDetectorSoftware/mythen3DetectorServer/mythen3FunctionList.c new file mode 100644 index 000000000..04623d1b9 --- /dev/null +++ b/slsDetectorSoftware/mythen3DetectorServer/mythen3FunctionList.c @@ -0,0 +1,1201 @@ +#ifdef SLS_DETECTOR_FUNCTION_LIST + +#include "mythen3FunctionList.h" +#include "mythen3RegisterDefs.h" +#include "mythen3Server_defs.h" +#include "blackfin.h" +// #include "AD9257.h" + +#include +#include + + +const int nChans=NCHAN; +const int nChips=NCHIP; +const int nDacs=NDAC; +const int nAdcs=NADC; +const int allSelected=-2; +const int noneSelected=-1; + +sls_detector_module *detectorModules=NULL; +int *detectorChips=NULL; +int *detectorChans=NULL; +dacs_t *detectorDacs=NULL; +dacs_t *detectorAdcs=NULL; + +int nModY = NMAXMOD; +int nModX = NMAXMOD; +int dynamicRange= DYNAMIC_RANGE; +// int dataBytes = NMAXMOD*NCHIP*NCHAN*2; +int masterMode = NO_MASTER; +int syncMode = NO_SYNCHRONIZATION; +int timingMode = AUTO_TIMING; + +int vLimit=-100; + +enum detectorSettings thisSettings; +int sChan, sChip, sMod, sDac, sAdc; +int nModBoard; +extern int dataBytes; +extern enum detectorType myDetectorType; +extern int N_DAC; + +int initializeDetectorStructure(){ + + int imod; + int n=getNModBoard(X)*getNModBoard(Y); +#ifdef VERBOSE + printf("Board is for %d modules\n",n); +#endif + detectorModules=malloc(n*sizeof(sls_detector_module)); + detectorChips=malloc(n*NCHIP*sizeof(int)); + detectorChans=malloc(n*NCHIP*NCHAN*sizeof(int)); + detectorDacs=malloc(n*NDAC*sizeof(int)); + detectorAdcs=malloc(n*NADC*sizeof(int)); +#ifdef VERBOSE + printf("modules from 0x%x to 0x%x\n",(unsigned int)(detectorModules), (unsigned int)(detectorModules+n)); + printf("chips from 0x%x to 0x%x\n",(unsigned int)(detectorChips), (unsigned int)(detectorChips+n*NCHIP)); + printf("chans from 0x%x to 0x%x\n",(unsigned int)(detectorChans), (unsigned int)(detectorChans+n*NCHIP*NCHAN)); + printf("dacs from 0x%x to 0x%x\n",(unsigned int)(detectorDacs), (unsigned int)(detectorDacs+n*NDAC)); + printf("adcs from 0x%x to 0x%x\n",(unsigned int)(detectorAdcs), (unsigned int)(detectorAdcs+n*NADC)); +#endif + for (imod=0; imoddacs=detectorDacs+imod*NDAC; + (detectorModules+imod)->adcs=detectorAdcs+imod*NADC; + (detectorModules+imod)->chipregs=detectorChips+imod*NCHIP; + (detectorModules+imod)->chanregs=detectorChans+imod*NCHIP*NCHAN; + (detectorModules+imod)->ndac=NDAC; + (detectorModules+imod)->nadc=NADC; + (detectorModules+imod)->nchip=NCHIP; + (detectorModules+imod)->nchan=NCHIP*NCHAN; + (detectorModules+imod)->module=imod; + (detectorModules+imod)->gain=0; + (detectorModules+imod)->offset=0; + (detectorModules+imod)->reg=0; + /* initialize registers, dacs, retrieve sn, adc values etc */ + } + thisSettings=UNINITIALIZED; + sChan=noneSelected; + sChip=noneSelected; + sMod=noneSelected; + sDac=noneSelected; + sAdc=noneSelected; + + return OK; +} + + + + + + +int setupDetector(){ + //testFpga(); + //testRAM(); + + //setSettings(GET_SETTINGS,-1); + //setFrames(1); + //setTrains(1); + //setExposureTime(1e6); + //setPeriod(1e9); + //setDelay(0); + //setGates(0); + + //setTiming(GET_EXTERNAL_COMMUNICATION_MODE); + //setMaster(GET_MASTER); + //setSynchronization(GET_SYNCHRONIZATION_MODE); + return OK; +} + + + + +int setNMod(int nm, enum dimension dim){ + return 1; +} + + + +int getNModBoard(enum dimension arg){ + return 1; +} + + + + + + + + +int64_t getModuleId(enum idMode arg, int imod){ + //DETECTOR_SERIAL_NUMBER + //DETECTOR_FIRMWARE_VERSION + return 0; +} + + + + +int64_t getDetectorId(enum idMode arg){ + //DETECTOR_SOFTWARE_VERSION defined in slsDetector_defs.h? + return 0; +} + + + + + +int moduleTest( enum digitalTestMode arg, int imod){ + //template testShiftIn from mcb_funcs.c + + //CHIP_TEST + //testShiftIn + //testShiftOut + //testShiftStSel + //testDataInOutMux + //testExtPulseMux + //testOutMux + //testFpgaMux + + return OK; +} + + + + + +int detectorTest( enum digitalTestMode arg){ + //templates from firmware_funcs.c + + //DETECTOR_FIRMWARE_TEST:testFpga() + //DETECTOR_MEMORY_TEST:testRAM() + //DETECTOR_BUS_TEST:testBus() + //DETECTOR_SOFTWARE_TEST:testFpga() + return OK; +} + +int getDacRegister(int dacnum) { + + bus_w(DAC_NUM_REG, dacnum); + printf("READ dac register value %d address %d\n",(int16_t)bus_r(DAC_VAL_REG),bus_r(DAC_NUM_REG)) ; + return (int16_t)bus_r(DAC_VAL_REG); +} + +int setDacRegister(int dacnum,int dacvalue) { + + bus_w(DAC_NUM_REG, dacnum); + bus_w(DAC_VAL_REG, dacvalue); + bus_w(DAC_NUM_REG, dacnum | (1<<16)); + bus_w(DAC_NUM_REG, dacnum); + printf("Wrote dac register value %d address %d\n",bus_r(DAC_VAL_REG),bus_r(DAC_NUM_REG)) ; + return getDacRegister(dacnum); +} + + + +int dacSPI(int codata) { + u_int32_t offw; + int valw, vv; + int i, ddx,cdx; + + ddx=0; cdx=1; + + offw=DAC_REG; + valw=bus_r(offw); + // codata=((cmd&0xf)<=0) { + cmd=0x3; + } + else if (dacvalue==-100) { + cmd=0x4; + } + codata=cmd< conversion done in slsDetectorServer_funcs.c-> set_dac() + + //if normal dac: + + int dacval = val; // in DAC + u_int32_t offw; + u_int32_t ichip; // DAC-chip (3 chips with each 8 DACs) + u_int16_t valw; + int i,ddx,csdx,cdx; // ddx=data, cdx=clk, csdx=chipselect + + //select dac-chip: + if (myDetectorType==JUNGFRAUCTB || myDetectorType==MYTHEN3){ + ichip=2-ind/8; + printf("This is a CTB (or mythen3)\n"); + } + else { + ichip=ind/8; + printf("This is not a CTB\n"); + } + + // if(val>0 && mV){ // convert to DACu, if val is given in mV + // dacval = val * 4095 / 2500; // convert to DAC + if (val == -1){ + return getDacRegister(ind); + } + else if(dacval<0 || dacval>4095){ + dacval = -1; + printf("The DAC is out of range! Error!\n"); + return getDacRegister(ind); + } + // } + + else if(dacval>=0 && dacval<=4095){ + printf("\nSetting of DAC %d to %d DACunits\n",ind,dacval); + ddx=0; // data is first bit in DAC_REG + cdx=1; // clk is 2nd bit in DAC_REG + if (myDetectorType==JUNGFRAUCTB || myDetectorType==MYTHEN3) + csdx=2; + else + csdx=ichip+2; + + //setting int reference + offw=DAC_REG; + valw=bus_r(offw)|0xff; // alles (ddx,cdx,csdx) auf 1 setzen (for START) + bus_w(offw,(valw)); // start point + //chip select down: + valw=((valw&(~(0x1<=0) { // v_a, v_b, v_c, v_d, v_io + printf("vpower\n"); + dacval=((vmax-val)*4095)/(vmax-vmin); + if (dacval<0) + dacval=0; + if (dacval>4095) + dacval=-100; + if (val==-100) + dacval=-100; + + + } else if (dacindex>=0) {// v_chip + printf("vchip\n"); + dacval=((2700-val)*4095)/1000; + if (dacval<0) + dacval=0; + if (dacval>4095) + dacval=4095; + + } else { // v_limit + vLimit=val; + printf("vlimit %d\n",vLimit ); + } + + } + + if (pwrindex>=0 && val!=-1) {// v_a, v_b, v_c, v_d, v_io + preg=bus_r(POWER_ON_REG); + printf("power reg is %08x\n",bus_r(POWER_ON_REG)); + printf("Switching off power %d\n", pwrindex); + bus_w(POWER_ON_REG,preg&(~(1<<(16+pwrindex)))); + setDAC(dacindex,-100,-1,1); + printf("power reg is %08x\n",bus_r(POWER_ON_REG)); + retval=0; + } + + if (dacindex>0 && dacval!=-100) {// v_a, v_b, v_c, v_d, v_io, v_chip + + printf("Setting power %d to %d mV\n",ind,val); + printf("Setting DAC %d to value %d\n",dacindex,dacval); + retval=setDAC(dacindex,dacval,-1,1);// in mV + if (pwrindex>=0 && dacval>=0 ) {// v_a, v_b, v_c, v_d, v_io + preg=bus_r(POWER_ON_REG); + printf("power reg is %08x\n",bus_r(POWER_ON_REG)); + printf("Switching on power %d\n", pwrindex); + bus_w(POWER_ON_REG,preg|((1<<(16+pwrindex)))); + printf("power reg is %08x\n",bus_r(POWER_ON_REG)); + } + } + + if (pwrindex>=0) {// v_a, v_b, v_c, v_d, v_io + if (bus_r(POWER_ON_REG)&(1<<(16+pwrindex))){ + vmax=2700-(getDacRegister(19)*1000)/4095-200; // 19=v_chip + printf("Vchip id %d mV\n",vmax+200); + // retval1=vmax-(retval*(vmax-vmin))/4095; + retval1=vmax-retval; // mV + printf("Vdac id %d mV\n",retval1); + if (retval1>vmax) + retval1=vmax; + if (retval1=0) { //v_chip + if (retval>=0) { + retval1=2700-(retval*1000)/4095; + printf("Vchip is %d mV\n",vmax); + } else + retval1=-1; + } else { + printf("Get vlimit %d\n",vLimit); + retval=vLimit; + retval1=vLimit; + } + + return retval1; +} + + + + + + + +int setChannel(sls_detector_channel myChan){ + //template initChannelByNumber() from mcb_funcs.c + + return myChan.reg; +} + + +int getChannel(sls_detector_channel *myChan){ + //template getChannelbyNumber() from mcb_funcs.c + return FAIL; +} + + + +int setChip(sls_detector_chip myChip){ + //template initChipbyNumber() from mcb_funcs.c + return myChip.reg; +} + + +int getChip(sls_detector_chip *myChip){ + //template getChipbyNumber() from mcb_funcs.c + return FAIL; +} + +int setModule(sls_detector_module myChan){ + //template initModulebyNumber() from mcb_funcs.c + return OK; +} + +int getModule(sls_detector_module *myChan){ + //template getModulebyNumber() from mcb_funcs.c + return FAIL; +} + +int getThresholdEnergy(int imod){ + //template getThresholdEnergy() from mcb_funcs.c + //depending on settings + return FAIL; +} + + +int setThresholdEnergy(int thr, int imod){ + //template getThresholdEnergy() from mcb_funcs.c + //depending on settings + return FAIL; +} + + + +enum detectorSettings setSettings(enum detectorSettings sett, int imod){ + //template setSettings() from mcb_funcs.c + //reads the dac registers from fpga to confirm which settings, if weird, undefined + + return OK; +} + +int startStateMachine(){ + //template startStateMachine() from firmware_funcs.c + /* + fifoReset(); + now_ptr=(char*)ram_values; + //send start acquisition to fpga + */ + return FAIL; +} + + +int stopStateMachine(){ + //template stopStateMachine() from firmware_funcs.c + // send stop to fpga + //if status = busy after 500us, return FAIL + return FAIL; +} + + +int startReadOut(){ + //template startReadOut() from firmware_funcs.c + //send fpga start readout + return FAIL; +} + + +enum runStatus getRunStatus(){ + //template runState() from firmware_funcs.c + //get status from fpga + return ERROR; +} + + +char *readFrame(int *ret, char *mess){ + //template fifo_read_event() from firmware_funcs.c + //checks if state machine running and if fifo has data(look_at_me_reg) and accordingly reads frame + // memcpy(now_ptr, values, dataBytes); + //returns ptr to values + return NULL; +} + + +int64_t setTimer(enum timerIndex ind, int64_t val){ + //template setDelay() from firmware_funcs.c + //writes to reg + //FRAME_NUMBER --> defined in sls_receiver_defs.h + //ACQUISITION_TIME + //FRAME_PERIOD -> how many frames per trigger + //DELAY_AFTER_TRIGGER + //GATES_NUMBER + //PROBES_NUMBER = # counters + //CYCLES_NUMBER -> how many triggers + + int64_t retval = -1; // return value to check + + switch(ind){ // only change the timer corresponding to ind + + case FRAME_NUMBER: + if(val >= 0) + printf("\nSetting #frames: %lld\n",(long long int)val); + retval = set64BitReg(val, SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG); + printf("Getting #frames: %lld\n",(long long int)retval); + break; + + case ACQUISITION_TIME: // defined in sls_receiver_defs.h + if(val>=0){ + printf("\n Setting the exposure time: %lld ns \n",(long long int)val); + val *= (1E-3 * CLK_RUN); // convert from ns to clk-cycles + // CLK_RUN is defined in slsDetectorServer_defs.h + } + retval = set64BitReg(val,SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG )/(1E-3 * CLK_RUN); // set the register to val and read back, convert back to ns + // SET_EXPTIME_LSB_REG are defined in RegisterDefs.h + printf("Getting the exposure time: %lld ns \n", (long long int)retval); + break; + + case FRAME_PERIOD: // how many frames per trigger + if(val >= 0){ + printf("\nSetting period to %lldns\n",(long long int)val); + val *= (1E-3 * CLK_SYNC); + } + retval = set64BitReg(val, SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG )/ (1E-3 * CLK_SYNC); + // CLK_SYN is defined in slsDetectorServer_defs.h + printf("Getting period: %lldns\n", (long long int)retval); + break; + + case DELAY_AFTER_TRIGGER: + if(val >= 0){ + printf("\nSetting delay to %lldns\n", (long long int)val); + val *= (1E-3 * CLK_SYNC); + } + retval = set64BitReg(val, SET_DELAY_LSB_REG, SET_DELAY_MSB_REG) / (1E-3 * CLK_SYNC); + printf("Getting delay: %lldns\n", (long long int)retval); + break; + + // case PROBES_NUMBER: + + case CYCLES_NUMBER: // how many triggers + if(val >= 0) + printf("\nSetting #cycles to %lld\n", (long long int)val); + retval = set64BitReg(val, SET_CYCLES_LSB_REG, SET_CYCLES_MSB_REG); + printf("Getting #cycles: %lld\n", (long long int)retval); + break; + + default: + cprintf(RED,"Warning: Timer Index not implemented for this detector: %d\n", ind); + break; + } + return retval; +} + + +int64_t getTimeLeft(enum timerIndex ind){ + //template getDelay() from firmware_funcs.c + //reads from reg + //FRAME_NUMBER + //ACQUISITION_TIME + //FRAME_PERIOD + //DELAY_AFTER_TRIGGER + //GATES_NUMBER + //PROBES_NUMBER + //CYCLES_NUMBER + return -1; +} + + +int setDynamicRange(int dr){ + //template setDynamicRange() from firmware_funcs.c + return 0; +} + + +enum readOutFlags setReadOutFlags(enum readOutFlags val){ + //template setStoreInRAM from firmware_funcs.c + return -1; +} + + + + +int setROI(int n, ROI arg[], int *retvalsize, int *ret){ + return FAIL; +} + + + +int setSpeed(enum speedVariable arg, int val){ + //template setClockDivider() from firmware_funcs.c + //CLOCK_DIVIDER + //WAIT_STATES + //SET_SIGNAL_LENGTH + //TOT_CLOCK_DIVIDER + //TOT_DUTY_CYCLE + + //returns eg getClockDivider from firmware_funcs.c + return 0; +} + + + +int executeTrimming(enum trimMode mode, int par1, int par2, int imod){ + // template trim_with_noise from trimming_funcs.c + return FAIL; +} + + + + +// int configureMAC(int ipad, long long int imacadd, long long int iservermacadd, int dtb){ +// //detector specific. +// return FAIL; +// } + +int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport, uint32_t udpport2, int ival){ + return FAIL; +}; + + +int loadImage(enum imageType index, char *imageVals){ + //detector specific. + return FAIL; +} + + +int readCounterBlock(int startACQ, char *counterVals){ + //detector specific. + return FAIL; +} + +int resetCounterBlock(int startACQ){ + //detector specific. + return FAIL; +} + +int startReceiver(int d){ + + return 0; +} + +int calibratePedestal(int frames){ + + return 0; +} + +int calculateDataBytes(){ + return 0; +} + +int getTotalNumberOfChannels(){return 0;} +int getTotalNumberOfChips(){return 0;} +int getTotalNumberOfModules(){return 0;} +int getNumberOfChannelsPerChip(){return 0;} +int getNumberOfChannelsPerModule(){return 0;} +int getNumberOfChipsPerModule(){return 0;} +int getNumberOfDACsPerModule(){return 0;} +int getNumberOfADCsPerModule(){return 0;} + + + + + + + +enum externalSignalFlag getExtSignal(int signalindex){ + //template getExtSignal from firmware_funcs.c + //return signals[signalindex]; + return -1; +} + + + + + +enum externalSignalFlag setExtSignal(int signalindex, enum externalSignalFlag flag){ + //template setExtSignal from firmware_funcs.c + + //in short..sets signals array, checks if agrees with timing mode, writes to fpga reg, calls synchronization and then settiming + /* + if (signalindex>=0 && signalindex<4) { + signals[signalindex]=flag; +#ifdef VERBOSE + printf("settings signal variable number %d to value %04x\n", signalindex, signals[signalindex]); +#endif + // if output signal, set it! + switch (flag) { + case GATE_IN_ACTIVE_HIGH: + case GATE_IN_ACTIVE_LOW: + if (timingMode==GATE_FIX_NUMBER || timingMode==GATE_WITH_START_TRIGGER)//timingMode = AUTO_TIMING by default and is set in setTiming() + setFPGASignal(signalindex,flag); //not implemented here, checks if flag within limits and writes to fpga reg + else + setFPGASignal(signalindex,SIGNAL_OFF); + break; + case TRIGGER_IN_RISING_EDGE: + case TRIGGER_IN_FALLING_EDGE: + if (timingMode==TRIGGER_EXPOSURE || timingMode==GATE_WITH_START_TRIGGER) + setFPGASignal(signalindex,flag); + else + setFPGASignal(signalindex,SIGNAL_OFF); + break; + case RO_TRIGGER_IN_RISING_EDGE: + case RO_TRIGGER_IN_FALLING_EDGE: + if (timingMode==BURST_TRIGGER) + setFPGASignal(signalindex,flag); + else + setFPGASignal(signalindex,SIGNAL_OFF); + break; + case MASTER_SLAVE_SYNCHRONIZATION: + setSynchronization(syncMode);//syncmode = NO_SYNCHRONIZATION by default and set with this function + break; + default: + setFPGASignal(signalindex,mode); + } + + setTiming(GET_EXTERNAL_COMMUNICATION_MODE); + } + */ + return getExtSignal(signalindex); +} + + + + + + +enum externalCommunicationMode setTiming( enum externalCommunicationMode arg){ + //template setTiming from firmware_funcs.c + //template getFPGASignal from firmware_funcs.c + + + //getFPGASignal(signalindex) used later on in this fucntion + //gets flag from fpga reg, checks if flag within limits, + //if( flag=SIGNAL_OFF and signals[signalindex]==MASTER_SLAVE_SYNCHRONIZATION), return -1, (ensures masterslaveflag !=off now) + //else return flag + + int ret=GET_EXTERNAL_COMMUNICATION_MODE; + //sets timingmode variable + //ensures that the signals are in acceptance with timing mode and according sets the timing mode + /* + int g=-1, t=-1, rot=-1; + + int i; + + switch (ti) { + case AUTO_TIMING: + timingMode=ti; + // disable all gates/triggers in except if used for master/slave synchronization + for (i=0; i<4; i++) { + if (getFPGASignal(i)>0 && getFPGASignal(i)=0 && t>=0 && rot<0) { + ret=GATE_WITH_START_TRIGGER; + } else if (g<0 && t>=0 && rot<0) { + ret=TRIGGER_EXPOSURE; + } else if (g>=0 && t<0 && rot<0) { + ret=GATE_FIX_NUMBER; + } else if (g<0 && t<0 && rot>0) { + ret=TRIGGER_READOUT; + } else if (g<0 && t<0 && rot<0) { + ret=AUTO_TIMING; + } + + */ + return ret; +} + + + +enum masterFlags setMaster(enum masterFlags arg){ + //template setMaster from firmware_funcs.c + /* + int i; + switch(f) { + case NO_MASTER: + // switch of gates or triggers + masterMode=NO_MASTER; + for (i=0; i<4; i++) { + if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { + setFPGASignal(i,SIGNAL_OFF); + } + } + break; + case IS_MASTER: + // configure gate or trigger out + masterMode=IS_MASTER; + for (i=0; i<4; i++) { + if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { + switch (syncMode) { + case NO_SYNCHRONIZATION: + setFPGASignal(i,SIGNAL_OFF); + break; + case MASTER_GATES: + setFPGASignal(i,GATE_OUT_ACTIVE_HIGH); + break; + case MASTER_TRIGGERS: + setFPGASignal(i,TRIGGER_OUT_RISING_EDGE); + break; + case SLAVE_STARTS_WHEN_MASTER_STOPS: + setFPGASignal(i,RO_TRIGGER_OUT_RISING_EDGE); + break; + default: + ; + } + } + } + break; + case IS_SLAVE: + // configure gate or trigger in + masterMode=IS_SLAVE; + for (i=0; i<4; i++) { + if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { + switch (syncMode) { + case NO_SYNCHRONIZATION: + setFPGASignal(i,SIGNAL_OFF); + break; + case MASTER_GATES: + setFPGASignal(i,GATE_IN_ACTIVE_HIGH); + break; + case MASTER_TRIGGERS: + setFPGASignal(i,TRIGGER_IN_RISING_EDGE); + break; + case SLAVE_STARTS_WHEN_MASTER_STOPS: + setFPGASignal(i,TRIGGER_IN_RISING_EDGE); + break; + default: + ; + } + } + } + break; + default: + //do nothing + ; + } + + switch(masterMode) { + case NO_MASTER: + return NO_MASTER; + + + case IS_MASTER: + for (i=0; i<4; i++) { + if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { + switch (syncMode) { + case NO_SYNCHRONIZATION: + return IS_MASTER; + case MASTER_GATES: + if (getFPGASignal(i)==GATE_OUT_ACTIVE_HIGH) + return IS_MASTER; + else + return NO_MASTER; + case MASTER_TRIGGERS: + if (getFPGASignal(i)==TRIGGER_OUT_RISING_EDGE) + return IS_MASTER; + else + return NO_MASTER; + case SLAVE_STARTS_WHEN_MASTER_STOPS: + if (getFPGASignal(i)==RO_TRIGGER_OUT_RISING_EDGE) + return IS_MASTER; + else + return NO_MASTER; + default: + return NO_MASTER; + } + + } + } + + case IS_SLAVE: + for (i=0; i<4; i++) { + if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { + switch (syncMode) { + case NO_SYNCHRONIZATION: + return IS_SLAVE; + case MASTER_GATES: + if (getFPGASignal(i)==GATE_IN_ACTIVE_HIGH) + return IS_SLAVE; + else + return NO_MASTER; + case MASTER_TRIGGERS: + case SLAVE_STARTS_WHEN_MASTER_STOPS: + if (getFPGASignal(i)==TRIGGER_IN_RISING_EDGE) + return IS_SLAVE; + else + return NO_MASTER; + default: + return NO_MASTER; + } + + } + } + + } + */ + + return NO_MASTER; +} + + + +enum synchronizationMode setSynchronization(enum synchronizationMode arg){ + /* + int i; + + switch(s) { + case NO_SYNCHRONIZATION: + syncMode=NO_SYNCHRONIZATION; + for (i=0; i<4; i++) { + if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { + setFPGASignal(i,SIGNAL_OFF); + } + } + break; + // disable external signals? + case MASTER_GATES: + // configure gate in or out + syncMode=MASTER_GATES; + for (i=0; i<4; i++) { + if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { + if (masterMode==IS_MASTER) + setFPGASignal(i,GATE_OUT_ACTIVE_HIGH); + else if (masterMode==IS_SLAVE) + setFPGASignal(i,GATE_IN_ACTIVE_HIGH); + } + } + + break; + case MASTER_TRIGGERS: + // configure trigger in or out + syncMode=MASTER_TRIGGERS; + for (i=0; i<4; i++) { + if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { + if (masterMode==IS_MASTER) + setFPGASignal(i,TRIGGER_OUT_RISING_EDGE); + else if (masterMode==IS_SLAVE) + setFPGASignal(i,TRIGGER_IN_RISING_EDGE); + } + } + break; + + + case SLAVE_STARTS_WHEN_MASTER_STOPS: + // configure trigger in or out + syncMode=SLAVE_STARTS_WHEN_MASTER_STOPS; + for (i=0; i<4; i++) { + if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { + if (masterMode==IS_MASTER) + setFPGASignal(i,RO_TRIGGER_OUT_RISING_EDGE); + else if (masterMode==IS_SLAVE) + setFPGASignal(i,TRIGGER_IN_RISING_EDGE); + } + } + break; + + + default: + //do nothing + ; + } + + switch (syncMode) { + + case NO_SYNCHRONIZATION: + return NO_SYNCHRONIZATION; + + case MASTER_GATES: + + for (i=0; i<4; i++) { + if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { + if (masterMode==IS_MASTER && getFPGASignal(i)==GATE_OUT_ACTIVE_HIGH) + return MASTER_GATES; + else if (masterMode==IS_SLAVE && getFPGASignal(i)==GATE_IN_ACTIVE_HIGH) + return MASTER_GATES; + } + } + return NO_SYNCHRONIZATION; + + case MASTER_TRIGGERS: + for (i=0; i<4; i++) { + if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { + if (masterMode==IS_MASTER && getFPGASignal(i)==TRIGGER_OUT_RISING_EDGE) + return MASTER_TRIGGERS; + else if (masterMode==IS_SLAVE && getFPGASignal(i)==TRIGGER_IN_RISING_EDGE) + return MASTER_TRIGGERS; + } + } + return NO_SYNCHRONIZATION; + + case SLAVE_STARTS_WHEN_MASTER_STOPS: + for (i=0; i<4; i++) { + if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { + if (masterMode==IS_MASTER && getFPGASignal(i)==RO_TRIGGER_OUT_RISING_EDGE) + return SLAVE_STARTS_WHEN_MASTER_STOPS; + else if (masterMode==IS_SLAVE && getFPGASignal(i)==TRIGGER_IN_RISING_EDGE) + return SLAVE_STARTS_WHEN_MASTER_STOPS; + } + } + return NO_SYNCHRONIZATION; + + default: + return NO_SYNCHRONIZATION; + + } + + + */ + return NO_SYNCHRONIZATION; +} + +void checkFirmwareCompatibility(int flag){ + +} + +#endif diff --git a/slsDetectorSoftware/mythen3DetectorServer/mythen3FunctionList.h b/slsDetectorSoftware/mythen3DetectorServer/mythen3FunctionList.h new file mode 100644 index 000000000..39c6a06a2 --- /dev/null +++ b/slsDetectorSoftware/mythen3DetectorServer/mythen3FunctionList.h @@ -0,0 +1,249 @@ +#ifdef SLS_DETECTOR_FUNCTION_LIST +#ifndef SLS_DETECTOR_FUNCTION_LIST_H +#define SLS_DETECTOR_FUNCTION_LIST_H + +#include "sls_receiver_defs.h" +#include "mythen3Server_defs.h" // DAC_INDEX, ADC_INDEX, also include RegisterDefs.h + +#include +#include // FILE + + +/**************************************************** +This functions are used by the slsDetectroServer_funcs interface. +Here are the definitions, but the actual implementation should be done for each single detector. + +****************************************************/ + + +// basic tests +void checkFirmwareCompatibility(int flag); +#ifdef JUNGFRAUD +int checkType(); +u_int32_t testFpga(void); +int testBus(void); +#endif + +#if defined(MYTHEND) || defined(JUNGFRAUD) || defined(MTHEN3D) +int moduleTest( enum digitalTestMode arg, int imod); +#endif +int detectorTest( enum digitalTestMode arg); + +// Ids +int64_t getDetectorId(enum idMode arg); +u_int64_t getFirmwareVersion(); +#ifdef MYTHEND +int64_t getModuleId(enum idMode arg, int imod); +#elif JUNGFRAUDN_DAC +u_int16_t getHardwareVersionNumber(); +u_int16_t getHardwareSerialNumber(); +#endif +u_int32_t getDetectorNumber(); +u_int64_t getDetectorMAC(); +u_int32_t getDetectorIP(); + + +// initialization +void initControlServer(); +void initStopServer(); +#ifdef EIGERD +void getModuleConfiguration(); +#endif + +// set up detector +void allocateDetectorStructureMemory(); +int setupDetector(); + + +// advanced read/write reg +#ifndef EIGERD +extern u_int32_t writeRegister(u_int32_t offset, u_int32_t data); // blackfin.h +extern u_int32_t readRegister(u_int32_t offset); // blackfin.h +#else +uint32_t writeRegister(uint32_t offset, uint32_t data); +uint32_t readRegister(uint32_t offset); +#endif + + +// firmware functions (resets) +#ifdef JUNGFRAUD +int powerChip (int on); +void cleanFifos(); +void resetCore(); +void resetPeripheral(); +int adcPhase(int st); +int getPhase(); +#endif + +// parameters - nmod, dr, roi +int setNMod(int nm, enum dimension dim); // mythen specific, but for detector compatibility as a get +int getNModBoard(enum dimension arg); // mythen specific, but for detector compatibility as a get +int setDynamicRange(int dr); +#ifdef GOTTHARD +int setROI(int n, ROI arg[], int *retvalsize, int *ret); +#endif + +// parameters - readout +int setSpeed(enum speedVariable arg, int val); +#if defined(EIGERD) || defined(MYTHEND) +enum readOutFlags setReadOutFlags(enum readOutFlags val); +#endif +#ifdef MYTHEND +int executeTrimming(enum trimMode mode, int par1, int par2, int imod); +#endif + +// parameters - timer +int64_t setTimer(enum timerIndex ind, int64_t val); +#ifndef EIGERD +int64_t getTimeLeft(enum timerIndex ind); +#endif + + +// parameters - channel, chip, module, settings +#ifdef MYTHEND +int setChannel(sls_detector_channel myChan); +int getChannel(sls_detector_channel *myChan); +int setChip(sls_detector_chip myChip); +int getChip(sls_detector_chip *myChip); +#endif +#ifdef EIGERD +int setModule(sls_detector_module myMod, int delay); +#else +int setModule(sls_detector_module myMod); +#endif +int getModule(sls_detector_module *myMod); +enum detectorSettings setSettings(enum detectorSettings sett, int imod); +enum detectorSettings getSettings(); + + +// parameters - threshold +#if defined(MYTHEND) || defined(EIGERD) +int getThresholdEnergy(int imod); +int setThresholdEnergy(int ev, int imod); +#endif + +// parameters - dac, adc, hv +#ifdef JUNGFRAUD +void serializeToSPI(u_int32_t addr, u_int32_t val, u_int32_t csmask, int numbitstosend, u_int32_t clkmask, u_int32_t digoutmask, int digofset); +void initDac(int dacnum); +extern void setAdc(int addr, int val); // AD9257.h +int voltageToDac(int value); +int dacToVoltage(unsigned int digital); +#endif +// void setDAC(enum DACINDEX ind, int val, int imod, int mV, int retval[]); +double setDAC(enum DACINDEX ind, double val, int imod, int mV); + +#ifndef MYTHEND +int setHighVoltage(int val); +#endif + + + +// parameters - timing, extsig +#ifdef MYTHEND +enum externalSignalFlag getExtSignal(int signalindex); +enum externalSignalFlag setExtSignal(int signalindex, enum externalSignalFlag flag); +#endif +enum externalCommunicationMode setTiming( enum externalCommunicationMode arg); + +// configure mac +#ifdef JUNGFRAUD +long int calcChecksum(int sourceip, int destip); +#endif +#ifndef MYTHEND +int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport, uint32_t udpport2, int ival); +// int configureMAC(int ipad, long long int imacadd, long long int iservermacadd, int dtb); +#endif +#if defined(JUNGFRAUD) || defined(EIGERD) +int setDetectorPosition(int pos[]); +#endif + + +// very detector specific + +// gotthard specific - image, pedestal +#ifdef GOTTHARDD +int loadImage(enum imageType index, char *imageVals); +int readCounterBlock(int startACQ, char *counterVals); +int resetCounterBlock(int startACQ); +int calibratePedestal(int frames); + +// jungfrau specific - pll, flashing firmware +#elif JUNGFRAUD +void resetPLL(); +u_int32_t setPllReconfigReg(u_int32_t reg, u_int32_t val); +void configurePll(); +extern void eraseFlash(); // programfpga.h +extern int startWritingFPGAprogram(FILE** filefp); // programfpga.h +extern void stopWritingFPGAprogram(FILE* filefp); // programfpga.h +extern int writeFPGAProgram(char* fpgasrc, size_t fsize, FILE* filefp); // programfpga.h + +// eiger specific - iodelay, 10g, pulse, rate, temp, activate, delay nw parameter +#elif EIGERD +int setIODelay(int val, int imod); +int enableTenGigabitEthernet(int val); +int setCounterBit(int val); +int pulsePixel(int n, int x, int y); +int pulsePixelNMove(int n, int x, int y); +int pulseChip(int n); +int64_t setRateCorrection(int64_t custom_tau_in_nsec); +int getRateCorrectionEnable(); +int getDefaultSettingsTau_in_nsec(); +void setDefaultSettingsTau_in_nsec(int t); +int64_t getCurrentTau(); +void setExternalGating(int enable[]); +int setAllTrimbits(int val); +int getAllTrimbits(); +int getBebFPGATemp(); +int activate(int enable); +int setNetworkParameter(enum NETWORKINDEX mode, int value); +#endif + + + + +// aquisition +#if defined(EIGERD) || defined(GOTTHARD) +int prepareAcquisition(); +#endif +int startStateMachine(); +#ifdef VIRTUAL +void* start_timer(void* arg); +#endif +int stopStateMachine(); +#ifndef JUNGFRAUD +int startReadOut(); +#endif +enum runStatus getRunStatus(); +// void readFrame(int *ret, char *mess); +char *readFrame(int *ret, char *mess); +#ifdef JUNGFRAUD +u_int32_t runBusy(void); +#endif + + +//common +int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod); +int calculateDataBytes(); +int getTotalNumberOfChannels(); +int getTotalNumberOfChips(); +int getTotalNumberOfModules(); +int getNumberOfChannelsPerModule(); +int getNumberOfChipsPerModule(); +int getNumberOfDACsPerModule(); +int getNumberOfADCsPerModule(); +#ifdef EIGERD +int getNumberOfGainsPerModule(); +int getNumberOfOffsetsPerModule(); +#endif +int getNumberOfChannelsPerChip(); + +// sync +enum masterFlags setMaster(enum masterFlags arg); +enum synchronizationMode setSynchronization(enum synchronizationMode arg); + +int setPower(int ind, int val); + + +#endif +#endif diff --git a/slsDetectorSoftware/mythen3DetectorServer/mythen3RegisterDefs.h b/slsDetectorSoftware/mythen3DetectorServer/mythen3RegisterDefs.h new file mode 100644 index 000000000..e475e8fcb --- /dev/null +++ b/slsDetectorSoftware/mythen3DetectorServer/mythen3RegisterDefs.h @@ -0,0 +1,551 @@ +#ifndef REGISTERS_G_H +#define REGISTERS_G_H + + +#include "sls_detector_defs.h" + + +/* Definitions for FPGA*/ +#define CSP0 0x20200000 +#define MEM_SIZE 0x100000 + + + +/* values defined for FPGA */ +#define MCSNUM 0x0 +#define FIXED_PATT_VAL 0xacdc1980 + + +#define FPGA_INIT_PAT 0x60008 +#define FPGA_INIT_ADDR 0xb0000000 + +//#ifdef JUNGFRAU_DHANYA +#define POWER_ON_REG 0x5e<<11 +// Pwr_I2C_SDA <= PowerReg_s(1) when PowerReg_s(3)='1' else 'Z'; +// Pwr_I2C_SCL <= PowerReg_s(0) when PowerReg_s(2)='1' else 'Z'; + +#define PWR_I2C_SCL_BIT 0 +#define PWR_I2C_SDA_BIT 1 +#define PWR_I2C_SCL_EN_BIT 2 +#define PWR_I2C_SDA_EN_BIT 3 + +#define POWER_STATUS_REG 41<<11 + +#define ADCREG1 0x08 +#define ADCREG2 0x14//20 +#define ADCREG3 0x4 +#define ADCREG4 0x5 +#define ADCREG_VREFS 24 +#define DBIT_PIPELINE_REG 89<<11 //0x59 same PATTERN_N_LOOP2_REG +#define MEM_MACHINE_FIFOS_REG 79<<11 //from gotthard +#define CONFGAIN_REG 93<<11 //from gotthard +#define ADC_PIPELINE_REG 66<<11 //0x42 same as ADC_OFFSET_REG +//#endif + +//#define ADC_OFFSET_REG 93<<11 //same as DAQ_REG +#define ADC_INVERSION_REG 67<<11 + +#define DAC_REG 64<<11//0x17<<11// control the dacs +//ADC +#define ADC_WRITE_REG 65<<11//0x18<<11 +//#define ADC_SYNC_REG 66<<11//0x19<<11 +//#define HV_REG 67<<11//0x20<<11 + + + + +//#define MUTIME_REG 0x1a<<11 +//temperature +#define TEMP_IN_REG 0x1b<<11 +#define TEMP_OUT_REG 0x1c<<11 +//configure MAC +#define TSE_CONF_REG 0x1d<<11 +#define ENET_CONF_REG 0x1e<<11 +//#define WRTSE_SHAD_REG 0x1f<<11 +//HV + + +#define DUMMY_REG 68<<11//0x21<<11 +#define FPGA_VERSION_REG 0<<11 //0x22<<11 +#define PCB_REV_REG 0<<11 +#define FIX_PATT_REG 1<<11 //0x23<<11 +#define CONTROL_REG 79<<11//0x24<<11 +#define STATUS_REG 2<<11 //0x25<<11 +#define CONFIG_REG 77<<11//0x26<<11 +#define EXT_SIGNAL_REG 78<<11// 0x27<<11 +//#define FPGA_SVN_REG 0x29<<11 + + +#define CHIP_OF_INTRST_REG 0x2A<<11 + +//FIFO +#define LOOK_AT_ME_REG 3<<11 //0x28<<11 +#define SYSTEM_STATUS_REG 4<<11 + +#define FIFO_DATA_REG 6<<11 +#define FIFO_STATUS_REG 7<<11 + +// constant FifoDigitalInReg_c : integer := 60; +#define FIFO_DIGITAL_DATA_LSB_REG 60<<11 +#define FIFO_DIGITAL_DATA_MSB_REG 61<<11 + +#define FIFO_DATA_REG_OFF 0x50<<11 /////// +//to read back dac registers +//#define MOD_DACS1_REG 0x65<<11 +//#define MOD_DACS2_REG 0x66<<11 +//#define MOD_DACS3_REG 0x67<<11 + +//user entered + + + + + + +#define GET_ACTUAL_TIME_LSB_REG 16<<11 +#define GET_ACTUAL_TIME_MSB_REG 17<<11 + +#define GET_MEASUREMENT_TIME_LSB_REG 38<<11 +#define GET_MEASUREMENT_TIME_MSB_REG 39<<11 + + +#define SET_DELAY_LSB_REG 96<<11 //0x68<<11 +#define SET_DELAY_MSB_REG 97<<11 //0x69<<11 +#define GET_DELAY_LSB_REG 18<<11//0x6a<<11 +#define GET_DELAY_MSB_REG 19<<11//0x6b<<11 + +#define SET_CYCLES_LSB_REG 98<<11//0x6c<<11 +#define SET_CYCLES_MSB_REG 99<<11//0x6d<<11 +#define GET_CYCLES_LSB_REG 20<<11//0x6e<<11 +#define GET_CYCLES_MSB_REG 21<<11//0x6f<<11 + +#define SET_FRAMES_LSB_REG 100<<11//0x70<<11 +#define SET_FRAMES_MSB_REG 101<<11//0x71<<11 +#define GET_FRAMES_LSB_REG 22<<11//0x72<<11 +#define GET_FRAMES_MSB_REG 23<<11//0x73<<11 + +#define SET_PERIOD_LSB_REG 102<<11//0x74<<11 +#define SET_PERIOD_MSB_REG 103<<11//0x75<<11 +#define GET_PERIOD_LSB_REG 24<<11//0x76<<11 +#define GET_PERIOD_MSB_REG 25<<11//0x77<<11 + +//#define PATTERN_WAIT0_TIME_REG_LSB 114<<11 +//#define PATTERN_WAIT0_TIME_REG_MSB 115<<11 +#define SET_EXPTIME_LSB_REG 114<<11//0x78<<11 +#define SET_EXPTIME_MSB_REG 115<<11//0x79<<11 +#define GET_EXPTIME_LSB_REG 26<<11//0x7a<<11 +#define GET_EXPTIME_MSB_REG 27<<11//0x7b<<11 + +#define SET_GATES_LSB_REG 106<<11//0x7c<<11 +#define SET_GATES_MSB_REG 107<<11//0x7d<<11 +#define GET_GATES_LSB_REG 28<<11//0x7e<<11 +#define GET_GATES_MSB_REG 29<<11//0x7f<<11 + +#define DATA_IN_LSB_REG 30<<11 +#define DATA_IN_MSB_REG 31<<11 + +#define PATTERN_OUT_LSB_REG 32<<11 +#define PATTERN_OUT_MSB_REG 33<<11 + +#define FRAMES_FROM_START_LSB_REG 34<<11 +#define FRAMES_FROM_START_MSB_REG 35<<11 + +#define FRAMES_FROM_START_PG_LSB_REG 36<<11 +#define FRAMES_FROM_START_PG_MSB_REG 37<<11 + +#define SLOW_ADC_REG 43<<11 + + + +#define PLL_PARAM_REG 80<<11//0x37<<11 +#define PLL_PARAM_OUT_REG 5<<11 //0x38<<11 +#define PLL_CNTRL_REG 81<<11//0x34<<11 + + +#ifdef NEW_GBE_INTERFACE +#define GBE_PARAM_OUT_REG 40<<11 +#define GBE_PARAM_REG 69<<11 +#define GBE_CNTRL_REG 70<<11 +#else +#define RX_UDP_AREG 69<<11 //rx_udpip_AReg_c : integer:= 69; *\/ +#define UDPPORTS_AREG 70<<11// udpports_AReg_c : integer:= 70; *\/ +#define RX_UDPMACL_AREG 71<<11//rx_udpmacL_AReg_c : integer:= 71; *\/ +#define RX_UDPMACH_AREG 72<<11//rx_udpmacH_AReg_c : integer:= 72; *\/ +#define DETECTORMACL_AREG 73<<11//detectormacL_AReg_c : integer:= 73; *\/ +#define DETECTORMACH_AREG 74<<11//detectormacH_AReg_c : integer:= 74; *\/ +#define DETECTORIP_AREG 75<<11//detectorip_AReg_c : integer:= 75; *\/ +#define IPCHKSUM_AREG 76<<11//ipchksum_AReg_c : integer:= 76; *\/ */ +#endif + + +#define PATTERN_CNTRL_REG 82<<11 // address of patword +#define PATTERN_LIMITS_AREG 83<<11 // start/stop pattern + +#define PATTERN_LOOP0_AREG 84<<11 // start/stop of loop +#define PATTERN_N_LOOP0_REG 85<<11 // # loops + +#define PATTERN_LOOP1_AREG 86<<11 +#define PATTERN_N_LOOP1_REG 87<<11 + +#define PATTERN_LOOP2_AREG 88<<11 +#define PATTERN_N_LOOP2_REG 89<<11 + +#define PATTERN_WAIT0_AREG 90<<11 // address where to wait +#define PATTERN_WAIT1_AREG 91<<11 +#define PATTERN_WAIT2_AREG 92<<11 + + + +//#define DAQ_REG 93<<11 //unused +#define NSAMPLES_REG 93<<11 //unused + + +#define HV_REG 95<<11 + + + +#define PATTERN_IOCTRL_REG_LSB 108<<11 // if output or not +#define PATTERN_IOCTRL_REG_MSB 109<<11 + +#define PATTERN_IOCLKCTRL_REG_LSB 110<<11//unused +#define PATTERN_IOCLKCTRL_REG_MSB 111<<11//unused +#define PATTERN_IN_REG_LSB 112<<11 // write word +#define PATTERN_IN_REG_MSB 113<<11 +#define PATTERN_WAIT0_TIME_REG_LSB 114<<11 // how long to wait +#define PATTERN_WAIT0_TIME_REG_MSB 115<<11 +#define PATTERN_WAIT1_TIME_REG_LSB 116<<11 +#define PATTERN_WAIT1_TIME_REG_MSB 117<<11 +#define PATTERN_WAIT2_TIME_REG_LSB 118<<11 +#define PATTERN_WAIT2_TIME_REG_MSB 119<<11 + +//#define DAC_REG_OFF 120 +//#define DAC_0_1_VAL_REG 120<<11 +//#define DAC_2_3_VAL_REG 121<<11 +//#define DAC_4_5_VAL_REG 122<<11 +//#define DAC_6_7_VAL_REG 123<<11 +//#define DAC_8_9_VAL_REG 124<<11 +//#define DAC_10_11_VAL_REG 125<<11 +//#define DAC_12_13_VAL_REG 126<<11 +//#define DAC_14_15_VAL_REG 127<<11 +#define DAC_VAL_REG 121<<11 // value of the DAC +#define DAC_NUM_REG 122<<11 // Index of the DAC, only JCTB +#define DAC_VAL_OUT_REG 42<<11 +#define ADC_LATCH_DISABLE_REG 120<<11 + + + + + + + + +/* registers defined in FPGA */ +#define GAIN_REG 0 +//#define FLOW_CONTROL_REG 0x11<<11 +//#define FLOW_STATUS_REG 0x12<<11 +//#define FRAME_REG 0x13<<11 +#define MULTI_PURPOSE_REG 0 +//#define TIME_FROM_START_REG 0x16<<11 + + +#define ROI_REG 0 // 0x35<<11 +#define OVERSAMPLING_REG 0 // 0x36<<11 +#define MOENCH_CNTR_REG 0 // 0x31<<11 +#define MOENCH_CNTR_OUT_REG 0 // 0x33<<11 +#define MOENCH_CNTR_CONF_REG 0 // 0x32<<11 + + + +//image +#define DARK_IMAGE_REG 0 // 0x81<<11 +#define GAIN_IMAGE_REG 0 // 0x82<<11 + +//counter block memory +#define COUNTER_MEMORY_REG 0 // 0x85<<11 //gotthard + + +//not used +//#define MCB_DOUT_REG_OFF 0 // 0x200000 +//#define FIFO_CNTRL_REG_OFF 0 // 0x300000 +//#define FIFO_COUNTR_REG_OFF 0 // 0x400000 +//not used so far +//#define SPEED_REG 0 // 0x006000 +//#define SET_NBITS_REG 0 // 0x008000 +//not used +//#define GET_SHIFT_IN_REG 0 // 0x022000 + + + +#define SHIFTMOD 2 +#define SHIFTFIFO 9 + +/** for PCB_REV_REG */ +#define DETECTOR_TYPE_MASK 0xFF000000 +#define DETECTOR_TYPE_OFFSET 24 +#define BOARD_REVISION_MASK 0xFFFFFF +#define MOENCH03_MODULE_ID 2 +#define JUNGFRAU_MODULE_ID 1 +#define JUNGFRAU_CTB_ID 3 + + + + +/* for control register (16bit only)*/ +#define START_ACQ_BIT 0x0001 +#define STOP_ACQ_BIT 0x0002 +#define START_FIFOTEST_BIT 0x0004 // ????? +#define STOP_FIFOTEST_BIT 0x0008 // ?????? +#define START_READOUT_BIT 0x0010 +#define STOP_READOUT_BIT 0x0020 +#define START_EXPOSURE_BIT 0x0040 +#define STOP_EXPOSURE_BIT 0x0080 +#define START_TRAIN_BIT 0x0100 +#define STOP_TRAIN_BIT 0x0200 +#define FIFO_RESET_BIT 0x8000 +#define SYNC_RESET 0x0400 +#define GB10_RESET_BIT 0x0800 +#define MEM_RESET_BIT 0x1000 + +/* for status register */ +#define RUN_BUSY_BIT 0x00000001 +#define READOUT_BUSY_BIT 0x00000002 +#define FIFOTEST_BUSY_BIT 0x00000004 //???? +#define WAITING_FOR_TRIGGER_BIT 0x00000008 +#define DELAYBEFORE_BIT 0x00000010 +#define DELAYAFTER_BIT 0x00000020 +#define EXPOSING_BIT 0x00000040 +#define COUNT_ENABLE_BIT 0x00000080 +#define READSTATE_0_BIT 0x00000100 +#define READSTATE_1_BIT 0x00000200 +#define READSTATE_2_BIT 0x00000400 +#define LAM_BIT 0x00000400 // error! +#define SOME_FIFO_FULL_BIT 0x00000800 // error! + + + +#define RUNSTATE_0_BIT 0x00001000 +#define RUNSTATE_1_BIT 0x00002000 +#define RUNSTATE_2_BIT 0x00004000 +#define STOPPED_BIT 0x00008000 // stopped! +#define ALL_FIFO_EMPTY_BIT 0x00010000 // data ready +#define RUNMACHINE_BUSY_BIT 0x00020000 +#define READMACHINE_BUSY_BIT 0x00040000 +#define PLL_RECONFIG_BUSY 0x00100000 + + + +/* for fifo status register */ +#define FIFO_ENABLED_BIT 0x80000000 +#define FIFO_DISABLED_BIT 0x01000000 +#define FIFO_ERROR_BIT 0x08000000 +#define FIFO_EMPTY_BIT 0x04000000 +#define FIFO_DATA_READY_BIT 0x02000000 +#define FIFO_COUNTER_MASK 0x000001ff +#define FIFO_NM_MASK 0x00e00000 +#define FIFO_NM_OFF 21 +#define FIFO_NC_MASK 0x001ffe00 +#define FIFO_NC_OFF 9 + +/* for config register *///not really used yet +#define TOT_ENABLE_BIT 0x00000002 +#define TIMED_GATE_BIT 0x00000004 +#define CONT_RO_ENABLE_BIT 0x00080000 +#define GB10_NOT_CPU_BIT 0x00001000 +#define ADC_OUTPUT_DISABLE_BIT 0x00100 +#define DIGITAL_OUTPUT_ENABLE_BIT 0x00200 + + +/* for speed register */ +#define CLK_DIVIDER_MASK 0x000000ff +#define CLK_DIVIDER_OFFSET 0 +#define SET_LENGTH_MASK 0x00000f00 +#define SET_LENGTH_OFFSET 8 +#define WAIT_STATES_MASK 0x0000f000 +#define WAIT_STATES_OFFSET 12 +#define TOTCLK_DIVIDER_MASK 0xff000000 +#define TOTCLK_DIVIDER_OFFSET 24 +#define TOTCLK_DUTYCYCLE_MASK 0x00ff0000 +#define TOTCLK_DUTYCYCLE_OFFSET 16 + +/* for external signal register */ +#define SIGNAL_OFFSET 4 +#define SIGNAL_MASK 0xF +#define EXT_SIG_OFF 0x0 +#define EXT_GATE_IN_ACTIVEHIGH 0x1 +#define EXT_GATE_IN_ACTIVELOW 0x2 +#define EXT_TRIG_IN_RISING 0x3 +#define EXT_TRIG_IN_FALLING 0x4 +#define EXT_RO_TRIG_IN_RISING 0x5 +#define EXT_RO_TRIG_IN_FALLING 0x6 +#define EXT_GATE_OUT_ACTIVEHIGH 0x7 +#define EXT_GATE_OUT_ACTIVELOW 0x8 +#define EXT_TRIG_OUT_RISING 0x9 +#define EXT_TRIG_OUT_FALLING 0xA +#define EXT_RO_TRIG_OUT_RISING 0xB +#define EXT_RO_TRIG_OUT_FALLING 0xC + + + +/* for temperature register */ +#define T1_CLK_BIT 0x00000001 +#define T1_CS_BIT 0x00000002 +#define T2_CLK_BIT 0x00000004 +#define T2_CS_BIT 0x00000008 + + + +/* fifo control register */ +//#define FIFO_RESET_BIT 0x00000001 +//#define FIFO_DISABLE_TOGGLE_BIT 0x00000002 + + +//chip shiftin register meaning +#define OUTMUX_OFF 20 +#define OUTMUX_MASK 0x1f +#define PROBES_OFF 4 +#define PROBES_MASK 0x7f +#define OUTBUF_OFF 0 +#define OUTBUF_MASK 1 + + +/* multi purpose register */ +#define PHASE_STEP_BIT 0x00000001 +#define PHASE_STEP_OFFSET 0 +// #define xxx_BIT 0x00000002 +#define RESET_COUNTER_BIT 0x00000004 +#define RESET_COUNTER_OFFSET 2 +//#define xxx_BIT 0x00000008 +//#define xxx_BIT 0x00000010 +#define SW1_BIT 0x00000020 +#define SW1_OFFSET 5 +#define WRITE_BACK_BIT 0x00000040 +#define WRITE_BACK_OFFSET 6 +#define RESET_BIT 0x00000080 +#define RESET_OFFSET 7 +#define ENET_RESETN_BIT 0x00000800 +#define ENET_RESETN_OFFSET 11 +#define INT_RSTN_BIT 0x00002000 +#define INT_RSTN_OFFSET 13 +#define DIGITAL_TEST_BIT 0x00004000 +#define DIGITAL_TEST_OFFSET 14 +//#define CHANGE_AT_POWER_ON_BIT 0x00008000 +//#define CHANGE_AT_POWER_ON_OFFSET 15 + + +/* settings/conf gain register */ +#define GAIN_MASK 0x0000000f +#define GAIN_OFFSET 0 +#define SETTINGS_MASK 0x000000f0 +#define SETTINGS_OFFSET 4 + + +/* CHIP_OF_INTRST_REG */ +#define CHANNEL_MASK 0xffff0000 +#define CHANNEL_OFFSET 16 +#define ACTIVE_ADC_MASK 0x0000001f + + + +/**ADC SYNC CLEAN FIFO*/ +#define ADCSYNC_CLEAN_FIFO_BITS 0x300000 +#define CLEAN_FIFO_MASK 0x0fffff + + + + +enum {run_clk_c, adc_clk_c, sync_clk_c, dbit_clk_c}; + + + + +#define PLL_CNTR_ADDR_OFF 16 //PLL_CNTR_REG bits 21 downto 16 represent the counter address + +#define PLL_CNTR_RECONFIG_RESET_BIT 0 +#define PLL_CNTR_READ_BIT 1 +#define PLL_CNTR_WRITE_BIT 2 +#define PLL_CNTR_PLL_RESET_BIT 3 + + +#define PLL_CNTR_PHASE_EN_BIT 8 +#define PLL_CNTR_UPDN_BIT 9 +#define PLL_CNTR_CNTSEL_OFF 10 + + + + + +#define PLL_MODE_REG 0x0 +#define PLL_STATUS_REG 0x1 +#define PLL_START_REG 0x2 +#define PLL_N_COUNTER_REG 0x3 +#define PLL_M_COUNTER_REG 0x4 +#define PLL_C_COUNTER_REG 0x5 //which ccounter stands in param 22:18; 7:0 lowcount 15:8 highcount; 16 bypassenable; 17 oddivision +#define PLL_PHASE_SHIFT_REG 0x6 // which ccounter stands in param 16:20; 21 updown (1 up, 0 down) +#define PLL_K_COUNTER_REG 0x7 +#define PLL_BANDWIDTH_REG 0x8 +#define PLL_CHARGEPUMP_REG 0x9 +#define PLL_VCO_DIV_REG 0x1c +#define PLL_MIF_REG 0x1f + +#define PPL_M_CNT_PARAM_DEFAULT 0x4040 +#define PPL_N_CNT_PARAM_DEFAULT 0x20D0C +#define PPL_C0_CNT_PARAM_DEFAULT 0x20D0C +#define PPL_C1_CNT_PARAM_DEFAULT 0xA0A0 +#define PPL_C2_CNT_PARAM_DEFAULT 0x20D0C +#define PPL_C3_CNT_PARAM_DEFAULT 0x0808 +#define PPL_BW_PARAM_DEFAULT 0x2EE0 +#define PPL_VCO_PARAM_DEFAULT 0x1 + +#define NEW_PLL_RECONFIG + +#ifdef NEW_PLL_RECONFIG +#define PLL_VCO_FREQ_MHZ 400//480//800 +#else +#define PLL_VCO_FREQ_MHZ 480//800 +#endif + + + + + +/* + GBE parameter and control registers definitions +*/ + +#define GBE_CTRL_WSTROBE 0 +#define GBE_CTRL_VAR_OFFSET 16 +#define GBE_CTRL_VAR_MASK 0XF +#define GBE_CTRL_RAMADDR_OFFSET 24 +#define GBE_CTRL_RAMADDR_MASK 0X3F +#define GBE_CTRL_INTERFACE 23 + +#define RX_UDP_IP_ADDR 0 +#define RX_UDP_PORTS_ADDR 1 +#define RX_UDP_MAC_L_ADDR 2 +#define RX_UDP_MAC_H_ADDR 3 +#define IPCHECKSUM_ADDR 4 +#define GBE_DELAY_ADDR 5 +#define GBE_RESERVED1_ADDR 6 +#define GBE_RESERVED2_ADDR 7 +#define DETECTOR_MAC_L_ADDR 8 +#define DETECTOR_MAC_H_ADDR 9 +#define DETECTOR_IP_ADDR 10 + + + +/**------------------ +-- pattern registers definitions +--------------------------------------------- */ +#define IOSIGNALS_MASK 0xfffffffffffff +#define ADC_ENABLE_BIT 63 +#define APATTERN_MASK 0xffff +#define ASTART_OFFSET 0 +#define ASTOP_OFFSET 16 +#define PATTERN_CTRL_WRITE_BIT 0 +#define PATTERN_CTRL_READ_BIT 1 +#define PATTERN_CTRL_ADDR_OFFSET 16 +#define MAX_PATTERN_LENGTH 1024 + + +#endif + diff --git a/slsDetectorSoftware/mythen3DetectorServer/mythen3Server b/slsDetectorSoftware/mythen3DetectorServer/mythen3Server new file mode 100755 index 0000000000000000000000000000000000000000..2f0fcf0df512e59de0500d8d3c73cc1d73a081d0 GIT binary patch literal 92440 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

QEBJdSkHKXwK`{H*B25*o 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ℑHz-r&L3);Lt~-f?_y$o}J7@A>?FqJ_HVO3L6| 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 I?CsS3f3U=Yj{pDw literal 0 HcmV?d00001 diff --git a/slsDetectorSoftware/mythen3DetectorServer/mythen3Server.gdb b/slsDetectorSoftware/mythen3DetectorServer/mythen3Server.gdb new file mode 100755 index 0000000000000000000000000000000000000000..4d4b23a68f2b4622c59812d318f09c797cf3a8e1 GIT binary patch literal 435662 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

4U3 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

KwaQwil$H)+f1OMsUf&s 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 literal 0 HcmV?d00001 diff --git a/slsDetectorSoftware/mythen3DetectorServer/mythen3Server_defs.h b/slsDetectorSoftware/mythen3DetectorServer/mythen3Server_defs.h new file mode 100644 index 000000000..705a9f891 --- /dev/null +++ b/slsDetectorSoftware/mythen3DetectorServer/mythen3Server_defs.h @@ -0,0 +1,93 @@ +/* + * mythen3Server_defs.h + * + * Created on: Jan 24, 2013 + * Author: l_maliakal_d, changed my Marie A. + */ + +#ifndef SLSDETECTORSERVER_DEFS_H_ +#define SLSDETECTORSERVER_DEFS_H_ + +#include "sls_detector_defs.h" +#include + +/** This is only an example file!!! */ + + + +#define GOODBYE (-200) +enum ADCINDEX {TEMP_FPGA, TEMP_ADC}; +enum DACINDEX {vIpre, vIbias, Vrf, VrfSh, vIinSh, VdcSh, Vth2, VPL, Vth1, Vth3, Vtrim, casSh, cas, vIbiasSh, vIcin, VPH, NC, vIpreOut}; // Mythen 3.01 +#define DEFAULT_DAC_VALS { 2150, /* vIpre */ \ + 1200, /* vIbias */ \ + 900, /* Vrf */ \ + 1050, /* VrfSh */ \ + 1400, /* vIinSh */ \ + 655, /* VdcSh */ \ + 850, /* Vth2 */ \ + 1400, /* VPL */ \ + 850, /* Vth1 */ \ + 850, /* Vth3 */ \ + 2294, /* Vtrim */ \ + 983, /* casSh */ \ + 1474, /* cas */ \ + 1200, /* vIbiasSh */ \ + 1600, /* vIcin */ \ + 1520, /* VPH */ \ + 0, /* NC */ \ + 1000 /* vIpreOut */ \ + }; + +/*Hardware Definitions +#define NMAXMOD (1) +#define NMOD (1) +#define NCHAN (256 * 256) +#define NCHIP (4) +#define NADC (0) +#define NDAC (16) +#define NGAIN (0) +#define NOFFSET (0) +*/ + +/** Default Parameters */ +#define DEFAULT_EXPTIME (10*1000) //ns + +/* Hardware Definitions */ +//#define NMAXMOD (1) +#define NMOD (1) +//#define NCHAN (256 * 256) +//#define NCHIP (8) +//#define NADC (0) +#define NDAC (8) +#define NDAC_OLDBOARD (16) +#define DYNAMIC_RANGE (16) +#define NUM_BITS_PER_PIXEL (DYNAMIC_RANGE / 8) +#define DATA_BYTES (NCHIP * NCHAN * NUM_BITS_PER_PIXEL) +#define IP_PACKETSIZE (0x2052) +#define CLK_RUN (40) /* MHz */ +#define CLK_SYNC (20) /* MHz */ + + +// Hardware definitions + +#define NCHAN 36 +#define NCHIP 1 +#define NADC 9 // + +/* #ifdef CTB */ +/* #define NDAC 24 */ +/* #define NPWR 5 */ +/* #else */ +/* #define NDAC 16 */ +/* #define NPWR 0 */ +/* #endif */ +#define DAC_CMD_OFF 20 + +#define NMAXMODX 1 +#define NMAXMODY 1 +#define NMAXMOD (NMAXMODX*NMAXMODY) + +#define NCHANS (NCHAN*NCHIP*NMAXMOD) +#define NDACS (NDAC*NMAXMOD) + +#endif /* SLSDETECTORSERVER_DEFS_H_ */ diff --git a/slsDetectorSoftware/mythen3DetectorServer/mythen3Server_funcs.c b/slsDetectorSoftware/mythen3DetectorServer/mythen3Server_funcs.c new file mode 100755 index 000000000..5631c4187 --- /dev/null +++ b/slsDetectorSoftware/mythen3DetectorServer/mythen3Server_funcs.c @@ -0,0 +1,4916 @@ + +#include "sls_detector_defs.h" +#include "mythen3Server_funcs.h" +#include "mythen3FunctionList.h" +#include "communication_funcs.h" +#include "mythen3Server_defs.h" +// #include "mythen3RegisterDefs.h" +// #include "blackfin.h" + +#include +#include +#include + + +// Global variables +extern int lockStatus; +extern char lastClientIP[INET_ADDRSTRLEN]; +extern char thisClientIP[INET_ADDRSTRLEN]; +extern int differentClients; + +//defined in the detector specific Makefile +/*#ifdef MYTHEND +const enum detectorType myDetectorType=MYTHEN; +#elif GOTTHARDD +const enum detectorType myDetectorType=GOTTHARD; +#elif EIGERD +const enum detectorType myDetectorType=EIGER; +#elif PICASSOD +const enum detectorType myDetectorType=PICASSO; +#elif MOENCHD +const enum detectorType myDetectorType=MOENCH; +#elif JUNGFRAUD +const enum detectorType myDetectorType=JUNGFRAU; +#elif MYTHEN3D +const enum detectorType myDetectorType=MYTHEN3D; +#else +const enum detectorType myDetectorType=GENERIC; +#endif +*/ +enum detectorType myDetectorType=MYTHEN3; + +int sockfd; // (updated in slsDetectorServer) as extern +int (*flist[NUM_DET_FUNCTIONS])(int); +char mess[MAX_STR_LENGTH]; +int dataBytes = 10; +int isControlServer = 0; +int debugflag = 0; + +int N_DAC=24; +int N_PWR=5; + +int vPowerLimit = 1400; // mV + +/* initialization functions */ + +int printSocketReadError() { + cprintf(BG_RED, "Error reading from socket. Possible socket crash\n"); + return FAIL; +} + +void basictests(int flag) { + debugflag = flag; +#ifdef SLS_DETECTOR_FUNCTION_LIST + checkFirmwareCompatibility(debugflag); +#endif +} + + +void init_detector(int controlserver) { +// #ifdef VIRTUAL +// printf("This is a VIRTUAL detector\n"); +// #endif + +// #ifdef SLS_DETECTOR_FUNCTION_LIST +// if (controlserver) { +// isControlServer = 1; +// initControlServer(); +// } +// else initStopServer(); +// #endif + + strcpy(mess,"dummy message"); + strcpy(lastClientIP,"none"); + strcpy(thisClientIP,"none1"); + lockStatus=0; + #ifdef MYTHEN3D +printf("This is a mythen3 detector\n"); + #endif +} + + +int decode_function(int file_des) { + int fnum,n; + int ret=FAIL; +#ifdef VERBOSE + printf( "\nreceive data\n"); +#endif + n = receiveData(file_des,&fnum,sizeof(fnum),INT32); + if (n <= 0) { +#ifdef VERBOSE + printf("ERROR reading from socket %d, %d %d (%s)\n", n, fnum, file_des, getFunctionName((enum detFuncs)fnum)); +#endif + return FAIL; + } +#ifdef VERBOSE + else + printf("size of data received %d\n",n); +#endif + +#ifdef VERBOSE + printf(" calling function fnum=%d, (%s) located at 0x%x\n", fnum, getFunctionName((enum detFuncs)fnum), (unsigned int)flist[fnum]); +#endif + if (fnum<0 || fnum>=NUM_DET_FUNCTIONS) { + cprintf(BG_RED,"Unknown function enum %d\n", fnum); + ret=(M_nofunc)(file_des); + }else + ret=(*flist[fnum])(file_des); + if (ret == FAIL) + cprintf(RED, "Error executing the function = %d (%s)\n", fnum, getFunctionName((enum detFuncs)fnum)); + return ret; +} + + +const char* getFunctionName(enum detFuncs func) { + switch (func) { + case F_EXEC_COMMAND: return "F_EXEC_COMMAND"; + case F_GET_ERROR: return "F_GET_ERROR"; + case F_GET_DETECTOR_TYPE: return "F_GET_DETECTOR_TYPE"; + case F_SET_NUMBER_OF_MODULES: return "F_SET_NUMBER_OF_MODULES"; + case F_GET_MAX_NUMBER_OF_MODULES: return "F_GET_MAX_NUMBER_OF_MODULES"; + case F_SET_EXTERNAL_SIGNAL_FLAG: return "F_SET_EXTERNAL_SIGNAL_FLAG"; + case F_SET_EXTERNAL_COMMUNICATION_MODE: return "F_SET_EXTERNAL_COMMUNICATION_MODE"; + case F_GET_ID: return "F_GET_ID"; + case F_DIGITAL_TEST: return "F_DIGITAL_TEST"; + case F_ANALOG_TEST: return "F_ANALOG_TEST"; + case F_ENABLE_ANALOG_OUT: return "F_ENABLE_ANALOG_OUT"; + case F_CALIBRATION_PULSE: return "F_CALIBRATION_PULSE"; + case F_SET_DAC: return "F_SET_DAC"; + case F_GET_ADC: return "F_GET_ADC"; + case F_WRITE_REGISTER: return "F_WRITE_REGISTER"; + case F_READ_REGISTER: return "F_READ_REGISTER"; + case F_WRITE_MEMORY: return "F_WRITE_MEMORY"; + case F_READ_MEMORY: return "F_READ_MEMORY"; + case F_SET_CHANNEL: return "F_SET_CHANNEL"; + case F_GET_CHANNEL: return "F_GET_CHANNEL"; + case F_SET_ALL_CHANNELS: return "F_SET_ALL_CHANNELS"; + case F_SET_CHIP: return "F_SET_CHIP"; + case F_GET_CHIP: return "F_GET_CHIP"; + case F_SET_ALL_CHIPS: return "F_SET_ALL_CHIPS"; + case F_SET_MODULE: return "F_SET_MODULE"; + case F_GET_MODULE: return "F_GET_MODULE"; + case F_SET_ALL_MODULES: return "F_SET_ALL_MODULES"; + case F_SET_SETTINGS: return "F_SET_SETTINGS"; + case F_GET_THRESHOLD_ENERGY: return "F_GET_THRESHOLD_ENERGY"; + case F_SET_THRESHOLD_ENERGY: return "F_SET_THRESHOLD_ENERGY"; + case F_START_ACQUISITION: return "F_START_ACQUISITION"; + case F_STOP_ACQUISITION: return "F_STOP_ACQUISITION"; + case F_START_READOUT: return "F_START_READOUT"; + case F_GET_RUN_STATUS: return "F_GET_RUN_STATUS"; + case F_START_AND_READ_ALL: return "F_START_AND_READ_ALL"; + case F_READ_FRAME: return "F_READ_FRAME"; + case F_READ_ALL: return "F_READ_ALL"; + case F_SET_TIMER: return "F_SET_TIMER"; + case F_GET_TIME_LEFT: return "F_GET_TIME_LEFT"; + case F_SET_DYNAMIC_RANGE: return "F_SET_DYNAMIC_RANGE"; + case F_SET_READOUT_FLAGS: return "F_SET_READOUT_FLAGS"; + case F_SET_ROI: return "F_SET_ROI"; + case F_SET_SPEED: return "F_SET_SPEED"; + case F_EXECUTE_TRIMMING: return "F_EXECUTE_TRIMMING"; + case F_EXIT_SERVER: return "F_EXIT_SERVER"; + case F_LOCK_SERVER: return "F_LOCK_SERVER"; + case F_GET_LAST_CLIENT_IP: return "F_GET_LAST_CLIENT_IP"; + case F_SET_PORT: return "F_SET_PORT"; + case F_UPDATE_CLIENT: return "F_UPDATE_CLIENT"; + case F_CONFIGURE_MAC: return "F_CONFIGURE_MAC"; + case F_LOAD_IMAGE: return "F_LOAD_IMAGE"; + case F_SET_MASTER: return "F_SET_MASTER"; + case F_SET_SYNCHRONIZATION_MODE: return "F_SET_SYNCHRONIZATION_MODE"; + case F_READ_COUNTER_BLOCK: return "F_READ_COUNTER_BLOCK"; + case F_RESET_COUNTER_BLOCK: return "F_RESET_COUNTER_BLOCK"; + case F_CALIBRATE_PEDESTAL: return "F_CALIBRATE_PEDESTAL"; + case F_ENABLE_TEN_GIGA: return "F_ENABLE_TEN_GIGA"; + case F_SET_ALL_TRIMBITS: return "F_SET_ALL_TRIMBITS"; + case F_SET_CTB_PATTERN: return "F_SET_CTB_PATTERN"; + case F_WRITE_ADC_REG: return "F_WRITE_ADC_REG"; + case F_SET_COUNTER_BIT: return "F_SET_COUNTER_BIT"; + case F_PULSE_PIXEL: return "F_PULSE_PIXEL"; + case F_PULSE_PIXEL_AND_MOVE: return "F_PULSE_PIXEL_AND_MOVE"; + case F_PULSE_CHIP: return "F_PULSE_CHIP"; + case F_SET_RATE_CORRECT: return "F_SET_RATE_CORRECT"; + case F_GET_RATE_CORRECT: return "F_GET_RATE_CORRECT"; + case F_SET_NETWORK_PARAMETER: return "F_SET_NETWORK_PARAMETER"; + case F_PROGRAM_FPGA: return "F_PROGRAM_FPGA"; + case F_RESET_FPGA: return "F_RESET_FPGA"; + case F_POWER_CHIP: return "F_POWER_CHIP"; + case F_ACTIVATE: return "F_ACTIVATE"; + case F_PREPARE_ACQUISITION: return "F_PREPARE_ACQUISITION"; + case F_CLEANUP_ACQUISITION: return "F_CLEANUP_ACQUISITION"; + default: return "Unknown Function"; + } +} + +void function_table() { + flist[F_EXEC_COMMAND] = &exec_command; + flist[F_GET_ERROR] = &get_error; + flist[F_GET_DETECTOR_TYPE] = &get_detector_type; + flist[F_SET_NUMBER_OF_MODULES] = &set_number_of_modules; + flist[F_GET_MAX_NUMBER_OF_MODULES] = &get_max_number_of_modules; + flist[F_SET_EXTERNAL_SIGNAL_FLAG] = &set_external_signal_flag; + flist[F_SET_EXTERNAL_COMMUNICATION_MODE] = &set_external_communication_mode; + flist[F_GET_ID] = &get_id; + flist[F_DIGITAL_TEST] = &digital_test; + flist[F_ANALOG_TEST] = &analog_test; + flist[F_ENABLE_ANALOG_OUT] = &enable_analog_out; + flist[F_CALIBRATION_PULSE] = &calibration_pulse; + flist[F_SET_DAC] = &set_dac; + flist[F_GET_ADC] = &get_adc; + flist[F_WRITE_REGISTER] = &write_register; + flist[F_READ_REGISTER] = &read_register; + flist[F_WRITE_MEMORY] = &write_memory; + flist[F_READ_MEMORY] = &read_memory; + flist[F_SET_CHANNEL] = &set_channel; + flist[F_GET_CHANNEL] = &get_channel; + flist[F_SET_ALL_CHANNELS] = &set_all_channels; + flist[F_SET_CHIP] = &set_chip; + flist[F_GET_CHIP] = &get_chip; + flist[F_SET_ALL_CHIPS] = &set_all_chips; + flist[F_SET_MODULE] = &set_module; + flist[F_GET_MODULE] = &get_module; + flist[F_SET_ALL_MODULES] = &set_all_modules; + flist[F_SET_SETTINGS] = &set_settings; + flist[F_GET_THRESHOLD_ENERGY] = &get_threshold_energy; + flist[F_SET_THRESHOLD_ENERGY] = &set_threshold_energy; + flist[F_START_ACQUISITION] = &start_acquisition; + flist[F_STOP_ACQUISITION] = &stop_acquisition; + flist[F_START_READOUT] = &start_readout; + flist[F_GET_RUN_STATUS] = &get_run_status; + flist[F_START_AND_READ_ALL] = &start_and_read_all; + flist[F_READ_FRAME] = &read_frame; + flist[F_READ_ALL] = &read_all; + flist[F_SET_TIMER] = &set_timer; + flist[F_GET_TIME_LEFT] = &get_time_left; + flist[F_SET_DYNAMIC_RANGE] = &set_dynamic_range; + flist[F_SET_READOUT_FLAGS] = &set_readout_flags; + flist[F_SET_ROI] = &set_roi; + flist[F_SET_SPEED] = &set_speed; + flist[F_EXECUTE_TRIMMING] = &execute_trimming; + flist[F_EXIT_SERVER] = &exit_server; + flist[F_LOCK_SERVER] = &lock_server; + flist[F_GET_LAST_CLIENT_IP] = &get_last_client_ip; + flist[F_SET_PORT] = &set_port; + flist[F_UPDATE_CLIENT] = &update_client; + flist[F_CONFIGURE_MAC] = &configure_mac; + flist[F_LOAD_IMAGE] = &load_image; + flist[F_SET_MASTER] = &set_master; + flist[F_SET_SYNCHRONIZATION_MODE] = &set_synchronization; + flist[F_READ_COUNTER_BLOCK] = &read_counter_block; + flist[F_RESET_COUNTER_BLOCK] = &reset_counter_block; + flist[F_CALIBRATE_PEDESTAL] = &calibrate_pedestal; + flist[F_ENABLE_TEN_GIGA] = &enable_ten_giga; + flist[F_SET_ALL_TRIMBITS] = &set_all_trimbits; + flist[F_SET_CTB_PATTERN] = &set_ctb_pattern; + flist[F_WRITE_ADC_REG] = &write_adc_register; + flist[F_SET_COUNTER_BIT] = &set_counter_bit; + flist[F_PULSE_PIXEL] = &pulse_pixel; + flist[F_PULSE_PIXEL_AND_MOVE] = &pulse_pixel_and_move; + flist[F_PULSE_CHIP] = &pulse_chip; + flist[F_SET_RATE_CORRECT] = &set_rate_correct; + flist[F_GET_RATE_CORRECT] = &get_rate_correct; + flist[F_SET_NETWORK_PARAMETER] = &set_network_parameter; + flist[F_PROGRAM_FPGA] = &program_fpga; + flist[F_RESET_FPGA] = &reset_fpga; + flist[F_POWER_CHIP] = &power_chip; + flist[F_ACTIVATE] = &set_activate; + flist[F_PREPARE_ACQUISITION] = &prepare_acquisition; + flist[F_CLEANUP_ACQUISITION] = &cleanup_acquisition; + + // check + if (NUM_DET_FUNCTIONS >= TOO_MANY_FUNCTIONS_DEFINED) { + cprintf(BG_RED,"The last detector function enum has reached its limit\nGoodbye!\n"); + exit(EXIT_FAILURE); + } + +#ifdef VERYVERBOSE + { + int i=0; + for (i = 0; i < NUM_DET_FUNCTIONS ; i++) { + printf("function fnum=%d, (%s) located at 0x%x\n", i, getFunctionName((enum detFuncs)i), (unsigned int)flist[i]); + } + } +#endif +} + + +int M_nofunc(int file_des){ + int ret=FAIL,ret1=FAIL; + int n=0; + + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + + sprintf(mess,"Unrecognized Function. Please do not proceed.\n"); + cprintf(BG_RED,"Error: %s",mess); + n = sendData(file_des,&ret1,sizeof(ret1),INT32); + n = sendData(file_des,mess,sizeof(mess),OTHER); + + // return ok / fail + return ret; +} + + + + + + +/* functions called by client */ + + + +int exec_command(int file_des) { + int ret=OK,ret1=OK; + int n=0; + char cmd[MAX_STR_LENGTH]=""; + int sysret=0; + + // receive arguments + n = receiveData(file_des,cmd,MAX_STR_LENGTH,OTHER); + if (n < 0) return printSocketReadError(); + + // execute action if the arguments correctly arrived +#ifdef VERBOSE + printf("executing command %s\n", cmd); +#endif + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } else { + sysret=system(cmd); + //should be replaced by popen + if (sysret==0) { + sprintf(mess,"Succeeded\n"); + } else { + ret = FAIL; + sprintf(mess,"Executing Command failed\n"); + cprintf(RED, "Warning: %s", mess); + } + } + + ret1=ret; + n = sendData(file_des,&ret1,sizeof(ret),INT32); + n = sendData(file_des,mess,MAX_STR_LENGTH,OTHER); + + // return ok / fail + return ret; +} + + + +int get_error(int file_des) { + int ret=FAIL,ret1=FAIL; + int n=0; + sprintf(mess,"Function (Get Error) is not implemented for this detector\n"); + cprintf(RED, "Error: %s", mess); + + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + + n = sendData(file_des,&ret1,sizeof(ret),INT32); + n = sendData(file_des,mess,MAX_STR_LENGTH,OTHER); + + // return ok / fail + return ret; +} + + + +int get_detector_type(int file_des) { + int ret=OK,ret1=OK; + int n=0; + enum detectorType retval=-1; + + // execute action + retval=myDetectorType; +#ifdef VERBOSE + printf("Returning detector type %d\n",retval); +#endif + + if (differentClients) + ret=FORCE_UPDATE; + + // send ok / fail + n += sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + n += sendData(file_des,&retval,sizeof(retval),INT32); + + // return ok / fail + return ret; + + +} + + + + +int set_number_of_modules(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int retval=0; + int arg[2]={-1,-1}; + sprintf(mess,"set number of modules failed\n"); + + // receive arguments + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + enum dimension dim=arg[0]; + int nm=arg[1]; + + // execute action +#ifdef VERBOSE + printf("Setting the number of modules in dimension %d to %d\n",dim,nm ); +#endif + if (lockStatus && differentClients && nm!=GET_FLAG) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { + retval=setNMod(nm, dim); + dataBytes=calculateDataBytes(); + } +#endif + + if (retval==nm || nm==GET_FLAG) { + ret=OK; + if (differentClients) + ret=FORCE_UPDATE; + } else + ret=FAIL; + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret!=FAIL) { + n += sendData(file_des,&retval,sizeof(retval),INT32); + } else { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + + + +int get_max_number_of_modules(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int retval=-1; + enum dimension arg=0; + sprintf(mess,"get max number of modules failed\n"); + + // receive arguments + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + // execute action +#ifdef VERBOSE + printf("Getting the max number of modules in dimension %d \n",arg); +#endif +#ifdef SLS_DETECTOR_FUNCTION_LIST + retval=getNModBoard(arg); +#endif +#ifdef VERBOSE + printf("Max number of module in dimension %d is %d\n",arg,retval ); +#endif + if (differentClients && ret==OK) { + ret=FORCE_UPDATE; + } + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret!=FAIL) { + n += sendData(file_des,&retval,sizeof(retval),INT32); + } else { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + + + +int set_external_signal_flag(int file_des) { + int ret=OK,ret1=OK; + int n=0; + enum externalSignalFlag retval=GET_EXTERNAL_SIGNAL_FLAG; + sprintf(mess,"set external signal flag failed\n"); + +#ifndef MYTHEND + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Set External Signal Flag) is not implemented for this detector\n"); + cprintf(RED, "%s", mess); +#else + + // receive arguments + int arg[2]={-1,-1}; + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + int signalindex=arg[0]; + enum externalSignalFlag flag=arg[1]; + + // execute action + if (lockStatus && differentClients && flag!=GET_EXTERNAL_SIGNAL_FLAG) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } + +#ifdef SLS_DETECTOR_FUNCTION_LIST + else{ +#ifdef VERBOSE + printf("Setting external signal %d to flag %d\n",signalindex,flag); +#endif + switch (flag) { + case GET_EXTERNAL_SIGNAL_FLAG: + retval=getExtSignal(signalindex); + break; + default: + retval=setExtSignal(signalindex,flag); + if (retval!=flag) { + ret=FAIL; + sprintf(mess,"External signal %d flag should be 0x%04x but is 0x%04x\n", signalindex, flag, retval); + cprintf(RED, "%s", mess); + } + break; + } +#ifdef VERBOSE + printf("Set to flag %d\n",retval); +#endif + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret!=FAIL) { + n += sendData(file_des,&retval,sizeof(retval),INT32); + } else { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; + +} + + +int set_external_communication_mode(int file_des) { + int ret=OK,ret1=OK; + int n=0; + enum externalCommunicationMode arg=GET_EXTERNAL_COMMUNICATION_MODE; + enum externalCommunicationMode retval=GET_EXTERNAL_COMMUNICATION_MODE; + sprintf(mess,"set external communication mode failed\n"); + + // receive arguments + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + // execute action +#ifdef VERBOSE + printf("Setting external communication mode to %d\n", arg); +#endif +#ifdef SLS_DETECTOR_FUNCTION_LIST + switch(arg){ +#ifdef EIGERD + case GET_EXTERNAL_COMMUNICATION_MODE: + case AUTO_TIMING: + case TRIGGER_EXPOSURE: + case GATE_FIX_NUMBER: + case BURST_TRIGGER: +#elif JUNGFRAUD + case GET_EXTERNAL_COMMUNICATION_MODE: + case AUTO_TIMING: + case TRIGGER_EXPOSURE: +#endif + retval=setTiming(arg); + break; + default: + ret = FAIL; + sprintf(mess,"Timing mode (%d) is not implemented for this detector\n",(int)arg); + cprintf(RED, "Warning: %s", mess); + break; + } +#ifdef VERBOSE + if(ret==OK) + printf("retval:%d\n",retval); +#endif + if (ret==OK && differentClients==1) + ret=FORCE_UPDATE; + +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret!=FAIL) { + n += sendData(file_des,&retval,sizeof(retval),INT32); + } else { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + + + +int get_id(int file_des) { + int ret=OK,ret1=OK; + int n=0; + enum idMode arg=0; + int imod=-1; + int64_t retval=-1; + sprintf(mess,"get id failed\n"); + + // receive arguments + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + if (arg == MODULE_FIRMWARE_VERSION) { + n = receiveData(file_des,&imod,sizeof(imod),INT32); + if (n < 0) return printSocketReadError(); + } + + // execute action +#ifdef VERBOSE + printf("Getting id %d\n", arg); +#endif + +#ifdef SLS_DETECTOR_FUNCTION_LIST + switch (arg) { +#ifdef MYTHEND + case MODULE_SERIAL_NUMBER: + case MODULE_FIRMWARE_VERSION: +#ifdef VERBOSE + printf("of module %d\n", imod); +#endif + + if (imod>=0 && imod 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Digital Test) is not implemented for this detector\n"); + cprintf(RED, "%s", mess); +#else + + enum digitalTestMode arg=0; + int imod=-1; + int ival=-1; + + // receive arguments + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + if (arg == CHIP_TEST) { + n = receiveData(file_des,&imod,sizeof(imod),INT32); + if (n < 0) return printSocketReadError(); + } + + if (arg == DIGITAL_BIT_TEST) { + n = receiveData(file_des,&ival,sizeof(ival),INT32); + if (n < 0) return printSocketReadError(); + } + + // execute action + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } else { +#ifdef VERBOSE + printf("Digital test mode %d\n",arg ); +#endif +#ifdef SLS_DETECTOR_FUNCTION_LIST + switch (arg) { + +#ifdef GOTTHARD + case DIGITAL_BIT_TEST: + retval=0; + break; + +#elif MYTHEND + case CHIP_TEST: +#ifdef VERBOSE + printf("of module %d\n", imod); +#endif + if (imod>=0 && imod 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + + n = sendData(file_des,&ret1,sizeof(ret),INT32); + n = sendData(file_des,mess,MAX_STR_LENGTH,OTHER); + + // return ok / fail + return ret; +} + + + +int enable_analog_out(int file_des) { + int ret=FAIL,ret1=FAIL; + int n=0; + sprintf(mess,"Function (Enable Analog Out) is not implemented for this detector\n"); + cprintf(RED, "Error: %s", mess); + + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + + n = sendData(file_des,&ret1,sizeof(ret),INT32); + n = sendData(file_des,mess,MAX_STR_LENGTH,OTHER); + + // return ok / fail + return ret; +} + + + +int calibration_pulse(int file_des) { + int ret=FAIL,ret1=FAIL; + int n=0; + sprintf(mess,"Function (Calibration Pulse) is not implemented for this detector\n"); + cprintf(RED, "Error: %s", mess); + + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + + n = sendData(file_des,&ret1,sizeof(ret),INT32); + n = sendData(file_des,mess,MAX_STR_LENGTH,OTHER); + + // return ok / fail + return ret; +} + + + + +int set_dac(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int arg[3]={-1,-1,-1}; + int val=-1; + enum dacIndex ind=0; + int imod=-1; + double retval[2]={-1,-1}; + int mV=0; + sprintf(mess,"set DAC failed\n"); + + // receive arguments + n = receiveData(file_des,arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + ind=arg[0]; + imod=arg[1]; + mV=arg[2]; + + if (mV) + printf("DAC will be set in mV %d!\n",mV); + else + printf("DAC will be set in DACu! %d\n", mV); + + n = receiveData(file_des,&val,sizeof(val),INT32); + if (n < 0) return printSocketReadError(); + printf("ind = %d val = %d \n", ind,val); + // checks + +#ifdef SLS_DETECTOR_FUNCTION_LIST + if (imod>=getTotalNumberOfModules()) { + ret = FAIL; + sprintf(mess,"Module number %d out of range\n",imod); + cprintf(RED, "Warning: %s", mess); + } +#endif + + // check if dac exists for this detector + enum DACINDEX idac=0; + idac=ind; + printf("idac=%d, ind=%d \n",idac,ind); + printf("Set DAC of Mythen 3 \n"); + + switch (ind) { + + case M_vIpre: + idac = vIpre; + printf("vIpre\n"); + break; + case M_vIbias: + idac = vIbias; + printf("vIbias \n"); + break; + case PREAMP: + idac = Vrf; + printf("Vrf\n"); + break; + case SHAPER1: + idac = VrfSh; + printf("VrfSh\n"); + break; + case M_vIinSh: + idac = vIinSh; + printf("vIinSh \n"); + break; + case M_VdcSh: + idac = VdcSh; + printf("VdcSh \n"); + break; + case THRESHOLD: + idac = Vth1; + printf("Vth1\n"); + break; + case M_Vth2: + idac = Vth2; + printf("Vth2\n"); + break; + case M_Vth3: + idac = Vth3; + printf("Vth3\n"); + break; + case M_VPL: + idac = VPL; + printf("VPL\n"); + break; + case CALIBRATION_PULSE: // !!! pulse height + 1400 DACu + idac = VPH; + printf("VPH\n"); + break; + case TRIMBIT_SIZE: + idac = Vtrim; + printf("Vtrim\n"); + break; + case M_casSh: + idac = casSh; + printf("casSh\n"); + break; + case M_cas: + idac = cas; + pritnf("cas\n"); + break; + case M_vIbiasSh: + idac = vIbiasSh; + printf("vIbiasSh\n"); + break; + case M_vIcin: + idac = vIcin; + printf("vIcin\n"); + break; + case M_vIpreOut: + idac = vIpreOut; + printf("vIpreOut\n"); + break; + case V_POWER_A: + case V_POWER_B: + //case V_POWER_C: + //case V_POWER_D: + case V_POWER_IO: + case V_POWER_CHIP: + case V_LIMIT: + break; + + default: + if(ind<0){ + ret = FAIL; + sprintf(mess,"Dac Index (%d) is not implemented for this detector\n",(int)ind); + cprintf(RED, "Warning: %s", mess); + } + else{ + printf("The dac has no name yet. \n"); + } + break; + } + + + printf("idac=%d, ind=%d \n",idac,ind); + + // execute action +//#ifdef VERBOSE + printf("Setting DAC %d of module %d to %d \n", idac, imod, val); +//#endif +//#ifdef SLS_DETECTOR_FUNCTION_LIST + double temp; + if (ret==OK) { + if (differentClients && lockStatus && val!=-1) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } + else { + + if(ind == V_POWER_A || ind == V_POWER_B || ind == V_POWER_IO){ + printf("Setting a power: %d \n",ind); + if(mV){ + + if( val >=0 && val <=vPowerLimit){ + retval[1] = setPower(ind,val); // in mV + retval[0] = retval[1]*4095/2500.; + } + else if(val==-1){ + retval[1] = setPower(ind,val); + retval[0] = retval[1]*4095/2500.; + printf("READ ONLY: val=-1, read %f mV",retval[1]); + } + else{ + printf("********power %d exceeds voltage limits", ind); + } + } + else{ + printf("********power %d should be set in mV instead of DACu", ind); + } + } + else if(ind == V_LIMIT){ + if(mV){ // without safetycheck + retval[1] = setPower(ind, val); + retval[0] = 0; // to avoid wrong error messages + } + else{ + printf("********power %d should be set in mV instead of DACu", ind); + } + } + //dac: + else{ + if(val==-1){ + retval[0]=setDAC(idac,val,imod,mV); + retval[1]=retval[0]*2500./4095; + printf("READ ONLY: val=-1, read %4.0f DAC \n",retval[0]); + } + else if(mV && (val>0 && val<2500)){ // val given in mV, check that val is not out of range + int dacval = (int)val*4095./2500.; // convert to DACu + retval[1] = setDAC(idac,dacval,imod,mV); + retval[0] = retval[1]*4095./2500.; // convert to DACu (for later printout) + } + else if(!mV && (val>0 && val<4095)){ // val given in DACu + retval[0] = setDAC(idac,val,imod,mV); + retval[1] = retval[0] *2500/4095; // convert to mV + } + + //check + if(retval[0]==-1 || retval[1] == -1){// something in setDAC failed (should never occur) + ret = FAIL; + sprintf(mess,"Setting DAC %d of module %d: wrote %d but read %f\n", idac, imod, val, temp); + cprintf(RED, "Warning: %s", mess); + } + if(mV) + temp = retval[1]; + else + temp = retval[0]; + if ((abs(temp-val)<=5) || val==-1) { // ??? + ret=OK; + } + else { + ret = FAIL; + sprintf(mess,"Setting dac %d of module %d: wrote %d but read %f\n", idac, imod, val, temp); + cprintf(RED, "Warning: %s", mess); + } + } // end else dac + } // end else "detector not locked" + } // end if ret==OK +//#endif +//#ifdef VERBOSE + if(ret==OK){ + printf("DAC set to %4.0f in dac units and %f mV\n", retval[0],retval[1]); + } + else{ + printf("ERROR! Not able to set DAC to %4.0f in dac units and %f mV\n", retval[0],retval[1]); + } +//#endif + + if(ret == OK && differentClients) + ret=FORCE_UPDATE; + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret!=FAIL) { + n += sendData(file_des,&retval,sizeof(retval),INT32); + } else { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + + + + + +int get_adc(int file_des) { + int ret=OK; //ret1=OK; +// int n=0; +// int arg[2]={-1,-1}; +// int retval=-1; +// enum dacIndex ind=0; +// int imod=-1; +// sprintf(mess,"get ADC failed\n"); + +// // receive arguments +// n = receiveData(file_des,arg,sizeof(arg),INT32); +// if (n < 0) return printSocketReadError(); +// ind=arg[0]; +// imod=arg[1]; + +// #ifdef MYTHEND +// #ifdef SLS_DETECTOR_FUNCTION_LIST +// if (imod>=getTotalNumberOfModules() || imod<0) { +// ret = FAIL; +// sprintf(mess,"Module number %d out of range\n",imod); +// cprintf(RED, "Warning: %s", mess); +// } +// #endif +// #endif + +// enum ADCINDEX iadc=0; +// switch (ind) { +// #ifdef EIGERD +// case TEMPERATURE_FPGAEXT: +// iadc = TEMP_FPGAEXT; +// break; +// case TEMPERATURE_10GE: +// iadc = TEMP_10GE; +// break; +// case TEMPERATURE_DCDC: +// iadc = TEMP_DCDC; +// break; +// case TEMPERATURE_SODL: +// iadc = TEMP_SODL; +// break; +// case TEMPERATURE_SODR: +// iadc = TEMP_SODR; +// break; +// case TEMPERATURE_FPGA: +// iadc = TEMP_FPGA; +// break; +// case TEMPERATURE_FPGA2: +// iadc = TEMP_FPGAFEBL; +// break; +// case TEMPERATURE_FPGA3: +// iadc = TEMP_FPGAFEBR; +// break; +// #endif +// #if defined(GOTTHARD) || defined(JUNGFRAUD) +// case TEMPERATURE_FPGA: +// iadc = TEMP_FPGA; +// break; +// case TEMPERATURE_ADC: +// iadc = TEMP_ADC; +// break; +// #endif +// default: +// ret = FAIL; +// sprintf(mess,"Dac Index (%d) is not implemented for this detector\n",(int)ind); +// cprintf(RED, "Warning: %s", mess); +// break; +// } + +// #ifdef VERBOSE +// printf("Getting ADC %d of module %d\n", iadc, imod); +// #endif +// #ifdef SLS_DETECTOR_FUNCTION_LIST +// if (ret==OK) +// retval=getADC(iadc,imod); +// #endif +// #ifdef VERBOSE +// printf("ADC is %f\n", retval); +// #endif + +// if (ret==OK && differentClients) +// ret=FORCE_UPDATE; + +// // ret could be swapped during sendData +// ret1 = ret; +// // send ok / fail +// n = sendData(file_des,&ret1,sizeof(ret),INT32); +// // send return argument +// if (ret!=FAIL) { +// n += sendData(file_des,&retval,sizeof(retval),INT32); +// } else { +// n += sendData(file_des,mess,sizeof(mess),OTHER); +// } + + // return ok / fail + return ret; +} + + + + + +int write_register(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int retval=-1; + sprintf(mess,"write to register failed\n"); + + // receive arguments + int arg[2]={-1,-1}; + n = receiveData(file_des,arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + int addr=arg[0]; + int val=arg[1]; + + // execute action + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { +#ifdef VERBOSE + printf("writing to register 0x%x data 0x%x\n", addr, val); +#endif + retval=writeRegister(addr,val); + if (retval!=val) { + ret = FAIL; + sprintf(mess,"Writing to register 0x%x failed: wrote 0x%x but read 0x%x\n", addr, val, retval); + cprintf(RED, "Warning: %s", mess); + } + } +#endif +#ifdef VERBOSE + printf("Data set to 0x%x\n", retval); +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret!=FAIL) { + n += sendData(file_des,&retval,sizeof(retval),INT32); + } else { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; + +} + + + + + +int read_register(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int retval=-1; + sprintf(mess,"read register failed\n"); + + // receive arguments + int arg=0; + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + int addr=arg; + + // execute action +#ifdef VERBOSE + printf("reading register 0x%x\n", addr); +#endif +#ifdef SLS_DETECTOR_FUNCTION_LIST + retval=readRegister(addr); +#endif +#ifdef VERBOSE + printf("Returned value 0x%x\n", retval); +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret!=FAIL) { + n += sendData(file_des,&retval,sizeof(retval),INT32); + } else { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + + + +int write_memory(int file_des) { + int ret=FAIL,ret1=FAIL; + int n=0; + sprintf(mess,"Function (Write Memory) is not implemented for this detector\n"); + cprintf(RED, "Error: %s", mess); + + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + + n = sendData(file_des,&ret1,sizeof(ret),INT32); + n = sendData(file_des,mess,MAX_STR_LENGTH,OTHER); + + // return ok / fail + return ret; +} + + +int read_memory(int file_des) { + int ret=FAIL,ret1=FAIL; + int n=0; + sprintf(mess,"Function (Read Memory) is not implemented for this detector\n"); + cprintf(RED, "Error: %s", mess); + + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + + n = sendData(file_des,&ret1,sizeof(ret),INT32); + n = sendData(file_des,mess,MAX_STR_LENGTH,OTHER); + + // return ok / fail + return ret; +} + + + +int set_channel(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int retval=-1; + sprintf(mess,"set channel failed\n"); + +#ifndef MYTHEND + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Set Channel) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + // receive arguments + sls_detector_channel myChan; + n=receiveChannel(file_des, &myChan); + if (n < 0) return printSocketReadError(); + + // execute action +#ifdef VERBOSE + printf("Setting channel\n"); + printf("channel number is %d, chip number is %d, module number is %d, register is %lld\n", myChan.chan,myChan.chip, myChan.module, myChan.reg); +#endif + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else if (myChan.chan>=getNumberOfChannelsPerChip()) { + ret = FAIL; + sprintf(mess,"channel number %d too large!\n",myChan.chan); + cprintf(RED, "Warning: %s", mess); + } + else if (myChan.chip>=getNumberOfChipsPerModule()) { + ret = FAIL; + sprintf(mess,"chip number %d too large!\n",myChan.chip); + cprintf(RED, "Warning: %s", mess); + } + else if (myChan.module>=getTotalNumberOfModules()) { + ret = FAIL; + sprintf(mess,"module number %d too large!\n",myChan.module); + cprintf(RED, "Warning: %s", mess); + } + else + retval=setChannel(myChan); +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret!=FAIL) { + n += sendData(file_des,&retval,sizeof(retval),INT32); + } else { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + + + +int get_channel(int file_des) { + int ret=OK,ret1=OK; + int n=0; + sls_detector_channel retval; + sprintf(mess,"get channel failed\n"); + +#ifndef MYTHEND + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Get Channel) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + // receive arguments + int arg[3]={-1,-1,-1}; + n = receiveData(file_des,arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + // execute action + int ichan=arg[0]; + int ichip=arg[1]; + int imod=arg[2]; +#ifdef SLS_DETECTOR_FUNCTION_LIST + if (ichan>=getNumberOfChannelsPerChip()) { + ret=FAIL; + sprintf(mess, "channel number %d too large!\n",myChan.chan); + cprintf(RED, "Warning: %s", mess); + } else + retval.chan=ichan; + if (ichip>=getNumberOfChipsPerModule()) { + ret=FAIL; + sprintf(mess, "chip number %d too large!\n",myChan.chip); + cprintf(RED, "Warning: %s", mess); + } else + retval.chip=ichip; + + if (imod>=getTotalNumberOfModules()) { + ret=FAIL; + sprintf(mess, "module number %d too large!\n",myChan.module); + cprintf(RED, "Warning: %s", mess); + } else { + retval.module=imod; + ret=getChannel(&retval); +#ifdef VERBOSE + printf("Returning channel %d %d %d, 0x%llx\n", retval.chan, retval.chip, retval.mod, (retval.reg)); +#endif + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret!=FAIL) { + ret=sendChannel(file_des, &retval); + } else { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + + +int set_all_channels(int file_des) { + int ret=FAIL,ret1=FAIL; + int n=0; + sprintf(mess,"Function (Set All Channels) is not implemented for this detector\n"); + cprintf(RED, "Error: %s", mess); + + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + + n = sendData(file_des,&ret1,sizeof(ret),INT32); + n = sendData(file_des,mess,MAX_STR_LENGTH,OTHER); + + // return ok / fail + return ret; +} + + + + + +int set_chip(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int retval=-1; + sprintf(mess,"set chip failed\n"); + +#ifndef MYTHEND + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Set Channel) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + sls_detector_chip myChip; + +#ifdef SLS_DETECTOR_FUNCTION_LIST + myChip.nchan=getNumberOfChannelsPerChip(); + int *ch(int*)malloc((myChip.nchan)*sizeof(int)); + myChip.chanregs=ch; + + // receive arguments + n=receiveChip(file_des, &myChip); +#ifdef VERBOSE + printf("Chip received\n"); +#endif + if(n < 0) return FAIL; + + // execute action + if (differentClients==1 && lockStatus==1) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } + else{ +#ifdef VERBOSE + printf("Setting chip\n"); + printf("chip number is %d, module number is %d, register is %d, nchan %d\n",myChip.chip, myChip.module, myChip.reg, myChip.nchan); +#endif + if (myChip.chip>=getNumberOfChipsPerModule()) { + ret = FAIL; + sprintf(mess,"chip number %d too large!\n",myChan.chip); + cprintf(RED, "Warning: %s", mess); + } + else if (myChip.module>=getTotalNumberOfModules()) { + ret = FAIL; + sprintf(mess,"module number %d too large!\n",myChan.module); + cprintf(RED, "Warning: %s", mess); + } + else + retval=setChip(myChip); + } + free(ch); +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret!=FAIL) { + n += sendData(file_des,&retval,sizeof(retval),INT32); + } else { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + + + +int get_chip(int file_des) { + int ret=OK,ret1=OK; + int n=0; + sls_detector_chip retval; + sprintf(mess,"get chip failed\n"); + +#ifndef MYTHEND + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Set Channel) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + // receive arguments + int arg[2]={-1,-1}; + n = receiveData(file_des,arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + +#ifdef SLS_DETECTOR_FUNCTION_LIST + int ichip=arg[0]; + int imod=arg[1]; + + // execute action + if (ichip>=getNumberOfChipsPerModule()) { + ret = FAIL; + sprintf(mess,"channel number %d too large!\n",myChan.chan); + cprintf(RED, "Warning: %s", mess); + } else + retval.chip=ichip; + + if (imod>=getTotalNumberOfModules()) { + ret = FAIL; + sprintf(mess,"module number %d too large!\n",imod); + cprintf(RED, "Warning: %s", mess); + } else + retval.module=imod; + + if (ret==OK) + ret=getChip(&retval); +#endif +#ifdef VERBOSE + printf("Returning chip %d %d\n", ichip, imod); +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret!=FAIL) { + ret=sendChip(file_des, &retval); + } else { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + + + +int set_all_chips(int file_des) { + int ret=FAIL,ret1=FAIL; + int n=0; + sprintf(mess,"Function (Set All Chips) is not implemented for this detector\n"); + cprintf(RED, "Error: %s", mess); + + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + + n = sendData(file_des,&ret1,sizeof(ret),INT32); + n = sendData(file_des,mess,MAX_STR_LENGTH,OTHER); + + // return ok / fail + return ret; +} + + + + + +int set_module(int file_des) { + return -1; +} + /*int ret=OK,ret1=OK; + int n=0; + sls_detector_module myModule; + int retval=-1; +#ifdef EIGERD + int myIODelay=-1; + int myTau=-1; + int myEV=-1; +#endif + sprintf(mess,"set module failed\n"); + +#ifdef SLS_DETECTOR_FUNCTION_LIST + int *myDac=NULL; + int *myAdc=NULL; + int *myChip = NULL; + int *myChan = NULL; + + myDac=(int*)malloc(getNumberOfDACsPerModule()*sizeof(int)); + if (getNumberOfDACsPerModule() > 0 && myDac == NULL) { + ret = FAIL; + sprintf(mess,"could not allocate dacs\n"); + cprintf(RED, "Warning: %s", mess); + } + else { + myModule.dacs=myDac; + myAdc=(int*)malloc(getNumberOfADCsPerModule()*sizeof(int)); + if (getNumberOfADCsPerModule() > 0 && myAdc == NULL) { + ret = FAIL; + sprintf(mess,"could not allocate adcs\n"); + cprintf(RED, "Warning: %s", mess); + } + else { + myModule.adcs=myAdc; + //no chips and chans allocated for jungfrau, too much memory +#ifdef JUNGFRAUD + myModule.chipregs=NULL; + myModule.chanregs=NULL; +#else + myChip=(int*)malloc(getNumberOfChipsPerModule()*sizeof(int)); + if (getNumberOfChipsPerModule() > 0 && myChip == NULL) { + ret = FAIL; + sprintf(mess,"could not allocate chips\n"); + cprintf(RED, "Warning: %s", mess); + } + else { + myModule.chipregs=myChip; + myChan=(int*)malloc(getNumberOfChannelsPerModule()*sizeof(int)); + if (getNumberOfChannelsPerModule() > 0 && myChan == NULL) { + ret = FAIL; + sprintf(mess,"could not allocate chans\n"); + cprintf(RED, "Warning: %s", mess); + } + else { + myModule.chanregs=myChan; +#endif + myModule.nchip=getNumberOfChipsPerModule(); + myModule.nchan=getNumberOfChannelsPerModule(); + myModule.ndac=getNumberOfDACsPerModule(); + myModule.nadc=getNumberOfADCsPerModule(); + + + // receive arguments +#ifdef VERBOSE + printf("Setting module\n"); +#endif + n=receiveModuleGeneral(file_des, &myModule, +#ifdef JUNGFRAUD + 0 //0 is to receive partially (without trimbits etc.) +#else + 1 +#endif + ); + if (n<0) return FAIL; +#ifdef VERBOSE + printf("module number is %d,register is %d, nchan %d, nchip %d, ndac %d, nadc %d, gain %f, offset %f\n", + myModule.module, myModule.reg, myModule.nchan, myModule.nchip, myModule.ndac, myModule.nadc, myModule.gain,myModule.offset); +#endif +#ifdef EIGERD + n = receiveData(file_des,&myIODelay,sizeof(myIODelay),INT32); + if (n<0) return FAIL; + n = receiveData(file_des,&myTau,sizeof(myTau),INT32); + if (n<0) return FAIL; + n = receiveData(file_des,&myEV,sizeof(myEV),INT32); + if (n<0) return FAIL; +#ifdef VERBOSE + printf("IO Delay:%d\n",myIODelay); + printf("Tau:%d\n",myTau); + printf("eV:%d\n",myEV); +#endif +#endif +#ifndef JUNGFRAUD + } + } +#endif + } + } + + //check settings index + if (ret==OK) { +#ifdef MYTHEND + if (myModule.module>=getNModBoard()) { + ret = FAIL; + sprintf(mess,"Module Number to Set Module (%d) is too large\n", myModule.module); + cprintf(RED, "Warning: %s", mess); + } + if (myModule.module<0) + myModule.module=ALLMOD; +#endif +#if defined(JUNGFRAUD) || defined(EIGERD) + switch(myModule.reg){ + case GET_SETTINGS: + case UNINITIALIZED: +#ifdef EIGERD + case STANDARD: + case HIGHGAIN: + case LOWGAIN: + case VERYHIGHGAIN: + case VERYLOWGAIN: +#elif JUNGFRAUD + case DYNAMICGAIN: + case DYNAMICHG0: + case FIXGAIN1: + case FIXGAIN2: + case FORCESWITCHG1: + case FORCESWITCHG2: +#endif + break; + default: + ret = FAIL; + sprintf(mess,"Setting (%d) is not implemented for this detector\n", myModule.reg); + cprintf(RED, "Warning: %s", mess); + break; + } + } +#endif + + + // execute action + if (ret==OK) { + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef EIGERD + //set dacs, trimbits and iodelay + ret=setModule(myModule, myIODelay); + //set threshhold + if (myEV >= 0) + setThresholdEnergy(myEV,-1); + else { + //changes settings to undefined (loading a random trim file) + setSettings(UNDEFINED,-1); + cprintf(RED,"Settings has been changed to undefined (random trim file)\n"); + } + //rate correction + //switch off rate correction: no value read from load calib/load settings) + if(myTau == -1){ + if(getRateCorrectionEnable()){ + setRateCorrection(0); + ret = FAIL; + strcat(mess,"Cannot set Rate correction. No default tau provided. Deactivating Rate Correction\n"); + cprintf(RED, "Warning: %s", mess); + } + } + //normal tau value (only if enabled) + else{ + setDefaultSettingsTau_in_nsec(myTau); + if (getRateCorrectionEnable()){ + int64_t retvalTau = setRateCorrection(myTau); + if(myTau != retvalTau){ + cprintf(RED,"%s",mess); + ret=FAIL; + } + } + } + retval = getSettings(); +#else + retval=setModule(myModule); + if (retval != myModule.reg) + ret = FAIL; +#endif + if(myChip != NULL) free(myChip); + if(myChan != NULL) free(myChan); + if(myDac != NULL) free(myDac); + if(myAdc != NULL) free(myAdc); + } + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret!=FAIL) { + n += sendData(file_des,&retval,sizeof(retval),INT32); + } else { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +}*/ + + + + + + + + + +int get_module(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int arg=-1; + int imod=-1; + sls_detector_module myModule; + sprintf(mess,"get module failed\n"); + + // receive arguments + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + imod=arg; + + // execute action +#ifdef SLS_DETECTOR_FUNCTION_LIST + int *myDac=NULL; + int *myAdc=NULL; + int *myChip = NULL; + int *myChan = NULL; + + if (imod<0 || imod>getTotalNumberOfModules()) { + ret = FAIL; + sprintf(mess,"Module Index (%d) is out of range\n", imod); + cprintf(RED, "Warning: %s", mess); + } + else { + myDac=(int*)malloc(getNumberOfDACsPerModule()*sizeof(int)); + if (getNumberOfDACsPerModule() > 0 && myDac == NULL) { + ret = FAIL; + sprintf(mess,"could not allocate dacs\n"); + cprintf(RED, "Warning: %s", mess); + } + else { + myModule.dacs=myDac; + myAdc=(int*)malloc(getNumberOfADCsPerModule()*sizeof(int)); + if (getNumberOfADCsPerModule() > 0 && myAdc == NULL) { + ret = FAIL; + sprintf(mess,"could not allocate adcs\n"); + cprintf(RED, "Warning: %s", mess); + } + else { + myModule.adcs=myAdc; + //no chips and chans allocated for jungfrau, too much memory +#ifdef JUNGFRAUD + myModule.chipregs=NULL; + myModule.chanregs=NULL; +#else + myChip=(int*)malloc(getNumberOfChipsPerModule()*sizeof(int)); + if (getNumberOfChipsPerModule() > 0 && myChip == NULL) { + ret = FAIL; + sprintf(mess,"could not allocate chips\n"); + cprintf(RED, "Warning: %s", mess); + } + else { + myModule.chipregs=myChip; + myChan=(int*)malloc(getNumberOfChannelsPerModule()*sizeof(int)); + if (getNumberOfChannelsPerModule() > 0 && myChan == NULL) { + ret = FAIL; + sprintf(mess,"could not allocate chans\n"); + cprintf(RED, "Warning: %s", mess); + } + else { + myModule.chanregs=myChan; +#endif + myModule.nchip=getNumberOfChipsPerModule(); + myModule.nchan=getNumberOfChannelsPerModule(); + myModule.ndac=getNumberOfDACsPerModule(); + myModule.nadc=getNumberOfADCsPerModule(); + myModule.module=imod; + getModule(&myModule); +#ifdef VERBOSE + printf("Returning module %d of register %x\n", imod, myModule.reg); +#endif +#ifndef JUNGFRAUD + } + } +#endif + } + } + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret!=FAIL) { + ret=sendModuleGeneral(file_des, &myModule, +#ifdef JUNGFRAUD + 0 //0 is to receive partially (without trimbits etc.) +#else + 1 +#endif + ); + } else { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + +#ifdef SLS_DETECTOR_FUNCTION_LIST + if(myChip != NULL) free(myChip); + if(myChan != NULL) free(myChan); + if(myDac != NULL) free(myDac); + if(myAdc != NULL) free(myAdc); +#endif + + // return ok / fail + return ret; + +} + + + +int set_all_modules(int file_des) { + int ret=FAIL,ret1=FAIL; + int n=0; + sprintf(mess,"Function (Set All Modules) is not implemented for this detector\n"); + cprintf(RED, "Error: %s", mess); + + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + + n = sendData(file_des,&ret1,sizeof(ret),INT32); + n = sendData(file_des,mess,MAX_STR_LENGTH,OTHER); + + // return ok / fail + return ret; +} + + + + +int set_settings(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int arg[2]={-1,-1}; + int retval=-1; + int imod=-1; + enum detectorSettings isett=-1; + sprintf(mess,"set settings failed\n"); + + // receive arguments + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + imod=arg[1]; + isett=arg[0]; + + // execute action + if (differentClients && lockStatus && isett!=GET_SETTINGS) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else if (imod>=getTotalNumberOfModules()) { + ret = FAIL; + sprintf(mess,"Module number %d out of range\n",imod); + cprintf(RED, "Warning: %s", mess); + } + else { +#ifdef VERBOSE + printf("Changing settings of module %d to %d\n", imod, isett); +#endif + retval=setSettings(isett, imod); +#ifdef VERBOSE + printf("Settings changed to %d\n", isett); +#endif + if (retval==isett || isett<0) { + ret=OK; + } else { + ret = FAIL; + sprintf(mess,"Changing settings of module %d: wrote %d but read %d\n", imod, isett, retval); + cprintf(RED, "Warning: %s", mess); + } + } +#endif + + if (ret==OK && differentClients) + ret=FORCE_UPDATE; + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&retval,sizeof(retval),INT32); + + // return ok / fail + return ret; +} + + + + + +int get_threshold_energy(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int retval=-1; + sprintf(mess,"get threshold energy failed\n"); + +#if !defined(MYTHEND) && !defined(EIGERD) + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Get Threshold Energy) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + // receive arguments + int imod=-1; + n = receiveData(file_des,&imod,sizeof(imod),INT32); + if (n < 0) return printSocketReadError(); + + // execute action +#ifdef VERBOSE + printf("Getting threshold energy of module %d\n", imod); +#endif +#ifdef SLS_DETECTOR_FUNCTION_LIST + if (imod>=getTotalNumberOfModules()) { + ret=FAIL; + sprintf(mess,"Module number %d out of range\n",imod); + } + else { + retval=getThresholdEnergy(imod); +#ifdef VERBOSE + printf("Threshold is %d eV\n", retval); +#endif + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&retval,sizeof(retval),INT32); + + // return ok / fail + return ret; +} + + + + +int set_threshold_energy(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int retval=-1; + sprintf(mess,"set thhreshold energy failed\n"); + +#ifndef MYTHEND + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; +#ifdef EIGERD + sprintf(mess,"Function (Set Threshold Energy) is only implemented via Set Settings for this detector\n"); +#else + sprintf(mess,"Function (Set Threshold Energy) is not implemented for this detector\n"); +#endif + cprintf(RED, "Warning: %s", mess); +#else + + // receive arguments + int arg[3]={-1,-1,-1}; + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + // execute action + int ethr=arg[0]; + int imod=arg[1]; + enum detectorSettings isett=arg[2]; + if (differentClients && lockStatus) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else if (imod>=getTotalNumberOfModules()) { + ret=FAIL; + sprintf(mess,"Module number %d out of range\n",imod); + } + else { + printf("Setting threshold energy of module %d to %d eV with settings %d\n", imod, ethr, isett); + retval=setThresholdEnergy(ethr, imod); +#ifdef VERBOSE + printf("Threshold set to %d eV\n", retval); +#endif + if (retval!=ethr) { + ret=FAIL; + sprintf(mess,"Setting threshold of module %d: wrote %d but read %d\n", imod, ethr, retval); + cprintf(RED, "Warning: %s", mess); + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&retval,sizeof(retval),INT32); + + // return ok / fail + return ret; +} + + + + + +int start_acquisition(int file_des) { + int ret=OK,ret1=OK; + int n=0; + sprintf(mess,"start acquisition failed\n"); + + // execute action + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { + printf("Starting acquisition\n"); + ret=startStateMachine(); + if (ret==FAIL) + cprintf(RED, "Warning: %s", mess); + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + + +int stop_acquisition(int file_des) { + int ret=OK,ret1=OK; + int n=0; + sprintf(mess,"stop acquisition failed\n"); + + // execute action + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { + printf("Stopping acquisition\n"); + ret=stopStateMachine(); + if (ret==FAIL) + cprintf(RED, "Warning: %s", mess); + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + + + + +int start_readout(int file_des) { + int ret=OK,ret1=OK; + int n=0; + sprintf(mess,"start readout failed\n"); + +#ifdef JUNGFRAUD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Start Readout) is not implemented for this detector\n"); + cprintf(RED, "%s", mess); +#else + + // execute action + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { + printf("Starting readout\n"); + ret=startReadOut(); + if (ret==FAIL) + cprintf(RED, "Warning: %s", mess); + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + + + + + +int get_run_status(int file_des) { + int ret=OK,ret1=OK; + enum runStatus s=ERROR; + + // execute action +#ifdef VERBOSE + printf("Getting status\n"); +#endif +#ifdef SLS_DETECTOR_FUNCTION_LIST + s= getRunStatus(); +#endif + if (differentClients) + ret=FORCE_UPDATE; + + // send ok / fail + sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + sendData(file_des,&s,sizeof(s),INT32); + + // return ok / fail + return ret; +} + + + + + +int start_and_read_all(int file_des) { + int dataret1=FAIL, dataret=FAIL; +#ifdef VERBOSE + printf("Starting and reading all frames\n"); +#endif + + // execute action + if (differentClients && lockStatus) { + dataret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + // ret could be swapped during sendData + dataret1 = dataret; + // send fail + sendData(file_des,&dataret1,sizeof(dataret),INT32); + // send return argument + sendData(file_des,mess,sizeof(mess),OTHER); + // return fail + return dataret; + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + startStateMachine(); + read_all(file_des); +#endif + return OK; +} + + + + +int read_frame(int file_des) { + int dataret1=FAIL, dataret=FAIL; + int n=0; + sprintf(mess, "read frame failed\n"); + + // execute action + if (differentClients && lockStatus) { + dataret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + // ret could be swapped during sendData + dataret1 = dataret; + // send fail + sendData(file_des,&dataret1,sizeof(dataret),INT32); + // send return argument + sendData(file_des,mess,sizeof(mess),OTHER); + // return fail + return dataret; + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + readFrame(&dataret, mess); +#endif + if(dataret == FAIL) + cprintf(RED,"%s\n",mess); + else + cprintf(GREEN,"%s",mess); + + if (differentClients) + dataret=FORCE_UPDATE; + + //dataret could be swapped during sendData + dataret1 = dataret; + // send finished / fail + n=sendData(file_des,&dataret1,sizeof(dataret1),INT32); + if (n<0) return FAIL; // if called from read_all, should fail to stop talking to a closed client socket + // send return argument + n=sendData(file_des,mess,sizeof(mess),OTHER); + if (n<0) return FAIL; // if called from read_all, should fail to stop talking to a closed client socket + // return finished / fail + return dataret; +} + + + + +int read_all(int file_des) { +#ifdef SLS_DETECTOR_FUNCTION_LIST + while(read_frame(file_des)==OK) { +#ifdef VERBOSE + printf("frame read\n"); +#endif + ; + } +#endif +#ifdef VERBOSE + printf("Frames finished or failed\n"); +#endif + return OK; +} + + + + +int set_timer(int file_des) { + int ret=OK,ret1=OK; + int n=0; + enum timerIndex ind=0; + int64_t tns=-1; + int64_t retval=-1; + sprintf(mess,"set timer failed\n"); + + // receive arguments + n = receiveData(file_des,&ind,sizeof(ind),INT32); + if (n < 0) return printSocketReadError(); + + n = receiveData(file_des,&tns,sizeof(tns),INT64); + if (n < 0) return printSocketReadError(); + + // execute action + if (differentClients && lockStatus && tns!=-1) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { +#ifdef VERBOSE + printf("setting timer %d to %lld ns\n",ind,tns); +#endif + switch(ind) { +#ifdef EIGERD + case SUBFRAME_ACQUISITION_TIME: + if (tns > ((int64_t)MAX_SUBFRAME_EXPOSURE_VAL_IN_10NS*10) ){ + ret=FAIL; + strcpy(mess,"Sub Frame exposure time should not exceed 5.368 seconds\n"); + break; + } +#endif +#ifdef MYTHEN + case PROBES_NUMBER: + case GATES_NUMBER: + case DELAY_AFTER_TRIGGER: +#elif JUNGFRAUD + case DELAY_AFTER_TRIGGER: +#endif + case FRAME_NUMBER: + case ACQUISITION_TIME: // for all detectors + case FRAME_PERIOD: + case CYCLES_NUMBER: + retval = setTimer(ind,tns); + break; + default: + ret = FAIL; + sprintf(mess,"Timer Index (%d) is not implemented for this detector\n", (int) ind); + cprintf(RED, "%s", mess); + break; + } +#if defined(MYTHEND) || defined(GOTTHARD) + if (ret == OK && ind==FRAME_NUMBER) { + ret=allocateRAM(); + if (ret!=OK) { + ret = FAIL; + sprintf(mess,"Could not allocate RAM for %lld frames\n", tns); + cprintf(RED, "%s", mess); + } + } +#endif + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&retval,sizeof(retval),INT64); + + // return ok / fail + return ret; +} + + + + + + + + + +int get_time_left(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int64_t retval=-1; + sprintf(mess,"get timer left failed\n"); + + + +#ifdef EIGERD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Get Timer Left) is not implemented for this detector\n"); + cprintf(RED, "%s", mess); +#else + + // receive arguments + enum timerIndex ind=0; + n = receiveData(file_des,&ind,sizeof(ind),INT32); + if (n < 0) return printSocketReadError(); + +#ifdef VERBOSE + printf("getting time left on timer %d \n",ind); +#endif +#ifdef SLS_DETECTOR_FUNCTION_LIST + switch(ind) { +#ifdef MYTHEND + case PROBES_NUMBER: +#endif + case FRAME_NUMBER: + case ACQUISITION_TIME: + case FRAME_PERIOD: + case DELAY_AFTER_TRIGGER: +#ifndef JUNGFRAUD + case GATES_NUMBER: +#endif + case CYCLES_NUMBER: + case PROGRESS: + case ACTUAL_TIME: + case MEASUREMENT_TIME: +#ifdef JUNGFRAUD + case FRAMES_FROM_START: + case FRAMES_FROM_START_PG: +#endif + retval=getTimeLeft(ind); + break; + default: + ret = FAIL; + sprintf(mess,"Timer Left Index (%d) is not implemented for this detector\n", (int)ind); + cprintf(RED, "%s", mess); + break; + } +#ifdef VERBOSE + printf("Time left on timer %d is %lld\n",ind, retval); +#endif +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&retval,sizeof(retval),INT64); + + // return ok / fail + return ret; +} + + + + + + +int set_dynamic_range(int file_des) { + int ret=OK,ret1=OK; + int rateret=OK,rateret1=OK; + int n=0; + int dr=-1; + int retval=-1; + sprintf(mess,"set dynamic range failed\n"); + + // receive arguments + n = receiveData(file_des,&dr,sizeof(dr),INT32); + if (n < 0) return printSocketReadError(); + + // execute action + if (differentClients && lockStatus && dr>=0) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { + switch(dr){ + case -1: + case 16: +#ifdef EIGERD + case 4: case 8: case 32: +#endif + break; + default: + ret = FAIL; + sprintf(mess,"Dynamic Range (%d) is not implemented for this detector\n", dr); + cprintf(RED, "Warning: %s", mess); + } + } + if(ret == OK){ +#ifdef EIGERD + int old_dr = setDynamicRange(-1); + retval=setDynamicRange(dr); + if (dr>=0 && retval!=dr) + ret=FAIL; + //look at rate correction only if dr change worked + if((ret==OK) && (dr!=32) && (dr!=16) && (dr!=-1) && (getRateCorrectionEnable())){ + setRateCorrection(0); + rateret = FAIL; + strcpy(mess,"Switching off Rate Correction. Must be in 32 or 16 bit mode\n"); + cprintf(RED,"%s",mess); + }else{ + //setting it if dr changed from 16 to 32 or vice versa with tau value as in rate table + if((dr!=-1) && (old_dr != dr) && getRateCorrectionEnable() && (dr == 16 || dr == 32)){ + setRateCorrection(-1); //tau_ns will not be -1 here + if(!getRateCorrectionEnable()){ + ret = FAIL; + strcpy(mess,"Deactivating Rate Correction. Could not set it.\n"); + cprintf(RED,"%s",mess); + } + } + } + +#else + retval = setDynamicRange(dr); +#endif + if (dr>=0) dataBytes=calculateDataBytes(); + } +#endif + if ((ret == OK) && dr>=0 && retval!=dr) { + ret = FAIL; + cprintf(RED,"%s",mess); + } + if (ret==OK && differentClients) + ret=FORCE_UPDATE; + + //rate correction ret + // ret could be swapped during sendData + rateret1 = rateret; + // send ok / fail + n = sendData(file_des,&rateret1,sizeof(rateret1),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&retval,sizeof(retval),INT32); + + // return ok / fail + return ret; +} + + + + + + +int set_readout_flags(int file_des) { + int ret=OK,ret1=OK; + int n=0; + enum readOutFlags retval=-1; + sprintf(mess,"set readout flags failed\n"); + +#if !defined(MYTHEND) && !defined(EIGERD) + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret=FAIL; + sprintf(mess,"Function (Set Read Out Flags) is not implemented for this detector\n"); + cprintf(RED, "%s",mess); +#else + + // receive arguments + enum readOutFlags arg=-1; + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + // execute action + if (differentClients && lockStatus && arg!=GET_READOUT_FLAGS) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { +#ifdef VERBOSE + printf("setting readout flags to %d\n",arg); +#endif + switch(arg) { + case GET_READOUT_FLAGS: +#ifdef MYTHEND + case TOT_MODE: + case NORMAL_READOUT: + case STORE_IN_RAM: + case CONTINOUS_RO: +#elif EIGERD + case STORE_IN_RAM: + case CONTINOUS_RO: + case PARALLEL: + case NONPARALLEL: + case SAFE: +#endif + retval=setReadOutFlags(arg); + break; + default: + ret = FAIL; + sprintf(mess,"Readout Flag Index (%d) is not implemented for this detector\n", (int)arg); + cprintf(RED, "Warning: %s", mess); + break; + } +#endif + if (ret==OK && ((retval == -1) || ((arg!=-1) && ((retval&arg)!=arg)))){ + ret = FAIL; + sprintf(mess,"Could not change readout flag: should be 0x%x but is 0x%x\n", arg, retval); + cprintf(RED, "Warning: %s", mess); + } + + if (ret==OK && differentClients) + ret=FORCE_UPDATE; + } +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&retval,sizeof(retval),INT32); + + // return ok / fail + return ret; +} + + + + + + +int set_roi(int file_des) { + int ret=OK,ret1=OK; + int n=0; + strcpy(mess,"set nroi failed\n"); + +#ifndef GOTTHARDD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret=FAIL; + sprintf(mess,"Function (Set ROI) is not implemented for this detector\n"); + cprintf(RED, "%s",mess); +#else + + ROI* retval=0; + int retvalsize=0,retvalsize1=0; + + // receive arguments + int nroi=-1; + ROI arg[MAX_ROIS]; + n = receiveData(file_des,&nroi,sizeof(nroi),INT32); + if (n < 0) return printSocketReadError(); + + { + int i; + if(nroi!=-1){ + for(i=0;i=0) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { +#ifdef VERBOSE + printf("setting speed variable %d to %d\n",arg,val); +#endif + switch (arg) { +#ifdef JUNGFRAUD + case ADC_PHASE: + adcPhase(val); + break; +#endif +#ifdef MYTHEND + case CLOCK_DIVIDER: + case WAIT_STATES: + case SET_SIGNAL_LENGTH: + case TOT_CLOCK_DIVIDER: + case TOT_DUTY_CYCLE: +#elif EIGERD + case CLOCK_DIVIDER: +#elif JUNGFRAUD + case CLOCK_DIVIDER: +#endif + retval=setSpeed(arg, val); + if ((retval!=val) && (val>=0)) { + ret=FAIL; + sprintf(mess,"could not change speed variable %d: should be %d but is %d \n",arg, val, retval); + cprintf(RED, "Warning: %s", mess); + } + break; + default: + ret = FAIL; + sprintf(mess,"Speed Index (%d) is not implemented for this detector\n",(int) arg); + cprintf(RED, "Warning: %s", mess); + break; + } + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&retval,sizeof(retval),INT32); + + // return ok / fail + return ret; +} + + + + + +int execute_trimming(int file_des) { + int ret=OK,ret1=OK; + int n=0; + sprintf(mess,"execute trimming failed\n"); + +#ifndef MYTHEND + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Execute Trimming) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + int retval=-1; + + // receive arguments + enum trimMode mode=0; + int arg[3]={-1,-1,-1}; + n = receiveData(file_des,&mode,sizeof(mode),INT32); + if (n < 0) return printSocketReadError(); + + n = receiveData(file_des,arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + // execute action + int imod, par1,par2; + imod=arg[0]; + par1=arg[1]; + par2=arg[2]; + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else if (imod>=getTotalNumberOfModules()) { + ret = FAIL; + sprintf(mess,"Module Number (%d) is out of range\n"); + cprintf(RED, "Warning: %s", mess); + } + else { +#ifdef VERBOSE + printf("trimming module %d mode %d, parameters %d %d \n",imod,mode, par1, par2); +#endif + switch(mode) { + case NOISE_TRIMMING: + case BEAM_TRIMMING: + case IMPROVE_TRIMMING: + case FIXEDSETTINGS_TRIMMING: + retval=executeTrimming(mode, par1, par2, imod); + if ((ret!=OK) && (retval>0)) { + ret=FAIL; + sprintf(mess,"Could not trim %d channels\n", retval); + cprintf(RED, "Warning: %s", mess); + } + break; + default: + ret = FAIL; + sprintf(mess,"Trimming Mode (%d) is not implemented for this detector\n", (int) mode); + cprintf(RED, "Warning: %s", mess); + break; + } + + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + + + + +int exit_server(int file_des) { + int ret=FAIL; + sprintf(mess,"Closing Server\n"); + cprintf(BG_RED,"Error: %s",mess); + // send ok / fail + sendData(file_des,&ret,sizeof(ret),INT32); + // send return argument + sendData(file_des,mess,sizeof(mess),OTHER); + return GOODBYE; +} + + + + +int lock_server(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int lock=0; + sprintf(mess,"lock server failed\n"); + + // receive arguments + n = receiveData(file_des,&lock,sizeof(lock),INT32); + if (n < 0) return printSocketReadError(); + + // execute action + if (lock>=0) { + if (lockStatus==0 || strcmp(lastClientIP,thisClientIP)==0 || strcmp(lastClientIP,"none")==0) { + lockStatus=lock; + strcpy(lastClientIP,thisClientIP); + } else { + ret = FAIL; + sprintf(mess,"Server already locked by %s\n", lastClientIP); + cprintf(RED, "Warning: %s", mess); + } + } + if (ret==OK && differentClients) + ret=FORCE_UPDATE; + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&lockStatus,sizeof(lockStatus),INT32); + + // return ok / fail + return ret; +} + + + + + +int get_last_client_ip(int file_des) { + int ret=OK,ret1=OK; + if (differentClients) + ret=FORCE_UPDATE; + // send ok / fail + sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + sendData(file_des,lastClientIP,sizeof(lastClientIP),OTHER); + // return ok / fail + return ret; +} + + + + +int set_port(int file_des) { + int ret=OK,ret1=OK; + int n=0; + enum portType p_type=0; + int p_number=-1; + sprintf(mess,"set port failed\n"); + + // receive arguments + n = receiveData(file_des,&p_type,sizeof(p_type),INT32); + if (n < 0) return printSocketReadError(); + + n = receiveData(file_des,&p_number,sizeof(p_number),INT32); + if (n < 0) return printSocketReadError(); + + // execute action + int sd=-1; + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } + else { + if (p_number<1024) { + ret = FAIL; + sprintf(mess,"Port Number (%d) too low\n", p_number); + cprintf(RED, "Warning: %s", mess); + } + printf("set port %d to %d\n",p_type, p_number); + sd=bindSocket(p_number); + if (sd<0) { + ret = FAIL; + sprintf(mess,"Could not bind port %d\n", p_number); + cprintf(RED, "Warning: %s", mess); + if (sd==-10) { + ret = FAIL; + sprintf(mess,"Port %d already set\n", p_number); + cprintf(RED, "Warning: %s", mess); + } + } + if (ret==OK && differentClients) + ret=FORCE_UPDATE; + } + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n = sendData(file_des,mess,sizeof(mess),OTHER); + } else { + n = sendData(file_des,&p_number,sizeof(p_number),INT32); + closeConnection(file_des); + exitServer(sockfd); + sockfd=sd; + } + + // return ok / fail + return ret; +} + + + + +int update_client(int file_des) { + int ret=OK; + sendData(file_des,&ret,sizeof(ret),INT32); + return send_update(file_des); +} + + + + +int send_update(int file_des) { + int n=0; // if (n<0) should fail to stop talking to a closed client socket + int nm=0; + int64_t retval = 0; + enum detectorSettings t; + + n = sendData(file_des,lastClientIP,sizeof(lastClientIP),OTHER); + if (n < 0) return printSocketReadError(); + + +#ifdef SLS_DETECTOR_FUNCTION_LIST + nm=setNMod(GET_FLAG,X); +#endif + n = sendData(file_des,&nm,sizeof(nm),INT32); + if (n < 0) return printSocketReadError(); + + +#ifdef SLS_DETECTOR_FUNCTION_LIST + nm=setNMod(GET_FLAG,Y); +#endif + n = sendData(file_des,&nm,sizeof(nm),INT32); + if (n < 0) return printSocketReadError(); + + +#ifdef SLS_DETECTOR_FUNCTION_LIST + nm=setDynamicRange(GET_FLAG); +#endif + n = sendData(file_des,&nm,sizeof(nm),INT32); + if (n < 0) return printSocketReadError(); + + +#ifdef SLS_DETECTOR_FUNCTION_LIST + dataBytes=calculateDataBytes(); +#endif + n = sendData(file_des,&dataBytes,sizeof(dataBytes),INT32); + if (n < 0) return printSocketReadError(); + + +#ifdef SLS_DETECTOR_FUNCTION_LIST + t=setSettings(GET_SETTINGS, GET_FLAG); +#endif + n = sendData(file_des,&t,sizeof(t),INT32); + if (n < 0) return printSocketReadError(); + + +#if defined(MYTHEND) || defined(EIGERD) +#ifdef SLS_DETECTOR_FUNCTION_LIST + nm=getThresholdEnergy(GET_FLAG); +#endif + n = sendData(file_des,&nm,sizeof(nm),INT32); + if (n < 0) return printSocketReadError(); +#endif + + +#ifdef SLS_DETECTOR_FUNCTION_LIST + retval=setTimer(FRAME_NUMBER,GET_FLAG); +#endif + n = sendData(file_des,&retval,sizeof(int64_t),INT64); + if (n < 0) return printSocketReadError(); + + +#ifdef SLS_DETECTOR_FUNCTION_LIST + retval=setTimer(ACQUISITION_TIME,GET_FLAG); +#endif + n = sendData(file_des,&retval,sizeof(int64_t),INT64); + if (n < 0) return printSocketReadError(); + + +#ifdef EIGERD +#ifdef SLS_DETECTOR_FUNCTION_LIST + retval=setTimer(SUBFRAME_ACQUISITION_TIME,GET_FLAG); +#endif + n = sendData(file_des,&retval,sizeof(int64_t),INT64); + if (n < 0) return printSocketReadError(); +#endif + + +#ifdef SLS_DETECTOR_FUNCTION_LIST + retval=setTimer(FRAME_PERIOD,GET_FLAG); +#endif + n = sendData(file_des,&retval,sizeof(int64_t),INT64); + if (n < 0) return printSocketReadError(); + + +#ifndef EIGERD +#ifdef SLS_DETECTOR_FUNCTION_LIST + retval=setTimer(DELAY_AFTER_TRIGGER,GET_FLAG); +#endif + n = sendData(file_des,&retval,sizeof(int64_t),INT64); + if (n < 0) return printSocketReadError(); +#endif + + +#if !defined(EIGERD) && !defined(JUNGFRAUD) +#ifdef SLS_DETECTOR_FUNCTION_LIST + retval=setTimer(GATES_NUMBER,GET_FLAG); +#endif + n = sendData(file_des,&retval,sizeof(int64_t),INT64); + if (n < 0) return printSocketReadError(); +#endif + + +#ifdef MYTHEND +#ifdef SLS_DETECTOR_FUNCTION_LIST + retval=setTimer(PROBES_NUMBER,GET_FLAG); +#endif + n = sendData(file_des,&retval,sizeof(int64_t),INT64); + if (n < 0) return printSocketReadError(); +#endif + + +#ifdef SLS_DETECTOR_FUNCTION_LIST + retval=setTimer(CYCLES_NUMBER,GET_FLAG); +#endif + n = sendData(file_des,&retval,sizeof(int64_t),INT64); + if (n < 0) return printSocketReadError(); + + + if (lockStatus==0) { + strcpy(lastClientIP,thisClientIP); + } + + return OK; +} + + + + + + +int configure_mac(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int retval=-100; + sprintf(mess,"configure mac failed\n"); + +#ifdef MYTHEND + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + strcpy(mess,"Function (Configure MAC) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + // receive arguments + char arg[6][50]; + memset(arg,0,sizeof(arg)); + n = receiveData(file_des,arg,sizeof(arg),OTHER); +#if defined(JUNGFRAUD) || defined(EIGERD) + int pos[3]={0,0,0}; + n = receiveData(file_des,pos,sizeof(pos),INT32); +#endif + if (n < 0) return printSocketReadError(); + + uint32_t ipad; + uint64_t imacadd; + uint64_t idetectormacadd; + uint32_t udpport; + uint32_t udpport2; + uint32_t detipad; + sscanf(arg[0], "%x", &ipad); +#ifdef VIRTUAL + sscanf(arg[1], "%lx", &imacadd); +#else + sscanf(arg[1], "%llx", &imacadd); +#endif + sscanf(arg[2], "%x", &udpport); +#ifdef VIRTUAL + sscanf(arg[3], "%lx", &idetectormacadd); +#else + sscanf(arg[3], "%llx", &idetectormacadd); +#endif + sscanf(arg[4], "%x", &detipad); + sscanf(arg[5], "%x", &udpport2); + + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { +#ifdef VERBOSE + int i; + //#ifdef GOTTHARD + //printf("\ndigital_test_bit in server %d\t",digitalTestBit); + //#endif + printf("\nipadd %x\t",ipad); + printf("destination ip is %d.%d.%d.%d = 0x%x \n",(ipad>>24)&0xff,(ipad>>16)&0xff,(ipad>>8)&0xff,(ipad)&0xff,ipad); + printf("macad:%llx\n",imacadd); + for (i=0;i<6;i++) + printf("mac adress %d is 0x%x \n",6-i,(unsigned int)(((imacadd>>(8*i))&0xFF))); + printf("udp port:0x%x\n",udpport); + printf("detector macad:%llx\n",idetectormacadd); + for (i=0;i<6;i++) + printf("detector mac adress %d is 0x%x \n",6-i,(unsigned int)(((idetectormacadd>>(8*i))&0xFF))); + printf("detipad %x\n",detipad); + printf("udp port2:0x%x\n",udpport2); + printf("\n"); + //printf("Configuring MAC of module %d at port %x\n", imod, udpport); + +#if defined(JUNGFRAUD) || defined(EIGERD) + printf("Position: [%d,%d,%d]\n", pos[0],pos[1],pos[2]); +#endif +#endif + if(getRunStatus() == RUNNING){ + ret = stopStateMachine(); + } + if(ret==FAIL) { + sprintf(mess,"Could not stop detector acquisition to configure mac\n"); + cprintf(RED, "Warning: %s", mess); + } + else { + retval=configureMAC(ipad,imacadd,idetectormacadd,detipad,udpport,udpport2,0); //digitalTestBit); + if(retval==-1) { + ret = FAIL; + sprintf(mess,"Configure Mac failed\n"); + cprintf(RED, "Warning: %s", mess); + } + else { + printf("Configure MAC successful\n"); +#if defined(JUNGFRAUD) || defined(EIGERD) + ret = setDetectorPosition(pos); + if (ret == FAIL) { + sprintf(mess,"could not set detector position\n"); + cprintf(RED, "Warning: %s", mess); + } +#endif + } +#ifdef VERBOSE + printf("Configured MAC with retval %d\n", retval); +#endif + } + + } +#endif + if (differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&retval,sizeof(retval),INT32); + + // return ok / fail + return ret; +} + + + + + +int load_image(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int retval=-1; + sprintf(mess,"Loading image failed\n"); + +#ifndef GOTTHARDD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Load Image) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + // receive arguments + enum imageType index=0; + char ImageVals[dataBytes]; + memset(ImageVals,0,dataBytes); + n = receiveData(file_des,&index,sizeof(index),INT32); + if (n < 0) return printSocketReadError(); + + n = receiveData(file_des,ImageVals,dataBytes,OTHER); + if (n < 0) return printSocketReadError(); + + // execute action + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { + switch (index) { + case DARK_IMAGE : +#ifdef VERBOSE + printf("Loading Dark image\n"); +#endif + case GAIN_IMAGE : +#ifdef VERBOSE + printf("Loading Gain image\n"); +#endif + retval=loadImage(index,ImageVals); + if (retval==-1) { + ret = FAIL; + cprintf(RED, "Warning: %s", mess); + } + break; + default: + ret = FAIL; + sprintf(mess,"Load Image Index (%d) is not implemented for this detector\n", (int)index); + cprintf(RED, "Warning: %s", mess); + break; + } + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&retval,sizeof(retval),INT32); + + // return ok / fail + return ret; +} + + + + + +int set_master(int file_des) { + int ret=OK,ret1=OK; + int n=0; + enum masterFlags arg=GET_MASTER; + enum masterFlags retval=GET_MASTER; + sprintf(mess,"set master failed\n"); + + // receive arguments + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + // execute action + if (differentClients && lockStatus && ((int)arg!=(int)GET_MASTER)) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { +#ifdef VERBOSE + printf("setting master flags to %d\n",arg); +#endif + retval=setMaster(arg); + if (retval==GET_MASTER) + ret=FAIL; + + if (ret==OK && differentClients) + ret=FORCE_UPDATE; + } +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&retval,sizeof(retval),INT32); + + // return ok / fail + return ret; +} + + + + + + + +int set_synchronization(int file_des) { + int ret=OK,ret1=OK; + int n=0; + enum synchronizationMode arg=GET_SYNCHRONIZATION_MODE; + enum synchronizationMode retval=GET_SYNCHRONIZATION_MODE; + sprintf(mess,"synchronization mode failed\n"); + + // receive arguments + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + // execute action + if (differentClients && lockStatus && ((int)arg!=(int)GET_SYNCHRONIZATION_MODE)) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { +#ifdef VERBOSE + printf("setting master flags to %d\n",arg); +#endif + retval=setSynchronization(arg); + if (retval==GET_SYNCHRONIZATION_MODE) + ret=FAIL; + + if (ret==OK && differentClients) + ret=FORCE_UPDATE; + } +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&retval,sizeof(retval),INT32); + + // return ok / fail + return ret; +} + + + + + +int read_counter_block(int file_des) { + int ret=OK,ret1=OK; + int n=0; + char CounterVals[dataBytes]; + memset(CounterVals,0,dataBytes); + sprintf(mess,"Read counter block failed\n"); + +#ifndef GOTTHARDD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Read Counter Block) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + // receive arguments + int startACQ=-1; + n = receiveData(file_des,&startACQ,sizeof(startACQ),INT32); + if (n < 0) return printSocketReadError(); + + // execute action + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { + ret=readCounterBlock(startACQ,CounterVals); + if (ret == FAIL) + cprintf(RED, "Warning: %s", mess); +#ifdef VERBOSE + int i; + for(i=0;i<6;i++) + printf("%d:%d\t",i,CounterVals[i]); +#endif + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,CounterVals,dataBytes,OTHER); + + // return ok / fail + return ret; +} + + + + + +int reset_counter_block(int file_des) { + int ret=OK,ret1=OK; + int n=0; + sprintf(mess,"Reset counter block failed\n"); + +#ifndef GOTTHARDD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Reset Counter Block) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + // receive arguments + int startACQ=-1; + n = receiveData(file_des,&startACQ,sizeof(startACQ),INT32); + if (n < 0) return printSocketReadError(); + + // execute action + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { + ret=resetCounterBlock(startACQ); + if (ret == FAIL) + cprintf(RED, "Warning: %s", mess); + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + + + + +int calibrate_pedestal(int file_des){ + int ret=OK,ret1=OK; + int n=0; + int retval=-1; + sprintf(mess,"calibrate pedestal failed\n"); + + +#ifndef GOTTHARDD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Calibrate Pedestal) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + // receive arguments + int frames=-1; + n = receiveData(file_des,&frames,sizeof(frames),INT32); + if (n < 0) return printSocketReadError(); + + + // execute action + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { + ret=calibratePedestal(frames); + if (ret == FAIL) + cprintf(RED, "Warning: %s", mess); + } +#endif + if(ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&retval,sizeof(retval),INT32); + + // return ok / fail + return ret; +} + + + + + + + + +int enable_ten_giga(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int retval=-1; + sprintf(mess,"Enabling/disabling 10GbE failed\n"); + + // execute action +#ifndef EIGERD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Enable 10 GbE) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + // receive arguments + int arg=-1; + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + // execute action + if (differentClients && lockStatus && arg!=-1) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { +#ifdef VERBOSE + printf("Enabling/Disabling 10Gbe :%d \n",arg); +#endif + retval=enableTenGigabitEthernet(arg); + if((arg != -1) && (retval != arg)) { + ret=FAIL; + cprintf(RED, "Warning: %s", mess); + } + else if (differentClients) + ret=FORCE_UPDATE; + } +#endif +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + n += sendData(file_des,&retval,sizeof(retval),INT32); + + // return ok / fail + return ret; +} + + + + +int set_all_trimbits(int file_des){ + int ret=OK,ret1=OK; + int n=0; + int retval=-1; + sprintf(mess,"setting all trimbits failed\n"); + +#ifndef EIGERD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Set All Trimbits) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + // receive arguments + int arg=-1; + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + + // execute action + if (differentClients && lockStatus && arg!=-1) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { +#ifdef VERBOSE + printf("setting all trimbits to %d\n",arg); +#endif + if(arg < -1){ + ret = FAIL; + strcpy(mess,"Cant set trimbits to this value\n"); + cprintf(RED, "Warning: %s", mess); + }else { + if(arg >= 0){ + ret = setAllTrimbits(arg); + //changes settings to undefined + setSettings(UNDEFINED,-1); + cprintf(RED,"Settings has been changed to undefined (change all trimbits)\n"); + } + retval = getAllTrimbits(); + if (arg!=-1 && arg!=retval) { + ret=FAIL; + sprintf(mess,"Could not set all trimbits: should be %d but is %d\n", arg, retval); + cprintf(RED, "Warning: %s", mess); + } + } + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&retval,sizeof(retval),INT32); + + // return ok / fail + return ret; +} + + +int set_ctb_pattern(int file_des) { + int ret=FAIL,ret1=FAIL; + int n=0; + sprintf(mess,"Function (Set CTB Pattern) is not implemented for this detector\n"); + cprintf(RED, "Error: %s", mess); + + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + + n = sendData(file_des,&ret1,sizeof(ret),INT32); + n = sendData(file_des,mess,MAX_STR_LENGTH,OTHER); + + // return ok / fail + return ret; +} + + + +int write_adc_register(int file_des) { + int ret=OK, ret1=OK; + int n=0; + int retval=-1; + sprintf(mess,"write to adc register failed\n"); + +#ifndef JUNGFRAUD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Write ADC Register) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + // receive arguments + int arg[2]={-1,-1}; + n = receiveData(file_des,arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + int addr=arg[0]; + int val=arg[1]; + + // execute action + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } + else { +#ifdef VERBOSE + printf("writing to register 0x%x data 0x%x\n", addr, val); +#endif + setAdc(addr,val); +#ifdef VERBOSE + printf("Data set to 0x%x\n", retval); +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; + } +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&retval,sizeof(retval),INT32); + + // return ok / fail + return ret; +} + + + + +int set_counter_bit(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int retval=-1; + sprintf(mess,"set counter bit failed \n"); + +#ifndef EIGERD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + strcpy(mess,"Function (Set Counter Bit) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + // receive arguments + int arg=-1; + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + // execute action + if (differentClients && lockStatus && arg!=-1) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { +#ifdef VERBOSE + printf("Getting/Setting/Resetting counter bit :%d \n",arg); +#endif + retval=setCounterBit(arg); + if((arg != -1) && (retval != arg)) { + ret=FAIL; + cprintf(RED, "Warning: %s", mess); + } + if (ret==OK && differentClients) + ret=FORCE_UPDATE; + } +#endif +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + n += sendData(file_des,&retval,sizeof(retval),INT32); + + // return ok / fail + return ret; +} + + + + +int pulse_pixel(int file_des) { + int ret=OK,ret1=OK; + int n=0; + sprintf(mess,"pulse pixel failed\n"); + +#ifndef EIGERD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + strcpy(mess,"Function (Pulse Pixel) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + // receive arguments + int arg[3]={-1,-1,-1}; + n = receiveData(file_des,arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + // execute action + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { + ret=pulsePixel(arg[0],arg[1],arg[2]); + if (ret == FAIL) + cprintf(RED, "Warning: %s", mess); + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + + + +int pulse_pixel_and_move(int file_des) { + int ret=OK,ret1=OK; + int n=0; + sprintf(mess,"pulse pixel and move failed\n"); + +#ifndef EIGERD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + strcpy(mess,"Function (Pulse Pixel and Move) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + // receive arguments + int arg[3]={-1,-1,-1}; + n = receiveData(file_des,arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + // execute action + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { + ret=pulsePixelNMove(arg[0],arg[1],arg[2]); + if (ret == FAIL) + cprintf(RED, "Warning: %s", mess); + } +#endif + if(ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + + + + + +int pulse_chip(int file_des) { + int ret=OK,ret1=OK; + int n=0; + sprintf(mess,"pulse chip failed\n"); + +#ifndef EIGERD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + strcpy(mess,"Function (Pulse Chip) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + // receive arguments + int arg = -1; + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + // execute action + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { + ret=pulseChip(arg); + if (ret == FAIL) + cprintf(RED, "Warning: %s", mess); + } +#endif + if(ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + + + + +int set_rate_correct(int file_des) { + int ret=OK,ret1=OK; + int n=0; + sprintf(mess,"Set rate correct failed\n"); + +#ifndef EIGERD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret=FAIL; + sprintf(mess,"Function (Rate Correction) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + // receive arguments + int64_t tau_ns=-1; + n = receiveData(file_des,&tau_ns,sizeof(tau_ns),INT64); + if (n < 0) return printSocketReadError(); + + // execute action + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { + printf("Setting rate correction to %lld ns\n",(long long int)tau_ns); + //set rate + //wrong bit mode + if((setDynamicRange(-1)!=32) && (setDynamicRange(-1)!=16) && (tau_ns!=0)){ + ret=FAIL; + strcpy(mess,"Rate correction Deactivated, must be in 32 or 16 bit mode\n"); + cprintf(RED, "Warning: %s", mess); + } + //16 or 32 bit mode + else{ + if(tau_ns < 0) + tau_ns = getDefaultSettingsTau_in_nsec(); + else if(tau_ns > 0){ + //changing tau to a user defined value changes settings to undefined + setSettings(UNDEFINED,-1); + cprintf(RED,"Settings has been changed to undefined (tau changed)\n"); + } + + int64_t retval = setRateCorrection(tau_ns); + if(tau_ns != retval){ + ret=FAIL; + cprintf(RED, "Warning: %s", mess); + } + } + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n = sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + + + + +int get_rate_correct(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int64_t retval=-1; + sprintf(mess,"Get Rate correct failed\n"); + +#ifndef EIGERD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret=FAIL; + sprintf(mess,"Function (Get Rate Correction) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + +#ifdef SLS_DETECTOR_FUNCTION_LIST + + // execute action + retval = getCurrentTau(); + printf("Getting rate correction %lld\n",(long long int)retval); + +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&retval,sizeof(retval),INT64); + + // return ok / fail + return ret; +} + + + + + +int set_network_parameter(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int retval=-1; + sprintf(mess,"set network parameter failed\n"); + +#ifndef EIGERD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret=FAIL; + sprintf(mess,"Function(Set Network Parmaeter) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + enum NETWORKINDEX index; + + // receive arguments + enum networkParameter mode=0; + int value=-1; + n = receiveData(file_des,&mode,sizeof(mode),INT32); + if (n < 0) return printSocketReadError(); + + n = receiveData(file_des,&value,sizeof(value),INT32); + if (n < 0) return printSocketReadError(); + + // execute action + if (differentClients && lockStatus && value<0) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { +#ifdef VERBOSE + printf("setting network parameter mode %d to %d\n",(int)mode,value); +#endif + switch (mode) { + case DETECTOR_TXN_DELAY_LEFT: + index = TXN_LEFT; + break; + case DETECTOR_TXN_DELAY_RIGHT: + index = TXN_RIGHT; + break; + case DETECTOR_TXN_DELAY_FRAME: + index = TXN_FRAME; + break; + case FLOW_CONTROL_10G: + index = FLOWCTRL_10G; + break; + default: + ret=FAIL; + sprintf(mess,"Network Parameter Index (%d) is not implemented for this detector\n",(int) mode); + cprintf(RED, "Warning: %s", mess); + break; + } + if (ret==OK) { + retval=setNetworkParameter(index, value); + if ((retval!=value) && (value>=0)) { + ret=FAIL; + sprintf(mess,"could not change network parameter mode %d: should be %d but is %d \n",index, value, retval); + cprintf(RED, "Warning: %s", mess); + } + } + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&retval,sizeof(retval),INT32); + + // return ok / fail + return ret; +} + + + + + + +int program_fpga(int file_des) { + int ret=OK,ret1=OK; + int n=0; + sprintf(mess,"program FPGA failed\n"); + + +#ifndef JUNGFRAUD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret=FAIL; + sprintf(mess,"Function (Program FPGA) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + size_t filesize = 0; + size_t totalsize = 0; + size_t unitprogramsize = 0; + char* fpgasrc = NULL; + FILE* fp = NULL; + + // receive arguments - filesize + n = receiveData(file_des,&filesize,sizeof(filesize),INT32); + if (n < 0) return printSocketReadError(); + totalsize = filesize; +#ifdef VERY_VERBOSE + printf("\n\n Total size is:%d\n",totalsize); +#endif + + // execute action + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { + //opening file pointer to flash and telling FPGA to not touch flash + if(startWritingFPGAprogram(&fp) != OK) { + ret=FAIL; + sprintf(mess,"Could not write to flash. Error at startup.\n"); + cprintf(RED,"%s",mess); + } + + //---------------- first ret ---------------- + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + //---------------- first ret ---------------- + + if(ret!=FAIL) { + //erasing flash + eraseFlash(); + fpgasrc = (char*)malloc(MAX_FPGAPROGRAMSIZE); + } + + //writing to flash part by part + while(ret != FAIL && filesize){ + + unitprogramsize = MAX_FPGAPROGRAMSIZE; //2mb + if(unitprogramsize > filesize) //less than 2mb + unitprogramsize = filesize; + #ifdef VERY_VERBOSE + printf("unit size to receive is:%d\n",unitprogramsize); + printf("filesize:%d currentpointer:%d\n",filesize,currentPointer); + #endif + + //receive + n = receiveData(file_des,fpgasrc,unitprogramsize,OTHER); + if (n < 0) return printSocketReadError(); + + if(!(unitprogramsize - filesize)){ + fpgasrc[unitprogramsize]='\0'; + filesize-=unitprogramsize; + unitprogramsize++; + }else + filesize-=unitprogramsize; + + ret = writeFPGAProgram(fpgasrc,unitprogramsize,fp); + + //---------------- middle rets ---------------- + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + cprintf(RED,"Failure: Breaking out of program receiving\n"); + } + //---------------- middle rets ---------------- + + if(ret != FAIL){ + //print progress + printf("Writing to Flash:%d%%\r",(int) (((double)(totalsize-filesize)/totalsize)*100) ); + fflush(stdout); + } + } + + printf("\n"); + + //closing file pointer to flash and informing FPGA + stopWritingFPGAprogram(fp); + + //free resources + if(fpgasrc != NULL) + free(fpgasrc); + if(fp!=NULL) + fclose(fp); +#ifdef VERY_VERBOSE + printf("Done with program receiving command\n"); +#endif + if (isControlServer) + basictests(debugflag); + init_detector(isControlServer); + } +#endif + if (ret==OK) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + + + + +int reset_fpga(int file_des) { + int ret=OK,ret1=OK; + int n=0; + sprintf(mess,"Reset FPGA unsuccessful\n"); + +#ifndef JUNGFRAUD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Start Readout) is not implemented for this detector\n"); + cprintf(RED, "%s", mess); +#else + + // execute action + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { + if (isControlServer) + basictests(debugflag); + init_detector(isControlServer); + ret = FORCE_UPDATE; + } +#endif +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + + +int power_chip(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int retval=-1; + sprintf(mess,"power chip failed\n"); + +#ifndef JUNGFRAUD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Power Chip) is not implemented for this detector\n"); + cprintf(RED, "%s", mess); +#else + + // receive arguments + int arg=-1; + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + // execute action + if (differentClients && lockStatus && arg!=-1) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { +#ifdef VERBOSE + printf("Power chip to %d\n", arg); +#endif + retval=powerChip(arg); + +#ifdef VERBOSE + printf("Chip powered: %d\n",retval); +#endif + if (retval==arg || arg<0) { + ret=OK; + } else { + ret=FAIL; + sprintf(mess,"Powering chip failed, wrote %d but read %d\n", arg, retval); + cprintf(RED, "Warning: %s", mess); + } + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&retval,sizeof(retval),INT32); + + // return ok / fail + return ret; +} + + + + +int set_activate(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int retval=-1; + sprintf(mess,"Activate/Deactivate failed\n"); + +#ifndef EIGERD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret=FAIL; + sprintf(mess,"Function (Set Activate) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + // receive arguments + int arg=-1; + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + // execute action + if (differentClients && lockStatus && arg!=-1) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { +#ifdef VERBOSE + printf("Setting activate mode of detector to %d\n",arg); +#endif + retval=activate(arg); + if ((retval!=arg) && (arg!=-1)) { + ret=FAIL; + sprintf(mess,"Could not set activate mode to %d, is set to %d\n",arg, retval); + cprintf(RED, "Warning: %s", mess); + } + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&retval,sizeof(retval),INT32); + + // return ok / fail + return ret; +} + + + + +int prepare_acquisition(int file_des) { + int ret=OK,ret1=OK; + int n=0; + strcpy(mess,"prepare acquisition failed\n"); + +#if !defined(GOTTHARDD) && !defined(EIGERD) + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Prepare Acquisition) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + // execute action + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { + ret = prepareAcquisition(); + if (ret == FAIL) + cprintf(RED, "Warning: %s", mess); + } +#endif + if(ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + +int cleanup_acquisition(int file_des) { + int ret=OK,ret1=OK; + int n=0; + strcpy(mess,"prepare acquisition failed\n"); + +#ifndef GOTTHARDD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Cleanup Acquisition) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); +#else + + // execute action + if (differentClients && lockStatus) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else {//to be implemented when used here + ret = FAIL; + sprintf(mess,"Function (Cleanup Acquisition) is not implemented for this detector\n"); + cprintf(RED, "Warning: %s", mess); + } +#endif + if(ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } + + // return ok / fail + return ret; +} + + diff --git a/slsDetectorSoftware/mythen3DetectorServer/mythen3Server_funcs.h b/slsDetectorSoftware/mythen3DetectorServer/mythen3Server_funcs.h new file mode 100755 index 000000000..bae48f17c --- /dev/null +++ b/slsDetectorSoftware/mythen3DetectorServer/mythen3Server_funcs.h @@ -0,0 +1,94 @@ +#ifndef SERVER_FUNCS_H +#define SERVER_FUNCS_H + +#include "sls_receiver_defs.h" +#include + +// initialization functions +int printSocketReadError(); +void basictests(int); +void init_detector(int); +// void init_detector(int,int); +int decode_function(int); +const char* getFunctionName(enum detFuncs func); +void function_table(); +int M_nofunc(int); + +// functions called by client +int exec_command(int); +int get_error(int); +int get_detector_type(int); +int set_number_of_modules(int); +int get_max_number_of_modules(int); +int set_external_signal_flag(int); +int set_external_communication_mode(int); +int get_id(int); +int digital_test(int); +int analog_test(int); +int enable_analog_out(int); +int calibration_pulse(int); +int set_dac(int); +int get_adc(int); +int write_register(int); +int read_register(int); +int write_memory(int); +int read_memory(int); +int set_channel(int); +int get_channel(int); +int set_all_channels(int); +int set_chip(int); +int get_chip(int); +int set_all_chips(int); +int set_module(int); +int get_module(int); +int set_all_modules(int); +int set_settings(int); +int get_threshold_energy(int); +int set_threshold_energy(int); +int start_acquisition(int); +int stop_acquisition(int); +int start_readout(int); +int get_run_status(int); +int start_and_read_all(int); +int read_frame(int); +int read_all(int); +int set_timer(int); +int get_time_left(int); +int set_dynamic_range(int); +int set_readout_flags(int); +int set_roi(int); +int set_speed(int); +int execute_trimming(int); +int exit_server(int); +int lock_server(int); +int get_last_client_ip(int); +int set_port(int); +int update_client(int); +int send_update(int); +int configure_mac(int); +int load_image(int); +int set_master(int); +int set_synchronization(int); +int read_counter_block(int); +int reset_counter_block(int); +int calibrate_pedestal(int); +int enable_ten_giga(int); +int set_all_trimbits(int); +int set_ctb_pattern(int); +int write_adc_register(int); +int set_counter_bit(int); +int pulse_pixel(int); +int pulse_pixel_and_move(int); +int pulse_chip(int); +int set_rate_correct(int); +int get_rate_correct(int); +int set_network_parameter(int); +int program_fpga(int); +int reset_fpga(int); +int power_chip(int); +int set_activate(int); +int prepare_acquisition(int); +int cleanup_acquisition(int); + + +#endif