diff --git a/cores/esp8266/WString.cpp b/cores/esp8266/WString.cpp index bf9c4227a..dffacc3f5 100644 --- a/cores/esp8266/WString.cpp +++ b/cores/esp8266/WString.cpp @@ -702,12 +702,12 @@ void ICACHE_FLASH_ATTR String::trim(void) long ICACHE_FLASH_ATTR String::toInt(void) const { - if (buffer) return atol_internal(buffer); + if (buffer) return atol(buffer); return 0; } float ICACHE_FLASH_ATTR String::toFloat(void) const { - if (buffer) return float(atof_internal(buffer)); + if (buffer) return atof(buffer); return 0; } diff --git a/cores/esp8266/core_esp8266_noniso.c b/cores/esp8266/core_esp8266_noniso.c index cab945c94..5a0b2d059 100644 --- a/cores/esp8266/core_esp8266_noniso.c +++ b/cores/esp8266/core_esp8266_noniso.c @@ -26,7 +26,7 @@ #define sprintf ets_sprintf #define strcpy ets_strcpy -long atol_internal(const char* s) +long atol(const char* s) { int result = 0; int i; @@ -44,10 +44,52 @@ long atol_internal(const char* s) return sign * result; } -float atof_internal(const char* s) +// Source: +// https://github.com/anakod/Sming/blob/master/Sming/system/stringconversion.cpp#L93 +double atof(const char* s) { - float result = 0; - return result; + double result = 0; + double sign = 1; + + while (*s == ' ' || *s == '\t' || *s == '\r' || *s == '\n') + ++s; + + if (*s == 0) + return 0; + + if (*s == '-') + { + sign = -1; + ++s; + } + if (*s == '+') + { + ++s; + } + + bool decimals = false; + double factor = 1.0; + char c; + while((c = *s)) + { + if (c == '.') + { + decimals = true; + ++s; + continue; + } + + int d = c - '0'; + if (d < 0 || d > 9) + break; + + result = 10.0 * result + d; + if (decimals) + factor *= 0.1; + ++s; + } + + return result * factor; } diff --git a/cores/esp8266/libc_replacements.c b/cores/esp8266/libc_replacements.c new file mode 100644 index 000000000..9346ac4df --- /dev/null +++ b/cores/esp8266/libc_replacements.c @@ -0,0 +1,101 @@ +/* + libc_replacements.c - replaces libc functions with functions + from Espressif SDK + + Copyright (c) 2015 Ivan Grokhotkov. All rights reserved. + This file is part of the esp8266 core for Arduino environment. + + 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 +#include + +#include "ets_sys.h" +#include "os_type.h" +#include "osapi.h" +#include "mem.h" +#include "user_interface.h" + + +void* malloc(size_t size) { + return os_malloc(size); +} + +void free(void* ptr) { + os_free(ptr); +} + +void* realloc(void* ptr, size_t size) { + return os_realloc(ptr, size); +} + +int printf(const char* format, ...) { + va_list arglist; + va_start(arglist, format); + ets_vprintf(format, arglist); + va_end(arglist); +} + +int sprintf(char* buffer, const char* format, ...) { + va_list arglist; + va_start(arglist, format); + ets_vsprintf(buffer, format, arglist); + va_end(arglist); +} + +int snprintf(char* buffer, size_t size, const char* format, ...) { + va_list arglist; + va_start(arglist, format); + ets_vsnprintf(buffer, size, format, arglist); + va_end(arglist); +} + +int memcmp(const void *s1, const void *s2, size_t n) { + return ets_memcmp(s1, s2, n); +} + +void* memcpy(void *dest, const void *src, size_t n) { + return ets_memcpy(dest, src, n); +} + +void* memset(void *s, int c, size_t n) { + return ets_memset(s, c, n); +} + +int strcmp(const char *s1, const char *s2) { + return ets_strcmp(s1, s2); +} + +char* strcpy(char *dest, const char *src) { + return ets_strcpy(dest, src); +} + +size_t strlen(const char *s) { + return ets_strlen(s); +} + +int strncmp(const char *s1, const char *s2, size_t len) { + return ets_strncmp(s1, s2, len); +} + +char *strncpy(char *dest, const char *src, size_t n) { + return ets_strncpy(dest, src, n); +} + +char *ets_strstr(const char *haystack, const char *needle) { + return strstr(haystack, needle); +} + diff --git a/libraries/SPI/HSPI.cpp b/libraries/SPI/HSPI.cpp index 755a40c1d..b3c2ee37c 100644 --- a/libraries/SPI/HSPI.cpp +++ b/libraries/SPI/HSPI.cpp @@ -11,13 +11,6 @@ void HSPI::begin() PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_HSPIQ_MISO); // gpio12 PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_HSPID_MOSI); // gpio13 PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_HSPI_CLK); // gpio14 - PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_HSPI_CS0); // gpio15 - - uint32_t regvalue = SPI_FLASH_DOUT; - regvalue |= SPI_DOUTDIN | SPI_CK_I_EDGE; - regvalue &= ~(BIT2 | SPI_FLASH_USR_ADDR | SPI_FLASH_USR_DUMMY | SPI_FLASH_USR_DIN | SPI_USR_COMMAND); - - SET_PERI_REG_MASK(SPI_FLASH_USER(hspi_port), regvalue); // SPI clock=CPU clock/8 WRITE_PERI_REG(SPI_FLASH_CLOCK(hspi_port), @@ -26,6 +19,12 @@ void HSPI::begin() ((1&SPI_CLKCNT_H)<