rspackage_dle.c
5.14 KB
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <rspackage_dle.h>
char *rs_error_string( void)
/**
@brief ini_error_code에 대한 에러 설명 문자열을 반환
@return 에러 코드에 대한 에러 설명 문자열 포인터
@warning 절대 반환 받은 문자열을 소멸 시켜서는 안 된다!!
*/
{
char *error_string[] ={ "에러 없음", // RSERR_NONE
"메모리 부족", // RSERR_OUT_OF_MEMORY
"CRC 에러", // RSERR_CRC
"자료 구조 이상" // RSERR_DATA
};
return( error_string[rspackage_error_code]);
}
char *rs_put_dle( rs_dle_t *dle, char *data, int size)
{
char datum;
int col;
int ndx;
int branch;
branch = __WAIT_DLE;
col = 0;
for ( ndx = 0; ndx < size; ndx++)
{
datum = *data++;
switch( branch)
{
case __WAIT_DLE :
if ( dle->ch_dle == datum)
{
branch = __WAIT_STX;
}
break;
case __WAIT_STX :
if ( dle->ch_stx == datum)
{
branch = __RCV_DATA;
}
else
{
dle->sz_data = -1; // CRC 에러 또는 데이터 이상
rspackage_error_code = RSERR_DATA;
return data; // 지금까지 처리한 이후의 포인터를 반환
}
break;
case __RCV_DATA :
if ( dle->ch_dle == datum)
{
branch = __CHK_DLE;
}
else
{
dle->buffer[col++] = datum;
}
break;
case __CHK_DLE :
if ( dle->ch_dle == datum)
{
dle->buffer[col++] = dle->ch_dle;
branch = __RCV_DATA;
}
else if ( dle->ch_etx == datum)
{
dle->sz_data = col;
if ( dle->check_crc( dle))
{
return data;
}
else
{
dle->sz_data = -1; // CRC 에러 또는 데이터 이상
rspackage_error_code = RSERR_CRC;
}
return data;
}
else // DLE 다음에 와서는 안되는 코드가 왔으므로 실표로 반한
{
dle->sz_data = -1; // CRC 에러 또는 데이터 이상
rspackage_error_code = RSERR_DATA;
return data; // 지금까지 처리한 이후의 포인터를 반환
}
break;
} // switch()
} // for {}
dle->sz_data = 0; // 수신된 데이터가 없음
rspackage_error_code = RSERR_NONE;
return data; // 지금까지 처리한 이후의 포인터를 반환
}
rs_dle_t *rs_create_dle( int (*check_crc)( rs_dle_t *))
{
rs_dle_t *dle;
dle = ( rs_dle_t *)malloc( sizeof( rs_dle_t));
if ( NULL == dle)
{
rspackage_error_code = RSERR_OUT_OF_MEMORY;
return NULL;
}
dle->ch_stx = 0x02;
dle->ch_etx = 0x03;
dle->ch_dle = 0x10;
dle->check_crc = check_crc;
rspackage_error_code = RSERR_NONE;
return dle;
}
int rs_make_packet( rs_dle_t *dle, char *dst_buf, char *src_buf, int src_cnt )
{
int loop;
char *dst, *src;
dst = dst_buf;
src = src_buf;
*dst++ = dle->ch_dle;
*dst++ = dle->ch_stx;
for( loop=0; loop<src_cnt; loop++ )
{
if ( *src == dle->ch_dle )
{
*dst++ = dle->ch_dle;
}
*dst++ = *src++;
}
*dst++ = dle->ch_dle;
*dst++ = dle->ch_etx;
return dst - dst_buf;
}