Beispiel #1
0
//Retarget the _write function to USB/Serial
int WRITEFUNC(int iFileHandle, char *pcBuffer, int iLength)
{
	if (vcom_connected())
	{
		return vcom_write((uint8_t *) pcBuffer,(uint32_t) iLength);
	}
	return -1;
}
Beispiel #2
0
//# MENU CDC
void cdc_menu(){
    uint32_t prompt = 0, rdCnt = 0;
    static uint8_t g_rxBuff[256];
    CDCenable();
    lcdPrintln("CDC enabled.");
    lcdDisplay();
    getInputWaitRelease();

    while(getInputRaw()!=BTN_ENTER){
	if(getInputRaw()==BTN_RIGHT){
	    lcdPrint("status:");
	    lcdPrint(IntToStr(g_vCOM.tx_flags,3,F_HEX));
	    lcdPrint(", ");
	    lcdPrint("c=");
	    lcdPrint(IntToStr(prompt,1,F_LONG));
	    lcdPrintln(".");
	    lcdDisplay();
	    getInputWaitRelease();
	};
	if(getInputRaw()==BTN_LEFT){
	    vcom_write((uint8_t *)"Hello World!\r\n", 14);
	    getInputWaitRelease();
	};
	if ((vcom_connected() != 0) && (prompt == 0)) {
	    prompt = 1;
	}
	/* If VCOM port is opened echo whatever we receive back to host. */
	if (prompt) {
	    rdCnt = vcom_bread(&g_rxBuff[0], 256);
	    if (rdCnt) {
		vcom_write((uint8_t*)"[", 1);
		while(g_vCOM.tx_flags & VCOM_TX_BUSY) __WFI(); // Wait for buffer emtpy
		vcom_write(&g_rxBuff[0], rdCnt);
		while(g_vCOM.tx_flags & VCOM_TX_BUSY) __WFI(); // Wait for buffer emtpy
		vcom_write((uint8_t*)"]", 1);
	    }
	}
	/* Sleep until next IRQ happens */
	__WFI();
    };
    lcdPrintln("disconnect");
    lcdDisplay();
    CDCdisable();
    getInputWaitRelease();
}
Beispiel #3
0
static void receive() {
    static uint8_t rxbuf[256];
    int rx = rflib_bfsk_get_packet(rxbuf, 255);
    if(rx > 0) {
        rxbuf[rx] = '\0';
        lcdPrintln((char*)rxbuf);
        rflib_lcdDisplay();
        /* also: write to USB-CDC */
        if(vcom_connected()) vcom_write((uint8_t*)rxbuf, rx);
    }
}
Beispiel #4
0
// TODO(zapta): make the standard printf working for USB out.
void printf(const char *format, ...) {
  if (vcom_connected()) {

  // Assuming single thread, using static buffer.
  static char buf[100];
  va_list ap;
  va_start(ap, format);
  int n = vsnprintf(buf, sizeof(buf), (const char *) format, ap);
  vcom_write((uint8_t*) buf, n);
  va_end(ap);
  }
}
Beispiel #5
0
void skynet_cdc_task(void) {
	// send
	VCOM_DATA_T *pVcom = &g_vCOM;
	if ((pVcom->tx_flags & VCOM_TX_CONNECTED) && ((pVcom->tx_flags & VCOM_TX_BUSY) == 0) && (!RingBuffer_IsEmpty(&usb_tx_ringbuf))) {
		uint8_t buf[USB_MAX_PACKET0];
		uint16_t cnt = RingBuffer_PopMult(&usb_tx_ringbuf, buf, USB_MAX_PACKET0);
		vcom_write(buf, cnt);
	}

	// reschedule
	register_delayed_event(1, skynet_cdc_task);
}
Beispiel #6
0
void TX_Thread (void const *argument)
{
	T_MEAS  *rptr;
  osEvent  evt;
	
	while(1)
	{
		evt = osMailGet(mail, osWaitForever); 
		if(evt.status == osEventMail)
		{
			rptr = evt.value.p;
			vcom_write(&g_rxBuff[0], 256);
			osMailFree(mail, rptr);
		}
	}
}
/**
 * @brief	main routine for blinky example
 * @return	Function should not exit.
 */
