NetServices Stack source

Dependents:   HelloWorld ServoInterfaceBoardExample1 4180_Lab4

Committer:
donatien
Date:
Fri Jun 11 16:05:15 2010 +0000
Revision:
0:632c9925f013
Child:
4:fd826cad83c0

        

Who changed what in which revision?

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