Net stack with AutoIP enabled

Dependencies:   mbed

Committer:
darran
Date:
Fri Jul 02 17:21:58 2010 +0000
Revision:
0:ac21159e27f4

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
darran 0:ac21159e27f4 1
darran 0:ac21159e27f4 2 /*
darran 0:ac21159e27f4 3 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
darran 0:ac21159e27f4 4
darran 0:ac21159e27f4 5 Permission is hereby granted, free of charge, to any person obtaining a copy
darran 0:ac21159e27f4 6 of this software and associated documentation files (the "Software"), to deal
darran 0:ac21159e27f4 7 in the Software without restriction, including without limitation the rights
darran 0:ac21159e27f4 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
darran 0:ac21159e27f4 9 copies of the Software, and to permit persons to whom the Software is
darran 0:ac21159e27f4 10 furnished to do so, subject to the following conditions:
darran 0:ac21159e27f4 11
darran 0:ac21159e27f4 12 The above copyright notice and this permission notice shall be included in
darran 0:ac21159e27f4 13 all copies or substantial portions of the Software.
darran 0:ac21159e27f4 14
darran 0:ac21159e27f4 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
darran 0:ac21159e27f4 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
darran 0:ac21159e27f4 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
darran 0:ac21159e27f4 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
darran 0:ac21159e27f4 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
darran 0:ac21159e27f4 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
darran 0:ac21159e27f4 21 THE SOFTWARE.
darran 0:ac21159e27f4 22 */
darran 0:ac21159e27f4 23
darran 0:ac21159e27f4 24 /*
darran 0:ac21159e27f4 25
darran 0:ac21159e27f4 26 This is a wrapper around Serial if for lwIP (acts as a serial driver)
darran 0:ac21159e27f4 27
darran 0:ac21159e27f4 28 See sio.h for functions to be implemented
darran 0:ac21159e27f4 29
darran 0:ac21159e27f4 30 sio_fd_t is a void* defined type, we use it as a SerialBuf ptr
darran 0:ac21159e27f4 31
darran 0:ac21159e27f4 32
darran 0:ac21159e27f4 33
darran 0:ac21159e27f4 34 */
darran 0:ac21159e27f4 35
darran 0:ac21159e27f4 36
darran 0:ac21159e27f4 37 #include "netCfg.h"
darran 0:ac21159e27f4 38 #if NET_PPP
darran 0:ac21159e27f4 39
darran 0:ac21159e27f4 40
darran 0:ac21159e27f4 41 #define MAX_SERIAL_PORTS 8
darran 0:ac21159e27f4 42
darran 0:ac21159e27f4 43 #include "lwip/sio.h"
darran 0:ac21159e27f4 44 #include "mbed.h"
darran 0:ac21159e27f4 45 #include "sioMgr.h"
darran 0:ac21159e27f4 46
darran 0:ac21159e27f4 47 //extern "C" {
darran 0:ac21159e27f4 48
darran 0:ac21159e27f4 49 /**
darran 0:ac21159e27f4 50 * Opens a serial device for communication.
darran 0:ac21159e27f4 51 *
darran 0:ac21159e27f4 52 * @param devnum device number
darran 0:ac21159e27f4 53 * @return handle to serial device if successful, NULL otherwise
darran 0:ac21159e27f4 54 */
darran 0:ac21159e27f4 55 sio_fd_t sio_open(u8_t devnum)
darran 0:ac21159e27f4 56 {
darran 0:ac21159e27f4 57 SerialBuf* pIf = SioMgr::getIf(devnum);
darran 0:ac21159e27f4 58 if(pIf == NULL)
darran 0:ac21159e27f4 59 return NULL;
darran 0:ac21159e27f4 60
darran 0:ac21159e27f4 61 //Got a SerialBuf* object
darran 0:ac21159e27f4 62 //WARN: It HAS to be initialised (instanciated + attached to a Serial obj)
darran 0:ac21159e27f4 63
darran 0:ac21159e27f4 64 return (sio_fd_t*) pIf;
darran 0:ac21159e27f4 65 }
darran 0:ac21159e27f4 66
darran 0:ac21159e27f4 67 /**
darran 0:ac21159e27f4 68 * Sends a single character to the serial device.
darran 0:ac21159e27f4 69 *
darran 0:ac21159e27f4 70 * @param c character to send
darran 0:ac21159e27f4 71 * @param fd serial device handle
darran 0:ac21159e27f4 72 *
darran 0:ac21159e27f4 73 * @note This function will block until the character can be sent.
darran 0:ac21159e27f4 74 */
darran 0:ac21159e27f4 75 void sio_send(u8_t c, sio_fd_t fd)
darran 0:ac21159e27f4 76 {
darran 0:ac21159e27f4 77 SerialBuf* pIf = (SerialBuf*) fd;
darran 0:ac21159e27f4 78 //while(!pIf->writeable());
darran 0:ac21159e27f4 79 pIf->putc( (char) c );
darran 0:ac21159e27f4 80 }
darran 0:ac21159e27f4 81
darran 0:ac21159e27f4 82 /**
darran 0:ac21159e27f4 83 * Receives a single character from the serial device.
darran 0:ac21159e27f4 84 *
darran 0:ac21159e27f4 85 * @param fd serial device handle
darran 0:ac21159e27f4 86 *
darran 0:ac21159e27f4 87 * @note This function will block until a character is received.
darran 0:ac21159e27f4 88 */
darran 0:ac21159e27f4 89 u8_t sio_recv(sio_fd_t fd)
darran 0:ac21159e27f4 90 {
darran 0:ac21159e27f4 91 SerialBuf* pIf = (SerialBuf*) fd;
darran 0:ac21159e27f4 92 pIf->setReadMode(false);
darran 0:ac21159e27f4 93 while(!pIf->readable());
darran 0:ac21159e27f4 94 return (u8_t) pIf->getc();
darran 0:ac21159e27f4 95 }
darran 0:ac21159e27f4 96
darran 0:ac21159e27f4 97 /**
darran 0:ac21159e27f4 98 * Reads from the serial device.
darran 0:ac21159e27f4 99 *
darran 0:ac21159e27f4 100 * @param fd serial device handle
darran 0:ac21159e27f4 101 * @param data pointer to data buffer for receiving
darran 0:ac21159e27f4 102 * @param len maximum length (in bytes) of data to receive
darran 0:ac21159e27f4 103 * @return number of bytes actually received - may be 0 if aborted by sio_read_abort
darran 0:ac21159e27f4 104 *
darran 0:ac21159e27f4 105 * @note This function will block until data can be received. The blocking
darran 0:ac21159e27f4 106 * can be cancelled by calling sio_read_abort().
darran 0:ac21159e27f4 107 */
darran 0:ac21159e27f4 108 static volatile bool m_abort = false;
darran 0:ac21159e27f4 109 u32_t sio_read(sio_fd_t fd, u8_t *data, u32_t len)
darran 0:ac21159e27f4 110 {
darran 0:ac21159e27f4 111 u32_t recvd = 0; //bytes received
darran 0:ac21159e27f4 112 SerialBuf* pIf = (SerialBuf*) fd;
darran 0:ac21159e27f4 113 pIf->setReadMode(false);
darran 0:ac21159e27f4 114 while(!m_abort && len)
darran 0:ac21159e27f4 115 {
darran 0:ac21159e27f4 116 while(!pIf->readable());
darran 0:ac21159e27f4 117 *data = (u8_t) pIf->getc();
darran 0:ac21159e27f4 118 data++;
darran 0:ac21159e27f4 119 len--;
darran 0:ac21159e27f4 120 recvd++;
darran 0:ac21159e27f4 121 }
darran 0:ac21159e27f4 122 m_abort = false;
darran 0:ac21159e27f4 123 return recvd;
darran 0:ac21159e27f4 124 }
darran 0:ac21159e27f4 125
darran 0:ac21159e27f4 126 /**
darran 0:ac21159e27f4 127 * Tries to read from the serial device. Same as sio_read but returns
darran 0:ac21159e27f4 128 * immediately if no data is available and never blocks.
darran 0:ac21159e27f4 129 *
darran 0:ac21159e27f4 130 * @param fd serial device handle
darran 0:ac21159e27f4 131 * @param data pointer to data buffer for receiving
darran 0:ac21159e27f4 132 * @param len maximum length (in bytes) of data to receive
darran 0:ac21159e27f4 133 * @return number of bytes actually received
darran 0:ac21159e27f4 134 */
darran 0:ac21159e27f4 135 u32_t sio_tryread(sio_fd_t fd, u8_t *data, u32_t len)
darran 0:ac21159e27f4 136 {
darran 0:ac21159e27f4 137 u32_t recvd = 0; //bytes received
darran 0:ac21159e27f4 138 SerialBuf* pIf = (SerialBuf*) fd;
darran 0:ac21159e27f4 139 pIf->setReadMode(false);
darran 0:ac21159e27f4 140 while(len)
darran 0:ac21159e27f4 141 {
darran 0:ac21159e27f4 142 /* if(!pIf->readable())
darran 0:ac21159e27f4 143 {
darran 0:ac21159e27f4 144 wait_ms(4);
darran 0:ac21159e27f4 145 }*/
darran 0:ac21159e27f4 146 if(!pIf->readable())
darran 0:ac21159e27f4 147 {
darran 0:ac21159e27f4 148 return recvd;
darran 0:ac21159e27f4 149 }
darran 0:ac21159e27f4 150 *data = (u8_t) pIf->getc();
darran 0:ac21159e27f4 151 data++;
darran 0:ac21159e27f4 152 len--;
darran 0:ac21159e27f4 153 recvd++;
darran 0:ac21159e27f4 154 }
darran 0:ac21159e27f4 155 return recvd;
darran 0:ac21159e27f4 156 }
darran 0:ac21159e27f4 157
darran 0:ac21159e27f4 158 /**
darran 0:ac21159e27f4 159 * Writes to the serial device.
darran 0:ac21159e27f4 160 *
darran 0:ac21159e27f4 161 * @param fd serial device handle
darran 0:ac21159e27f4 162 * @param data pointer to data to send
darran 0:ac21159e27f4 163 * @param len length (in bytes) of data to send
darran 0:ac21159e27f4 164 * @return number of bytes actually sent
darran 0:ac21159e27f4 165 *
darran 0:ac21159e27f4 166 * @note This function will block until all data can be sent.
darran 0:ac21159e27f4 167 */
darran 0:ac21159e27f4 168 u32_t sio_write(sio_fd_t fd, u8_t *data, u32_t len)
darran 0:ac21159e27f4 169 {
darran 0:ac21159e27f4 170 u32_t sent = 0; //bytes sent
darran 0:ac21159e27f4 171 SerialBuf* pIf = (SerialBuf*) fd;
darran 0:ac21159e27f4 172 while(len)
darran 0:ac21159e27f4 173 {
darran 0:ac21159e27f4 174 //while(!pIf->writeable());
darran 0:ac21159e27f4 175 pIf->putc(*data);
darran 0:ac21159e27f4 176 data++;
darran 0:ac21159e27f4 177 len--;
darran 0:ac21159e27f4 178 sent++;
darran 0:ac21159e27f4 179 }
darran 0:ac21159e27f4 180 return sent; //Well, this is bound to be len if no interrupt mechanism
darran 0:ac21159e27f4 181 }
darran 0:ac21159e27f4 182
darran 0:ac21159e27f4 183 /**
darran 0:ac21159e27f4 184 * Aborts a blocking sio_read() call.
darran 0:ac21159e27f4 185 *
darran 0:ac21159e27f4 186 * @param fd serial device handle
darran 0:ac21159e27f4 187 */
darran 0:ac21159e27f4 188 void sio_read_abort(sio_fd_t fd)
darran 0:ac21159e27f4 189 {
darran 0:ac21159e27f4 190 m_abort = true;
darran 0:ac21159e27f4 191 }
darran 0:ac21159e27f4 192
darran 0:ac21159e27f4 193 //}
darran 0:ac21159e27f4 194
darran 0:ac21159e27f4 195 #endif
darran 0:ac21159e27f4 196