9 #include <sys/select.h>
16 static struct termios org_settings
;
17 static struct termios work_settings
;
19 int link_open(char * port
){
24 res
=tcgetattr(fd
,&org_settings
);
25 if (res
!=0) return -1;
27 res
=tcgetattr(fd
,&work_settings
);
28 if (res
!=0) return -1;
30 cfmakeraw(&work_settings
);
31 res
=tcsetattr(fd
, TCSANOW
, &work_settings
);
33 if (res
!=0) return -1;
38 extern void link_close(void){
40 tcsetattr(fd
, TCSANOW
, &org_settings
);
44 extern int link_flush(char * port
){
45 int ifd
=open(port
, O_RDWR
);
49 struct timeval timeout
={
57 while (timeout
.tv_usec
){
59 select(ifd
+1,&fds
,NULL
,NULL
,&timeout
);
60 //debug("select done\n");
61 if (timeout
.tv_sec
+timeout
.tv_usec
)
62 read(ifd
,&tmpbuf
, sizeof(tmpbuf
));
68 int link_write(uint16_t * data
, int len
){
76 wbuf
=(char *)malloc(len
*2);
80 for (i
=0; i
<len
; i
++){
81 wbuf
[2*i
]=(data
[i
]>>6)&077;
82 wbuf
[2*i
+1]=(data
[i
])&077;
87 int res
=write(fd
,wbuf
+len
*2-remain
, remain
);
98 int link_read(uint16_t * buffer
, int len
){
102 rbuf
=(char *)malloc(len
*2);
103 if (!rbuf
) return -1;
110 int res
=read(fd
,rbuf
+len
*2-remain
, remain
);
118 for (i
=0; i
<len
; i
++){
119 buffer
[i
] = rbuf
[2*i
]&077;
120 buffer
[i
] |= rbuf
[2*i
+1]<<6;