Remove duplicated ArduinoCore-API files (#840)
Use #include .... to reference them from the cores directory to ensure they keep up to date.
This commit is contained in:
parent
db337a9b36
commit
f79b0867b6
32 changed files with 42 additions and 4679 deletions
|
|
@ -1 +1 @@
|
||||||
Subproject commit ff01bb620e0c3386e39e032e209d9a07ad799d25
|
Subproject commit d955d75747e469132a4f0791b6e7e4998d23fa8c
|
||||||
|
|
@ -1,57 +1,2 @@
|
||||||
/*
|
#pragma once
|
||||||
Arduino API main include
|
#include "../../../ArduinoCore-API/api/ArduinoAPI.h"
|
||||||
Copyright (c) 2016 Arduino LLC. All right reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ARDUINO_API_H
|
|
||||||
#define ARDUINO_API_H
|
|
||||||
|
|
||||||
// version 1.2.0
|
|
||||||
#define ARDUINO_API_VERSION 10200
|
|
||||||
|
|
||||||
#include "Binary.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
#include "Interrupts.h"
|
|
||||||
#include "IPAddress.h"
|
|
||||||
#include "Print.h"
|
|
||||||
#include "Printable.h"
|
|
||||||
#include "PluggableUSB.h"
|
|
||||||
#include "Server.h"
|
|
||||||
#include "String.h"
|
|
||||||
#include "Stream.h"
|
|
||||||
#include "Udp.h"
|
|
||||||
#include "USBAPI.h"
|
|
||||||
#include "WCharacter.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Standard C library includes */
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
// Misc Arduino core functions
|
|
||||||
#include "Common.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
// Compatibility layer for older code
|
|
||||||
#include "Compat.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
||||||
|
|
@ -1,552 +1,2 @@
|
||||||
/*
|
#pragma once
|
||||||
binary.h - Definitions for binary constants
|
#include "../../../ArduinoCore-API/api/Binary.h"
|
||||||
Deprecated -- use 0b binary literals instead
|
|
||||||
Copyright (c) 2006 David A. Mellis. All right reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef Binary_h
|
|
||||||
#define Binary_h
|
|
||||||
|
|
||||||
/* If supported, 0b binary literals are preferable to these constants.
|
|
||||||
* In that case, warn the user about these being deprecated (if possible). */
|
|
||||||
#if __cplusplus >= 201402L
|
|
||||||
/* C++14 introduces binary literals; C++11 introduces [[deprecated()]] */
|
|
||||||
#define DEPRECATED(x) [[deprecated("use " #x " instead")]]
|
|
||||||
#elif __GNUC__ >= 6
|
|
||||||
/* GCC 4.3 supports binary literals; GCC 6 supports __deprecated__ on enums*/
|
|
||||||
#define DEPRECATED(x) __attribute__ ((__deprecated__ ("use " #x " instead")))
|
|
||||||
#else
|
|
||||||
/* binary literals not supported, or "deprecated" warning not displayable */
|
|
||||||
#define DEPRECATED(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
enum {
|
|
||||||
B0 DEPRECATED(0b0 ) = 0,
|
|
||||||
B00 DEPRECATED(0b00 ) = 0,
|
|
||||||
B000 DEPRECATED(0b000 ) = 0,
|
|
||||||
B0000 DEPRECATED(0b0000 ) = 0,
|
|
||||||
B00000 DEPRECATED(0b00000 ) = 0,
|
|
||||||
B000000 DEPRECATED(0b000000 ) = 0,
|
|
||||||
B0000000 DEPRECATED(0b0000000 ) = 0,
|
|
||||||
B00000000 DEPRECATED(0b00000000) = 0,
|
|
||||||
B1 DEPRECATED(0b1 ) = 1,
|
|
||||||
B01 DEPRECATED(0b01 ) = 1,
|
|
||||||
B001 DEPRECATED(0b001 ) = 1,
|
|
||||||
B0001 DEPRECATED(0b0001 ) = 1,
|
|
||||||
B00001 DEPRECATED(0b00001 ) = 1,
|
|
||||||
B000001 DEPRECATED(0b000001 ) = 1,
|
|
||||||
B0000001 DEPRECATED(0b0000001 ) = 1,
|
|
||||||
B00000001 DEPRECATED(0b00000001) = 1,
|
|
||||||
B10 DEPRECATED(0b10 ) = 2,
|
|
||||||
B010 DEPRECATED(0b010 ) = 2,
|
|
||||||
B0010 DEPRECATED(0b0010 ) = 2,
|
|
||||||
B00010 DEPRECATED(0b00010 ) = 2,
|
|
||||||
B000010 DEPRECATED(0b000010 ) = 2,
|
|
||||||
B0000010 DEPRECATED(0b0000010 ) = 2,
|
|
||||||
B00000010 DEPRECATED(0b00000010) = 2,
|
|
||||||
B11 DEPRECATED(0b11 ) = 3,
|
|
||||||
B011 DEPRECATED(0b011 ) = 3,
|
|
||||||
B0011 DEPRECATED(0b0011 ) = 3,
|
|
||||||
B00011 DEPRECATED(0b00011 ) = 3,
|
|
||||||
B000011 DEPRECATED(0b000011 ) = 3,
|
|
||||||
B0000011 DEPRECATED(0b0000011 ) = 3,
|
|
||||||
B00000011 DEPRECATED(0b00000011) = 3,
|
|
||||||
B100 DEPRECATED(0b100 ) = 4,
|
|
||||||
B0100 DEPRECATED(0b0100 ) = 4,
|
|
||||||
B00100 DEPRECATED(0b00100 ) = 4,
|
|
||||||
B000100 DEPRECATED(0b000100 ) = 4,
|
|
||||||
B0000100 DEPRECATED(0b0000100 ) = 4,
|
|
||||||
B00000100 DEPRECATED(0b00000100) = 4,
|
|
||||||
B101 DEPRECATED(0b101 ) = 5,
|
|
||||||
B0101 DEPRECATED(0b0101 ) = 5,
|
|
||||||
B00101 DEPRECATED(0b00101 ) = 5,
|
|
||||||
B000101 DEPRECATED(0b000101 ) = 5,
|
|
||||||
B0000101 DEPRECATED(0b0000101 ) = 5,
|
|
||||||
B00000101 DEPRECATED(0b00000101) = 5,
|
|
||||||
B110 DEPRECATED(0b110 ) = 6,
|
|
||||||
B0110 DEPRECATED(0b0110 ) = 6,
|
|
||||||
B00110 DEPRECATED(0b00110 ) = 6,
|
|
||||||
B000110 DEPRECATED(0b000110 ) = 6,
|
|
||||||
B0000110 DEPRECATED(0b0000110 ) = 6,
|
|
||||||
B00000110 DEPRECATED(0b00000110) = 6,
|
|
||||||
B111 DEPRECATED(0b111 ) = 7,
|
|
||||||
B0111 DEPRECATED(0b0111 ) = 7,
|
|
||||||
B00111 DEPRECATED(0b00111 ) = 7,
|
|
||||||
B000111 DEPRECATED(0b000111 ) = 7,
|
|
||||||
B0000111 DEPRECATED(0b0000111 ) = 7,
|
|
||||||
B00000111 DEPRECATED(0b00000111) = 7,
|
|
||||||
B1000 DEPRECATED(0b1000 ) = 8,
|
|
||||||
B01000 DEPRECATED(0b01000 ) = 8,
|
|
||||||
B001000 DEPRECATED(0b001000 ) = 8,
|
|
||||||
B0001000 DEPRECATED(0b0001000 ) = 8,
|
|
||||||
B00001000 DEPRECATED(0b00001000) = 8,
|
|
||||||
B1001 DEPRECATED(0b1001 ) = 9,
|
|
||||||
B01001 DEPRECATED(0b01001 ) = 9,
|
|
||||||
B001001 DEPRECATED(0b001001 ) = 9,
|
|
||||||
B0001001 DEPRECATED(0b0001001 ) = 9,
|
|
||||||
B00001001 DEPRECATED(0b00001001) = 9,
|
|
||||||
B1010 DEPRECATED(0b1010 ) = 10,
|
|
||||||
B01010 DEPRECATED(0b01010 ) = 10,
|
|
||||||
B001010 DEPRECATED(0b001010 ) = 10,
|
|
||||||
B0001010 DEPRECATED(0b0001010 ) = 10,
|
|
||||||
B00001010 DEPRECATED(0b00001010) = 10,
|
|
||||||
B1011 DEPRECATED(0b1011 ) = 11,
|
|
||||||
B01011 DEPRECATED(0b01011 ) = 11,
|
|
||||||
B001011 DEPRECATED(0b001011 ) = 11,
|
|
||||||
B0001011 DEPRECATED(0b0001011 ) = 11,
|
|
||||||
B00001011 DEPRECATED(0b00001011) = 11,
|
|
||||||
B1100 DEPRECATED(0b1100 ) = 12,
|
|
||||||
B01100 DEPRECATED(0b01100 ) = 12,
|
|
||||||
B001100 DEPRECATED(0b001100 ) = 12,
|
|
||||||
B0001100 DEPRECATED(0b0001100 ) = 12,
|
|
||||||
B00001100 DEPRECATED(0b00001100) = 12,
|
|
||||||
B1101 DEPRECATED(0b1101 ) = 13,
|
|
||||||
B01101 DEPRECATED(0b01101 ) = 13,
|
|
||||||
B001101 DEPRECATED(0b001101 ) = 13,
|
|
||||||
B0001101 DEPRECATED(0b0001101 ) = 13,
|
|
||||||
B00001101 DEPRECATED(0b00001101) = 13,
|
|
||||||
B1110 DEPRECATED(0b1110 ) = 14,
|
|
||||||
B01110 DEPRECATED(0b01110 ) = 14,
|
|
||||||
B001110 DEPRECATED(0b001110 ) = 14,
|
|
||||||
B0001110 DEPRECATED(0b0001110 ) = 14,
|
|
||||||
B00001110 DEPRECATED(0b00001110) = 14,
|
|
||||||
B1111 DEPRECATED(0b1111 ) = 15,
|
|
||||||
B01111 DEPRECATED(0b01111 ) = 15,
|
|
||||||
B001111 DEPRECATED(0b001111 ) = 15,
|
|
||||||
B0001111 DEPRECATED(0b0001111 ) = 15,
|
|
||||||
B00001111 DEPRECATED(0b00001111) = 15,
|
|
||||||
B10000 DEPRECATED(0b10000 ) = 16,
|
|
||||||
B010000 DEPRECATED(0b010000 ) = 16,
|
|
||||||
B0010000 DEPRECATED(0b0010000 ) = 16,
|
|
||||||
B00010000 DEPRECATED(0b00010000) = 16,
|
|
||||||
B10001 DEPRECATED(0b10001 ) = 17,
|
|
||||||
B010001 DEPRECATED(0b010001 ) = 17,
|
|
||||||
B0010001 DEPRECATED(0b0010001 ) = 17,
|
|
||||||
B00010001 DEPRECATED(0b00010001) = 17,
|
|
||||||
B10010 DEPRECATED(0b10010 ) = 18,
|
|
||||||
B010010 DEPRECATED(0b010010 ) = 18,
|
|
||||||
B0010010 DEPRECATED(0b0010010 ) = 18,
|
|
||||||
B00010010 DEPRECATED(0b00010010) = 18,
|
|
||||||
B10011 DEPRECATED(0b10011 ) = 19,
|
|
||||||
B010011 DEPRECATED(0b010011 ) = 19,
|
|
||||||
B0010011 DEPRECATED(0b0010011 ) = 19,
|
|
||||||
B00010011 DEPRECATED(0b00010011) = 19,
|
|
||||||
B10100 DEPRECATED(0b10100 ) = 20,
|
|
||||||
B010100 DEPRECATED(0b010100 ) = 20,
|
|
||||||
B0010100 DEPRECATED(0b0010100 ) = 20,
|
|
||||||
B00010100 DEPRECATED(0b00010100) = 20,
|
|
||||||
B10101 DEPRECATED(0b10101 ) = 21,
|
|
||||||
B010101 DEPRECATED(0b010101 ) = 21,
|
|
||||||
B0010101 DEPRECATED(0b0010101 ) = 21,
|
|
||||||
B00010101 DEPRECATED(0b00010101) = 21,
|
|
||||||
B10110 DEPRECATED(0b10110 ) = 22,
|
|
||||||
B010110 DEPRECATED(0b010110 ) = 22,
|
|
||||||
B0010110 DEPRECATED(0b0010110 ) = 22,
|
|
||||||
B00010110 DEPRECATED(0b00010110) = 22,
|
|
||||||
B10111 DEPRECATED(0b10111 ) = 23,
|
|
||||||
B010111 DEPRECATED(0b010111 ) = 23,
|
|
||||||
B0010111 DEPRECATED(0b0010111 ) = 23,
|
|
||||||
B00010111 DEPRECATED(0b00010111) = 23,
|
|
||||||
B11000 DEPRECATED(0b11000 ) = 24,
|
|
||||||
B011000 DEPRECATED(0b011000 ) = 24,
|
|
||||||
B0011000 DEPRECATED(0b0011000 ) = 24,
|
|
||||||
B00011000 DEPRECATED(0b00011000) = 24,
|
|
||||||
B11001 DEPRECATED(0b11001 ) = 25,
|
|
||||||
B011001 DEPRECATED(0b011001 ) = 25,
|
|
||||||
B0011001 DEPRECATED(0b0011001 ) = 25,
|
|
||||||
B00011001 DEPRECATED(0b00011001) = 25,
|
|
||||||
B11010 DEPRECATED(0b11010 ) = 26,
|
|
||||||
B011010 DEPRECATED(0b011010 ) = 26,
|
|
||||||
B0011010 DEPRECATED(0b0011010 ) = 26,
|
|
||||||
B00011010 DEPRECATED(0b00011010) = 26,
|
|
||||||
B11011 DEPRECATED(0b11011 ) = 27,
|
|
||||||
B011011 DEPRECATED(0b011011 ) = 27,
|
|
||||||
B0011011 DEPRECATED(0b0011011 ) = 27,
|
|
||||||
B00011011 DEPRECATED(0b00011011) = 27,
|
|
||||||
B11100 DEPRECATED(0b11100 ) = 28,
|
|
||||||
B011100 DEPRECATED(0b011100 ) = 28,
|
|
||||||
B0011100 DEPRECATED(0b0011100 ) = 28,
|
|
||||||
B00011100 DEPRECATED(0b00011100) = 28,
|
|
||||||
B11101 DEPRECATED(0b11101 ) = 29,
|
|
||||||
B011101 DEPRECATED(0b011101 ) = 29,
|
|
||||||
B0011101 DEPRECATED(0b0011101 ) = 29,
|
|
||||||
B00011101 DEPRECATED(0b00011101) = 29,
|
|
||||||
B11110 DEPRECATED(0b11110 ) = 30,
|
|
||||||
B011110 DEPRECATED(0b011110 ) = 30,
|
|
||||||
B0011110 DEPRECATED(0b0011110 ) = 30,
|
|
||||||
B00011110 DEPRECATED(0b00011110) = 30,
|
|
||||||
B11111 DEPRECATED(0b11111 ) = 31,
|
|
||||||
B011111 DEPRECATED(0b011111 ) = 31,
|
|
||||||
B0011111 DEPRECATED(0b0011111 ) = 31,
|
|
||||||
B00011111 DEPRECATED(0b00011111) = 31,
|
|
||||||
B100000 DEPRECATED(0b100000 ) = 32,
|
|
||||||
B0100000 DEPRECATED(0b0100000 ) = 32,
|
|
||||||
B00100000 DEPRECATED(0b00100000) = 32,
|
|
||||||
B100001 DEPRECATED(0b100001 ) = 33,
|
|
||||||
B0100001 DEPRECATED(0b0100001 ) = 33,
|
|
||||||
B00100001 DEPRECATED(0b00100001) = 33,
|
|
||||||
B100010 DEPRECATED(0b100010 ) = 34,
|
|
||||||
B0100010 DEPRECATED(0b0100010 ) = 34,
|
|
||||||
B00100010 DEPRECATED(0b00100010) = 34,
|
|
||||||
B100011 DEPRECATED(0b100011 ) = 35,
|
|
||||||
B0100011 DEPRECATED(0b0100011 ) = 35,
|
|
||||||
B00100011 DEPRECATED(0b00100011) = 35,
|
|
||||||
B100100 DEPRECATED(0b100100 ) = 36,
|
|
||||||
B0100100 DEPRECATED(0b0100100 ) = 36,
|
|
||||||
B00100100 DEPRECATED(0b00100100) = 36,
|
|
||||||
B100101 DEPRECATED(0b100101 ) = 37,
|
|
||||||
B0100101 DEPRECATED(0b0100101 ) = 37,
|
|
||||||
B00100101 DEPRECATED(0b00100101) = 37,
|
|
||||||
B100110 DEPRECATED(0b100110 ) = 38,
|
|
||||||
B0100110 DEPRECATED(0b0100110 ) = 38,
|
|
||||||
B00100110 DEPRECATED(0b00100110) = 38,
|
|
||||||
B100111 DEPRECATED(0b100111 ) = 39,
|
|
||||||
B0100111 DEPRECATED(0b0100111 ) = 39,
|
|
||||||
B00100111 DEPRECATED(0b00100111) = 39,
|
|
||||||
B101000 DEPRECATED(0b101000 ) = 40,
|
|
||||||
B0101000 DEPRECATED(0b0101000 ) = 40,
|
|
||||||
B00101000 DEPRECATED(0b00101000) = 40,
|
|
||||||
B101001 DEPRECATED(0b101001 ) = 41,
|
|
||||||
B0101001 DEPRECATED(0b0101001 ) = 41,
|
|
||||||
B00101001 DEPRECATED(0b00101001) = 41,
|
|
||||||
B101010 DEPRECATED(0b101010 ) = 42,
|
|
||||||
B0101010 DEPRECATED(0b0101010 ) = 42,
|
|
||||||
B00101010 DEPRECATED(0b00101010) = 42,
|
|
||||||
B101011 DEPRECATED(0b101011 ) = 43,
|
|
||||||
B0101011 DEPRECATED(0b0101011 ) = 43,
|
|
||||||
B00101011 DEPRECATED(0b00101011) = 43,
|
|
||||||
B101100 DEPRECATED(0b101100 ) = 44,
|
|
||||||
B0101100 DEPRECATED(0b0101100 ) = 44,
|
|
||||||
B00101100 DEPRECATED(0b00101100) = 44,
|
|
||||||
B101101 DEPRECATED(0b101101 ) = 45,
|
|
||||||
B0101101 DEPRECATED(0b0101101 ) = 45,
|
|
||||||
B00101101 DEPRECATED(0b00101101) = 45,
|
|
||||||
B101110 DEPRECATED(0b101110 ) = 46,
|
|
||||||
B0101110 DEPRECATED(0b0101110 ) = 46,
|
|
||||||
B00101110 DEPRECATED(0b00101110) = 46,
|
|
||||||
B101111 DEPRECATED(0b101111 ) = 47,
|
|
||||||
B0101111 DEPRECATED(0b0101111 ) = 47,
|
|
||||||
B00101111 DEPRECATED(0b00101111) = 47,
|
|
||||||
B110000 DEPRECATED(0b110000 ) = 48,
|
|
||||||
B0110000 DEPRECATED(0b0110000 ) = 48,
|
|
||||||
B00110000 DEPRECATED(0b00110000) = 48,
|
|
||||||
B110001 DEPRECATED(0b110001 ) = 49,
|
|
||||||
B0110001 DEPRECATED(0b0110001 ) = 49,
|
|
||||||
B00110001 DEPRECATED(0b00110001) = 49,
|
|
||||||
B110010 DEPRECATED(0b110010 ) = 50,
|
|
||||||
B0110010 DEPRECATED(0b0110010 ) = 50,
|
|
||||||
B00110010 DEPRECATED(0b00110010) = 50,
|
|
||||||
B110011 DEPRECATED(0b110011 ) = 51,
|
|
||||||
B0110011 DEPRECATED(0b0110011 ) = 51,
|
|
||||||
B00110011 DEPRECATED(0b00110011) = 51,
|
|
||||||
B110100 DEPRECATED(0b110100 ) = 52,
|
|
||||||
B0110100 DEPRECATED(0b0110100 ) = 52,
|
|
||||||
B00110100 DEPRECATED(0b00110100) = 52,
|
|
||||||
B110101 DEPRECATED(0b110101 ) = 53,
|
|
||||||
B0110101 DEPRECATED(0b0110101 ) = 53,
|
|
||||||
B00110101 DEPRECATED(0b00110101) = 53,
|
|
||||||
B110110 DEPRECATED(0b110110 ) = 54,
|
|
||||||
B0110110 DEPRECATED(0b0110110 ) = 54,
|
|
||||||
B00110110 DEPRECATED(0b00110110) = 54,
|
|
||||||
B110111 DEPRECATED(0b110111 ) = 55,
|
|
||||||
B0110111 DEPRECATED(0b0110111 ) = 55,
|
|
||||||
B00110111 DEPRECATED(0b00110111) = 55,
|
|
||||||
B111000 DEPRECATED(0b111000 ) = 56,
|
|
||||||
B0111000 DEPRECATED(0b0111000 ) = 56,
|
|
||||||
B00111000 DEPRECATED(0b00111000) = 56,
|
|
||||||
B111001 DEPRECATED(0b111001 ) = 57,
|
|
||||||
B0111001 DEPRECATED(0b0111001 ) = 57,
|
|
||||||
B00111001 DEPRECATED(0b00111001) = 57,
|
|
||||||
B111010 DEPRECATED(0b111010 ) = 58,
|
|
||||||
B0111010 DEPRECATED(0b0111010 ) = 58,
|
|
||||||
B00111010 DEPRECATED(0b00111010) = 58,
|
|
||||||
B111011 DEPRECATED(0b111011 ) = 59,
|
|
||||||
B0111011 DEPRECATED(0b0111011 ) = 59,
|
|
||||||
B00111011 DEPRECATED(0b00111011) = 59,
|
|
||||||
B111100 DEPRECATED(0b111100 ) = 60,
|
|
||||||
B0111100 DEPRECATED(0b0111100 ) = 60,
|
|
||||||
B00111100 DEPRECATED(0b00111100) = 60,
|
|
||||||
B111101 DEPRECATED(0b111101 ) = 61,
|
|
||||||
B0111101 DEPRECATED(0b0111101 ) = 61,
|
|
||||||
B00111101 DEPRECATED(0b00111101) = 61,
|
|
||||||
B111110 DEPRECATED(0b111110 ) = 62,
|
|
||||||
B0111110 DEPRECATED(0b0111110 ) = 62,
|
|
||||||
B00111110 DEPRECATED(0b00111110) = 62,
|
|
||||||
B111111 DEPRECATED(0b111111 ) = 63,
|
|
||||||
B0111111 DEPRECATED(0b0111111 ) = 63,
|
|
||||||
B00111111 DEPRECATED(0b00111111) = 63,
|
|
||||||
B1000000 DEPRECATED(0b1000000 ) = 64,
|
|
||||||
B01000000 DEPRECATED(0b01000000) = 64,
|
|
||||||
B1000001 DEPRECATED(0b1000001 ) = 65,
|
|
||||||
B01000001 DEPRECATED(0b01000001) = 65,
|
|
||||||
B1000010 DEPRECATED(0b1000010 ) = 66,
|
|
||||||
B01000010 DEPRECATED(0b01000010) = 66,
|
|
||||||
B1000011 DEPRECATED(0b1000011 ) = 67,
|
|
||||||
B01000011 DEPRECATED(0b01000011) = 67,
|
|
||||||
B1000100 DEPRECATED(0b1000100 ) = 68,
|
|
||||||
B01000100 DEPRECATED(0b01000100) = 68,
|
|
||||||
B1000101 DEPRECATED(0b1000101 ) = 69,
|
|
||||||
B01000101 DEPRECATED(0b01000101) = 69,
|
|
||||||
B1000110 DEPRECATED(0b1000110 ) = 70,
|
|
||||||
B01000110 DEPRECATED(0b01000110) = 70,
|
|
||||||
B1000111 DEPRECATED(0b1000111 ) = 71,
|
|
||||||
B01000111 DEPRECATED(0b01000111) = 71,
|
|
||||||
B1001000 DEPRECATED(0b1001000 ) = 72,
|
|
||||||
B01001000 DEPRECATED(0b01001000) = 72,
|
|
||||||
B1001001 DEPRECATED(0b1001001 ) = 73,
|
|
||||||
B01001001 DEPRECATED(0b01001001) = 73,
|
|
||||||
B1001010 DEPRECATED(0b1001010 ) = 74,
|
|
||||||
B01001010 DEPRECATED(0b01001010) = 74,
|
|
||||||
B1001011 DEPRECATED(0b1001011 ) = 75,
|
|
||||||
B01001011 DEPRECATED(0b01001011) = 75,
|
|
||||||
B1001100 DEPRECATED(0b1001100 ) = 76,
|
|
||||||
B01001100 DEPRECATED(0b01001100) = 76,
|
|
||||||
B1001101 DEPRECATED(0b1001101 ) = 77,
|
|
||||||
B01001101 DEPRECATED(0b01001101) = 77,
|
|
||||||
B1001110 DEPRECATED(0b1001110 ) = 78,
|
|
||||||
B01001110 DEPRECATED(0b01001110) = 78,
|
|
||||||
B1001111 DEPRECATED(0b1001111 ) = 79,
|
|
||||||
B01001111 DEPRECATED(0b01001111) = 79,
|
|
||||||
B1010000 DEPRECATED(0b1010000 ) = 80,
|
|
||||||
B01010000 DEPRECATED(0b01010000) = 80,
|
|
||||||
B1010001 DEPRECATED(0b1010001 ) = 81,
|
|
||||||
B01010001 DEPRECATED(0b01010001) = 81,
|
|
||||||
B1010010 DEPRECATED(0b1010010 ) = 82,
|
|
||||||
B01010010 DEPRECATED(0b01010010) = 82,
|
|
||||||
B1010011 DEPRECATED(0b1010011 ) = 83,
|
|
||||||
B01010011 DEPRECATED(0b01010011) = 83,
|
|
||||||
B1010100 DEPRECATED(0b1010100 ) = 84,
|
|
||||||
B01010100 DEPRECATED(0b01010100) = 84,
|
|
||||||
B1010101 DEPRECATED(0b1010101 ) = 85,
|
|
||||||
B01010101 DEPRECATED(0b01010101) = 85,
|
|
||||||
B1010110 DEPRECATED(0b1010110 ) = 86,
|
|
||||||
B01010110 DEPRECATED(0b01010110) = 86,
|
|
||||||
B1010111 DEPRECATED(0b1010111 ) = 87,
|
|
||||||
B01010111 DEPRECATED(0b01010111) = 87,
|
|
||||||
B1011000 DEPRECATED(0b1011000 ) = 88,
|
|
||||||
B01011000 DEPRECATED(0b01011000) = 88,
|
|
||||||
B1011001 DEPRECATED(0b1011001 ) = 89,
|
|
||||||
B01011001 DEPRECATED(0b01011001) = 89,
|
|
||||||
B1011010 DEPRECATED(0b1011010 ) = 90,
|
|
||||||
B01011010 DEPRECATED(0b01011010) = 90,
|
|
||||||
B1011011 DEPRECATED(0b1011011 ) = 91,
|
|
||||||
B01011011 DEPRECATED(0b01011011) = 91,
|
|
||||||
B1011100 DEPRECATED(0b1011100 ) = 92,
|
|
||||||
B01011100 DEPRECATED(0b01011100) = 92,
|
|
||||||
B1011101 DEPRECATED(0b1011101 ) = 93,
|
|
||||||
B01011101 DEPRECATED(0b01011101) = 93,
|
|
||||||
B1011110 DEPRECATED(0b1011110 ) = 94,
|
|
||||||
B01011110 DEPRECATED(0b01011110) = 94,
|
|
||||||
B1011111 DEPRECATED(0b1011111 ) = 95,
|
|
||||||
B01011111 DEPRECATED(0b01011111) = 95,
|
|
||||||
B1100000 DEPRECATED(0b1100000 ) = 96,
|
|
||||||
B01100000 DEPRECATED(0b01100000) = 96,
|
|
||||||
B1100001 DEPRECATED(0b1100001 ) = 97,
|
|
||||||
B01100001 DEPRECATED(0b01100001) = 97,
|
|
||||||
B1100010 DEPRECATED(0b1100010 ) = 98,
|
|
||||||
B01100010 DEPRECATED(0b01100010) = 98,
|
|
||||||
B1100011 DEPRECATED(0b1100011 ) = 99,
|
|
||||||
B01100011 DEPRECATED(0b01100011) = 99,
|
|
||||||
B1100100 DEPRECATED(0b1100100 ) = 100,
|
|
||||||
B01100100 DEPRECATED(0b01100100) = 100,
|
|
||||||
B1100101 DEPRECATED(0b1100101 ) = 101,
|
|
||||||
B01100101 DEPRECATED(0b01100101) = 101,
|
|
||||||
B1100110 DEPRECATED(0b1100110 ) = 102,
|
|
||||||
B01100110 DEPRECATED(0b01100110) = 102,
|
|
||||||
B1100111 DEPRECATED(0b1100111 ) = 103,
|
|
||||||
B01100111 DEPRECATED(0b01100111) = 103,
|
|
||||||
B1101000 DEPRECATED(0b1101000 ) = 104,
|
|
||||||
B01101000 DEPRECATED(0b01101000) = 104,
|
|
||||||
B1101001 DEPRECATED(0b1101001 ) = 105,
|
|
||||||
B01101001 DEPRECATED(0b01101001) = 105,
|
|
||||||
B1101010 DEPRECATED(0b1101010 ) = 106,
|
|
||||||
B01101010 DEPRECATED(0b01101010) = 106,
|
|
||||||
B1101011 DEPRECATED(0b1101011 ) = 107,
|
|
||||||
B01101011 DEPRECATED(0b01101011) = 107,
|
|
||||||
B1101100 DEPRECATED(0b1101100 ) = 108,
|
|
||||||
B01101100 DEPRECATED(0b01101100) = 108,
|
|
||||||
B1101101 DEPRECATED(0b1101101 ) = 109,
|
|
||||||
B01101101 DEPRECATED(0b01101101) = 109,
|
|
||||||
B1101110 DEPRECATED(0b1101110 ) = 110,
|
|
||||||
B01101110 DEPRECATED(0b01101110) = 110,
|
|
||||||
B1101111 DEPRECATED(0b1101111 ) = 111,
|
|
||||||
B01101111 DEPRECATED(0b01101111) = 111,
|
|
||||||
B1110000 DEPRECATED(0b1110000 ) = 112,
|
|
||||||
B01110000 DEPRECATED(0b01110000) = 112,
|
|
||||||
B1110001 DEPRECATED(0b1110001 ) = 113,
|
|
||||||
B01110001 DEPRECATED(0b01110001) = 113,
|
|
||||||
B1110010 DEPRECATED(0b1110010 ) = 114,
|
|
||||||
B01110010 DEPRECATED(0b01110010) = 114,
|
|
||||||
B1110011 DEPRECATED(0b1110011 ) = 115,
|
|
||||||
B01110011 DEPRECATED(0b01110011) = 115,
|
|
||||||
B1110100 DEPRECATED(0b1110100 ) = 116,
|
|
||||||
B01110100 DEPRECATED(0b01110100) = 116,
|
|
||||||
B1110101 DEPRECATED(0b1110101 ) = 117,
|
|
||||||
B01110101 DEPRECATED(0b01110101) = 117,
|
|
||||||
B1110110 DEPRECATED(0b1110110 ) = 118,
|
|
||||||
B01110110 DEPRECATED(0b01110110) = 118,
|
|
||||||
B1110111 DEPRECATED(0b1110111 ) = 119,
|
|
||||||
B01110111 DEPRECATED(0b01110111) = 119,
|
|
||||||
B1111000 DEPRECATED(0b1111000 ) = 120,
|
|
||||||
B01111000 DEPRECATED(0b01111000) = 120,
|
|
||||||
B1111001 DEPRECATED(0b1111001 ) = 121,
|
|
||||||
B01111001 DEPRECATED(0b01111001) = 121,
|
|
||||||
B1111010 DEPRECATED(0b1111010 ) = 122,
|
|
||||||
B01111010 DEPRECATED(0b01111010) = 122,
|
|
||||||
B1111011 DEPRECATED(0b1111011 ) = 123,
|
|
||||||
B01111011 DEPRECATED(0b01111011) = 123,
|
|
||||||
B1111100 DEPRECATED(0b1111100 ) = 124,
|
|
||||||
B01111100 DEPRECATED(0b01111100) = 124,
|
|
||||||
B1111101 DEPRECATED(0b1111101 ) = 125,
|
|
||||||
B01111101 DEPRECATED(0b01111101) = 125,
|
|
||||||
B1111110 DEPRECATED(0b1111110 ) = 126,
|
|
||||||
B01111110 DEPRECATED(0b01111110) = 126,
|
|
||||||
B1111111 DEPRECATED(0b1111111 ) = 127,
|
|
||||||
B01111111 DEPRECATED(0b01111111) = 127,
|
|
||||||
B10000000 DEPRECATED(0b10000000) = 128,
|
|
||||||
B10000001 DEPRECATED(0b10000001) = 129,
|
|
||||||
B10000010 DEPRECATED(0b10000010) = 130,
|
|
||||||
B10000011 DEPRECATED(0b10000011) = 131,
|
|
||||||
B10000100 DEPRECATED(0b10000100) = 132,
|
|
||||||
B10000101 DEPRECATED(0b10000101) = 133,
|
|
||||||
B10000110 DEPRECATED(0b10000110) = 134,
|
|
||||||
B10000111 DEPRECATED(0b10000111) = 135,
|
|
||||||
B10001000 DEPRECATED(0b10001000) = 136,
|
|
||||||
B10001001 DEPRECATED(0b10001001) = 137,
|
|
||||||
B10001010 DEPRECATED(0b10001010) = 138,
|
|
||||||
B10001011 DEPRECATED(0b10001011) = 139,
|
|
||||||
B10001100 DEPRECATED(0b10001100) = 140,
|
|
||||||
B10001101 DEPRECATED(0b10001101) = 141,
|
|
||||||
B10001110 DEPRECATED(0b10001110) = 142,
|
|
||||||
B10001111 DEPRECATED(0b10001111) = 143,
|
|
||||||
B10010000 DEPRECATED(0b10010000) = 144,
|
|
||||||
B10010001 DEPRECATED(0b10010001) = 145,
|
|
||||||
B10010010 DEPRECATED(0b10010010) = 146,
|
|
||||||
B10010011 DEPRECATED(0b10010011) = 147,
|
|
||||||
B10010100 DEPRECATED(0b10010100) = 148,
|
|
||||||
B10010101 DEPRECATED(0b10010101) = 149,
|
|
||||||
B10010110 DEPRECATED(0b10010110) = 150,
|
|
||||||
B10010111 DEPRECATED(0b10010111) = 151,
|
|
||||||
B10011000 DEPRECATED(0b10011000) = 152,
|
|
||||||
B10011001 DEPRECATED(0b10011001) = 153,
|
|
||||||
B10011010 DEPRECATED(0b10011010) = 154,
|
|
||||||
B10011011 DEPRECATED(0b10011011) = 155,
|
|
||||||
B10011100 DEPRECATED(0b10011100) = 156,
|
|
||||||
B10011101 DEPRECATED(0b10011101) = 157,
|
|
||||||
B10011110 DEPRECATED(0b10011110) = 158,
|
|
||||||
B10011111 DEPRECATED(0b10011111) = 159,
|
|
||||||
B10100000 DEPRECATED(0b10100000) = 160,
|
|
||||||
B10100001 DEPRECATED(0b10100001) = 161,
|
|
||||||
B10100010 DEPRECATED(0b10100010) = 162,
|
|
||||||
B10100011 DEPRECATED(0b10100011) = 163,
|
|
||||||
B10100100 DEPRECATED(0b10100100) = 164,
|
|
||||||
B10100101 DEPRECATED(0b10100101) = 165,
|
|
||||||
B10100110 DEPRECATED(0b10100110) = 166,
|
|
||||||
B10100111 DEPRECATED(0b10100111) = 167,
|
|
||||||
B10101000 DEPRECATED(0b10101000) = 168,
|
|
||||||
B10101001 DEPRECATED(0b10101001) = 169,
|
|
||||||
B10101010 DEPRECATED(0b10101010) = 170,
|
|
||||||
B10101011 DEPRECATED(0b10101011) = 171,
|
|
||||||
B10101100 DEPRECATED(0b10101100) = 172,
|
|
||||||
B10101101 DEPRECATED(0b10101101) = 173,
|
|
||||||
B10101110 DEPRECATED(0b10101110) = 174,
|
|
||||||
B10101111 DEPRECATED(0b10101111) = 175,
|
|
||||||
B10110000 DEPRECATED(0b10110000) = 176,
|
|
||||||
B10110001 DEPRECATED(0b10110001) = 177,
|
|
||||||
B10110010 DEPRECATED(0b10110010) = 178,
|
|
||||||
B10110011 DEPRECATED(0b10110011) = 179,
|
|
||||||
B10110100 DEPRECATED(0b10110100) = 180,
|
|
||||||
B10110101 DEPRECATED(0b10110101) = 181,
|
|
||||||
B10110110 DEPRECATED(0b10110110) = 182,
|
|
||||||
B10110111 DEPRECATED(0b10110111) = 183,
|
|
||||||
B10111000 DEPRECATED(0b10111000) = 184,
|
|
||||||
B10111001 DEPRECATED(0b10111001) = 185,
|
|
||||||
B10111010 DEPRECATED(0b10111010) = 186,
|
|
||||||
B10111011 DEPRECATED(0b10111011) = 187,
|
|
||||||
B10111100 DEPRECATED(0b10111100) = 188,
|
|
||||||
B10111101 DEPRECATED(0b10111101) = 189,
|
|
||||||
B10111110 DEPRECATED(0b10111110) = 190,
|
|
||||||
B10111111 DEPRECATED(0b10111111) = 191,
|
|
||||||
B11000000 DEPRECATED(0b11000000) = 192,
|
|
||||||
B11000001 DEPRECATED(0b11000001) = 193,
|
|
||||||
B11000010 DEPRECATED(0b11000010) = 194,
|
|
||||||
B11000011 DEPRECATED(0b11000011) = 195,
|
|
||||||
B11000100 DEPRECATED(0b11000100) = 196,
|
|
||||||
B11000101 DEPRECATED(0b11000101) = 197,
|
|
||||||
B11000110 DEPRECATED(0b11000110) = 198,
|
|
||||||
B11000111 DEPRECATED(0b11000111) = 199,
|
|
||||||
B11001000 DEPRECATED(0b11001000) = 200,
|
|
||||||
B11001001 DEPRECATED(0b11001001) = 201,
|
|
||||||
B11001010 DEPRECATED(0b11001010) = 202,
|
|
||||||
B11001011 DEPRECATED(0b11001011) = 203,
|
|
||||||
B11001100 DEPRECATED(0b11001100) = 204,
|
|
||||||
B11001101 DEPRECATED(0b11001101) = 205,
|
|
||||||
B11001110 DEPRECATED(0b11001110) = 206,
|
|
||||||
B11001111 DEPRECATED(0b11001111) = 207,
|
|
||||||
B11010000 DEPRECATED(0b11010000) = 208,
|
|
||||||
B11010001 DEPRECATED(0b11010001) = 209,
|
|
||||||
B11010010 DEPRECATED(0b11010010) = 210,
|
|
||||||
B11010011 DEPRECATED(0b11010011) = 211,
|
|
||||||
B11010100 DEPRECATED(0b11010100) = 212,
|
|
||||||
B11010101 DEPRECATED(0b11010101) = 213,
|
|
||||||
B11010110 DEPRECATED(0b11010110) = 214,
|
|
||||||
B11010111 DEPRECATED(0b11010111) = 215,
|
|
||||||
B11011000 DEPRECATED(0b11011000) = 216,
|
|
||||||
B11011001 DEPRECATED(0b11011001) = 217,
|
|
||||||
B11011010 DEPRECATED(0b11011010) = 218,
|
|
||||||
B11011011 DEPRECATED(0b11011011) = 219,
|
|
||||||
B11011100 DEPRECATED(0b11011100) = 220,
|
|
||||||
B11011101 DEPRECATED(0b11011101) = 221,
|
|
||||||
B11011110 DEPRECATED(0b11011110) = 222,
|
|
||||||
B11011111 DEPRECATED(0b11011111) = 223,
|
|
||||||
B11100000 DEPRECATED(0b11100000) = 224,
|
|
||||||
B11100001 DEPRECATED(0b11100001) = 225,
|
|
||||||
B11100010 DEPRECATED(0b11100010) = 226,
|
|
||||||
B11100011 DEPRECATED(0b11100011) = 227,
|
|
||||||
B11100100 DEPRECATED(0b11100100) = 228,
|
|
||||||
B11100101 DEPRECATED(0b11100101) = 229,
|
|
||||||
B11100110 DEPRECATED(0b11100110) = 230,
|
|
||||||
B11100111 DEPRECATED(0b11100111) = 231,
|
|
||||||
B11101000 DEPRECATED(0b11101000) = 232,
|
|
||||||
B11101001 DEPRECATED(0b11101001) = 233,
|
|
||||||
B11101010 DEPRECATED(0b11101010) = 234,
|
|
||||||
B11101011 DEPRECATED(0b11101011) = 235,
|
|
||||||
B11101100 DEPRECATED(0b11101100) = 236,
|
|
||||||
B11101101 DEPRECATED(0b11101101) = 237,
|
|
||||||
B11101110 DEPRECATED(0b11101110) = 238,
|
|
||||||
B11101111 DEPRECATED(0b11101111) = 239,
|
|
||||||
B11110000 DEPRECATED(0b11110000) = 240,
|
|
||||||
B11110001 DEPRECATED(0b11110001) = 241,
|
|
||||||
B11110010 DEPRECATED(0b11110010) = 242,
|
|
||||||
B11110011 DEPRECATED(0b11110011) = 243,
|
|
||||||
B11110100 DEPRECATED(0b11110100) = 244,
|
|
||||||
B11110101 DEPRECATED(0b11110101) = 245,
|
|
||||||
B11110110 DEPRECATED(0b11110110) = 246,
|
|
||||||
B11110111 DEPRECATED(0b11110111) = 247,
|
|
||||||
B11111000 DEPRECATED(0b11111000) = 248,
|
|
||||||
B11111001 DEPRECATED(0b11111001) = 249,
|
|
||||||
B11111010 DEPRECATED(0b11111010) = 250,
|
|
||||||
B11111011 DEPRECATED(0b11111011) = 251,
|
|
||||||
B11111100 DEPRECATED(0b11111100) = 252,
|
|
||||||
B11111101 DEPRECATED(0b11111101) = 253,
|
|
||||||
B11111110 DEPRECATED(0b11111110) = 254,
|
|
||||||
B11111111 DEPRECATED(0b11111111) = 255
|
|
||||||
};
|
|
||||||
|
|
||||||
#undef DEPRECATED
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
||||||
|
|
@ -1,46 +1,2 @@
|
||||||
/*
|
|
||||||
Client.h - Base class that provides Client
|
|
||||||
Copyright (c) 2011 Adrian McEwen. All right reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include "../../../ArduinoCore-API/api/Client.h"
|
||||||
#include "Stream.h"
|
|
||||||
#include "IPAddress.h"
|
|
||||||
|
|
||||||
namespace arduino {
|
|
||||||
|
|
||||||
class Client : public Stream {
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual int connect(IPAddress ip, uint16_t port) =0;
|
|
||||||
virtual int connect(const char *host, uint16_t port) =0;
|
|
||||||
virtual size_t write(uint8_t) =0;
|
|
||||||
virtual size_t write(const uint8_t *buf, size_t size) =0;
|
|
||||||
virtual int available() = 0;
|
|
||||||
virtual int read() = 0;
|
|
||||||
virtual int read(uint8_t *buf, size_t size) = 0;
|
|
||||||
virtual int peek() = 0;
|
|
||||||
virtual void flush() = 0;
|
|
||||||
virtual void stop() = 0;
|
|
||||||
virtual uint8_t connected() = 0;
|
|
||||||
virtual operator bool() = 0;
|
|
||||||
protected:
|
|
||||||
uint8_t* rawIPAddress(IPAddress& addr) { return addr.raw_address(); };
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1 @@
|
||||||
#include "Common.h"
|
#include "../../../ArduinoCore-API/api/Common.cpp"
|
||||||
|
|
||||||
/* C++ prototypes */
|
|
||||||
long map(long x, long in_min, long in_max, long out_min, long out_max)
|
|
||||||
{
|
|
||||||
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t makeWord(uint16_t w) { return w; }
|
|
||||||
uint16_t makeWord(uint8_t h, uint8_t l) { return (h << 8) | l; }
|
|
||||||
|
|
|
||||||
|
|
@ -1,173 +1,2 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <stdint.h>
|
#include "../../../ArduinoCore-API/api/Common.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void yield(void);
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
LOW = 0,
|
|
||||||
HIGH = 1,
|
|
||||||
CHANGE = 2,
|
|
||||||
FALLING = 3,
|
|
||||||
RISING = 4,
|
|
||||||
} PinStatus;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
INPUT = 0x0,
|
|
||||||
OUTPUT = 0x1,
|
|
||||||
INPUT_PULLUP = 0x2,
|
|
||||||
INPUT_PULLDOWN = 0x3,
|
|
||||||
OUTPUT_2MA = 0x4,
|
|
||||||
OUTPUT_4MA = 0x5,
|
|
||||||
OUTPUT_8MA = 0x6,
|
|
||||||
OUTPUT_12MA = 0x7,
|
|
||||||
} PinMode;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
LSBFIRST = 0,
|
|
||||||
MSBFIRST = 1,
|
|
||||||
} BitOrder;
|
|
||||||
|
|
||||||
#define PI 3.1415926535897932384626433832795
|
|
||||||
#define HALF_PI 1.5707963267948966192313216916398
|
|
||||||
#define TWO_PI 6.283185307179586476925286766559
|
|
||||||
#define DEG_TO_RAD 0.017453292519943295769236907684886
|
|
||||||
#define RAD_TO_DEG 57.295779513082320876798154814105
|
|
||||||
#define EULER 2.718281828459045235360287471352
|
|
||||||
|
|
||||||
#define SERIAL 0x0
|
|
||||||
#define DISPLAY 0x1
|
|
||||||
|
|
||||||
#ifndef constrain
|
|
||||||
#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef radians
|
|
||||||
#define radians(deg) ((deg)*DEG_TO_RAD)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef degrees
|
|
||||||
#define degrees(rad) ((rad)*RAD_TO_DEG)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef sq
|
|
||||||
#define sq(x) ((x)*(x))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef void (*voidFuncPtr)(void);
|
|
||||||
typedef void (*voidFuncPtrParam)(void*);
|
|
||||||
|
|
||||||
// interrupts() / noInterrupts() must be defined by the core
|
|
||||||
|
|
||||||
#define lowByte(w) ((uint8_t) ((w) & 0xff))
|
|
||||||
#define highByte(w) ((uint8_t) ((w) >> 8))
|
|
||||||
|
|
||||||
#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
|
|
||||||
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
|
|
||||||
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
|
|
||||||
#define bitToggle(value, bit) ((value) ^= (1UL << (bit)))
|
|
||||||
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
|
|
||||||
|
|
||||||
#ifndef bit
|
|
||||||
#define bit(b) (1UL << (b))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* TODO: request for removal */
|
|
||||||
typedef bool boolean;
|
|
||||||
typedef uint8_t byte;
|
|
||||||
typedef uint16_t word;
|
|
||||||
|
|
||||||
void init(void);
|
|
||||||
void initVariant(void);
|
|
||||||
|
|
||||||
#ifndef HOST
|
|
||||||
int atexit(void (*func)()) __attribute__((weak));
|
|
||||||
#endif
|
|
||||||
int main() __attribute__((weak));
|
|
||||||
|
|
||||||
#ifdef EXTENDED_PIN_MODE
|
|
||||||
// Platforms who wnat to declare more than 256 pins need to define EXTENDED_PIN_MODE globally
|
|
||||||
typedef uint32_t pin_size_t;
|
|
||||||
#else
|
|
||||||
typedef uint8_t pin_size_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void pinMode(pin_size_t pinNumber, PinMode pinMode);
|
|
||||||
void digitalWrite(pin_size_t pinNumber, PinStatus status);
|
|
||||||
PinStatus digitalRead(pin_size_t pinNumber);
|
|
||||||
int analogRead(pin_size_t pinNumber);
|
|
||||||
void analogReference(uint8_t mode);
|
|
||||||
void analogWrite(pin_size_t pinNumber, int value);
|
|
||||||
|
|
||||||
unsigned long millis(void);
|
|
||||||
unsigned long micros(void);
|
|
||||||
void delay(unsigned long);
|
|
||||||
void delayMicroseconds(unsigned int us);
|
|
||||||
unsigned long pulseIn(pin_size_t pin, uint8_t state, unsigned long timeout);
|
|
||||||
unsigned long pulseInLong(pin_size_t pin, uint8_t state, unsigned long timeout);
|
|
||||||
|
|
||||||
void shiftOut(pin_size_t dataPin, pin_size_t clockPin, BitOrder bitOrder, uint8_t val);
|
|
||||||
uint8_t shiftIn(pin_size_t dataPin, pin_size_t clockPin, BitOrder bitOrder);
|
|
||||||
|
|
||||||
void attachInterrupt(pin_size_t interruptNumber, voidFuncPtr callback, PinStatus mode);
|
|
||||||
void attachInterruptParam(pin_size_t interruptNumber, voidFuncPtrParam callback, PinStatus mode, void* param);
|
|
||||||
void detachInterrupt(pin_size_t interruptNumber);
|
|
||||||
|
|
||||||
void setup(void);
|
|
||||||
void loop(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
template<class T, class L>
|
|
||||||
auto min(const T& a, const L& b) -> decltype((b < a) ? b : a)
|
|
||||||
{
|
|
||||||
return (b < a) ? b : a;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class T, class L>
|
|
||||||
auto max(const T& a, const L& b) -> decltype((b < a) ? b : a)
|
|
||||||
{
|
|
||||||
return (a < b) ? b : a;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#ifndef min
|
|
||||||
#define min(a,b) \
|
|
||||||
({ __typeof__ (a) _a = (a); \
|
|
||||||
__typeof__ (b) _b = (b); \
|
|
||||||
_a < _b ? _a : _b; })
|
|
||||||
#endif
|
|
||||||
#ifndef max
|
|
||||||
#define max(a,b) \
|
|
||||||
({ __typeof__ (a) _a = (a); \
|
|
||||||
__typeof__ (b) _b = (b); \
|
|
||||||
_a > _b ? _a : _b; })
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
|
|
||||||
/* C++ prototypes */
|
|
||||||
uint16_t makeWord(uint16_t w);
|
|
||||||
uint16_t makeWord(byte h, byte l);
|
|
||||||
|
|
||||||
#define word(...) makeWord(__VA_ARGS__)
|
|
||||||
|
|
||||||
unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L);
|
|
||||||
unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L);
|
|
||||||
|
|
||||||
void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0);
|
|
||||||
void noTone(uint8_t _pin);
|
|
||||||
|
|
||||||
// WMath prototypes
|
|
||||||
long random(long);
|
|
||||||
long random(long, long);
|
|
||||||
void randomSeed(unsigned long);
|
|
||||||
long map(long, long, long, long, long);
|
|
||||||
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,2 @@
|
||||||
#ifndef __COMPAT_H__
|
#pragma once
|
||||||
#define __COMPAT_H__
|
#include "../../../ArduinoCore-API/api/Compat.h"
|
||||||
|
|
||||||
namespace arduino {
|
|
||||||
|
|
||||||
inline void pinMode(pin_size_t pinNumber, int mode) {
|
|
||||||
pinMode(pinNumber, (PinMode)mode);
|
|
||||||
};
|
|
||||||
|
|
||||||
inline void digitalWrite(pin_size_t pinNumber, int status) {
|
|
||||||
digitalWrite(pinNumber, (PinStatus)status);
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
||||||
|
|
@ -1,47 +1,2 @@
|
||||||
/*
|
|
||||||
Copyright (c) 2016 Arduino LLC. All right reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
See the GNU Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include "../../../ArduinoCore-API/api/HardwareI2C.h"
|
||||||
#include <inttypes.h>
|
|
||||||
#include "Stream.h"
|
|
||||||
|
|
||||||
namespace arduino {
|
|
||||||
|
|
||||||
class HardwareI2C : public Stream
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual void begin() = 0;
|
|
||||||
virtual void begin(uint8_t address) = 0;
|
|
||||||
virtual void end() = 0;
|
|
||||||
|
|
||||||
virtual void setClock(uint32_t freq) = 0;
|
|
||||||
|
|
||||||
virtual void beginTransmission(uint8_t address) = 0;
|
|
||||||
virtual uint8_t endTransmission(bool stopBit) = 0;
|
|
||||||
virtual uint8_t endTransmission(void) = 0;
|
|
||||||
|
|
||||||
virtual size_t requestFrom(uint8_t address, size_t len, bool stopBit) = 0;
|
|
||||||
virtual size_t requestFrom(uint8_t address, size_t len) = 0;
|
|
||||||
|
|
||||||
virtual void onReceive(void(*)(int)) = 0;
|
|
||||||
virtual void onRequest(void(*)(void)) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,143 +1,2 @@
|
||||||
/*
|
|
||||||
Copyright (c) 2018 Arduino LLC. All right reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
See the GNU Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include "../../../ArduinoCore-API/api/HardwareSPI.h"
|
||||||
#include "Common.h"
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include "Stream.h"
|
|
||||||
|
|
||||||
#define SPI_HAS_TRANSACTION
|
|
||||||
|
|
||||||
namespace arduino {
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
SPI_MODE0 = 0,
|
|
||||||
SPI_MODE1 = 1,
|
|
||||||
SPI_MODE2 = 2,
|
|
||||||
SPI_MODE3 = 3,
|
|
||||||
} SPIMode;
|
|
||||||
|
|
||||||
|
|
||||||
class SPISettings {
|
|
||||||
public:
|
|
||||||
SPISettings(uint32_t clock, BitOrder bitOrder, SPIMode dataMode) {
|
|
||||||
if (__builtin_constant_p(clock)) {
|
|
||||||
init_AlwaysInline(clock, bitOrder, dataMode);
|
|
||||||
} else {
|
|
||||||
init_MightInline(clock, bitOrder, dataMode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SPISettings(uint32_t clock, BitOrder bitOrder, int dataMode) {
|
|
||||||
if (__builtin_constant_p(clock)) {
|
|
||||||
init_AlwaysInline(clock, bitOrder, (SPIMode)dataMode);
|
|
||||||
} else {
|
|
||||||
init_MightInline(clock, bitOrder, (SPIMode)dataMode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Default speed set to 4MHz, SPI mode set to MODE 0 and Bit order set to MSB first.
|
|
||||||
SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0); }
|
|
||||||
|
|
||||||
bool operator==(const SPISettings& rhs) const
|
|
||||||
{
|
|
||||||
if ((this->clockFreq == rhs.clockFreq) &&
|
|
||||||
(this->bitOrder == rhs.bitOrder) &&
|
|
||||||
(this->dataMode == rhs.dataMode)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=(const SPISettings& rhs) const
|
|
||||||
{
|
|
||||||
return !(*this == rhs);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t getClockFreq() const {
|
|
||||||
return clockFreq;
|
|
||||||
}
|
|
||||||
SPIMode getDataMode() const {
|
|
||||||
return dataMode;
|
|
||||||
}
|
|
||||||
BitOrder getBitOrder() const {
|
|
||||||
return (bitOrder);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void init_MightInline(uint32_t clock, BitOrder bitOrder, SPIMode dataMode) {
|
|
||||||
init_AlwaysInline(clock, bitOrder, dataMode);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Core developer MUST use an helper function in beginTransaction() to use this data
|
|
||||||
void init_AlwaysInline(uint32_t clock, BitOrder bitOrder, SPIMode dataMode) __attribute__((__always_inline__)) {
|
|
||||||
this->clockFreq = clock;
|
|
||||||
this->dataMode = dataMode;
|
|
||||||
this->bitOrder = bitOrder;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t clockFreq;
|
|
||||||
SPIMode dataMode;
|
|
||||||
BitOrder bitOrder;
|
|
||||||
|
|
||||||
friend class HardwareSPI;
|
|
||||||
};
|
|
||||||
|
|
||||||
const SPISettings DEFAULT_SPI_SETTINGS = SPISettings();
|
|
||||||
|
|
||||||
class HardwareSPI
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual ~HardwareSPI() { }
|
|
||||||
|
|
||||||
virtual uint8_t transfer(uint8_t data) = 0;
|
|
||||||
virtual uint16_t transfer16(uint16_t data) = 0;
|
|
||||||
virtual void transfer(void *buf, size_t count) = 0;
|
|
||||||
|
|
||||||
// New transfer API. If either send or recv == nullptr then ignore it
|
|
||||||
virtual void transfer(const void *send, void *recv, size_t count) {
|
|
||||||
const uint8_t *out = (const uint8_t *)send;
|
|
||||||
uint8_t *in = (uint8_t *)recv;
|
|
||||||
for (size_t i = 0; i < count; i++) {
|
|
||||||
uint8_t t = out ? *(out++) : 0xff;
|
|
||||||
t = transfer(t);
|
|
||||||
if (in) {
|
|
||||||
*(in++) = t;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transaction Functions
|
|
||||||
virtual void usingInterrupt(int interruptNumber) = 0;
|
|
||||||
virtual void notUsingInterrupt(int interruptNumber) = 0;
|
|
||||||
virtual void beginTransaction(SPISettings settings) = 0;
|
|
||||||
virtual void endTransaction(void) = 0;
|
|
||||||
|
|
||||||
// SPI Configuration methods
|
|
||||||
virtual void attachInterrupt() = 0;
|
|
||||||
virtual void detachInterrupt() = 0;
|
|
||||||
|
|
||||||
virtual void begin() = 0;
|
|
||||||
virtual void end() = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Alias SPIClass to HardwareSPI since it's already the defacto standard for SPI classe name
|
|
||||||
typedef HardwareSPI SPIClass;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,105 +1,2 @@
|
||||||
/*
|
|
||||||
Copyright (c) 2016 Arduino LLC. All right reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
See the GNU Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include "../../../ArduinoCore-API/api/HardwareSerial.h"
|
||||||
#include <inttypes.h>
|
|
||||||
#include "Stream.h"
|
|
||||||
|
|
||||||
namespace arduino {
|
|
||||||
|
|
||||||
// XXX: Those constants should be defined as const int / enums?
|
|
||||||
// XXX: shall we use namespaces too?
|
|
||||||
#define SERIAL_PARITY_EVEN (0x1ul)
|
|
||||||
#define SERIAL_PARITY_ODD (0x2ul)
|
|
||||||
#define SERIAL_PARITY_NONE (0x3ul)
|
|
||||||
#define SERIAL_PARITY_MARK (0x4ul)
|
|
||||||
#define SERIAL_PARITY_SPACE (0x5ul)
|
|
||||||
#define SERIAL_PARITY_MASK (0xFul)
|
|
||||||
|
|
||||||
#define SERIAL_STOP_BIT_1 (0x10ul)
|
|
||||||
#define SERIAL_STOP_BIT_1_5 (0x20ul)
|
|
||||||
#define SERIAL_STOP_BIT_2 (0x30ul)
|
|
||||||
#define SERIAL_STOP_BIT_MASK (0xF0ul)
|
|
||||||
|
|
||||||
#define SERIAL_DATA_5 (0x100ul)
|
|
||||||
#define SERIAL_DATA_6 (0x200ul)
|
|
||||||
#define SERIAL_DATA_7 (0x300ul)
|
|
||||||
#define SERIAL_DATA_8 (0x400ul)
|
|
||||||
#define SERIAL_DATA_MASK (0xF00ul)
|
|
||||||
|
|
||||||
#define SERIAL_5N1 (SERIAL_STOP_BIT_1 | SERIAL_PARITY_NONE | SERIAL_DATA_5)
|
|
||||||
#define SERIAL_6N1 (SERIAL_STOP_BIT_1 | SERIAL_PARITY_NONE | SERIAL_DATA_6)
|
|
||||||
#define SERIAL_7N1 (SERIAL_STOP_BIT_1 | SERIAL_PARITY_NONE | SERIAL_DATA_7)
|
|
||||||
#define SERIAL_8N1 (SERIAL_STOP_BIT_1 | SERIAL_PARITY_NONE | SERIAL_DATA_8)
|
|
||||||
#define SERIAL_5N2 (SERIAL_STOP_BIT_2 | SERIAL_PARITY_NONE | SERIAL_DATA_5)
|
|
||||||
#define SERIAL_6N2 (SERIAL_STOP_BIT_2 | SERIAL_PARITY_NONE | SERIAL_DATA_6)
|
|
||||||
#define SERIAL_7N2 (SERIAL_STOP_BIT_2 | SERIAL_PARITY_NONE | SERIAL_DATA_7)
|
|
||||||
#define SERIAL_8N2 (SERIAL_STOP_BIT_2 | SERIAL_PARITY_NONE | SERIAL_DATA_8)
|
|
||||||
#define SERIAL_5E1 (SERIAL_STOP_BIT_1 | SERIAL_PARITY_EVEN | SERIAL_DATA_5)
|
|
||||||
#define SERIAL_6E1 (SERIAL_STOP_BIT_1 | SERIAL_PARITY_EVEN | SERIAL_DATA_6)
|
|
||||||
#define SERIAL_7E1 (SERIAL_STOP_BIT_1 | SERIAL_PARITY_EVEN | SERIAL_DATA_7)
|
|
||||||
#define SERIAL_8E1 (SERIAL_STOP_BIT_1 | SERIAL_PARITY_EVEN | SERIAL_DATA_8)
|
|
||||||
#define SERIAL_5E2 (SERIAL_STOP_BIT_2 | SERIAL_PARITY_EVEN | SERIAL_DATA_5)
|
|
||||||
#define SERIAL_6E2 (SERIAL_STOP_BIT_2 | SERIAL_PARITY_EVEN | SERIAL_DATA_6)
|
|
||||||
#define SERIAL_7E2 (SERIAL_STOP_BIT_2 | SERIAL_PARITY_EVEN | SERIAL_DATA_7)
|
|
||||||
#define SERIAL_8E2 (SERIAL_STOP_BIT_2 | SERIAL_PARITY_EVEN | SERIAL_DATA_8)
|
|
||||||
#define SERIAL_5O1 (SERIAL_STOP_BIT_1 | SERIAL_PARITY_ODD | SERIAL_DATA_5)
|
|
||||||
#define SERIAL_6O1 (SERIAL_STOP_BIT_1 | SERIAL_PARITY_ODD | SERIAL_DATA_6)
|
|
||||||
#define SERIAL_7O1 (SERIAL_STOP_BIT_1 | SERIAL_PARITY_ODD | SERIAL_DATA_7)
|
|
||||||
#define SERIAL_8O1 (SERIAL_STOP_BIT_1 | SERIAL_PARITY_ODD | SERIAL_DATA_8)
|
|
||||||
#define SERIAL_5O2 (SERIAL_STOP_BIT_2 | SERIAL_PARITY_ODD | SERIAL_DATA_5)
|
|
||||||
#define SERIAL_6O2 (SERIAL_STOP_BIT_2 | SERIAL_PARITY_ODD | SERIAL_DATA_6)
|
|
||||||
#define SERIAL_7O2 (SERIAL_STOP_BIT_2 | SERIAL_PARITY_ODD | SERIAL_DATA_7)
|
|
||||||
#define SERIAL_8O2 (SERIAL_STOP_BIT_2 | SERIAL_PARITY_ODD | SERIAL_DATA_8)
|
|
||||||
#define SERIAL_5M1 (SERIAL_STOP_BIT_1 | SERIAL_PARITY_MARK | SERIAL_DATA_5)
|
|
||||||
#define SERIAL_6M1 (SERIAL_STOP_BIT_1 | SERIAL_PARITY_MARK | SERIAL_DATA_6)
|
|
||||||
#define SERIAL_7M1 (SERIAL_STOP_BIT_1 | SERIAL_PARITY_MARK | SERIAL_DATA_7)
|
|
||||||
#define SERIAL_8M1 (SERIAL_STOP_BIT_1 | SERIAL_PARITY_MARK | SERIAL_DATA_8)
|
|
||||||
#define SERIAL_5M2 (SERIAL_STOP_BIT_2 | SERIAL_PARITY_MARK | SERIAL_DATA_5)
|
|
||||||
#define SERIAL_6M2 (SERIAL_STOP_BIT_2 | SERIAL_PARITY_MARK | SERIAL_DATA_6)
|
|
||||||
#define SERIAL_7M2 (SERIAL_STOP_BIT_2 | SERIAL_PARITY_MARK | SERIAL_DATA_7)
|
|
||||||
#define SERIAL_8M2 (SERIAL_STOP_BIT_2 | SERIAL_PARITY_MARK | SERIAL_DATA_8)
|
|
||||||
#define SERIAL_5S1 (SERIAL_STOP_BIT_1 | SERIAL_PARITY_SPACE | SERIAL_DATA_5)
|
|
||||||
#define SERIAL_6S1 (SERIAL_STOP_BIT_1 | SERIAL_PARITY_SPACE | SERIAL_DATA_6)
|
|
||||||
#define SERIAL_7S1 (SERIAL_STOP_BIT_1 | SERIAL_PARITY_SPACE | SERIAL_DATA_7)
|
|
||||||
#define SERIAL_8S1 (SERIAL_STOP_BIT_1 | SERIAL_PARITY_SPACE | SERIAL_DATA_8)
|
|
||||||
#define SERIAL_5S2 (SERIAL_STOP_BIT_2 | SERIAL_PARITY_SPACE | SERIAL_DATA_5)
|
|
||||||
#define SERIAL_6S2 (SERIAL_STOP_BIT_2 | SERIAL_PARITY_SPACE | SERIAL_DATA_6)
|
|
||||||
#define SERIAL_7S2 (SERIAL_STOP_BIT_2 | SERIAL_PARITY_SPACE | SERIAL_DATA_7)
|
|
||||||
#define SERIAL_8S2 (SERIAL_STOP_BIT_2 | SERIAL_PARITY_SPACE | SERIAL_DATA_8)
|
|
||||||
|
|
||||||
class HardwareSerial : public Stream
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual void begin(unsigned long) = 0;
|
|
||||||
virtual void begin(unsigned long baudrate, uint16_t config) = 0;
|
|
||||||
virtual void end() = 0;
|
|
||||||
virtual int available(void) = 0;
|
|
||||||
virtual int peek(void) = 0;
|
|
||||||
virtual int read(void) = 0;
|
|
||||||
virtual void flush(void) = 0;
|
|
||||||
virtual size_t write(uint8_t) = 0;
|
|
||||||
using Print::write; // pull in write(str) and write(buf, size) from Print
|
|
||||||
virtual operator bool() = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
// XXX: Are we keeping the serialEvent API?
|
|
||||||
extern void serialEventRun(void) __attribute__((weak));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,248 +1 @@
|
||||||
/*
|
#include "../../../ArduinoCore-API/api/IPAddress.cpp"
|
||||||
IPAddress.cpp - Base class that provides IPAddress
|
|
||||||
Copyright (c) 2011 Adrian McEwen. All right reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <Arduino.h>
|
|
||||||
#include <IPAddress.h>
|
|
||||||
#include <Print.h>
|
|
||||||
|
|
||||||
IPAddress::IPAddress(const IPAddress& from)
|
|
||||||
{
|
|
||||||
ip_addr_copy(_ip, from._ip);
|
|
||||||
}
|
|
||||||
|
|
||||||
IPAddress::IPAddress() {
|
|
||||||
_ip = *IP_ANY_TYPE; // lwIP's v4-or-v6 generic address
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IPAddress::isSet () const {
|
|
||||||
return !ip_addr_isany(&_ip) && ((*this) != IPADDR_NONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
IPAddress::IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet) {
|
|
||||||
setV4();
|
|
||||||
(*this)[0] = first_octet;
|
|
||||||
(*this)[1] = second_octet;
|
|
||||||
(*this)[2] = third_octet;
|
|
||||||
(*this)[3] = fourth_octet;
|
|
||||||
}
|
|
||||||
|
|
||||||
void IPAddress::ctor32(uint32_t address) {
|
|
||||||
setV4();
|
|
||||||
v4() = address;
|
|
||||||
}
|
|
||||||
|
|
||||||
IPAddress::IPAddress(const uint8_t *address) {
|
|
||||||
setV4();
|
|
||||||
(*this)[0] = address[0];
|
|
||||||
(*this)[1] = address[1];
|
|
||||||
(*this)[2] = address[2];
|
|
||||||
(*this)[3] = address[3];
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IPAddress::fromString(const char *address) {
|
|
||||||
if (!fromString4(address)) {
|
|
||||||
#if LWIP_IPV6
|
|
||||||
return fromString6(address);
|
|
||||||
#else
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IPAddress::fromString4(const char *address) {
|
|
||||||
// TODO: (IPv4) add support for "a", "a.b", "a.b.c" formats
|
|
||||||
|
|
||||||
uint16_t acc = 0; // Accumulator
|
|
||||||
uint8_t dots = 0;
|
|
||||||
|
|
||||||
while (*address)
|
|
||||||
{
|
|
||||||
char c = *address++;
|
|
||||||
if (c >= '0' && c <= '9')
|
|
||||||
{
|
|
||||||
acc = acc * 10 + (c - '0');
|
|
||||||
if (acc > 255) {
|
|
||||||
// Value out of [0..255] range
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (c == '.')
|
|
||||||
{
|
|
||||||
if (dots == 3) {
|
|
||||||
// Too much dots (there must be 3 dots)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
(*this)[dots++] = acc;
|
|
||||||
acc = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Invalid char
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dots != 3) {
|
|
||||||
// Too few dots (there must be 3 dots)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
(*this)[3] = acc;
|
|
||||||
|
|
||||||
setV4();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
IPAddress& IPAddress::operator=(const uint8_t *address) {
|
|
||||||
setV4();
|
|
||||||
v4() = *reinterpret_cast<const uint32_t*>(address);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
IPAddress& IPAddress::operator=(uint32_t address) {
|
|
||||||
setV4();
|
|
||||||
v4() = address;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IPAddress::operator==(const uint8_t* addr) const {
|
|
||||||
return isV4() && v4() == *reinterpret_cast<const uint32_t*>(addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t IPAddress::printTo(Print& p) const {
|
|
||||||
String s = toString();
|
|
||||||
return p.print(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
String IPAddress::toString() const
|
|
||||||
{
|
|
||||||
String s;
|
|
||||||
|
|
||||||
if (!isSet())
|
|
||||||
return "(IP unset)";
|
|
||||||
|
|
||||||
#if LWIP_IPV6
|
|
||||||
if (isV6()) {
|
|
||||||
int count0 = 0;
|
|
||||||
for (int i = 0; i < 8; i++) {
|
|
||||||
uint16_t bit = PP_NTOHS(raw6()[i]);
|
|
||||||
if (bit || count0 < 0) {
|
|
||||||
char buff[64];
|
|
||||||
snprintf(buff, 64, "%x", bit);
|
|
||||||
buff[63] = 0;
|
|
||||||
s += buff;
|
|
||||||
if (count0 > 0)
|
|
||||||
// no more hiding 0
|
|
||||||
count0 = -8;
|
|
||||||
} else
|
|
||||||
count0++;
|
|
||||||
if ((i != 7 && count0 < 2) || count0 == 7)
|
|
||||||
s += ':';
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for(int i = 0; i < 4; i++) {
|
|
||||||
char buff[16];
|
|
||||||
snprintf(buff, 16, "%d", (*this)[i]);
|
|
||||||
buff[15] = 0;
|
|
||||||
s += buff;
|
|
||||||
if (i != 3)
|
|
||||||
s += '.';
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IPAddress::isValid(const String& arg) {
|
|
||||||
return IPAddress().fromString(arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IPAddress::isValid(const char* arg) {
|
|
||||||
return IPAddress().fromString(arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace arduino {
|
|
||||||
const IPAddress INADDR_ANY; // generic "0.0.0.0" for IPv4 & IPv6
|
|
||||||
const IPAddress INADDR_NONE(255,255,255,255);
|
|
||||||
};
|
|
||||||
|
|
||||||
void IPAddress::clear() {
|
|
||||||
(*this) = INADDR_ANY;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************/
|
|
||||||
|
|
||||||
#if LWIP_IPV6
|
|
||||||
|
|
||||||
bool IPAddress::fromString6(const char *address) {
|
|
||||||
// TODO: test test test
|
|
||||||
|
|
||||||
uint32_t acc = 0; // Accumulator
|
|
||||||
int dots = 0, doubledots = -1;
|
|
||||||
|
|
||||||
while (*address)
|
|
||||||
{
|
|
||||||
char c = tolower(*address++);
|
|
||||||
if (isalnum(c)) {
|
|
||||||
if (c >= 'a')
|
|
||||||
c -= 'a' - '0' - 10;
|
|
||||||
acc = acc * 16 + (c - '0');
|
|
||||||
if (acc > 0xffff)
|
|
||||||
// Value out of range
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else if (c == ':') {
|
|
||||||
if (*address == ':') {
|
|
||||||
if (doubledots >= 0)
|
|
||||||
// :: allowed once
|
|
||||||
return false;
|
|
||||||
// remember location
|
|
||||||
doubledots = dots + !!acc;
|
|
||||||
address++;
|
|
||||||
}
|
|
||||||
if (dots == 7)
|
|
||||||
// too many separators
|
|
||||||
return false;
|
|
||||||
raw6()[dots++] = PP_HTONS(acc);
|
|
||||||
acc = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
// Invalid char
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (doubledots == -1 && dots != 7)
|
|
||||||
// Too few separators
|
|
||||||
return false;
|
|
||||||
raw6()[dots++] = PP_HTONS(acc);
|
|
||||||
|
|
||||||
if (doubledots != -1) {
|
|
||||||
for (int i = dots - doubledots - 1; i >= 0; i--)
|
|
||||||
raw6()[8 - dots + doubledots + i] = raw6()[doubledots + i];
|
|
||||||
for (int i = doubledots; i < 8 - dots + doubledots; i++)
|
|
||||||
raw6()[i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
setV6();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
||||||
|
|
@ -1,236 +1,2 @@
|
||||||
/*
|
|
||||||
IPAddress.h - Base class that provides IPAddress
|
|
||||||
Copyright (c) 2011 Adrian McEwen. All right reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include "../../../ArduinoCore-API/api/IPAddress.h"
|
||||||
#include <stdint.h>
|
|
||||||
#include <api/String.h>
|
|
||||||
#include <Printable.h>
|
|
||||||
|
|
||||||
#include <lwip/init.h>
|
|
||||||
#include <lwip/ip_addr.h>
|
|
||||||
#include <lwip/ip4_addr.h>
|
|
||||||
|
|
||||||
|
|
||||||
// forward declarations of global name space friend classes
|
|
||||||
class EthernetClass;
|
|
||||||
class DhcpClass;
|
|
||||||
class DNSClient;
|
|
||||||
|
|
||||||
|
|
||||||
namespace arduino {
|
|
||||||
|
|
||||||
// to display a netif id with printf:
|
|
||||||
#define NETIFID_STR "%c%c%u"
|
|
||||||
#define NETIFID_VAL(netif) \
|
|
||||||
((netif)? (netif)->name[0]: '-'), \
|
|
||||||
((netif)? (netif)->name[1]: '-'), \
|
|
||||||
((netif)? netif_get_index(netif): 42)
|
|
||||||
|
|
||||||
// A class to make it easier to handle and pass around IP addresses
|
|
||||||
// IPv6 update:
|
|
||||||
// IPAddress is now a decorator class for lwIP's ip_addr_t
|
|
||||||
// fully backward compatible with legacy IPv4-only Arduino's
|
|
||||||
// with unchanged footprint when IPv6 is disabled
|
|
||||||
|
|
||||||
class IPAddress: public Printable {
|
|
||||||
private:
|
|
||||||
#if !LWIP_IPV6
|
|
||||||
// Ugly hack to allow Arduino Ethernet library to twiddle internal bits.
|
|
||||||
// This can only work in IPv4-only mode, of course.
|
|
||||||
union {
|
|
||||||
ip_addr_t _ip;
|
|
||||||
struct {
|
|
||||||
uint8_t bytes[4];
|
|
||||||
} _address;
|
|
||||||
};
|
|
||||||
static_assert(sizeof(_ip) == sizeof(_address), "IP_ADDR_T size != _ADDRESS size");
|
|
||||||
#else
|
|
||||||
ip_addr_t _ip;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Access the raw byte array containing the address. Because this returns a pointer
|
|
||||||
// to the internal structure rather than a copy of the address this function should only
|
|
||||||
// be used when you know that the usage of the returned uint8_t* will be transient and not
|
|
||||||
// stored.
|
|
||||||
uint8_t* raw_address() {
|
|
||||||
return reinterpret_cast<uint8_t*>(&v4());
|
|
||||||
}
|
|
||||||
const uint8_t* raw_address() const {
|
|
||||||
return reinterpret_cast<const uint8_t*>(&v4());
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctor32 (uint32_t);
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Constructors
|
|
||||||
IPAddress();
|
|
||||||
IPAddress(const IPAddress& from);
|
|
||||||
IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet);
|
|
||||||
IPAddress(uint32_t address) { ctor32(address); }
|
|
||||||
// IPAddress(unsigned long address) { ctor32(address); }
|
|
||||||
IPAddress(int address) { ctor32(address); }
|
|
||||||
IPAddress(const uint8_t *address);
|
|
||||||
|
|
||||||
bool fromString(const char *address);
|
|
||||||
bool fromString(const String &address) { return fromString(address.c_str()); }
|
|
||||||
|
|
||||||
// Overloaded cast operator to allow IPAddress objects to be used where a pointer
|
|
||||||
// to a four-byte uint8_t array is expected
|
|
||||||
operator uint32_t() const { return isV4()? v4(): (uint32_t)0; }
|
|
||||||
operator uint32_t() { return isV4()? v4(): (uint32_t)0; }
|
|
||||||
|
|
||||||
bool isSet () const;
|
|
||||||
operator bool () const { return isSet(); } // <-
|
|
||||||
operator bool () { return isSet(); } // <- both are needed
|
|
||||||
|
|
||||||
// generic IPv4 wrapper to uint32-view like arduino loves to see it
|
|
||||||
const uint32_t& v4() const { return ip_2_ip4(&_ip)->addr; } // for raw_address(const)
|
|
||||||
uint32_t& v4() { return ip_2_ip4(&_ip)->addr; }
|
|
||||||
|
|
||||||
bool operator==(const IPAddress& addr) const {
|
|
||||||
return ip_addr_cmp(&_ip, &addr._ip);
|
|
||||||
}
|
|
||||||
bool operator!=(const IPAddress& addr) const {
|
|
||||||
return !ip_addr_cmp(&_ip, &addr._ip);
|
|
||||||
}
|
|
||||||
bool operator==(uint32_t addr) const {
|
|
||||||
return isV4() && v4() == addr;
|
|
||||||
}
|
|
||||||
// bool operator==(unsigned long addr) const {
|
|
||||||
// return isV4() && v4() == (uint32_t)addr;
|
|
||||||
// }
|
|
||||||
bool operator!=(uint32_t addr) const {
|
|
||||||
return !(isV4() && v4() == addr);
|
|
||||||
}
|
|
||||||
// bool operator!=(unsigned long addr) const {
|
|
||||||
// return isV4() && v4() != (uint32_t)addr;
|
|
||||||
// }
|
|
||||||
bool operator==(const uint8_t* addr) const;
|
|
||||||
|
|
||||||
int operator>>(int n) const {
|
|
||||||
return isV4()? v4() >> n: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Overloaded index operator to allow getting and setting individual octets of the address
|
|
||||||
uint8_t operator[](int index) const {
|
|
||||||
return isV4()? *(raw_address() + index): 0;
|
|
||||||
}
|
|
||||||
uint8_t& operator[](int index) {
|
|
||||||
setV4();
|
|
||||||
return *(raw_address() + index);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Overloaded copy operators to allow initialisation of IPAddress objects from other types
|
|
||||||
IPAddress& operator=(const uint8_t *address);
|
|
||||||
IPAddress& operator=(uint32_t address);
|
|
||||||
IPAddress& operator=(const IPAddress&) = default;
|
|
||||||
|
|
||||||
virtual size_t printTo(Print& p) const;
|
|
||||||
String toString() const;
|
|
||||||
|
|
||||||
void clear();
|
|
||||||
|
|
||||||
/*
|
|
||||||
check if input string(arg) is a valid IPV4 address or not.
|
|
||||||
return true on valid.
|
|
||||||
return false on invalid.
|
|
||||||
*/
|
|
||||||
static bool isValid(const String& arg);
|
|
||||||
static bool isValid(const char* arg);
|
|
||||||
|
|
||||||
friend class WiFiClass;
|
|
||||||
friend class EthernetClass;
|
|
||||||
friend class UDP;
|
|
||||||
friend class Client;
|
|
||||||
friend class Server;
|
|
||||||
friend class DhcpClass;
|
|
||||||
friend class DNSClient;
|
|
||||||
|
|
||||||
friend ::EthernetClass;
|
|
||||||
friend ::DhcpClass;
|
|
||||||
friend ::DNSClient;
|
|
||||||
|
|
||||||
/*
|
|
||||||
lwIP address compatibility
|
|
||||||
*/
|
|
||||||
//IPAddress(const ipv4_addr& fw_addr) { setV4(); v4() = fw_addr.addr; }
|
|
||||||
//IPAddress(const ipv4_addr* fw_addr) { setV4(); v4() = fw_addr->addr; }
|
|
||||||
|
|
||||||
//IPAddress& operator=(const ipv4_addr& fw_addr) { setV4(); v4() = fw_addr.addr; return *this; }
|
|
||||||
//IPAddress& operator=(const ipv4_addr* fw_addr) { setV4(); v4() = fw_addr->addr; return *this; }
|
|
||||||
|
|
||||||
operator ip_addr_t () const { return _ip; }
|
|
||||||
operator const ip_addr_t*() const { return &_ip; }
|
|
||||||
operator ip_addr_t*() { return &_ip; }
|
|
||||||
|
|
||||||
bool isV4() const { return IP_IS_V4_VAL(_ip); }
|
|
||||||
void setV4() { IP_SET_TYPE_VAL(_ip, IPADDR_TYPE_V4); }
|
|
||||||
|
|
||||||
bool isLocal () const { return ip_addr_islinklocal(&_ip); }
|
|
||||||
|
|
||||||
|
|
||||||
IPAddress(const ip_addr_t& lwip_addr) { ip_addr_copy(_ip, lwip_addr); }
|
|
||||||
IPAddress(const ip_addr_t* lwip_addr) { ip_addr_copy(_ip, *lwip_addr); }
|
|
||||||
|
|
||||||
IPAddress& operator=(const ip_addr_t& lwip_addr) { ip_addr_copy(_ip, lwip_addr); return *this; }
|
|
||||||
IPAddress& operator=(const ip_addr_t* lwip_addr) { ip_addr_copy(_ip, *lwip_addr); return *this; }
|
|
||||||
|
|
||||||
#if LWIP_IPV6
|
|
||||||
uint16_t* raw6()
|
|
||||||
{
|
|
||||||
setV6();
|
|
||||||
return reinterpret_cast<uint16_t*>(ip_2_ip6(&_ip));
|
|
||||||
}
|
|
||||||
|
|
||||||
const uint16_t* raw6() const
|
|
||||||
{
|
|
||||||
return isV6()? reinterpret_cast<const uint16_t*>(ip_2_ip6(&_ip)): nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// when not IPv6, ip_addr_t == ip4_addr_t so this one would be ambiguous
|
|
||||||
// required otherwise
|
|
||||||
operator const ip4_addr_t*() const { return isV4()? ip_2_ip4(&_ip): nullptr; }
|
|
||||||
|
|
||||||
bool isV6() const { return IP_IS_V6_VAL(_ip); }
|
|
||||||
void setV6() { IP_SET_TYPE_VAL(_ip, IPADDR_TYPE_V6); }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
bool fromString6(const char *address);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
// allow portable code when IPv6 is not enabled
|
|
||||||
|
|
||||||
uint16_t* raw6() { return nullptr; }
|
|
||||||
const uint16_t* raw6() const { return nullptr; }
|
|
||||||
bool isV6() const { return false; }
|
|
||||||
void setV6() { }
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
protected:
|
|
||||||
bool fromString4(const char *address);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
extern const IPAddress INADDR_ANY;
|
|
||||||
extern const IPAddress INADDR_NONE;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,44 +1,2 @@
|
||||||
#ifndef W_INTERRUPTS_CPP
|
#pragma once
|
||||||
#define W_INTERRUPTS_CPP
|
#include "../../../ArduinoCore-API/api/Interrupts.h"
|
||||||
#ifdef __cplusplus
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "Common.h"
|
|
||||||
|
|
||||||
namespace arduino {
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
using voidTemplateFuncPtrParam = void (*)(T param);
|
|
||||||
|
|
||||||
template<typename T> struct __container__ {
|
|
||||||
void* param;
|
|
||||||
voidTemplateFuncPtrParam<T> function;
|
|
||||||
};
|
|
||||||
|
|
||||||
// C++ only overloaded version of attachInterrupt function
|
|
||||||
template<typename T> void attachInterrupt(pin_size_t interruptNum, voidTemplateFuncPtrParam<T> userFunc, PinStatus mode, T& param) {
|
|
||||||
|
|
||||||
struct __container__<T> *cont = new __container__<T>();
|
|
||||||
cont->param = ¶m;
|
|
||||||
cont->function = userFunc;
|
|
||||||
|
|
||||||
// TODO: check lambda scope
|
|
||||||
// TODO: add structure to delete(__container__) when detachInterrupt() is called
|
|
||||||
auto f = [](void* a) -> void
|
|
||||||
{
|
|
||||||
T param = *(T*)((struct __container__<T>*)a)->param;
|
|
||||||
(((struct __container__<T>*)a)->function)(param);
|
|
||||||
};
|
|
||||||
|
|
||||||
attachInterruptParam(interruptNum, f, mode, cont);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T> void attachInterrupt(pin_size_t interruptNum, voidTemplateFuncPtrParam<T*> userFunc, PinStatus mode, T* param) {
|
|
||||||
attachInterruptParam(interruptNum, (voidFuncPtrParam)userFunc, mode, (void*)param);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
|
||||||
|
|
@ -1,101 +1 @@
|
||||||
/*
|
#include "../../../ArduinoCore-API/api/PluggableUSB.cpp"
|
||||||
PluggableUSB.cpp
|
|
||||||
Copyright (c) 2015 Arduino LLC
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "USBAPI.h"
|
|
||||||
#include "PluggableUSB.h"
|
|
||||||
|
|
||||||
using namespace arduino;
|
|
||||||
|
|
||||||
int PluggableUSB_::getInterface(uint8_t* interfaceCount)
|
|
||||||
{
|
|
||||||
int sent = 0;
|
|
||||||
PluggableUSBModule* node;
|
|
||||||
for (node = rootNode; node; node = node->next) {
|
|
||||||
int res = node->getInterface(interfaceCount);
|
|
||||||
if (res < 0)
|
|
||||||
return -1;
|
|
||||||
sent += res;
|
|
||||||
}
|
|
||||||
return sent;
|
|
||||||
}
|
|
||||||
|
|
||||||
int PluggableUSB_::getDescriptor(USBSetup& setup)
|
|
||||||
{
|
|
||||||
PluggableUSBModule* node;
|
|
||||||
for (node = rootNode; node; node = node->next) {
|
|
||||||
int ret = node->getDescriptor(setup);
|
|
||||||
// ret!=0 -> request has been processed
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PluggableUSB_::getShortName(char *iSerialNum)
|
|
||||||
{
|
|
||||||
PluggableUSBModule* node;
|
|
||||||
for (node = rootNode; node; node = node->next) {
|
|
||||||
iSerialNum += node->getShortName(iSerialNum);
|
|
||||||
}
|
|
||||||
*iSerialNum = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PluggableUSB_::setup(USBSetup& setup)
|
|
||||||
{
|
|
||||||
PluggableUSBModule* node;
|
|
||||||
for (node = rootNode; node; node = node->next) {
|
|
||||||
if (node->setup(setup)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PluggableUSB_::plug(PluggableUSBModule *node)
|
|
||||||
{
|
|
||||||
if ((lastEp + node->numEndpoints) > totalEP) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!rootNode) {
|
|
||||||
rootNode = node;
|
|
||||||
} else {
|
|
||||||
PluggableUSBModule *current = rootNode;
|
|
||||||
while (current->next) {
|
|
||||||
current = current->next;
|
|
||||||
}
|
|
||||||
current->next = node;
|
|
||||||
}
|
|
||||||
|
|
||||||
node->pluggedInterface = lastIf;
|
|
||||||
node->pluggedEndpoint = lastEp;
|
|
||||||
lastIf += node->numInterfaces;
|
|
||||||
for (uint8_t i = 0; i < node->numEndpoints; i++) {
|
|
||||||
*(unsigned int*)(epBuffer(lastEp)) = node->endpointType[i];
|
|
||||||
lastEp++;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
// restart USB layer???
|
|
||||||
}
|
|
||||||
|
|
||||||
PluggableUSB_& PluggableUSB()
|
|
||||||
{
|
|
||||||
static PluggableUSB_ obj;
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,78 +1,2 @@
|
||||||
/*
|
#pragma once
|
||||||
PluggableUSB.h
|
#include "../../../ArduinoCore-API/api/PluggableUSB.h"
|
||||||
Copyright (c) 2015 Arduino LLC
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef PUSB_h
|
|
||||||
#define PUSB_h
|
|
||||||
|
|
||||||
#include "USBAPI.h"
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
namespace arduino {
|
|
||||||
|
|
||||||
class PluggableUSBModule {
|
|
||||||
public:
|
|
||||||
PluggableUSBModule(uint8_t numEps, uint8_t numIfs, unsigned int *epType) :
|
|
||||||
numEndpoints(numEps), numInterfaces(numIfs), endpointType(epType)
|
|
||||||
{ }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual bool setup(USBSetup& setup) = 0;
|
|
||||||
virtual int getInterface(uint8_t* interfaceCount) = 0;
|
|
||||||
virtual int getDescriptor(USBSetup& setup) = 0;
|
|
||||||
virtual uint8_t getShortName(char *name) { name[0] = 'A'+pluggedInterface; return 1; }
|
|
||||||
|
|
||||||
uint8_t pluggedInterface;
|
|
||||||
uint8_t pluggedEndpoint;
|
|
||||||
|
|
||||||
const uint8_t numEndpoints;
|
|
||||||
const uint8_t numInterfaces;
|
|
||||||
const unsigned int *endpointType;
|
|
||||||
|
|
||||||
PluggableUSBModule *next = NULL;
|
|
||||||
|
|
||||||
friend class PluggableUSB_;
|
|
||||||
};
|
|
||||||
|
|
||||||
class PluggableUSB_ {
|
|
||||||
public:
|
|
||||||
PluggableUSB_();
|
|
||||||
bool plug(PluggableUSBModule *node);
|
|
||||||
int getInterface(uint8_t* interfaceCount);
|
|
||||||
int getDescriptor(USBSetup& setup);
|
|
||||||
bool setup(USBSetup& setup);
|
|
||||||
void getShortName(char *iSerialNum);
|
|
||||||
|
|
||||||
private:
|
|
||||||
uint8_t lastIf;
|
|
||||||
uint8_t lastEp;
|
|
||||||
PluggableUSBModule* rootNode;
|
|
||||||
uint8_t totalEP;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// core need to define
|
|
||||||
void* epBuffer(unsigned int n); // -> returns a pointer to the Nth element of the EP buffer structure
|
|
||||||
|
|
||||||
// Replacement for global singleton.
|
|
||||||
// This function prevents static-initialization-order-fiasco
|
|
||||||
// https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use
|
|
||||||
arduino::PluggableUSB_& PluggableUSB();
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
||||||
|
|
@ -1,429 +1 @@
|
||||||
/*
|
#include "../../../ArduinoCore-API/api/Print.cpp"
|
||||||
Copyright (c) 2014 Arduino. All right reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
See the GNU Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "Print.h"
|
|
||||||
|
|
||||||
using namespace arduino;
|
|
||||||
|
|
||||||
// Public Methods //////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
/* default implementation: may be overridden */
|
|
||||||
size_t Print::write(const uint8_t *buffer, size_t size)
|
|
||||||
{
|
|
||||||
size_t n = 0;
|
|
||||||
while (size--) {
|
|
||||||
if (write(*buffer++)) n++;
|
|
||||||
else break;
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(const __FlashStringHelper *ifsh)
|
|
||||||
{
|
|
||||||
#if defined(__AVR__)
|
|
||||||
PGM_P p = reinterpret_cast<PGM_P>(ifsh);
|
|
||||||
size_t n = 0;
|
|
||||||
while (1) {
|
|
||||||
unsigned char c = pgm_read_byte(p++);
|
|
||||||
if (c == 0) break;
|
|
||||||
if (write(c)) n++;
|
|
||||||
else break;
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
#else
|
|
||||||
return print(reinterpret_cast<const char *>(ifsh));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(const String &s)
|
|
||||||
{
|
|
||||||
return write(s.c_str(), s.length());
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(const char str[])
|
|
||||||
{
|
|
||||||
return write(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(char c)
|
|
||||||
{
|
|
||||||
return write(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(unsigned char b, int base)
|
|
||||||
{
|
|
||||||
return print((unsigned long) b, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(int n, int base)
|
|
||||||
{
|
|
||||||
return print((long) n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(unsigned int n, int base)
|
|
||||||
{
|
|
||||||
return print((unsigned long) n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(long n, int base)
|
|
||||||
{
|
|
||||||
if (base == 0) {
|
|
||||||
return write(n);
|
|
||||||
} else if (base == 10) {
|
|
||||||
if (n < 0) {
|
|
||||||
int t = print('-');
|
|
||||||
n = -n;
|
|
||||||
return printNumber(n, 10) + t;
|
|
||||||
}
|
|
||||||
return printNumber(n, 10);
|
|
||||||
} else {
|
|
||||||
return printNumber(n, base);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(unsigned long n, int base)
|
|
||||||
{
|
|
||||||
if (base == 0) return write(n);
|
|
||||||
else return printNumber(n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(long long n, int base)
|
|
||||||
{
|
|
||||||
if (base == 0) {
|
|
||||||
return write(n);
|
|
||||||
} else if (base == 10) {
|
|
||||||
if (n < 0) {
|
|
||||||
int t = print('-');
|
|
||||||
n = -n;
|
|
||||||
return printULLNumber(n, 10) + t;
|
|
||||||
}
|
|
||||||
return printULLNumber(n, 10);
|
|
||||||
} else {
|
|
||||||
return printULLNumber(n, base);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(unsigned long long n, int base)
|
|
||||||
{
|
|
||||||
if (base == 0) return write(n);
|
|
||||||
else return printULLNumber(n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(double n, int digits)
|
|
||||||
{
|
|
||||||
return printFloat(n, digits);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(const __FlashStringHelper *ifsh)
|
|
||||||
{
|
|
||||||
size_t n = print(ifsh);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(const Printable& x)
|
|
||||||
{
|
|
||||||
return x.printTo(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(void)
|
|
||||||
{
|
|
||||||
return write("\r\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(const String &s)
|
|
||||||
{
|
|
||||||
size_t n = print(s);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(const char c[])
|
|
||||||
{
|
|
||||||
size_t n = print(c);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(char c)
|
|
||||||
{
|
|
||||||
size_t n = print(c);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(unsigned char b, int base)
|
|
||||||
{
|
|
||||||
size_t n = print(b, base);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(int num, int base)
|
|
||||||
{
|
|
||||||
size_t n = print(num, base);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(unsigned int num, int base)
|
|
||||||
{
|
|
||||||
size_t n = print(num, base);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(long num, int base)
|
|
||||||
{
|
|
||||||
size_t n = print(num, base);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(unsigned long num, int base)
|
|
||||||
{
|
|
||||||
size_t n = print(num, base);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(long long num, int base)
|
|
||||||
{
|
|
||||||
size_t n = print(num, base);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(unsigned long long num, int base)
|
|
||||||
{
|
|
||||||
size_t n = print(num, base);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(double num, int digits)
|
|
||||||
{
|
|
||||||
size_t n = print(num, digits);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(const Printable& x)
|
|
||||||
{
|
|
||||||
size_t n = print(x);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::printf(const char *format, ...) {
|
|
||||||
va_list arg;
|
|
||||||
va_start(arg, format);
|
|
||||||
char temp[64];
|
|
||||||
char* buffer = temp;
|
|
||||||
size_t len = vsnprintf(temp, sizeof(temp), format, arg);
|
|
||||||
va_end(arg);
|
|
||||||
if (len > sizeof(temp) - 1) {
|
|
||||||
buffer = new char[len + 1];
|
|
||||||
if (!buffer) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
va_start(arg, format);
|
|
||||||
vsnprintf(buffer, len + 1, format, arg);
|
|
||||||
va_end(arg);
|
|
||||||
}
|
|
||||||
len = write((const uint8_t*) buffer, len);
|
|
||||||
if (buffer != temp) {
|
|
||||||
delete[] buffer;
|
|
||||||
}
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO - must be better way than cut-n-paste!
|
|
||||||
size_t Print::printf_P(const char *format, ...) {
|
|
||||||
va_list arg;
|
|
||||||
va_start(arg, format);
|
|
||||||
char temp[64];
|
|
||||||
char* buffer = temp;
|
|
||||||
size_t len = vsnprintf(temp, sizeof(temp), format, arg);
|
|
||||||
va_end(arg);
|
|
||||||
if (len > sizeof(temp) - 1) {
|
|
||||||
buffer = new char[len + 1];
|
|
||||||
if (!buffer) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
va_start(arg, format);
|
|
||||||
vsnprintf(buffer, len + 1, format, arg);
|
|
||||||
va_end(arg);
|
|
||||||
}
|
|
||||||
len = write((const uint8_t*) buffer, len);
|
|
||||||
if (buffer != temp) {
|
|
||||||
delete[] buffer;
|
|
||||||
}
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Private Methods /////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
size_t Print::printNumber(unsigned long n, uint8_t base)
|
|
||||||
{
|
|
||||||
char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
|
|
||||||
char *str = &buf[sizeof(buf) - 1];
|
|
||||||
|
|
||||||
*str = '\0';
|
|
||||||
|
|
||||||
// prevent crash if called with base == 1
|
|
||||||
if (base < 2) base = 10;
|
|
||||||
|
|
||||||
do {
|
|
||||||
char c = n % base;
|
|
||||||
n /= base;
|
|
||||||
|
|
||||||
*--str = c < 10 ? c + '0' : c + 'A' - 10;
|
|
||||||
} while(n);
|
|
||||||
|
|
||||||
return write(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
// REFERENCE IMPLEMENTATION FOR ULL
|
|
||||||
// size_t Print::printULLNumber(unsigned long long n, uint8_t base)
|
|
||||||
// {
|
|
||||||
// // if limited to base 10 and 16 the bufsize can be smaller
|
|
||||||
// char buf[65];
|
|
||||||
// char *str = &buf[64];
|
|
||||||
|
|
||||||
// *str = '\0';
|
|
||||||
|
|
||||||
// // prevent crash if called with base == 1
|
|
||||||
// if (base < 2) base = 10;
|
|
||||||
|
|
||||||
// do {
|
|
||||||
// unsigned long long t = n / base;
|
|
||||||
// char c = n - t * base; // faster than c = n%base;
|
|
||||||
// n = t;
|
|
||||||
// *--str = c < 10 ? c + '0' : c + 'A' - 10;
|
|
||||||
// } while(n);
|
|
||||||
|
|
||||||
// return write(str);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// FAST IMPLEMENTATION FOR ULL
|
|
||||||
size_t Print::printULLNumber(unsigned long long n64, uint8_t base)
|
|
||||||
{
|
|
||||||
// if limited to base 10 and 16 the bufsize can be 20
|
|
||||||
char buf[64];
|
|
||||||
uint8_t i = 0;
|
|
||||||
uint8_t innerLoops = 0;
|
|
||||||
|
|
||||||
// prevent crash if called with base == 1
|
|
||||||
if (base < 2) base = 10;
|
|
||||||
|
|
||||||
// process chunks that fit in "16 bit math".
|
|
||||||
uint16_t top = 0xFFFF / base;
|
|
||||||
uint16_t th16 = 1;
|
|
||||||
while (th16 < top)
|
|
||||||
{
|
|
||||||
th16 *= base;
|
|
||||||
innerLoops++;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (n64 > th16)
|
|
||||||
{
|
|
||||||
// 64 bit math part
|
|
||||||
uint64_t q = n64 / th16;
|
|
||||||
uint16_t r = n64 - q*th16;
|
|
||||||
n64 = q;
|
|
||||||
|
|
||||||
// 16 bit math loop to do remainder. (note buffer is filled reverse)
|
|
||||||
for (uint8_t j=0; j < innerLoops; j++)
|
|
||||||
{
|
|
||||||
uint16_t qq = r/base;
|
|
||||||
buf[i++] = r - qq*base;
|
|
||||||
r = qq;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t n16 = n64;
|
|
||||||
while (n16 > 0)
|
|
||||||
{
|
|
||||||
uint16_t qq = n16/base;
|
|
||||||
buf[i++] = n16 - qq*base;
|
|
||||||
n16 = qq;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t bytes = i;
|
|
||||||
for (; i > 0; i--)
|
|
||||||
write((char) (buf[i - 1] < 10 ?
|
|
||||||
'0' + buf[i - 1] :
|
|
||||||
'A' + buf[i - 1] - 10));
|
|
||||||
|
|
||||||
return bytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::printFloat(double number, int digits)
|
|
||||||
{
|
|
||||||
if (digits < 0)
|
|
||||||
digits = 2;
|
|
||||||
|
|
||||||
size_t n = 0;
|
|
||||||
|
|
||||||
if (isnan(number)) return print("nan");
|
|
||||||
if (isinf(number)) return print("inf");
|
|
||||||
if (number > 4294967040.0) return print ("ovf"); // constant determined empirically
|
|
||||||
if (number <-4294967040.0) return print ("ovf"); // constant determined empirically
|
|
||||||
|
|
||||||
// Handle negative numbers
|
|
||||||
if (number < 0.0)
|
|
||||||
{
|
|
||||||
n += print('-');
|
|
||||||
number = -number;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Round correctly so that print(1.999, 2) prints as "2.00"
|
|
||||||
double rounding = 0.5;
|
|
||||||
for (uint8_t i=0; i<digits; ++i)
|
|
||||||
rounding /= 10.0;
|
|
||||||
|
|
||||||
number += rounding;
|
|
||||||
|
|
||||||
// Extract the integer part of the number and print it
|
|
||||||
unsigned long int_part = (unsigned long)number;
|
|
||||||
double remainder = number - (double)int_part;
|
|
||||||
n += print(int_part);
|
|
||||||
|
|
||||||
// Print the decimal point, but only if there are digits beyond
|
|
||||||
if (digits > 0) {
|
|
||||||
n += print(".");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extract digits from the remainder one at a time
|
|
||||||
while (digits-- > 0)
|
|
||||||
{
|
|
||||||
remainder *= 10.0;
|
|
||||||
unsigned int toPrint = (unsigned int)remainder;
|
|
||||||
n += print(toPrint);
|
|
||||||
remainder -= toPrint;
|
|
||||||
}
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,100 +1,2 @@
|
||||||
/*
|
|
||||||
Copyright (c) 2016 Arduino LLC. All right reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
See the GNU Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include "../../../ArduinoCore-API/api/Print.h"
|
||||||
#include <inttypes.h>
|
|
||||||
#include <stdio.h> // for size_t
|
|
||||||
|
|
||||||
#include "String.h"
|
|
||||||
#include "Printable.h"
|
|
||||||
|
|
||||||
#define DEC 10
|
|
||||||
#define HEX 16
|
|
||||||
#define OCT 8
|
|
||||||
#define BIN 2
|
|
||||||
|
|
||||||
namespace arduino {
|
|
||||||
|
|
||||||
class Print
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
int write_error;
|
|
||||||
size_t printNumber(unsigned long, uint8_t);
|
|
||||||
size_t printULLNumber(unsigned long long, uint8_t);
|
|
||||||
size_t printFloat(double, int);
|
|
||||||
protected:
|
|
||||||
void setWriteError(int err = 1) { write_error = err; }
|
|
||||||
public:
|
|
||||||
Print() : write_error(0) {}
|
|
||||||
|
|
||||||
int getWriteError() { return write_error; }
|
|
||||||
void clearWriteError() { setWriteError(0); }
|
|
||||||
|
|
||||||
virtual size_t write(uint8_t) = 0;
|
|
||||||
size_t write(const char *str) {
|
|
||||||
if (str == NULL) return 0;
|
|
||||||
return write((const uint8_t *)str, strlen(str));
|
|
||||||
}
|
|
||||||
virtual size_t write(const uint8_t *buffer, size_t size);
|
|
||||||
size_t write(const char *buffer, size_t size) {
|
|
||||||
return write((const uint8_t *)buffer, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
// default to zero, meaning "a single write may block"
|
|
||||||
// should be overriden by subclasses with buffering
|
|
||||||
virtual int availableForWrite() { return 0; }
|
|
||||||
|
|
||||||
size_t print(const __FlashStringHelper *);
|
|
||||||
size_t print(const String &);
|
|
||||||
size_t print(const char[]);
|
|
||||||
size_t print(char);
|
|
||||||
size_t print(unsigned char, int = DEC);
|
|
||||||
size_t print(int, int = DEC);
|
|
||||||
size_t print(unsigned int, int = DEC);
|
|
||||||
size_t print(long, int = DEC);
|
|
||||||
size_t print(unsigned long, int = DEC);
|
|
||||||
size_t print(long long, int = DEC);
|
|
||||||
size_t print(unsigned long long, int = DEC);
|
|
||||||
size_t print(double, int = 2);
|
|
||||||
size_t print(const Printable&);
|
|
||||||
|
|
||||||
size_t println(const __FlashStringHelper *);
|
|
||||||
size_t println(const String &s);
|
|
||||||
size_t println(const char[]);
|
|
||||||
size_t println(char);
|
|
||||||
size_t println(unsigned char, int = DEC);
|
|
||||||
size_t println(int, int = DEC);
|
|
||||||
size_t println(unsigned int, int = DEC);
|
|
||||||
size_t println(long, int = DEC);
|
|
||||||
size_t println(unsigned long, int = DEC);
|
|
||||||
size_t println(long long, int = DEC);
|
|
||||||
size_t println(unsigned long long, int = DEC);
|
|
||||||
size_t println(double, int = 2);
|
|
||||||
size_t println(const Printable&);
|
|
||||||
size_t println(void);
|
|
||||||
|
|
||||||
// EFP3 - Add printf() to make life so much easier...
|
|
||||||
size_t printf(const char *format, ...);
|
|
||||||
size_t printf_P(const char *format, ...);
|
|
||||||
|
|
||||||
virtual void flush() { /* Empty implementation for backward compatibility */ }
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
using namespace arduino;
|
|
||||||
|
|
|
||||||
|
|
@ -1,39 +1,2 @@
|
||||||
/*
|
|
||||||
Copyright (c) 2016 Arduino LLC. All right reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
See the GNU Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include "../../../ArduinoCore-API/api/Printable.h"
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
namespace arduino {
|
|
||||||
|
|
||||||
class Print;
|
|
||||||
|
|
||||||
/** The Printable class provides a way for new classes to allow themselves to be printed.
|
|
||||||
By deriving from Printable and implementing the printTo method, it will then be possible
|
|
||||||
for users to print out instances of this class by passing them into the usual
|
|
||||||
Print::print and Print::println methods.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class Printable
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual size_t printTo(Print& p) const = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,141 +1 @@
|
||||||
/*
|
#include "../../../ArduinoCore-API/api/RingBuffer.h"
|
||||||
Copyright (c) 2014 Arduino. All right reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
See the GNU Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
|
|
||||||
#ifndef _RING_BUFFER_
|
|
||||||
#define _RING_BUFFER_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
namespace arduino {
|
|
||||||
|
|
||||||
// Define constants and variables for buffering incoming serial data. We're
|
|
||||||
// using a ring buffer (I think), in which head is the index of the location
|
|
||||||
// to which to write the next incoming character and tail is the index of the
|
|
||||||
// location from which to read.
|
|
||||||
#define SERIAL_BUFFER_SIZE 64
|
|
||||||
|
|
||||||
template <int N>
|
|
||||||
class RingBufferN
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
uint8_t _aucBuffer[N] ;
|
|
||||||
volatile int _iHead ;
|
|
||||||
volatile int _iTail ;
|
|
||||||
volatile int _numElems;
|
|
||||||
|
|
||||||
public:
|
|
||||||
RingBufferN( void ) ;
|
|
||||||
void store_char( uint8_t c ) ;
|
|
||||||
void clear();
|
|
||||||
int read_char();
|
|
||||||
int available();
|
|
||||||
int availableForStore();
|
|
||||||
int peek();
|
|
||||||
bool isFull();
|
|
||||||
|
|
||||||
private:
|
|
||||||
int nextIndex(int index);
|
|
||||||
inline bool isEmpty() const { return (_numElems == 0); }
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef RingBufferN<SERIAL_BUFFER_SIZE> RingBuffer;
|
|
||||||
|
|
||||||
|
|
||||||
template <int N>
|
|
||||||
RingBufferN<N>::RingBufferN( void )
|
|
||||||
{
|
|
||||||
memset( _aucBuffer, 0, N ) ;
|
|
||||||
clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <int N>
|
|
||||||
void RingBufferN<N>::store_char( uint8_t c )
|
|
||||||
{
|
|
||||||
// if we should be storing the received character into the location
|
|
||||||
// just before the tail (meaning that the head would advance to the
|
|
||||||
// current location of the tail), we're about to overflow the buffer
|
|
||||||
// and so we don't write the character or advance the head.
|
|
||||||
if (!isFull())
|
|
||||||
{
|
|
||||||
_aucBuffer[_iHead] = c ;
|
|
||||||
_iHead = nextIndex(_iHead);
|
|
||||||
_numElems++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <int N>
|
|
||||||
void RingBufferN<N>::clear()
|
|
||||||
{
|
|
||||||
_iHead = 0;
|
|
||||||
_iTail = 0;
|
|
||||||
_numElems = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <int N>
|
|
||||||
int RingBufferN<N>::read_char()
|
|
||||||
{
|
|
||||||
if (isEmpty())
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
uint8_t value = _aucBuffer[_iTail];
|
|
||||||
_iTail = nextIndex(_iTail);
|
|
||||||
_numElems--;
|
|
||||||
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <int N>
|
|
||||||
int RingBufferN<N>::available()
|
|
||||||
{
|
|
||||||
return _numElems;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <int N>
|
|
||||||
int RingBufferN<N>::availableForStore()
|
|
||||||
{
|
|
||||||
return (N - _numElems);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <int N>
|
|
||||||
int RingBufferN<N>::peek()
|
|
||||||
{
|
|
||||||
if (isEmpty())
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return _aucBuffer[_iTail];
|
|
||||||
}
|
|
||||||
|
|
||||||
template <int N>
|
|
||||||
int RingBufferN<N>::nextIndex(int index)
|
|
||||||
{
|
|
||||||
return (uint32_t)(index + 1) % N;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <int N>
|
|
||||||
bool RingBufferN<N>::isFull()
|
|
||||||
{
|
|
||||||
return (_numElems == N);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _RING_BUFFER_ */
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
|
|
|
||||||
|
|
@ -1,31 +1,2 @@
|
||||||
/*
|
|
||||||
Server.h - Base class that provides Server
|
|
||||||
Copyright (c) 2011 Adrian McEwen. All right reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include "../../../ArduinoCore-API/api/Server.h"
|
||||||
#include "Print.h"
|
|
||||||
|
|
||||||
namespace arduino {
|
|
||||||
|
|
||||||
class Server : public Print {
|
|
||||||
public:
|
|
||||||
virtual void begin() = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,321 +1 @@
|
||||||
/*
|
#include "../../../ArduinoCore-API/api/Stream.cpp"
|
||||||
Stream.cpp - adds parsing methods to Stream class
|
|
||||||
Copyright (c) 2008 David A. Mellis. All right reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Created July 2011
|
|
||||||
parsing functions based on TextFinder library by Michael Margolis
|
|
||||||
|
|
||||||
findMulti/findUntil routines written by Jim Leonard/Xuth
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "Common.h"
|
|
||||||
#include "Stream.h"
|
|
||||||
|
|
||||||
#define PARSE_TIMEOUT 1000 // default number of milli-seconds to wait
|
|
||||||
|
|
||||||
using namespace arduino;
|
|
||||||
|
|
||||||
// private method to read stream with timeout
|
|
||||||
int Stream::timedRead()
|
|
||||||
{
|
|
||||||
int c;
|
|
||||||
_startMillis = millis();
|
|
||||||
do {
|
|
||||||
c = read();
|
|
||||||
if (c >= 0) return c;
|
|
||||||
} while(millis() - _startMillis < _timeout);
|
|
||||||
return -1; // -1 indicates timeout
|
|
||||||
}
|
|
||||||
|
|
||||||
// private method to peek stream with timeout
|
|
||||||
int Stream::timedPeek()
|
|
||||||
{
|
|
||||||
int c;
|
|
||||||
_startMillis = millis();
|
|
||||||
do {
|
|
||||||
c = peek();
|
|
||||||
if (c >= 0) return c;
|
|
||||||
} while(millis() - _startMillis < _timeout);
|
|
||||||
return -1; // -1 indicates timeout
|
|
||||||
}
|
|
||||||
|
|
||||||
// returns peek of the next digit in the stream or -1 if timeout
|
|
||||||
// discards non-numeric characters
|
|
||||||
int Stream::peekNextDigit(LookaheadMode lookahead, bool detectDecimal)
|
|
||||||
{
|
|
||||||
int c;
|
|
||||||
while (1) {
|
|
||||||
c = timedPeek();
|
|
||||||
|
|
||||||
if( c < 0 ||
|
|
||||||
c == '-' ||
|
|
||||||
(c >= '0' && c <= '9') ||
|
|
||||||
(detectDecimal && c == '.')) return c;
|
|
||||||
|
|
||||||
switch( lookahead ){
|
|
||||||
case SKIP_NONE: return -1; // Fail code.
|
|
||||||
case SKIP_WHITESPACE:
|
|
||||||
switch( c ){
|
|
||||||
case ' ':
|
|
||||||
case '\t':
|
|
||||||
case '\r':
|
|
||||||
case '\n': break;
|
|
||||||
default: return -1; // Fail code.
|
|
||||||
}
|
|
||||||
case SKIP_ALL:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
read(); // discard non-numeric
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Public Methods
|
|
||||||
//////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
void Stream::setTimeout(unsigned long timeout) // sets the maximum number of milliseconds to wait
|
|
||||||
{
|
|
||||||
_timeout = timeout;
|
|
||||||
}
|
|
||||||
|
|
||||||
// find returns true if the target string is found
|
|
||||||
bool Stream::find(const char *target)
|
|
||||||
{
|
|
||||||
return findUntil(target, strlen(target), NULL, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// reads data from the stream until the target string of given length is found
|
|
||||||
// returns true if target string is found, false if timed out
|
|
||||||
bool Stream::find(const char *target, size_t length)
|
|
||||||
{
|
|
||||||
return findUntil(target, length, NULL, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// as find but search ends if the terminator string is found
|
|
||||||
bool Stream::findUntil(const char *target, const char *terminator)
|
|
||||||
{
|
|
||||||
return findUntil(target, strlen(target), terminator, strlen(terminator));
|
|
||||||
}
|
|
||||||
|
|
||||||
// reads data from the stream until the target string of the given length is found
|
|
||||||
// search terminated if the terminator string is found
|
|
||||||
// returns true if target string is found, false if terminated or timed out
|
|
||||||
bool Stream::findUntil(const char *target, size_t targetLen, const char *terminator, size_t termLen)
|
|
||||||
{
|
|
||||||
if (terminator == NULL) {
|
|
||||||
MultiTarget t[1] = {{target, targetLen, 0}};
|
|
||||||
return findMulti(t, 1) == 0;
|
|
||||||
} else {
|
|
||||||
MultiTarget t[2] = {{target, targetLen, 0}, {terminator, termLen, 0}};
|
|
||||||
return findMulti(t, 2) == 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// returns the first valid (long) integer value from the current position.
|
|
||||||
// lookahead determines how parseInt looks ahead in the stream.
|
|
||||||
// See LookaheadMode enumeration at the top of the file.
|
|
||||||
// Lookahead is terminated by the first character that is not a valid part of an integer.
|
|
||||||
// Once parsing commences, 'ignore' will be skipped in the stream.
|
|
||||||
long Stream::parseInt(LookaheadMode lookahead, char ignore)
|
|
||||||
{
|
|
||||||
bool isNegative = false;
|
|
||||||
long value = 0;
|
|
||||||
int c;
|
|
||||||
|
|
||||||
c = peekNextDigit(lookahead, false);
|
|
||||||
// ignore non numeric leading characters
|
|
||||||
if(c < 0)
|
|
||||||
return 0; // zero returned if timeout
|
|
||||||
|
|
||||||
do{
|
|
||||||
if((char)c == ignore)
|
|
||||||
; // ignore this character
|
|
||||||
else if(c == '-')
|
|
||||||
isNegative = true;
|
|
||||||
else if(c >= '0' && c <= '9') // is c a digit?
|
|
||||||
value = value * 10 + c - '0';
|
|
||||||
read(); // consume the character we got with peek
|
|
||||||
c = timedPeek();
|
|
||||||
}
|
|
||||||
while( (c >= '0' && c <= '9') || (char)c == ignore );
|
|
||||||
|
|
||||||
if(isNegative)
|
|
||||||
value = -value;
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
// as parseInt but returns a floating point value
|
|
||||||
float Stream::parseFloat(LookaheadMode lookahead, char ignore)
|
|
||||||
{
|
|
||||||
bool isNegative = false;
|
|
||||||
bool isFraction = false;
|
|
||||||
double value = 0.0;
|
|
||||||
int c;
|
|
||||||
double fraction = 1.0;
|
|
||||||
|
|
||||||
c = peekNextDigit(lookahead, true);
|
|
||||||
// ignore non numeric leading characters
|
|
||||||
if(c < 0)
|
|
||||||
return 0; // zero returned if timeout
|
|
||||||
|
|
||||||
do{
|
|
||||||
if((char)c == ignore)
|
|
||||||
; // ignore
|
|
||||||
else if(c == '-')
|
|
||||||
isNegative = true;
|
|
||||||
else if (c == '.')
|
|
||||||
isFraction = true;
|
|
||||||
else if(c >= '0' && c <= '9') { // is c a digit?
|
|
||||||
if(isFraction) {
|
|
||||||
fraction *= 0.1;
|
|
||||||
value = value + fraction * (c - '0');
|
|
||||||
} else {
|
|
||||||
value = value * 10 + c - '0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
read(); // consume the character we got with peek
|
|
||||||
c = timedPeek();
|
|
||||||
}
|
|
||||||
while( (c >= '0' && c <= '9') || (c == '.' && !isFraction) || (char)c == ignore );
|
|
||||||
|
|
||||||
if(isNegative)
|
|
||||||
value = -value;
|
|
||||||
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
// read characters from stream into buffer
|
|
||||||
// terminates if length characters have been read, or timeout (see setTimeout)
|
|
||||||
// returns the number of characters placed in the buffer
|
|
||||||
// the buffer is NOT null terminated.
|
|
||||||
//
|
|
||||||
size_t Stream::readBytes(char *buffer, size_t length)
|
|
||||||
{
|
|
||||||
size_t count = 0;
|
|
||||||
while (count < length) {
|
|
||||||
int c = timedRead();
|
|
||||||
if (c < 0) break;
|
|
||||||
*buffer++ = (char)c;
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// as readBytes with terminator character
|
|
||||||
// terminates if length characters have been read, timeout, or if the terminator character detected
|
|
||||||
// returns the number of characters placed in the buffer (0 means no valid data found)
|
|
||||||
|
|
||||||
size_t Stream::readBytesUntil(char terminator, char *buffer, size_t length)
|
|
||||||
{
|
|
||||||
size_t index = 0;
|
|
||||||
while (index < length) {
|
|
||||||
int c = timedRead();
|
|
||||||
if (c < 0 || (char)c == terminator) break;
|
|
||||||
*buffer++ = (char)c;
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
return index; // return number of characters, not including null terminator
|
|
||||||
}
|
|
||||||
|
|
||||||
String Stream::readString()
|
|
||||||
{
|
|
||||||
String ret;
|
|
||||||
int c = timedRead();
|
|
||||||
while (c >= 0)
|
|
||||||
{
|
|
||||||
ret += (char)c;
|
|
||||||
c = timedRead();
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
String Stream::readStringUntil(char terminator)
|
|
||||||
{
|
|
||||||
String ret;
|
|
||||||
int c = timedRead();
|
|
||||||
while (c >= 0 && (char)c != terminator)
|
|
||||||
{
|
|
||||||
ret += (char)c;
|
|
||||||
c = timedRead();
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Stream::findMulti( struct Stream::MultiTarget *targets, int tCount) {
|
|
||||||
// any zero length target string automatically matches and would make
|
|
||||||
// a mess of the rest of the algorithm.
|
|
||||||
for (struct MultiTarget *t = targets; t < targets+tCount; ++t) {
|
|
||||||
if (t->len <= 0)
|
|
||||||
return t - targets;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
int c = timedRead();
|
|
||||||
if (c < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
for (struct MultiTarget *t = targets; t < targets+tCount; ++t) {
|
|
||||||
// the simple case is if we match, deal with that first.
|
|
||||||
if ((char)c == t->str[t->index]) {
|
|
||||||
if (++t->index == t->len)
|
|
||||||
return t - targets;
|
|
||||||
else
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if not we need to walk back and see if we could have matched further
|
|
||||||
// down the stream (ie '1112' doesn't match the first position in '11112'
|
|
||||||
// but it will match the second position so we can't just reset the current
|
|
||||||
// index to 0 when we find a mismatch.
|
|
||||||
if (t->index == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
int origIndex = t->index;
|
|
||||||
do {
|
|
||||||
--t->index;
|
|
||||||
// first check if current char works against the new current index
|
|
||||||
if ((char)c != t->str[t->index])
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// if it's the only char then we're good, nothing more to check
|
|
||||||
if (t->index == 0) {
|
|
||||||
t->index++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// otherwise we need to check the rest of the found string
|
|
||||||
int diff = origIndex - t->index;
|
|
||||||
size_t i;
|
|
||||||
for (i = 0; i < t->index; ++i) {
|
|
||||||
if (t->str[i] != t->str[i + diff])
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if we successfully got through the previous loop then our current
|
|
||||||
// index is good.
|
|
||||||
if (i == t->index) {
|
|
||||||
t->index++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// otherwise we just try the next index
|
|
||||||
} while (t->index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// unreachable
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,131 +1,2 @@
|
||||||
/*
|
|
||||||
Stream.h - base class for character-based streams.
|
|
||||||
Copyright (c) 2010 David A. Mellis. All right reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
parsing functions based on TextFinder library by Michael Margolis
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include "../../../ArduinoCore-API/api/Stream.h"
|
||||||
#include <inttypes.h>
|
|
||||||
#include "Print.h"
|
|
||||||
|
|
||||||
// compatability macros for testing
|
|
||||||
/*
|
|
||||||
#define getInt() parseInt()
|
|
||||||
#define getInt(ignore) parseInt(ignore)
|
|
||||||
#define getFloat() parseFloat()
|
|
||||||
#define getFloat(ignore) parseFloat(ignore)
|
|
||||||
#define getString( pre_string, post_string, buffer, length)
|
|
||||||
readBytesBetween( pre_string, terminator, buffer, length)
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace arduino {
|
|
||||||
|
|
||||||
// This enumeration provides the lookahead options for parseInt(), parseFloat()
|
|
||||||
// The rules set out here are used until either the first valid character is found
|
|
||||||
// or a time out occurs due to lack of input.
|
|
||||||
enum LookaheadMode{
|
|
||||||
SKIP_ALL, // All invalid characters are ignored.
|
|
||||||
SKIP_NONE, // Nothing is skipped, and the stream is not touched unless the first waiting character is valid.
|
|
||||||
SKIP_WHITESPACE // Only tabs, spaces, line feeds & carriage returns are skipped.
|
|
||||||
};
|
|
||||||
|
|
||||||
#define NO_IGNORE_CHAR '\x01' // a char not found in a valid ASCII numeric field
|
|
||||||
|
|
||||||
class Stream : public Print
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
unsigned long _timeout; // number of milliseconds to wait for the next char before aborting timed read
|
|
||||||
unsigned long _startMillis; // used for timeout measurement
|
|
||||||
int timedRead(); // private method to read stream with timeout
|
|
||||||
int timedPeek(); // private method to peek stream with timeout
|
|
||||||
int peekNextDigit(LookaheadMode lookahead, bool detectDecimal); // returns the next numeric digit in the stream or -1 if timeout
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual int available() = 0;
|
|
||||||
virtual int read() = 0;
|
|
||||||
virtual int peek() = 0;
|
|
||||||
|
|
||||||
Stream() {_timeout=1000;}
|
|
||||||
|
|
||||||
// parsing methods
|
|
||||||
|
|
||||||
void setTimeout(unsigned long timeout); // sets maximum milliseconds to wait for stream data, default is 1 second
|
|
||||||
unsigned long getTimeout(void) { return _timeout; }
|
|
||||||
|
|
||||||
bool find(const char *target); // reads data from the stream until the target string is found
|
|
||||||
bool find(const uint8_t *target) { return find ((const char *)target); }
|
|
||||||
// returns true if target string is found, false if timed out (see setTimeout)
|
|
||||||
|
|
||||||
bool find(const char *target, size_t length); // reads data from the stream until the target string of given length is found
|
|
||||||
bool find(const uint8_t *target, size_t length) { return find ((const char *)target, length); }
|
|
||||||
// returns true if target string is found, false if timed out
|
|
||||||
|
|
||||||
bool find(char target) { return find (&target, 1); }
|
|
||||||
|
|
||||||
bool findUntil(const char *target, const char *terminator); // as find but search ends if the terminator string is found
|
|
||||||
bool findUntil(const uint8_t *target, const char *terminator) { return findUntil((const char *)target, terminator); }
|
|
||||||
|
|
||||||
bool findUntil(const char *target, size_t targetLen, const char *terminate, size_t termLen); // as above but search ends if the terminate string is found
|
|
||||||
bool findUntil(const uint8_t *target, size_t targetLen, const char *terminate, size_t termLen) {return findUntil((const char *)target, targetLen, terminate, termLen); }
|
|
||||||
|
|
||||||
long parseInt(LookaheadMode lookahead = SKIP_ALL, char ignore = NO_IGNORE_CHAR);
|
|
||||||
// returns the first valid (long) integer value from the current position.
|
|
||||||
// lookahead determines how parseInt looks ahead in the stream.
|
|
||||||
// See LookaheadMode enumeration at the top of the file.
|
|
||||||
// Lookahead is terminated by the first character that is not a valid part of an integer.
|
|
||||||
// Once parsing commences, 'ignore' will be skipped in the stream.
|
|
||||||
|
|
||||||
float parseFloat(LookaheadMode lookahead = SKIP_ALL, char ignore = NO_IGNORE_CHAR);
|
|
||||||
// float version of parseInt
|
|
||||||
|
|
||||||
size_t readBytes( char *buffer, size_t length); // read chars from stream into buffer
|
|
||||||
size_t readBytes( uint8_t *buffer, size_t length) { return readBytes((char *)buffer, length); }
|
|
||||||
// terminates if length characters have been read or timeout (see setTimeout)
|
|
||||||
// returns the number of characters placed in the buffer (0 means no valid data found)
|
|
||||||
|
|
||||||
size_t readBytesUntil( char terminator, char *buffer, size_t length); // as readBytes with terminator character
|
|
||||||
size_t readBytesUntil( char terminator, uint8_t *buffer, size_t length) { return readBytesUntil(terminator, (char *)buffer, length); }
|
|
||||||
// terminates if length characters have been read, timeout, or if the terminator character detected
|
|
||||||
// returns the number of characters placed in the buffer (0 means no valid data found)
|
|
||||||
|
|
||||||
// Arduino String functions to be added here
|
|
||||||
String readString();
|
|
||||||
String readStringUntil(char terminator);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
long parseInt(char ignore) { return parseInt(SKIP_ALL, ignore); }
|
|
||||||
float parseFloat(char ignore) { return parseFloat(SKIP_ALL, ignore); }
|
|
||||||
// These overload exists for compatibility with any class that has derived
|
|
||||||
// Stream and used parseFloat/Int with a custom ignore character. To keep
|
|
||||||
// the public API simple, these overload remains protected.
|
|
||||||
|
|
||||||
struct MultiTarget {
|
|
||||||
const char *str; // string you're searching for
|
|
||||||
size_t len; // length of string you're searching for
|
|
||||||
size_t index; // index used by the search routine.
|
|
||||||
};
|
|
||||||
|
|
||||||
// This allows you to search for an arbitrary number of strings.
|
|
||||||
// Returns index of the target that is found first or -1 if timeout occurs.
|
|
||||||
int findMulti(struct MultiTarget *targets, int tCount);
|
|
||||||
};
|
|
||||||
|
|
||||||
#undef NO_IGNORE_CHAR
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,768 +1 @@
|
||||||
/*
|
#include "../../../ArduinoCore-API/api/String.cpp"
|
||||||
String library for Wiring & Arduino
|
|
||||||
...mostly rewritten by Paul Stoffregen...
|
|
||||||
Copyright (c) 2009-10 Hernando Barragan. All rights reserved.
|
|
||||||
Copyright 2011, Paul Stoffregen, paul@pjrc.com
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "String.h"
|
|
||||||
#include "Common.h"
|
|
||||||
#include "itoa.h"
|
|
||||||
#include "deprecated-avr-comp/avr/dtostrf.h"
|
|
||||||
|
|
||||||
#include <float.h>
|
|
||||||
|
|
||||||
namespace arduino {
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* Static Member Initialisation */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
size_t const String::FLT_MAX_DECIMAL_PLACES;
|
|
||||||
size_t const String::DBL_MAX_DECIMAL_PLACES;
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* Constructors */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
String::String(const char *cstr)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
if (cstr) copy(cstr, strlen(cstr));
|
|
||||||
}
|
|
||||||
|
|
||||||
String::String(const char *cstr, unsigned int length)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
if (cstr) copy(cstr, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
String::String(const String &value)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
*this = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
String::String(const __FlashStringHelper *pstr)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
*this = pstr;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
|
||||||
String::String(String &&rval)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
move(rval);
|
|
||||||
}
|
|
||||||
String::String(StringSumHelper &&rval)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
move(rval);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
String::String(char c)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
char buf[2];
|
|
||||||
buf[0] = c;
|
|
||||||
buf[1] = 0;
|
|
||||||
*this = buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
String::String(unsigned char value, unsigned char base)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
char buf[1 + 8 * sizeof(unsigned char)];
|
|
||||||
utoa(value, buf, base);
|
|
||||||
*this = buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
String::String(int value, unsigned char base)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
char buf[2 + 8 * sizeof(int)];
|
|
||||||
itoa(value, buf, base);
|
|
||||||
*this = buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
String::String(unsigned int value, unsigned char base)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
char buf[1 + 8 * sizeof(unsigned int)];
|
|
||||||
utoa(value, buf, base);
|
|
||||||
*this = buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
String::String(long value, unsigned char base)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
char buf[2 + 8 * sizeof(long)];
|
|
||||||
ltoa(value, buf, base);
|
|
||||||
*this = buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
String::String(unsigned long value, unsigned char base)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
char buf[1 + 8 * sizeof(unsigned long)];
|
|
||||||
ultoa(value, buf, base);
|
|
||||||
*this = buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
String::String(float value, unsigned char decimalPlaces)
|
|
||||||
{
|
|
||||||
static size_t const FLOAT_BUF_SIZE = FLT_MAX_10_EXP + FLT_MAX_DECIMAL_PLACES + 1 /* '-' */ + 1 /* '.' */ + 1 /* '\0' */;
|
|
||||||
init();
|
|
||||||
char buf[FLOAT_BUF_SIZE];
|
|
||||||
decimalPlaces = min(decimalPlaces, FLT_MAX_DECIMAL_PLACES);
|
|
||||||
*this = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
String::String(double value, unsigned char decimalPlaces)
|
|
||||||
{
|
|
||||||
static size_t const DOUBLE_BUF_SIZE = DBL_MAX_10_EXP + DBL_MAX_DECIMAL_PLACES + 1 /* '-' */ + 1 /* '.' */ + 1 /* '\0' */;
|
|
||||||
init();
|
|
||||||
char buf[DOUBLE_BUF_SIZE];
|
|
||||||
decimalPlaces = min(decimalPlaces, DBL_MAX_DECIMAL_PLACES);
|
|
||||||
*this = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
String::~String()
|
|
||||||
{
|
|
||||||
if (buffer) free(buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* Memory Management */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
inline void String::init(void)
|
|
||||||
{
|
|
||||||
buffer = NULL;
|
|
||||||
capacity = 0;
|
|
||||||
len = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::invalidate(void)
|
|
||||||
{
|
|
||||||
if (buffer) free(buffer);
|
|
||||||
buffer = NULL;
|
|
||||||
capacity = len = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::reserve(unsigned int size)
|
|
||||||
{
|
|
||||||
if (buffer && capacity >= size) return 1;
|
|
||||||
if (changeBuffer(size)) {
|
|
||||||
if (len == 0) buffer[0] = 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::changeBuffer(unsigned int maxStrLen)
|
|
||||||
{
|
|
||||||
char *newbuffer = (char *)realloc(buffer, maxStrLen + 1);
|
|
||||||
if (newbuffer) {
|
|
||||||
buffer = newbuffer;
|
|
||||||
capacity = maxStrLen;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* Copy and Move */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
String & String::copy(const char *cstr, unsigned int length)
|
|
||||||
{
|
|
||||||
if (!reserve(length)) {
|
|
||||||
invalidate();
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
len = length;
|
|
||||||
memcpy(buffer, cstr, length);
|
|
||||||
buffer[len] = '\0';
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
String & String::copy(const __FlashStringHelper *pstr, unsigned int length)
|
|
||||||
{
|
|
||||||
if (!reserve(length)) {
|
|
||||||
invalidate();
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
len = length;
|
|
||||||
strcpy_P(buffer, (PGM_P)pstr);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
|
||||||
void String::move(String &rhs)
|
|
||||||
{
|
|
||||||
if (buffer) {
|
|
||||||
if (rhs && capacity >= rhs.len) {
|
|
||||||
memcpy(buffer, rhs.buffer, rhs.len);
|
|
||||||
len = rhs.len;
|
|
||||||
buffer[len] = '\0';
|
|
||||||
rhs.len = 0;
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
free(buffer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
buffer = rhs.buffer;
|
|
||||||
capacity = rhs.capacity;
|
|
||||||
len = rhs.len;
|
|
||||||
rhs.buffer = NULL;
|
|
||||||
rhs.capacity = 0;
|
|
||||||
rhs.len = 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
String & String::operator = (const String &rhs)
|
|
||||||
{
|
|
||||||
if (this == &rhs) return *this;
|
|
||||||
|
|
||||||
if (rhs.buffer) copy(rhs.buffer, rhs.len);
|
|
||||||
else invalidate();
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
|
||||||
String & String::operator = (String &&rval)
|
|
||||||
{
|
|
||||||
if (this != &rval) move(rval);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
String & String::operator = (StringSumHelper &&rval)
|
|
||||||
{
|
|
||||||
if (this != &rval) move(rval);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
String & String::operator = (const char *cstr)
|
|
||||||
{
|
|
||||||
if (cstr) copy(cstr, strlen(cstr));
|
|
||||||
else invalidate();
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
String & String::operator = (const __FlashStringHelper *pstr)
|
|
||||||
{
|
|
||||||
if (pstr) copy(pstr, strlen_P((PGM_P)pstr));
|
|
||||||
else invalidate();
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* concat */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
unsigned char String::concat(const String &s)
|
|
||||||
{
|
|
||||||
return concat(s.buffer, s.len);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(const char *cstr, unsigned int length)
|
|
||||||
{
|
|
||||||
unsigned int newlen = len + length;
|
|
||||||
if (!cstr) return 0;
|
|
||||||
if (length == 0) return 1;
|
|
||||||
if (!reserve(newlen)) return 0;
|
|
||||||
memcpy(buffer + len, cstr, length);
|
|
||||||
len = newlen;
|
|
||||||
buffer[len] = '\0';
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(const char *cstr)
|
|
||||||
{
|
|
||||||
if (!cstr) return 0;
|
|
||||||
return concat(cstr, strlen(cstr));
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(char c)
|
|
||||||
{
|
|
||||||
return concat(&c, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(unsigned char num)
|
|
||||||
{
|
|
||||||
char buf[1 + 3 * sizeof(unsigned char)];
|
|
||||||
itoa(num, buf, 10);
|
|
||||||
return concat(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(int num)
|
|
||||||
{
|
|
||||||
char buf[2 + 3 * sizeof(int)];
|
|
||||||
itoa(num, buf, 10);
|
|
||||||
return concat(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(unsigned int num)
|
|
||||||
{
|
|
||||||
char buf[1 + 3 * sizeof(unsigned int)];
|
|
||||||
utoa(num, buf, 10);
|
|
||||||
return concat(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(long num)
|
|
||||||
{
|
|
||||||
char buf[2 + 3 * sizeof(long)];
|
|
||||||
ltoa(num, buf, 10);
|
|
||||||
return concat(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(unsigned long num)
|
|
||||||
{
|
|
||||||
char buf[1 + 3 * sizeof(unsigned long)];
|
|
||||||
ultoa(num, buf, 10);
|
|
||||||
return concat(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(float num)
|
|
||||||
{
|
|
||||||
char buf[20];
|
|
||||||
char* string = dtostrf(num, 4, 2, buf);
|
|
||||||
return concat(string);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(double num)
|
|
||||||
{
|
|
||||||
char buf[20];
|
|
||||||
char* string = dtostrf(num, 4, 2, buf);
|
|
||||||
return concat(string);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(const __FlashStringHelper * str)
|
|
||||||
{
|
|
||||||
if (!str) return 0;
|
|
||||||
int length = strlen_P((const char *) str);
|
|
||||||
if (length == 0) return 1;
|
|
||||||
unsigned int newlen = len + length;
|
|
||||||
if (!reserve(newlen)) return 0;
|
|
||||||
strcpy_P(buffer + len, (const char *) str);
|
|
||||||
len = newlen;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* Concatenate */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!a.concat(rhs.buffer, rhs.len)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!cstr || !a.concat(cstr)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, char c)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!a.concat(c)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, unsigned char num)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!a.concat(num)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, int num)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!a.concat(num)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!a.concat(num)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, long num)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!a.concat(num)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!a.concat(num)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, float num)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!a.concat(num)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, double num)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!a.concat(num)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, const __FlashStringHelper *rhs)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!a.concat(rhs)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* Comparison */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
int String::compareTo(const String &s) const
|
|
||||||
{
|
|
||||||
if (!buffer || !s.buffer) {
|
|
||||||
if (s.buffer && s.len > 0) return 0 - *(unsigned char *)s.buffer;
|
|
||||||
if (buffer && len > 0) return *(unsigned char *)buffer;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return strcmp(buffer, s.buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
int String::compareTo(const char *cstr) const
|
|
||||||
{
|
|
||||||
if (!buffer || !cstr) {
|
|
||||||
if (cstr && *cstr) return 0 - *(unsigned char *)cstr;
|
|
||||||
if (buffer && len > 0) return *(unsigned char *)buffer;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return strcmp(buffer, cstr);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::equals(const String &s2) const
|
|
||||||
{
|
|
||||||
return (len == s2.len && compareTo(s2) == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::equals(const char *cstr) const
|
|
||||||
{
|
|
||||||
if (len == 0) return (cstr == NULL || *cstr == 0);
|
|
||||||
if (cstr == NULL) return buffer[0] == 0;
|
|
||||||
return strcmp(buffer, cstr) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::equalsIgnoreCase( const String &s2 ) const
|
|
||||||
{
|
|
||||||
if (this == &s2) return 1;
|
|
||||||
if (len != s2.len) return 0;
|
|
||||||
if (len == 0) return 1;
|
|
||||||
const char *p1 = buffer;
|
|
||||||
const char *p2 = s2.buffer;
|
|
||||||
while (*p1) {
|
|
||||||
if (tolower(*p1++) != tolower(*p2++)) return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::startsWith( const String &s2 ) const
|
|
||||||
{
|
|
||||||
if (len < s2.len) return 0;
|
|
||||||
return startsWith(s2, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::startsWith( const String &s2, unsigned int offset ) const
|
|
||||||
{
|
|
||||||
if (offset > len - s2.len || !buffer || !s2.buffer) return 0;
|
|
||||||
return strncmp( &buffer[offset], s2.buffer, s2.len ) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::endsWith( const String &s2 ) const
|
|
||||||
{
|
|
||||||
if ( len < s2.len || !buffer || !s2.buffer) return 0;
|
|
||||||
return strcmp(&buffer[len - s2.len], s2.buffer) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* Character Access */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
char String::charAt(unsigned int loc) const
|
|
||||||
{
|
|
||||||
return operator[](loc);
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::setCharAt(unsigned int loc, char c)
|
|
||||||
{
|
|
||||||
if (loc < len) buffer[loc] = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
char & String::operator[](unsigned int index)
|
|
||||||
{
|
|
||||||
static char dummy_writable_char;
|
|
||||||
if (index >= len || !buffer) {
|
|
||||||
dummy_writable_char = 0;
|
|
||||||
return dummy_writable_char;
|
|
||||||
}
|
|
||||||
return buffer[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
char String::operator[]( unsigned int index ) const
|
|
||||||
{
|
|
||||||
if (index >= len || !buffer) return 0;
|
|
||||||
return buffer[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::getBytes(unsigned char *buf, unsigned int bufsize, unsigned int index) const
|
|
||||||
{
|
|
||||||
if (!bufsize || !buf) return;
|
|
||||||
if (index >= len) {
|
|
||||||
buf[0] = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
unsigned int n = bufsize - 1;
|
|
||||||
if (n > len - index) n = len - index;
|
|
||||||
strncpy((char *)buf, buffer + index, n);
|
|
||||||
buf[n] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* Search */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
int String::indexOf(char c) const
|
|
||||||
{
|
|
||||||
return indexOf(c, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int String::indexOf( char ch, unsigned int fromIndex ) const
|
|
||||||
{
|
|
||||||
if (fromIndex >= len) return -1;
|
|
||||||
const char* temp = strchr(buffer + fromIndex, ch);
|
|
||||||
if (temp == NULL) return -1;
|
|
||||||
return temp - buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
int String::indexOf(const String &s2) const
|
|
||||||
{
|
|
||||||
return indexOf(s2, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int String::indexOf(const String &s2, unsigned int fromIndex) const
|
|
||||||
{
|
|
||||||
if (fromIndex >= len) return -1;
|
|
||||||
const char *found = strstr(buffer + fromIndex, s2.buffer);
|
|
||||||
if (found == NULL) return -1;
|
|
||||||
return found - buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
int String::lastIndexOf( char theChar ) const
|
|
||||||
{
|
|
||||||
return lastIndexOf(theChar, len - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int String::lastIndexOf(char ch, unsigned int fromIndex) const
|
|
||||||
{
|
|
||||||
if (fromIndex >= len) return -1;
|
|
||||||
char tempchar = buffer[fromIndex + 1];
|
|
||||||
buffer[fromIndex + 1] = '\0';
|
|
||||||
char* temp = strrchr( buffer, ch );
|
|
||||||
buffer[fromIndex + 1] = tempchar;
|
|
||||||
if (temp == NULL) return -1;
|
|
||||||
return temp - buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
int String::lastIndexOf(const String &s2) const
|
|
||||||
{
|
|
||||||
return lastIndexOf(s2, len - s2.len);
|
|
||||||
}
|
|
||||||
|
|
||||||
int String::lastIndexOf(const String &s2, unsigned int fromIndex) const
|
|
||||||
{
|
|
||||||
if (s2.len == 0 || len == 0 || s2.len > len) return -1;
|
|
||||||
if (fromIndex >= len) fromIndex = len - 1;
|
|
||||||
int found = -1;
|
|
||||||
for (char *p = buffer; p <= buffer + fromIndex; p++) {
|
|
||||||
p = strstr(p, s2.buffer);
|
|
||||||
if (!p) break;
|
|
||||||
if ((unsigned int)(p - buffer) <= fromIndex) found = p - buffer;
|
|
||||||
}
|
|
||||||
return found;
|
|
||||||
}
|
|
||||||
|
|
||||||
String String::substring(unsigned int left, unsigned int right) const
|
|
||||||
{
|
|
||||||
if (left > right) {
|
|
||||||
unsigned int temp = right;
|
|
||||||
right = left;
|
|
||||||
left = temp;
|
|
||||||
}
|
|
||||||
String out;
|
|
||||||
if (left >= len) return out;
|
|
||||||
if (right > len) right = len;
|
|
||||||
out.copy(buffer + left, right - left);
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* Modification */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
void String::replace(char find, char replace)
|
|
||||||
{
|
|
||||||
if (!buffer) return;
|
|
||||||
for (char *p = buffer; *p; p++) {
|
|
||||||
if (*p == find) *p = replace;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::replace(const String& find, const String& replace)
|
|
||||||
{
|
|
||||||
if (len == 0 || find.len == 0) return;
|
|
||||||
int diff = replace.len - find.len;
|
|
||||||
char *readFrom = buffer;
|
|
||||||
char *foundAt;
|
|
||||||
if (diff == 0) {
|
|
||||||
while ((foundAt = strstr(readFrom, find.buffer)) != NULL) {
|
|
||||||
memcpy(foundAt, replace.buffer, replace.len);
|
|
||||||
readFrom = foundAt + replace.len;
|
|
||||||
}
|
|
||||||
} else if (diff < 0) {
|
|
||||||
unsigned int size = len; // compute size needed for result
|
|
||||||
while ((foundAt = strstr(readFrom, find.buffer)) != NULL) {
|
|
||||||
readFrom = foundAt + find.len;
|
|
||||||
diff = 0 - diff;
|
|
||||||
size -= diff;
|
|
||||||
}
|
|
||||||
if (size == len) return;
|
|
||||||
int index = len - 1;
|
|
||||||
while (index >= 0 && (index = lastIndexOf(find, index)) >= 0) {
|
|
||||||
readFrom = buffer + index + find.len;
|
|
||||||
memmove(readFrom - diff, readFrom, len - (readFrom - buffer));
|
|
||||||
len -= diff;
|
|
||||||
buffer[len] = 0;
|
|
||||||
memcpy(buffer + index, replace.buffer, replace.len);
|
|
||||||
index--;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
unsigned int size = len; // compute size needed for result
|
|
||||||
while ((foundAt = strstr(readFrom, find.buffer)) != NULL) {
|
|
||||||
readFrom = foundAt + find.len;
|
|
||||||
size += diff;
|
|
||||||
}
|
|
||||||
if (size == len) return;
|
|
||||||
if (size > capacity && !changeBuffer(size)) return; // XXX: tell user!
|
|
||||||
int index = len - 1;
|
|
||||||
while (index >= 0 && (index = lastIndexOf(find, index)) >= 0) {
|
|
||||||
readFrom = buffer + index + find.len;
|
|
||||||
memmove(readFrom + diff, readFrom, len - (readFrom - buffer));
|
|
||||||
len += diff;
|
|
||||||
buffer[len] = 0;
|
|
||||||
memcpy(buffer + index, replace.buffer, replace.len);
|
|
||||||
index--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::remove(unsigned int index){
|
|
||||||
// Pass the biggest integer as the count. The remove method
|
|
||||||
// below will take care of truncating it at the end of the
|
|
||||||
// string.
|
|
||||||
remove(index, (unsigned int)-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::remove(unsigned int index, unsigned int count){
|
|
||||||
if (index >= len) { return; }
|
|
||||||
if (count <= 0) { return; }
|
|
||||||
if (count > len - index) { count = len - index; }
|
|
||||||
char *writeTo = buffer + index;
|
|
||||||
len = len - count;
|
|
||||||
memmove(writeTo, buffer + index + count,len - index);
|
|
||||||
buffer[len] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::toLowerCase(void)
|
|
||||||
{
|
|
||||||
if (!buffer) return;
|
|
||||||
for (char *p = buffer; *p; p++) {
|
|
||||||
*p = tolower(*p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::toUpperCase(void)
|
|
||||||
{
|
|
||||||
if (!buffer) return;
|
|
||||||
for (char *p = buffer; *p; p++) {
|
|
||||||
*p = toupper(*p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::trim(void)
|
|
||||||
{
|
|
||||||
if (!buffer || len == 0) return;
|
|
||||||
char *begin = buffer;
|
|
||||||
while (isspace(*begin)) begin++;
|
|
||||||
char *end = buffer + len - 1;
|
|
||||||
while (isspace(*end) && end >= begin) end--;
|
|
||||||
len = end + 1 - begin;
|
|
||||||
if (begin > buffer) memmove(buffer, begin, len);
|
|
||||||
buffer[len] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* Parsing / Conversion */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
long String::toInt(void) const
|
|
||||||
{
|
|
||||||
if (buffer) return atol(buffer);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
float String::toFloat(void) const
|
|
||||||
{
|
|
||||||
return float(toDouble());
|
|
||||||
}
|
|
||||||
|
|
||||||
double String::toDouble(void) const
|
|
||||||
{
|
|
||||||
if (buffer) return atof(buffer);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace arduino
|
|
||||||
|
|
|
||||||
|
|
@ -1,259 +1,2 @@
|
||||||
/*
|
#pragma once
|
||||||
String library for Wiring & Arduino
|
#include "../../../ArduinoCore-API/api/String.h"
|
||||||
...mostly rewritten by Paul Stoffregen...
|
|
||||||
Copyright (c) 2009-10 Hernando Barragan. All right reserved.
|
|
||||||
Copyright 2011, Paul Stoffregen, paul@pjrc.com
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
|
|
||||||
#ifndef __ARDUINO_STRINGS__
|
|
||||||
#define __ARDUINO_STRINGS__
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#if defined(__AVR__)
|
|
||||||
#include "avr/pgmspace.h"
|
|
||||||
#else
|
|
||||||
#include "deprecated-avr-comp/avr/pgmspace.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace arduino {
|
|
||||||
|
|
||||||
// When compiling programs with this class, the following gcc parameters
|
|
||||||
// dramatically increase performance and memory (RAM) efficiency, typically
|
|
||||||
// with little or no increase in code size.
|
|
||||||
// -felide-constructors
|
|
||||||
// -std=c++0x
|
|
||||||
|
|
||||||
class __FlashStringHelper;
|
|
||||||
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
|
|
||||||
|
|
||||||
// An inherited class for holding the result of a concatenation. These
|
|
||||||
// result objects are assumed to be writable by subsequent concatenations.
|
|
||||||
class StringSumHelper;
|
|
||||||
|
|
||||||
// The string class
|
|
||||||
class String
|
|
||||||
{
|
|
||||||
friend class StringSumHelper;
|
|
||||||
// use a function pointer to allow for "if (s)" without the
|
|
||||||
// complications of an operator bool(). for more information, see:
|
|
||||||
// http://www.artima.com/cppsource/safebool.html
|
|
||||||
typedef void (String::*StringIfHelperType)() const;
|
|
||||||
void StringIfHelper() const {}
|
|
||||||
|
|
||||||
static size_t const FLT_MAX_DECIMAL_PLACES = 10;
|
|
||||||
static size_t const DBL_MAX_DECIMAL_PLACES = FLT_MAX_DECIMAL_PLACES;
|
|
||||||
|
|
||||||
public:
|
|
||||||
// constructors
|
|
||||||
// creates a copy of the initial value.
|
|
||||||
// if the initial value is null or invalid, or if memory allocation
|
|
||||||
// fails, the string will be marked as invalid (i.e. "if (s)" will
|
|
||||||
// be false).
|
|
||||||
String(const char *cstr = "");
|
|
||||||
String(const char *cstr, unsigned int length);
|
|
||||||
String(const uint8_t *cstr, unsigned int length) : String((const char*)cstr, length) {}
|
|
||||||
String(const String &str);
|
|
||||||
String(const __FlashStringHelper *str);
|
|
||||||
#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
|
||||||
String(String &&rval);
|
|
||||||
String(StringSumHelper &&rval);
|
|
||||||
#endif
|
|
||||||
explicit String(char c);
|
|
||||||
explicit String(unsigned char, unsigned char base=10);
|
|
||||||
explicit String(int, unsigned char base=10);
|
|
||||||
explicit String(unsigned int, unsigned char base=10);
|
|
||||||
explicit String(long, unsigned char base=10);
|
|
||||||
explicit String(unsigned long, unsigned char base=10);
|
|
||||||
explicit String(float, unsigned char decimalPlaces=2);
|
|
||||||
explicit String(double, unsigned char decimalPlaces=2);
|
|
||||||
~String(void);
|
|
||||||
|
|
||||||
// memory management
|
|
||||||
// return true on success, false on failure (in which case, the string
|
|
||||||
// is left unchanged). reserve(0), if successful, will validate an
|
|
||||||
// invalid string (i.e., "if (s)" will be true afterwards)
|
|
||||||
unsigned char reserve(unsigned int size);
|
|
||||||
inline unsigned int length(void) const {return len;}
|
|
||||||
|
|
||||||
// creates a copy of the assigned value. if the value is null or
|
|
||||||
// invalid, or if the memory allocation fails, the string will be
|
|
||||||
// marked as invalid ("if (s)" will be false).
|
|
||||||
String & operator = (const String &rhs);
|
|
||||||
String & operator = (const char *cstr);
|
|
||||||
String & operator = (const __FlashStringHelper *str);
|
|
||||||
#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
|
||||||
String & operator = (String &&rval);
|
|
||||||
String & operator = (StringSumHelper &&rval);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// concatenate (works w/ built-in types)
|
|
||||||
|
|
||||||
// returns true on success, false on failure (in which case, the string
|
|
||||||
// is left unchanged). if the argument is null or invalid, the
|
|
||||||
// concatenation is considered unsucessful.
|
|
||||||
unsigned char concat(const String &str);
|
|
||||||
unsigned char concat(const char *cstr);
|
|
||||||
unsigned char concat(const char *cstr, unsigned int length);
|
|
||||||
unsigned char concat(const uint8_t *cstr, unsigned int length) {return concat((const char*)cstr, length);}
|
|
||||||
unsigned char concat(char c);
|
|
||||||
unsigned char concat(unsigned char num);
|
|
||||||
unsigned char concat(int num);
|
|
||||||
unsigned char concat(unsigned int num);
|
|
||||||
unsigned char concat(long num);
|
|
||||||
unsigned char concat(unsigned long num);
|
|
||||||
unsigned char concat(float num);
|
|
||||||
unsigned char concat(double num);
|
|
||||||
unsigned char concat(const __FlashStringHelper * str);
|
|
||||||
|
|
||||||
// if there's not enough memory for the concatenated value, the string
|
|
||||||
// will be left unchanged (but this isn't signalled in any way)
|
|
||||||
String & operator += (const String &rhs) {concat(rhs); return (*this);}
|
|
||||||
String & operator += (const char *cstr) {concat(cstr); return (*this);}
|
|
||||||
String & operator += (char c) {concat(c); return (*this);}
|
|
||||||
String & operator += (unsigned char num) {concat(num); return (*this);}
|
|
||||||
String & operator += (int num) {concat(num); return (*this);}
|
|
||||||
String & operator += (unsigned int num) {concat(num); return (*this);}
|
|
||||||
String & operator += (long num) {concat(num); return (*this);}
|
|
||||||
String & operator += (unsigned long num) {concat(num); return (*this);}
|
|
||||||
String & operator += (float num) {concat(num); return (*this);}
|
|
||||||
String & operator += (double num) {concat(num); return (*this);}
|
|
||||||
String & operator += (const __FlashStringHelper *str){concat(str); return (*this);}
|
|
||||||
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs);
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr);
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, char c);
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned char num);
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, int num);
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num);
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, long num);
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num);
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, float num);
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, double num);
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, const __FlashStringHelper *rhs);
|
|
||||||
|
|
||||||
// comparison (only works w/ Strings and "strings")
|
|
||||||
operator StringIfHelperType() const { return buffer ? &String::StringIfHelper : 0; }
|
|
||||||
int compareTo(const String &s) const;
|
|
||||||
int compareTo(const char *cstr) const;
|
|
||||||
unsigned char equals(const String &s) const;
|
|
||||||
unsigned char equals(const char *cstr) const;
|
|
||||||
|
|
||||||
friend unsigned char operator == (const String &a, const String &b) { return a.equals(b); }
|
|
||||||
friend unsigned char operator == (const String &a, const char *b) { return a.equals(b); }
|
|
||||||
friend unsigned char operator == (const char *a, const String &b) { return b == a; }
|
|
||||||
friend unsigned char operator < (const String &a, const String &b) { return a.compareTo(b) < 0; }
|
|
||||||
friend unsigned char operator < (const String &a, const char *b) { return a.compareTo(b) < 0; }
|
|
||||||
friend unsigned char operator < (const char *a, const String &b) { return b.compareTo(a) > 0; }
|
|
||||||
|
|
||||||
friend unsigned char operator != (const String &a, const String &b) { return !(a == b); }
|
|
||||||
friend unsigned char operator != (const String &a, const char *b) { return !(a == b); }
|
|
||||||
friend unsigned char operator != (const char *a, const String &b) { return !(a == b); }
|
|
||||||
friend unsigned char operator > (const String &a, const String &b) { return b < a; }
|
|
||||||
friend unsigned char operator > (const String &a, const char *b) { return b < a; }
|
|
||||||
friend unsigned char operator > (const char *a, const String &b) { return b < a; }
|
|
||||||
friend unsigned char operator <= (const String &a, const String &b) { return !(b < a); }
|
|
||||||
friend unsigned char operator <= (const String &a, const char *b) { return !(b < a); }
|
|
||||||
friend unsigned char operator <= (const char *a, const String &b) { return !(b < a); }
|
|
||||||
friend unsigned char operator >= (const String &a, const String &b) { return !(a < b); }
|
|
||||||
friend unsigned char operator >= (const String &a, const char *b) { return !(a < b); }
|
|
||||||
friend unsigned char operator >= (const char *a, const String &b) { return !(a < b); }
|
|
||||||
|
|
||||||
unsigned char equalsIgnoreCase(const String &s) const;
|
|
||||||
unsigned char startsWith( const String &prefix) const;
|
|
||||||
unsigned char startsWith(const String &prefix, unsigned int offset) const;
|
|
||||||
unsigned char endsWith(const String &suffix) const;
|
|
||||||
|
|
||||||
// character acccess
|
|
||||||
char charAt(unsigned int index) const;
|
|
||||||
void setCharAt(unsigned int index, char c);
|
|
||||||
char operator [] (unsigned int index) const;
|
|
||||||
char& operator [] (unsigned int index);
|
|
||||||
void getBytes(unsigned char *buf, unsigned int bufsize, unsigned int index=0) const;
|
|
||||||
void toCharArray(char *buf, unsigned int bufsize, unsigned int index=0) const
|
|
||||||
{ getBytes((unsigned char *)buf, bufsize, index); }
|
|
||||||
const char* c_str() const { return buffer; }
|
|
||||||
char* begin() { return buffer; }
|
|
||||||
char* end() { return buffer + length(); }
|
|
||||||
const char* begin() const { return c_str(); }
|
|
||||||
const char* end() const { return c_str() + length(); }
|
|
||||||
|
|
||||||
// search
|
|
||||||
int indexOf( char ch ) const;
|
|
||||||
int indexOf( char ch, unsigned int fromIndex ) const;
|
|
||||||
int indexOf( const String &str ) const;
|
|
||||||
int indexOf( const String &str, unsigned int fromIndex ) const;
|
|
||||||
int lastIndexOf( char ch ) const;
|
|
||||||
int lastIndexOf( char ch, unsigned int fromIndex ) const;
|
|
||||||
int lastIndexOf( const String &str ) const;
|
|
||||||
int lastIndexOf( const String &str, unsigned int fromIndex ) const;
|
|
||||||
String substring( unsigned int beginIndex ) const { return substring(beginIndex, len); };
|
|
||||||
String substring( unsigned int beginIndex, unsigned int endIndex ) const;
|
|
||||||
|
|
||||||
// modification
|
|
||||||
void replace(char find, char replace);
|
|
||||||
void replace(const String& find, const String& replace);
|
|
||||||
void remove(unsigned int index);
|
|
||||||
void remove(unsigned int index, unsigned int count);
|
|
||||||
void toLowerCase(void);
|
|
||||||
void toUpperCase(void);
|
|
||||||
void trim(void);
|
|
||||||
|
|
||||||
// parsing/conversion
|
|
||||||
long toInt(void) const;
|
|
||||||
float toFloat(void) const;
|
|
||||||
double toDouble(void) const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
char *buffer; // the actual char array
|
|
||||||
unsigned int capacity; // the array length minus one (for the '\0')
|
|
||||||
unsigned int len; // the String length (not counting the '\0')
|
|
||||||
protected:
|
|
||||||
void init(void);
|
|
||||||
void invalidate(void);
|
|
||||||
unsigned char changeBuffer(unsigned int maxStrLen);
|
|
||||||
|
|
||||||
// copy and move
|
|
||||||
String & copy(const char *cstr, unsigned int length);
|
|
||||||
String & copy(const __FlashStringHelper *pstr, unsigned int length);
|
|
||||||
#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
|
||||||
void move(String &rhs);
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
class StringSumHelper : public String
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
StringSumHelper(const String &s) : String(s) {}
|
|
||||||
StringSumHelper(const char *p) : String(p) {}
|
|
||||||
StringSumHelper(char c) : String(c) {}
|
|
||||||
StringSumHelper(unsigned char num) : String(num) {}
|
|
||||||
StringSumHelper(int num) : String(num) {}
|
|
||||||
StringSumHelper(unsigned int num) : String(num) {}
|
|
||||||
StringSumHelper(long num) : String(num) {}
|
|
||||||
StringSumHelper(unsigned long num) : String(num) {}
|
|
||||||
StringSumHelper(float num) : String(num) {}
|
|
||||||
StringSumHelper(double num) : String(num) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace arduino
|
|
||||||
|
|
||||||
#endif // __cplusplus
|
|
||||||
#endif // __ARDUINO_STRINGS__
|
|
||||||
|
|
|
||||||
|
|
@ -1,64 +1,2 @@
|
||||||
/*
|
#pragma once
|
||||||
USBAPI.h
|
#include "../../../ArduinoCore-API/api/USBAPI.h"
|
||||||
Copyright (c) 2005-2014 Arduino. All right reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __USBAPI__
|
|
||||||
#define __USBAPI__
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
namespace arduino {
|
|
||||||
//================================================================================
|
|
||||||
//================================================================================
|
|
||||||
// Low level API
|
|
||||||
|
|
||||||
typedef struct __attribute__((packed))
|
|
||||||
{
|
|
||||||
union {
|
|
||||||
uint8_t bmRequestType;
|
|
||||||
struct {
|
|
||||||
uint8_t direction : 5;
|
|
||||||
uint8_t type : 2;
|
|
||||||
uint8_t transferDirection : 1;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
uint8_t bRequest;
|
|
||||||
uint8_t wValueL;
|
|
||||||
uint8_t wValueH;
|
|
||||||
uint16_t wIndex;
|
|
||||||
uint16_t wLength;
|
|
||||||
} USBSetup;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//================================================================================
|
|
||||||
// USB APIs (C scope)
|
|
||||||
//================================================================================
|
|
||||||
|
|
||||||
int USB_SendControl(uint8_t flags, const void* d, int len);
|
|
||||||
int USB_RecvControl(void* d, int len);
|
|
||||||
int USB_RecvControlLong(void* d, int len);
|
|
||||||
|
|
||||||
uint8_t USB_Available(uint8_t ep);
|
|
||||||
uint8_t USB_SendSpace(uint8_t ep);
|
|
||||||
int USB_Send(uint8_t ep, const void* data, int len); // blocking
|
|
||||||
int USB_Recv(uint8_t ep, void* data, int len); // non-blocking
|
|
||||||
int USB_Recv(uint8_t ep); // non-blocking
|
|
||||||
void USB_Flush(uint8_t ep);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
||||||
|
|
@ -1,92 +1,2 @@
|
||||||
/*
|
|
||||||
* Udp.cpp: Library to send/receive UDP packets.
|
|
||||||
*
|
|
||||||
* NOTE: UDP is fast, but has some important limitations (thanks to Warren Gray for mentioning these)
|
|
||||||
* 1) UDP does not guarantee the order in which assembled UDP packets are received. This
|
|
||||||
* might not happen often in practice, but in larger network topologies, a UDP
|
|
||||||
* packet can be received out of sequence.
|
|
||||||
* 2) UDP does not guard against lost packets - so packets *can* disappear without the sender being
|
|
||||||
* aware of it. Again, this may not be a concern in practice on small local networks.
|
|
||||||
* For more information, see http://www.cafeaulait.org/course/week12/35.html
|
|
||||||
*
|
|
||||||
* MIT License:
|
|
||||||
* Copyright (c) 2008 Bjoern Hartmann
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* bjoern@cs.stanford.edu 12/30/2008
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include "../../../ArduinoCore-API/api/Udp.h"
|
||||||
#include "Stream.h"
|
|
||||||
#include "IPAddress.h"
|
|
||||||
|
|
||||||
namespace arduino {
|
|
||||||
|
|
||||||
class UDP : public Stream {
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual uint8_t begin(uint16_t) =0; // initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use
|
|
||||||
virtual uint8_t beginMulticast(IPAddress, uint16_t) { return 0; } // initialize, start listening on specified multicast IP address and port. Returns 1 if successful, 0 on failure
|
|
||||||
virtual void stop() =0; // Finish with the UDP socket
|
|
||||||
|
|
||||||
// Sending UDP packets
|
|
||||||
|
|
||||||
// Start building up a packet to send to the remote host specific in ip and port
|
|
||||||
// Returns 1 if successful, 0 if there was a problem with the supplied IP address or port
|
|
||||||
virtual int beginPacket(IPAddress ip, uint16_t port) =0;
|
|
||||||
// Start building up a packet to send to the remote host specific in host and port
|
|
||||||
// Returns 1 if successful, 0 if there was a problem resolving the hostname or port
|
|
||||||
virtual int beginPacket(const char *host, uint16_t port) =0;
|
|
||||||
// Finish off this packet and send it
|
|
||||||
// Returns 1 if the packet was sent successfully, 0 if there was an error
|
|
||||||
virtual int endPacket() =0;
|
|
||||||
// Write a single byte into the packet
|
|
||||||
virtual size_t write(uint8_t) =0;
|
|
||||||
// Write size bytes from buffer into the packet
|
|
||||||
virtual size_t write(const uint8_t *buffer, size_t size) =0;
|
|
||||||
|
|
||||||
// Start processing the next available incoming packet
|
|
||||||
// Returns the size of the packet in bytes, or 0 if no packets are available
|
|
||||||
virtual int parsePacket() =0;
|
|
||||||
// Number of bytes remaining in the current packet
|
|
||||||
virtual int available() =0;
|
|
||||||
// Read a single byte from the current packet
|
|
||||||
virtual int read() =0;
|
|
||||||
// Read up to len bytes from the current packet and place them into buffer
|
|
||||||
// Returns the number of bytes read, or 0 if none are available
|
|
||||||
virtual int read(unsigned char* buffer, size_t len) =0;
|
|
||||||
// Read up to len characters from the current packet and place them into buffer
|
|
||||||
// Returns the number of characters read, or 0 if none are available
|
|
||||||
virtual int read(char* buffer, size_t len) =0;
|
|
||||||
// Return the next byte from the current packet without moving on to the next byte
|
|
||||||
virtual int peek() =0;
|
|
||||||
virtual void flush() =0; // Finish reading the current packet
|
|
||||||
|
|
||||||
// Return the IP address of the host who sent the current incoming packet
|
|
||||||
virtual IPAddress remoteIP() =0;
|
|
||||||
// Return the port of the host who sent the current incoming packet
|
|
||||||
virtual uint16_t remotePort() =0;
|
|
||||||
protected:
|
|
||||||
uint8_t* rawIPAddress(IPAddress& addr) { return addr.raw_address(); };
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
using namespace arduino;
|
|
||||||
|
|
|
||||||
|
|
@ -1,171 +1,2 @@
|
||||||
/*
|
#pragma once
|
||||||
WCharacter.h - Character utility functions for Wiring & Arduino
|
#include "../../../ArduinoCore-API/api/WCharacter.h"
|
||||||
Copyright (c) 2010 Hernando Barragan. All right reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef Character_h
|
|
||||||
#define Character_h
|
|
||||||
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
namespace arduino {
|
|
||||||
|
|
||||||
// WCharacter.h prototypes
|
|
||||||
inline bool isAlphaNumeric(int c) __attribute__((always_inline));
|
|
||||||
inline bool isAlpha(int c) __attribute__((always_inline));
|
|
||||||
inline bool isAscii(int c) __attribute__((always_inline));
|
|
||||||
inline bool isWhitespace(int c) __attribute__((always_inline));
|
|
||||||
inline bool isControl(int c) __attribute__((always_inline));
|
|
||||||
inline bool isDigit(int c) __attribute__((always_inline));
|
|
||||||
inline bool isGraph(int c) __attribute__((always_inline));
|
|
||||||
inline bool isLowerCase(int c) __attribute__((always_inline));
|
|
||||||
inline bool isPrintable(int c) __attribute__((always_inline));
|
|
||||||
inline bool isPunct(int c) __attribute__((always_inline));
|
|
||||||
inline bool isSpace(int c) __attribute__((always_inline));
|
|
||||||
inline bool isUpperCase(int c) __attribute__((always_inline));
|
|
||||||
inline bool isHexadecimalDigit(int c) __attribute__((always_inline));
|
|
||||||
inline int toAscii(int c) __attribute__((always_inline));
|
|
||||||
inline int toLowerCase(int c) __attribute__((always_inline));
|
|
||||||
inline int toUpperCase(int c)__attribute__((always_inline));
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for an alphanumeric character.
|
|
||||||
// It is equivalent to (isalpha(c) || isdigit(c)).
|
|
||||||
inline bool isAlphaNumeric(int c)
|
|
||||||
{
|
|
||||||
return ( isalnum(c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for an alphabetic character.
|
|
||||||
// It is equivalent to (isupper(c) || islower(c)).
|
|
||||||
inline bool isAlpha(int c)
|
|
||||||
{
|
|
||||||
return ( isalpha(c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks whether c is a 7-bit unsigned char value
|
|
||||||
// that fits into the ASCII character set.
|
|
||||||
inline bool isAscii(int c)
|
|
||||||
{
|
|
||||||
return ( isascii (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for a blank character, that is, a space or a tab.
|
|
||||||
inline bool isWhitespace(int c)
|
|
||||||
{
|
|
||||||
return ( isblank (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for a control character.
|
|
||||||
inline bool isControl(int c)
|
|
||||||
{
|
|
||||||
return ( iscntrl (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for a digit (0 through 9).
|
|
||||||
inline bool isDigit(int c)
|
|
||||||
{
|
|
||||||
return ( isdigit (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for any printable character except space.
|
|
||||||
inline bool isGraph(int c)
|
|
||||||
{
|
|
||||||
return ( isgraph (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for a lower-case character.
|
|
||||||
inline bool isLowerCase(int c)
|
|
||||||
{
|
|
||||||
return (islower (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for any printable character including space.
|
|
||||||
inline bool isPrintable(int c)
|
|
||||||
{
|
|
||||||
return ( isprint (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for any printable character which is not a space
|
|
||||||
// or an alphanumeric character.
|
|
||||||
inline bool isPunct(int c)
|
|
||||||
{
|
|
||||||
return ( ispunct (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for white-space characters. For the avr-libc library,
|
|
||||||
// these are: space, formfeed ('\f'), newline ('\n'), carriage
|
|
||||||
// return ('\r'), horizontal tab ('\t'), and vertical tab ('\v').
|
|
||||||
inline bool isSpace(int c)
|
|
||||||
{
|
|
||||||
return ( isspace (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for an uppercase letter.
|
|
||||||
inline bool isUpperCase(int c)
|
|
||||||
{
|
|
||||||
return ( isupper (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for a hexadecimal digits, i.e. one of 0 1 2 3 4 5 6 7
|
|
||||||
// 8 9 a b c d e f A B C D E F.
|
|
||||||
inline bool isHexadecimalDigit(int c)
|
|
||||||
{
|
|
||||||
return ( isxdigit (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Converts c to a 7-bit unsigned char value that fits into the
|
|
||||||
// ASCII character set, by clearing the high-order bits.
|
|
||||||
inline int toAscii(int c)
|
|
||||||
{
|
|
||||||
return toascii (c);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Warning:
|
|
||||||
// Many people will be unhappy if you use this function.
|
|
||||||
// This function will convert accented letters into random
|
|
||||||
// characters.
|
|
||||||
|
|
||||||
// Converts the letter c to lower case, if possible.
|
|
||||||
inline int toLowerCase(int c)
|
|
||||||
{
|
|
||||||
return tolower (c);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Converts the letter c to upper case, if possible.
|
|
||||||
inline int toUpperCase(int c)
|
|
||||||
{
|
|
||||||
return toupper (c);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
|
||||||
|
|
@ -1,37 +1 @@
|
||||||
/*
|
#include "../../../../../ArduinoCore-API/api/deprecated-avr-comp/avr/dtostrf.c.impl"
|
||||||
dtostrf - Emulation for dtostrf function from avr-libc
|
|
||||||
Copyright (c) 2016 Arduino LLC. All rights reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
// This is a default implementation for dtostrf function.
|
|
||||||
// This file should be used if the standard lib doesn't provide an
|
|
||||||
// implementation of dtostrf.
|
|
||||||
|
|
||||||
// Create a file called "dtostrf.c" with the following include:
|
|
||||||
// #include "api/deprecated-avr-comp/avr/dtostrf.c.impl"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
char *dtostrf (double val, signed char width, unsigned char prec, char *sout) {
|
|
||||||
asm(".global _printf_float");
|
|
||||||
|
|
||||||
char fmt[20];
|
|
||||||
sprintf(fmt, "%%%d.%df", width, prec);
|
|
||||||
sprintf(sout, fmt, val);
|
|
||||||
return sout;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,34 +1,2 @@
|
||||||
/*
|
|
||||||
dtostrf - Emulation for dtostrf function from avr-libc
|
|
||||||
Copyright (c) 2015 Arduino LLC. All rights reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include "../../../../../ArduinoCore-API/api/deprecated-avr-comp/avr/dtostrf.h"
|
||||||
#if !defined(ARDUINO_ARCH_AVR)
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
char *dtostrf(double val, signed char width, unsigned char prec, char *sout);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,2 @@
|
||||||
/*
|
#pragma once
|
||||||
Copyright (c) 2015 Arduino LCC. All right reserved.
|
#include "../../../../../ArduinoCore-API/api/deprecated-avr-comp/avr/interrupt.h"
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
See the GNU Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Empty file.
|
|
||||||
This file is here to allow compatibility with sketches (made for AVR)
|
|
||||||
that includes <AVR/interrupt.h>
|
|
||||||
*/
|
|
||||||
|
|
|
||||||
|
|
@ -1,158 +1,2 @@
|
||||||
/*
|
#pragma once
|
||||||
pgmspace.h - Definitions for compatibility with AVR pgmspace macros
|
#include "../../../../../ArduinoCore-API/api/deprecated-avr-comp/avr/pgmspace.h"
|
||||||
|
|
||||||
Copyright (c) 2015 Arduino LLC
|
|
||||||
|
|
||||||
Based on work of Paul Stoffregen on Teensy 3 (http://pjrc.com)
|
|
||||||
|
|
||||||
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
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __PGMSPACE_H_
|
|
||||||
#define __PGMSPACE_H_ 1
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
|
||||||
|
|
||||||
#define PROGMEM
|
|
||||||
#define PGM_P const char *
|
|
||||||
#define PSTR(str) (str)
|
|
||||||
|
|
||||||
#define _SFR_BYTE(n) (n)
|
|
||||||
|
|
||||||
typedef void prog_void;
|
|
||||||
typedef char prog_char;
|
|
||||||
typedef unsigned char prog_uchar;
|
|
||||||
typedef int8_t prog_int8_t;
|
|
||||||
typedef uint8_t prog_uint8_t;
|
|
||||||
typedef int16_t prog_int16_t;
|
|
||||||
typedef uint16_t prog_uint16_t;
|
|
||||||
typedef int32_t prog_int32_t;
|
|
||||||
typedef uint32_t prog_uint32_t;
|
|
||||||
typedef int64_t prog_int64_t;
|
|
||||||
typedef uint64_t prog_uint64_t;
|
|
||||||
|
|
||||||
typedef const void* int_farptr_t;
|
|
||||||
typedef const void* uint_farptr_t;
|
|
||||||
|
|
||||||
#define memchr_P(s, c, n) memchr((s), (c), (n))
|
|
||||||
#define memcmp_P(s1, s2, n) memcmp((s1), (s2), (n))
|
|
||||||
#define memccpy_P(dest, src, c, n) memccpy((dest), (src), (c), (n))
|
|
||||||
#define memcpy_P(dest, src, n) memcpy((dest), (src), (n))
|
|
||||||
#define memmem_P(haystack, haystacklen, needle, needlelen) memmem((haystack), (haystacklen), (needle), (needlelen))
|
|
||||||
#define memrchr_P(s, c, n) memrchr((s), (c), (n))
|
|
||||||
#define strcat_P(dest, src) strcat((dest), (src))
|
|
||||||
#define strchr_P(s, c) strchr((s), (c))
|
|
||||||
#define strchrnul_P(s, c) strchrnul((s), (c))
|
|
||||||
#define strcmp_P(a, b) strcmp((a), (b))
|
|
||||||
#define strcpy_P(dest, src) strcpy((dest), (src))
|
|
||||||
#define strcasecmp_P(s1, s2) strcasecmp((s1), (s2))
|
|
||||||
#define strcasestr_P(haystack, needle) strcasestr((haystack), (needle))
|
|
||||||
#define strcspn_P(s, accept) strcspn((s), (accept))
|
|
||||||
#define strlcat_P(s1, s2, n) strlcat((s1), (s2), (n))
|
|
||||||
#define strlcpy_P(s1, s2, n) strlcpy((s1), (s2), (n))
|
|
||||||
#define strlen_P(a) strlen((a))
|
|
||||||
#define strnlen_P(s, n) strnlen((s), (n))
|
|
||||||
#define strncmp_P(s1, s2, n) strncmp((s1), (s2), (n))
|
|
||||||
#define strncasecmp_P(s1, s2, n) strncasecmp((s1), (s2), (n))
|
|
||||||
#define strncat_P(s1, s2, n) strncat((s1), (s2), (n))
|
|
||||||
#define strncpy_P(s1, s2, n) strncpy((s1), (s2), (n))
|
|
||||||
#define strpbrk_P(s, accept) strpbrk((s), (accept))
|
|
||||||
#define strrchr_P(s, c) strrchr((s), (c))
|
|
||||||
#define strsep_P(sp, delim) strsep((sp), (delim))
|
|
||||||
#define strspn_P(s, accept) strspn((s), (accept))
|
|
||||||
#define strstr_P(a, b) strstr((a), (b))
|
|
||||||
#define strtok_P(s, delim) strtok((s), (delim))
|
|
||||||
#define strtok_rP(s, delim, last) strtok((s), (delim), (last))
|
|
||||||
|
|
||||||
#define strlen_PF(a) strlen((a))
|
|
||||||
#define strnlen_PF(src, len) strnlen((src), (len))
|
|
||||||
#define memcpy_PF(dest, src, len) memcpy((dest), (src), (len))
|
|
||||||
#define strcpy_PF(dest, src) strcpy((dest), (src))
|
|
||||||
#define strncpy_PF(dest, src, len) strncpy((dest), (src), (len))
|
|
||||||
#define strcat_PF(dest, src) strcat((dest), (src))
|
|
||||||
#define strlcat_PF(dest, src, len) strlcat((dest), (src), (len))
|
|
||||||
#define strncat_PF(dest, src, len) strncat((dest), (src), (len))
|
|
||||||
#define strcmp_PF(s1, s2) strcmp((s1), (s2))
|
|
||||||
#define strncmp_PF(s1, s2, n) strncmp((s1), (s2), (n))
|
|
||||||
#define strcasecmp_PF(s1, s2) strcasecmp((s1), (s2))
|
|
||||||
#define strncasecmp_PF(s1, s2, n) strncasecmp((s1), (s2), (n))
|
|
||||||
#define strstr_PF(s1, s2) strstr((s1), (s2))
|
|
||||||
#define strlcpy_PF(dest, src, n) strlcpy((dest), (src), (n))
|
|
||||||
#define memcmp_PF(s1, s2, n) memcmp((s1), (s2), (n))
|
|
||||||
|
|
||||||
#define sprintf_P(s, f, ...) sprintf((s), (f), __VA_ARGS__)
|
|
||||||
#define snprintf_P(s, f, ...) snprintf((s), (f), __VA_ARGS__)
|
|
||||||
#define vsprintf_P(s, f, ...) vsprintf((s), (f), __VA_ARGS__)
|
|
||||||
#define vsnprintf_P(s, f, ...) vsnprintf((s), (f), __VA_ARGS__)
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
// Requires natural aligned addresses
|
|
||||||
#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
|
|
||||||
#define pgm_read_word(addr) (*(const unsigned short *)(addr))
|
|
||||||
#define pgm_read_dword(addr) (*(const unsigned long *)(addr))
|
|
||||||
#define pgm_read_float(addr) (*(const float *)(addr))
|
|
||||||
#define pgm_read_ptr(addr) (*(void *const *)(addr))
|
|
||||||
#else
|
|
||||||
// Supports misaligned addresses
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"{
|
|
||||||
#endif
|
|
||||||
static inline unsigned char pgm_read_byte(const void *addr) {
|
|
||||||
return *(const unsigned char *)(addr);
|
|
||||||
}
|
|
||||||
static inline unsigned short pgm_read_word(const void *addr) {
|
|
||||||
const unsigned char *a = (const unsigned char *)addr;
|
|
||||||
return pgm_read_byte(a) | ( pgm_read_byte(a + 1) << 8 );
|
|
||||||
}
|
|
||||||
static inline unsigned long pgm_read_dword(const void *addr) {
|
|
||||||
const unsigned char *a = (const unsigned char *)addr;
|
|
||||||
return pgm_read_byte(a) | ( pgm_read_byte(a + 1) << 8 ) | ( pgm_read_byte(a + 2) << 16 ) | ( pgm_read_byte(a + 3) << 24 );
|
|
||||||
}
|
|
||||||
static inline void *pgm_read_ptr(const void *addr) {
|
|
||||||
return (void*) pgm_read_dword(addr);
|
|
||||||
}
|
|
||||||
static inline float pgm_read_float(const void *addr) {
|
|
||||||
union {
|
|
||||||
void *p;
|
|
||||||
float f;
|
|
||||||
} x;
|
|
||||||
x.p = pgm_read_ptr(addr);
|
|
||||||
return x.f;
|
|
||||||
}
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define pgm_read_byte_near(addr) pgm_read_byte(addr)
|
|
||||||
#define pgm_read_word_near(addr) pgm_read_word(addr)
|
|
||||||
#define pgm_read_dword_near(addr) pgm_read_dword(addr)
|
|
||||||
#define pgm_read_float_near(addr) pgm_read_float(addr)
|
|
||||||
#define pgm_read_ptr_near(addr) pgm_read_ptr(addr)
|
|
||||||
|
|
||||||
#define pgm_read_byte_far(addr) pgm_read_byte(addr)
|
|
||||||
#define pgm_read_word_far(addr) pgm_read_word(addr)
|
|
||||||
#define pgm_read_dword_far(addr) pgm_read_dword(addr)
|
|
||||||
#define pgm_read_float_far(addr) pgm_read_float(addr)
|
|
||||||
#define pgm_read_ptr_far(addr) pgm_read_ptr(addr)
|
|
||||||
|
|
||||||
#define pgm_get_far_address(addr) (&(addr))
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
||||||
|
|
@ -1,37 +1,2 @@
|
||||||
/*
|
|
||||||
Copyright (c) 2016 Arduino LLC. All right reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
See the GNU Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include "../../../ArduinoCore-API/api/itoa.h"
|
||||||
// Standard C functions required in Arduino API
|
|
||||||
// If these functions are not provided by the standard library, the
|
|
||||||
// core should supply an implementation of them.
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern char* itoa(int value, char *string, int radix);
|
|
||||||
extern char* ltoa(long value, char *string, int radix);
|
|
||||||
extern char* utoa(unsigned value, char *string, int radix);
|
|
||||||
extern char* ultoa(unsigned long value, char *string, int radix);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue