[processor-sdk/pdk.git] / packages / ti / transport / ndk / nimu / example / CCLink / cclink_slave / library / src / SLMP.c
1 /*\r
2 * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
3 * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
4 * \r
5 * \r
6 * Redistribution and use in source and binary forms, with or without \r
7 * modification, are permitted provided that the following conditions \r
8 * are met:\r
9 *\r
10 * Redistributions of source code must retain the above copyright \r
11 * notice, this list of conditions and the following disclaimer.\r
12 *\r
13 * Redistributions in binary form must reproduce the above copyright\r
14 * notice, this list of conditions and the following disclaimer in the \r
15 * documentation and/or other materials provided with the \r
16 * distribution.\r
17 *\r
18 * Neither the name of Texas Instruments Incorporated nor the names of\r
19 * its contributors may be used to endorse or promote products derived\r
20 * from this software without specific prior written permission.\r
21 *\r
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
26 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
33 *\r
34 */\r
35 \r
36 #include "SLMP.h"\r
37 #include <stdint.h>\r
38 #include "string.h"\r
39 \r
40 static unsigned int uiHeaderLength[] = { 6, 2, 6, 2, 12, 4, 12, 4};\r
41 static unsigned int uiDataAddr[] = { 15, 11, 19, 15, 30, 22, 38, 30};\r
42 \r
43 /* A Function for making packet stream from the SLMP_Info structure */\r
44 int SLMP_MakePacketStream ( uint32_t ulFrameType, const SLMP_INFO *p, uint8_t *pucStream )\r
45 {\r
46 int i = 0;\r
47 int iLength = 0;\r
48 int iIndex = 0;\r
49 \r
50 if ( (p == NULL) || (pucStream == NULL) )\r
51 {\r
52 return SLMP_ERR_NG;\r
53 }\r
54 \r
55 /*[ Request : Binary Mode, Single Transmission Type ]*/\r
56 if( (uint16_t)ulFrameType == SLMP_FTYPE_BIN_REQ_ST )\r
57 {\r
58 iIndex = SLMP_FTYPE_BIN_REQ_ST_INDEX;\r
59 iLength = (p->usDataLength)-uiHeaderLength[iIndex];\r
60 if ( iLength < 0 )\r
61 {\r
62 return SLMP_ERR_NG;\r
63 }\r
64 else if ( iLength > 0 )\r
65 {\r
66 if ( p->pucData == NULL )\r
67 {\r
68 return SLMP_ERR_NG;\r
69 }\r
70 }\r
71 \r
72 pucStream[ 0] = SHIFT_R8(SLMP_FTYPE_BIN_REQ_ST);\r
73 pucStream[ 1] = SHIFT_R0(SLMP_FTYPE_BIN_REQ_ST);\r
74 pucStream[ 2] = SHIFT_R0(p->usNetNumber);\r
75 pucStream[ 3] = SHIFT_R0(p->usNodeNumber);\r
76 pucStream[ 4] = SHIFT_R0(p->usProcNumber);\r
77 pucStream[ 5] = SHIFT_R8(p->usProcNumber);\r
78 pucStream[ 6] = 0x00;\r
79 pucStream[ 7] = SHIFT_R0(p->usDataLength);\r
80 pucStream[ 8] = SHIFT_R8(p->usDataLength);\r
81 pucStream[ 9] = SHIFT_R0(p->usTimer);\r
82 pucStream[10] = SHIFT_R8(p->usTimer);\r
83 pucStream[11] = SHIFT_R0(p->usCommand);\r
84 pucStream[12] = SHIFT_R8(p->usCommand);\r
85 pucStream[13] = SHIFT_R0(p->usSubCommand);\r
86 pucStream[14] = SHIFT_R8(p->usSubCommand);\r
87 for( i=0; i<iLength; i++ )\r
88 {\r
89 pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
90 }\r
91 return SLMP_ERR_OK;\r
92 }\r
93 \r
94 /*[ Response : Binary Mode, Single Transmission Type ]*/\r
95 else if( (uint16_t)ulFrameType == SLMP_FTYPE_BIN_RES_ST )\r
96 {\r
97 iIndex = SLMP_FTYPE_BIN_RES_ST_INDEX;\r
98 iLength = (p->usDataLength)-uiHeaderLength[iIndex]+2;\r
99 if ( iLength < 0 )\r
100 {\r
101 return SLMP_ERR_NG;\r
102 }\r
103 else if ( iLength > 0 )\r
104 {\r
105 if ( p->pucData == NULL )\r
106 {\r
107 return SLMP_ERR_NG;\r
108 }\r
109 }\r
110 \r
111 pucStream[ 0] = SHIFT_R8(SLMP_FTYPE_BIN_RES_ST);\r
112 pucStream[ 1] = SHIFT_R0(SLMP_FTYPE_BIN_RES_ST);\r
113 pucStream[ 2] = SHIFT_R0(p->usNetNumber);\r
114 pucStream[ 3] = SHIFT_R0(p->usNodeNumber);\r
115 pucStream[ 4] = SHIFT_R0(p->usProcNumber);\r
116 pucStream[ 5] = SHIFT_R8(p->usProcNumber);\r
117 pucStream[ 6] = 0x00;\r
118 pucStream[ 7] = SHIFT_R0(p->usDataLength+2);\r
119 pucStream[ 8] = SHIFT_R8(p->usDataLength+2);\r
120 pucStream[ 9] = SHIFT_R0(p->usEndCode);\r
121 pucStream[10] = SHIFT_R8(p->usEndCode);\r
122 \r
123 for( i=0; i<iLength+2; i++ )\r
124 {\r
125 pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
126 }\r
127 return SLMP_ERR_OK;\r
128 }\r
129 \r
130 /*[ Request : Binary Mode, Multiple Transmission Type ]*/\r
131 else if( (uint16_t)ulFrameType == SLMP_FTYPE_BIN_REQ_MT )\r
132 {\r
133 iIndex = SLMP_FTYPE_BIN_REQ_MT_INDEX;\r
134 iLength = (p->usDataLength)-uiHeaderLength[iIndex];\r
135 if ( iLength < 0 )\r
136 {\r
137 return SLMP_ERR_NG;\r
138 }\r
139 else if ( iLength > 0 )\r
140 {\r
141 if ( p->pucData == NULL )\r
142 {\r
143 return SLMP_ERR_NG;\r
144 }\r
145 }\r
146 \r
147 pucStream[ 0] = SHIFT_R8(SLMP_FTYPE_BIN_REQ_MT);\r
148 pucStream[ 1] = SHIFT_R0(SLMP_FTYPE_BIN_REQ_MT);\r
149 pucStream[ 2] = SHIFT_R0(p->usSerialNumber);\r
150 pucStream[ 3] = SHIFT_R8(p->usSerialNumber);\r
151 pucStream[ 4] = 0x00;\r
152 pucStream[ 5] = 0x00;\r
153 pucStream[ 6] = SHIFT_R0(p->usNetNumber);\r
154 pucStream[ 7] = SHIFT_R0(p->usNodeNumber);\r
155 pucStream[ 8] = SHIFT_R0(p->usProcNumber);\r
156 pucStream[ 9] = SHIFT_R8(p->usProcNumber);\r
157 pucStream[10] = 0x00;\r
158 pucStream[11] = SHIFT_R0(p->usDataLength);\r
159 pucStream[12] = SHIFT_R8(p->usDataLength);\r
160 pucStream[13] = SHIFT_R0(p->usTimer);\r
161 pucStream[14] = SHIFT_R8(p->usTimer);\r
162 pucStream[15] = SHIFT_R0(p->usCommand);\r
163 pucStream[16] = SHIFT_R8(p->usCommand);\r
164 pucStream[17] = SHIFT_R0(p->usSubCommand);\r
165 pucStream[18] = SHIFT_R8(p->usSubCommand);\r
166 \r
167 for( i=0; i<iLength; i++ )\r
168 {\r
169 pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
170 }\r
171 return SLMP_ERR_OK;\r
172 }\r
173 \r
174 /*[ Response : Binary Mode, Multiple Transmission Type ]*/\r
175 else if( (uint16_t)ulFrameType == SLMP_FTYPE_BIN_RES_MT )\r
176 {\r
177 iIndex = SLMP_FTYPE_BIN_RES_MT_INDEX;\r
178 iLength = (p->usDataLength)-uiHeaderLength[iIndex]+2;\r
179 if ( iLength < 0 )\r
180 {\r
181 return SLMP_ERR_NG;\r
182 }\r
183 else if ( iLength > 0 )\r
184 {\r
185 if ( p->pucData == NULL )\r
186 {\r
187 return SLMP_ERR_NG;\r
188 }\r
189 }\r
190 \r
191 pucStream[ 0] = SHIFT_R8(SLMP_FTYPE_BIN_RES_MT);\r
192 pucStream[ 1] = SHIFT_R0(SLMP_FTYPE_BIN_RES_MT);\r
193 pucStream[ 2] = SHIFT_R0(p->usSerialNumber);\r
194 pucStream[ 3] = SHIFT_R8(p->usSerialNumber);\r
195 pucStream[ 4] = 0x00;\r
196 pucStream[ 5] = 0x00;\r
197 pucStream[ 6] = SHIFT_R0(p->usNetNumber);\r
198 pucStream[ 7] = SHIFT_R0(p->usNodeNumber);\r
199 pucStream[ 8] = SHIFT_R0(p->usProcNumber);\r
200 pucStream[ 9] = SHIFT_R8(p->usProcNumber);\r
201 pucStream[10] = 0x00;\r
202 pucStream[11] = SHIFT_R0(p->usDataLength+2);\r
203 pucStream[12] = SHIFT_R8(p->usDataLength+2);\r
204 pucStream[13] = SHIFT_R0(p->usEndCode);\r
205 pucStream[14] = SHIFT_R8(p->usEndCode);\r
206 \r
207 for( i=0; i<iLength+2; i++ )\r
208 {\r
209 pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
210 }\r
211 return SLMP_ERR_OK;\r
212 }\r
213 \r
214 /*[ Request : ASCII Mode, Single Transmission Type ]*/\r
215 else if( ulFrameType == SLMP_FTYPE_ASCII_REQ_ST )\r
216 {\r
217 iIndex = SLMP_FTYPE_ASCII_REQ_ST_INDEX;\r
218 iLength = (p->usDataLength)-uiHeaderLength[iIndex];\r
219 if ( iLength < 0 )\r
220 {\r
221 return SLMP_ERR_NG;\r
222 }\r
223 else if ( iLength > 0 )\r
224 {\r
225 if ( p->pucData == NULL )\r
226 {\r
227 return SLMP_ERR_NG;\r
228 }\r
229 }\r
230 \r
231 pucStream[ 0] = SHIFT_R24(SLMP_FTYPE_ASCII_REQ_ST);\r
232 pucStream[ 1] = SHIFT_R16(SLMP_FTYPE_ASCII_REQ_ST);\r
233 pucStream[ 2] = SHIFT_R8 (SLMP_FTYPE_ASCII_REQ_ST);\r
234 pucStream[ 3] = SHIFT_R0 (SLMP_FTYPE_ASCII_REQ_ST);\r
235 pucStream[ 4] = local_itoa(SHIFT_R4(p->usNetNumber) & MASK_LOWER4BIT);\r
236 pucStream[ 5] = local_itoa(SHIFT_R0(p->usNetNumber) & MASK_LOWER4BIT);\r
237 pucStream[ 6] = local_itoa(SHIFT_R4(p->usNodeNumber) & MASK_LOWER4BIT);\r
238 pucStream[ 7] = local_itoa(SHIFT_R0(p->usNodeNumber) & MASK_LOWER4BIT);\r
239 pucStream[ 8] = local_itoa(SHIFT_R12(p->usProcNumber) & MASK_LOWER4BIT);\r
240 pucStream[ 9] = local_itoa(SHIFT_R8 (p->usProcNumber) & MASK_LOWER4BIT);\r
241 pucStream[10] = local_itoa(SHIFT_R4 (p->usProcNumber) & MASK_LOWER4BIT);\r
242 pucStream[11] = local_itoa(SHIFT_R0 (p->usProcNumber) & MASK_LOWER4BIT);\r
243 pucStream[12] = local_itoa(0x00);\r
244 pucStream[13] = local_itoa(0x00);\r
245 pucStream[14] = local_itoa(SHIFT_R12(p->usDataLength) & MASK_LOWER4BIT);\r
246 pucStream[15] = local_itoa(SHIFT_R8 (p->usDataLength) & MASK_LOWER4BIT);\r
247 pucStream[16] = local_itoa(SHIFT_R4 (p->usDataLength) & MASK_LOWER4BIT);\r
248 pucStream[17] = local_itoa(SHIFT_R0 (p->usDataLength) & MASK_LOWER4BIT);\r
249 pucStream[18] = local_itoa(SHIFT_R12(p->usTimer) & MASK_LOWER4BIT);\r
250 pucStream[19] = local_itoa(SHIFT_R8 (p->usTimer) & MASK_LOWER4BIT);\r
251 pucStream[20] = local_itoa(SHIFT_R4 (p->usTimer) & MASK_LOWER4BIT);\r
252 pucStream[21] = local_itoa(SHIFT_R0 (p->usTimer) & MASK_LOWER4BIT);\r
253 pucStream[22] = local_itoa(SHIFT_R12(p->usCommand) & MASK_LOWER4BIT);\r
254 pucStream[23] = local_itoa(SHIFT_R8 (p->usCommand) & MASK_LOWER4BIT);\r
255 pucStream[24] = local_itoa(SHIFT_R4 (p->usCommand) & MASK_LOWER4BIT);\r
256 pucStream[25] = local_itoa(SHIFT_R0 (p->usCommand) & MASK_LOWER4BIT);\r
257 pucStream[26] = local_itoa(SHIFT_R12(p->usSubCommand) & MASK_LOWER4BIT);\r
258 pucStream[27] = local_itoa(SHIFT_R8 (p->usSubCommand) & MASK_LOWER4BIT);\r
259 pucStream[28] = local_itoa(SHIFT_R4 (p->usSubCommand) & MASK_LOWER4BIT);\r
260 pucStream[29] = local_itoa(SHIFT_R0 (p->usSubCommand) & MASK_LOWER4BIT);\r
261 \r
262 for( i=0; i<iLength; i++ )\r
263 {\r
264 pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
265 }\r
266 return SLMP_ERR_OK;\r
267 }\r
268 \r
269 /*[ Response : ASCII Mode, Single Transmission Type ]*/\r
270 else if( ulFrameType == SLMP_FTYPE_ASCII_RES_ST )\r
271 {\r
272 iIndex = SLMP_FTYPE_ASCII_RES_ST_INDEX;\r
273 iLength = (p->usDataLength)-uiHeaderLength[iIndex]+4;\r
274 if ( iLength < 0 )\r
275 {\r
276 return SLMP_ERR_NG;\r
277 }\r
278 else if ( iLength > 0 )\r
279 {\r
280 if ( p->pucData == NULL )\r
281 {\r
282 return SLMP_ERR_NG;\r
283 }\r
284 }\r
285 \r
286 pucStream[ 0] = SHIFT_R24(SLMP_FTYPE_ASCII_RES_ST);\r
287 pucStream[ 1] = SHIFT_R16(SLMP_FTYPE_ASCII_RES_ST);\r
288 pucStream[ 2] = SHIFT_R8 (SLMP_FTYPE_ASCII_RES_ST);\r
289 pucStream[ 3] = SHIFT_R0 (SLMP_FTYPE_ASCII_RES_ST);\r
290 pucStream[ 4] = local_itoa(SHIFT_R4(p->usNetNumber) & MASK_LOWER4BIT);\r
291 pucStream[ 5] = local_itoa(SHIFT_R0(p->usNetNumber) & MASK_LOWER4BIT);\r
292 pucStream[ 6] = local_itoa(SHIFT_R4(p->usNodeNumber) & MASK_LOWER4BIT);\r
293 pucStream[ 7] = local_itoa(SHIFT_R0(p->usNodeNumber) & MASK_LOWER4BIT);\r
294 pucStream[ 8] = local_itoa(SHIFT_R12(p->usProcNumber) & MASK_LOWER4BIT);\r
295 pucStream[ 9] = local_itoa(SHIFT_R8 (p->usProcNumber) & MASK_LOWER4BIT);\r
296 pucStream[10] = local_itoa(SHIFT_R4 (p->usProcNumber) & MASK_LOWER4BIT);\r
297 pucStream[11] = local_itoa(SHIFT_R0 (p->usProcNumber) & MASK_LOWER4BIT);\r
298 pucStream[12] = local_itoa(0x00);\r
299 pucStream[13] = local_itoa(0x00);\r
300 pucStream[14] = local_itoa(SHIFT_R12(p->usDataLength+4) & MASK_LOWER4BIT);\r
301 pucStream[15] = local_itoa(SHIFT_R8 (p->usDataLength+4) & MASK_LOWER4BIT);\r
302 pucStream[16] = local_itoa(SHIFT_R4 (p->usDataLength+4) & MASK_LOWER4BIT);\r
303 pucStream[17] = local_itoa(SHIFT_R0 (p->usDataLength+4) & MASK_LOWER4BIT);\r
304 pucStream[18] = local_itoa(SHIFT_R12(p->usEndCode) & MASK_LOWER4BIT);\r
305 pucStream[19] = local_itoa(SHIFT_R8 (p->usEndCode) & MASK_LOWER4BIT);\r
306 pucStream[20] = local_itoa(SHIFT_R4 (p->usEndCode) & MASK_LOWER4BIT);\r
307 pucStream[21] = local_itoa(SHIFT_R0 (p->usEndCode) & MASK_LOWER4BIT);\r
308 \r
309 for( i=0; i<iLength+4; i++ )\r
310 {\r
311 pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
312 }\r
313 return SLMP_ERR_OK;\r
314 }\r
315 \r
316 /*[ Request : ASCII Mode, Multiple Transmission Type ]*/\r
317 else if( ulFrameType == SLMP_FTYPE_ASCII_REQ_MT )\r
318 {\r
319 iIndex = SLMP_FTYPE_ASCII_REQ_MT_INDEX;\r
320 iLength = (p->usDataLength)-uiHeaderLength[iIndex];\r
321 if ( iLength < 0 )\r
322 {\r
323 return SLMP_ERR_NG;\r
324 }\r
325 else if ( iLength > 0 )\r
326 {\r
327 if ( p->pucData == NULL )\r
328 {\r
329 return SLMP_ERR_NG;\r
330 }\r
331 }\r
332 \r
333 pucStream[ 0] = SHIFT_R24(SLMP_FTYPE_ASCII_REQ_MT);\r
334 pucStream[ 1] = SHIFT_R16(SLMP_FTYPE_ASCII_REQ_MT);\r
335 pucStream[ 2] = SHIFT_R8 (SLMP_FTYPE_ASCII_REQ_MT);\r
336 pucStream[ 3] = SHIFT_R0 (SLMP_FTYPE_ASCII_REQ_MT);\r
337 pucStream[ 4] = local_itoa(SHIFT_R12(p->usSerialNumber) & MASK_LOWER4BIT);\r
338 pucStream[ 5] = local_itoa(SHIFT_R8 (p->usSerialNumber) & MASK_LOWER4BIT);\r
339 pucStream[ 6] = local_itoa(SHIFT_R4 (p->usSerialNumber) & MASK_LOWER4BIT);\r
340 pucStream[ 7] = local_itoa(SHIFT_R0 (p->usSerialNumber) & MASK_LOWER4BIT);\r
341 pucStream[ 8] = local_itoa(0x00);\r
342 pucStream[ 9] = local_itoa(0x00);\r
343 pucStream[10] = local_itoa(0x00);\r
344 pucStream[11] = local_itoa(0x00);\r
345 pucStream[12] = local_itoa(SHIFT_R4(p->usNetNumber) & MASK_LOWER4BIT);\r
346 pucStream[13] = local_itoa(SHIFT_R0(p->usNetNumber) & MASK_LOWER4BIT);\r
347 pucStream[14] = local_itoa(SHIFT_R4(p->usNodeNumber) & MASK_LOWER4BIT);\r
348 pucStream[15] = local_itoa(SHIFT_R0(p->usNodeNumber) & MASK_LOWER4BIT);\r
349 pucStream[16] = local_itoa(SHIFT_R12(p->usProcNumber) & MASK_LOWER4BIT);\r
350 pucStream[17] = local_itoa(SHIFT_R8 (p->usProcNumber) & MASK_LOWER4BIT);\r
351 pucStream[18] = local_itoa(SHIFT_R4 (p->usProcNumber) & MASK_LOWER4BIT);\r
352 pucStream[19] = local_itoa(SHIFT_R0 (p->usProcNumber) & MASK_LOWER4BIT);\r
353 pucStream[20] = local_itoa(0x00);\r
354 pucStream[21] = local_itoa(0x00);\r
355 pucStream[22] = local_itoa(SHIFT_R12(p->usDataLength) & MASK_LOWER4BIT);\r
356 pucStream[23] = local_itoa(SHIFT_R8 (p->usDataLength) & MASK_LOWER4BIT);\r
357 pucStream[24] = local_itoa(SHIFT_R4 (p->usDataLength) & MASK_LOWER4BIT);\r
358 pucStream[25] = local_itoa(SHIFT_R0 (p->usDataLength) & MASK_LOWER4BIT);\r
359 pucStream[26] = local_itoa(SHIFT_R12(p->usTimer) & MASK_LOWER4BIT);\r
360 pucStream[27] = local_itoa(SHIFT_R8 (p->usTimer) & MASK_LOWER4BIT);\r
361 pucStream[28] = local_itoa(SHIFT_R4 (p->usTimer) & MASK_LOWER4BIT);\r
362 pucStream[29] = local_itoa(SHIFT_R0 (p->usTimer) & MASK_LOWER4BIT);\r
363 pucStream[30] = local_itoa(SHIFT_R12(p->usCommand) & MASK_LOWER4BIT);\r
364 pucStream[31] = local_itoa(SHIFT_R8 (p->usCommand) & MASK_LOWER4BIT);\r
365 pucStream[32] = local_itoa(SHIFT_R4 (p->usCommand) & MASK_LOWER4BIT);\r
366 pucStream[33] = local_itoa(SHIFT_R0 (p->usCommand) & MASK_LOWER4BIT);\r
367 pucStream[34] = local_itoa(SHIFT_R12(p->usSubCommand) & MASK_LOWER4BIT);\r
368 pucStream[35] = local_itoa(SHIFT_R8 (p->usSubCommand) & MASK_LOWER4BIT);\r
369 pucStream[36] = local_itoa(SHIFT_R4 (p->usSubCommand) & MASK_LOWER4BIT);\r
370 pucStream[37] = local_itoa(SHIFT_R0 (p->usSubCommand) & MASK_LOWER4BIT);\r
371 \r
372 for( i=0; i<iLength; i++ )\r
373 {\r
374 pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
375 }\r
376 return SLMP_ERR_OK;\r
377 }\r
378 \r
379 /*[ Response : ASCII Mode, Multiple Transmission Type ]*/\r
380 else if( ulFrameType == SLMP_FTYPE_ASCII_RES_MT )\r
381 {\r
382 iIndex = SLMP_FTYPE_ASCII_RES_MT_INDEX;\r
383 iLength = (p->usDataLength)-uiHeaderLength[iIndex]+4;\r
384 if ( iLength < 0 )\r
385 {\r
386 return SLMP_ERR_NG;\r
387 }\r
388 else if ( iLength > 0 )\r
389 {\r
390 if ( p->pucData == NULL )\r
391 {\r
392 return SLMP_ERR_NG;\r
393 }\r
394 }\r
395 \r
396 pucStream[ 0] = SHIFT_R24(SLMP_FTYPE_ASCII_RES_MT);\r
397 pucStream[ 1] = SHIFT_R16(SLMP_FTYPE_ASCII_RES_MT);\r
398 pucStream[ 2] = SHIFT_R8 (SLMP_FTYPE_ASCII_RES_MT);\r
399 pucStream[ 3] = SHIFT_R0 (SLMP_FTYPE_ASCII_RES_MT);\r
400 pucStream[ 4] = local_itoa(SHIFT_R12(p->usSerialNumber) & MASK_LOWER4BIT);\r
401 pucStream[ 5] = local_itoa(SHIFT_R8 (p->usSerialNumber) & MASK_LOWER4BIT);\r
402 pucStream[ 6] = local_itoa(SHIFT_R4 (p->usSerialNumber) & MASK_LOWER4BIT);\r
403 pucStream[ 7] = local_itoa(SHIFT_R0 (p->usSerialNumber) & MASK_LOWER4BIT);\r
404 pucStream[ 8] = local_itoa(0x00);\r
405 pucStream[ 9] = local_itoa(0x00);\r
406 pucStream[10] = local_itoa(0x00);\r
407 pucStream[11] = local_itoa(0x00);\r
408 pucStream[12] = local_itoa(SHIFT_R4(p->usNetNumber) & MASK_LOWER4BIT);\r
409 pucStream[13] = local_itoa(SHIFT_R0(p->usNetNumber) & MASK_LOWER4BIT);\r
410 pucStream[14] = local_itoa(SHIFT_R4(p->usNodeNumber) & MASK_LOWER4BIT);\r
411 pucStream[15] = local_itoa(SHIFT_R0(p->usNodeNumber) & MASK_LOWER4BIT);\r
412 pucStream[16] = local_itoa(SHIFT_R12(p->usProcNumber) & MASK_LOWER4BIT);\r
413 pucStream[17] = local_itoa(SHIFT_R8 (p->usProcNumber) & MASK_LOWER4BIT);\r
414 pucStream[18] = local_itoa(SHIFT_R4 (p->usProcNumber) & MASK_LOWER4BIT);\r
415 pucStream[19] = local_itoa(SHIFT_R0 (p->usProcNumber) & MASK_LOWER4BIT);\r
416 pucStream[20] = local_itoa(0x00);\r
417 pucStream[21] = local_itoa(0x00);\r
418 pucStream[22] = local_itoa(SHIFT_R12(p->usDataLength+4) & MASK_LOWER4BIT);\r
419 pucStream[23] = local_itoa(SHIFT_R8 (p->usDataLength+4) & MASK_LOWER4BIT);\r
420 pucStream[24] = local_itoa(SHIFT_R4 (p->usDataLength+4) & MASK_LOWER4BIT);\r
421 pucStream[25] = local_itoa(SHIFT_R0 (p->usDataLength+4) & MASK_LOWER4BIT);\r
422 pucStream[26] = local_itoa(SHIFT_R12(p->usEndCode) & MASK_LOWER4BIT);\r
423 pucStream[27] = local_itoa(SHIFT_R8 (p->usEndCode) & MASK_LOWER4BIT);\r
424 pucStream[28] = local_itoa(SHIFT_R4 (p->usEndCode) & MASK_LOWER4BIT);\r
425 pucStream[29] = local_itoa(SHIFT_R0 (p->usEndCode) & MASK_LOWER4BIT);\r
426 \r
427 for( i=0; i<iLength+4; i++ )\r
428 {\r
429 pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
430 }\r
431 return SLMP_ERR_OK;\r
432 }\r
433 \r
434 return SLMP_ERR_NG;\r
435 }\r
436 \r
437 /* A Function for getting SLMP_Info from packet stream */\r
438 int SLMP_GetSlmpInfo ( SLMP_INFO *p, const uint8_t *pucStream )\r
439 {\r
440 int i = 0;\r
441 int iIndex = 0;\r
442 int iLength = 0;\r
443 unsigned int uiTempLength = 0;\r
444 unsigned int uiTemp0 = 0, uiTemp1 = 0, uiTemp2 = 0, uiTemp3 = 0;\r
445 uint16_t usFrameType = 0;\r
446 uint32_t ulFrameType = 0;\r
447 \r
448 if ( (p == NULL) || (pucStream == NULL) )\r
449 {\r
450 return SLMP_ERR_NG;\r
451 }\r
452 \r
453 usFrameType = CONCAT_2BIN(pucStream[0], pucStream[1]);\r
454 \r
455 (p->ulFrameType) = usFrameType;\r
456 \r
457 /*[ Request : Binary Mode, Single Transmission Type ]*/\r
458 if( usFrameType == SLMP_FTYPE_BIN_REQ_ST )\r
459 {\r
460 iIndex = SLMP_FTYPE_BIN_REQ_ST_INDEX;\r
461 uiTempLength = CONCAT_2BIN(pucStream[ 8], pucStream[ 7]);\r
462 \r
463 iLength = uiTempLength - uiHeaderLength[iIndex];\r
464 if ( iLength < 0 )\r
465 {\r
466 return SLMP_ERR_NG;\r
467 }\r
468 else if ( iLength > 0 )\r
469 {\r
470 if ( p->pucData == NULL )\r
471 {\r
472 return SLMP_ERR_NG;\r
473 }\r
474 }\r
475 \r
476 (p->usNetNumber) = pucStream[2];\r
477 (p->usNodeNumber) = pucStream[3];\r
478 (p->usProcNumber) = CONCAT_2BIN(pucStream[ 5], pucStream[ 4]);\r
479 (p->usDataLength) = (uint16_t)uiTempLength;\r
480 (p->usTimer) = CONCAT_2BIN(pucStream[10], pucStream[ 9]);\r
481 (p->usCommand) = CONCAT_2BIN(pucStream[12], pucStream[11]);\r
482 (p->usSubCommand) = CONCAT_2BIN(pucStream[14], pucStream[13]);\r
483 \r
484 for( i=0; i<iLength; i++ )\r
485 {\r
486 p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
487 }\r
488 \r
489 return SLMP_ERR_OK;\r
490 }\r
491 \r
492 /*[ Response : Binary Mode, Single Transmission Type ]*/\r
493 else if( usFrameType == SLMP_FTYPE_BIN_RES_ST )\r
494 {\r
495 iIndex = SLMP_FTYPE_BIN_RES_ST_INDEX;\r
496 uiTempLength = CONCAT_2BIN(pucStream[ 8], pucStream[ 7]);\r
497 \r
498 iLength = uiTempLength - uiHeaderLength[iIndex];\r
499 if ( iLength < 0 )\r
500 {\r
501 return SLMP_ERR_NG;\r
502 }\r
503 else if ( iLength > 0 )\r
504 {\r
505 if ( p->pucData == NULL )\r
506 {\r
507 return SLMP_ERR_NG;\r
508 }\r
509 }\r
510 \r
511 (p->usNetNumber) = pucStream[2];\r
512 (p->usNodeNumber) = pucStream[3];\r
513 (p->usProcNumber) = CONCAT_2BIN(pucStream[ 5], pucStream[ 4]);\r
514 (p->usDataLength) = (uint16_t)uiTempLength;\r
515 (p->usEndCode) = CONCAT_2BIN(pucStream[10], pucStream[ 9]);\r
516 \r
517 for( i=0; i<iLength; i++ )\r
518 {\r
519 p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
520 }\r
521 \r
522 return SLMP_ERR_OK;\r
523 }\r
524 \r
525 /*[ Request : Binary Mode, Multiple Transmission Type ]*/\r
526 else if( usFrameType == SLMP_FTYPE_BIN_REQ_MT )\r
527 {\r
528 iIndex = SLMP_FTYPE_BIN_REQ_MT_INDEX;\r
529 uiTempLength = CONCAT_2BIN(pucStream[12], pucStream[11]);\r
530 \r
531 iLength = uiTempLength - uiHeaderLength[iIndex];\r
532 if ( iLength < 0 )\r
533 {\r
534 return SLMP_ERR_NG;\r
535 }\r
536 else if ( iLength > 0 )\r
537 {\r
538 if ( p->pucData == NULL )\r
539 {\r
540 return SLMP_ERR_NG;\r
541 }\r
542 }\r
543 \r
544 (p->usSerialNumber) = CONCAT_2BIN(pucStream[3], pucStream[2]);\r
545 (p->usNetNumber) = pucStream[6];\r
546 (p->usNodeNumber) = pucStream[7];\r
547 (p->usProcNumber) = CONCAT_2BIN(pucStream[ 9], pucStream[ 8]);\r
548 (p->usDataLength) = (uint16_t)uiTempLength;\r
549 (p->usTimer) = CONCAT_2BIN(pucStream[14], pucStream[13]);\r
550 (p->usCommand) = CONCAT_2BIN(pucStream[16], pucStream[15]);\r
551 (p->usSubCommand) = CONCAT_2BIN(pucStream[18], pucStream[17]);\r
552 \r
553 for( i=0; i<iLength; i++ )\r
554 {\r
555 p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
556 }\r
557 \r
558 return SLMP_ERR_OK;\r
559 }\r
560 \r
561 /*[ Response : Binary Mode, Multiple Transmission Type ]*/\r
562 else if( usFrameType == SLMP_FTYPE_BIN_RES_MT )\r
563 {\r
564 iIndex = SLMP_FTYPE_BIN_RES_MT_INDEX;\r
565 uiTempLength = CONCAT_2BIN(pucStream[12], pucStream[11]);\r
566 \r
567 iLength = uiTempLength - uiHeaderLength[iIndex];\r
568 if ( iLength < 0 )\r
569 {\r
570 return SLMP_ERR_NG;\r
571 }\r
572 else if ( iLength > 0 )\r
573 {\r
574 if ( p->pucData == NULL )\r
575 {\r
576 return SLMP_ERR_NG;\r
577 }\r
578 }\r
579 \r
580 (p->usSerialNumber) = CONCAT_2BIN(pucStream[3], pucStream[2]);\r
581 (p->usNetNumber) = pucStream[6];\r
582 (p->usNodeNumber) = pucStream[7];\r
583 (p->usProcNumber) = CONCAT_2BIN(pucStream[ 9], pucStream[ 8]);\r
584 (p->usDataLength) = (uint16_t)uiTempLength;\r
585 (p->usEndCode) = CONCAT_2BIN(pucStream[14], pucStream[13]);\r
586 \r
587 for( i=0; i<iLength; i++ )\r
588 {\r
589 p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
590 }\r
591 \r
592 return SLMP_ERR_OK;\r
593 }\r
594 \r
595 ulFrameType = CONCAT_4BIN(pucStream[0], pucStream[1], pucStream[2], pucStream[3]);\r
596 \r
597 (p->ulFrameType) = ulFrameType;\r
598 \r
599 /*[ Request : ASCII Mode, Single Transmission Type ]*/\r
600 if( ulFrameType == SLMP_FTYPE_ASCII_REQ_ST )\r
601 {\r
602 iIndex = SLMP_FTYPE_ASCII_REQ_ST_INDEX;\r
603 uiTemp0 = local_atoi(pucStream[14]);\r
604 uiTemp1 = local_atoi(pucStream[15]);\r
605 uiTemp2 = local_atoi(pucStream[16]);\r
606 uiTemp3 = local_atoi(pucStream[17]);\r
607 uiTempLength = CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
608 \r
609 iLength = uiTempLength - uiHeaderLength[iIndex];\r
610 if ( iLength < 0 )\r
611 {\r
612 return SLMP_ERR_NG;\r
613 }\r
614 else if ( iLength > 0 )\r
615 {\r
616 if ( p->pucData == NULL )\r
617 {\r
618 return SLMP_ERR_NG;\r
619 }\r
620 }\r
621 \r
622 uiTemp0 = local_atoi(pucStream[ 4]);\r
623 uiTemp1 = local_atoi(pucStream[ 5]);\r
624 (p->usNetNumber) = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
625 \r
626 uiTemp0 = local_atoi(pucStream[ 6]);\r
627 uiTemp1 = local_atoi(pucStream[ 7]);\r
628 (p->usNodeNumber) = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
629 \r
630 uiTemp0 = local_atoi(pucStream[ 8]);\r
631 uiTemp1 = local_atoi(pucStream[ 9]);\r
632 uiTemp2 = local_atoi(pucStream[10]);\r
633 uiTemp3 = local_atoi(pucStream[11]);\r
634 (p->usProcNumber) = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
635 \r
636 (p->usDataLength) = (uint16_t)uiTempLength;\r
637 \r
638 uiTemp0 = local_atoi(pucStream[18]);\r
639 uiTemp1 = local_atoi(pucStream[19]);\r
640 uiTemp2 = local_atoi(pucStream[20]);\r
641 uiTemp3 = local_atoi(pucStream[21]);\r
642 (p->usTimer) = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
643 \r
644 uiTemp0 = local_atoi(pucStream[22]);\r
645 uiTemp1 = local_atoi(pucStream[23]);\r
646 uiTemp2 = local_atoi(pucStream[24]);\r
647 uiTemp3 = local_atoi(pucStream[25]);\r
648 (p->usCommand) = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
649 \r
650 uiTemp0 = local_atoi(pucStream[26]);\r
651 uiTemp1 = local_atoi(pucStream[27]);\r
652 uiTemp2 = local_atoi(pucStream[28]);\r
653 uiTemp3 = local_atoi(pucStream[29]);\r
654 (p->usSubCommand) = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
655 \r
656 for( i=0; i<iLength; i++ )\r
657 {\r
658 p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
659 }\r
660 \r
661 return SLMP_ERR_OK;\r
662 }\r
663 \r
664 /*[ Response : ASCII Mode, Single Transmission Type ]*/\r
665 else if( ulFrameType == SLMP_FTYPE_ASCII_RES_ST )\r
666 {\r
667 iIndex = SLMP_FTYPE_ASCII_RES_ST_INDEX;\r
668 uiTemp0 = local_atoi(pucStream[14]);\r
669 uiTemp1 = local_atoi(pucStream[15]);\r
670 uiTemp2 = local_atoi(pucStream[16]);\r
671 uiTemp3 = local_atoi(pucStream[17]);\r
672 uiTempLength = CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
673 \r
674 iLength = uiTempLength - uiHeaderLength[iIndex];\r
675 if ( iLength < 0 )\r
676 {\r
677 return SLMP_ERR_NG;\r
678 }\r
679 else if ( iLength > 0 )\r
680 {\r
681 if ( p->pucData == NULL )\r
682 {\r
683 return SLMP_ERR_NG;\r
684 }\r
685 }\r
686 \r
687 uiTemp0 = local_atoi(pucStream[ 4]);\r
688 uiTemp1 = local_atoi(pucStream[ 5]);\r
689 (p->usNetNumber) = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
690 \r
691 uiTemp0 = local_atoi(pucStream[ 6]);\r
692 uiTemp1 = local_atoi(pucStream[ 7]);\r
693 (p->usNodeNumber) = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
694 \r
695 uiTemp0 = local_atoi(pucStream[ 8]);\r
696 uiTemp1 = local_atoi(pucStream[ 9]);\r
697 uiTemp2 = local_atoi(pucStream[10]);\r
698 uiTemp3 = local_atoi(pucStream[11]);\r
699 (p->usProcNumber) = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
700 \r
701 (p->usDataLength) = (uint16_t)uiTempLength;\r
702 \r
703 uiTemp0 = local_atoi(pucStream[18]);\r
704 uiTemp1 = local_atoi(pucStream[19]);\r
705 uiTemp2 = local_atoi(pucStream[20]);\r
706 uiTemp3 = local_atoi(pucStream[21]);\r
707 (p->usEndCode) = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
708 \r
709 for( i=0; i<iLength; i++ )\r
710 {\r
711 p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
712 }\r
713 \r
714 return SLMP_ERR_OK;\r
715 }\r
716 \r
717 /*[ Request : ASCII Mode, Multiple Transmission Type ]*/\r
718 else if( ulFrameType == SLMP_FTYPE_ASCII_REQ_MT )\r
719 {\r
720 iIndex = SLMP_FTYPE_ASCII_REQ_MT_INDEX;\r
721 uiTemp0 = local_atoi(pucStream[22]);\r
722 uiTemp1 = local_atoi(pucStream[23]);\r
723 uiTemp2 = local_atoi(pucStream[24]);\r
724 uiTemp3 = local_atoi(pucStream[25]);\r
725 uiTempLength = CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
726 \r
727 iLength = uiTempLength - uiHeaderLength[iIndex];\r
728 if ( iLength < 0 )\r
729 {\r
730 return SLMP_ERR_NG;\r
731 }\r
732 else if ( iLength > 0 )\r
733 {\r
734 if ( p->pucData == NULL )\r
735 {\r
736 return SLMP_ERR_NG;\r
737 }\r
738 }\r
739 \r
740 uiTemp0 = local_atoi(pucStream[ 4]);\r
741 uiTemp1 = local_atoi(pucStream[ 5]);\r
742 uiTemp2 = local_atoi(pucStream[ 6]);\r
743 uiTemp3 = local_atoi(pucStream[ 7]);\r
744 (p->usSerialNumber) = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
745 \r
746 uiTemp0 = local_atoi(pucStream[12]);\r
747 uiTemp1 = local_atoi(pucStream[13]);\r
748 (p->usNetNumber) = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
749 \r
750 uiTemp0 = local_atoi(pucStream[14]);\r
751 uiTemp1 = local_atoi(pucStream[15]);\r
752 (p->usNodeNumber) = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
753 \r
754 uiTemp0 = local_atoi(pucStream[16]);\r
755 uiTemp1 = local_atoi(pucStream[17]);\r
756 uiTemp2 = local_atoi(pucStream[18]);\r
757 uiTemp3 = local_atoi(pucStream[19]);\r
758 (p->usProcNumber) = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
759 \r
760 (p->usDataLength) = (uint16_t)uiTempLength;\r
761 \r
762 uiTemp0 = local_atoi(pucStream[26]);\r
763 uiTemp1 = local_atoi(pucStream[27]);\r
764 uiTemp2 = local_atoi(pucStream[28]);\r
765 uiTemp3 = local_atoi(pucStream[29]);\r
766 (p->usTimer) = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
767 \r
768 uiTemp0 = local_atoi(pucStream[30]);\r
769 uiTemp1 = local_atoi(pucStream[31]);\r
770 uiTemp2 = local_atoi(pucStream[32]);\r
771 uiTemp3 = local_atoi(pucStream[33]);\r
772 (p->usCommand) = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
773 \r
774 uiTemp0 = local_atoi(pucStream[34]);\r
775 uiTemp1 = local_atoi(pucStream[35]);\r
776 uiTemp2 = local_atoi(pucStream[36]);\r
777 uiTemp3 = local_atoi(pucStream[37]);\r
778 (p->usSubCommand) = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
779 \r
780 for( i=0; i<iLength; i++ )\r
781 {\r
782 p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
783 }\r
784 \r
785 return SLMP_ERR_OK;\r
786 }\r
787 \r
788 /*[ Response : ASCII Mode, Multiple Transmission Type ]*/\r
789 else if( ulFrameType == SLMP_FTYPE_ASCII_RES_MT )\r
790 {\r
791 iIndex = SLMP_FTYPE_ASCII_RES_MT_INDEX;\r
792 uiTemp0 = local_atoi(pucStream[22]);\r
793 uiTemp1 = local_atoi(pucStream[23]);\r
794 uiTemp2 = local_atoi(pucStream[24]);\r
795 uiTemp3 = local_atoi(pucStream[25]);\r
796 uiTempLength = CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
797 \r
798 iLength = uiTempLength - uiHeaderLength[iIndex];\r
799 if ( iLength < 0 )\r
800 {\r
801 return SLMP_ERR_NG;\r
802 }\r
803 else if ( iLength > 0 )\r
804 {\r
805 if ( p->pucData == NULL )\r
806 {\r
807 return SLMP_ERR_NG;\r
808 }\r
809 }\r
810 \r
811 uiTemp0 = local_atoi(pucStream[ 4]);\r
812 uiTemp1 = local_atoi(pucStream[ 5]);\r
813 uiTemp2 = local_atoi(pucStream[ 6]);\r
814 uiTemp3 = local_atoi(pucStream[ 7]);\r
815 (p->usSerialNumber) = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
816 \r
817 uiTemp0 = local_atoi(pucStream[12]);\r
818 uiTemp1 = local_atoi(pucStream[13]);\r
819 (p->usNetNumber) = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
820 \r
821 uiTemp0 = local_atoi(pucStream[14]);\r
822 uiTemp1 = local_atoi(pucStream[15]);\r
823 (p->usNodeNumber) = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
824 \r
825 uiTemp0 = local_atoi(pucStream[16]);\r
826 uiTemp1 = local_atoi(pucStream[17]);\r
827 uiTemp2 = local_atoi(pucStream[18]);\r
828 uiTemp3 = local_atoi(pucStream[19]);\r
829 (p->usProcNumber) = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
830 \r
831 (p->usDataLength) = (uint16_t)uiTempLength;\r
832 \r
833 uiTemp0 = local_atoi(pucStream[26]);\r
834 uiTemp1 = local_atoi(pucStream[27]);\r
835 uiTemp2 = local_atoi(pucStream[28]);\r
836 uiTemp3 = local_atoi(pucStream[29]);\r
837 (p->usEndCode) = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
838 \r
839 for( i=0; i<iLength; i++ )\r
840 {\r
841 p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
842 }\r
843 \r
844 return SLMP_ERR_OK;\r
845 }\r
846 return SLMP_ERR_NG;\r
847 }\r
848 \r
849 /*[ translating from integer to ascii ]*/\r
850 uint8_t local_itoa( uint8_t ucInt){\r
851 unsigned char ucTable[] = { '0','1','2','3','4','5','6','7','8','9',\r
852 'A','B','C','D','E','F'};\r
853 return ucTable[ucInt];\r
854 }\r
855 \r
856 /*[ translating from ascii to integer ]*/\r
857 uint8_t local_atoi( uint8_t ucInt){\r
858 switch(ucInt)\r
859 {\r
860 case 'A' :\r
861 return 0x0A;\r
862 case 'B' :\r
863 return 0x0B;\r
864 case 'C' :\r
865 return 0x0C;\r
866 case 'D' :\r
867 return 0x0D;\r
868 case 'E' :\r
869 return 0x0E;\r
870 case 'F' :\r
871 return 0x0F;\r
872 default :\r
873 return (ucInt-'0');\r
874 }\r
875 }\r
876 \r
877 /* A Function for making error response data from the SLMP_Info structure */\r
878 int SLMP_MakeErrorData ( const SLMP_INFO *p, uint8_t *pucStream, uint16_t *pusDataSize )\r
879 {\r
880 if ( (p == NULL) || (pucStream == NULL) )\r
881 {\r
882 return SLMP_ERR_NG;\r
883 }\r
884 \r
885 /*[ Binary Mode ]*/\r
886 if ( SLMP_DATA_CODE(p->ulFrameType) == SLMP_DATA_CODE_BIN )\r
887 {\r
888 pucStream[ 0] = SHIFT_R0(p->usNetNumber);\r
889 pucStream[ 1] = SHIFT_R0(p->usNodeNumber);\r
890 pucStream[ 2] = SHIFT_R0(p->usProcNumber);\r
891 pucStream[ 3] = SHIFT_R8(p->usProcNumber);\r
892 pucStream[ 4] = 0x00;\r
893 pucStream[ 5] = SHIFT_R0(p->usCommand);\r
894 pucStream[ 6] = SHIFT_R8(p->usCommand);\r
895 pucStream[ 7] = SHIFT_R0(p->usSubCommand);\r
896 pucStream[ 8] = SHIFT_R8(p->usSubCommand);\r
897 (*pusDataSize) = 0x0009;\r
898 }\r
899 \r
900 /*[ ASCII Mode ]*/\r
901 else if ( SLMP_DATA_CODE(p->ulFrameType) == SLMP_DATA_CODE_ASCII )\r
902 {\r
903 pucStream[ 0] = local_itoa(SHIFT_R4(p->usNetNumber) & MASK_LOWER4BIT);\r
904 pucStream[ 1] = local_itoa(SHIFT_R0(p->usNetNumber) & MASK_LOWER4BIT);\r
905 pucStream[ 2] = local_itoa(SHIFT_R4(p->usNodeNumber) & MASK_LOWER4BIT);\r
906 pucStream[ 3] = local_itoa(SHIFT_R0(p->usNodeNumber) & MASK_LOWER4BIT);\r
907 pucStream[ 4] = local_itoa(SHIFT_R12(p->usProcNumber) & MASK_LOWER4BIT);\r
908 pucStream[ 5] = local_itoa(SHIFT_R8 (p->usProcNumber) & MASK_LOWER4BIT);\r
909 pucStream[ 6] = local_itoa(SHIFT_R4 (p->usProcNumber) & MASK_LOWER4BIT);\r
910 pucStream[ 7] = local_itoa(SHIFT_R0 (p->usProcNumber) & MASK_LOWER4BIT);\r
911 pucStream[ 8] = local_itoa(0x00);\r
912 pucStream[ 9] = local_itoa(0x00);\r
913 pucStream[10] = local_itoa(SHIFT_R12(p->usCommand) & MASK_LOWER4BIT);\r
914 pucStream[11] = local_itoa(SHIFT_R8 (p->usCommand) & MASK_LOWER4BIT);\r
915 pucStream[12] = local_itoa(SHIFT_R4 (p->usCommand) & MASK_LOWER4BIT);\r
916 pucStream[13] = local_itoa(SHIFT_R0 (p->usCommand) & MASK_LOWER4BIT);\r
917 pucStream[14] = local_itoa(SHIFT_R12(p->usSubCommand) & MASK_LOWER4BIT);\r
918 pucStream[15] = local_itoa(SHIFT_R8 (p->usSubCommand) & MASK_LOWER4BIT);\r
919 pucStream[16] = local_itoa(SHIFT_R4 (p->usSubCommand) & MASK_LOWER4BIT);\r
920 pucStream[17] = local_itoa(SHIFT_R0 (p->usSubCommand) & MASK_LOWER4BIT);\r
921 (*pusDataSize) = 0x0012;\r
922 }\r
923 \r
924 /*[ Data Code Error ]*/\r
925 else\r
926 {\r
927 return SLMP_ERR_NG;\r
928 }\r
929 \r
930 return SLMP_ERR_OK;\r
931 }\r