int main(void)
{
	USBD_API_INIT_PARAM_T usb_param;
	USB_CORE_DESCS_T desc;
	ErrorCode_t ret = LPC_OK;
	uint32_t prompt = 0, rdCnt = 0;

	SystemCoreClockUpdate();
	/* Initialize board and chip */
	Board_Init();

	/* enable clocks */
	Chip_USB_Init();

	/* initialize USBD ROM API pointer. */
	g_pUsbApi = (const USBD_API_T *) LPC_ROM_API->pUSBD;

	/* initialize call back structures */
	memset((void *) &usb_param, 0, sizeof(USBD_API_INIT_PARAM_T));
	usb_param.usb_reg_base = LPC_USB0_BASE;
	/*	WORKAROUND for artf44835 ROM driver BUG:
	    Code clearing STALL bits in endpoint reset routine corrupts memory area
	    next to the endpoint control data. For example When EP0, EP1_IN, EP1_OUT,
	    EP2_IN are used we need to specify 3 here. But as a workaround for this
	    issue specify 4. So that extra EPs control structure acts as padding buffer
	    to avoid data corruption. Corruption of padding memory doesn’t affect the
	    stack/program behaviour.
	 */
	usb_param.max_num_ep = 3 + 1;
	usb_param.mem_base = USB_STACK_MEM_BASE;
	usb_param.mem_size = USB_STACK_MEM_SIZE;

	/* Set the USB descriptors */
	desc.device_desc = (uint8_t *) &USB_DeviceDescriptor[0];
	desc.string_desc = (uint8_t *) &USB_StringDescriptor[0];
	/* Note, to pass USBCV test full-speed only devices should have both
	   descriptor arrays point to same location and device_qualifier set to 0.
	 */
	desc.high_speed_desc = (uint8_t *) &USB_FsConfigDescriptor[0];
	desc.full_speed_desc = (uint8_t *) &USB_FsConfigDescriptor[0];
	desc.device_qualifier = 0;

	/* USB Initialization */
	ret = USBD_API->hw->Init(&g_hUsb, &desc, &usb_param);
	if (ret == LPC_OK) {

		/* Init VCOM interface */
		ret = vcom_init(g_hUsb, &desc, &usb_param);
		if (ret == LPC_OK) {
			/*  enable USB interrupts */
			NVIC_EnableIRQ(USB0_IRQn);
			/* now connect */
			USBD_API->hw->Connect(g_hUsb, 1);
		}

	}

	DEBUGSTR("USB CDC class based virtual Comm port example!\r\n");

	while (1) {
		/* Check if host has connected and opened the VCOM port */
		if ((vcom_connected() != 0) && (prompt == 0)) {
			vcom_write("Hello World!!\r\n", 15);
			prompt = 1;
		}
		/* If VCOM port is opened echo whatever we receive back to host. */
		if (prompt) {
			rdCnt = vcom_bread(&g_rxBuff[0], 256);
			if (rdCnt) {
				vcom_write(&g_rxBuff[0], rdCnt);
			}
		}
		/* Sleep until next IRQ happens */
		__WFI();
	}
}
/**
 * Called When Valid Packet is received.
 */
static inline void onReceivePacket() {
	/**
	 * Global Variables
	 * g_rxBuff : Packet Data (not include header and footer)
	 * g_buffCounter : Length of Packet data (byte)
	 * g_dataADC : result of ADC
	 * g_target  : target valueof control
	 *
	 */
	if (strncmp(g_rxBuff, "ping", g_buffCounter) == 0) {
		vcom_write("$ping#", 4 + 2);
	} else if (strncmp(g_rxBuff, "get", g_buffCounter) == 0) {
		uint16_t data = g_dataADC;
		char out_str[6];
		out_str[0] = '$';
		int j;
		for (j = 4; j != 0; j--) {
			out_str[j] = (data % 10) + 48;
			data /= 10;
		}
		out_str[5] = '#';
		vcom_write((unsigned char*) out_str, 6);
	} else if (strncmp((char*) g_rxBuff, "set", 3) == 0) {
		if (g_buffCounter != (3 + 4)) {
			vcom_write("$error#", 5 + 2);
		} else {
			uint16_t data = str2uint16(g_rxBuff + 3, 4);
			g_target = data;
			vcom_write("$set#", 5);
		}
	} else if (strncmp((char*) g_rxBuff, "kp", 2) == 0) {
		if (g_buffCounter != (2 + 4)) {
			vcom_write("$error#", 5 + 2);
		} else {
			uint16_t data = str2uint16(g_rxBuff + 2, 4);
			g_Kp = data;
			vcom_write("$kp#", 6);
		}
	}else if (strncmp((char*) g_rxBuff, "ti", 2) == 0) {
		if (g_buffCounter != (2 + 4)) {
			vcom_write("$error#", 5 + 2);
		} else {
			uint16_t data = str2uint16(g_rxBuff + 2, 4);
			g_Ti = data;
			vcom_write("$ti#", 6);
		}
	}
	else if (strncmp((char*) g_rxBuff, "td", 2) == 0) {
			if (g_buffCounter != (2 + 4)) {
				vcom_write("$error#", 5 + 2);
			} else {
				uint16_t data = str2uint16(g_rxBuff + 2, 4);
				g_Td = data;
				vcom_write("$td#", 6);
			}
	}
	else {
		vcom_write("$error#", 5 + 2);
	}
}
Beispiel #9
0
inline uint32_t skynet_cdc_write(uint8_t *pBuf, uint32_t len) {
	return vcom_write(pBuf, len);
}