UIPEthernet library for Arduino IDE, Eclipse with arduino plugin and MBED/SMeshStudio (AVR,STM32F,ESP8266,Intel ARC32,Nordic nRF51,Teensy boards,Realtek Ameba(RTL8195A,RTL8710)), ENC28j60 network chip. Compatible with Wiznet W5100 Ethernet library API. Compiled and tested on Nucleo-F302R8. Master repository is: https://github.com/UIPEthernet/UIPEthernet/

Committer:
cassyarduino
Date:
Tue Jan 23 15:08:43 2018 +0100
Revision:
39:deeb00b81cc9
Parent:
35:f9f3a91fe4d4
Release: 2.0.4

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 35:f9f3a91fe4d4 19 #if !defined(ARDUINO_ARCH_AVR) && !defined(ARDUINO_ARCH_SAM)
cassyarduino 1:34b5616a463d 20
cassyarduino 13:54b176a8dbd6 21 #if defined(ARDUINO)
cassyarduino 13:54b176a8dbd6 22 #include <Arduino.h>
cassyarduino 14:dc2eb02f9689 23 #include <IPAddress.h>
cassyarduino 13:54b176a8dbd6 24 #endif
cassyarduino 13:54b176a8dbd6 25 #if defined(__MBED__)
cassyarduino 13:54b176a8dbd6 26 #include <mbed.h>
cassyarduino 13:54b176a8dbd6 27 #include "mbed/Print.h"
cassyarduino 14:dc2eb02f9689 28 #include "mbed/IPAddress.h"
cassyarduino 13:54b176a8dbd6 29 #endif
cassyarduino 13:54b176a8dbd6 30
cassyarduino 13:54b176a8dbd6 31 IPAddress::IPAddress()
cassyarduino 13:54b176a8dbd6 32 {
cassyarduino 13:54b176a8dbd6 33 _address.dword = 0;
cassyarduino 1:34b5616a463d 34 }
cassyarduino 1:34b5616a463d 35
cassyarduino 13:54b176a8dbd6 36 IPAddress::IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet)
cassyarduino 13:54b176a8dbd6 37 {
cassyarduino 13:54b176a8dbd6 38 _address.bytes[0] = first_octet;
cassyarduino 13:54b176a8dbd6 39 _address.bytes[1] = second_octet;
cassyarduino 13:54b176a8dbd6 40 _address.bytes[2] = third_octet;
cassyarduino 13:54b176a8dbd6 41 _address.bytes[3] = fourth_octet;
cassyarduino 13:54b176a8dbd6 42 }
cassyarduino 13:54b176a8dbd6 43
cassyarduino 13:54b176a8dbd6 44 IPAddress::IPAddress(uint32_t address)
cassyarduino 13:54b176a8dbd6 45 {
cassyarduino 13:54b176a8dbd6 46 _address.dword = address;
cassyarduino 13:54b176a8dbd6 47 }
cassyarduino 13:54b176a8dbd6 48
cassyarduino 13:54b176a8dbd6 49 IPAddress::IPAddress(const uint8_t *address)
cassyarduino 13:54b176a8dbd6 50 {
cassyarduino 13:54b176a8dbd6 51 memcpy(_address.bytes, address, sizeof(_address.bytes));
cassyarduino 1:34b5616a463d 52 }
cassyarduino 1:34b5616a463d 53
cassyarduino 13:54b176a8dbd6 54 bool IPAddress::fromString(const char *address)
cassyarduino 13:54b176a8dbd6 55 {
cassyarduino 13:54b176a8dbd6 56 // TODO: add support for "a", "a.b", "a.b.c" formats
cassyarduino 13:54b176a8dbd6 57
cassyarduino 13:54b176a8dbd6 58 uint16_t acc = 0; // Accumulator
cassyarduino 13:54b176a8dbd6 59 uint8_t dots = 0;
cassyarduino 13:54b176a8dbd6 60
cassyarduino 13:54b176a8dbd6 61 while (*address)
cassyarduino 13:54b176a8dbd6 62 {
cassyarduino 13:54b176a8dbd6 63 char c = *address++;
cassyarduino 13:54b176a8dbd6 64 if (c >= '0' && c <= '9')
cassyarduino 13:54b176a8dbd6 65 {
cassyarduino 13:54b176a8dbd6 66 acc = acc * 10 + (c - '0');
cassyarduino 13:54b176a8dbd6 67 if (acc > 255) {
cassyarduino 13:54b176a8dbd6 68 // Value out of [0..255] range
cassyarduino 13:54b176a8dbd6 69 return false;
cassyarduino 13:54b176a8dbd6 70 }
cassyarduino 13:54b176a8dbd6 71 }
cassyarduino 13:54b176a8dbd6 72 else if (c == '.')
cassyarduino 13:54b176a8dbd6 73 {
cassyarduino 13:54b176a8dbd6 74 if (dots == 3) {
cassyarduino 13:54b176a8dbd6 75 // Too much dots (there must be 3 dots)
cassyarduino 13:54b176a8dbd6 76 return false;
cassyarduino 13:54b176a8dbd6 77 }
cassyarduino 13:54b176a8dbd6 78 _address.bytes[dots++] = acc;
cassyarduino 13:54b176a8dbd6 79 acc = 0;
cassyarduino 13:54b176a8dbd6 80 }
cassyarduino 13:54b176a8dbd6 81 else
cassyarduino 13:54b176a8dbd6 82 {
cassyarduino 13:54b176a8dbd6 83 // Invalid char
cassyarduino 13:54b176a8dbd6 84 return false;
cassyarduino 13:54b176a8dbd6 85 }
cassyarduino 13:54b176a8dbd6 86 }
cassyarduino 13:54b176a8dbd6 87
cassyarduino 13:54b176a8dbd6 88 if (dots != 3) {
cassyarduino 13:54b176a8dbd6 89 // Too few dots (there must be 3 dots)
cassyarduino 13:54b176a8dbd6 90 return false;
cassyarduino 13:54b176a8dbd6 91 }
cassyarduino 13:54b176a8dbd6 92 _address.bytes[3] = acc;
cassyarduino 13:54b176a8dbd6 93 return true;
cassyarduino 1:34b5616a463d 94 }
cassyarduino 1:34b5616a463d 95
cassyarduino 13:54b176a8dbd6 96 IPAddress& IPAddress::operator=(const uint8_t *address)
cassyarduino 13:54b176a8dbd6 97 {
cassyarduino 13:54b176a8dbd6 98 memcpy(_address.bytes, address, sizeof(_address.bytes));
cassyarduino 1:34b5616a463d 99 return *this;
cassyarduino 1:34b5616a463d 100 }
cassyarduino 1:34b5616a463d 101
cassyarduino 13:54b176a8dbd6 102 IPAddress& IPAddress::operator=(uint32_t address)
cassyarduino 13:54b176a8dbd6 103 {
cassyarduino 13:54b176a8dbd6 104 _address.dword = address;
cassyarduino 1:34b5616a463d 105 return *this;
cassyarduino 1:34b5616a463d 106 }
cassyarduino 1:34b5616a463d 107
cassyarduino 1:34b5616a463d 108 bool IPAddress::operator==(const uint8_t* addr) const
cassyarduino 1:34b5616a463d 109 {
cassyarduino 13:54b176a8dbd6 110 return memcmp(addr, _address.bytes, sizeof(_address.bytes)) == 0;
cassyarduino 1:34b5616a463d 111 }
cassyarduino 1:34b5616a463d 112
cassyarduino 13:54b176a8dbd6 113 size_t IPAddress::printTo(Print& p) const
cassyarduino 13:54b176a8dbd6 114 {
cassyarduino 13:54b176a8dbd6 115 size_t n = 0;
cassyarduino 13:54b176a8dbd6 116 for (int i =0; i < 3; i++)
cassyarduino 13:54b176a8dbd6 117 {
cassyarduino 13:54b176a8dbd6 118 n += p.print(_address.bytes[i], DEC);
cassyarduino 13:54b176a8dbd6 119 n += p.print('.');
cassyarduino 13:54b176a8dbd6 120 }
cassyarduino 13:54b176a8dbd6 121 n += p.print(_address.bytes[3], DEC);
cassyarduino 13:54b176a8dbd6 122 return n;
cassyarduino 13:54b176a8dbd6 123 }
cassyarduino 35:f9f3a91fe4d4 124 #endif