PHS module SMA-01 library. see: https://developer.mbed.org/users/phsfan/notebook/abitusbmodem/
Dependencies: Socket lwip-sys lwip
Dependents: AbitUSBModem_HTTPTest AbitUSBModem_MQTTTest AbitUSBModem_WebsocketTest AbitUSBModem_SMSTest
Fork of VodafoneUSBModem by
Diff: AbitUSBModem.cpp
- Revision:
- 96:b50f5f795684
- Child:
- 97:7d9cc95e2ea7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/AbitUSBModem.cpp Wed Feb 18 09:40:07 2015 +0000 @@ -0,0 +1,157 @@ +/* AbitUSBModem.cpp + * modifyed by Suga + */ +/* VodafoneUSBModem.cpp */ +/* Copyright (C) 2012 mbed.org, MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software + * and associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +#define __DEBUG__ 0 + +#ifndef __MODULE__ +#define __MODULE__ "AbitUSBModem.cpp" +#endif + +#include "core/fwk.h" + +#include "AbitUSBModem.h" +#include "Socket.h" + +AbitUSBModem::AbitUSBModem () : + m_dongle(), // Construct WANDongle: USB interface with two serial channels to the modem (USBSerialStream objects) + m_pppStream((IUSBHostSerial&)m_dongle), // PPP connections are managed via another serial channel. + m_at(&m_pppStream), // Construct ATCommandsInterface with the AT serial channel + m_ppp(&m_pppStream, &m_pppStream, &m_at, false), // Construct PPPIPInterface with the PPP serial channel + m_dongleConnected(false), // Dongle is initially not ready for anything + m_ipInit(false), // PPIPInterface connection is initially down + m_atOpen(false) // ATCommandsInterface starts in a closed state +{ +} + +int AbitUSBModem::connect (const char* user, const char* password) { + + if( !m_ipInit ) + { + m_ipInit = true; + m_ppp.init(); + } + m_ppp.setup(user, password); + + int ret = init(); + if(ret) + { + return ret; + } + + m_at.close(); // Closing AT parser + m_atOpen = false; //Will need to be reinitialized afterwards + + DBG("Connecting PPP"); + + ret = m_ppp.connect(); + DBG("Result of connect: Err code=%d", ret); + return ret; +} + +int AbitUSBModem::disconnect () { + DBG("Disconnecting from PPP"); + int ret = m_ppp.disconnect(); + if(ret) + { + ERR("Disconnect returned %d, still trying to disconnect", ret); + } + + return OK; +} + + + +int AbitUSBModem::init() +{ + //DBG("Entering init method for the VodafoneUSBModem"); + if( !m_dongleConnected ) + { + DBG("Dongle is not connected"); + + m_dongle.connect(); + + m_dongleConnected = true; + bool detectConnectedModem = false; // local variable to use to create a while loop that we can break out of - this is used to detect if we can see a modem or not + + while(!detectConnectedModem) + { + for (int x=0; x<100;x++) + { + DBG("Trying to connect the dongle"); + m_dongle.connect(); + if (m_dongle.connected()) + { + DBG("Great the dongle is connected - I've tried %d times to connect", x); + detectConnectedModem = true; // OK we can break out this while loop now - the dongle has been connected + break; // Break out of the for loop once the dongle is connected - otherwise try for a while more + } + Thread::wait(1000); + } + if (!detectConnectedModem) + { + // OK we got this far - so give up trying and let someone know you can't see the modem + m_dongleConnected = false; // set the member variable of this object to false - so if we get called again we know we have to try to detect again + ERR("There is no dongle pluged into the board, or the module does not respond. Is the module/modem switched on?"); + Thread:wait(1000); + //DBG("Last ditch attempt to re-initialise the USB Subsystem"); + //m_dongle.init(); + return HARDWARE_NO_RESPONSE; + } + } + } + + if(m_atOpen) + { + return OK; + } + + DBG("Starting AT thread if needed"); + int ret = m_at.open(); + if(ret) + { + return ret; + } + + DBG("Sending initialisation commands"); + ret = m_at.init(); + if(ret) + { + return ret; + } +/* + ret = m_at.executeSimple("ATE0", NULL); + DBG("Result of command: Err code=%d", ret); + if(ret != OK) + { + return NET_PROTOCOL; + } +*/ + m_atOpen = true; + + return OK; +} + +char* AbitUSBModem::getIPAddress() +{ + return m_ppp.getIPAddress(); +}