ModbusTCP Light This version utilize lwIP library with the minimal implementation of Modbus TCP. Error processing hasn\\\'t been implemented yet.

Dependencies:   mbed lwip

Committer:
paleskyjp
Date:
Fri Mar 16 08:38:12 2012 +0000
Revision:
1:59cee932f289
Parent:
0:8ee5ec4bcec2

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
paleskyjp 0:8ee5ec4bcec2 1 /*
paleskyjp 0:8ee5ec4bcec2 2 * FreeModbus Libary: mbed Port
paleskyjp 0:8ee5ec4bcec2 3 * Copyright (C) 2006 Christian Walter <wolti@sil.at>
paleskyjp 0:8ee5ec4bcec2 4 *
paleskyjp 0:8ee5ec4bcec2 5 * This library is free software; you can redistribute it and/or
paleskyjp 0:8ee5ec4bcec2 6 * modify it under the terms of the GNU Lesser General Public
paleskyjp 0:8ee5ec4bcec2 7 * License as published by the Free Software Foundation; either
paleskyjp 0:8ee5ec4bcec2 8 * version 2.1 of the License, or (at your option) any later version.
paleskyjp 0:8ee5ec4bcec2 9 *
paleskyjp 0:8ee5ec4bcec2 10 * This library is distributed in the hope that it will be useful,
paleskyjp 0:8ee5ec4bcec2 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
paleskyjp 0:8ee5ec4bcec2 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
paleskyjp 0:8ee5ec4bcec2 13 * Lesser General Public License for more details.
paleskyjp 0:8ee5ec4bcec2 14 *
paleskyjp 0:8ee5ec4bcec2 15 * You should have received a copy of the GNU Lesser General Public
paleskyjp 0:8ee5ec4bcec2 16 * License along with this library; if not, write to the Free Software
paleskyjp 0:8ee5ec4bcec2 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
paleskyjp 0:8ee5ec4bcec2 18 *
paleskyjp 0:8ee5ec4bcec2 19 * File: $Id: porttcp.c,v 1.1 2006/08/30 23:18:07 wolti Exp $
paleskyjp 0:8ee5ec4bcec2 20 *
paleskyjp 0:8ee5ec4bcec2 21 * modified by Yuji Hosogaya 3-16-2012
paleskyjp 0:8ee5ec4bcec2 22 *
paleskyjp 0:8ee5ec4bcec2 23 * Originally this file was porttcp.c, then combined with other files
paleskyjp 0:8ee5ec4bcec2 24 * in order to make a light version of Modbus TCP.
paleskyjp 0:8ee5ec4bcec2 25 */
paleskyjp 0:8ee5ec4bcec2 26 #include "mbtcp.h"
paleskyjp 0:8ee5ec4bcec2 27
paleskyjp 0:8ee5ec4bcec2 28 Ethernet ethernet;
paleskyjp 0:8ee5ec4bcec2 29 struct netif netif_data;
paleskyjp 0:8ee5ec4bcec2 30
paleskyjp 0:8ee5ec4bcec2 31 /* ----------------------- MBAP Header --------------------------------------*/
paleskyjp 0:8ee5ec4bcec2 32 #define MB_TCP_UID 6
paleskyjp 0:8ee5ec4bcec2 33 #define MB_TCP_LEN 4
paleskyjp 0:8ee5ec4bcec2 34 #define MB_TCP_FUNC 7
paleskyjp 0:8ee5ec4bcec2 35
paleskyjp 0:8ee5ec4bcec2 36 /* ----------------------- Defines -----------------------------------------*/
paleskyjp 0:8ee5ec4bcec2 37 #define MB_TCP_DEFAULT_PORT 502 /* TCP listening port. */
paleskyjp 0:8ee5ec4bcec2 38 #define MB_TCP_BUF_SIZE ( 256 + 7 ) /* Must hold a complete Modbus TCP frame. */
paleskyjp 0:8ee5ec4bcec2 39
paleskyjp 0:8ee5ec4bcec2 40 /* ----------------------- Static variables ---------------------------------*/
paleskyjp 0:8ee5ec4bcec2 41 static UCHAR aucTCPBuf[MB_TCP_BUF_SIZE];
paleskyjp 0:8ee5ec4bcec2 42 static USHORT usTCPBufPos;
paleskyjp 0:8ee5ec4bcec2 43
paleskyjp 0:8ee5ec4bcec2 44 /* ----------------------- Begin implementation -----------------------------*/
paleskyjp 0:8ee5ec4bcec2 45 void EventPost(struct tcp_pcb *pcb)
paleskyjp 0:8ee5ec4bcec2 46 {
paleskyjp 0:8ee5ec4bcec2 47 USHORT usAddress,usNRegs;
paleskyjp 0:8ee5ec4bcec2 48 UCHAR txbuf[MB_TCP_BUF_SIZE];
paleskyjp 0:8ee5ec4bcec2 49 int len=0;
paleskyjp 0:8ee5ec4bcec2 50 UCHAR ucTemp;
paleskyjp 0:8ee5ec4bcec2 51 MB_STRUCT *rxmbs=(MB_STRUCT *)aucTCPBuf;
paleskyjp 0:8ee5ec4bcec2 52 MB_STRUCT *txmbs=(MB_STRUCT *)txbuf;
paleskyjp 0:8ee5ec4bcec2 53 MB_WORD_REQ *wd_req=(MB_WORD_REQ *)GET_DATA_PTR(rxmbs);
paleskyjp 0:8ee5ec4bcec2 54 MB_WORD_RES *wd_res=(MB_WORD_RES *)GET_DATA_PTR(txmbs);
paleskyjp 0:8ee5ec4bcec2 55
paleskyjp 0:8ee5ec4bcec2 56 usAddress=TO_USHORT(wd_req->ADDR_H,wd_req->ADDR_L)+1;
paleskyjp 0:8ee5ec4bcec2 57 usNRegs=TO_USHORT(wd_req->LEN_H,wd_req->LEN_L);
paleskyjp 0:8ee5ec4bcec2 58
paleskyjp 0:8ee5ec4bcec2 59 printf("TID=%04X | PID=%04X | LEN=%04X | UID=%02X | FUNC=%02X\nDATA=",
paleskyjp 0:8ee5ec4bcec2 60 GET_TID(rxmbs), GET_PID(rxmbs), GET_LEN(rxmbs), GET_UID(rxmbs), GET_FUNC(rxmbs) );
paleskyjp 0:8ee5ec4bcec2 61 for(int i=0;i<usTCPBufPos-8;i++){
paleskyjp 0:8ee5ec4bcec2 62 printf("%02X",aucTCPBuf[i+8]);
paleskyjp 0:8ee5ec4bcec2 63 }
paleskyjp 0:8ee5ec4bcec2 64 printf("\n");
paleskyjp 0:8ee5ec4bcec2 65
paleskyjp 0:8ee5ec4bcec2 66 switch(GET_FUNC(rxmbs))
paleskyjp 0:8ee5ec4bcec2 67 {
paleskyjp 0:8ee5ec4bcec2 68 case FC_RD_COILS:
paleskyjp 0:8ee5ec4bcec2 69 memcpy((char*)txmbs,(char*)rxmbs,8);
paleskyjp 0:8ee5ec4bcec2 70 wd_res->BYTES=usNRegs*2;
paleskyjp 0:8ee5ec4bcec2 71 len=usNRegs/8;
paleskyjp 0:8ee5ec4bcec2 72 if(usNRegs%8!=0)len++;
paleskyjp 0:8ee5ec4bcec2 73 SET_LEN(txmbs,len+3);
paleskyjp 0:8ee5ec4bcec2 74 wd_res->BYTES=(UCHAR)len;
paleskyjp 0:8ee5ec4bcec2 75
paleskyjp 0:8ee5ec4bcec2 76 eMBRegCoilsCB( (UCHAR *) &wd_res->DATA, usAddress, usNRegs, MB_REG_READ);
paleskyjp 0:8ee5ec4bcec2 77 len+=9;
paleskyjp 0:8ee5ec4bcec2 78 break;
paleskyjp 0:8ee5ec4bcec2 79
paleskyjp 0:8ee5ec4bcec2 80 case FC_RD_DISC_INPUTS:
paleskyjp 0:8ee5ec4bcec2 81 memcpy((char*)txmbs,(char*)rxmbs,8);
paleskyjp 0:8ee5ec4bcec2 82 wd_res->BYTES=usNRegs*2;
paleskyjp 0:8ee5ec4bcec2 83 len=usNRegs/8;
paleskyjp 0:8ee5ec4bcec2 84 if(usNRegs%8!=0)len++;
paleskyjp 0:8ee5ec4bcec2 85 SET_LEN(txmbs,len+3);
paleskyjp 0:8ee5ec4bcec2 86 wd_res->BYTES=(UCHAR)len;
paleskyjp 0:8ee5ec4bcec2 87
paleskyjp 0:8ee5ec4bcec2 88 eMBRegDiscreteCB( (UCHAR *) &wd_res->DATA, usAddress, usNRegs );
paleskyjp 0:8ee5ec4bcec2 89 len+=9;
paleskyjp 0:8ee5ec4bcec2 90 break;
paleskyjp 0:8ee5ec4bcec2 91
paleskyjp 0:8ee5ec4bcec2 92 case FC_RD_HOLDING_REGS:
paleskyjp 0:8ee5ec4bcec2 93 memcpy((char*)txmbs,(char*)rxmbs,8);
paleskyjp 0:8ee5ec4bcec2 94 wd_res->BYTES=usNRegs*2;
paleskyjp 0:8ee5ec4bcec2 95 len=usNRegs*2;
paleskyjp 0:8ee5ec4bcec2 96 SET_LEN(txmbs,len+3);
paleskyjp 0:8ee5ec4bcec2 97
paleskyjp 0:8ee5ec4bcec2 98 eMBRegHoldingCB( (UCHAR *)&wd_res->DATA, usAddress, usNRegs, MB_REG_READ);
paleskyjp 0:8ee5ec4bcec2 99 len+=9;
paleskyjp 0:8ee5ec4bcec2 100 break;
paleskyjp 0:8ee5ec4bcec2 101
paleskyjp 0:8ee5ec4bcec2 102 case FC_RD_INPUT_REGS:
paleskyjp 0:8ee5ec4bcec2 103 memcpy((char*)txmbs,(char*)rxmbs,8);
paleskyjp 0:8ee5ec4bcec2 104 wd_res->BYTES=usNRegs*2;
paleskyjp 0:8ee5ec4bcec2 105 len=usNRegs*2;
paleskyjp 0:8ee5ec4bcec2 106 SET_LEN(txmbs,len+3);
paleskyjp 0:8ee5ec4bcec2 107
paleskyjp 0:8ee5ec4bcec2 108 eMBRegInputCB( (UCHAR *)&wd_res->DATA, usAddress, usNRegs );
paleskyjp 0:8ee5ec4bcec2 109 len+=9;
paleskyjp 0:8ee5ec4bcec2 110 break;
paleskyjp 0:8ee5ec4bcec2 111
paleskyjp 0:8ee5ec4bcec2 112 case FC_WR_SINGLE_COIL:
paleskyjp 0:8ee5ec4bcec2 113 ucTemp=(wd_req->LEN_H==0x00)?0:1;
paleskyjp 0:8ee5ec4bcec2 114 len=12;
paleskyjp 0:8ee5ec4bcec2 115 memcpy((char*)txmbs,(char*)rxmbs,len);
paleskyjp 0:8ee5ec4bcec2 116 eMBRegCoilsCB( &ucTemp, usAddress, 1, MB_REG_WRITE);
paleskyjp 0:8ee5ec4bcec2 117 break;
paleskyjp 0:8ee5ec4bcec2 118
paleskyjp 0:8ee5ec4bcec2 119 case FC_WR_SINGLE_REG:
paleskyjp 0:8ee5ec4bcec2 120 len=12;
paleskyjp 0:8ee5ec4bcec2 121 memcpy((char*)txmbs,(char*)rxmbs,12);
paleskyjp 0:8ee5ec4bcec2 122 eMBRegHoldingCB( &wd_req->LEN_H, usAddress, 1, MB_REG_WRITE );
paleskyjp 0:8ee5ec4bcec2 123 break;
paleskyjp 0:8ee5ec4bcec2 124
paleskyjp 0:8ee5ec4bcec2 125 case FC_WR_MULTI_COILS:
paleskyjp 0:8ee5ec4bcec2 126 len=12;
paleskyjp 0:8ee5ec4bcec2 127 memcpy((char*)txmbs,(char*)rxmbs,len);
paleskyjp 0:8ee5ec4bcec2 128 SET_LEN(txmbs,6);
paleskyjp 0:8ee5ec4bcec2 129
paleskyjp 0:8ee5ec4bcec2 130 eMBRegCoilsCB( &wd_req->DATA[1], usAddress, usNRegs, MB_REG_WRITE);
paleskyjp 0:8ee5ec4bcec2 131 break;
paleskyjp 0:8ee5ec4bcec2 132
paleskyjp 0:8ee5ec4bcec2 133 case FC_WR_MULTI_REGS:
paleskyjp 0:8ee5ec4bcec2 134 len=12;
paleskyjp 0:8ee5ec4bcec2 135 memcpy((char*)txmbs,(char*)rxmbs,len);
paleskyjp 0:8ee5ec4bcec2 136 SET_LEN(txmbs,6);
paleskyjp 0:8ee5ec4bcec2 137
paleskyjp 0:8ee5ec4bcec2 138 eMBRegHoldingCB( &wd_req->DATA[1], usAddress, usNRegs, MB_REG_WRITE);
paleskyjp 0:8ee5ec4bcec2 139 break;
paleskyjp 0:8ee5ec4bcec2 140 case FC_RD_WR_MULTI_REGS:
paleskyjp 0:8ee5ec4bcec2 141 memcpy((char*)txmbs,(char*)rxmbs,8);
paleskyjp 0:8ee5ec4bcec2 142
paleskyjp 0:8ee5ec4bcec2 143 // Write operation
paleskyjp 0:8ee5ec4bcec2 144 eMBRegHoldingCB( &wd_req->DATA[5], usAddress, usNRegs, MB_REG_WRITE);
paleskyjp 0:8ee5ec4bcec2 145
paleskyjp 0:8ee5ec4bcec2 146 // Read operation
paleskyjp 0:8ee5ec4bcec2 147 usAddress=TO_USHORT(wd_req->DATA[0],wd_req->DATA[1])+1;
paleskyjp 0:8ee5ec4bcec2 148 usNRegs=TO_USHORT(wd_req->DATA[2],wd_req->DATA[3]);
paleskyjp 0:8ee5ec4bcec2 149 eMBRegHoldingCB( &wd_res->DATA, usAddress, usNRegs, MB_REG_READ);
paleskyjp 0:8ee5ec4bcec2 150
paleskyjp 0:8ee5ec4bcec2 151 len=usNRegs*2;
paleskyjp 0:8ee5ec4bcec2 152 wd_res->BYTES=len;
paleskyjp 0:8ee5ec4bcec2 153 SET_LEN(txmbs,len+3);
paleskyjp 0:8ee5ec4bcec2 154
paleskyjp 0:8ee5ec4bcec2 155 len+=9;
paleskyjp 0:8ee5ec4bcec2 156 break;
paleskyjp 0:8ee5ec4bcec2 157
paleskyjp 0:8ee5ec4bcec2 158 default:
paleskyjp 0:8ee5ec4bcec2 159 printf("UNSUPPORTED FUNCTION CODE\n");
paleskyjp 0:8ee5ec4bcec2 160 break;
paleskyjp 0:8ee5ec4bcec2 161 }
paleskyjp 0:8ee5ec4bcec2 162 if(len>0){
paleskyjp 0:8ee5ec4bcec2 163 for(int i=0;i<len;i++){
paleskyjp 0:8ee5ec4bcec2 164 printf("%02X ",txbuf[i]);
paleskyjp 0:8ee5ec4bcec2 165 }
paleskyjp 0:8ee5ec4bcec2 166 printf("\n\n");
paleskyjp 0:8ee5ec4bcec2 167 if (tcp_write(pcb, (void *)txbuf, len, 1) == ERR_OK) {
paleskyjp 0:8ee5ec4bcec2 168 tcp_output(pcb);
paleskyjp 0:8ee5ec4bcec2 169 }else{
paleskyjp 0:8ee5ec4bcec2 170 printf("Failed to send a response!!\n");
paleskyjp 0:8ee5ec4bcec2 171 }
paleskyjp 0:8ee5ec4bcec2 172 }
paleskyjp 0:8ee5ec4bcec2 173 }
paleskyjp 0:8ee5ec4bcec2 174
paleskyjp 0:8ee5ec4bcec2 175
paleskyjp 0:8ee5ec4bcec2 176 err_t recv_callback(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
paleskyjp 0:8ee5ec4bcec2 177 {
paleskyjp 0:8ee5ec4bcec2 178 struct netif *netif = &netif_data;
paleskyjp 0:8ee5ec4bcec2 179 unsigned short usLength;
paleskyjp 0:8ee5ec4bcec2 180 int i;
paleskyjp 0:8ee5ec4bcec2 181
paleskyjp 0:8ee5ec4bcec2 182 /* Check if status is ok and data is arrived. */
paleskyjp 0:8ee5ec4bcec2 183 if (err == ERR_OK && p != NULL) {
paleskyjp 0:8ee5ec4bcec2 184 /* Inform TCP that we have taken the data. */
paleskyjp 0:8ee5ec4bcec2 185 tcp_recved(pcb, p->tot_len);
paleskyjp 0:8ee5ec4bcec2 186
paleskyjp 0:8ee5ec4bcec2 187 memcpy( &aucTCPBuf[usTCPBufPos], p->payload, p->tot_len );
paleskyjp 0:8ee5ec4bcec2 188 usTCPBufPos += p->tot_len;
paleskyjp 0:8ee5ec4bcec2 189
paleskyjp 0:8ee5ec4bcec2 190 if( usTCPBufPos >= MB_TCP_FUNC )
paleskyjp 0:8ee5ec4bcec2 191 {
paleskyjp 0:8ee5ec4bcec2 192 /* Length is a byte count of Modbus PDU (function code + data) and the
paleskyjp 0:8ee5ec4bcec2 193 * unit identifier. */
paleskyjp 0:8ee5ec4bcec2 194 usLength = aucTCPBuf[MB_TCP_LEN] << 8U;
paleskyjp 0:8ee5ec4bcec2 195 usLength |= aucTCPBuf[MB_TCP_LEN + 1];
paleskyjp 0:8ee5ec4bcec2 196
paleskyjp 0:8ee5ec4bcec2 197 /* Is the frame already complete. */
paleskyjp 0:8ee5ec4bcec2 198 if( usTCPBufPos < ( MB_TCP_UID + usLength ) )
paleskyjp 0:8ee5ec4bcec2 199 {
paleskyjp 0:8ee5ec4bcec2 200 }
paleskyjp 0:8ee5ec4bcec2 201 else if( usTCPBufPos == ( MB_TCP_UID + usLength ) )
paleskyjp 0:8ee5ec4bcec2 202 {
paleskyjp 0:8ee5ec4bcec2 203 for(i=0;i<usTCPBufPos;i++){
paleskyjp 0:8ee5ec4bcec2 204 printf("%02X ",aucTCPBuf[i]);
paleskyjp 0:8ee5ec4bcec2 205 }
paleskyjp 0:8ee5ec4bcec2 206 printf("\n");
paleskyjp 0:8ee5ec4bcec2 207 EventPost(pcb);
paleskyjp 0:8ee5ec4bcec2 208 usTCPBufPos=0;
paleskyjp 0:8ee5ec4bcec2 209 }
paleskyjp 0:8ee5ec4bcec2 210 else
paleskyjp 0:8ee5ec4bcec2 211 {
paleskyjp 0:8ee5ec4bcec2 212 printf("Received to many bytes! Droping client.\n" );
paleskyjp 0:8ee5ec4bcec2 213 /* This should not happen. We can't deal with such a client and
paleskyjp 0:8ee5ec4bcec2 214 * drop the connection for security reasons.
paleskyjp 0:8ee5ec4bcec2 215 */
paleskyjp 0:8ee5ec4bcec2 216 //vvMBPortReleaseClient( pxPCB );
paleskyjp 0:8ee5ec4bcec2 217 }
paleskyjp 0:8ee5ec4bcec2 218 }
paleskyjp 0:8ee5ec4bcec2 219 pbuf_free(p);
paleskyjp 0:8ee5ec4bcec2 220 }else{
paleskyjp 0:8ee5ec4bcec2 221 /* No data arrived */
paleskyjp 0:8ee5ec4bcec2 222 /* That means the client closes the connection and sent us a packet with FIN flag set to 1. */
paleskyjp 0:8ee5ec4bcec2 223 /* We have to cleanup and destroy out TCPConnection. */
paleskyjp 0:8ee5ec4bcec2 224 printf("Connection closed by client.\r\n");
paleskyjp 0:8ee5ec4bcec2 225 pbuf_free(p);
paleskyjp 0:8ee5ec4bcec2 226 }
paleskyjp 0:8ee5ec4bcec2 227
paleskyjp 0:8ee5ec4bcec2 228 return ERR_OK;
paleskyjp 0:8ee5ec4bcec2 229 }
paleskyjp 0:8ee5ec4bcec2 230 /* Accept an incomming call on the registered port */
paleskyjp 0:8ee5ec4bcec2 231 err_t accept_callback(void *arg, struct tcp_pcb *npcb, err_t err) {
paleskyjp 0:8ee5ec4bcec2 232 LWIP_UNUSED_ARG(arg);
paleskyjp 0:8ee5ec4bcec2 233 /* Subscribe a receive callback function */
paleskyjp 0:8ee5ec4bcec2 234 tcp_recv(npcb, &recv_callback);
paleskyjp 0:8ee5ec4bcec2 235 /* Don't panic! Everything is fine. */
paleskyjp 0:8ee5ec4bcec2 236 printf("accepted connection\n");
paleskyjp 0:8ee5ec4bcec2 237 usTCPBufPos=0;
paleskyjp 0:8ee5ec4bcec2 238 return ERR_OK;
paleskyjp 0:8ee5ec4bcec2 239 }
paleskyjp 0:8ee5ec4bcec2 240
paleskyjp 0:8ee5ec4bcec2 241 void mb_init()
paleskyjp 0:8ee5ec4bcec2 242 {
paleskyjp 0:8ee5ec4bcec2 243 struct netif *netif = &netif_data;
paleskyjp 0:8ee5ec4bcec2 244 struct ip_addr ipaddr;
paleskyjp 0:8ee5ec4bcec2 245 struct ip_addr netmask;
paleskyjp 0:8ee5ec4bcec2 246 struct ip_addr gateway;
paleskyjp 0:8ee5ec4bcec2 247 Ticker tickFast, tickSlow, tickARP, eth_tick, dns_tick, dhcp_coarse, dhcp_fine;
paleskyjp 0:8ee5ec4bcec2 248
paleskyjp 0:8ee5ec4bcec2 249 char *hostname = "my-mbed";
paleskyjp 0:8ee5ec4bcec2 250 printf("Setting up...\n");
paleskyjp 0:8ee5ec4bcec2 251
paleskyjp 0:8ee5ec4bcec2 252 /* Start Network with DHCP */
paleskyjp 0:8ee5ec4bcec2 253 IP4_ADDR(&netmask, 255,255,255,255);
paleskyjp 0:8ee5ec4bcec2 254 IP4_ADDR(&gateway, 0,0,0,0);
paleskyjp 0:8ee5ec4bcec2 255 IP4_ADDR(&ipaddr, 0,0,0,0);
paleskyjp 0:8ee5ec4bcec2 256 /* Initialise after configuration */
paleskyjp 0:8ee5ec4bcec2 257 lwip_init();
paleskyjp 0:8ee5ec4bcec2 258 netif->hwaddr_len = ETHARP_HWADDR_LEN;
paleskyjp 0:8ee5ec4bcec2 259 device_address((char *)netif->hwaddr);
paleskyjp 0:8ee5ec4bcec2 260 netif = netif_add(netif, &ipaddr, &netmask, &gateway, NULL, device_init, ip_input);
paleskyjp 0:8ee5ec4bcec2 261 netif->hostname = hostname;
paleskyjp 0:8ee5ec4bcec2 262 netif_set_default(netif);
paleskyjp 0:8ee5ec4bcec2 263 dhcp_start(netif); // <-- Use DHCP
paleskyjp 0:8ee5ec4bcec2 264
paleskyjp 0:8ee5ec4bcec2 265 /* Initialise all needed timers */
paleskyjp 0:8ee5ec4bcec2 266 tickARP.attach_us( &etharp_tmr, ARP_TMR_INTERVAL * 1000);
paleskyjp 0:8ee5ec4bcec2 267 tickFast.attach_us(&tcp_fasttmr, TCP_FAST_INTERVAL * 1000);
paleskyjp 0:8ee5ec4bcec2 268 tickSlow.attach_us(&tcp_slowtmr, TCP_SLOW_INTERVAL * 1000);
paleskyjp 0:8ee5ec4bcec2 269 dns_tick.attach_us(&dns_tmr, DNS_TMR_INTERVAL * 1000);
paleskyjp 0:8ee5ec4bcec2 270 dhcp_coarse.attach_us(&dhcp_coarse_tmr, DHCP_COARSE_TIMER_MSECS * 1000);
paleskyjp 0:8ee5ec4bcec2 271 dhcp_fine.attach_us(&dhcp_fine_tmr, DHCP_FINE_TIMER_MSECS * 1000);
paleskyjp 0:8ee5ec4bcec2 272
paleskyjp 0:8ee5ec4bcec2 273 while (!netif_is_up(netif)) {
paleskyjp 0:8ee5ec4bcec2 274 device_poll();
paleskyjp 0:8ee5ec4bcec2 275 }
paleskyjp 0:8ee5ec4bcec2 276 printf("Setup OK\n");
paleskyjp 0:8ee5ec4bcec2 277 printf("mbed IP Address is: %d.%d.%d.%d\n", (netif->ip_addr.addr)&0xFF, (netif->ip_addr.addr>>8)&0xFF, (netif->ip_addr.addr>>16)&0xFF, (netif->ip_addr.addr>>24)&0xFF);
paleskyjp 0:8ee5ec4bcec2 278
paleskyjp 0:8ee5ec4bcec2 279 /* Bind a function to a tcp port */
paleskyjp 0:8ee5ec4bcec2 280 struct tcp_pcb *pcb = tcp_new();
paleskyjp 0:8ee5ec4bcec2 281 if (tcp_bind(pcb, IP_ADDR_ANY, 502) == ERR_OK) {
paleskyjp 0:8ee5ec4bcec2 282 pcb = tcp_listen(pcb);
paleskyjp 0:8ee5ec4bcec2 283 tcp_accept(pcb, &accept_callback);
paleskyjp 0:8ee5ec4bcec2 284 }
paleskyjp 0:8ee5ec4bcec2 285 }