Read and write SPI for Xilinx CTB (#1381)
All checks were successful
Build on RHEL9 / build (push) Successful in 3m25s
Build on RHEL8 / build (push) Successful in 4m37s
Run Simulator Tests on local RHEL9 / build (push) Successful in 14m42s
Build on local RHEL9 / build (push) Successful in 1m26s
Run Simulator Tests on local RHEL8 / build (push) Successful in 17m0s
Build on local RHEL8 / build (push) Successful in 3m32s

-readSpi and writeSpi in C++ and Python API
This commit is contained in:
Erik Fröjdh
2026-02-05 17:20:47 +01:00
committed by GitHub
parent fb58fefe57
commit 0992c7ae4c
11 changed files with 401 additions and 2 deletions

View File

@@ -2247,6 +2247,12 @@ class Detector {
///@}
Result<std::vector<uint8_t>> readSpi(int chip_id, int register_id,
int n_bytes, Positions pos = {}) const;
void writeSpi(int chip_id, int register_id,
const std::vector<uint8_t> &data, Positions pos = {});
private:
std::vector<uint16_t> getValidPortNumbers(uint16_t start_port);
void updateRxRateCorrections();

View File

@@ -2954,4 +2954,19 @@ std::vector<uint16_t> Detector::getValidPortNumbers(uint16_t start_port) {
return res;
}
Result<std::vector<uint8_t>> Detector::readSpi(int chip_id, int register_id,
int n_bytes,
Positions pos) const {
return pimpl->Parallel(&Module::readSpi, pos, chip_id, register_id,
n_bytes);
}
void Detector::writeSpi(int chip_id, int register_id,
const std::vector<uint8_t> &data, Positions pos){
pimpl->Parallel(&Module::writeSpi, pos, chip_id, register_id, data);
}
} // namespace sls

View File

@@ -4074,4 +4074,45 @@ void Module::simulatingActivityinDetector(const std::string &functionType,
}
printf("\n");
}
std::vector<uint8_t> Module::readSpi(int chip_id, int register_id,
int n_bytes) const{
auto client = DetectorSocket(shm()->hostname, shm()->controlPort);
client.Send(F_SPI_READ);
client.setFnum(F_SPI_READ);
client.Send(chip_id);
client.Send(register_id);
client.Send(n_bytes);
if (client.Receive<int>() == FAIL) {
std::ostringstream os;
os << "Module " << moduleIndex << " (" << shm()->hostname << ")"
<< " returned error: " << client.readErrorMessage();
throw DetectorError(os.str());
}
std::vector<uint8_t> data(n_bytes);
client.Receive(data);
return data;
}
void Module::writeSpi(int chip_id, int register_id,
const std::vector<uint8_t> &data){
auto client = DetectorSocket(shm()->hostname, shm()->controlPort);
client.Send(F_SPI_WRITE);
client.setFnum(F_SPI_WRITE);
client.Send(chip_id);
client.Send(register_id);
client.Send(static_cast<int>(data.size()));
client.Send(data);
if (client.Receive<int>() == FAIL) {
std::ostringstream os;
os << "Module " << moduleIndex << " (" << shm()->hostname << ")"
<< " returned error: " << client.readErrorMessage();
throw DetectorError(os.str());
}
}
} // namespace sls

View File

@@ -607,6 +607,10 @@ class Module : public virtual slsDetectorDefs {
int64_t getNumberOfFramesFromStart() const;
int64_t getActualTime() const;
int64_t getMeasurementTime() const;
std::vector<uint8_t> readSpi(int chip_id, int register_id,
int n_bytes) const;
void writeSpi(int chip_id, int register_id, const std::vector<uint8_t> &data);
private:
std::string getReceiverLongVersion() const;