1 | /*
|
---|
2 | * TOPPERS/ASP Kernel
|
---|
3 | * Toyohashi Open Platform for Embedded Real-Time Systems/
|
---|
4 | * Advanced Standard Profile Kernel
|
---|
5 | *
|
---|
6 | * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
|
---|
7 | * Toyohashi Univ. of Technology, JAPAN
|
---|
8 | * Copyright (C) 2006-2015 by Embedded and Real-Time Systems Laboratory
|
---|
9 | * Graduate School of Information Science, Nagoya Univ., JAPAN
|
---|
10 | *
|
---|
11 | * ä¸è¨èä½æ¨©è
|
---|
12 | ã¯ï¼ä»¥ä¸ã®(1)ï½(4)ã®æ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§
|
---|
13 | * ã¢ï¼æ¬ã½ããã¦ã§ã¢ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹
|
---|
14 | * å¤ã»åé
|
---|
15 | å¸ï¼ä»¥ä¸ï¼å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼
|
---|
16 | * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½
|
---|
17 | * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼
|
---|
18 | * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼
|
---|
19 | * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿
|
---|
20 | * ç¨ã§ããå½¢ã§åé
|
---|
21 | å¸ããå ´åã«ã¯ï¼åé
|
---|
22 | å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨
|
---|
23 | * è
|
---|
24 | ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨
|
---|
25 | * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼
|
---|
26 | * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿
|
---|
27 | * ç¨ã§ããªãå½¢ã§åé
|
---|
28 | å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã
|
---|
29 | * ã¨ï¼
|
---|
30 | * (a) åé
|
---|
31 | å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è
|
---|
32 | ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è
|
---|
33 | * ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼
|
---|
34 | * (b) åé
|
---|
35 | å¸ã®å½¢æ
|
---|
36 | ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã«
|
---|
37 | * å ±åãããã¨ï¼
|
---|
38 | * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ
|
---|
39 | * 害ãããï¼ä¸è¨èä½æ¨©è
|
---|
40 | ããã³TOPPERSããã¸ã§ã¯ããå
|
---|
41 | 責ãããã¨ï¼
|
---|
42 | * ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®ã¦ã¼ã¶ã¾ãã¯ã¨ã³ãã¦ã¼ã¶ããã®ãããªãç
|
---|
43 | * ç±ã«åºã¥ãè«æ±ãããï¼ä¸è¨èä½æ¨©è
|
---|
44 | ããã³TOPPERSããã¸ã§ã¯ãã
|
---|
45 | * å
|
---|
46 | 責ãããã¨ï¼
|
---|
47 | *
|
---|
48 | * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è
|
---|
49 | ã
|
---|
50 | * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç
|
---|
51 | * ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§
|
---|
52 | * ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã
|
---|
53 | * ã®è²¬ä»»ãè² ããªãï¼
|
---|
54 | *
|
---|
55 | * $Id: tSerialPortMain.c 388 2019-05-22 11:25:18Z coas-nagasima $
|
---|
56 | */
|
---|
57 |
|
---|
58 | /*
|
---|
59 | * ã·ãªã¢ã«ã¤ã³ã¿ãã§ã¼ã¹ãã©ã¤ã
|
---|
60 | */
|
---|
61 |
|
---|
62 | #include <kernel.h>
|
---|
63 | #include "tSerialPortMain_tecsgen.h"
|
---|
64 | #include <t_syslog.h>
|
---|
65 |
|
---|
66 | /*
|
---|
67 | * ããã¼å¶å¾¡ã«é¢é£ããå®æ°ã¨ãã¯ã
|
---|
68 | */
|
---|
69 | #define FC_STOP '\023' /* ã³ã³ããã¼ã«-S */
|
---|
70 | #define FC_START '\021' /* ã³ã³ããã¼ã«-Q */
|
---|
71 |
|
---|
72 | #define BUFCNT_STOP(bufsz) ((bufsz) * 3 / 4) /* STOPãéãåºæºæåæ° */
|
---|
73 | #define BUFCNT_START(bufsz) ((bufsz) / 2) /* STARTãéãåºæºæåæ° */
|
---|
74 |
|
---|
75 | /*
|
---|
76 | * ãã¤ã³ã¿ã®ã¤ã³ã¯ãªã¡ã³ã
|
---|
77 | */
|
---|
78 | #define INC_PTR(ptr, bufsz) do { \
|
---|
79 | if (++(ptr) == (bufsz)) { \
|
---|
80 | (ptr) = 0; \
|
---|
81 | } \
|
---|
82 | } while (false)
|
---|
83 |
|
---|
84 | /*
|
---|
85 | * ãµã¼ãã¹ã³ã¼ã«å¼åºããã¯ã
|
---|
86 | *
|
---|
87 | * ãµã¼ãã¹ã³ã¼ã«å¼åºããå«ãå¼expãè©ä¾¡ãï¼è¿å¤ãã¨ã©ã¼ï¼è² ã®å¤ï¼ã®å ´
|
---|
88 | * åã«ã¯ï¼ercã«ercd_expãè©ä¾¡ããå¤ã代å
|
---|
89 | ¥ãï¼error_exitã«gotoããï¼
|
---|
90 | */
|
---|
91 | #define SVC(exp, ercd_exp) do { \
|
---|
92 | if ((exp) < 0) { \
|
---|
93 | ercd = (ercd_exp); \
|
---|
94 | goto error_exit; \
|
---|
95 | } \
|
---|
96 | } while (false)
|
---|
97 |
|
---|
98 | /*
|
---|
99 | * E_SYSã¨ã©ã¼ã®çæ
|
---|
100 | */
|
---|
101 | static ER
|
---|
102 | gen_ercd_sys(CELLCB *p_cellcb)
|
---|
103 | {
|
---|
104 | VAR_errorFlag = true;
|
---|
105 | return(E_SYS);
|
---|
106 | }
|
---|
107 |
|
---|
108 | /*
|
---|
109 | * å¾
|
---|
110 | ã¡ã«å
|
---|
111 | ¥ããµã¼ãã¹ã³ã¼ã«ããã®ã¨ã©ã¼ã®å¤æ
|
---|
112 | */
|
---|
113 | static ER
|
---|
114 | gen_ercd_wait(ER rercd, CELLCB *p_cellcb)
|
---|
115 | {
|
---|
116 | switch (MERCD(rercd)) {
|
---|
117 | case E_RLWAI:
|
---|
118 | case E_DLT:
|
---|
119 | case E_RASTER:
|
---|
120 | return(rercd);
|
---|
121 | default:
|
---|
122 | VAR_errorFlag = true;
|
---|
123 | return(E_SYS);
|
---|
124 | }
|
---|
125 | }
|
---|
126 |
|
---|
127 | /*
|
---|
128 | * ã·ãªã¢ã«ãã¼ãã®ãªã¼ãã³ï¼åãå£é¢æ°ï¼
|
---|
129 | */
|
---|
130 | ER
|
---|
131 | eSerialPort_open(CELLIDX idx)
|
---|
132 | {
|
---|
133 | CELLCB *p_cellcb;
|
---|
134 | ER ercd;
|
---|
135 |
|
---|
136 | if (sns_dpn()) { /* ã³ã³ããã¹ãã®ãã§ã㯠*/
|
---|
137 | return(E_CTX);
|
---|
138 | }
|
---|
139 | if (!VALID_IDX(idx)) {
|
---|
140 | return(E_ID); /* ãã¼ãçªå·ã®ãã§ã㯠*/
|
---|
141 | }
|
---|
142 | p_cellcb = GET_CELLCB(idx);
|
---|
143 |
|
---|
144 | SVC(dis_dsp(), gen_ercd_sys(p_cellcb));
|
---|
145 | if (VAR_openFlag) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ã㯠*/
|
---|
146 | ercd = E_OBJ;
|
---|
147 | }
|
---|
148 | else {
|
---|
149 | /*
|
---|
150 | * å¤æ°ã®åæå
|
---|
151 | */
|
---|
152 | VAR_ioControl = (IOCTL_ECHO | IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV);
|
---|
153 |
|
---|
154 | VAR_receiveReadPointer = 0U;
|
---|
155 | VAR_receiveWritePointer = 0U;
|
---|
156 | VAR_receiveCount = 0U;
|
---|
157 | VAR_receiveFlowControl = '\0';
|
---|
158 | VAR_receiveStopped = false;
|
---|
159 |
|
---|
160 | VAR_sendReadPointer = 0U;
|
---|
161 | VAR_sendWritePointer = 0U;
|
---|
162 | VAR_sendCount = 0U;
|
---|
163 | VAR_sendStopped = false;
|
---|
164 |
|
---|
165 | /*
|
---|
166 | * ãã以éï¼å²è¾¼ã¿ãç¦æ¢ããï¼
|
---|
167 | */
|
---|
168 | if (loc_cpu() < 0) {
|
---|
169 | ercd = E_SYS;
|
---|
170 | goto error_exit_enadsp;
|
---|
171 | }
|
---|
172 |
|
---|
173 | /*
|
---|
174 | * ãã¼ãã¦ã§ã¢ä¾åã®ãªã¼ãã³å¦ç
|
---|
175 | */
|
---|
176 | cSIOPort_open();
|
---|
177 |
|
---|
178 | /*
|
---|
179 | * åä¿¡éç¥ã³ã¼ã«ããã¯ã許å¯ããï¼
|
---|
180 | */
|
---|
181 | cSIOPort_enableCBR(SIOReceiveReady);
|
---|
182 | VAR_openFlag = true;
|
---|
183 | VAR_errorFlag = false;
|
---|
184 |
|
---|
185 | if (unl_cpu() < 0) {
|
---|
186 | VAR_errorFlag = true;
|
---|
187 | ercd = E_SYS;
|
---|
188 | goto error_exit_enadsp;
|
---|
189 | }
|
---|
190 | ercd = E_OK;
|
---|
191 | }
|
---|
192 |
|
---|
193 | error_exit_enadsp:
|
---|
194 | SVC(ena_dsp(), gen_ercd_sys(p_cellcb));
|
---|
195 |
|
---|
196 | error_exit:
|
---|
197 | return(ercd);
|
---|
198 | }
|
---|
199 |
|
---|
200 | /*
|
---|
201 | * ã·ãªã¢ã«ãã¼ãã®ã¯ãã¼ãºï¼åãå£é¢æ°ï¼
|
---|
202 | */
|
---|
203 | ER
|
---|
204 | eSerialPort_close(CELLIDX idx)
|
---|
205 | {
|
---|
206 | CELLCB *p_cellcb;
|
---|
207 | ER ercd;
|
---|
208 | bool_t eflag = false;
|
---|
209 |
|
---|
210 | if (sns_dpn()) { /* ã³ã³ããã¹ãã®ãã§ã㯠*/
|
---|
211 | return(E_CTX);
|
---|
212 | }
|
---|
213 | if (!VALID_IDX(idx)) {
|
---|
214 | return(E_ID); /* ãã¼ãçªå·ã®ãã§ã㯠*/
|
---|
215 | }
|
---|
216 | p_cellcb = GET_CELLCB(idx);
|
---|
217 |
|
---|
218 | SVC(dis_dsp(), gen_ercd_sys(p_cellcb));
|
---|
219 | if (!VAR_openFlag) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ã㯠*/
|
---|
220 | ercd = E_OBJ;
|
---|
221 | }
|
---|
222 | else {
|
---|
223 | /*
|
---|
224 | * ãã¼ãã¦ã§ã¢ä¾åã®ã¯ãã¼ãºå¦ç
|
---|
225 | */
|
---|
226 | if (loc_cpu() < 0) {
|
---|
227 | eflag = true;
|
---|
228 | }
|
---|
229 | cSIOPort_close();
|
---|
230 | VAR_openFlag = false;
|
---|
231 | if (unl_cpu() < 0) {
|
---|
232 | eflag = true;
|
---|
233 | }
|
---|
234 |
|
---|
235 | /*
|
---|
236 | * ã»ããã©ã®åæå
|
---|
237 | */
|
---|
238 | if (cSendSemaphore_initialize() < 0) {
|
---|
239 | eflag = true;
|
---|
240 | }
|
---|
241 | if (cReceiveSemaphore_initialize() < 0) {
|
---|
242 | eflag = true;
|
---|
243 | }
|
---|
244 |
|
---|
245 | /*
|
---|
246 | * ã¨ã©ã¼ã³ã¼ãã®è¨å®
|
---|
247 | */
|
---|
248 | if (eflag) {
|
---|
249 | ercd = gen_ercd_sys(p_cellcb);
|
---|
250 | }
|
---|
251 | else {
|
---|
252 | ercd = E_OK;
|
---|
253 | }
|
---|
254 | }
|
---|
255 | SVC(ena_dsp(), gen_ercd_sys(p_cellcb));
|
---|
256 |
|
---|
257 | error_exit:
|
---|
258 | return(ercd);
|
---|
259 | }
|
---|
260 |
|
---|
261 | /*
|
---|
262 | * ã·ãªã¢ã«ãã¼ãã¸ã®æåéä¿¡
|
---|
263 | *
|
---|
264 | * p_cellcbã§æå®ãããSIOãã¼ãã«å¯¾ãã¦ï¼æåcãéä¿¡ããï¼æåãéä¿¡
|
---|
265 | * ã¬ã¸ã¹ã¿ã«ãããå ´åã«ã¯trueãè¿ãï¼ããã§ãªãå ´åã«ã¯ï¼éä¿¡ã¬ã¸ã¹
|
---|
266 | * ã¿ã空ãããã¨ãéç¥ããã³ã¼ã«ããã¯é¢æ°ã許å¯ãï¼falseãè¿ãï¼ãã®
|
---|
267 | * é¢æ°ã¯ï¼CPUããã¯ç¶æ
|
---|
268 | ã§å¼ã³åºãããï¼
|
---|
269 | */
|
---|
270 | Inline bool_t
|
---|
271 | serialPort_sendChar(CELLCB *p_cellcb, char c)
|
---|
272 | {
|
---|
273 | if (cSIOPort_putChar(c)) {
|
---|
274 | return(true);
|
---|
275 | }
|
---|
276 | else {
|
---|
277 | cSIOPort_enableCBR(SIOSendReady);
|
---|
278 | return(false);
|
---|
279 | }
|
---|
280 | }
|
---|
281 |
|
---|
282 | /*
|
---|
283 | * ã·ãªã¢ã«ãã¼ãã¸ã®1æåéä¿¡
|
---|
284 | */
|
---|
285 | static ER_BOOL
|
---|
286 | serialPort_writeChar(CELLCB *p_cellcb, char c)
|
---|
287 | {
|
---|
288 | bool_t buffer_full;
|
---|
289 | ER ercd, rercd;
|
---|
290 |
|
---|
291 | /*
|
---|
292 | * LFã®åã«CRãéä¿¡ããï¼
|
---|
293 | */
|
---|
294 | if (c == '\n' && (VAR_ioControl & IOCTL_CRLF) != 0U) {
|
---|
295 | /*
|
---|
296 | * 以ä¸ã®ã³ã¼ãã¯å帰å¼åºãã«ãªã£ã¦ãããï¼å¼æ°cã'\n'ã®å ´åã«
|
---|
297 | * å¼æ°cã'\r'ã¨ãã¦å¼ã³åºããã¨ããï¼ãã®å帰å¼åºãã¯2åç®ã®
|
---|
298 | * å¼ã³åºãã§å¿
|
---|
299 | ãæ¢ã¾ãï¼
|
---|
300 | */
|
---|
301 | SVC(rercd = serialPort_writeChar(p_cellcb, '\r'), rercd);
|
---|
302 | if ((bool_t) rercd) {
|
---|
303 | SVC(rercd = cSendSemaphore_wait(),
|
---|
304 | gen_ercd_wait(rercd, p_cellcb));
|
---|
305 | }
|
---|
306 | }
|
---|
307 |
|
---|
308 | SVC(loc_cpu(), gen_ercd_sys(p_cellcb));
|
---|
309 | if (VAR_sendCount == 0U && !VAR_sendStopped
|
---|
310 | && serialPort_sendChar(p_cellcb, c)) {
|
---|
311 | /*
|
---|
312 | * SIOã®éä¿¡ã¬ã¸ã¹ã¿ã«æåãå
|
---|
313 | ¥ãããã¨ã«æåããå ´åï¼
|
---|
314 | */
|
---|
315 | buffer_full = false;
|
---|
316 | }
|
---|
317 | else {
|
---|
318 | /*
|
---|
319 | * éä¿¡ãããã¡ã«æåãå
|
---|
320 | ¥ããï¼
|
---|
321 | */
|
---|
322 | VAR_sendBuffer[VAR_sendWritePointer] = c;
|
---|
323 | INC_PTR(VAR_sendWritePointer, ATTR_sendBufferSize);
|
---|
324 | VAR_sendCount++;
|
---|
325 | buffer_full = (VAR_sendCount == ATTR_sendBufferSize);
|
---|
326 | }
|
---|
327 |
|
---|
328 | SVC(unl_cpu(), gen_ercd_sys(p_cellcb));
|
---|
329 | ercd = (ER_BOOL) buffer_full;
|
---|
330 |
|
---|
331 | error_exit:
|
---|
332 | return(ercd);
|
---|
333 | }
|
---|
334 |
|
---|
335 | /*
|
---|
336 | * ã·ãªã¢ã«ãã¼ãã¸ã®æååéä¿¡ï¼åãå£é¢æ°ï¼
|
---|
337 | */
|
---|
338 | ER_UINT
|
---|
339 | eSerialPort_write(CELLIDX idx, const char *buffer, uint_t length)
|
---|
340 | {
|
---|
341 | CELLCB *p_cellcb;
|
---|
342 | bool_t buffer_full;
|
---|
343 | uint_t wricnt = 0U;
|
---|
344 | ER ercd, rercd;
|
---|
345 |
|
---|
346 | if (sns_dpn()) { /* ã³ã³ããã¹ãã®ãã§ã㯠*/
|
---|
347 | return(E_CTX);
|
---|
348 | }
|
---|
349 | if (!VALID_IDX(idx)) { /* ãã¼ãçªå·ã®ãã§ã㯠*/
|
---|
350 | return(E_ID);
|
---|
351 | }
|
---|
352 |
|
---|
353 | p_cellcb = GET_CELLCB(idx);
|
---|
354 | if (!VAR_openFlag) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ã㯠*/
|
---|
355 | return(E_OBJ);
|
---|
356 | }
|
---|
357 | if (VAR_errorFlag) { /* ã¨ã©ã¼ç¶æ
|
---|
358 | ãã®ãã§ã㯠*/
|
---|
359 | return(E_SYS);
|
---|
360 | }
|
---|
361 |
|
---|
362 | buffer_full = true; /* ã«ã¼ãã®1åãã¯wai_semãã */
|
---|
363 | while (wricnt < length) {
|
---|
364 | if (buffer_full) {
|
---|
365 | SVC(rercd = cSendSemaphore_wait(),
|
---|
366 | gen_ercd_wait(rercd, p_cellcb));
|
---|
367 | }
|
---|
368 | SVC(rercd = serialPort_writeChar(p_cellcb, *buffer++), rercd);
|
---|
369 | wricnt++;
|
---|
370 | buffer_full = (bool_t) rercd;
|
---|
371 | }
|
---|
372 | if (!buffer_full) {
|
---|
373 | SVC(cSendSemaphore_signal(), gen_ercd_sys(p_cellcb));
|
---|
374 | }
|
---|
375 | ercd = E_OK;
|
---|
376 |
|
---|
377 | error_exit:
|
---|
378 | return(wricnt > 0U ? (ER_UINT) wricnt : ercd);
|
---|
379 | }
|
---|
380 |
|
---|
381 | /*
|
---|
382 | * ã·ãªã¢ã«ãã¼ãããã®1æååä¿¡
|
---|
383 | */
|
---|
384 | static bool_t
|
---|
385 | serialPort_readChar(CELLCB *p_cellcb, char *p_c)
|
---|
386 | {
|
---|
387 | bool_t buffer_empty;
|
---|
388 | ER ercd;
|
---|
389 |
|
---|
390 | SVC(loc_cpu(), gen_ercd_sys(p_cellcb));
|
---|
391 |
|
---|
392 | /*
|
---|
393 | * åä¿¡ãããã¡ããæåãåãåºãï¼
|
---|
394 | */
|
---|
395 | *p_c = VAR_receiveBuffer[VAR_receiveReadPointer];
|
---|
396 | INC_PTR(VAR_receiveReadPointer, ATTR_receiveBufferSize);
|
---|
397 | VAR_receiveCount--;
|
---|
398 | buffer_empty = (VAR_receiveCount == 0U);
|
---|
399 |
|
---|
400 | /*
|
---|
401 | * STARTãéä¿¡ããï¼
|
---|
402 | */
|
---|
403 | if (VAR_receiveStopped && VAR_receiveCount
|
---|
404 | <= BUFCNT_START(ATTR_receiveBufferSize)) {
|
---|
405 | if (!serialPort_sendChar(p_cellcb, FC_START)) {
|
---|
406 | VAR_receiveFlowControl = FC_START;
|
---|
407 | }
|
---|
408 | VAR_receiveStopped = false;
|
---|
409 | }
|
---|
410 |
|
---|
411 | SVC(unl_cpu(), gen_ercd_sys(p_cellcb));
|
---|
412 | ercd = (ER_BOOL) buffer_empty;
|
---|
413 |
|
---|
414 | error_exit:
|
---|
415 | return(ercd);
|
---|
416 | }
|
---|
417 |
|
---|
418 | /*
|
---|
419 | * ã·ãªã¢ã«ãã¼ãããã®æåååä¿¡ï¼åãå£é¢æ°ï¼
|
---|
420 | */
|
---|
421 | ER_UINT
|
---|
422 | eSerialPort_read(CELLIDX idx, char *buffer, uint_t length, TMO tmout)
|
---|
423 | {
|
---|
424 | CELLCB *p_cellcb;
|
---|
425 | bool_t buffer_empty;
|
---|
426 | uint_t reacnt = 0U;
|
---|
427 | char c = '\0'; /* ã³ã³ãã¤ã©ã®è¦åãææ¢ããããã«åæåãã */
|
---|
428 | ER ercd, rercd;
|
---|
429 |
|
---|
430 | if (sns_dpn()) { /* ã³ã³ããã¹ãã®ãã§ã㯠*/
|
---|
431 | return(E_CTX);
|
---|
432 | }
|
---|
433 | if (!VALID_IDX(idx)) { /* ãã¼ãçªå·ã®ãã§ã㯠*/
|
---|
434 | return(E_ID);
|
---|
435 | }
|
---|
436 |
|
---|
437 | p_cellcb = GET_CELLCB(idx);
|
---|
438 | if (!VAR_openFlag) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ã㯠*/
|
---|
439 | return(E_OBJ);
|
---|
440 | }
|
---|
441 | if (VAR_errorFlag) { /* ã¨ã©ã¼ç¶æ
|
---|
442 | ãã®ãã§ã㯠*/
|
---|
443 | return(E_SYS);
|
---|
444 | }
|
---|
445 |
|
---|
446 | buffer_empty = true; /* ã«ã¼ãã®1åãã¯wai_semãã */
|
---|
447 | while (reacnt < length) {
|
---|
448 | if (buffer_empty) {
|
---|
449 | rercd = cReceiveSemaphore_waitTimeout(tmout);
|
---|
450 | if (rercd == E_TMOUT)
|
---|
451 | return E_TMOUT;
|
---|
452 | if (rercd < 0) {
|
---|
453 | gen_ercd_wait(rercd, p_cellcb);
|
---|
454 | ercd = rercd;
|
---|
455 | goto error_exit;
|
---|
456 | }
|
---|
457 | }
|
---|
458 | SVC(rercd = serialPort_readChar(p_cellcb, &c), rercd);
|
---|
459 | *buffer++ = c;
|
---|
460 | reacnt++;
|
---|
461 | buffer_empty = (bool_t) rercd;
|
---|
462 |
|
---|
463 | /*
|
---|
464 | * ã¨ã³ã¼ããã¯å¦çï¼
|
---|
465 | */
|
---|
466 | if ((VAR_ioControl & IOCTL_ECHO) != 0U) {
|
---|
467 | SVC(rercd = cSendSemaphore_wait(),
|
---|
468 | gen_ercd_wait(rercd, p_cellcb));
|
---|
469 | SVC(rercd = serialPort_writeChar(p_cellcb, c), rercd);
|
---|
470 | if (!((bool_t) rercd)) {
|
---|
471 | SVC(cSendSemaphore_signal(), gen_ercd_sys(p_cellcb));
|
---|
472 | }
|
---|
473 | }
|
---|
474 | }
|
---|
475 | if (!buffer_empty) {
|
---|
476 | SVC(cReceiveSemaphore_signal(), gen_ercd_sys(p_cellcb));
|
---|
477 | }
|
---|
478 | ercd = E_OK;
|
---|
479 |
|
---|
480 | error_exit:
|
---|
481 | return(reacnt > 0U ? (ER_UINT) reacnt : ercd);
|
---|
482 | }
|
---|
483 |
|
---|
484 | /*
|
---|
485 | * ã·ãªã¢ã«ãã¼ãã®å¶å¾¡ï¼åãå£é¢æ°ï¼
|
---|
486 | */
|
---|
487 | ER
|
---|
488 | eSerialPort_control(CELLIDX idx, uint_t ioctl)
|
---|
489 | {
|
---|
490 | CELLCB *p_cellcb;
|
---|
491 |
|
---|
492 | if (sns_dpn()) { /* ã³ã³ããã¹ãã®ãã§ã㯠*/
|
---|
493 | return(E_CTX);
|
---|
494 | }
|
---|
495 | if (!VALID_IDX(idx)) {
|
---|
496 | return(E_ID); /* ãã¼ãçªå·ã®ãã§ã㯠*/
|
---|
497 | }
|
---|
498 |
|
---|
499 | p_cellcb = GET_CELLCB(idx);
|
---|
500 | if (!VAR_openFlag) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ã㯠*/
|
---|
501 | return(E_OBJ);
|
---|
502 | }
|
---|
503 | if (VAR_errorFlag) { /* ã¨ã©ã¼ç¶æ
|
---|
504 | ãã®ãã§ã㯠*/
|
---|
505 | return(E_SYS);
|
---|
506 | }
|
---|
507 |
|
---|
508 | VAR_ioControl = ioctl;
|
---|
509 | return(E_OK);
|
---|
510 | }
|
---|
511 |
|
---|
512 | /*
|
---|
513 | * ã·ãªã¢ã«ãã¼ãç¶æ
|
---|
514 | ã®åç
|
---|
515 | §ï¼åãå£é¢æ°ï¼
|
---|
516 | */
|
---|
517 | ER
|
---|
518 | eSerialPort_refer(CELLIDX idx, T_SERIAL_RPOR* pk_rpor)
|
---|
519 | {
|
---|
520 | CELLCB *p_cellcb;
|
---|
521 |
|
---|
522 | if (sns_dpn()) { /* ã³ã³ããã¹ãã®ãã§ã㯠*/
|
---|
523 | return(E_CTX);
|
---|
524 | }
|
---|
525 | if (!VALID_IDX(idx)) {
|
---|
526 | return(E_ID); /* ãã¼ãçªå·ã®ãã§ã㯠*/
|
---|
527 | }
|
---|
528 |
|
---|
529 | p_cellcb = GET_CELLCB(idx);
|
---|
530 | if (!VAR_openFlag) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ã㯠*/
|
---|
531 | return(E_OBJ);
|
---|
532 | }
|
---|
533 | if (VAR_errorFlag) { /* ã¨ã©ã¼ç¶æ
|
---|
534 | ãã®ãã§ã㯠*/
|
---|
535 | return(E_SYS);
|
---|
536 | }
|
---|
537 |
|
---|
538 | pk_rpor->reacnt = VAR_receiveCount;
|
---|
539 | pk_rpor->wricnt = VAR_sendCount;
|
---|
540 | return(E_OK);
|
---|
541 | }
|
---|
542 |
|
---|
543 | /*
|
---|
544 | * ã·ãªã¢ã«ãã¼ãããã®éä¿¡å¯è½ã³ã¼ã«ããã¯ï¼åãå£é¢æ°ï¼
|
---|
545 | */
|
---|
546 | void
|
---|
547 | eiSIOCBR_readySend(CELLIDX idx)
|
---|
548 | {
|
---|
549 | CELLCB *p_cellcb;
|
---|
550 |
|
---|
551 | assert(VALID_IDX(idx));
|
---|
552 | p_cellcb = GET_CELLCB(idx);
|
---|
553 | if (VAR_receiveFlowControl != '\0') {
|
---|
554 | /*
|
---|
555 | * START/STOP ãéä¿¡ããï¼
|
---|
556 | */
|
---|
557 | (void) cSIOPort_putChar(VAR_receiveFlowControl);
|
---|
558 | VAR_receiveFlowControl = '\0';
|
---|
559 | }
|
---|
560 | else if (!VAR_sendStopped && VAR_sendCount > 0U) {
|
---|
561 | /*
|
---|
562 | * éä¿¡ãããã¡ä¸ããæåãåãåºãã¦éä¿¡ããï¼
|
---|
563 | */
|
---|
564 | (void) cSIOPort_putChar(VAR_sendBuffer[VAR_sendReadPointer]);
|
---|
565 | INC_PTR(VAR_sendReadPointer, ATTR_sendBufferSize);
|
---|
566 | if (VAR_sendCount == ATTR_sendBufferSize) {
|
---|
567 | if (ciSendSemaphore_signal() < 0) {
|
---|
568 | VAR_errorFlag = true;
|
---|
569 | }
|
---|
570 | }
|
---|
571 | VAR_sendCount--;
|
---|
572 | }
|
---|
573 | else {
|
---|
574 | /*
|
---|
575 | * éä¿¡ãã¹ãæåããªãå ´åã¯ï¼éä¿¡å¯è½ã³ã¼ã«ããã¯ãç¦æ¢ããï¼
|
---|
576 | */
|
---|
577 | cSIOPort_disableCBR(SIOSendReady);
|
---|
578 | }
|
---|
579 | }
|
---|
580 |
|
---|
581 | /*
|
---|
582 | * ã·ãªã¢ã«ãã¼ãããã®åä¿¡éç¥ã³ã¼ã«ããã¯ï¼åãå£é¢æ°ï¼
|
---|
583 | */
|
---|
584 | void
|
---|
585 | eiSIOCBR_readyReceive(CELLIDX idx)
|
---|
586 | {
|
---|
587 | CELLCB *p_cellcb;
|
---|
588 | char c;
|
---|
589 |
|
---|
590 | assert(VALID_IDX(idx));
|
---|
591 | p_cellcb = GET_CELLCB(idx);
|
---|
592 | c = (char) cSIOPort_getChar();
|
---|
593 | if ((VAR_ioControl & IOCTL_FCSND) != 0U && c == FC_STOP) {
|
---|
594 | /*
|
---|
595 | * éä¿¡ãä¸æåæ¢ããï¼éä¿¡ä¸ã®æåã¯ãã®ã¾ã¾éä¿¡ããï¼
|
---|
596 | */
|
---|
597 | VAR_sendStopped = true;
|
---|
598 | }
|
---|
599 | else if (VAR_sendStopped && (c == FC_START
|
---|
600 | || (VAR_ioControl & IOCTL_FCANY) != 0U)) {
|
---|
601 | /*
|
---|
602 | * éä¿¡ãåéããï¼
|
---|
603 | */
|
---|
604 | VAR_sendStopped = false;
|
---|
605 | if (VAR_sendCount > 0U) {
|
---|
606 | c = VAR_sendBuffer[VAR_sendReadPointer];
|
---|
607 | if (serialPort_sendChar(p_cellcb, c)) {
|
---|
608 | INC_PTR(VAR_sendReadPointer, ATTR_sendBufferSize);
|
---|
609 | if (VAR_sendCount == ATTR_sendBufferSize) {
|
---|
610 | if (ciSendSemaphore_signal() < 0) {
|
---|
611 | VAR_errorFlag = true;
|
---|
612 | }
|
---|
613 | }
|
---|
614 | VAR_sendCount--;
|
---|
615 | }
|
---|
616 | }
|
---|
617 | }
|
---|
618 | else if ((VAR_ioControl & IOCTL_FCSND) != 0U && c == FC_START) {
|
---|
619 | /*
|
---|
620 | * éä¿¡ã«å¯¾ãã¦ããã¼å¶å¾¡ãã¦ããå ´åï¼START ã¯æ¨ã¦ãï¼
|
---|
621 | */
|
---|
622 | }
|
---|
623 | else if (VAR_receiveCount == ATTR_receiveBufferSize) {
|
---|
624 | /*
|
---|
625 | * ãããã¡ãã«ã®å ´åï¼åä¿¡ããæåãæ¨ã¦ãï¼
|
---|
626 | */
|
---|
627 | }
|
---|
628 | else {
|
---|
629 | /*
|
---|
630 | * åä¿¡ããæåãåä¿¡ãããã¡ã«å
|
---|
631 | ¥ããï¼
|
---|
632 | */
|
---|
633 | VAR_receiveBuffer[VAR_receiveWritePointer] = c;
|
---|
634 | INC_PTR(VAR_receiveWritePointer, ATTR_receiveBufferSize);
|
---|
635 | if (VAR_receiveCount == 0U) {
|
---|
636 | if (ciReceiveSemaphore_signal() < 0) {
|
---|
637 | VAR_errorFlag = true;
|
---|
638 | }
|
---|
639 | }
|
---|
640 | VAR_receiveCount++;
|
---|
641 |
|
---|
642 | /*
|
---|
643 | * STOPãéä¿¡ããï¼
|
---|
644 | */
|
---|
645 | if ((VAR_ioControl & IOCTL_FCRCV) != 0U && !VAR_receiveStopped
|
---|
646 | && VAR_receiveCount >= BUFCNT_STOP(ATTR_receiveBufferSize)) {
|
---|
647 | if (!serialPort_sendChar(p_cellcb, FC_STOP)) {
|
---|
648 | VAR_receiveFlowControl = FC_STOP;
|
---|
649 | }
|
---|
650 | VAR_receiveStopped = true;
|
---|
651 | }
|
---|
652 | }
|
---|
653 | }
|
---|
654 |
|
---|
655 | /*
|
---|
656 | * ã·ãªã¢ã«ã¤ã³ã¿ãã§ã¼ã¹ãã©ã¤ãããã®æªéä¿¡æåã®ååºã
|
---|
657 | */
|
---|
658 | bool_t
|
---|
659 | enSerialPortManage_getChar(CELLIDX idx, char *p_c)
|
---|
660 | {
|
---|
661 | CELLCB *p_cellcb;
|
---|
662 |
|
---|
663 | if (VALID_IDX(idx)) { /* ãã¼ãçªå·ã®ãã§ã㯠*/
|
---|
664 | p_cellcb = GET_CELLCB(idx);
|
---|
665 | if (VAR_openFlag) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ã㯠*/
|
---|
666 | if (VAR_sendCount > 0U) {
|
---|
667 | *p_c = VAR_sendBuffer[VAR_sendReadPointer];
|
---|
668 | INC_PTR(VAR_sendReadPointer, ATTR_sendBufferSize);
|
---|
669 | VAR_sendCount--;
|
---|
670 | return(true);
|
---|
671 | }
|
---|
672 | }
|
---|
673 | }
|
---|
674 | return(false);
|
---|
675 | }
|
---|