1 /*
2 * File : zstart.c
3 * the implemention of zmodem protocol.
4 * Change Logs:
5 * Date Author Notes
6 * 2011-03-29 itspy
7 */
8
9 #include <rtthread.h>
10 #include <finsh.h>
11 #include <shell.h>
12 #include <dfs.h>
13 #include <dfs_file.h>
14 #include "zdef.h"
15
16
17
18 struct zmodemf zmodem;
19
zmodem_rx_ind(rt_device_t dev,rt_size_t size)20 rt_err_t zmodem_rx_ind(rt_device_t dev, rt_size_t size)
21 {
22 /* release semaphore */
23 rt_sem_release(&zmodem.zsem);
24
25 return RT_EOK;
26 }
27
finsh_rz(void * parameter)28 void finsh_rz(void *parameter)
29 {
30 char *path;
31 rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);
32 rt_uint8_t flag;
33
34 flag = RT_DEVICE_FLAG_STREAM;
35 zmodem.device->flag &=(~flag);
36 rt_sem_init(&(zmodem.zsem), "zsem", 0, 0);
37 path = rt_thread_self()->parameter;
38 /* save old rx_indicate */
39 rx_indicate = zmodem.device->rx_indicate;
40 /* set new rx_indicate */
41 rt_device_set_rx_indicate(zmodem.device, RT_NULL);
42 /* start receive remote files */
43 zr_start(path);
44 zmodem.device->flag |=flag;
45 /* recovery old rx_indicate */
46 rt_device_set_rx_indicate(zmodem.device, rx_indicate);
47 /* finsh>> */
48 rt_kprintf(FINSH_PROMPT);
49 }
finsh_sz(void * parameter)50 void finsh_sz(void *parameter)
51 {
52 char *path;
53 rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);
54 rt_uint8_t flag;
55
56 flag = RT_DEVICE_FLAG_STREAM;
57 zmodem.device->flag &=(~flag);
58 rt_sem_init(&(zmodem.zsem), "zsem", 0, 0);
59 path = rt_thread_self()->parameter;
60 /* save old rx_indicate */
61 rx_indicate = zmodem.device->rx_indicate;
62 /* set new rx_indicate */
63 rt_device_set_rx_indicate(zmodem.device, zmodem_rx_ind);
64 zs_start(path);
65 zmodem.device->flag |=flag;
66 /* recovery old rx_indicate */
67 rt_device_set_rx_indicate(zmodem.device, rx_indicate);
68 /* finsh>> */
69 rt_kprintf(FINSH_PROMPT);
70 }
71
72 #ifdef RT_USING_FINSH
73 #include <finsh.h>
74 #include <shell.h>
75
rz(char * para)76 static void rz(char *para)
77 {
78 rt_thread_t init_thread;
79 rt_device_t device;
80 const char* device_name = finsh_get_device();
81
82 device = rt_device_find(device_name);
83 if( device == RT_NULL )
84 {
85 rt_kprintf("%s not find\r\n",device_name);
86 }
87 zmodem.device = device;
88 init_thread = rt_thread_create("rz",
89 finsh_rz,
90 (void*)para,
91 2048,
92 rt_thread_self()->current_priority+1,
93 20);
94
95 if (init_thread != RT_NULL) rt_thread_startup(init_thread);
96 }
FINSH_FUNCTION_EXPORT(rz,receive files by zmodem protocol)97 FINSH_FUNCTION_EXPORT(rz, receive files by zmodem protocol)
98 static void sz(char *para)
99 {
100 rt_thread_t init_thread;
101 rt_device_t device;
102 const char* device_name = finsh_get_device();
103
104 device = rt_device_find(device_name);
105 if( device == RT_NULL )
106 {
107 rt_kprintf("%s not find\r\n",device_name);
108 }
109 zmodem.device = device;
110 init_thread = rt_thread_create("sz",
111 finsh_sz,
112 (void*)para,
113 2048,
114 rt_thread_self()->current_priority+1,
115 20);
116
117 if (init_thread != RT_NULL) rt_thread_startup(init_thread);
118 }
119 FINSH_FUNCTION_EXPORT(sz, send files by zmodem protocol)
120 #endif
121