-
Notifications
You must be signed in to change notification settings - Fork 3
/
usb_serial_getstr.c
62 lines (54 loc) · 1.18 KB
/
usb_serial_getstr.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <stdint.h>
#include "lufa_serial.h"
char usb_serial_getchar(void);
void usb_serial_putchar(char);
extern USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface;
void usb_serial_putchar(char c)
{
CDC_Device_SendByte(&VirtualSerial_CDC_Interface, (uint8_t)c);
CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
USB_USBTask();
// _delay_us(50);
}
char usb_serial_getchar(void)
{
while(1) {
int16_t data1 = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
if(!(data1<0))
return(data1);
CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
USB_USBTask();
}
}
int usb_serial_getstr(char *str, int count)
{
int i=0, j;
uint8_t c;
while (i<count) {
c = usb_serial_getchar();
if ((c==10) || (c==13)) break; // cr/lf
if (c == 0x15) { // ^U
if (i>0) {
for(j=0; j<i; ++j) {
usb_serial_putchar(8);
usb_serial_putchar(32);
usb_serial_putchar(8);
}
i = 0;
}
} else if (c==127) { // backspace
if (i > 0) {
i--;
usb_serial_putchar(8);
usb_serial_putchar(32);
usb_serial_putchar(8);
}
} else {
usb_serial_putchar(c);
str[i] = c;
i++;
}
}
str[i]=0;
return(i);
}