mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-26 16:20:03 +02:00
added missing files
This commit is contained in:
parent
1710177af4
commit
4cce1dbd7f
72
slsDetectorSoftware/src/CtbConfig.cpp
Normal file
72
slsDetectorSoftware/src/CtbConfig.cpp
Normal file
@ -0,0 +1,72 @@
|
||||
|
||||
#include "CtbConfig.h"
|
||||
#include "SharedMemory.h"
|
||||
#include "sls/ToString.h"
|
||||
#include "sls/string_utils.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
|
||||
namespace sls {
|
||||
|
||||
CtbConfig::CtbConfig(){
|
||||
for (size_t i=0; i!=num_dacs; ++i){
|
||||
setDacName(i, "dac"+ToString(i));
|
||||
}
|
||||
}
|
||||
|
||||
void CtbConfig::check_index(size_t i) const {
|
||||
if (!(i < num_dacs)) {
|
||||
std::ostringstream oss;
|
||||
oss << "DAC index is too large needs to be below " << num_dacs;
|
||||
throw RuntimeError(oss.str());
|
||||
}
|
||||
}
|
||||
|
||||
void CtbConfig::check_size(const std::string &name) const {
|
||||
|
||||
if (name.empty())
|
||||
throw RuntimeError("Name needs to be at least one character");
|
||||
|
||||
// dacname_length -1 to account for \0 termination
|
||||
if (!(name.size() < (name_length - 1))) {
|
||||
std::ostringstream oss;
|
||||
oss << "Length of name needs to be less than " << name_length - 1
|
||||
<< " chars";
|
||||
throw RuntimeError(oss.str());
|
||||
}
|
||||
}
|
||||
|
||||
void CtbConfig::setDacName(size_t index, const std::string &name) {
|
||||
|
||||
check_index(index);
|
||||
check_size(name);
|
||||
|
||||
char *dst = &dacnames[index * name_length];
|
||||
memset(dst, '\0', name_length);
|
||||
memcpy(dst, &name[0], name.size());
|
||||
}
|
||||
|
||||
void CtbConfig::setDacNames(const std::vector<std::string>& names){
|
||||
for (size_t i = 0; i!=num_dacs; ++i){
|
||||
setDacName(i, names[i]);
|
||||
}
|
||||
}
|
||||
|
||||
std::string CtbConfig::getDacName(size_t index) const {
|
||||
return dacnames + index * name_length;
|
||||
}
|
||||
|
||||
std::vector<std::string> CtbConfig::getDacNames() const {
|
||||
std::vector<std::string> names;
|
||||
for (size_t i = 0; i != num_dacs; ++i)
|
||||
names.push_back(getDacName(i));
|
||||
return names;
|
||||
}
|
||||
|
||||
const char* CtbConfig::shm_tag(){
|
||||
return shm_tag_;
|
||||
}
|
||||
|
||||
} // namespace sls
|
31
slsDetectorSoftware/src/CtbConfig.h
Normal file
31
slsDetectorSoftware/src/CtbConfig.h
Normal file
@ -0,0 +1,31 @@
|
||||
#pragma once
|
||||
#include <string>
|
||||
#include <vector>
|
||||
namespace sls {
|
||||
|
||||
|
||||
class CtbConfig {
|
||||
static constexpr size_t name_length = 20;
|
||||
static constexpr size_t num_dacs = 18;
|
||||
static constexpr const char* shm_tag_ = "ctbdacs";
|
||||
char dacnames[name_length * num_dacs]{};
|
||||
|
||||
void check_index(size_t i) const;
|
||||
void check_size(const std::string &name) const;
|
||||
|
||||
public:
|
||||
CtbConfig();
|
||||
CtbConfig(const CtbConfig&) = default;
|
||||
CtbConfig(CtbConfig&&) = default;
|
||||
CtbConfig& operator=(const CtbConfig&) = default;
|
||||
~CtbConfig() = default;
|
||||
|
||||
void setDacNames(const std::vector<std::string> &names);
|
||||
void setDacName(size_t index, const std::string &name);
|
||||
std::string getDacName(size_t index) const;
|
||||
std::vector<std::string> getDacNames() const;
|
||||
static const char* shm_tag();
|
||||
};
|
||||
|
||||
|
||||
} // namespace sls
|
59
slsDetectorSoftware/tests/test-CtbConfig.cpp
Normal file
59
slsDetectorSoftware/tests/test-CtbConfig.cpp
Normal file
@ -0,0 +1,59 @@
|
||||
#include "catch.hpp"
|
||||
#include <string>
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "SharedMemory.h"
|
||||
#include "CtbConfig.h"
|
||||
using namespace sls;
|
||||
#include <fstream>
|
||||
|
||||
|
||||
TEST_CASE("Default construction"){
|
||||
static_assert(sizeof(CtbConfig) == 360); // 18*20
|
||||
|
||||
CtbConfig c;
|
||||
auto names = c.getDacNames();
|
||||
REQUIRE(names.size() == 18);
|
||||
REQUIRE(names[0] == "dac0");
|
||||
REQUIRE(names[1] == "dac1");
|
||||
REQUIRE(names[2] == "dac2");
|
||||
REQUIRE(names[3] == "dac3");
|
||||
}
|
||||
|
||||
TEST_CASE("Set and get a single dac name"){
|
||||
CtbConfig c;
|
||||
c.setDacName(3, "vrf");
|
||||
auto names = c.getDacNames();
|
||||
|
||||
REQUIRE(c.getDacName(3) == "vrf");
|
||||
REQUIRE(names[3] == "vrf");
|
||||
}
|
||||
|
||||
TEST_CASE("Set a name that is too large throws"){
|
||||
CtbConfig c;
|
||||
REQUIRE_THROWS(c.setDacName(3, "somestringthatisreallytolongforadatac"));
|
||||
}
|
||||
|
||||
TEST_CASE("Length of dac name cannot be 0"){
|
||||
CtbConfig c;
|
||||
REQUIRE_THROWS(c.setDacName(1, ""));
|
||||
}
|
||||
|
||||
TEST_CASE("Copy a CTB config"){
|
||||
CtbConfig c1;
|
||||
c1.setDacName(5, "somename");
|
||||
|
||||
auto c2 = c1;
|
||||
//change the name on the first object
|
||||
//to detecto shallow copy
|
||||
c1.setDacName(5, "someothername");
|
||||
REQUIRE(c2.getDacName(5) == "somename");
|
||||
}
|
||||
|
||||
TEST_CASE("Move CtbConfig "){
|
||||
CtbConfig c1;
|
||||
c1.setDacName(3, "yetanothername");
|
||||
CtbConfig c2(std::move(c1));
|
||||
REQUIRE(c2.getDacName(3) == "yetanothername");
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user