#include <why.h>

#include <why-sensor.h>
#include <why-irq.h>
#include <why-messagequeue.h>
#include <why-time.h>

#include <string>


struct sensor_data
{
    Why::TimeSpec timestamp;
    std::string_view sensorname;
    uint64_t value;
};

int main()
{
    Why::init();

    Why::RandomSensor s1(0, 100);
    Why::RandomSensor s2(100, 200);

    auto sensor_data_queue = Why::MessageQueue<sensor_data>::create();
    assert(sensor_data_queue);

    // activate sensor interrupts
    {
        auto isr = [&sensor_data_queue, &s1, &s2](int irqnum){
            sensor_data data;
            if (irqnum == 7)
                data = {
                    .timestamp=Why::now_monotonic(), 
                    .sensorname="s1",                  // <-- std::string_view lifetime!
                    .value=s1.get_value(),
                };
            else if (irqnum == 42)
                data = {
                    .timestamp=Why::now_monotonic(), 
                    .sensorname="s2",                  // <-- std::string_view lifetime!
                    .value=s2.get_value(),
                };
            else
                assert(!"unexpected irq");
        
            auto ok = sensor_data_queue->put_noblock(data);
            assert(ok);
        };
        Why::IRQ::connect(7, isr);
        Why::IRQ::connect(42, isr);
    }

    // consume data
    while (true) {
        auto sample = sensor_data_queue->get();
        assert(sample);
        auto [timestamp, sensorname, value] = *sample;
        std::println("timestamp={}, sensorname={}, value={}", timestamp.to_seconds(), sensorname, value);
    }
    return 0;
}
