]> rtime.felk.cvut.cz Git - can-usb1.git/blob - ulan/embedded/libs4c/ulan/uloi_lt/uloi_ioulan.c
Initializing repo
[can-usb1.git] / ulan / embedded / libs4c / ulan / uloi_lt / uloi_ioulan.c
1 #include <uloi_base.h>
2
3 int uloi_i_open(ULOI_PARAM_coninfo UL_ARGPTRTYPE ul_msginfo *imsginfo)
4 {
5  #ifndef UL_WITHOUT_HANDLE
6   uchar uloi_tmpbuf[3];
7   ul_msginfo msginfo;
8  #endif
9   ul_ssize_t ret;
10
11   if(coninfo->error)
12     return -1;
13
14   if(!imsginfo){
15     ret=ul_acceptmsg(coninfo->ul_fd, &msginfo);
16     if(ret<0){
17       coninfo->error=1;
18       return -1;
19     }
20     if((msginfo.cmd!=coninfo->cmd)||
21        (msginfo.len<3)||
22        (msginfo.flg&UL_BFL_FAIL))
23       goto conerr;
24     coninfo->adr=msginfo.sadr;
25   }else{
26     if((imsginfo->cmd!=coninfo->cmd)||
27        (imsginfo->len<3)||
28        (imsginfo->flg&UL_BFL_FAIL))
29       goto conerr1;
30     coninfo->adr=imsginfo->sadr;
31     ret=1;
32   }
33
34   if(uloi_i_read(ULOI_ARG_coninfo uloi_tmpbuf, 3)!=3)
35     goto conerr;
36
37   coninfo->bcmd=uloi_tmpbuf[0];
38   coninfo->bsn=uloi_tmpbuf[1];
39   /* We could need our loop-back serial number for messages tracking */
40   coninfo->sn=uloi_tmpbuf[2];
41
42   return ret;
43
44   conerr:
45    #ifdef ul_i_close
46     ul_i_close(coninfo->ul_fd);
47    #else
48     ul_abortmsg(coninfo->ul_fd);
49    #endif
50   conerr1:
51     if(!coninfo->error)
52       coninfo->error=1;
53     return -1;
54 }
55
56 int uloi_o_open(ULOI_PARAM1_coninfo)
57 {
58  #ifndef UL_WITHOUT_HANDLE
59   ul_msginfo msginfo;
60   uchar uloi_tmpbuf[3];
61  #endif
62   ul_ssize_t ret;
63
64   if(coninfo->state&ULOI_CONINFO_OUTOPEN)
65     return 0;
66
67   msginfo.dadr=coninfo->adr;
68   msginfo.sadr=0;
69   msginfo.cmd=coninfo->bcmd;
70   msginfo.flg=UL_BFL_SND|UL_BFL_ARQ;
71   msginfo.len=0;
72   ret=ul_newmsg(coninfo->ul_fd1, &msginfo);
73   if(ret<0){
74     coninfo->error=1;
75     uloi_i_close(ULOI_ARG1_coninfo);
76     return -1;
77   }
78
79   uloi_tmpbuf[0]=coninfo->cmd;
80   /* We do not run own sequence numbers in the device */
81   uloi_tmpbuf[1]=0; /*coninfo->sn;*/
82   uloi_tmpbuf[2]=coninfo->bsn;
83
84   if(uloi_o_write(ULOI_ARG_coninfo uloi_tmpbuf, 3)!=3){
85     coninfo->error=1;
86     uloi_o_close(ULOI_ARG1_coninfo);
87     return -1;
88   }
89
90   coninfo->state|=ULOI_CONINFO_OUTOPEN;
91
92   return 1;
93 }
94
95 int uloi_i_close(ULOI_PARAM1_coninfo)
96 {
97 #ifdef ul_i_close
98   return ul_i_close(coninfo->ul_fd);
99 #else
100   if(coninfo->error){
101     return ul_abortmsg(coninfo->ul_fd);
102   }
103   return ul_freemsg(coninfo->ul_fd);
104 #endif
105 }
106
107 int uloi_o_close(ULOI_PARAM1_coninfo)
108 {
109   if(!(coninfo->state&ULOI_CONINFO_OUTOPEN))
110     return 0;
111
112   coninfo->state&=~ULOI_CONINFO_OUTOPEN;
113
114 #ifdef ul_o_close
115   if(coninfo->error)
116     return -1;
117   return ul_o_close(coninfo->ul_fd1);
118 #else
119   if(coninfo->error){
120     return ul_abortmsg(coninfo->ul_fd1);
121   }
122   return ul_freemsg(coninfo->ul_fd1);
123 #endif
124 }
125
126 ul_ssize_t uloi_i_read(ULOI_PARAM_coninfo void *buffer, size_t size)
127 {
128   ul_ssize_t ret;
129   if(coninfo->error)
130     return -1;
131   ret=ul_read(coninfo->ul_fd, buffer, size);
132   if(ret<0)
133     coninfo->error=1;
134   return ret;
135 }
136
137 ul_ssize_t uloi_o_write(ULOI_PARAM_coninfo const void *buffer, size_t size)
138 {
139   ul_ssize_t ret;
140   if(coninfo->error)
141     return -1;
142   ret=ul_write(coninfo->ul_fd1, buffer, size);
143   if(ret<0)
144     coninfo->error=1;
145   return ret;
146 }