Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of XBee by
Diff: XBeeWiFi.cpp
- Revision:
- 4:f6d73acc1f75
- Parent:
- 3:8573b122fa84
- Child:
- 5:547cfff7adf7
--- a/XBeeWiFi.cpp Thu Mar 08 17:41:29 2012 +0000 +++ b/XBeeWiFi.cpp Tue Mar 13 09:01:52 2012 +0000 @@ -19,7 +19,7 @@ #define REVERSE_ENDIAN(x) (uint16_t)(((uint16_t)x >> 8) | ((uint16_t)x << 8)) #ifdef USE_WIFICLASS -XBeeWiFi::XBeeWiFi (PinName p_tx, PinName p_rx, PinName p_cts) : XBee(p_tx, p_rx, p_cts) { +XBeeWiFi::XBeeWiFi (PinName p_tx, PinName p_rx, PinName p_cts, PinName p_rts) : XBee(p_tx, p_rx, p_cts, p_rts) { } int XBeeWiFi::setup (int security, const char *ssid, const char *pin) { @@ -86,6 +86,36 @@ return getWiResponse(AT_COMMAND_RESPONSE, atRequest.getFrameId()); } +int XBeeWiFi::baud (int b) { + // RESET + uint8_t cmd[2] = {'B', 'D'}; + char val[4]; + AtCommandRequest atRequest; + int r, len; + + if (b < 0x100) { + val[0] = b; + len = 1; + } else { + val[0] = (b >> 24) & 0xff; + val[1] = (b >> 16) & 0xff; + val[2] = (b >> 8) & 0xff; + val[3] = b & 0xff; + len = 4; + } + atRequest.setCommand(cmd); + atRequest.setCommandValue((uint8_t*)val); + atRequest.setCommandValueLength(len); + atRequest.setFrameId(getNextFrameId()); + send(atRequest); + r = getWiResponse(AT_COMMAND_RESPONSE, atRequest.getFrameId()); + + if (r == 0) { + begin(b); + } + return r; +} + int XBeeWiFi::setAddress () { // DHCP uint8_t cmd[2] = {'M', 'A'}; @@ -281,9 +311,11 @@ return 0; } +// *** Note: wifi is turned off when XBee send the port 53 udp packet. int XBeeWiFi::getHostByName (const char* name, IpAddr &addr) { - char buf[1024]; - int i, r, len; + Timer timeout; + char buf[600]; + int r, len; uint8_t cmd[2] = {'C', '0'}; char val[2]; IPv4TransmitRequest dnsRequest; @@ -294,7 +326,7 @@ addr = IpAddr(127, 0, 0, 1); return 0; } - +/* // bind src port val[0] = (DNS_SRC_PORT >> 8) & 0xff; val[1] = DNS_SRC_PORT & 0xff; @@ -305,7 +337,7 @@ send(atRequest); r = getWiResponse(AT_COMMAND_RESPONSE); DBG("wifi C0: %d\r\n", r); - +*/ // send DNS request len = createDnsRequest(name, buf); dnsRequest.setAddress(_nameserver); @@ -314,18 +346,23 @@ dnsRequest.setProtocol(PROTOCOL_UDP); dnsRequest.setPayload((uint8_t*)buf); dnsRequest.setPayloadLength(len); - for (i = 0; i < DNS_TIMEOUT; i ++) { + + // wait responce + timeout.reset(); + timeout.start(); + while (timeout.read_ms() < DNS_TIMEOUT) { dnsRequest.setFrameId(getNextFrameId()); send(dnsRequest); r = getWiResponse(TX_STATUS_RESPONSE, dnsRequest.getFrameId()); DBG("wifi TX: %d\r\n", r); - if (r == 0) { + if (r >= 0) { // recv DNS request r = getWiResponse(IPv4_RX_FRAME, 0, 3000); DBG("wifi RX: %d\r\n", r); if (r >= 0) { + timeout.stop(); getResponse().getAtCommandResponse(atResponse); return getDnsResponse(atResponse.getValue() + 6, atResponse.getValueLength() - 6, addr); } @@ -333,6 +370,7 @@ break; } } + timeout.stop(); return -1; } @@ -418,7 +456,7 @@ IPv4TransmitRequest::IPv4TransmitRequest() : PayloadRequest(IPv4_TRANSMIT_REQUEST, DEFAULT_FRAME_ID, NULL, 0) { } -IPv4TransmitRequest::IPv4TransmitRequest(IpAddr &dstAddr, uint16_t dstPort, uint16_t srcPort, uint8_t protocol, uint8_t option, uint8_t *data, uint8_t dataLength, uint8_t frameId): PayloadRequest(IPv4_TRANSMIT_REQUEST, frameId, data, dataLength) { +IPv4TransmitRequest::IPv4TransmitRequest(IpAddr &dstAddr, uint16_t dstPort, uint16_t srcPort, uint8_t protocol, uint8_t option, uint8_t *data, uint16_t dataLength, uint8_t frameId): PayloadRequest(IPv4_TRANSMIT_REQUEST, frameId, data, dataLength) { _dstAddr = dstAddr; _dstPort = dstPort; _srcPort = srcPort; @@ -426,7 +464,7 @@ _option = option; } -IPv4TransmitRequest::IPv4TransmitRequest(IpAddr &dstAddr, uint16_t dstPort, uint8_t *data, uint8_t dataLength): PayloadRequest(IPv4_TRANSMIT_REQUEST, DEFAULT_FRAME_ID, data, dataLength) { +IPv4TransmitRequest::IPv4TransmitRequest(IpAddr &dstAddr, uint16_t dstPort, uint8_t *data, uint16_t dataLength): PayloadRequest(IPv4_TRANSMIT_REQUEST, DEFAULT_FRAME_ID, data, dataLength) { _dstAddr = dstAddr; _dstPort = dstPort; _srcPort = 0x270f; @@ -434,7 +472,7 @@ _option = 0; } -uint8_t IPv4TransmitRequest::getFrameData(uint8_t pos) { +uint8_t IPv4TransmitRequest::getFrameData(uint16_t pos) { if (pos == 0) { return _dstAddr[0]; } else if (pos == 1) { @@ -460,7 +498,7 @@ } } -uint8_t IPv4TransmitRequest::getFrameDataLength() { +uint16_t IPv4TransmitRequest::getFrameDataLength() { return IPv4_TRANSMIT_REQUEST_API_LENGTH + getPayloadLength(); } @@ -518,32 +556,35 @@ } +IPV4RxFrame::IPV4RxFrame () { +} + IpAddr& IPV4RxFrame::getSrcAddress() { - _srcAddr = IpAddr(getFrameData()[4], getFrameData()[5], getFrameData()[6], getFrameData()[7]); + _srcAddr = IpAddr(getFrameData()[0], getFrameData()[1], getFrameData()[2], getFrameData()[3]); return _srcAddr; } uint16_t IPV4RxFrame::getDstPort() { - return (getFrameData()[8] << 8) + getFrameData()[9]; + return (getFrameData()[4] << 8) + getFrameData()[5]; } uint16_t IPV4RxFrame::getSrcPort() { - return (getFrameData()[10] << 8) + getFrameData()[11]; + return (getFrameData()[6] << 8) + getFrameData()[7]; } uint8_t IPV4RxFrame::getProtocol() { - return getFrameData()[12]; + return getFrameData()[8]; } uint8_t IPV4RxFrame::getStatus() { - return getFrameData()[13]; + return getFrameData()[9]; } // markers to read data from packet array. this is the index, so the 12th item in the array uint8_t IPV4RxFrame::getDataOffset() { - return 14; + return 10; } -uint8_t IPV4RxFrame::getDataLength() { +uint16_t IPV4RxFrame::getDataLength() { return getPacketLength() - getDataOffset() - 1; }