module puppeteer.communication.is_communicator;

import puppeteer.puppeteer;

alias OnAIUpdateCallback = void delegate (ubyte /* pin */,
                                          float /* value */,
                                          long /* communicationTimeMillis */)
                                          shared;
alias OnIVUpdateCallback(T) = void delegate (ubyte /* varIndex */,
                                             T /* value */,
                                             long /* communicationTimeMillis */)
                                             shared;

enum isCommunicator(T, IVTypes...) = is(typeof(
{
    T communicator;

    bool communicationStarted = communicator.startCommunication
                                              (string.init /* devFilename */,
                                              BaudRate.init,
                                              Parity.init);
    communicator.endCommunication();
    bool communicationOngoing = communicator.isCommunicationOngoing;

    communicator.setAIMonitor(ubyte.init /* pin */, bool.init /* monitor */);
    communicator.setOnAIUpdateCallback(OnAIUpdateCallback.init /* callback */);

    foreach(IVType; IVTypes)
    {
        communicator.setIVMonitor!IVType(ubyte.init /* varIndex */, bool.init /* monitor */);
        communicator.setOnIVUpdateCallback!IVType((OnIVUpdateCallback!IVType).init /* callback */);
    }

    communicator.setPWMValue(ubyte.init /* pin */, ubyte.init /* value */);
}()));