void cdc_task(void) { if(Is_device_enumerated()) //Enumeration processs OK ? { if(cpt_sof>=NB_MS_BEFORE_FLUSH && tx_counter!=0 ) //Flush buffer in Timeout { cpt_sof=0; uart_usb_flush(); } if ( waiting_to_start && uart_usb_test_hit()) // Something received from the USB ? { waiting_to_start = 0; timer_init(); adc_init(); } if( !waiting_to_start ) { READING r; if( cb_pop( &r ) ) { uart_usb_putchar( (r.voltage >> 8) & 0xFF ); uart_usb_putchar( r.voltage & 0xFF ); uart_usb_putchar( (r.current >> 8) & 0xFF ); uart_usb_putchar( r.current & 0xFF ); uint16 checksum = r.voltage ^ r.current; uart_usb_putchar( (checksum >> 8) & 0xFF ); uart_usb_putchar( checksum & 0xFF ); } }
/** * @brief This function reads one byte from the USB bus * * If one byte is present in the USB fifo, this byte is returned. If no data * is present in the USB fifo, this function waits for USB data. * * @return U8 byte received */ char uart_usb_getchar(void) { register Uchar data_rx; // Preserve the currently selected endpoint uint8_t uenum = Usb_get_selected_endpoint(); Usb_select_endpoint(VCP_RX_EP); if (!rx_counter) while (!uart_usb_test_hit()); data_rx=Usb_read_byte(); rx_counter--; if (!rx_counter) Usb_ack_receive_out(); #if USB_CDC_ACM_CONF_LOCAL_ECHO //Local echo uart_usb_putchar(data_rx); #endif USB_CDC_ACM_HOOK_RX(data_rx); // Restore previously selected endpoint UENUM = uenum; return data_rx; }
int usb_stdout_putchar(char c, FILE *stream) { // No need to preserve the currently // selected endpoint here because this // function doesn't directly touch any // USB registers. if(c=='\n') uart_usb_putchar('\r'); if(c!='\r') uart_usb_putchar(c); // Flush on newline. if(c=='\n') uart_usb_flush(); return 0; }