File DummyFEBSlowcontrolInterface.cpp

File List > libmudaq > DummyFEBSlowcontrolInterface.cpp

Go to the documentation of this file

//

#include "DummyFEBSlowcontrolInterface.h"

#include <math.h>

#include <chrono>
#include <cstdlib>
#include <iostream>
#include <thread>

using std::cout;
using std::endl;

DummyFEBSlowcontrolInterface::DummyFEBSlowcontrolInterface(mudaq::MudaqDevice& mdev)
    : FEBSlowcontrolInterface(mdev), scregs(8, vector<uint32_t>(pow(2, 16), 0)) {
    for (uint32_t i = 0; i < MAX_LINKS_PER_SWITCHINGBOARD; i++) {
        for (uint32_t j = 0; j < pow(2, 16); j++) {
            scregs[i][j] = scregs[i][j] + std::rand() / ((RAND_MAX + 1u) / 4096);
        }
    }

    t = thread(&DummyFEBSlowcontrolInterface::operator(), this);
}

DummyFEBSlowcontrolInterface::~DummyFEBSlowcontrolInterface() {}

void DummyFEBSlowcontrolInterface::operator()() {
    while (1) {
        for (uint32_t i = 0; i < MAX_LINKS_PER_SWITCHINGBOARD; i++) {
            for (uint32_t j = 0; j < pow(2, 16); j++) {
                scregs[i][j] = scregs[i][j] + std::rand() / ((RAND_MAX + 1u) / 257) - 128;
            }
        }
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}

int DummyFEBSlowcontrolInterface::FEB_write(uint32_t febIDx, const uint32_t startaddr,
                                            const vector<uint32_t>& data,
                                            const bool nonincrementing, const bool broadcast,
                                            const uint32_t MSTR_bar [[maybe_unused]]) {
#ifdef EMULATE_HARDWARE_ERRORS
    if (cnt_when_to_trigger_error == cnt_of_writes) {
        if (rand() % 10 == 0) {
            cnt_of_writes = 0;
            cnt_when_to_trigger_error = rand() % 100;
        }
        return ERRCODES(rand() % num_of_error_codes);
    }
#endif

    // we first genertate a dummy acknowledge
    m_FEBsc_rmem_addr = 0;
    mdev.write_dummy_acknowledge(startaddr, febIDx);

    auto status = FEBSlowcontrolInterface::FEB_write(febIDx, startaddr, data, nonincrementing,
                                                     broadcast, MSTR_bar);

    // store the data
    for (size_t i = 0; i < data.size(); i++)
        scregs[febIDx][startaddr + i * (!nonincrementing)] = data[i];

    cnt_of_writes++;

    return status;
}

int DummyFEBSlowcontrolInterface::FEB_read(uint32_t febIDx, const uint32_t startaddr,
                                           vector<uint32_t>& data, const bool nonincrementing) {
#ifdef EMULATE_HARDWARE_ERRORS
    if (cnt_when_to_trigger_error == cnt_of_reads) {
        // we also give feedback that all links are not locked
        mdev.write_register_ro_dummy(LINK_LOCKED_LOW_REGISTER_R, 0x0);
        mdev.write_register_ro_dummy(LINK_LOCKED_HIGH_REGISTER_R, 0x0);
        if (rand() % 10 == 0) {
            cnt_of_reads = 0;
            cnt_when_to_trigger_error = rand() % 100;
            // lock the links again
            mdev.write_register_ro_dummy(LINK_LOCKED_LOW_REGISTER_R, 0xFFFFFFFF);
            mdev.write_register_ro_dummy(LINK_LOCKED_HIGH_REGISTER_R, 0xFFFFFFFF);
        }
        return ERRCODES(rand() % num_of_error_codes);
    }
#endif

    // we first genertate a dummy acknowledge
    m_FEBsc_rmem_addr = 0;
    mdev.read_dummy_acknowledge(startaddr, data.size(), febIDx);

    auto status = FEBSlowcontrolInterface::FEB_read(febIDx, startaddr, data, nonincrementing);

    cnt_of_reads++;

    return status;
}

int DummyFEBSlowcontrolInterface::FEBsc_NiosRPC(uint32_t febIDx [[maybe_unused]],
                                                uint16_t command [[maybe_unused]],
                                                vector<vector<uint32_t>> payload_chunks
                                                [[maybe_unused]]) {
#ifdef EMULATE_HARDWARE_ERRORS
    if (cnt_when_to_trigger_error == cnt_of_rpcs) {
        if (rand() % 10 == 0) {
            cnt_of_rpcs = 0;
            cnt_when_to_trigger_error = rand() % 100;
        }
        return ERRCODES(rand() % num_of_error_codes);
    }
#endif

    cnt_of_rpcs++;

    return ERRCODES::OK;
}