121 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * File      : zstart.c
 | |
|  * the implemention of zmodem protocol.
 | |
|  * Change Logs:
 | |
|  * Date           Author       Notes
 | |
|  * 2011-03-29     itspy       
 | |
|  */
 | |
| 
 | |
| #include <rtthread.h>
 | |
| #include <finsh.h>
 | |
| #include <shell.h>
 | |
| #include <dfs.h>
 | |
| #include <dfs_file.h>
 | |
| #include "zdef.h"
 | |
| 
 | |
| 
 | |
| 
 | |
| struct zmodemf zmodem;
 | |
| 
 | |
| rt_err_t zmodem_rx_ind(rt_device_t dev, rt_size_t size)
 | |
| {
 | |
|     /* release semaphore */
 | |
|     rt_sem_release(&zmodem.zsem);
 | |
| 
 | |
|     return RT_EOK;
 | |
| }
 | |
| 
 | |
| void finsh_rz(void *parameter)
 | |
| {
 | |
| 	char *path;
 | |
|     rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);
 | |
|     rt_uint8_t flag;	
 | |
| 
 | |
| 	flag = RT_DEVICE_FLAG_STREAM;
 | |
|     zmodem.device->flag &=(~flag);
 | |
|     rt_sem_init(&(zmodem.zsem), "zsem", 0, 0);
 | |
| 	path = rt_thread_self()->parameter;
 | |
|     /* save old rx_indicate	*/
 | |
|     rx_indicate = zmodem.device->rx_indicate;
 | |
|     /* set new rx_indicate */
 | |
|     rt_device_set_rx_indicate(zmodem.device, RT_NULL);
 | |
| 	/* start receive remote files */
 | |
|     zr_start(path);
 | |
| 	zmodem.device->flag |=flag;
 | |
|     /* recovery old rx_indicate	*/
 | |
|     rt_device_set_rx_indicate(zmodem.device, rx_indicate);
 | |
|     /* finsh>> */
 | |
|     rt_kprintf(FINSH_PROMPT);
 | |
| }
 | |
| void finsh_sz(void *parameter)
 | |
| {
 | |
| 	char *path;
 | |
|     rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);
 | |
|     rt_uint8_t flag;	
 | |
| 
 | |
| 	flag = RT_DEVICE_FLAG_STREAM;
 | |
|     zmodem.device->flag &=(~flag);
 | |
|     rt_sem_init(&(zmodem.zsem), "zsem", 0, 0);
 | |
| 	path = rt_thread_self()->parameter;
 | |
| 	/* save old rx_indicate	*/
 | |
|     rx_indicate = zmodem.device->rx_indicate;
 | |
| 	/* set new rx_indicate */
 | |
|     rt_device_set_rx_indicate(zmodem.device, zmodem_rx_ind);
 | |
| 	zs_start(path);
 | |
| 	zmodem.device->flag |=flag;
 | |
|     /* recovery old rx_indicate	*/
 | |
|     rt_device_set_rx_indicate(zmodem.device, rx_indicate);
 | |
|     /* finsh>> */
 | |
|     rt_kprintf(FINSH_PROMPT);
 | |
| }
 | |
| 
 | |
| #ifdef RT_USING_FINSH
 | |
| #include <finsh.h>
 | |
| #include <shell.h>
 | |
| 
 | |
| static void rz(char *para)
 | |
| {
 | |
|     rt_thread_t init_thread;
 | |
|     rt_device_t device;
 | |
|     const char* device_name = finsh_get_device();
 | |
| 
 | |
|     device = rt_device_find(device_name);
 | |
|     if( device == RT_NULL )
 | |
|     {
 | |
|         rt_kprintf("%s not find\r\n",device_name);
 | |
|     }
 | |
|     zmodem.device = device;
 | |
|     init_thread = rt_thread_create("rz",
 | |
|                                    finsh_rz,
 | |
|                                    (void*)para,
 | |
|                                    2048,
 | |
|                                    rt_thread_self()->current_priority+1,
 | |
|                                    20);
 | |
| 
 | |
|     if (init_thread != RT_NULL) rt_thread_startup(init_thread);
 | |
| }
 | |
| FINSH_FUNCTION_EXPORT(rz, receive files by zmodem protocol)
 | |
| static void sz(char *para)
 | |
| {
 | |
|     rt_thread_t init_thread;
 | |
|     rt_device_t device;
 | |
|     const char* device_name = finsh_get_device();
 | |
| 
 | |
|     device = rt_device_find(device_name);
 | |
|     if( device == RT_NULL )
 | |
|     {
 | |
|         rt_kprintf("%s not find\r\n",device_name);
 | |
|     }
 | |
|     zmodem.device = device;
 | |
|     init_thread = rt_thread_create("sz",
 | |
|                                    finsh_sz,
 | |
|                                    (void*)para,
 | |
|                                    2048,
 | |
|                                    rt_thread_self()->current_priority+1,
 | |
|                                    20);
 | |
| 
 | |
|     if (init_thread != RT_NULL) rt_thread_startup(init_thread);
 | |
| }
 | |
| FINSH_FUNCTION_EXPORT(sz, send files by zmodem protocol)
 | |
| #endif
 |