From b6b9a5d5984a900e57cb6fc3f1fc82a289d4bfee Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 12 Nov 2020 16:48:49 +0100 Subject: [PATCH] updated release notes and changed a few command names, now->runtime, timestamp->frametime, nframes->framecounter, startingfnum->startframenumber --- RELEASE.txt | 165 ++++++++++++++++++-- slsDetectorSoftware/src/CmdProxy.h | 20 ++- slsDetectorSoftware/tests/test-CmdProxy.cpp | 55 +++---- 3 files changed, 194 insertions(+), 46 deletions(-) diff --git a/RELEASE.txt b/RELEASE.txt index f435ef6ab..dbb6015dc 100755 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -18,16 +18,26 @@ SLS Detector Package 5.0.0 released on xx.xx.2020 (Major Release) - Client API complete change - Exceptions - Scans (dacs and trimbit) - - Command line timing commands (s, ms, us etc.) - - daclist, dacvalues, settingslist, drlist etc. + - Timing commands + - Enum list (daclist, dacvalues, settingslist, drlist etc.) + - Command line (dac) - Detector Simulators - Zmq interface (ZmqSocket.h) - Gui (zmq high water mark) - Receiver (additional metadata) - (Jungfrau server) settings and default dacs + - (Servers) sharedmemory - (Eiger server) blocked when stopping or status + - Receiver shared memory - UDP configuration change - + - UDP IP (Receiver) + - (Eiger) config file + - Gappixels + - (Eiger) partial readout + - (Eiger, Jungfrau) starting frame number + - (Jungfrau) two interfaces + - (Eiger) removed features + @@ -37,16 +47,19 @@ SLS Detector Package 5.0.0 released on xx.xx.2020 (Major Release) Client ------ - 1. Compilation requirements are different now. + 1. Compilation requirements + They are very different now and can be accessed at https://slsdetectorgroup.github.io/devdoc/dependencies.html Gui not included in default cmk.sh script. Must be explicitly asked for. - 2. Manuals can be compiled in the package. + 2. Manuals + They can be compiled in the package. https://slsdetectorgroup.github.io/devdoc/installation.html#build-this-documentation Or refer to the documentation provided in https://slsdetectorgroup.github.io/devdoc/index.html - 3. API changed to Detector class. + 3. API + Changed to Detector class. C++: Detector.h Documentation: https://slsdetectorgroup.github.io/devdoc/detector.html @@ -61,29 +74,159 @@ SLS Detector Package 5.0.0 released on xx.xx.2020 (Major Release) but give a warning. Documentation: https://slsdetectorgroup.github.io/devdoc/commandline.html + Help on a command: + sls_detector_help [command], or + sls_detector_get -h [command] - 4. Exceptions are thrown instead of providing error codes. + 4. Exceptions + They are thrown instead of providing error codes. sls_detector_exceptions.h Make sure you catch all exceptions in custom gui and handle them or inform the user. + 5. Scans + One can do scans for dacs or trimbits. Trimbits are only for Eiger or + Mythen3. Set it scan mode and then acquire using blocking or non blocking + method. + + 6. Timing Commands (eg. period) + In command line, all timing commands can now specify unit. + eg 100ms 10us, 1s, 100ns + In C++ API, one must use chrono library. + In Python API, xxx + + 7. Enum list (daclist) + Command line and API now has features to get the list of enums/commands + for dacs, settings, dynamic range, timing modes and temperatures for + the detector in shared memory. + eg. daclist, settingslist, drlist, timinglist, templist + Command line also has commands to get their values. + eg. dacvalues, tempvalues, + + 8. Command Line (Dac) + All dac commands have been converted to a single "dac" command with + the previous dac commands as arguments. + eg. sls_detector_get vcmp_ll + is now + sls_detector_get dac vcmp_ll + + 9. UDP Configuration + Once all the udp details are set in the detector, the detector's + destination is then configured automatically. If the detector is not + configured, it will fail when acquiring. If any of these parameters + are also changed, then this is configured again. Hence, configuremac + command has been removed. Instead, there are commands such as + udp_validate (to validate if it has been configured) and + udp_reconfigure (to reconfigure). + + 10. Gap Pixels + Gap pixels are now only available in client call back or gui (not in + receiver anymore). It can be enabled for Eiger and Jungfrau and + includes inter chip and inter module gap pixels. Detector Servers ---------------- - 1. Detector Simulators or virtual detector servers for every detector - have been provided. They are compiled along with the client by enabling - its option. They should also send fake data (increasing pixel/channel value). + 1. Detector Simulators + Or virtual detector servers for every detector have been provided. + They are compiled along with the client by enabling its option. + They should also send fake data (increasing pixel/channel value). + + 2. (Jungfrau) settings + Settings command do not implicitly set default dacs from now on. + One can use the command 'defaultdacs' to set them explicitly. + + 3. Shared Memory + Almost all the detector parameters removed from shared memory. + Therefore, they are all fetched directly from detector. + + 4. (Eiger) config_eiger.txt + A config file on the detector can take in 2 parameters "master" + and "top" being set to 1 or 0 to enable or disable the same. + When server is started without this file, it is set to hardware + settings. + The detector is also deactivated by default and activated only + upon setting hostname in the client. This is to ensure ???????? + + 5. (Eiger) Partial readout - readnlines + It is possible for partial readouts, where you specify the number + of pixel rows to read out. Not all values are allowed. The current + slsReceiver does not complain about missing packets, but only puts + this partial image into the complete image (padding the rest). One + can cut out required subimage using callbacks, but this feature + is probably more useful for custom receivers. + + 6. (Eiger, Jungfrau) Starting Frame number - startframenumber + Both now have running frame numbers that is only reset at boot up + and increments continuously through acquisitions. One is able to + set the starting frame number before an acquisition. + + 7. (Jungfrau) Two 10G data interfaces + Only Jungfrau PCBs with version 2.0 can run at full speed using both + the 10G UDP interfaces to stream out data. This is available from + the current firmware and software. To enable two interfaces, one has + to enable two interfaces using "numinterfaces" to 2 and set corresponding + udp_dstip2, udp_dstport2 etc. One can also decide to select which of + the two interfaces to use, when using only 1 interface. + + 8. (Eiger) Removed Features + storeinram, safe speed and ability to set settings via the settings + command has been removed. + + Receiver + -------- + + 1. Zmq + The static library and the zmq.h is no longer provided with package. + One must install ZeroMQ version 4. + ZmqSocket.h API has changed, especially in parsing receiving JSON header. + One must pick up needed parameters from exposed struct zmqHeader in + ZmqSocket.h. + + 2. Metadata + Additional detector dependant metadata has been added to the master files. + + 3. Shared Memory + Almost all receiver parameters have been removed from client shared memory. + Therefore the receiver process needs to be alive to access any receiver + parameter as they are now fetched directly from the receiver. + + 4. UDP IP + Since all the parameters are fetched from receiver or detector directly + (not shared memory), the udp desintation ip (previously rx_udpip) is safer + to be specified before setting rx_hostname. Setting it before has the + advantage that the detector is updated first before the receiver is + requested for the udp mac. This helps when changing pc and the receiver + cannot find the udp ip to get the udp mac. + Gui + --- - + 1. Zmq high water mark + When opening the Gui, the zmq send and receiver high water mark is set to 2 + instead of default (1000 for zmq library version 4). This is to ensure + fast and large detectors can still see latest data on the gui at the cost of + losing images in between. + When using a different processor or client data call back to handle zmq data, + please ensure this is set back to default to get every zmq packet. Setting it to + -1 sets it to library defaults. + + 2. + 3. Resolved Issues ================== + Detector Server + --------------- + + 1. (Eiger) blocked server + Very rarely, Eiger control or stop server would block and would require a restart + of server. This is due to both servers accessing the same link to get to FEB + registers. Locking has been implemented in server shared memory to resolve. 4. Firmware Requirements ======================== diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index 9a8dd4b97..566af01d2 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -687,6 +687,7 @@ class CmdProxy { {"busy", "clearbusy"}, {"receiver", "rx_status"}, {"framescaught", "rx_framescaught"}, + {"startingfnum", "startframenumber"}, /* Network Configuration (Detector<->Receiver) */ {"detectorip", "udp_srcip"}, @@ -744,6 +745,9 @@ class CmdProxy { /* Moench */ /* Advanced */ /* Insignificant */ + {"nframes", "framecounter"}, + {"now", "runtime"}, + {"timestamp", "frametime"}, {"frameindex", "rx_frameindex"} }; @@ -842,7 +846,7 @@ class CmdProxy { {"status", &CmdProxy::DetectorStatus}, {"rx_framescaught", &CmdProxy::rx_framescaught}, {"rx_missingpackets", &CmdProxy::rx_missingpackets}, - {"startingfnum", &CmdProxy::startingfnum}, + {"startframenumber", &CmdProxy::startframenumber}, {"trigger", &CmdProxy::trigger}, {"scan", &CmdProxy::Scan}, {"scanerrmsg", &CmdProxy::scanerrmsg}, @@ -1054,9 +1058,9 @@ class CmdProxy { {"lock", &CmdProxy::lock}, {"lastclient", &CmdProxy::lastclient}, {"execcommand", &CmdProxy::ExecuteCommand}, - {"nframes", &CmdProxy::nframes}, - {"now", &CmdProxy::now}, - {"timestamp", &CmdProxy::timestamp}, + {"framecounter", &CmdProxy::framecounter}, + {"runtime", &CmdProxy::runtime}, + {"frametime", &CmdProxy::frametime}, {"user", &CmdProxy::UserDetails}, {"rx_frameindex", &CmdProxy::rx_frameindex} @@ -1451,7 +1455,7 @@ class CmdProxy { "\n\tNumber of missing packets for each port in receiver."); INTEGER_COMMAND_VEC_ID( - startingfnum, getStartingFrameNumber, setStartingFrameNumber, + startframenumber, getStartingFrameNumber, setStartingFrameNumber, StringTo, "[n_value]\n\t[Eiger][Jungfrau] Starting frame number for " "next acquisition. Stopping acquisition might result in " @@ -2120,18 +2124,18 @@ class CmdProxy { lastclient, getLastClientIP, "\n\tClient IP Address that last communicated with the detector."); - GET_COMMAND(nframes, getNumberOfFramesFromStart, + GET_COMMAND(framecounter, getNumberOfFramesFromStart, "\n\t[Jungfrau][Mythen3][Gotthard2][Moench][CTB] " "Number of frames from start run control." "\n\t[Gotthard2] only in continuous mode."); - TIME_GET_COMMAND(now, getActualTime, + TIME_GET_COMMAND(runtime, getActualTime, "[(optional unit) " "ns|us|ms|s]\n\t[Jungfrau][Mythen3][Gotthard2][Moench][" "CTB] Time from detector start up." "\n\t[Gotthard2] not in burst and auto mode."); - TIME_GET_COMMAND(timestamp, getMeasurementTime, + TIME_GET_COMMAND(frametime, getMeasurementTime, "[(optional unit) " "ns|us|ms|s]\n\t[Jungfrau][Mythen3][Gotthard2][Moench][" "CTB] Timestamp at a frame start." diff --git a/slsDetectorSoftware/tests/test-CmdProxy.cpp b/slsDetectorSoftware/tests/test-CmdProxy.cpp index e7adf6eb4..0168c5e56 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy.cpp @@ -1170,7 +1170,7 @@ TEST_CASE("trigger", "[.cmd][.new]") { det.setNumberOfFrames(1); det.setExptime(std::chrono::milliseconds(1)); det.setPeriod(std::chrono::milliseconds(1)); - auto startingfnum = det.getStartingFrameNumber().tsquash( + auto startframenumber = det.getStartingFrameNumber().tsquash( "inconsistent frame nr in test"); det.startDetector(); { @@ -1181,7 +1181,7 @@ TEST_CASE("trigger", "[.cmd][.new]") { std::this_thread::sleep_for(std::chrono::seconds(2)); auto currentfnum = det.getStartingFrameNumber().tsquash( "inconsistent frame nr in test"); - REQUIRE(startingfnum + 1 == currentfnum); + REQUIRE(startframenumber + 1 == currentfnum); det.stopDetector(); det.setTimingMode(prev_timing); det.setNumberOfFrames(prev_frames); @@ -1303,33 +1303,33 @@ TEST_CASE("status", "[.cmd][.new]") { det.setExptime(-1, prev_val); } -TEST_CASE("startingfnum", "[.cmd][.new]") { +TEST_CASE("startframenumber", "[.cmd][.new]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER || det_type == defs::JUNGFRAU) { auto prev_sfnum = det.getStartingFrameNumber(); - REQUIRE_THROWS(proxy.Call("startingfnum", {"0"}, -1, PUT)); + REQUIRE_THROWS(proxy.Call("startframenumber", {"0"}, -1, PUT)); { std::ostringstream oss; - proxy.Call("startingfnum", {"3"}, -1, PUT, oss); - REQUIRE(oss.str() == "startingfnum 3\n"); + proxy.Call("startframenumber", {"3"}, -1, PUT, oss); + REQUIRE(oss.str() == "startframenumber 3\n"); } { std::ostringstream oss; - proxy.Call("startingfnum", {}, -1, GET, oss); - REQUIRE(oss.str() == "startingfnum 3\n"); + proxy.Call("startframenumber", {}, -1, GET, oss); + REQUIRE(oss.str() == "startframenumber 3\n"); } { std::ostringstream oss; - proxy.Call("startingfnum", {"1"}, -1, PUT, oss); - REQUIRE(oss.str() == "startingfnum 1\n"); + proxy.Call("startframenumber", {"1"}, -1, PUT, oss); + REQUIRE(oss.str() == "startframenumber 1\n"); } for (int i = 0; i != det.size(); ++i) { det.setStartingFrameNumber(prev_sfnum[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("startingfnum", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("startframenumber", {}, -1, GET)); } } @@ -2209,24 +2209,25 @@ TEST_CASE("execcommand", "[.cmd][.new]") { REQUIRE_NOTHROW(proxy.Call("execcommand", {"ls"}, -1, PUT)); } -TEST_CASE("nframes", "[.cmd][.new]") { +TEST_CASE("framecounter", "[.cmd][.new]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { - auto nframes = det.getNumberOfFramesFromStart().squash(); + auto framecounter = det.getNumberOfFramesFromStart().squash(); std::ostringstream oss; - proxy.Call("nframes", {}, -1, GET, oss); - REQUIRE(oss.str() == "nframes " + std::to_string(nframes) + "\n"); - REQUIRE_NOTHROW(proxy.Call("nframes", {}, -1, GET)); + proxy.Call("framecounter", {}, -1, GET, oss); + REQUIRE(oss.str() == + "framecounter " + std::to_string(framecounter) + "\n"); + REQUIRE_NOTHROW(proxy.Call("framecounter", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("nframes", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("framecounter", {}, -1, GET)); } } -TEST_CASE("now", "[.cmd][.new]") { +TEST_CASE("runtime", "[.cmd][.new]") { // TODO! can we test this? Detector det; CmdProxy proxy(&det); @@ -2235,16 +2236,16 @@ TEST_CASE("now", "[.cmd][.new]") { det_type == defs::MOENCH || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { std::ostringstream oss; - proxy.Call("now", {}, -1, GET, oss); + proxy.Call("runtime", {}, -1, GET, oss); // Get only - REQUIRE_THROWS(proxy.Call("now", {"2019"}, -1, PUT)); - REQUIRE_NOTHROW(proxy.Call("now", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("runtime", {"2019"}, -1, PUT)); + REQUIRE_NOTHROW(proxy.Call("runtime", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("now", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("runtime", {}, -1, GET)); } } -TEST_CASE("timestamp", "[.cmd][.new]") { +TEST_CASE("frametime", "[.cmd][.new]") { // TODO! can we test this? Detector det; CmdProxy proxy(&det); @@ -2253,12 +2254,12 @@ TEST_CASE("timestamp", "[.cmd][.new]") { det_type == defs::MOENCH || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { std::ostringstream oss; - proxy.Call("timestamp", {}, -1, GET, oss); + proxy.Call("frametime", {}, -1, GET, oss); // Get only - REQUIRE_THROWS(proxy.Call("timestamp", {"2019"}, -1, PUT)); - REQUIRE_NOTHROW(proxy.Call("timestamp", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("frametime", {"2019"}, -1, PUT)); + REQUIRE_NOTHROW(proxy.Call("frametime", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("timestamp", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("frametime", {}, -1, GET)); } }