some-serial 0.7.6

Unified serial driver collection for embedded and bare-metal environments
Documentation
use super::*;

pub(super) fn events_from_mis(mis: LocalRegisterCopy<u32, UARTIS::Register>) -> SerialEventSet {
    let mut events = SerialEventSet::empty();
    if mis.is_set(UARTIS::RX) {
        events |= SerialEventSet::RX_DATA;
    }
    if mis.is_set(UARTIS::RT) {
        events |= SerialEventSet::RX_TIMEOUT;
    }
    if mis.is_set(UARTIS::FE)
        || mis.is_set(UARTIS::PE)
        || mis.is_set(UARTIS::BE)
        || mis.is_set(UARTIS::OE)
    {
        events |= SerialEventSet::RX_STATUS;
    }
    if mis.is_set(UARTIS::TX) {
        events |= SerialEventSet::TX_SPACE;
    }
    if mis.is_set(UARTIS::CTSM)
        || mis.is_set(UARTIS::DSRM)
        || mis.is_set(UARTIS::DCDM)
        || mis.is_set(UARTIS::RIM)
    {
        events |= SerialEventSet::MODEM_STATUS;
    }
    events
}

pub(super) fn rx_errors_from_mis(mis: LocalRegisterCopy<u32, UARTIS::Register>) -> RxErrorFlags {
    Pl011RxStatus::from_irq_status(mis).to_irq_errors()
}

pub(super) fn imsc_for_events(events: SerialEventSet) -> u32 {
    let mut imsc = 0;
    if events.intersects(SerialEventSet::RX) {
        imsc |= UARTIS::RX::SET.value
            | UARTIS::RT::SET.value
            | UARTIS::FE::SET.value
            | UARTIS::PE::SET.value
            | UARTIS::BE::SET.value
            | UARTIS::OE::SET.value;
    }
    if events.contains(SerialEventSet::TX_SPACE) {
        imsc |= UARTIS::TX::SET.value;
    }
    if events.contains(SerialEventSet::MODEM_STATUS) {
        imsc |= UARTIS::RIM::SET.value
            | UARTIS::CTSM::SET.value
            | UARTIS::DCDM::SET.value
            | UARTIS::DSRM::SET.value;
    }
    imsc
}