mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2026-08-06 20:52:27 +02:00
Build and Deploy on local RHEL9 / build (push) Successful in 2m13s
Build on RHEL9 docker image / build (push) Successful in 3m53s
Build and Deploy on local RHEL8 / build (push) Successful in 4m58s
Build on RHEL8 docker image / build (push) Successful in 5m47s
Run Simulator Tests on local RHEL9 / build (push) Successful in 18m55s
Run Simulator Tests on local RHEL8 / build (push) Successful in 22m26s
- changed
- command from `datastream` to `udp_datastream` to be more specific
- Detector API:
- setNumberofUDPInterfaces(pos) =>setNumberofUDPInterfaces() # no position anymore
- getDataStream(portPosition, pos) =>getUDPDataStream(portPosition, pos)
- setDataStream(portPosition, pos) => setUDPDataStream(portPosition) # no position anymore
- modified the dataprocessing thread:
- if gui or call back, start zmq processing (connecting sockets) before starting receiver (disabled ports sends dummy that the client zmq sockets are not ready for)
- if only progress, starting progress processing thread after startReceiver
-
- added
- Detector API:
- getRxDisabledUDPPortIndices()
- getPortPositionList()
- allow disabling/enabling udp interface in receiver for Jungfrua/Moench when both udp interfaces is enabled (This is to go fast, where only one half of the module matters)
- write ports type and disabled ports to master file (tests for it as well)
- tests for python commands as well
- datastream command to deprecated commands
- refactored tests to make the new parameters fit
* first draft of disabling data port at the receiver side. Todo: master file and stream for gui to use
* updated help in command
* formatting
* md5 unchanged
* fix test, check port position for detector type
* wip, udp port enable metadata in client, to:receiver, zmq streaming
* wip, master attributes
* wip, imple=> save only disabled ports with port index, 1 interface, is empty
* works in file. still needs refactoring
* updated writer versions
* udp ports type pass, disabled with api yet
* fixed disabled ports meta data as well
* fixed in developer via other PR
* renamed.more intuitive
* fix in gui that wont wait for disabled ports
* added tests for master file
* extra tests
* move the master fiel tests into its own tests with the disable marker for github tests
* refactoring
* python test
* more intuitive and doc
* release notes
* example for python
* back to before
* minor documentation fix and sending nports unnecessarily for getRxUDPPortDisableMetadata
* doc
* review fixes, 1. using std::array instead of vector, 2. moving udp_datastream command testing with different values into master attributes testing file because we test the master file
* minor
* review: update help
* progress printed before assigned
* try catch inside hdf5
* auto generated code for CLI and formatting
* missing packets should not be checked at github workflow level
* formatting
* improved python doc for udp_datastream help
* indent doc python done
208 lines
8.7 KiB
C++
208 lines
8.7 KiB
C++
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
#pragma once
|
|
#include "Implementation.h"
|
|
#include "receiver_defs.h"
|
|
#include "sls/ServerSocket.h"
|
|
#include "sls/sls_detector_defs.h"
|
|
#include "sls/sls_detector_funcs.h"
|
|
|
|
#include <atomic>
|
|
#include <future>
|
|
|
|
namespace sls {
|
|
|
|
class ServerInterface;
|
|
|
|
class ClientInterface : private virtual slsDetectorDefs {
|
|
enum numberMode { DEC, HEX };
|
|
detectorType detType;
|
|
uint16_t portNumber{0};
|
|
ServerSocket server;
|
|
std::unique_ptr<Implementation> receiver;
|
|
std::unique_ptr<std::thread> tcpThread;
|
|
int ret{OK};
|
|
int fnum{-1};
|
|
int lockedByClient{0};
|
|
|
|
std::atomic<bool> killTcpThread{false};
|
|
|
|
public:
|
|
virtual ~ClientInterface();
|
|
ClientInterface(uint16_t portNumber = DEFAULT_TCP_RX_PORTNO);
|
|
std::string getReceiverVersion();
|
|
|
|
//***callback functions***
|
|
/** params: file path, file name, file index, image size */
|
|
void registerCallBackStartAcquisition(
|
|
void (*func)(const startCallbackHeader, void *), void *arg);
|
|
|
|
/** params: total frames caught */
|
|
void registerCallBackAcquisitionFinished(
|
|
void (*func)(const endCallbackHeader, void *), void *arg);
|
|
|
|
/** params: sls_receiver_header, pointer to data, image size */
|
|
void registerCallBackRawDataReady(void (*func)(sls_receiver_header &,
|
|
const dataCallbackHeader,
|
|
char *, size_t &, void *),
|
|
void *arg);
|
|
|
|
private:
|
|
void startTCPServer();
|
|
int functionTable();
|
|
int decodeFunction(ServerInterface &socket);
|
|
void functionNotImplemented();
|
|
void modeNotImplemented(const std::string &modename, int mode);
|
|
template <typename T>
|
|
void validate(T arg, T retval, const std::string &modename, numberMode hex);
|
|
void verifyLock();
|
|
void verifyIdle(ServerInterface &socket);
|
|
|
|
int lock_receiver(ServerInterface &socket);
|
|
int get_last_client_ip(ServerInterface &socket);
|
|
int get_version(ServerInterface &socket);
|
|
int setup_receiver(ServerInterface &socket);
|
|
void setDetectorType(detectorType arg);
|
|
int set_num_frames(ServerInterface &socket);
|
|
int set_num_triggers(ServerInterface &socket);
|
|
int set_num_bursts(ServerInterface &socket);
|
|
int set_num_add_storage_cells(ServerInterface &socket);
|
|
int set_timing_mode(ServerInterface &socket);
|
|
int set_burst_mode(ServerInterface &socket);
|
|
int set_num_analog_samples(ServerInterface &socket);
|
|
int set_num_digital_samples(ServerInterface &socket);
|
|
int set_exptime(ServerInterface &socket);
|
|
int set_period(ServerInterface &socket);
|
|
int set_subexptime(ServerInterface &socket);
|
|
int set_subdeadtime(ServerInterface &socket);
|
|
int set_dynamic_range(ServerInterface &socket);
|
|
int set_streaming_frequency(ServerInterface &socket);
|
|
int get_streaming_frequency(ServerInterface &socket);
|
|
int get_status(ServerInterface &socket);
|
|
int start_receiver(ServerInterface &socket);
|
|
int stop_receiver(ServerInterface &socket);
|
|
int set_file_dir(ServerInterface &socket);
|
|
int get_file_dir(ServerInterface &socket);
|
|
int set_file_name(ServerInterface &socket);
|
|
int get_file_name(ServerInterface &socket);
|
|
int set_file_index(ServerInterface &socket);
|
|
int get_file_index(ServerInterface &socket);
|
|
int get_frame_index(ServerInterface &socket);
|
|
int get_missing_packets(ServerInterface &socket);
|
|
int get_frames_caught(ServerInterface &socket);
|
|
int set_file_write(ServerInterface &socket);
|
|
int get_file_write(ServerInterface &socket);
|
|
int set_master_file_write(ServerInterface &socket);
|
|
int get_master_file_write(ServerInterface &socket);
|
|
int enable_compression(ServerInterface &socket);
|
|
int set_overwrite(ServerInterface &socket);
|
|
int get_overwrite(ServerInterface &socket);
|
|
int enable_tengiga(ServerInterface &socket);
|
|
int set_fifo_depth(ServerInterface &socket);
|
|
int set_activate(ServerInterface &socket);
|
|
int set_streaming(ServerInterface &socket);
|
|
int get_streaming(ServerInterface &socket);
|
|
int set_streaming_timer(ServerInterface &socket);
|
|
int get_flip_rows(ServerInterface &socket);
|
|
int set_flip_rows(ServerInterface &socket);
|
|
int set_file_format(ServerInterface &socket);
|
|
int get_file_format(ServerInterface &socket);
|
|
int set_streaming_port(ServerInterface &socket);
|
|
int get_streaming_port(ServerInterface &socket);
|
|
int set_silent_mode(ServerInterface &socket);
|
|
int get_silent_mode(ServerInterface &socket);
|
|
int stream_rx_dummy_header(ServerInterface &socket);
|
|
int set_additional_json_header(ServerInterface &socket);
|
|
int get_additional_json_header(ServerInterface &socket);
|
|
int set_udp_socket_buffer_size(ServerInterface &socket);
|
|
int get_real_udp_socket_buffer_size(ServerInterface &socket);
|
|
int set_frames_per_file(ServerInterface &socket);
|
|
int get_frames_per_file(ServerInterface &socket);
|
|
int set_discard_policy(ServerInterface &socket);
|
|
int get_discard_policy(ServerInterface &socket);
|
|
int set_padding_enable(ServerInterface &socket);
|
|
int get_padding_enable(ServerInterface &socket);
|
|
int set_readout_mode(ServerInterface &socket);
|
|
int set_adc_mask(ServerInterface &socket);
|
|
int set_dbit_list(ServerInterface &socket);
|
|
int get_dbit_list(ServerInterface &socket);
|
|
int set_dbit_offset(ServerInterface &socket);
|
|
int get_dbit_offset(ServerInterface &socket);
|
|
int set_quad_type(ServerInterface &socket);
|
|
int set_read_n_rows(ServerInterface &socket);
|
|
MacAddr setUdpIp(IpAddr arg);
|
|
int set_udp_ip(ServerInterface &socket);
|
|
MacAddr setUdpIp2(IpAddr arg);
|
|
int set_udp_ip2(ServerInterface &socket);
|
|
int set_udp_port(ServerInterface &socket);
|
|
int set_udp_port2(ServerInterface &socket);
|
|
int set_num_interfaces(ServerInterface &socket);
|
|
int set_adc_mask_10g(ServerInterface &socket);
|
|
int set_counter_mask(ServerInterface &socket);
|
|
int increment_file_index(ServerInterface &socket);
|
|
int set_additional_json_parameter(ServerInterface &socket);
|
|
int get_additional_json_parameter(ServerInterface &socket);
|
|
int get_progress(ServerInterface &socket);
|
|
int set_num_gates(ServerInterface &socket);
|
|
int set_gate_delay(ServerInterface &socket);
|
|
int get_thread_ids(ServerInterface &socket);
|
|
int get_streaming_start_fnum(ServerInterface &socket);
|
|
int set_streaming_start_fnum(ServerInterface &socket);
|
|
int set_rate_correct(ServerInterface &socket);
|
|
int set_scan(ServerInterface &socket);
|
|
int set_threshold(ServerInterface &socket);
|
|
int get_streaming_hwm(ServerInterface &socket);
|
|
int set_streaming_hwm(ServerInterface &socket);
|
|
int set_all_threshold(ServerInterface &socket);
|
|
void validate_port_position(const portPosition port);
|
|
int set_port_udp_datastream(ServerInterface &socket);
|
|
int get_port_udp_datastream(ServerInterface &socket);
|
|
int get_arping(ServerInterface &socket);
|
|
int set_arping(ServerInterface &socket);
|
|
int get_receiver_roi(ServerInterface &socket);
|
|
int set_receiver_roi(ServerInterface &socket);
|
|
int set_receiver_roi_metadata(ServerInterface &socket);
|
|
int set_num_transceiver_samples(ServerInterface &socket);
|
|
int set_transceiver_mask(ServerInterface &socket);
|
|
int set_row(ServerInterface &socket);
|
|
int set_column(ServerInterface &socket);
|
|
int get_dbit_reorder(ServerInterface &socket);
|
|
int set_dbit_reorder(ServerInterface &socket);
|
|
int get_roi_metadata(ServerInterface &socket);
|
|
int set_readout_speed(ServerInterface &socket);
|
|
int set_udp_port_disable_meta(ServerInterface &socket);
|
|
int get_udp_port_disable_meta(ServerInterface &socket);
|
|
|
|
Implementation *impl() {
|
|
if (receiver != nullptr) {
|
|
return receiver.get();
|
|
} else {
|
|
throw SocketError(
|
|
"Receiver not set up. Please use rx_hostname first.\n");
|
|
}
|
|
}
|
|
|
|
int (ClientInterface::*flist[NUM_REC_FUNCTIONS])(ServerInterface &socket);
|
|
|
|
//***callback parameters***
|
|
|
|
void (*startAcquisitionCallBack)(const startCallbackHeader,
|
|
void *) = nullptr;
|
|
void *pStartAcquisition{nullptr};
|
|
void (*acquisitionFinishedCallBack)(const endCallbackHeader,
|
|
void *) = nullptr;
|
|
void *pAcquisitionFinished{nullptr};
|
|
void (*rawDataReadyCallBack)(sls_receiver_header &, dataCallbackHeader,
|
|
char *, size_t &, void *) = nullptr;
|
|
void *pRawDataReady{nullptr};
|
|
|
|
pid_t parentThreadId{0};
|
|
pid_t tcpThreadId{0};
|
|
std::vector<std::string> udpips =
|
|
std::vector<std::string>(MAX_NUMBER_OF_LISTENING_THREADS);
|
|
// necessary if Receiver objects using threads with callbacks
|
|
static std::mutex callbackMutex;
|
|
};
|
|
|
|
} // namespace sls
|