153 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| #include "lwip/opt.h"
 | |
| #include "lwip/sys.h"
 | |
| #include "lwip/api.h"
 | |
| #include "debug.h"
 | |
| #include "lwip/tcp.h"
 | |
| #include "board.h"
 | |
| #include "dev_flash.h"
 | |
| #include "tcp.h"
 | |
| 
 | |
| 
 | |
| typedef struct{
 | |
|   int inited;
 | |
|   int run;
 | |
|   struct netconn *conn;
 | |
|   struct netbuf *buf;
 | |
|   int if_connect;
 | |
|   void (*irq_fun)(void *t,uint8_t d);
 | |
|   void (*irq_fun_end)(void *t,uint32_t len);
 | |
|   void *ptr;
 | |
|   uint8_t *rx_buff;
 | |
|   uint32_t rx_buff_size;
 | |
| }self_def;
 | |
| 
 | |
| 
 | |
| void *tappend(void *p,void *del);
 | |
| 
 | |
| 
 | |
| static void tcp_thread(void *arg)
 | |
| {
 | |
|   self_def *s=arg;
 | |
|   err_t err;
 | |
|   LWIP_UNUSED_ARG(arg);
 | |
|   ip_addr_t dst;
 | |
|   const sys_param_def *par=sys_param();
 | |
|   IP4_ADDR(&dst,par->host_ip[0],par->host_ip[1],par->host_ip[2],par->host_ip[3]);
 | |
|   DBG_LOG("tcp_thread init.");
 | |
|   while (s->run) {
 | |
| 
 | |
|     s->conn = netconn_new(NETCONN_TCP);
 | |
|     s->conn->pcb.tcp->so_options |= SOF_KEEPALIVE;
 | |
|     netconn_bind(s->conn, IP_ADDR_ANY, 1234);
 | |
|     err=netconn_connect(s->conn,&dst,par->host_port);
 | |
|     if (err == ERR_OK) {
 | |
|       void *data;
 | |
|       u16_t len;
 | |
|       s->if_connect=1;
 | |
|       emit tcp_connect_signal(s);
 | |
|       while ((err = netconn_recv(s->conn, &s->buf)) == ERR_OK) {
 | |
|         do {
 | |
|              netbuf_data(s->buf, &data, &len);
 | |
|              if(s->irq_fun){
 | |
|                for(int i=0;i<len;i++)
 | |
|                  s->irq_fun(s->ptr,((uint8_t *)data)[i]);
 | |
|              }
 | |
|              if(s->irq_fun_end){
 | |
|                if(len>s->rx_buff_size) len=s->rx_buff_size;
 | |
|                memcpy(s->rx_buff,data,len);
 | |
|                s->irq_fun_end(s->ptr,len);
 | |
|              }
 | |
|              array_def *arr=arr_creat();
 | |
|              arr_appends(arr,data,len);
 | |
|              emit tcp_recv_signal(s,arr_temp(arr));
 | |
|         } while (netbuf_next(s->buf) >= 0);
 | |
|         netbuf_delete(s->buf);
 | |
|       }
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       //DBG_LOG("tcp:err=%d",err);
 | |
|     }
 | |
|     s->if_connect=0;
 | |
|     s->buf=0;
 | |
|     netconn_close(s->conn);
 | |
|     netconn_delete(s->conn);
 | |
|     sys_msleep(1000);
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| static self_def *mytcp_init(void)
 | |
| {
 | |
|   self_def *s=calloc(1,sizeof(self_def));
 | |
|   s->run=1;
 | |
|   sys_thread_new("tcp_thread", tcp_thread, s, 2048, 22);
 | |
|   s->inited=1;
 | |
|   return s;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| static int init(uart_def *u,int bsp){
 | |
|   self_def *s=mytcp_init();
 | |
|   u->private_data=s;
 | |
|   app_variable("tcp",s,0);
 | |
|   return  0;
 | |
| }
 | |
| static int deinit(uart_def *u){
 | |
|   return 0;
 | |
| }
 | |
| static int set_irq(uart_def *u,void (*irq)(void *t,uint8_t d),void *t){
 | |
|   param_check(u);
 | |
|   param_check(u->private_data);
 | |
|   self_def *self=u->private_data;
 | |
|   irq_disable();
 | |
|   self->irq_fun=irq;
 | |
|   self->ptr=t;
 | |
|   irq_enable();
 | |
|   return 0;
 | |
| }
 | |
| static int set_end_irq(uart_def *u,uint8_t *rx_buff,int rx_buff_size,
 | |
|   void (*irq)(void *t,uint32_t len),void *t)
 | |
| {
 | |
|   param_check(u);
 | |
|   param_check(u->private_data);
 | |
|   self_def *self=u->private_data;
 | |
|   irq_disable();
 | |
|   self->irq_fun_end=irq;
 | |
|   self->ptr=t;
 | |
|   self->rx_buff=rx_buff;
 | |
|   self->rx_buff_size=rx_buff_size;
 | |
|   irq_enable();
 | |
|   return 0;
 | |
| }
 | |
| static int read(uart_def *u,uint8_t *d,int len){
 | |
|   return 0;
 | |
| }
 | |
| static int write(uart_def *u,const uint8_t *b,int len){
 | |
|   param_check(u);
 | |
|   param_check(u->private_data);
 | |
|   self_def *s=u->private_data;
 | |
|   err_t err;
 | |
|   DBG_LOG("tcp:write");
 | |
|   if(s->if_connect){
 | |
|     err = netconn_write(s->conn, b, len, NETCONN_COPY);
 | |
|   }
 | |
|   else err=ERR_CONN;
 | |
|   if(err==ERR_OK)
 | |
|     return len;
 | |
|   else
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| uart_init_export(utcp,init,deinit,set_irq,set_end_irq,read,write,0)
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | 
