#ifndef HELPERS_H
#define HELPERS_H

static void put_byte(uint8_t ch) {
    Endpoint_SelectEndpoint(CDC_TX_EPNUM);
    while (!(Endpoint_ReadWriteAllowed())) {
        ;
    }
    Endpoint_Write_Byte(ch);
    Endpoint_ClearCurrentBank();
}

static uint8_t dev_rx_cnt;

static uint8_t byte_readable(void) {
    return dev_rx_cnt || (Endpoint_ReadWriteAllowed() && Endpoint_BytesInEndpoint());
}

static uint8_t get_byte(void) {
    uint8_t ret;
    
    Endpoint_SelectEndpoint(CDC_RX_EPNUM);
    if (dev_rx_cnt == 0) {
        while (!byte_readable()) {
        }
        dev_rx_cnt = Endpoint_BytesInEndpoint();
    }
    ret = Endpoint_Read_Byte();
    dev_rx_cnt--;
    if (dev_rx_cnt == 0) {
        Endpoint_ClearCurrentBank();
    }
    return ret;
}

static void print_bits(uint8_t ch) {
    char i;
    
    for (i = 8; i > 0; i--) {
        put_byte(ch & _BV(i-1) ? '1' : '0');
    }
}

static void print_byte(uint8_t ch) {
    if (isprint(ch) || (ch == '\r') || (ch == '\n')) {
        put_byte(ch);
    } else {
        put_byte('.');
    }
}

static void reboot(void) {
    wdt_enable(WDTO_250MS);
    for (;;) {
        ;
    }
}
#endif
