/*
    ReactOS Sound System
    MIDI UART support

    Author:
        Andrew Greenwood (silverblade@reactos.org)

    History:
        26 May 2008 - Created

    Notes:
        Functions documented in midiuart.h
*/

#include <ntddk.h>
#include "midiuart.h"

BOOLEAN
WaitForMidiUartStatus(
    IN  PUCHAR UartBasePort,
    IN  UCHAR StatusFlags,
    IN  ULONG Timeout)
{
    ULONG RemainingTime = Timeout;

    while ( RemainingTime -- )
    {
        if ( READ_MIDIUART_STATUS(UartBasePort) & StatusFlags )
        {
            return TRUE;
        }
    }

    return FALSE;
}

BOOLEAN
WriteMidiUartByte(
    IN  PUCHAR UartBasePort,
    IN  UCHAR Data,
    IN  ULONG Timeout)
{
    if ( ! WaitForMidiUartCTS(UartBasePort, Timeout) )
    {
        return FALSE;
    }

    WRITE_MIDIUART_DATA(UartBasePort, Data);

    return TRUE;
}

BOOLEAN
WriteMidiUartMulti(
    IN  PUCHAR UartBasePort,
    IN  PUCHAR Data,
    IN  ULONG DataLength,
    IN  ULONG Timeout)
{
    ULONG DataIndex;

    for ( DataIndex = 0; DataIndex < DataLength; ++ DataIndex )
    {
        if ( ! WriteMidiUartByte(UartBasePort, Data[DataIndex], Timeout) )
        {
            /* We failed - don't try writing any more */
            return FALSE;
        }
    }

    return TRUE;
}

BOOLEAN
ReadMidiUartByte(
    IN  PUCHAR UartBasePort,
    OUT UCHAR* Data,
    IN  ULONG Timeout)
{
    if ( ! Data )
    {
        return FALSE;
    }

    if ( ! WaitForMidiUartDTR(UartBasePort, Timeout) )
    {
        return FALSE;
    }

    *Data = READ_MIDIUART_DATA(UartBasePort);

    return TRUE;
}