A library for talking to Multi-Tech's Cellular SocketModem Devices.

Dependents:   M2X_dev axeda_wrapper_dev MTS_M2x_Example1 MTS_Cellular_Connect_Example ... more

Committer:
mfiore
Date:
Tue Sep 02 18:38:55 2014 +0000
Revision:
152:9a2c7ed27744
Parent:
66:a170496ec5cf
Wifi: fix compatibility break with old shields by checking for both old and new style responses to "show connection" command

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jengbrecht 20:6e7eaf4f8634 1 /* Copyright (C) 2012 mbed.org, MIT License
jengbrecht 20:6e7eaf4f8634 2 *
jengbrecht 20:6e7eaf4f8634 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
jengbrecht 20:6e7eaf4f8634 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
jengbrecht 20:6e7eaf4f8634 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
jengbrecht 20:6e7eaf4f8634 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
jengbrecht 20:6e7eaf4f8634 7 * furnished to do so, subject to the following conditions:
jengbrecht 20:6e7eaf4f8634 8 *
jengbrecht 20:6e7eaf4f8634 9 * The above copyright notice and this permission notice shall be included in all copies or
jengbrecht 20:6e7eaf4f8634 10 * substantial portions of the Software.
jengbrecht 20:6e7eaf4f8634 11 *
jengbrecht 20:6e7eaf4f8634 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
jengbrecht 20:6e7eaf4f8634 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
jengbrecht 20:6e7eaf4f8634 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
jengbrecht 20:6e7eaf4f8634 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
jengbrecht 20:6e7eaf4f8634 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
jengbrecht 20:6e7eaf4f8634 17 */
jengbrecht 20:6e7eaf4f8634 18
jengbrecht 20:6e7eaf4f8634 19 #include "TCPSocketConnection.h"
jengbrecht 20:6e7eaf4f8634 20 #include <algorithm>
jengbrecht 20:6e7eaf4f8634 21
jengbrecht 20:6e7eaf4f8634 22 TCPSocketConnection::TCPSocketConnection()
jengbrecht 20:6e7eaf4f8634 23 {
jengbrecht 20:6e7eaf4f8634 24 }
jengbrecht 20:6e7eaf4f8634 25
jengbrecht 20:6e7eaf4f8634 26 int TCPSocketConnection::connect(const char* host, const int port)
jengbrecht 20:6e7eaf4f8634 27 {
jengbrecht 66:a170496ec5cf 28 if (!ip->open(host, port, mts::IPStack::TCP)) {
jengbrecht 20:6e7eaf4f8634 29 return -1;
jengbrecht 20:6e7eaf4f8634 30 }
jengbrecht 20:6e7eaf4f8634 31 return 0;
jengbrecht 20:6e7eaf4f8634 32 }
jengbrecht 20:6e7eaf4f8634 33
jengbrecht 20:6e7eaf4f8634 34 bool TCPSocketConnection::is_connected(void)
jengbrecht 20:6e7eaf4f8634 35 {
jengbrecht 66:a170496ec5cf 36 return ip->isOpen();
jengbrecht 20:6e7eaf4f8634 37 }
jengbrecht 20:6e7eaf4f8634 38
jengbrecht 20:6e7eaf4f8634 39 int TCPSocketConnection::send(char* data, int length)
jengbrecht 20:6e7eaf4f8634 40 {
jengbrecht 20:6e7eaf4f8634 41 Timer tmr;
jengbrecht 20:6e7eaf4f8634 42
jengbrecht 20:6e7eaf4f8634 43 if (!_blocking) {
jengbrecht 20:6e7eaf4f8634 44 tmr.start();
jengbrecht 20:6e7eaf4f8634 45 while (tmr.read_ms() < _timeout) {
jengbrecht 66:a170496ec5cf 46 if (ip->writeable())
jengbrecht 20:6e7eaf4f8634 47 break;
jengbrecht 20:6e7eaf4f8634 48 }
jengbrecht 20:6e7eaf4f8634 49 if (tmr.read_ms() >= _timeout) {
jengbrecht 20:6e7eaf4f8634 50 return -1;
jengbrecht 20:6e7eaf4f8634 51 }
jengbrecht 20:6e7eaf4f8634 52 }
jengbrecht 66:a170496ec5cf 53 return ip->write(data, length, 0);
jengbrecht 20:6e7eaf4f8634 54 }
jengbrecht 20:6e7eaf4f8634 55
jengbrecht 20:6e7eaf4f8634 56 // -1 if unsuccessful, else number of bytes written
jengbrecht 20:6e7eaf4f8634 57 int TCPSocketConnection::send_all(char* data, int length)
jengbrecht 20:6e7eaf4f8634 58 {
jengbrecht 20:6e7eaf4f8634 59 if (_blocking) {
jengbrecht 66:a170496ec5cf 60 return ip->write(data, length, -1);
jengbrecht 20:6e7eaf4f8634 61 } else {
jengbrecht 66:a170496ec5cf 62 return ip->write(data, length, _timeout);
jengbrecht 20:6e7eaf4f8634 63 }
jengbrecht 20:6e7eaf4f8634 64 }
jengbrecht 20:6e7eaf4f8634 65
jengbrecht 20:6e7eaf4f8634 66 // -1 if unsuccessful, else number of bytes received
jengbrecht 20:6e7eaf4f8634 67 int TCPSocketConnection::receive(char* data, int length)
jengbrecht 20:6e7eaf4f8634 68 {
jengbrecht 20:6e7eaf4f8634 69 Timer tmr;
jengbrecht 20:6e7eaf4f8634 70 int time = -1;
jengbrecht 20:6e7eaf4f8634 71
jengbrecht 20:6e7eaf4f8634 72 if (!_blocking) {
jengbrecht 20:6e7eaf4f8634 73 tmr.start();
jengbrecht 20:6e7eaf4f8634 74 while (time < _timeout + 20) {
jengbrecht 66:a170496ec5cf 75 if (ip->readable()) {
jengbrecht 20:6e7eaf4f8634 76 break;
jengbrecht 20:6e7eaf4f8634 77 }
jengbrecht 20:6e7eaf4f8634 78 time = tmr.read_ms();
jengbrecht 20:6e7eaf4f8634 79 }
jengbrecht 20:6e7eaf4f8634 80 if (time >= _timeout + 20) {
jengbrecht 20:6e7eaf4f8634 81 return -1;
jengbrecht 20:6e7eaf4f8634 82 }
jengbrecht 20:6e7eaf4f8634 83 } else {
jengbrecht 66:a170496ec5cf 84 while(!ip->readable());
jengbrecht 20:6e7eaf4f8634 85 }
jengbrecht 20:6e7eaf4f8634 86
jengbrecht 66:a170496ec5cf 87 return ip->read(data, length, 0);
jengbrecht 20:6e7eaf4f8634 88 }
jengbrecht 20:6e7eaf4f8634 89
jengbrecht 20:6e7eaf4f8634 90
jengbrecht 20:6e7eaf4f8634 91 // -1 if unsuccessful, else number of bytes received
jengbrecht 20:6e7eaf4f8634 92 int TCPSocketConnection::receive_all(char* data, int length)
jengbrecht 20:6e7eaf4f8634 93 {
jengbrecht 20:6e7eaf4f8634 94 if (_blocking) {
jengbrecht 66:a170496ec5cf 95 return ip->read(data, length, -1);
jengbrecht 20:6e7eaf4f8634 96 } else {
jengbrecht 66:a170496ec5cf 97 return ip->read(data, length, _timeout);
jengbrecht 20:6e7eaf4f8634 98 }
jengbrecht 20:6e7eaf4f8634 99 }