cassyarduino cassyarduino / UIPEthernet
Committer:
cassyarduino
Date:
Fri Dec 30 11:45:48 2016 +0100
Revision:
14:dc2eb02f9689
Parent:
13:54b176a8dbd6
Child:
35:f9f3a91fe4d4
Changes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cassyarduino 1:34b5616a463d 1 /*
cassyarduino 1:34b5616a463d 2 IPAddress.cpp - Base class that provides IPAddress
cassyarduino 1:34b5616a463d 3 Copyright (c) 2011 Adrian McEwen. All right reserved.
cassyarduino 1:34b5616a463d 4
cassyarduino 1:34b5616a463d 5 This library is free software; you can redistribute it and/or
cassyarduino 1:34b5616a463d 6 modify it under the terms of the GNU Lesser General Public
cassyarduino 1:34b5616a463d 7 License as published by the Free Software Foundation; either
cassyarduino 1:34b5616a463d 8 version 2.1 of the License, or (at your option) any later version.
cassyarduino 1:34b5616a463d 9
cassyarduino 1:34b5616a463d 10 This library is distributed in the hope that it will be useful,
cassyarduino 1:34b5616a463d 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
cassyarduino 1:34b5616a463d 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
cassyarduino 1:34b5616a463d 13 Lesser General Public License for more details.
cassyarduino 1:34b5616a463d 14
cassyarduino 1:34b5616a463d 15 You should have received a copy of the GNU Lesser General Public
cassyarduino 1:34b5616a463d 16 License along with this library; if not, write to the Free Software
cassyarduino 1:34b5616a463d 17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
cassyarduino 1:34b5616a463d 18 */
cassyarduino 1:34b5616a463d 19
cassyarduino 13:54b176a8dbd6 20 #if defined(ARDUINO)
cassyarduino 13:54b176a8dbd6 21 #include <Arduino.h>
cassyarduino 14:dc2eb02f9689 22 #include <IPAddress.h>
cassyarduino 13:54b176a8dbd6 23 #endif
cassyarduino 13:54b176a8dbd6 24 #if defined(__MBED__)
cassyarduino 13:54b176a8dbd6 25 #include <mbed.h>
cassyarduino 13:54b176a8dbd6 26 #include "mbed/Print.h"
cassyarduino 14:dc2eb02f9689 27 #include "mbed/IPAddress.h"
cassyarduino 13:54b176a8dbd6 28 #endif
cassyarduino 13:54b176a8dbd6 29
cassyarduino 13:54b176a8dbd6 30 IPAddress::IPAddress()
cassyarduino 13:54b176a8dbd6 31 {
cassyarduino 13:54b176a8dbd6 32 _address.dword = 0;
cassyarduino 1:34b5616a463d 33 }
cassyarduino 1:34b5616a463d 34
cassyarduino 13:54b176a8dbd6 35 IPAddress::IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet)
cassyarduino 13:54b176a8dbd6 36 {
cassyarduino 13:54b176a8dbd6 37 _address.bytes[0] = first_octet;
cassyarduino 13:54b176a8dbd6 38 _address.bytes[1] = second_octet;
cassyarduino 13:54b176a8dbd6 39 _address.bytes[2] = third_octet;
cassyarduino 13:54b176a8dbd6 40 _address.bytes[3] = fourth_octet;
cassyarduino 13:54b176a8dbd6 41 }
cassyarduino 13:54b176a8dbd6 42
cassyarduino 13:54b176a8dbd6 43 IPAddress::IPAddress(uint32_t address)
cassyarduino 13:54b176a8dbd6 44 {
cassyarduino 13:54b176a8dbd6 45 _address.dword = address;
cassyarduino 13:54b176a8dbd6 46 }
cassyarduino 13:54b176a8dbd6 47
cassyarduino 13:54b176a8dbd6 48 IPAddress::IPAddress(const uint8_t *address)
cassyarduino 13:54b176a8dbd6 49 {
cassyarduino 13:54b176a8dbd6 50 memcpy(_address.bytes, address, sizeof(_address.bytes));
cassyarduino 1:34b5616a463d 51 }
cassyarduino 1:34b5616a463d 52
cassyarduino 13:54b176a8dbd6 53 bool IPAddress::fromString(const char *address)
cassyarduino 13:54b176a8dbd6 54 {
cassyarduino 13:54b176a8dbd6 55 // TODO: add support for "a", "a.b", "a.b.c" formats
cassyarduino 13:54b176a8dbd6 56
cassyarduino 13:54b176a8dbd6 57 uint16_t acc = 0; // Accumulator
cassyarduino 13:54b176a8dbd6 58 uint8_t dots = 0;
cassyarduino 13:54b176a8dbd6 59
cassyarduino 13:54b176a8dbd6 60 while (*address)
cassyarduino 13:54b176a8dbd6 61 {
cassyarduino 13:54b176a8dbd6 62 char c = *address++;
cassyarduino 13:54b176a8dbd6 63 if (c >= '0' && c <= '9')
cassyarduino 13:54b176a8dbd6 64 {
cassyarduino 13:54b176a8dbd6 65 acc = acc * 10 + (c - '0');
cassyarduino 13:54b176a8dbd6 66 if (acc > 255) {
cassyarduino 13:54b176a8dbd6 67 // Value out of [0..255] range
cassyarduino 13:54b176a8dbd6 68 return false;
cassyarduino 13:54b176a8dbd6 69 }
cassyarduino 13:54b176a8dbd6 70 }
cassyarduino 13:54b176a8dbd6 71 else if (c == '.')
cassyarduino 13:54b176a8dbd6 72 {
cassyarduino 13:54b176a8dbd6 73 if (dots == 3) {
cassyarduino 13:54b176a8dbd6 74 // Too much dots (there must be 3 dots)
cassyarduino 13:54b176a8dbd6 75 return false;
cassyarduino 13:54b176a8dbd6 76 }
cassyarduino 13:54b176a8dbd6 77 _address.bytes[dots++] = acc;
cassyarduino 13:54b176a8dbd6 78 acc = 0;
cassyarduino 13:54b176a8dbd6 79 }
cassyarduino 13:54b176a8dbd6 80 else
cassyarduino 13:54b176a8dbd6 81 {
cassyarduino 13:54b176a8dbd6 82 // Invalid char
cassyarduino 13:54b176a8dbd6 83 return false;
cassyarduino 13:54b176a8dbd6 84 }
cassyarduino 13:54b176a8dbd6 85 }
cassyarduino 13:54b176a8dbd6 86
cassyarduino 13:54b176a8dbd6 87 if (dots != 3) {
cassyarduino 13:54b176a8dbd6 88 // Too few dots (there must be 3 dots)
cassyarduino 13:54b176a8dbd6 89 return false;
cassyarduino 13:54b176a8dbd6 90 }
cassyarduino 13:54b176a8dbd6 91 _address.bytes[3] = acc;
cassyarduino 13:54b176a8dbd6 92 return true;
cassyarduino 1:34b5616a463d 93 }
cassyarduino 1:34b5616a463d 94
cassyarduino 13:54b176a8dbd6 95 IPAddress& IPAddress::operator=(const uint8_t *address)
cassyarduino 13:54b176a8dbd6 96 {
cassyarduino 13:54b176a8dbd6 97 memcpy(_address.bytes, address, sizeof(_address.bytes));
cassyarduino 1:34b5616a463d 98 return *this;
cassyarduino 1:34b5616a463d 99 }
cassyarduino 1:34b5616a463d 100
cassyarduino 13:54b176a8dbd6 101 IPAddress& IPAddress::operator=(uint32_t address)
cassyarduino 13:54b176a8dbd6 102 {
cassyarduino 13:54b176a8dbd6 103 _address.dword = address;
cassyarduino 1:34b5616a463d 104 return *this;
cassyarduino 1:34b5616a463d 105 }
cassyarduino 1:34b5616a463d 106
cassyarduino 1:34b5616a463d 107 bool IPAddress::operator==(const uint8_t* addr) const
cassyarduino 1:34b5616a463d 108 {
cassyarduino 13:54b176a8dbd6 109 return memcmp(addr, _address.bytes, sizeof(_address.bytes)) == 0;
cassyarduino 1:34b5616a463d 110 }
cassyarduino 1:34b5616a463d 111
cassyarduino 13:54b176a8dbd6 112 size_t IPAddress::printTo(Print& p) const
cassyarduino 13:54b176a8dbd6 113 {
cassyarduino 13:54b176a8dbd6 114 size_t n = 0;
cassyarduino 13:54b176a8dbd6 115 for (int i =0; i < 3; i++)
cassyarduino 13:54b176a8dbd6 116 {
cassyarduino 13:54b176a8dbd6 117 n += p.print(_address.bytes[i], DEC);
cassyarduino 13:54b176a8dbd6 118 n += p.print('.');
cassyarduino 13:54b176a8dbd6 119 }
cassyarduino 13:54b176a8dbd6 120 n += p.print(_address.bytes[3], DEC);
cassyarduino 13:54b176a8dbd6 121 return n;
cassyarduino 13:54b176a8dbd6 122 }