xref: /nrf52832-nimble/rt-thread/components/utilities/zmodem/zstart.c (revision 104654410c56c573564690304ae786df310c91fc)
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