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