void print_rb_contents() {
    uint16 count = rb_full_count(rb);
    SerialUSB.print("ring buffer contents: ");
    for (uint16 i = 0; i < count; i++) {
        SerialUSB.print((int)rb_remove(rb));
        if (i < count - 1) SerialUSB.print(", ");
    }
    SerialUSB.println();
}
void test_rb_insertion_function(int num_bytes_to_insert,
                                int (*insertion_fn)(ring_buffer *, uint8),
                                const char insertion_fn_name[]) {
    SerialUSB.println("resetting ring buffer.");
    rb_reset(rb);
    print_rb_contents();

    SerialUSB.print(insertion_fn_name);
    SerialUSB.print("-ing ");
    SerialUSB.print(num_bytes_to_insert);
    SerialUSB.println(" bytes.");
    for (uint8 i = 1; i <= num_bytes_to_insert; i++)
        insertion_fn(rb, i);

    uint16 count = rb_full_count(rb);
    SerialUSB.print("rb_full_count(rb) = ");
    SerialUSB.println(count);

    print_rb_contents();
}
int HardwareSerial::availableForWrite(void)
{
    return this->usart_device->wb->size-rb_full_count(this->usart_device->wb);
}
uint32_t usb_data_available(void)
{
    return rb_full_count(rxfifo);
}