ModbusTCP Light This version utilize lwIP library with the minimal implementation of Modbus TCP. Error processing hasn\\\'t been implemented yet.
mbtcp.cpp@1:59cee932f289, 2012-03-16 (annotated)
- Committer:
- paleskyjp
- Date:
- Fri Mar 16 08:38:12 2012 +0000
- Revision:
- 1:59cee932f289
- Parent:
- 0:8ee5ec4bcec2
Who changed what in which revision?
User | Revision | Line number | New 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( ðarp_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 | } |