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
							 |