This library is stripped down version of NetServices library. HTTP server and client function is NOT supported.

Dependents:   imu-daq-eth

Committer:
idinor
Date:
Wed Jul 20 11:45:39 2011 +0000
Revision:
0:dcf3c92487ca

        

Who changed what in which revision?

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