#include "serial.h"
#include "usb_start.h"

#define MAX_PRINTF_BUFFER (64)

static uint8_t printf_buffer[MAX_PRINTF_BUFFER];
static volatile bool b_usb_ready = false;

static bool usb_cb_state_c(usb_cdc_control_signal_t state)
{
	if(state.rs232.DTR == 1)
	{
		b_usb_ready = true;
	}
	else
	{
		b_usb_ready = false;
	}
	return false;
}

void arc_serial_init()
{
	memset(printf_buffer, '\0', MAX_PRINTF_BUFFER);
	usb_init();
	while(!cdcdf_acm_is_enabled()){}
	cdcdf_acm_register_callback(CDCDF_ACM_CB_STATE_C, (FUNC_PTR)usb_cb_state_c);
	while(!b_usb_ready);
	delay_ms(2000);
}

uint8_t arc_printf(const char* fmt, ...)
{
	while(!b_usb_ready){}
	va_list args;
	va_start(args, fmt);
	vsprintf(printf_buffer, fmt, args);
	va_end(args);
	volatile int32_t ret = cdcdf_acm_write(printf_buffer, (uint32_t)(strlen((const char*)printf_buffer)));
	return 0;
}