OSDN Git Service

projects clean up 1
[pinoc/pinoc.git] / test / xmodem_test / xmodem_test / xmodem_test.c
1 /*
2  * XMODEM.c
3  *
4  *  Created on: 2011/02/27
5  *      Author: mizu
6  */
7
8 #include "3069f_sci.h"
9 #include "XMODEM.h"
10
11 void main(void);
12 #ifdef __cplusplus
13 extern "C" {
14 void abort(void);
15 }
16 #endif
17
18 #define ACK 0x06
19 #define NAK 0x15
20 #define EOT 0x04
21
22 void (*write)(char c);
23 char (*read)(void);
24 char (*read_pol)(void);
25
26 #define XMODEM_DBG 0
27
28 // \92Ê\90M\82ª\8aJ\8en\82³\82ê\82é\82Æ\8aÖ\90\94\82ð\94²\82¯\82Ü\82·
29 static int xmodem_start_ack()
30 {
31         unsigned long cnt = 0;
32
33         // \89½\82©\92l\82ª\93ü\82é\82Ü\82Å\88ê\92è\8aÔ\8au\82²\82Æ\82ÉNAK\82ð\91\97\90M
34         while (!(read_pol()))
35         {
36                 if (cnt++ > 200000)
37                 {
38                         write(XMODEM_NAK);
39                         cnt = 0;
40
41                 }
42         }
43         return 0;
44 }
45
46
47 // XMODEM 1\83u\83\8d\83b\83N\8eó\90M
48 static int xmodem_read_block(unsigned char block_num_now, char* buff)
49 {
50         unsigned char c, block_num_rec, check_sum = 0;
51 //      char c;
52         int i;
53
54         // \83u\83\8d\83b\83N\94Ô\8d\86\8am\94F
55         block_num_rec = read();
56         if(block_num_now != block_num_rec)
57                 return 1;
58
59         // \83r\83b\83g\94½\93]\82Ì\83u\83\8d\83b\83N\94Ô\8d\86\8am\94F
60         c = block_num_rec;
61         block_num_rec = read();
62         block_num_rec ^= c;
63         if(block_num_rec != 0xFF)
64                 return 1;
65
66         // 128byte\82Ì\83f\81[\83^\8eó\90M
67         for(i = 0; i < XMODEM_BLOCK_SIZE; i++)
68         {
69                 c = read();
70                 *(buff++) = c;
71                 check_sum += c;
72         }
73
74         // \83`\83F\83b\83N\83T\83\80\8am\94F
75         c = read();
76         check_sum ^= c;
77         if(check_sum)
78                 return 1;
79
80         // \90³\8fí\8fI\97¹
81         return 0;
82
83 }
84
85 // \93]\91\97\82ª\8a®\97¹\82·\82é\82Æ\93]\91\97\82µ\82½\83u\83\8d\83b\83N\90\94\81\8e¸\94s\81E\92\86\92f\82·\82é\82Æ0\82ð\95Ô\82·
86 int xmodem_start(char* buf)
87 {
88         unsigned char block_num_now = 1;
89         char c;
90         int starting = 0;
91
92         while(1)
93         {
94                 if(!starting)
95                 {
96                         xmodem_start_ack();
97                 }
98
99                 c = read(); // \83w\83b\83_\8eó\90M
100
101                 switch(c)
102                 {
103                 case XMODEM_SOH:        // \92Ê\90M\8aJ\8en\81I
104                         starting = 1;
105                         if(xmodem_read_block(block_num_now, buf))
106                         {
107                                 write(XMODEM_NAK);      // \8e¸\94s\82ð\92Ê\92m
108                         }
109                         else
110                         {
111                                 block_num_now++;
112                                 buf += XMODEM_BLOCK_SIZE;               // \83o\83b\83t\83@\82Ì\83|\83C\83\93\83^\82ð1\83u\83\8d\83b\83N\90i\82ß\82é
113                                 write(XMODEM_ACK);      // \90¬\8c÷\82ð\92Ê\92\81¨ \8e\9f\82Ì\83u\83\8d\83b\83N\91\97\90M\8aJ\8en
114                         }
115                         break;
116
117                 case XMODEM_EOT:        // \93]\91\97\8a®\97¹
118                         write(XMODEM_ACK);
119                         return block_num_now;
120
121                 case XMODEM_CAN:        // \92\86\92f
122                         return 0;
123
124                 case XMODEM_EOF:
125                         return 0;
126
127 //              default:
128
129                 }
130
131         }
132 }
133
134
135 void xmodem_init(void (*io_write)(char c), char (*io_read)(void), char (*io_read_pol)(void))
136 {
137         write = io_write;
138         read = io_read;
139         read_pol = io_read_pol;
140 }
141
142 /**
143  * \81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡
144  * \81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡\81¡
145  */
146
147
148 void test_write(char c)
149 {
150         sci_write(SCI_NO_1, c);
151 }
152
153 char test_read()
154 {
155         char c;
156         c = sci_read_byte(SCI_NO_1);
157         return c;
158 }
159
160 char test_read_pol()
161 {
162         char c = 0x00;
163         c = sci_read_pol(SCI_NO_1);
164         return c;
165 }
166
167 void main(void)
168 {
169         static char buff[512] = {0,};
170         int i;
171
172         sci_init(SCI_NO_1, BitRate_type_br9600);
173         xmodem_init(test_write, test_read, test_read_pol);
174         xmodem_start(buff);
175
176         for(i = 0; i < 200; i++)
177         {
178                 sci_write(SCI_NO_1, buff[i]);
179         }
180
181         while(1);
182 }
183
184 #ifdef __cplusplus
185 void abort(void)
186 {
187
188 }
189 #endif