diff --git a/Tangible/ethernet.h b/Tangible/ethernet.h old mode 100755 new mode 100644 index f84a152..f84a152 --- a/Tangible/ethernet.h +++ b/Tangible/ethernet.h diff --git a/Tangible/socket.c b/Tangible/socket.c old mode 100755 new mode 100644 index d2b77a2..03aedef --- a/Tangible/socket.c +++ b/Tangible/socket.c @@ -1,561 +1,607 @@ -/* -* -@file socket.c -@brief setting chip register for socket - last update : 2008. Jan -* -*/ - -#include "ethernet.h" -#include "w5100.h" -#include "socket.h" - -#ifdef __DEF_IINCHIP_DBG__ -#include -#endif - -static uint16 local_port; - -/** -@brief This Socket function initialize the channel in perticular mode, and set the port and wait for W5100 done it. -@return 1 for success else 0. -*/ -uint8 socket( - SOCKET s, /**< for socket number */ - uint8 protocol, /**< for socket protocol */ - uint16 port, /**< the source port for the socket */ - uint8 flag /**< the option for the socket */ - ) -{ - uint8 ret; -#ifdef __DEF_IINCHIP_DBG__ - printf("socket()\r\n"); -#endif - if ((protocol == Sn_MR_TCP) || (protocol == Sn_MR_UDP) || (protocol == Sn_MR_IPRAW) || (protocol == Sn_MR_MACRAW) || (protocol == Sn_MR_PPPOE)) - { - close(s); - IINCHIP_WRITE(Sn_MR(s),protocol | flag); - if (port != 0) { - IINCHIP_WRITE(Sn_PORT0(s),(uint8)((port & 0xff00) >> 8)); - IINCHIP_WRITE((Sn_PORT0(s) + 1),(uint8)(port & 0x00ff)); - } else { - local_port++; // if don't set the source port, set local_port number. - IINCHIP_WRITE(Sn_PORT0(s),(uint8)((local_port & 0xff00) >> 8)); - IINCHIP_WRITE((Sn_PORT0(s) + 1),(uint8)(local_port & 0x00ff)); - } - IINCHIP_WRITE(Sn_CR(s),Sn_CR_OPEN); // run sockinit Sn_CR - - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(s)) ) - ; - /* ------- */ - ret = 1; - } - else - { - ret = 0; - } -#ifdef __DEF_IINCHIP_DBG__ - printf("Sn_SR = %.2x , Protocol = %.2x\r\n", IINCHIP_READ(Sn_SR(s)), IINCHIP_READ(Sn_MR(s))); -#endif - return ret; -} - - -/** -@brief This function close the socket and parameter is "s" which represent the socket number -*/ -void close(SOCKET s) -{ -#ifdef __DEF_IINCHIP_DBG__ - printf("close()\r\n"); -#endif - - IINCHIP_WRITE(Sn_CR(s),Sn_CR_CLOSE); - - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(s)) ) - ; - /* ------- */ - - /* +2008.01 [hwkim]: clear interrupt */ - #ifdef __DEF_IINCHIP_INT__ - /* m2008.01 [bj] : all clear */ - putISR(s, 0x00); - #else - /* m2008.01 [bj] : all clear */ - IINCHIP_WRITE(Sn_IR(s), 0xFF); - #endif -} - - -/** -@brief This function established the connection for the channel in passive (server) mode. This function waits for the request from the peer. -@return 1 for success else 0. -*/ -uint8 listen( - SOCKET s /**< the socket number */ - ) -{ - uint8 ret; -#ifdef __DEF_IINCHIP_DBG__ - printf("listen()\r\n"); -#endif - if (IINCHIP_READ(Sn_SR(s)) == SOCK_INIT) - { - IINCHIP_WRITE(Sn_CR(s),Sn_CR_LISTEN); - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(s)) ) - ; - /* ------- */ - ret = 1; - } - else - { - ret = 0; -#ifdef __DEF_IINCHIP_DBG__ - printf("Fail[invalid ip,port]\r\n"); -#endif - } - return ret; -} - - -/** -@brief This function established the connection for the channel in Active (client) mode. - This function waits for the until the connection is established. - -@return 1 for success else 0. -*/ -uint8 connect(SOCKET s, uint8 * addr, uint16 port) -{ - uint8 ret; -#ifdef __DEF_IINCHIP_DBG__ - printf("connect()\r\n"); -#endif - if - ( - ((addr[0] == 0xFF) && (addr[1] == 0xFF) && (addr[2] == 0xFF) && (addr[3] == 0xFF)) || - ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) || - (port == 0x00) - ) - { - ret = 0; -#ifdef __DEF_IINCHIP_DBG__ - printf("Fail[invalid ip,port]\r\n"); -#endif - } - else - { - ret = 1; - // set destination IP - IINCHIP_WRITE(Sn_DIPR0(s),addr[0]); - IINCHIP_WRITE((Sn_DIPR0(s) + 1),addr[1]); - IINCHIP_WRITE((Sn_DIPR0(s) + 2),addr[2]); - IINCHIP_WRITE((Sn_DIPR0(s) + 3),addr[3]); - IINCHIP_WRITE(Sn_DPORT0(s),(uint8)((port & 0xff00) >> 8)); - IINCHIP_WRITE((Sn_DPORT0(s) + 1),(uint8)(port & 0x00ff)); - IINCHIP_WRITE(Sn_CR(s),Sn_CR_CONNECT); - /* m2008.01 [bj] : wait for completion */ - while ( IINCHIP_READ(Sn_CR(s)) ) ; - - } - - return ret; -} - - - -/** -@brief This function used for disconnect the socket and parameter is "s" which represent the socket number -@return 1 for success else 0. -*/ -void disconnect(SOCKET s) -{ -#ifdef __DEF_IINCHIP_DBG__ - printf("disconnect()\r\n"); -#endif - IINCHIP_WRITE(Sn_CR(s),Sn_CR_DISCON); - - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(s)) ) - ; - /* ------- */ -} - - -/** -@brief This function used to send the data in TCP mode -@return 1 for success else 0. -*/ -uint16 send( - SOCKET s, /**< the socket index */ - const uint8 * buf, /**< a pointer to data */ - uint16 len /**< the data size to be send */ - ) -{ - uint8 status=0; - uint16 ret=0; - uint16 freesize=0; -#ifdef __DEF_IINCHIP_DBG__ - printf("send()\r\n"); -#endif - - if (len > getIINCHIP_TxMAX(s)) ret = getIINCHIP_TxMAX(s); // check size not to exceed MAX size. - else ret = len; - - // if freebuf is available, start. - do - { - freesize = getSn_TX_FSR(s); - status = IINCHIP_READ(Sn_SR(s)); - if ((status != SOCK_ESTABLISHED) && (status != SOCK_CLOSE_WAIT)) - { - ret = 0; - break; - } -#ifdef __DEF_IINCHIP_DBG__ - printf("socket %d freesize(%d) empty or error\r\n", s, freesize); -#endif - } while (freesize < ret); - - // copy data - send_data_processing(s, (uint8 *)buf, ret); - IINCHIP_WRITE(Sn_CR(s),Sn_CR_SEND); - - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(s)) ) - ; - /* ------- */ - -/* +2008.01 bj */ -#ifdef __DEF_IINCHIP_INT__ - while ( (getISR(s) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) -#else - while ( (IINCHIP_READ(Sn_IR(s)) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) -#endif - { - /* m2008.01 [bj] : reduce code */ - if ( IINCHIP_READ(Sn_SR(s)) == SOCK_CLOSED ) - { -#ifdef __DEF_IINCHIP_DBG__ - printf("SOCK_CLOSED.\r\n"); -#endif - close(s); - return 0; - } - } -/* +2008.01 bj */ -#ifdef __DEF_IINCHIP_INT__ - putISR(s, getISR(s) & (~Sn_IR_SEND_OK)); -#else - IINCHIP_WRITE(Sn_IR(s), Sn_IR_SEND_OK); -#endif - return ret; -} - - -/** -@brief This function is an application I/F function which is used to receive the data in TCP mode. - It continues to wait for data as much as the application wants to receive. - -@return received data size for success else -1. -*/ -uint16 recv( - SOCKET s, /**< socket index */ - uint8 * buf, /**< a pointer to copy the data to be received */ - uint16 len /**< the data size to be read */ - ) -{ - uint16 ret=0; -#ifdef __DEF_IINCHIP_DBG__ - printf("recv()\r\n"); -#endif - - - if ( len > 0 ) - { - recv_data_processing(s, buf, len); - IINCHIP_WRITE(Sn_CR(s),Sn_CR_RECV); - - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(s)) ) - ; - /* ------- */ - ret = len; - } - return ret; -} - - -/** -@brief This function is an application I/F function which is used to send the data for other then TCP mode. - Unlike TCP transmission, The peer's destination address and the port is needed. - -@return This function return send data size for success else -1. -*/ -uint16 sendto( - SOCKET s, /**< socket index */ - const uint8 * buf, /**< a pointer to the data */ - uint16 len, /**< the data size to send */ - uint8 * addr, /**< the peer's Destination IP address */ - uint16 port /**< the peer's destination port number */ - ) -{ -// uint8 status=0; -// uint8 isr=0; - uint16 ret=0; - -#ifdef __DEF_IINCHIP_DBG__ - printf("sendto()\r\n"); -#endif - if (len > getIINCHIP_TxMAX(s)) ret = getIINCHIP_TxMAX(s); // check size not to exceed MAX size. - else ret = len; - - if - ( - ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) || - ((port == 0x00)) ||(ret == 0) - ) - { - /* +2008.01 [bj] : added return value */ - ret = 0; -#ifdef __DEF_IINCHIP_DBG__ - printf("%d Fail[%.2x.%.2x.%.2x.%.2x, %.d, %d]\r\n",s, addr[0], addr[1], addr[2], addr[3] , port, len); - printf("Fail[invalid ip,port]\r\n"); -#endif - } - else - { - IINCHIP_WRITE(Sn_DIPR0(s),addr[0]); - IINCHIP_WRITE((Sn_DIPR0(s) + 1),addr[1]); - IINCHIP_WRITE((Sn_DIPR0(s) + 2),addr[2]); - IINCHIP_WRITE((Sn_DIPR0(s) + 3),addr[3]); - IINCHIP_WRITE(Sn_DPORT0(s),(uint8)((port & 0xff00) >> 8)); - IINCHIP_WRITE((Sn_DPORT0(s) + 1),(uint8)(port & 0x00ff)); - - // copy data - send_data_processing(s, (uint8 *)buf, ret); - IINCHIP_WRITE(Sn_CR(s),Sn_CR_SEND); - - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(s)) ) - ; - /* ------- */ - -/* +2008.01 bj */ -#ifdef __DEF_IINCHIP_INT__ - while ( (getISR(s) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) -#else - while ( (IINCHIP_READ(Sn_IR(s)) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) -#endif - { -#ifdef __DEF_IINCHIP_INT__ - if (getISR(s) & Sn_IR_TIMEOUT) -#else - if (IINCHIP_READ(Sn_IR(s)) & Sn_IR_TIMEOUT) -#endif - { -#ifdef __DEF_IINCHIP_DBG__ - printf("send fail.\r\n"); -#endif -/* +2008.01 [bj]: clear interrupt */ -#ifdef __DEF_IINCHIP_INT__ - putISR(s, getISR(s) & ~(Sn_IR_SEND_OK | Sn_IR_TIMEOUT)); /* clear SEND_OK & TIMEOUT */ -#else - IINCHIP_WRITE(Sn_IR(s), (Sn_IR_SEND_OK | Sn_IR_TIMEOUT)); /* clear SEND_OK & TIMEOUT */ -#endif - return 0; - } - } - -/* +2008.01 bj */ -#ifdef __DEF_IINCHIP_INT__ - putISR(s, getISR(s) & (~Sn_IR_SEND_OK)); -#else - IINCHIP_WRITE(Sn_IR(s), Sn_IR_SEND_OK); -#endif - - } - return ret; -} - - -/** -@brief This function is an application I/F function which is used to receive the data in other then - TCP mode. This function is used to receive UDP, IP_RAW and MAC_RAW mode, and handle the header as well. - -@return This function return received data size for success else -1. -*/ -uint16 recvfrom( - SOCKET s, /**< the socket number */ - uint8 * buf, /**< a pointer to copy the data to be received */ - uint16 len, /**< the data size to read */ - uint8 * addr, /**< a pointer to store the peer's IP address */ - uint16 *port /**< a pointer to store the peer's port number. */ - ) -{ - uint8 head[8]; - uint16 data_len=0; - uint16 ptr=0; -#ifdef __DEF_IINCHIP_DBG__ - printf("recvfrom()\r\n"); -#endif - - if ( len > 0 ) - { - ptr = IINCHIP_READ(Sn_RX_RD0(s)); - ptr = ((ptr & 0x00ff) << 8) + IINCHIP_READ(Sn_RX_RD0(s) + 1); -#ifdef __DEF_IINCHIP_DBG__ - printf("ISR_RX: rd_ptr : %.4x\r\n", ptr); -#endif - switch (IINCHIP_READ(Sn_MR(s)) & 0x07) - { - case Sn_MR_UDP : - read_data(s, (uint8 *)ptr, head, 0x08); - ptr += 8; - // read peer's IP address, port number. - addr[0] = head[0]; - addr[1] = head[1]; - addr[2] = head[2]; - addr[3] = head[3]; - *port = head[4]; - *port = (*port << 8) + head[5]; - data_len = head[6]; - data_len = (data_len << 8) + head[7]; - -#ifdef __DEF_IINCHIP_DBG__ - printf("UDP msg arrived\r\n"); - printf("source Port : %d\r\n", *port); - printf("source IP : %d.%d.%d.%d\r\n", addr[0], addr[1], addr[2], addr[3]); -#endif - - read_data(s, (uint8 *)ptr, buf, data_len); // data copy. - ptr += data_len; - - IINCHIP_WRITE(Sn_RX_RD0(s),(uint8)((ptr & 0xff00) >> 8)); - IINCHIP_WRITE((Sn_RX_RD0(s) + 1),(uint8)(ptr & 0x00ff)); - break; - - case Sn_MR_IPRAW : - read_data(s, (uint8 *)ptr, head, 0x06); - ptr += 6; - - addr[0] = head[0]; - addr[1] = head[1]; - addr[2] = head[2]; - addr[3] = head[3]; - data_len = head[4]; - data_len = (data_len << 8) + head[5]; - -#ifdef __DEF_IINCHIP_DBG__ - printf("IP RAW msg arrived\r\n"); - printf("source IP : %d.%d.%d.%d\r\n", addr[0], addr[1], addr[2], addr[3]); -#endif - read_data(s, (uint8 *)ptr, buf, data_len); // data copy. - ptr += data_len; - - IINCHIP_WRITE(Sn_RX_RD0(s),(uint8)((ptr & 0xff00) >> 8)); - IINCHIP_WRITE((Sn_RX_RD0(s) + 1),(uint8)(ptr & 0x00ff)); - break; - case Sn_MR_MACRAW : - read_data(s,(uint8*)ptr,head,2); - ptr+=2; - data_len = head[0]; - data_len = (data_len<<8) + head[1] - 2; - - read_data(s,(uint8*) ptr,buf,data_len); - ptr += data_len; - IINCHIP_WRITE(Sn_RX_RD0(s),(uint8)((ptr & 0xff00) >> 8)); - IINCHIP_WRITE((Sn_RX_RD0(s) + 1),(uint8)(ptr & 0x00ff)); - -#ifdef __DEF_IINCHIP_DGB__ - printf("MAC RAW msg arrived\r\n"); - printf("dest mac=%.2X.%.2X.%.2X.%.2X.%.2X.%.2X\r\n",buf[0],buf[1],buf[2],buf[3],buf[4],buf[5]); - printf("src mac=%.2X.%.2X.%.2X.%.2X.%.2X.%.2X\r\n",buf[6],buf[7],buf[8],buf[9],buf[10],buf[11]); - printf("type =%.2X%.2X\r\n",buf[12],buf[13]); -#endif - break; - - default : - break; - } - IINCHIP_WRITE(Sn_CR(s),Sn_CR_RECV); - - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(s)) ) - ; - /* ------- */ - } -#ifdef __DEF_IINCHIP_DBG__ - printf("recvfrom() end ..\r\n"); -#endif - return data_len; -} - - -uint16 igmpsend(SOCKET s, const uint8 * buf, uint16 len) -{ -// uint8 status=0; -// uint8 isr=0; - uint16 ret=0; - -#ifdef __DEF_IINCHIP_DBG__ - printf("igmpsend()\r\n"); -#endif - if (len > getIINCHIP_TxMAX(s)) ret = getIINCHIP_TxMAX(s); // check size not to exceed MAX size. - else ret = len; - - if (ret == 0) - { - ; -#ifdef __DEF_IINCHIP_DBG__ - printf("%d Fail[%d]\r\n",len,ret); -#endif - } - else - { - // copy data - send_data_processing(s, (uint8 *)buf, ret); - IINCHIP_WRITE(Sn_CR(s),Sn_CR_SEND); -/* +2008.01 bj */ - while( IINCHIP_READ(Sn_CR(s)) ) - ; -/* ------- */ - -/* +2008.01 bj */ -#ifdef __DEF_IINCHIP_INT__ - while ( (getISR(s) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) -#else - while ( (IINCHIP_READ(Sn_IR(s)) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) -#endif - { - IINCHIP_READ(Sn_SR(s)); -#ifdef __DEF_IINCHIP_INT__ - if (getISR(s) & Sn_IR_TIMEOUT) -#else - if (IINCHIP_READ(Sn_IR(s)) & Sn_IR_TIMEOUT) -#endif - { -#ifdef __DEF_IINCHIP_DBG__ - printf("igmpsend fail.\r\n"); -#endif - /* in case of igmp, if send fails, then socket closed */ - /* if you want change, remove this code. */ - close(s); - /* ----- */ - - return 0; - } - } - -/* +2008.01 bj */ -#ifdef __DEF_IINCHIP_INT__ - putISR(s, getISR(s) & (~Sn_IR_SEND_OK)); -#else - IINCHIP_WRITE(Sn_IR(s), Sn_IR_SEND_OK); -#endif - } - return ret; -} - +/* +* +@file socket.c +@brief setting chip register for socket + last update : 2008. Jan +* +*/ + +#include "ethernet.h" +#include "w5100.h" +#include "socket.h" + +#ifdef __DEF_IINCHIP_DBG__ +#include +#endif + +static uint16 local_port; + +/** +@brief This Socket function initialize the channel in perticular mode, and set the port and wait for W5100 done it. +@return 1 for success else 0. +*/ +uint8 socket( + SOCKET s, /**< for socket number */ + uint8 protocol, /**< for socket protocol */ + uint16 port, /**< the source port for the socket */ + uint8 flag /**< the option for the socket */ + ) +{ + uint8 ret; +#ifdef __DEF_IINCHIP_DBG__ + printf("socket()\r\n"); +#endif + if ((protocol == Sn_MR_TCP) || (protocol == Sn_MR_UDP) || (protocol == Sn_MR_IPRAW) || (protocol == Sn_MR_MACRAW) || (protocol == Sn_MR_PPPOE)) + { + close(s); + IINCHIP_WRITE(Sn_MR(s),protocol | flag); + if (port != 0) { + IINCHIP_WRITE(Sn_PORT0(s),(uint8)((port & 0xff00) >> 8)); + IINCHIP_WRITE((Sn_PORT0(s) + 1),(uint8)(port & 0x00ff)); + } else { + local_port++; // if don't set the source port, set local_port number. + IINCHIP_WRITE(Sn_PORT0(s),(uint8)((local_port & 0xff00) >> 8)); + IINCHIP_WRITE((Sn_PORT0(s) + 1),(uint8)(local_port & 0x00ff)); + } + IINCHIP_WRITE(Sn_CR(s),Sn_CR_OPEN); // run sockinit Sn_CR + + /* +20071122[chungs]:wait to process the command... */ + while( IINCHIP_READ(Sn_CR(s)) ) + ; + /* ------- */ + ret = 1; + } + else + { + ret = 0; + } +#ifdef __DEF_IINCHIP_DBG__ + printf("Sn_SR = %.2x , Protocol = %.2x\r\n", IINCHIP_READ(Sn_SR(s)), IINCHIP_READ(Sn_MR(s))); +#endif + return ret; +} + + +/** +@brief This function close the socket and parameter is "s" which represent the socket number +*/ +void close(SOCKET s) +{ +#ifdef __DEF_IINCHIP_DBG__ + printf("close()\r\n"); +#endif + + IINCHIP_WRITE(Sn_CR(s),Sn_CR_CLOSE); + + /* +20071122[chungs]:wait to process the command... */ + while( IINCHIP_READ(Sn_CR(s)) ) + ; + /* ------- */ + + /* +2008.01 [hwkim]: clear interrupt */ + #ifdef __DEF_IINCHIP_INT__ + /* m2008.01 [bj] : all clear */ + putISR(s, 0x00); + #else + /* m2008.01 [bj] : all clear */ + IINCHIP_WRITE(Sn_IR(s), 0xFF); + #endif +} + + +/** +@brief This function established the connection for the channel in passive (server) mode. This function waits for the request from the peer. +@return 1 for success else 0. +*/ +uint8 listen( + SOCKET s /**< the socket number */ + ) +{ + uint8 ret; +#ifdef __DEF_IINCHIP_DBG__ + printf("listen()\r\n"); +#endif + if (IINCHIP_READ(Sn_SR(s)) == SOCK_INIT) + { + IINCHIP_WRITE(Sn_CR(s),Sn_CR_LISTEN); + /* +20071122[chungs]:wait to process the command... */ + while( IINCHIP_READ(Sn_CR(s)) ); + /* ------- */ + ret = 1; +#ifdef __DEF_IINCHIP_DBG__ + printf("status = %x\r\n",IINCHIP_READ(Sn_SR(s))); +#endif + } + else + { + ret = 0; +#ifdef __DEF_IINCHIP_DBG__ + printf("Fail[invalid ip,port]\r\n"); +#endif + } + return ret; +} + +/** +@brief This function wait for client connection +@return 1 for success else 0. +*/ +uint8 accept( + SOCKET s /**< the socket number */ + ) +{ + uint8 ret; +#ifdef __DEF_IINCHIP_DBG__ + printf("accept()\r\n"); +#endif + if (IINCHIP_READ(Sn_SR(s)) == SOCK_LISTEN) + { + while( IINCHIP_READ(Sn_SR(s)) != SOCK_ESTABLISHED ); + /* ------- */ + ret = 1; +#ifdef __DEF_IINCHIP_DBG__ + printf("status = %x\r\n",IINCHIP_READ(Sn_SR(s))); +#endif + } + else + { + ret = 0; +#ifdef __DEF_IINCHIP_DBG__ + printf("Fail[not listening]\r\n"); +#endif + } + return ret; +} + + +/** +@brief This function established the connection for the channel in Active (client) mode. + This function waits for the until the connection is established. + +@return 1 for success else 0. +*/ +uint8 connect(SOCKET s, uint8 * addr, uint16 port) +{ + uint8 ret; +#ifdef __DEF_IINCHIP_DBG__ + printf("connect()\r\n"); +#endif + if + ( + ((addr[0] == 0xFF) && (addr[1] == 0xFF) && (addr[2] == 0xFF) && (addr[3] == 0xFF)) || + ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) || + (port == 0x00) + ) + { + ret = 0; +#ifdef __DEF_IINCHIP_DBG__ + printf("Fail[invalid ip,port]\r\n"); +#endif + } + else + { + ret = 1; + // set destination IP + IINCHIP_WRITE(Sn_DIPR0(s),addr[0]); + IINCHIP_WRITE((Sn_DIPR0(s) + 1),addr[1]); + IINCHIP_WRITE((Sn_DIPR0(s) + 2),addr[2]); + IINCHIP_WRITE((Sn_DIPR0(s) + 3),addr[3]); + IINCHIP_WRITE(Sn_DPORT0(s),(uint8)((port & 0xff00) >> 8)); + IINCHIP_WRITE((Sn_DPORT0(s) + 1),(uint8)(port & 0x00ff)); + IINCHIP_WRITE(Sn_CR(s),Sn_CR_CONNECT); + /* m2008.01 [bj] : wait for completion */ + while ( IINCHIP_READ(Sn_CR(s)) ) ; + + } + + return ret; +} + + + +/** +@brief This function used for disconnect the socket and parameter is "s" which represent the socket number +@return 1 for success else 0. +*/ +void disconnect(SOCKET s) +{ +#ifdef __DEF_IINCHIP_DBG__ + printf("disconnect()\r\n"); +#endif + IINCHIP_WRITE(Sn_CR(s),Sn_CR_DISCON); + + /* +20071122[chungs]:wait to process the command... */ + while( IINCHIP_READ(Sn_CR(s)) ) + ; + /* ------- */ +} + + +/** +@brief This function used to send the data in TCP mode +@return 1 for success else 0. +*/ +uint16 send( + SOCKET s, /**< the socket index */ + const uint8 * buf, /**< a pointer to data */ + uint16 len /**< the data size to be send */ + ) +{ + uint8 status=0; + uint16 ret=0; + uint16 freesize=0; +#ifdef __DEF_IINCHIP_DBG__ + printf("send()\r\n"); +#endif + + if (len > getIINCHIP_TxMAX(s)) ret = getIINCHIP_TxMAX(s); // check size not to exceed MAX size. + else ret = len; + + // if freebuf is available, start. + do + { + freesize = getSn_TX_FSR(s); + status = IINCHIP_READ(Sn_SR(s)); + if ((status != SOCK_ESTABLISHED) && (status != SOCK_CLOSE_WAIT)) + { +#ifdef __DEF_IINCHIP_DBG__ + printf("socket %d freesize(%d) empty or error\r\n", s, freesize); +#endif + ret = 0; + break; + } + } while (freesize < ret); + + // copy data + send_data_processing(s, (uint8 *)buf, ret); + IINCHIP_WRITE(Sn_CR(s),Sn_CR_SEND); + + /* +20071122[chungs]:wait to process the command... */ + while( IINCHIP_READ(Sn_CR(s)) ) + ; + /* ------- */ + +/* +2008.01 bj */ +#ifdef __DEF_IINCHIP_INT__ + while ( (getISR(s) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) +#else + while ( (IINCHIP_READ(Sn_IR(s)) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) +#endif + { + /* m2008.01 [bj] : reduce code */ + if ( IINCHIP_READ(Sn_SR(s)) == SOCK_CLOSED ) + { +#ifdef __DEF_IINCHIP_DBG__ + printf("SOCK_CLOSED.\r\n"); +#endif + close(s); + return 0; + } + } +/* +2008.01 bj */ +#ifdef __DEF_IINCHIP_INT__ + putISR(s, getISR(s) & (~Sn_IR_SEND_OK)); +#else + IINCHIP_WRITE(Sn_IR(s), Sn_IR_SEND_OK); +#endif + return ret; +} + + +/** +@brief This function is an application I/F function which is used to receive the data in TCP mode. + It continues to wait for data as much as the application wants to receive. + +@return received data size for success else -1. +*/ +int16 recv( + SOCKET s, /**< socket index */ + uint8 * buf, /**< a pointer to copy the data to be received */ + uint16 len /**< the data size to be read */ + ) +{ + uint16 ret=0; + if( IINCHIP_READ(Sn_SR(s)) != SOCK_ESTABLISHED ){ + printf("Bad status = %02x\n",IINCHIP_READ(Sn_SR(s))); + return -1; + } + int plen = getSn_RX_RSR(0); + if( plen <= 0 ) return 0; + +#ifdef __DEF_IINCHIP_DBG__ + printf("recv()\r\n"); +#endif + + if( plen < len ) len=plen; + if ( len > 0 ) + { + recv_data_processing(s, buf, len); + IINCHIP_WRITE(Sn_CR(s),Sn_CR_RECV); + + /* +20071122[chungs]:wait to process the command... */ + while( IINCHIP_READ(Sn_CR(s)) ) + ; + /* ------- */ + ret = len; + } + return ret; +} + + +/** +@brief This function is an application I/F function which is used to send the data for other then TCP mode. + Unlike TCP transmission, The peer's destination address and the port is needed. + +@return This function return send data size for success else -1. +*/ +uint16 sendto( + SOCKET s, /**< socket index */ + const uint8 * buf, /**< a pointer to the data */ + uint16 len, /**< the data size to send */ + uint8 * addr, /**< the peer's Destination IP address */ + uint16 port /**< the peer's destination port number */ + ) +{ +// uint8 status=0; +// uint8 isr=0; + uint16 ret=0; + +#ifdef __DEF_IINCHIP_DBG__ + printf("sendto()\r\n"); +#endif + if (len > getIINCHIP_TxMAX(s)) ret = getIINCHIP_TxMAX(s); // check size not to exceed MAX size. + else ret = len; + + if + ( + ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) || + ((port == 0x00)) ||(ret == 0) + ) + { + /* +2008.01 [bj] : added return value */ + ret = 0; +#ifdef __DEF_IINCHIP_DBG__ + printf("%d Fail[%.2x.%.2x.%.2x.%.2x, %.d, %d]\r\n",s, addr[0], addr[1], addr[2], addr[3] , port, len); + printf("Fail[invalid ip,port]\r\n"); +#endif + } + else + { + IINCHIP_WRITE(Sn_DIPR0(s),addr[0]); + IINCHIP_WRITE((Sn_DIPR0(s) + 1),addr[1]); + IINCHIP_WRITE((Sn_DIPR0(s) + 2),addr[2]); + IINCHIP_WRITE((Sn_DIPR0(s) + 3),addr[3]); + IINCHIP_WRITE(Sn_DPORT0(s),(uint8)((port & 0xff00) >> 8)); + IINCHIP_WRITE((Sn_DPORT0(s) + 1),(uint8)(port & 0x00ff)); + + // copy data + send_data_processing(s, (uint8 *)buf, ret); + IINCHIP_WRITE(Sn_CR(s),Sn_CR_SEND); + + /* +20071122[chungs]:wait to process the command... */ + while( IINCHIP_READ(Sn_CR(s)) ) + ; + /* ------- */ + +/* +2008.01 bj */ +#ifdef __DEF_IINCHIP_INT__ + while ( (getISR(s) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) +#else + while ( (IINCHIP_READ(Sn_IR(s)) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) +#endif + { +#ifdef __DEF_IINCHIP_INT__ + if (getISR(s) & Sn_IR_TIMEOUT) +#else + if (IINCHIP_READ(Sn_IR(s)) & Sn_IR_TIMEOUT) +#endif + { +#ifdef __DEF_IINCHIP_DBG__ + printf("send fail.\r\n"); +#endif +/* +2008.01 [bj]: clear interrupt */ +#ifdef __DEF_IINCHIP_INT__ + putISR(s, getISR(s) & ~(Sn_IR_SEND_OK | Sn_IR_TIMEOUT)); /* clear SEND_OK & TIMEOUT */ +#else + IINCHIP_WRITE(Sn_IR(s), (Sn_IR_SEND_OK | Sn_IR_TIMEOUT)); /* clear SEND_OK & TIMEOUT */ +#endif + return 0; + } + } + +/* +2008.01 bj */ +#ifdef __DEF_IINCHIP_INT__ + putISR(s, getISR(s) & (~Sn_IR_SEND_OK)); +#else + IINCHIP_WRITE(Sn_IR(s), Sn_IR_SEND_OK); +#endif + + } + return ret; +} + + +/** +@brief This function is an application I/F function which is used to receive the data in other then + TCP mode. This function is used to receive UDP, IP_RAW and MAC_RAW mode, and handle the header as well. + +@return This function return received data size for success else -1. +*/ +uint16 recvfrom( + SOCKET s, /**< the socket number */ + uint8 * buf, /**< a pointer to copy the data to be received */ + uint16 len, /**< the data size to read */ + uint8 * addr, /**< a pointer to store the peer's IP address */ + uint16 *port /**< a pointer to store the peer's port number. */ + ) +{ + uint8 head[8]; + uint16 data_len=0; + uint16 plen = getSn_RX_RSR(s); + uint16 ptr=0; + + if(plen <=0 ) return 0; + +#ifdef __DEF_IINCHIP_DBG__ + printf("recvfrom()\r\n"); +#endif + + plen = getSn_RX_RSR(s); + if ( len > 0 ) + { + ptr = IINCHIP_READ(Sn_RX_RD0(s)); + ptr = ((ptr & 0x00ff) << 8) + IINCHIP_READ(Sn_RX_RD0(s) + 1); + +#ifdef __DEF_IINCHIP_DBG__ + printf("ISR_RX: rd_ptr : %.4x size=%d\r\n", ptr, plen); +#endif + switch (IINCHIP_READ(Sn_MR(s)) & 0x07) + { + case Sn_MR_UDP : + read_data(s, (uint8 *)ptr, head, 0x08); + ptr += 8; + // read peer's IP address, port number. + addr[0] = head[0]; + addr[1] = head[1]; + addr[2] = head[2]; + addr[3] = head[3]; + *port = head[4]; + *port = (*port << 8) + head[5]; + data_len = head[6]; + data_len = (data_len << 8) + head[7]; + +#ifdef __DEF_IINCHIP_DBG__ + printf("UDP msg #%d arrived\r\n",data_len); + printf("source Port : %u\r\n", *port); + printf("source IP : %d.%d.%d.%d\r\n", addr[0], addr[1], addr[2], addr[3]); +#endif + + read_data(s, (uint8 *)ptr, buf, data_len); // data copy. + ptr += data_len; + + IINCHIP_WRITE(Sn_RX_RD0(s),(uint8)((ptr & 0xff00) >> 8)); + IINCHIP_WRITE((Sn_RX_RD0(s) + 1),(uint8)(ptr & 0x00ff)); + break; + + case Sn_MR_IPRAW : + read_data(s, (uint8 *)ptr, head, 0x06); + ptr += 6; + + addr[0] = head[0]; + addr[1] = head[1]; + addr[2] = head[2]; + addr[3] = head[3]; + data_len = head[4]; + data_len = (data_len << 8) + head[5]; + +#ifdef __DEF_IINCHIP_DBG__ + printf("IP RAW msg arrived\r\n"); + printf("source IP : %d.%d.%d.%d\r\n", addr[0], addr[1], addr[2], addr[3]); +#endif + read_data(s, (uint8 *)ptr, buf, data_len); // data copy. + ptr += data_len; + + IINCHIP_WRITE(Sn_RX_RD0(s),(uint8)((ptr & 0xff00) >> 8)); + IINCHIP_WRITE((Sn_RX_RD0(s) + 1),(uint8)(ptr & 0x00ff)); + break; + case Sn_MR_MACRAW : + read_data(s,(uint8*)ptr,head,2); + ptr+=2; + data_len = head[0]; + data_len = (data_len<<8) + head[1] - 2; + + read_data(s,(uint8*) ptr,buf,data_len); + ptr += data_len; + IINCHIP_WRITE(Sn_RX_RD0(s),(uint8)((ptr & 0xff00) >> 8)); + IINCHIP_WRITE((Sn_RX_RD0(s) + 1),(uint8)(ptr & 0x00ff)); + +#ifdef __DEF_IINCHIP_DGB__ + printf("MAC RAW msg arrived\r\n"); + printf("dest mac=%.2X.%.2X.%.2X.%.2X.%.2X.%.2X\r\n",buf[0],buf[1],buf[2],buf[3],buf[4],buf[5]); + printf("src mac=%.2X.%.2X.%.2X.%.2X.%.2X.%.2X\r\n",buf[6],buf[7],buf[8],buf[9],buf[10],buf[11]); + printf("type =%.2X%.2X\r\n",buf[12],buf[13]); +#endif + break; + + default : + break; + } + IINCHIP_WRITE(Sn_CR(s),Sn_CR_RECV); + + /* +20071122[chungs]:wait to process the command... */ + while( IINCHIP_READ(Sn_CR(s)) ) + ; + /* ------- */ + } +#ifdef __DEF_IINCHIP_DBG__ + printf("recvfrom() end ..\r\n"); +#endif + return data_len; +} + + +uint16 igmpsend(SOCKET s, const uint8 * buf, uint16 len) +{ + uint8 status=0; +// uint8 isr=0; + uint16 ret=0; + +#ifdef __DEF_IINCHIP_DBG__ + printf("igmpsend()\r\n"); +#endif + if (len > getIINCHIP_TxMAX(s)) ret = getIINCHIP_TxMAX(s); // check size not to exceed MAX size. + else ret = len; + + if (ret == 0) + { + ; +#ifdef __DEF_IINCHIP_DBG__ + printf("%d Fail[%d]\r\n",len,ret); +#endif + } + else + { + // copy data + send_data_processing(s, (uint8 *)buf, ret); + IINCHIP_WRITE(Sn_CR(s),Sn_CR_SEND); +/* +2008.01 bj */ + while( IINCHIP_READ(Sn_CR(s)) ) + ; +/* ------- */ + +/* +2008.01 bj */ +#ifdef __DEF_IINCHIP_INT__ + while ( (getISR(s) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) +#else + while ( (IINCHIP_READ(Sn_IR(s)) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) +#endif + { + status = IINCHIP_READ(Sn_SR(s)); +#ifdef __DEF_IINCHIP_INT__ + if (getISR(s) & Sn_IR_TIMEOUT) +#else + if (IINCHIP_READ(Sn_IR(s)) & Sn_IR_TIMEOUT) +#endif + { +#ifdef __DEF_IINCHIP_DBG__ + printf("igmpsend fail.\r\n"); +#endif + /* in case of igmp, if send fails, then socket closed */ + /* if you want change, remove this code. */ + close(s); + /* ----- */ + + return 0; + } + } + +/* +2008.01 bj */ +#ifdef __DEF_IINCHIP_INT__ + putISR(s, getISR(s) & (~Sn_IR_SEND_OK)); +#else + IINCHIP_WRITE(Sn_IR(s), Sn_IR_SEND_OK); +#endif + } + return ret; +} + diff --git a/Tangible/socket.h b/Tangible/socket.h old mode 100755 new mode 100644 index 4347686..11c17d9 --- a/Tangible/socket.h +++ b/Tangible/socket.h @@ -1,28 +1,24 @@ -/* -* -@file socket.h -@brief define function of socket API -* -*/ - -#ifndef _SOCKET_H_ -#define _SOCKET_H_ - -extern uint8 socket(SOCKET s, uint8 protocol, uint16 port, uint8 flag); // Opens a socket(TCP or UDP or IP_RAW mode) -extern void close(SOCKET s); // Close socket - - -extern uint8 connect(SOCKET s, uint8 * addr, uint16 port); // Establish TCP connection (Active connection) -extern void disconnect(SOCKET s); // Disconnect the connection - -extern uint8 listen(SOCKET s); // Establish TCP connection (Passive connection) -extern uint16 send(SOCKET s, const uint8 * buf, uint16 len); // Send data (TCP) -extern uint16 recv(SOCKET s, uint8 * buf, uint16 len); // Receive data (TCP) - - -extern uint16 sendto(SOCKET s, const uint8 * buf, uint16 len, uint8 * addr, uint16 port); // Send data (UDP/IP RAW) -extern uint16 recvfrom(SOCKET s, uint8 * buf, uint16 len, uint8 * addr, uint16 *port); // Receive data (UDP/IP RAW) - -extern uint16 igmpsend(SOCKET s, const uint8 * buf, uint16 len); -#endif -/* _SOCKET_H_ */ +/* +* +@file socket.h +@brief define function of socket API +* +*/ + +#ifndef _SOCKET_H_ +#define _SOCKET_H_ + +extern uint8 socket(SOCKET s, uint8 protocol, uint16 port, uint8 flag); // Opens a socket(TCP or UDP or IP_RAW mode) +extern void close(SOCKET s); // Close socket +extern uint8 connect(SOCKET s, uint8 * addr, uint16 port); // Establish TCP connection (Active connection) +extern void disconnect(SOCKET s); // disconnect the connection +extern uint8 listen(SOCKET s); // Establish TCP connection (Passive connection) +extern uint8 accept(SOCKET s); // Wait for client (Passive connection) +extern uint16 send(SOCKET s, const uint8 * buf, uint16 len); // Send data (TCP) +extern int16 recv(SOCKET s, uint8 * buf, uint16 len); // Receive data (TCP) +extern uint16 sendto(SOCKET s, const uint8 * buf, uint16 len, uint8 * addr, uint16 port); // Send data (UDP/IP RAW) +extern uint16 recvfrom(SOCKET s, uint8 * buf, uint16 len, uint8 * addr, uint16 *port); // Receive data (UDP/IP RAW) + +extern uint16 igmpsend(SOCKET s, const uint8 * buf, uint16 len); +#endif +/* _SOCKET_H_ */ diff --git a/Tangible/socket.o b/Tangible/socket.o index 0aca7b5..4cddbc5 100644 Binary files a/Tangible/socket.o and b/Tangible/socket.o differ diff --git a/Tangible/spi.h b/Tangible/spi.h old mode 100755 new mode 100644 index 6b41688..6b41688 --- a/Tangible/spi.h +++ b/Tangible/spi.h diff --git a/Tangible/tangibleInterface b/Tangible/tangibleInterface index b52b3f9..417768b 100755 Binary files a/Tangible/tangibleInterface and b/Tangible/tangibleInterface differ diff --git a/Tangible/tangibleInterface.c b/Tangible/tangibleInterface.c index 952a9ef..e0e4bda 100644 --- a/Tangible/tangibleInterface.c +++ b/Tangible/tangibleInterface.c @@ -12,38 +12,74 @@ int main(void) { - uint8_t little_mac[MAC_SIZE] = {0xA0,0xBD,0xCD,0xDD,0xED,0xFD}; + uint8_t mac[MAC_SIZE] = {0xA0,0xBD,0xCD,0xDD,0xED,0xFD}; uint8_t ip[IPV4_SIZE] = {172,26,145,205}; - uint8_t gateway[IPV4_SIZE] = {172,26,145,254}; - uint8_t mask[IPV4_SIZE] = {255,255,255,0}; + uint8_t gateway[4] = {172,26,145,254}; + uint8_t mask[4] = {255,255,255,0}; + + const char answer [16] = "I'm ok"; + + uint8 buf[16]; + uint8_t addr[IPV4_SIZE]; + uint16_t port; + + uint8_t addrpifou[IPV4_SIZE]={172,26,145,35}; uint16 size; - const char answer [15]= "I'M OK"; - uint8 buf[16]; // Message à stocker. - uint8_t addr[IPV4_SIZE]; // Adresse source du message reçu. - uint8_t addr2[IPV4_SIZE]={172,26,145,35}; - uint16_t port; // Port source du message reçu. SOCKET sUDP=0; SOCKET sTCP=1; - int test = 0; - init_printf(); - ethernet_init(little_mac,ip,gateway,mask); - test = socket(sUDP,Sn_MR_UDP,2020,0); - while(test) + init_printf(); + ethernet_init(mac,ip,gateway,mask); + if (!socket(sUDP,Sn_MR_UDP,2020,0)) + { + return -1; + } + if (!socket(sTCP,Sn_MR_TCP,2020,0)) + { + return -1; + } + + while(1) { - //sendto(sUDP,answer,sizeof(answer),addr2,2020); - recvfrom(sUDP,buf,sizeof(buf),addr,&port); + if (listen(sTCP)) + { + if (accept(sTCP)) + { + printf("test\n"); + /* if(recv(sTCP, buf,(uint16)sizeof(buf))!=-1) */ + /* { */ + send(sTCP,(uint8*)answer, (uint16)sizeof(answer)); + /* } */ + } + else + { + close(sTCP); + if (!socket(sTCP,Sn_MR_TCP,2020,0)) + { + return -1; + } + } + } + else + { + close(sTCP); + if (!socket(sTCP,Sn_MR_TCP,2020,0)) + { + return -1; + } + + } } - printf("Sortie boucle\n"); + close(sTCP); + close(sUDP); return 0; } + -/* if(listen(sTCP)) //Repondre je vais bien à un client */ -/* { */ -/* send(sTCP,(uint8 *)answer,sizeof(answer)); */ -/* } */ - /* if (!socket(sTCP,Sn_MR_TCP,2020,0)) */ - /* { */ - /* return -1; */ - /* } */ +//sendto(sUDP,(uint8*)answer,(uint16)sizeof(answer), addrpifou, 2020); + /* if (recvfrom(sUDP,buf,sizeof(buf),addr,&port) !=0 ) */ + /* { */ + /* printf("Size : %d \n",size); */ + /* } */ + diff --git a/Tangible/tangibleInterface.hex b/Tangible/tangibleInterface.hex index 845d4e2..aef58ea 100644 --- a/Tangible/tangibleInterface.hex +++ b/Tangible/tangibleInterface.hex @@ -5,18 +5,18 @@ :100040000C9451000C9451000C9451000C945100EC :100050000C9451000C9451000C9451000C945100DC :100060000C9451000C94510011241FBECFEFD8E026 -:10007000DEBFCDBF12E0A0E0B1E0ECE1FEE102C0E6 -:1000800005900D92AE3FB107D9F723E0AEEFB2E095 -:1000900001C01D92AA33B207E1F70E948E0B0C94A7 -:1000A0000C0F0C940000E82FF0E0E25DFC4F808123 -:1000B0000895E82FF0E0E25DFC4F60830895E82F9B -:1000C000F0E0EE0FFF1FE25FFC4F80819181089509 -:1000D000E82FF0E0EE0FFF1FEA5EFC4F8081918178 -:1000E0000895E82FF0E0EE0FFF1FE25EFC4F8081E5 -:1000F00091810895E82FF0E0EE0FFF1FEA5DFC4FBD -:10010000808191810895E82FF0E0EE0FFF1FE2500B -:10011000FD4F808191810895E82FF0E0EE0FFF1FE1 -:10012000EA5FFC4F80819181089524B12C6224B94B +:10007000DEBFCDBF13E0A0E0B1E0E0E4FFE102C0ED +:1000800005900D92AA36B107D9F723E0AAE6B3E0AE +:1000900001C01D92A63AB207E1F70E94050C0C942C +:1000A0009E0F0C940000E82FF0E0E656FC4F808194 +:1000B0000895E82FF0E0E656FC4F60830895E82F9E +:1000C000F0E0EE0FFF1FE658FC4F8081918108950C +:1000D000E82FF0E0EE0FFF1FEE57FC4F808191817B +:1000E0000895E82FF0E0EE0FFF1FE657FC4F8081E8 +:1000F00091810895E82FF0E0EE0FFF1FEE56FC4FC0 +:10010000808191810895E82FF0E0EE0FFF1FE659FE +:10011000FC4F808191810895E82FF0E0EE0FFF1FE2 +:10012000EE58FC4F80819181089524B12C6224B94E :100130002A9A25B1277D25B920E52CBD2A9820EFE4 :100140002EBD0DB407FEFDCF9EBD0DB407FEFDCF45 :100150008EBD0DB407FEFDCF6EBD0DB407FEFDCF05 @@ -37,13 +37,13 @@ :10024000CA0108952F923F924F925F926F927F92D0 :100250008F929F92AF92BF92CF92DF92EF92FF92D6 :100260000F931F93CF93DF93CDB7DEB728970FB6C9 -:10027000F894DEBF0FBECDBF282E362E82E291E06D -:100280000E94270C622D8BE190E00E949500632D67 -:100290008AE190E00E94950080E090E4909307034B -:1002A0008093060380E090E69093FF028093FE0225 -:1002B0008DE291E00E94270C8EEF882E82E0982E2E -:1002C00096E0A92E93E0B92E26E133E038872F83FC -:1002D0000EE013E02EE1C22E23E0D22E36E2E32E12 +:10027000F894DEBF0FBECDBF282E362E89E291E066 +:100280000E94B90C622D8BE190E00E949500632DD5 +:100290008AE190E00E94950080E090E490937303DF +:1002A0008093720380E090E690936B0380936A03DF +:1002B00084E391E00E94B90C8AE6882E83E0982EB0 +:1002C00092E7A92E93E0B92E22E833E038872F83F6 +:1002D0000AE713E02AE8C22E23E0D22E32E9E32E09 :1002E00033E0F32E1A821982412C512C1C821B827E :1002F000612C712C222D30E03E832D83232C312C58 :10030000AF81B88511961C921E92F801118210825D @@ -70,7 +70,7 @@ :100450004D935C93F40160817181F2E08F0E911CE9 :10046000D5014C9111965C91B2E0AB0EB11C3F935B :100470002F939F938F937F936F935F934F937F926D -:100480006F92A6E5B1E0BF93AF930E94110CFFEF0E +:100480006F92ADE5B1E0BF93AF930E94A30CFFEF75 :100490006F1A7F0A29813A812E5F3F4F3A83298361 :1004A00032E0C30ED11C42E0E40EF11C0FB6F8940A :1004B000DEBF0FBECDBF94E06916710409F020CFF6 @@ -164,9 +164,9 @@ :100A3000080F111D0C151D0511F7C801DF91CF918D :100A40001F910F91FF90EF90DF90CF900895CF927C :100A5000DF92EF92FF920F931F93CF93DF93E82FD4 -:100A6000F0E0EE0FFF1FDF01AA5DBC4F8D919C915E -:100A7000DA01A823B923EF01CA5FDC4FE880F980CF -:100A8000CD018E0D9F1DEA5EFC4FC081D181AD016D +:100A6000F0E0EE0FFF1FDF01AE56BC4F8D919C9161 +:100A7000DA01A823B923EF01CE58DC4FE880F980D2 +:100A8000CD018E0D9F1DEE57FC4FC081D181AD0170 :100A9000420F531FC417D50778F489016B01CA1B95 :100AA000DB0BAE010E94D100A8014C1B5D0BB6010F :100AB0006C0F7D1FC70101C0A901DF91CF911F916C @@ -181,9 +181,9 @@ :100B40000F90DF91CF911F910F91FF90EF90DF9069 :100B5000CF90BF909F908F900C949500AF92BF92D2 :100B6000CF92DF92EF92FF920F931F93CF93DF9379 -:100B7000DA01A901E82FF0E0EE0FFF1FEF01C25EDE -:100B8000DC4F888199816B01C822D922EF01C250C4 -:100B9000DD4FE880F980C6018E0D9F1DE25FFC4F9E +:100B7000DA01A901E82FF0E0EE0FFF1FEF01C657E1 +:100B8000DC4F888199816B01C822D922EF01C659B7 +:100B9000DC4FE880F980C6018E0D9F1DE658FC4FA2 :100BA000C081D1819601240F351FC217D30780F46D :100BB0008A015D01CC19DD09AE01BD010E94F90079 :100BC000A8014C1B5D0BB5016C0F7D1FC70101C057 @@ -193,323 +193,348 @@ :100C0000982E6B017A01082F10E00C5F1F4F102FF8 :100C10000027580188E2A80EB11CC5010E94B3004C :100C2000C82FD0E0DC2FCC27075D1F4FC8010E94E2 -:100C3000B300C80FD11DDF93CF9387E791E09F9357 -:100C40008F930E94110C9701A601BE01892D0E946D +:100C3000B300C80FD11DDF93CF938EE791E09F9350 +:100C40008F930E94A30C9701A601BE01892D0E94DB :100C5000AE05CE0DDF1D6D2FC5010E9495000F90D2 :100C60000F900F900F906C2FC801DF91CF911F91C3 :100C70000F91FF90EF90DF90CF90BF90AF909F903B -:100C80000C9495000F931F93CF93DF93C82F8FE899 -:100C900091E00E94270CD0E02496DC2FCC278E0117 +:100C80000C9495000F931F93CF93DF93C82F86E9A1 +:100C900091E00E94B90CD0E02496DC2FCC278E0185 :100CA0000F5F1F4F60E1C8010E949500C8010E94BC :100CB000B3008111FBCF6FEFCE010296DF91CF9190 :100CC0001F910F910C949500CF92DF92EF92FF92BB :100CD0000F931F93CF93DF93C82FC62E8A01D22E76 -:100CE00088E991E00E94270C8FEF8C0DEC2EF12CFF +:100CE0008FE991E00E94B90C8FEF8C0DEC2EF12C66 :100CF0008530D0F58C2F0E944206E7012496DC2F28 :100D0000CC276C2D6D29CE010E949500CE01049652 :100D10009E012B5F3F4F69010115110529F0612FDD -:100D20000E949500602F0FC0209132033091330351 -:100D30002F5F3F4F3093330320933203632F0E9482 -:100D4000950060913203C6010E9495008E010F5FED +:100D20000E949500602F0FC020919E0330919F0379 +:100D30002F5F3F4F30939F0320939E03632F0E94AA +:100D4000950060919E03C6010E9495008E010F5F81 :100D50001F4F61E0C8010E949500C8010E94B300C6 :100D60008111FBCF11E001C010E0E7012496DC2FD8 :100D7000CC27CE010E94B300082FCE0103960E941B -:100D8000B3001F920F931F928F9382EA91E09F937B -:100D90008F930E94110C0F900F900F900F900F9057 +:100D8000B3001F920F931F928F9389EA91E09F9374 +:100D90008F930E94A30C0F900F900F900F900F90C5 :100DA0000F90812FDF91CF911F910F91FF90EF90C6 -:100DB000DF90CF900895CF93DF93C82F83EC91E01D -:100DC0000E94270CD0E02496DC2FCC27CE0103967E -:100DD0000E94B300833161F4219662E0CE010E944B -:100DE0009500CE010E94B3008111FBCF81E005C0C8 -:100DF0008DEC91E00E94270C80E0DF91CF91089567 -:100E0000EF92FF920F931F93CF93DF93C82F8B0125 -:100E10007A0187EE91E00E94270CF80160816F3F14 -:100E200051F481818F3F99F482818F3F81F48381D6 -:100E30008F3F69F40FC061110AC0F80181818111EF -:100E400006C08281811103C08381882319F0E114D7 -:100E5000F10431F48DEC91E00E94270C80E02FC06A -:100E6000D0E02496DC2FCC27CE010C960E94950072 -:100E7000F8016181CE010D960E949500F801628112 -:100E8000CE010E960E949500F8016381CE010F9667 -:100E90000E9495006F2DCE0140960E9495006E2D08 -:100EA000CE0141960E949500219664E0CE010E94F9 -:100EB0009500CE010E94B3008111FBCF81E0DF914C -:100EC000CF911F910F91FF90EF900895CF93DF93F3 -:100ED000C82F84EE91E00E94270CD0E0DC2FCC27B5 -:100EE000CF5FDB4F68E0CE010E949500CE010E94EB -:100EF000B3008111FBCFDF91CF9108955F926F9284 -:100F00007F928F929F92AF92BF92CF92DF92EF9299 -:100F1000FF920F931F93CF93DF93582E3B018A01CB -:100F200087ED92E00E94270C852D0E9468008017B3 -:100F3000910720F4852D0E9468008C01C52CD12CCE -:100F4000E6012496DC2FCC275E0183E0A80EB11CBD -:100F500092EF892E91E0992E852D0E94AF047C019D -:100F6000C5010E94B300873111F08C3191F4FF92DA -:100F7000EF92DF92CF929F928F920E94110C0F906E -:100F80000F900F900F900F900F90E016F10620F346 -:100F900002C000E010E0A801B301852D0E946705A2 -:100FA0007E018FEFE81AF80A60E2C7010E949500FF -:100FB000C7010E94B3008111FBCF2296CE010E948F -:100FC000B30084FD0FC0C5010E94B3008111F6CFAC -:100FD0008AE192E00E94270C852D0E94420680E063 -:100FE00090E005C060E1CE010E949500C801DF914C -:100FF000CF911F910F91FF90EF90DF90CF90BF9016 -:10100000AF909F908F907F906F905F900895EF9238 -:10101000FF920F931F93CF93DF9300D0CDB7DEB72E -:10102000F82E8A0188E292E069837A830E94270C75 -:1010300069817A8101151105A9F0A8018F2D0E94FF -:10104000F5058F2D90E0982F88279C012F5F3B4F4F -:10105000790160E4C9010E949500C7010E94B300B4 -:101060008111FBCFC8010F900F90DF91CF911F919D -:101070000F91FF90EF9008958F929F92BF92CF9221 -:10108000DF92EF92FF920F931F93CF93DF93B82ECF -:101090004B01EA01790180E392E00E94270C8B2D3D -:1010A0000E9468008C179D0728F48B2D0E94680011 -:1010B0006C0101C06E01F7016081611109C081817D -:1010C000811106C08281811103C08381882331F0A0 -:1010D0000115110519F0C114D10429F5DF93CF933F -:1010E0001F930F93F70183811F928F9382811F9229 -:1010F0008F9381811F928F931F926F931F92BF9244 -:101100008AE392E09F938F930E94110C8DEC91E003 -:101110000E94270C8DB79EB740960FB6F8949EBFDD -:101120000FBE8DBF49C0CB2DD0E02496DC2FCC273D -:10113000CE010C960E949500F7016181CE010D96BB -:101140000E949500F7016281CE010E960E949500E3 -:10115000F7016381CE010F960E949500612FCE01A9 -:1011600040960E949500602FCE0141960E94950006 -:10117000A601B4018B2D0E9467058E010F5F1F4FE2 -:1011800060E2C8010E949500C8010E94B30081116D -:10119000FBCF2296CE010E94B30084FD10C0CE0189 -:1011A0000E94B30083FFF6CF81EF92E00E94270CEC -:1011B00068E1CE010E94950080E090E005C060E10A -:1011C000CE010E949500C601DF91CF911F910F9132 -:1011D000FF90EF90DF90CF90BF909F908F900895F9 -:1011E0002F923F924F925F927F928F929F92AF92F7 -:1011F000BF92CF92DF92EF92FF920F931F93CF9304 -:10120000DF93CDB7DEB72A970FB6F894DEBF0FBED7 -:10121000CDBF782E4B016A0179011A87098782E6D2 -:1012200092E00E94270CCD2809F40FC1472C512CC5 -:1012300084E0480E511C542C4424520198E2A90E1B -:10124000B11CC5010E94B300082F10E0102F002729 -:101250006201E9E2CE0ED11CC6010E94B300080F64 -:10126000111D1F930F9387E791E09F938F930E9427 -:10127000110CC2010E94B3000F900F900F900F90BD -:101280008770833009F460C0843009F4A7C08230CD -:1012900009F0CCC028E030E0AE014F5F5F4FB801ED -:1012A000872D0E94AE051801F8E02F0E311C8981B0 -:1012B000F70180838A8181838B8182838C81838300 -:1012C0008D8190E0982F88272E81820F911DE985CE -:1012D000FA85918380830F8110E0102F0027888585 -:1012E000080F111D8EE692E00E94270CE985FA8511 -:1012F00081818F9380818F938FE792E09F938F936B -:101300000E94110CF70183811F928F9382811F929B -:101310008F9381811F928F9380811F928F9382E997 -:1013200092E09F938F930E94110C9801A401B10148 -:10133000872D0E94AE057101E00EF11E6F2DC501D3 -:101340000E9495006E2D41C026E030E0AE014F5F57 -:101350005F4FB801872D0E94AE05180196E0290E57 -:10136000311C8981F70180838A8181838B8182830B -:101370008C8183830D8110E0102F00278E81080F50 -:10138000111D8CEA92E00E94270CF70183811F92C5 -:101390008F9382811F928F9381811F928F9380817F -:1013A0001F928F9382E992E09F938F930E94110C7A -:1013B0009801A401B101872D0E94AE05200E311EB7 -:1013C000632DC5010E949500622DC6010E94950003 -:1013D0000FB6F894DEBF0FBECDBF2AC022E030E0CA -:1013E000AE014F5F5F4FB801872D0E94AE057801B7 -:1013F00092E0E90EF11C098110E0902F88270A8104 -:1014000010E002501109080F191F9801A401B7013B -:10141000872D0E94AE05E00EF11E6F2DC5010E94C2 -:1014200095006E2DC6010E94950002C000E010E0FC -:10143000EFEF4E1A5E0A60E4C2010E949500C201FD -:101440000E94B3008111FBCF02C000E010E080ECED -:1014500092E00E94270CC8012A960FB6F894DEBFCE -:101460000FBECDBFDF91CF911F910F91FF90EF90F5 -:10147000DF90CF90BF90AF909F908F907F905F90C4 -:101480004F903F902F900895CF92DF92FF920F934D -:101490001F93CF93DF93F82E6B01EA0183ED92E067 -:1014A0000E94270C8F2D0E9468008C179D0728F43E -:1014B0008F2D0E9468008C0101C08E01011511055D -:1014C00089F41F921F92DF93CF938FED92E09F9349 -:1014D0008F930E94110C0F900F900F900F900F9010 -:1014E0000F9030C0A801B6018F2D0E946705CF2D47 -:1014F000D0E02496DC2FCC276E018FEFC81AD80AD3 -:1015000060E2C6010E949500C6010E94B3008111ED -:10151000FBCF6E0182E0C80ED11C2396C6010E944B -:10152000B30084FD12C0CE010E94B300C6010E9428 -:10153000B30083FFF3CF8DEE92E00E94270C8F2D36 -:101540000E94420680E090E005C060E1C6010E9472 -:101550009500C801DF91CF911F910F91FF90DF900F -:10156000CF900895CF92DF92EF92FF920F931F9347 -:10157000CF93DF936C017B018A01E9010E947E0217 -:1015800065E585E50E942201C6010E94CD02C701E2 -:101590000E94F002C8010E948102CE01DF91CF912A -:1015A0001F910F91FF90EF90DF90CF900C94B402B9 -:1015B0008093BB0084E88093BC008091BC0087FFCF -:1015C000FCCF08951092B9008CE08093B80084E0BD -:1015D0008093BC000895CF9394EA9093BC009091BF -:1015E000BC0097FFFCCF9091B900987F983011F024 -:1015F00080E015C0C62F880F0E94D80A8091B900DC -:10160000887F8831A9F78C2F0E94D80A8091B90071 -:10161000887F883269F784E98093BC0081E0CF91AC -:101620000895CF93DF9394EA9093BC009091BC000F -:1016300097FFFCCF9091B900987F983011F080E02F -:101640001EC0C42FD62F880F0E94D80A8091B900DF -:10165000887F8831A1F78D2F0E94D80A8091B90028 -:10166000887F883261F78C2F0E94D80A8091B90058 -:10167000887F883221F784E98093BC0081E0DF9184 -:10168000CF910895092E000CAA0BBB0B9C01AD0154 -:1016900084E0220F331F441F551F8A95D1F760E065 -:1016A00074E284EF90E00E94EF0B215031093093F7 -:1016B000C5002093C40088E18093C10086E0809338 -:1016C000C200E0ECF0E080818D7F808308959091EE -:1016D000C00095FFFCCF8093C6000895CF93C82F1C -:1016E0008A3019F48DE00E94670B8C2F0E94670BE3 -:1016F00080E090E0CF9108958091C00087FFFCCFFB -:101700008091C600089580E895E20E94420B80E037 -:1017100091E090933703809336030895FF920F93DF -:101720001F93CF93DF93CDB7DEB7A4970FB6F8948E -:10173000DEBF0FBECDBF86E0EEE0F1E0DE015196E8 -:1017400001900D928A95E1F72CEA2F8F9AE198A3E8 -:1017500081E989A33DEC3AA32B8F9C8F8D8F8EEF6F -:101760008E8F8FEF8F8B888F898F1A8E0E94830BBD -:101770009E01295E3F4FAE01455E5F4FBE01615E37 -:101780007F4FCE0141960E94B20A20E044EE57E01E -:1017900062E080E00E946406F82EFF2071F08E0166 -:1017A0000D5D1F4F20E030E040E150E0BE016F5F73 -:1017B0007F4F80E00E94F008F0CF84E191E00E942A -:1017C000270C80E090E0A4960FB6F894DEBF0FBE21 -:1017D000CDBFDF91CF911F910F91FF900895A1E2AE -:1017E0001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F9B -:1017F000FF1FA217B307E407F50720F0A21BB30BE6 -:10180000E40BF50B661F771F881F991F1A9469F761 -:1018100060957095809590959B01AC01BD01CF01BD -:101820000895A0E0B0E0E7E1FCE00C94E50EAE0125 -:101830004B5F5F4FFA0161917191AF018091360367 -:10184000909137030E94570CE2E00C94010F0F9324 -:101850001F93CF93DF93E0913603F09137032381F9 -:1018600021FF1BC08C01D0E0C0E0F80181918F0105 -:101870006091360370913703DB011896ED91FC916E -:101880001997882331F00995892B79F3DFEFCFEF92 -:10189000ECCF8AE00995892B19F08FEF9FEF02C0FA -:1018A0008D2F9C2FDF91CF911F910F910895ACE068 -:1018B000B0E0EDE5FCE00C94D50E7C016B018A01F3 -:1018C000FC0117821682838181FFBDC1CE01019682 -:1018D0004C01F7019381F60193FD859193FF81916E -:1018E0006F01882309F4ABC1853239F493FD8591EA -:1018F00093FF81916F01853229F4B70190E00E9436 -:101900003F0EE7CF512C312C20E02032A0F48B3257 -:1019100069F030F4803259F0833269F420612CC0D0 -:101920008D3239F0803339F4216026C02260246082 -:1019300023C0286021C027FD27C030ED380F3A3082 -:1019400078F426FF06C0FAE05F9E300D1124532E76 -:1019500013C08AE0389E300D1124332E20620CC053 -:101960008E3221F426FD6BC1206406C08C3611F442 -:10197000206802C0883641F4F60193FD859193FFFB -:1019800081916F018111C1CF982F9F7D9554933024 -:1019900028F40C5F1F4FFFE3F9830DC0833631F04D -:1019A000833771F0833509F05BC022C0F801808174 -:1019B00089830E5F1F4F44244394512C540115C05A -:1019C0003801F2E06F0E711CF801A080B18026FF93 -:1019D00003C0652D70E002C06FEF7FEFC5012C875B -:1019E0000E94340E2C0183012C852F77222E17C0E4 -:1019F0003801F2E06F0E711CF801A080B18026FF63 -:101A000003C0652D70E002C06FEF7FEFC5012C872A -:101A10000E94290E2C012C852068222E830123FC94 -:101A20001BC0832D90E048165906B0F4B70180E240 -:101A300090E00E943F0E3A94F4CFF50127FC859187 -:101A400027FE81915F01B70190E00E943F0E3110A7 -:101A50003A94F1E04F1A51084114510471F7E5C06E -:101A6000843611F0893639F5F80127FF07C0608107 -:101A70007181828193810C5F1F4F08C060817181E9 -:101A8000072E000C880B990B0E5F1F4F2F76722EBE -:101A900097FF09C090958095709561957F4F8F4F06 -:101AA0009F4F2068722E2AE030E0A4010E94770E3A -:101AB000A82EA81844C0853729F42F7EB22E2AE01C -:101AC00030E025C0F22FF97FBF2E8F36C1F018F419 -:101AD000883579F0B4C0803719F0883721F0AFC06D -:101AE0002F2F2061B22EB4FE0DC08B2D8460B82E36 -:101AF00009C024FF0AC09F2F9660B92E06C028E0B7 -:101B000030E005C020E130E002C020E132E0F80121 -:101B1000B7FE07C060817181828193810C5F1F4F86 -:101B200006C06081718180E090E00E5F1F4FA401CC -:101B30000E94770EA82EA818FB2DFF777F2E76FE29 -:101B40000BC0372D3E7FA51450F474FE0AC072FC02 -:101B500008C0372D3E7E05C0BA2C372D03C0BA2CE5 -:101B600001C0B52C34FF0DC0FE01EA0DF11D8081CE -:101B7000803311F4397E09C032FF06C0B394B394A8 -:101B800004C0832F867809F0B39433FD13C030FF6F -:101B900006C05A2CB31418F4530C5B18B32CB314AE -:101BA00068F4B70180E290E03C870E943F0EB39456 -:101BB0003C85F5CFB31410F43B1801C0312C34FF31 -:101BC00012C0B70180E390E03C870E943F0E3C8545 -:101BD00032FF17C031FD03C088E790E002C088E5FE -:101BE00090E0B7010CC0832F867859F031FF02C016 -:101BF0008BE201C080E237FD8DE2B70190E00E94E8 -:101C00003F0EA51438F4B70180E390E00E943F0E28 -:101C10005A94F7CFAA94F401EA0DF11D8081B7011F -:101C200090E00E943F0EA110F5CF332009F451CE71 -:101C3000B70180E290E00E943F0E3A94F6CFF701A0 -:101C40008681978102C08FEF9FEF2C96E2E10C9482 -:101C5000F10EFC010590615070400110D8F780959D -:101C600090958E0F9F1F0895FC0161507040019068 -:101C70000110D8F7809590958E0F9F1F08950F93B0 -:101C80001F93CF93DF93FB01238121FD03C08FEFCF -:101C90009FEF28C022FF16C04681578124813581DD -:101CA0004217530744F4A081B1819D012F5F3F4F3C -:101CB000318320838C93268137812F5F3F4F378379 -:101CC000268310C0EB01092F182F0084F185E02D29 -:101CD0000995892BE1F68E819F8101969F838E83E2 -:101CE000812F902FDF91CF911F910F910895FA01CD -:101CF000AA27283051F1203181F1E8946F936E7F4B -:101D00006E5F7F4F8F4F9F4FAF4FB1E03ED0B4E03B -:101D10003CD0670F781F891F9A1FA11D680F791F7C -:101D20008A1F911DA11D6A0F711D811D911DA11D8D -:101D300020D009F468943F912AE0269F112430199D -:101D4000305D3193DEF6CF010895462F4770405D38 -:101D50004193B3E00FD0C9F7F6CF462F4F70405DE7 -:101D60004A3318F0495D31FD4052419302D0A9F742 -:101D7000EACFB4E0A6959795879577956795BA953C -:101D8000C9F700976105710508959B01AC010A2E02 -:101D900006945795479537952795BA95C9F7620FD9 -:101DA000731F841F951FA01D08952F923F924F927D -:101DB0005F926F927F928F929F92AF92BF92CF92DB -:101DC000DF92EF92FF920F931F93CF93DF93CDB7E4 -:101DD000DEB7CA1BDB0B0FB6F894DEBF0FBECDBF5C -:101DE00009942A88398848885F846E847D848C842D -:101DF0009B84AA84B984C884DF80EE80FD800C8136 -:101E00001B81AA81B981CE0FD11D0FB6F894DEBF18 -:0C1E10000FBECDBFED010895F894FFCF88 -:101E1C0000000002000000006E0B00000000A0BDDE -:101E2C00CDDDEDFD536F7274696520626F75636C67 -:101E3C006500737973696E697428290D00436861B4 -:101E4C006E6E656C203A2053454E44204D454D2016 -:101E5C0053495A45203A2052454356204D454D2072 -:101E6C0053495A450D002564203A20252E347820FC -:101E7C003A20252E3478203A20252E3478203A200A -:101E8C00252E34780D0A004953525F52583A20726D -:101E9C00645F707472203A20252E34780D0A00632A -:101EAC006C6F736528290D00736F636B657428293B -:101EBC000D00536E5F5352203D20252E3278202C7E -:101ECC002050726F746F636F6C203D20252E32781A -:101EDC000D0A006C697374656E28290D00466169E2 -:101EEC006C5B696E76616C69642069702C706F72C2 -:101EFC00745D0D00646973636F6E6E65637428297D -:101F0C000D00736F636B65742025642066726565C4 -:101F1C0073697A652825642920656D707479206F42 -:101F2C0072206572726F720D0A00534F434B5F4300 -:101F3C004C4F5345442E0D007265637628290D00D5 -:101F4C0073656E64746F28290D00256420466169E1 -:101F5C006C5B252E32782E252E32782E252E32785B -:101F6C002E252E32782C20252E642C2025645D0DF8 -:101F7C000A007265637666726F6D28290D005544F0 -:101F8C0050206D736720617272697665640D007301 -:101F9C006F7572636520506F7274203A2025640D42 -:101FAC000A00736F75726365204950203A202564CE -:101FBC002E25642E25642E25640D0A0049502052CE -:101FCC004157206D736720617272697665640D00EC -:101FDC007265637666726F6D282920656E64202E9B -:101FEC002E0D0069676D7073656E6428290D0025D0 -:101FFC0064204661696C5B25645D0D0A0069676D40 -:0E200C007073656E64206661696C2E0D0000B5 +:100DB000DF90CF9008950F931F93CF93DF93C82FA9 +:100DC0008AEC91E00E94B90CD0E02496DC2FCC276D +:100DD0008E010D5F1F4FC8010E94B3008331D9F40B +:100DE000219662E0CE010E949500CE010E94B300E0 +:100DF0008111FBCFC8010E94B3001F928F9384ED35 +:100E000091E09F938F930E94A30C0F900F900F90EF +:100E10000F9081E005C082EE91E00E94B90C80E065 +:100E2000DF91CF911F910F910895CF93DF93C82F3A +:100E300089EF91E00E94B90CD0E0DC2FCC27CD5F88 +:100E4000DB4FCE010E94B3008431B1F4CE010E9489 +:100E5000B3008731D9F7CE010E94B3001F928F9360 +:100E600084ED91E09F938F930E94A30C0F900F90BD +:100E70000F900F9081E005C083E092E00E94B90CD2 +:100E800080E0DF91CF910895EF92FF920F931F932F +:100E9000CF93DF93C82F8B017A018BE192E00E9400 +:100EA000B90CF80160816F3F51F481818F3F99F453 +:100EB00082818F3F81F483818F3F69F40FC061117C +:100EC0000AC0F8018181811106C08281811103C0AD +:100ED0008381882319F0E114F10431F482EE91E06A +:100EE0000E94B90C80E02FC0D0E02496DC2FCC27E4 +:100EF000CE010C960E949500F8016181CE010D96FD +:100F00000E949500F8016281CE010E960E94950024 +:100F1000F8016381CE010F960E9495006F2DCE01DE +:100F200040960E9495006E2DCE0141960E9495003C +:100F3000219664E0CE010E949500CE010E94B3008C +:100F40008111FBCF81E0DF91CF911F910F91FF9035 +:100F5000EF900895CF93DF93C82F88E192E00E942D +:100F6000B90CD0E0DC2FCC27CF5FDB4F68E0CE019F +:100F70000E949500CE010E94B3008111FBCFDF914A +:100F8000CF9108958F929F92AF92BF92CF92DF92AE +:100F9000EF92FF921F93CF93DF93182F4B017A01AB +:100FA00083E493E00E94B90C812F0E9468008E15A3 +:100FB0009F0520F4812F0E9468007C01C12FD0E0A2 +:100FC0002496DC2FCC275E0183E0A80EB11C812F74 +:100FD0000E94AF046C01C5010E94B3008731A9F0E3 +:100FE0008C3199F0DF92CF921F921F9386E292E0AC +:100FF0009F938F930E94A30C0F900F900F900F90D0 +:101000000F900F90E12CF12C03C0CE14DF04F8F206 +:10101000A701B401812F0E9467056E018FEFC81AE6 +:10102000D80A60E2C6010E949500C6010E94B30082 +:101030008111FBCF2296CE010E94B30084FD0FC028 +:10104000C5010E94B3008111F6CF8EE492E00E94A8 +:10105000B90C812F0E94420680E090E005C060E15B +:10106000CE010E949500C701DF91CF911F91FF90A3 +:10107000EF90DF90CF90BF90AF909F908F900895AA +:10108000BF92CF92DF92EF92FF920F931F93CF9375 +:10109000DF93B82E6B018A01C82FD0E02496DC2F95 +:1010A000CC277E0183E0E80EF11CC7010E94B3004B +:1010B000873191F0C7010E94B3001F928F938CE596 +:1010C00092E09F938F930E94A30C0F900F900F902C +:1010D0000F908FEF9FEF26C080E00E94EB047C0111 +:1010E00018161906ECF48FE692E00E94B90CE0168F +:1010F000F10620F00115110589F001C08701A80152 +:10110000B6018B2D0E94F505219660E4CE010E9468 +:101110009500CE010E94B3008111FBCFC80102C02F +:1011200080E090E0DF91CF911F910F91FF90EF90C1 +:10113000DF90CF90BF9008958F929F92BF92CF92F1 +:10114000DF92EF92FF920F931F93CF93DF93B82E0E +:101150004B01EA01790187E792E00E94B90C8B2DDF +:101160000E9468008C179D0728F48B2D0E94680050 +:101170006C0101C06E01F7016081611109C08181BC +:10118000811106C08281811103C08381882331F0DF +:101190000115110519F0C114D10429F5DF93CF937E +:1011A0001F930F93F70183811F928F9382811F9268 +:1011B0008F9381811F928F931F926F931F92BF9283 +:1011C00081E892E09F938F930E94A30C82EE91E0BE +:1011D0000E94B90C8DB79EB740960FB6F8949EBF8B +:1011E0000FBE8DBF49C0CB2DD0E02496DC2FCC277D +:1011F000CE010C960E949500F7016181CE010D96FB +:101200000E949500F7016281CE010E960E94950022 +:10121000F7016381CE010F960E949500612FCE01E8 +:1012200040960E949500602FCE0141960E94950045 +:10123000A601B4018B2D0E9467058E010F5F1F4F21 +:1012400060E2C8010E949500C8010E94B3008111AC +:10125000FBCF2296CE010E94B30084FD10C0CE01C8 +:101260000E94B30083FFF6CF8DE593E00E94B90C96 +:1012700068E1CE010E94950080E090E005C060E149 +:10128000CE010E949500C601DF91CF911F910F9171 +:10129000FF90EF90DF90CF90BF909F908F90089538 +:1012A0002F923F924F925F926F927F928F929F9276 +:1012B000AF92BF92CF92DF92EF92FF920F931F9364 +:1012C000CF93DF93CDB7DEB72A970FB6F894DEBF82 +:1012D0000FBECDBF782E4B016A0179011A870987AD +:1012E0000E94EB04892B09F42BC189EA92E00E9449 +:1012F000B90C872D0E94EB04682E392ECD2809F4F5 +:1013000017C1472C512C84E0480E511C542C442406 +:10131000520198E2A90EB11CC5010E94B300082F2A +:1013200010E0102F00276201E9E2CE0ED11CC601A9 +:101330000E94B300080F111D3F926F921F930F93ED +:1013400085EB92E09F938F930E94A30CC2010E94B1 +:10135000B3000F900F900F900F900F900F90877029 +:10136000833009F464C0843009F4ABC0823009F0E2 +:10137000D0C028E030E0AE014F5F5F4FB801872D4D +:101380000E94AE051801F8E02F0E311C8981F7018B +:1013900080838A8181838B8182838C8183838D8109 +:1013A00090E0982F88272E81820F911DE985FA857C +:1013B000918380830F8110E0102F00278885080F0C +:1013C000111D1F930F9385ED92E09F938F930E94C1 +:1013D000A30CE985FA8581818F9380818F938BEEB1 +:1013E00092E09F938F930E94A30CF70183811F9239 +:1013F0008F9382811F928F9381811F928F9380811F +:101400001F928F938EEF92E09F938F930E94A30C75 +:101410009801A401B101872D0E94AE057101E00E73 +:10142000F11E6F2DC5010E9495006E2D41C026E072 +:1014300030E0AE014F5F5F4FB801872D0E94AE05CF +:10144000180196E0290E311C8981F70180838A8179 +:1014500081838B8182838C8183830D8110E0102FA7 +:1014600000278E81080F111D88E193E00E94B90CBE +:10147000F70183811F928F9382811F928F938181C5 +:101480001F928F9380811F928F938EEF92E09F9394 +:101490008F930E94A30C9801A401B101872D0E9493 +:1014A000AE05200E311E632DC5010E949500622DF0 +:1014B000C6010E9495000FB6F894DEBF0FBECDBFE7 +:1014C0002AC022E030E0AE014F5F5F4FB801872DA8 +:1014D0000E94AE05780192E0E90EF11C098110E04E +:1014E000902F88270A8110E002501109080F191F58 +:1014F0009801A401B701872D0E94AE05E00EF11EF0 +:101500006F2DC5010E9495006E2DC6010E949500A9 +:1015100002C000E010E0EFEF4E1A5E0A60E4C20184 +:101520000E949500C2010E94B3008111FBCF02C04E +:1015300000E010E08CE293E00E94B90CC80102C008 +:1015400080E090E02A960FB6F894DEBF0FBECDBFC4 +:10155000DF91CF911F910F91FF90EF90DF90CF908F +:10156000BF90AF909F908F907F906F905F904F90C3 +:101570003F902F900895CF92DF92FF920F931F9389 +:10158000CF93DF93F82E6B01EA018FE393E00E9483 +:10159000B90C8F2D0E9468008C179D0728F48F2DA1 +:1015A0000E9468008C0101C08E010115110589F4AB +:1015B0001F921F92DF93CF938BE493E09F938F93BF +:1015C0000E94A30C0F900F900F900F900F900F9010 +:1015D00030C0A801B6018F2D0E946705CF2DD0E045 +:1015E0002496DC2FCC276E018FEFC81AD80A60E250 +:1015F000C6010E949500C6010E94B3008111FBCF75 +:101600006E0182E0C80ED11C2396C6010E94B30071 +:1016100084FD12C0CE010E94B300C6010E94B30037 +:1016200083FFF3CF89E593E00E94B90C8F2D0E94D0 +:10163000420680E090E005C060E1C6010E9495008E +:10164000C801DF91CF911F910F91FF90DF90CF9054 +:101650000895CF92DF92EF92FF920F931F93CF9353 +:10166000DF936C017B018A01E9010E947E0265E53E +:1016700085E50E942201C6010E94CD02C7010E9499 +:10168000F002C8010E948102CE01DF91CF911F912B +:101690000F91FF90EF90DF90CF900C94B402809365 +:1016A000BB0084E88093BC008091BC0087FFFCCF26 +:1016B00008951092B9008CE08093B80084E0809384 +:1016C000BC000895CF9394EA9093BC009091BC0025 +:1016D00097FFFCCF9091B900987F983011F080E08F +:1016E00015C0C62F880F0E944F0B8091B900887FCC +:1016F0008831A9F78C2F0E944F0B8091B900887F09 +:10170000883269F784E98093BC0081E0CF91089525 +:10171000CF93DF9394EA9093BC009091BC0097FF25 +:10172000FCCF9091B900987F983011F080E01EC0F6 +:10173000C42FD62F880F0E944F0B8091B900887F4D +:101740008831A1F78D2F0E944F0B8091B900887FBF +:10175000883261F78C2F0E944F0B8091B900887FEF +:10176000883221F784E98093BC0081E0DF91CF913A +:101770000895092E000CAA0BBB0B9C01AD0184E05F +:10178000220F331F441F551F8A95D1F760E074E282 +:1017900084EF90E00E94810C215031093093C50004 +:1017A0002093C40088E18093C10086E08093C2004A +:1017B000E0ECF0E080818D7F808308959091C000FF +:1017C00095FFFCCF8093C6000895CF93C82F8A3031 +:1017D00019F48DE00E94DE0B8C2F0E94DE0B80E05E +:1017E00090E0CF9108958091C00087FFFCCF809159 +:1017F000C600089580E895E20E94B90B80E091E070 +:101800009093A3038093A2030895CF93DF93CDB762 +:10181000DEB7A2970FB6F894DEBF0FBECDBF86E04D +:10182000EEE0F1E0DE01519601900D928A95E1F72C +:101830002CEA2F8F9AE198A381E989A33DEC3AA382 +:101840002B8F9C8F8D8F8EEF8E8F8FEF8F8B888F4E +:10185000898F1A8E87E0E4E1F1E0DE0111960190B4 +:101860000D928A95E1F7FE01389689E0DF011D921D +:101870008A95E9F70E94FA0B9E01295E3F4FAE015F +:10188000455E5F4FBE01615E7F4FCE0141960E9473 +:10189000290B20E044EE57E062E080E00E946406FD +:1018A000882321F120E044EE57E061E081E00E94CE +:1018B00064068823D9F081E00E94DB06882391F03A +:1018C00081E00E941507882369F084E291E00E947C +:1018D000B90C40E150E0BE016F5F7F4F81E00E9494 +:1018E000C207E9CF81E00E944206DCCF8FEF9FEF75 +:1018F000A2960FB6F894DEBF0FBECDBFDF91CF9199 +:101900000895A1E21A2EAA1BBB1BFD010DC0AA1F40 +:10191000BB1FEE1FFF1FA217B307E407F50720F058 +:10192000A21BB30BE40BF50B661F771F881F991FD3 +:101930001A9469F760957095809590959B01AC011C +:10194000BD01CF010895A0E0B0E0E9EAFCE00C940D +:10195000770FAE014B5F5F4FFA0161917191AF015B +:101960008091A2039091A3030E94E90CE2E00C9401 +:10197000930F0F931F93CF93DF93E091A203F09106 +:10198000A303238121FF1BC08C01D0E0C0E0F8013C +:1019900081918F016091A2037091A303DB011896DE +:1019A000ED91FC911997882331F00995892B79F3F2 +:1019B000DFEFCFEFECCF8AE00995892B19F08FEF9D +:1019C0009FEF02C08D2F9C2FDF91CF911F910F9120 +:1019D0000895ACE0B0E0EFEEFCE00C94670F7C0102 +:1019E0006B018A01FC0117821682838181FFBDC1D0 +:1019F000CE0101964C01F7019381F60193FD85918B +:101A000093FF81916F01882309F4ABC1853239F4CA +:101A100093FD859193FF81916F01853229F4B70180 +:101A200090E00E94D10EE7CF512C312C20E02032E3 +:101A3000A0F48B3269F030F4803259F0833269F4CB +:101A400020612CC08D3239F0803339F4216026C0FA +:101A50002260246023C0286021C027FD27C030ED0C +:101A6000380F3A3078F426FF06C0FAE05F9E300D5A +:101A70001124532E13C08AE0389E300D1124332ECA +:101A800020620CC08E3221F426FD6BC1206406C09A +:101A90008C3611F4206802C0883641F4F60193FDBB +:101AA000859193FF81916F018111C1CF982F9F7D07 +:101AB0009554933028F40C5F1F4FFFE3F9830DC05A +:101AC000833631F0833771F0833509F05BC022C073 +:101AD000F801808189830E5F1F4F44244394512C69 +:101AE000540115C03801F2E06F0E711CF801A0809E +:101AF000B18026FF03C0652D70E002C06FEF7FEF5D +:101B0000C5012C870E94C60E2C0183012C852F77DE +:101B1000222E17C03801F2E06F0E711CF801A08070 +:101B2000B18026FF03C0652D70E002C06FEF7FEF2C +:101B3000C5012C870E94BB0E2C012C852068222E0B +:101B4000830123FC1BC0832D90E048165906B0F496 +:101B5000B70180E290E00E94D10E3A94F4CFF501F3 +:101B600027FC859127FE81915F01B70190E00E94DB +:101B7000D10E31103A94F1E04F1A5108411451043A +:101B800071F7E5C0843611F0893639F5F80127FF81 +:101B900007C060817181828193810C5F1F4F08C0F3 +:101BA00060817181072E000C880B990B0E5F1F4F0F +:101BB0002F76722E97FF09C090958095709561954C +:101BC0007F4F8F4F9F4F2068722E2AE030E0A40194 +:101BD0000E94090FA82EA81844C0853729F42F7E2B +:101BE000B22E2AE030E025C0F22FF97FBF2E8F36CB +:101BF000C1F018F4883579F0B4C0803719F088370F +:101C000021F0AFC02F2F2061B22EB4FE0DC08B2D5E +:101C10008460B82E09C024FF0AC09F2F9660B92E99 +:101C200006C028E030E005C020E130E002C020E13D +:101C300032E0F801B7FE07C0608171818281938133 +:101C40000C5F1F4F06C06081718180E090E00E5FE5 +:101C50001F4FA4010E94090FA82EA818FB2DFF7783 +:101C60007F2E76FE0BC0372D3E7FA51450F474FEF8 +:101C70000AC072FC08C0372D3E7E05C0BA2C372D35 +:101C800003C0BA2C01C0B52C34FF0DC0FE01EA0D13 +:101C9000F11D8081803311F4397E09C032FF06C006 +:101CA000B394B39404C0832F867809F0B39433FDC2 +:101CB00013C030FF06C05A2CB31418F4530C5B1831 +:101CC000B32CB31468F4B70180E290E03C870E9423 +:101CD000D10EB3943C85F5CFB31410F43B1801C07A +:101CE000312C34FF12C0B70180E390E03C870E94A2 +:101CF000D10E3C8532FF17C031FD03C088E790E06C +:101D000002C088E590E0B7010CC0832F867859F0B7 +:101D100031FF02C08BE201C080E237FD8DE2B701E6 +:101D200090E00E94D10EA51438F4B70180E390E052 +:101D30000E94D10E5A94F7CFAA94F401EA0DF11D36 +:101D40008081B70190E00E94D10EA110F5CF332021 +:101D500009F451CEB70180E290E00E94D10E3A948E +:101D6000F6CFF7018681978102C08FEF9FEF2C9607 +:101D7000E2E10C94830FFC0105906150704001106A +:101D8000D8F7809590958E0F9F1F0895FC016150A4 +:101D9000704001900110D8F7809590958E0F9F1F8D +:101DA00008950F931F93CF93DF93FB01238121FDB0 +:101DB00003C08FEF9FEF28C022FF16C046815781D6 +:101DC000248135814217530744F4A081B1819D01DC +:101DD0002F5F3F4F318320838C93268137812F5F84 +:101DE0003F4F3783268310C0EB01092F182F008443 +:101DF000F185E02D0995892BE1F68E819F81019671 +:101E00009F838E83812F902FDF91CF911F910F9110 +:101E10000895FA01AA27283051F1203181F1E89480 +:101E20006F936E7F6E5F7F4F8F4F9F4FAF4FB1E0CD +:101E30003ED0B4E03CD0670F781F891F9A1FA11DC8 +:101E4000680F791F8A1F911DA11D6A0F711D811DC9 +:101E5000911DA11D20D009F468943F912AE0269F8E +:101E600011243019305D3193DEF6CF010895462FED +:101E70004770405D4193B3E00FD0C9F7F6CF462FCE +:101E80004F70405D4A3318F0495D31FD4052419337 +:101E900002D0A9F7EACFB4E0A695979587957795F4 +:101EA0006795BA95C9F700976105710508959B017B +:101EB000AC010A2E06945795479537952795BA9504 +:101EC000C9F7620F731F841F951FA01D08952F92DD +:101ED0003F924F925F926F927F928F929F92AF92BA +:101EE000BF92CF92DF92EF92FF920F931F93CF9307 +:101EF000DF93CDB7DEB7CA1BDB0B0FB6F894DEBF9E +:101F00000FBECDBF09942A88398848885F846E84C3 +:101F10007D848C849B84AA84B984C884DF80EE800D +:101F2000FD800C811B81AA81B981CE0FD11D0FB616 +:101F3000F894DEBF0FBECDBFED010895F894FFCF3A +:101F40000000000200000000E50B00000000A0BD42 +:101F5000CDDDEDFD49276D206F6B00000000000016 +:101F6000000000007465737400737973696E69749E +:101F700028290D004368616E6E656C203A20534538 +:101F80004E44204D454D2053495A45203A20524554 +:101F90004356204D454D2053495A450D0025642098 +:101FA0003A20252E3478203A20252E3478203A20E5 +:101FB000252E3478203A20252E34780D0A004953F6 +:101FC000525F52583A2072645F707472203A202532 +:101FD0002E34780D0A00636C6F736528290D007329 +:101FE0006F636B657428290D00536E5F5352203D5B +:101FF00020252E3278202C2050726F746F636F6C06 +:10200000203D20252E32780D0A006C697374656EB0 +:1020100028290D00737461747573203D2025780D97 +:102020000A004661696C5B696E76616C696420695F +:10203000702C706F72745D0D00616363657074283D +:10204000290D004661696C5B6E6F74206C69737456 +:10205000656E696E675D0D00646973636F6E6E65B2 +:10206000637428290D00736F636B657420256420E9 +:102070006672656573697A652825642920656D70C7 +:102080007479206F72206572726F720D0A00534F5F +:10209000434B5F434C4F5345442E0D004261642037 +:1020A000737461747573203D20253032780A007294 +:1020B00065637628290D0073656E64746F28290D99 +:1020C000002564204661696C5B252E32782E252E12 +:1020D00032782E252E32782E252E32782C20252E61 +:1020E000642C2025645D0D0A007265637666726F4C +:1020F0006D28290D004953525F52583A2072645F8F +:10210000707472203A20252E34782073697A653DE8 +:1021100025640D0A00554450206D73672023256403 +:1021200020617272697665640D0A00736F7572635F +:102130006520506F7274203A2025750D0A00736F68 +:1021400075726365204950203A2025642E25642E3F +:1021500025642E25640D0A00495020524157206DF8 +:10216000736720617272697665640D0072656376CB +:1021700066726F6D282920656E64202E2E0D006911 +:10218000676D7073656E6428290D002564204661B3 +:10219000696C5B25645D0D0A0069676D7073656E1F +:0A21A00064206661696C2E0D0000DA :00000001FF diff --git a/Tangible/tangibleInterface.o b/Tangible/tangibleInterface.o index cddb5cb..ce557da 100644 Binary files a/Tangible/tangibleInterface.o and b/Tangible/tangibleInterface.o differ diff --git a/Tangible/w5100.c b/Tangible/w5100.c old mode 100755 new mode 100644 index 4972f94..4972f94 --- a/Tangible/w5100.c +++ b/Tangible/w5100.c diff --git a/Tangible/w5100.h b/Tangible/w5100.h old mode 100755 new mode 100644 index c90a979..c90a979 --- a/Tangible/w5100.h +++ b/Tangible/w5100.h -- libgit2 0.21.2