#pragma once

#include <why-semaphore.h>
#include <why-irq.h>
#include <why-internal-error.h>

#include <expected>
#include <format>
#include <cstring>


class CustomDevice
{
public:
    CustomDevice(int irqnum)
    : _irqnum(irqnum),
      _done_signal(0)
    {}

    void send_away_data(const std::string& data)
    {
        /*omitted*/;                                   // <-- copy data to hw buffer

        Why::IRQ::connect(_irqnum,                     // <-- activate interrupt
                          [this](int){ 
                              _done_signal.give();     // <-- ... when called: wake up caller
                          });

        _done_signal.take();                           // <-- wait until woken

        Why::IRQ::disconnect(_irqnum);                 // <-- deactivate interrupt again
    }

private:
    int _irqnum;
    Why::Semaphore _done_signal;
};

