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
 |