1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-06-06 05:21:22 +03:00

Merge pull request #1 from esp8266/esp8266

pull master
This commit is contained in:
Me No Dev 2015-07-16 21:40:22 +03:00
commit 1031e26cf0
18 changed files with 113 additions and 64 deletions

View File

@ -213,10 +213,12 @@ Libraries that don't rely on low-level access to AVR registers should work well.
- [Blynk](https://github.com/blynkkk/blynk-library) - easy IoT framework for Makers (check out the [Kickstarter page](http://tiny.cc/blynk-kick)). - [Blynk](https://github.com/blynkkk/blynk-library) - easy IoT framework for Makers (check out the [Kickstarter page](http://tiny.cc/blynk-kick)).
- [DallasTemperature](https://github.com/milesburton/Arduino-Temperature-Control-Library.git) - [DallasTemperature](https://github.com/milesburton/Arduino-Temperature-Control-Library.git)
- [DHT11](https://github.com/adafruit/DHT-sensor-library) - Download latest v1.1.0 library and no changes are necessary. Older versions should initialize DHT as follows: ```DHT dht(DHTPIN, DHTTYPE, 15);``` - [DHT11](https://github.com/adafruit/DHT-sensor-library) - Download latest v1.1.0 library and no changes are necessary. Older versions should initialize DHT as follows: ```DHT dht(DHTPIN, DHTTYPE, 15);```
- [NeoPixelBus](https://github.com/Makuna/NeoPixelBus) - Arduino NeoPixel library compatible with esp8266. - [NeoPixel](https://github.com/adafruit/Adafruit_NeoPixel) - Adafruit's NeoPixel library, now with support for the ESP8266 (use version 1.0.2 or higher from Arduino's library manager).
- [NeoPixelBus](https://github.com/Makuna/NeoPixelBus) - Arduino NeoPixel library compatible with esp8266. Use the "NeoPixelAnimator" branch for esp8266 to get HSL color support and more.
- [PubSubClient](https://github.com/Imroy/pubsubclient) MQTT library by @Imroy. - [PubSubClient](https://github.com/Imroy/pubsubclient) MQTT library by @Imroy.
- [RTC](https://github.com/Makuna/Rtc) - Arduino Library for Ds1307 & Ds3231 compatible with esp8266. - [RTC](https://github.com/Makuna/Rtc) - Arduino Library for Ds1307 & Ds3231 compatible with esp8266.
- [Souliss, Smart Home](https://github.com/souliss/souliss) - Framework for Smart Home based on Arduino, Android and openHAB. - [Souliss, Smart Home](https://github.com/souliss/souliss) - Framework for Smart Home based on Arduino, Android and openHAB.
- [ST7735](https://github.com/nzmichaelh/Adafruit-ST7735-Library) - Adafruit's ST7735 library modified to be compatible with esp8266. Just make sure to modify the pins in the examples as they are still AVR specific.
#### Upload via serial port #### #### Upload via serial port ####
Pick the correct serial port. Pick the correct serial port.

View File

@ -39,6 +39,7 @@ extern "C" {
#include "twi.h" #include "twi.h"
void yield(void); void yield(void);
void optimistic_yield(void);
#define HIGH 0x1 #define HIGH 0x1
#define LOW 0x0 #define LOW 0x0

View File

@ -552,13 +552,17 @@ bool HardwareSerial::isRxEnabled(void) {
} }
int HardwareSerial::available(void) { int HardwareSerial::available(void) {
if(_uart == 0) int result = 0;
return 0;
if(_uart->rxEnabled) { if (_uart != NULL && _uart->rxEnabled) {
return static_cast<int>(_rx_buffer->getSize()); result = static_cast<int>(_rx_buffer->getSize());
} else {
return 0;
} }
if (!result) {
optimistic_yield();
}
return result;
} }
int HardwareSerial::peek(void) { int HardwareSerial::peek(void) {

View File

@ -34,6 +34,8 @@ extern "C" {
#define LOOP_TASK_PRIORITY 0 #define LOOP_TASK_PRIORITY 0
#define LOOP_QUEUE_SIZE 1 #define LOOP_QUEUE_SIZE 1
#define OPTIMISTIC_YIELD_TIME_US 16000
struct rst_info resetInfo; struct rst_info resetInfo;
int atexit(void (*func)()) { int atexit(void (*func)()) {
@ -62,11 +64,8 @@ extern void (*__init_array_end)(void);
cont_t g_cont __attribute__ ((aligned (16))); cont_t g_cont __attribute__ ((aligned (16)));
static os_event_t g_loop_queue[LOOP_QUEUE_SIZE]; static os_event_t g_loop_queue[LOOP_QUEUE_SIZE];
static uint32_t g_micros_at_task_start; static uint32_t g_micros_at_last_task_yield;
extern "C" uint32_t esp_micros_at_task_start() {
return g_micros_at_task_start;
}
extern "C" void abort() { extern "C" void abort() {
while(1) { while(1) {
@ -74,6 +73,7 @@ extern "C" void abort() {
} }
extern "C" void esp_yield() { extern "C" void esp_yield() {
g_micros_at_last_task_yield = system_get_time();
cont_yield(&g_cont); cont_yield(&g_cont);
} }
@ -87,6 +87,14 @@ extern "C" void __yield() {
} }
extern "C" void yield(void) __attribute__ ((weak, alias("__yield"))); extern "C" void yield(void) __attribute__ ((weak, alias("__yield")));
extern "C" void optimistic_yield(void) {
if (!ETS_INTR_WITHINISR() &&
(system_get_time() - g_micros_at_last_task_yield) > OPTIMISTIC_YIELD_TIME_US)
{
__yield();
}
}
static void loop_wrapper() { static void loop_wrapper() {
static bool setup_done = false; static bool setup_done = false;
if(!setup_done) { if(!setup_done) {
@ -99,7 +107,7 @@ static void loop_wrapper() {
} }
static void loop_task(os_event_t *events) { static void loop_task(os_event_t *events) {
g_micros_at_task_start = system_get_time(); g_micros_at_last_task_yield = system_get_time();
cont_run(&g_cont, &loop_wrapper); cont_run(&g_cont, &loop_wrapper);
if(cont_check(&g_cont) != 0) { if(cont_check(&g_cont) != 0) {
ets_printf("\r\nheap collided with sketch stack\r\n"); ets_printf("\r\nheap collided with sketch stack\r\n");

View File

@ -149,49 +149,58 @@ char* ultoa(unsigned long value, char* result, int base) {
char * dtostrf(double number, signed char width, unsigned char prec, char *s) { char * dtostrf(double number, signed char width, unsigned char prec, char *s) {
if(isnan(number)) { if (isnan(number)) {
strcpy(s, "nan"); strcpy(s, "nan");
return s; return s;
} }
if(isinf(number)) { if (isinf(number)) {
strcpy(s, "inf"); strcpy(s, "inf");
return s; return s;
} }
if(number > 4294967040.0 || number < -4294967040.0) { if (number > 4294967040.0 || number < -4294967040.0) {
strcpy(s, "ovf"); strcpy(s, "ovf");
return s; return s;
} }
char* out = s; char* out = s;
int signInt_Part = 1;
// Handle negative numbers // Handle negative numbers
if(number < 0.0) { if (number < 0.0) {
*out = '-'; signInt_Part = -1;
++out;
number = -number; number = -number;
} }
// calc left over digits
if (prec > 0)
{
width -= (prec + 1);
}
// Round correctly so that print(1.999, 2) prints as "2.00" // Round correctly so that print(1.999, 2) prints as "2.00"
double rounding = 0.5; double rounding = 0.5;
for(uint8_t i = 0; i < prec; ++i) for (uint8_t i = 0; i < prec; ++i)
rounding /= 10.0; rounding /= 10.0;
number += rounding; number += rounding;
// Extract the integer part of the number and print it // Extract the integer part of the number and print it
unsigned long int_part = (unsigned long) number; unsigned long int_part = (unsigned long)number;
double remainder = number - (double) int_part; double remainder = number - (double)int_part;
out += sprintf(out, "%ld", int_part); out += sprintf(out, "%*ld", width, int_part * signInt_Part);
// Print the decimal point, but only if there are digits beyond // Print the decimal point, but only if there are digits beyond
if(prec > 0) { if (prec > 0) {
*out = '.'; *out = '.';
++out; ++out;
}
for (unsigned char decShift = prec; decShift > 0; decShift--) {
remainder *= 10.0; for (unsigned char decShift = prec; decShift > 0; decShift--) {
remainder *= 10.0;
}
sprintf(out, "%0*d", prec, (int)remainder);
} }
sprintf(out, "%0*d", prec, (int)remainder);
return s; return s;
} }

View File

@ -1,9 +1,9 @@
/* /*
si2c.c - Software I2C library for esp8266 si2c.c - Software I2C library for esp8266
Copyright (c) 2015 Hristo Gochkov. All rights reserved. Copyright (c) 2015 Hristo Gochkov. All rights reserved.
This file is part of the esp8266 core for Arduino environment. This file is part of the esp8266 core for Arduino environment.
This library is free software; you can redistribute it and/or This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either License as published by the Free Software Foundation; either
@ -26,10 +26,10 @@ unsigned char twi_dcount = 18;
static unsigned char twi_sda, twi_scl; static unsigned char twi_sda, twi_scl;
#define SDA_LOW() (GPES = (1 << twi_sda)) //Enable SDA (becomes output and since GPO is 0 for the pin, it will pull the line low) #define SDA_LOW() (GPES = (1 << twi_sda)) //Enable SDA (becomes output and since GPO is 0 for the pin, it will pull the line low)
#define SDA_HIGH() (GPEC = (1 << twi_sda)) //Disable SDA (becomes input and since it has pullup it will go high) #define SDA_HIGH() (GPEC = (1 << twi_sda)) //Disable SDA (becomes input and since it has pullup it will go high)
#define SDA_READ() ((GPI & (1 << twi_sda)) != 0) #define SDA_READ() ((GPI & (1 << twi_sda)) != 0)
#define SCL_LOW() (GPES = (1 << twi_scl)) #define SCL_LOW() (GPES = (1 << twi_scl))
#define SCL_HIGH() (GPEC = (1 << twi_scl)) #define SCL_HIGH() (GPEC = (1 << twi_scl))
#define SCL_READ() ((GPI & (1 << twi_scl)) != 0) #define SCL_READ() ((GPI & (1 << twi_scl)) != 0)
#ifndef FCPU80 #ifndef FCPU80
@ -37,9 +37,9 @@ static unsigned char twi_sda, twi_scl;
#endif #endif
#if F_CPU == FCPU80 #if F_CPU == FCPU80
#define TWI_CLOCK_STRETCH 200 #define TWI_CLOCK_STRETCH 800
#else #else
#define TWI_CLOCK_STRETCH 400 #define TWI_CLOCK_STRETCH 1600
#endif #endif
void twi_setClock(unsigned int freq){ void twi_setClock(unsigned int freq){
@ -99,7 +99,7 @@ static bool twi_write_stop(void){
twi_delay(twi_dcount); twi_delay(twi_dcount);
SDA_HIGH(); SDA_HIGH();
twi_delay(twi_dcount); twi_delay(twi_dcount);
return true; return true;
} }
@ -166,7 +166,8 @@ unsigned char twi_readFrom(unsigned char address, unsigned char* buf, unsigned i
unsigned int i; unsigned int i;
if(!twi_write_start()) return 4;//line busy if(!twi_write_start()) return 4;//line busy
if(!twi_write_byte(((address << 1) | 1) & 0xFF)) return 2;//received NACK on transmit of address if(!twi_write_byte(((address << 1) | 1) & 0xFF)) return 2;//received NACK on transmit of address
for(i=0; i<len; i++) buf[i] = twi_read_byte(false); for(i=0; i<(len-1); i++) buf[i] = twi_read_byte(false);
buf[len-1] = twi_read_byte(true);
if(sendStop) twi_write_stop(); if(sendStop) twi_write_stop();
i = 0; i = 0;
while(SDA_READ() == 0 && (i++) < 10){ while(SDA_READ() == 0 && (i++) < 10){

View File

@ -77,7 +77,6 @@ extern void __pinMode(uint8_t pin, uint8_t mode) {
} }
extern void ICACHE_RAM_ATTR __digitalWrite(uint8_t pin, uint8_t val) { extern void ICACHE_RAM_ATTR __digitalWrite(uint8_t pin, uint8_t val) {
val &= 0x01;
if(pin < 16){ if(pin < 16){
if(val) GPOS = (1 << pin); if(val) GPOS = (1 << pin);
else GPOC = (1 << pin); else GPOC = (1 << pin);

View File

@ -135,6 +135,17 @@ int printf_P(const char* formatP, ...) {
return ret; return ret;
} }
int sprintf_P(char* str, const char* formatP, ...) {
int ret;
va_list arglist;
va_start(arglist, formatP);
ret = vsnprintf_P(str, SIZE_IRRELEVANT, formatP, arglist);
va_end(arglist);
return ret;
}
int snprintf_P(char* str, size_t strSize, const char* formatP, ...) { int snprintf_P(char* str, size_t strSize, const char* formatP, ...) {
int ret; int ret;
va_list arglist; va_list arglist;

View File

@ -50,7 +50,8 @@ size_t strnlen_P(const char *s, size_t size);
#define strlen_P(strP) strnlen_P((strP), SIZE_IRRELEVANT) #define strlen_P(strP) strnlen_P((strP), SIZE_IRRELEVANT)
int printf_P(const char *formatP, ...) __attribute__ ((format (printf, 1, 2))); int printf_P(const char *formatP, ...) __attribute__ ((format (printf, 1, 2)));
int snprintf_P(char *str, size_t strSize, const char *formatP, ...) __attribute__ ((format (printf, 3, 4))); int sprintf_P(char *str, const char *formatP, ...) __attribute__((format(printf, 2, 3)));
int snprintf_P(char *str, size_t strSize, const char *formatP, ...) __attribute__((format(printf, 3, 4)));
int vsnprintf_P(char *str, size_t strSize, const char *formatP, va_list ap) __attribute__ ((format (printf, 3, 0))); int vsnprintf_P(char *str, size_t strSize, const char *formatP, va_list ap) __attribute__ ((format (printf, 3, 0)));
// flash memory must be read using 32 bit aligned addresses else a processor // flash memory must be read using 32 bit aligned addresses else a processor

View File

@ -25,7 +25,7 @@
const char* ssid = "**********"; const char* ssid = "**********";
const char* password = "**********"; const char* password = "**********";
WiFiServer server(21); WiFiServer server(23);
WiFiClient serverClients[MAX_SRV_CLIENTS]; WiFiClient serverClients[MAX_SRV_CLIENTS];
void setup() { void setup() {
@ -45,7 +45,7 @@ void setup() {
Serial1.print("Ready! Use 'telnet "); Serial1.print("Ready! Use 'telnet ");
Serial1.print(WiFi.localIP()); Serial1.print(WiFi.localIP());
Serial1.println(" 21' to connect"); Serial1.println(" 23' to connect");
} }
void loop() { void loop() {

View File

@ -177,20 +177,17 @@ size_t WiFiClient::write(const uint8_t *buf, size_t size)
return _client->write(reinterpret_cast<const char*>(buf), size); return _client->write(reinterpret_cast<const char*>(buf), size);
} }
extern "C" uint32_t esp_micros_at_task_start();
int WiFiClient::available() int WiFiClient::available()
{ {
static uint32_t lastPollTime = 0; int result = 0;
if (!_client)
return 0;
if (lastPollTime > esp_micros_at_task_start()) if (_client) {
yield(); result = _client->getSize();
}
lastPollTime = micros(); if (!result) {
optimistic_yield();
int result = _client->getSize(); }
return result; return result;
} }

View File

@ -84,8 +84,6 @@ bool WiFiServer::getNoDelay(){
return tcp_nagle_disabled(_pcb); return tcp_nagle_disabled(_pcb);
} }
extern "C" uint32_t esp_micros_at_task_start();
bool WiFiServer::hasClient(){ bool WiFiServer::hasClient(){
if (_unclaimed) return true; if (_unclaimed) return true;
return false; return false;
@ -93,8 +91,6 @@ bool WiFiServer::hasClient(){
WiFiClient WiFiServer::available(byte* status) WiFiClient WiFiServer::available(byte* status)
{ {
static uint32_t lastPollTime = 0;
if (_unclaimed) if (_unclaimed)
{ {
WiFiClient result(_unclaimed); WiFiClient result(_unclaimed);
@ -103,9 +99,7 @@ WiFiClient WiFiServer::available(byte* status)
return result; return result;
} }
if (lastPollTime > esp_micros_at_task_start()) optimistic_yield();
yield();
lastPollTime = micros();
return WiFiClient(); return WiFiClient();
} }

View File

@ -116,9 +116,17 @@ uint8_t WiFiUDP::beginMulticast(IPAddress interfaceAddr, IPAddress multicast, ui
/* return number of bytes available in the current packet, /* return number of bytes available in the current packet,
will return zero if parsePacket hasn't been called yet */ will return zero if parsePacket hasn't been called yet */
int WiFiUDP::available() { int WiFiUDP::available() {
if (!_ctx) int result = 0;
return 0;
return static_cast<int>(_ctx->getSize()); if (_ctx) {
result = static_cast<int>(_ctx->getSize());
}
if (!result) {
optimistic_yield();
}
return result;
} }
/* Release any resources being used by this WiFiUDP instance */ /* Release any resources being used by this WiFiUDP instance */

View File

@ -1,8 +1,8 @@
name=ESP8266httpUpdate name=ESP8266httpUpdate
version=1.0 version=1.0
author=Markus Sattler author=Markus Sattler
maintainer=Markus Sattler maintainer=Markus Sattler
sentence=Http Update for ESP8266 sentence=Http Update for ESP8266
paragraph= paragraph=
url=https://github.com/Links2004/Arduino/tree/esp8266/hardware/esp8266com/esp8266/libraries/ESP8266httpUpdate url=https://github.com/Links2004/Arduino/tree/esp8266/hardware/esp8266com/esp8266/libraries/ESP8266httpUpdate
architectures=ESP8266 architectures=esp8266

View File

@ -23,7 +23,7 @@
* *
*/ */
#include "ESP8266HTTPUpdate.h" #include "ESP8266httpUpdate.h"
ESP8266HTTPUpdate::ESP8266HTTPUpdate(void) { ESP8266HTTPUpdate::ESP8266HTTPUpdate(void) {

View File

@ -161,7 +161,13 @@ size_t TwoWire::write(const uint8_t *data, size_t quantity){
} }
int TwoWire::available(void){ int TwoWire::available(void){
return rxBufferLength - rxBufferIndex; int result = rxBufferLength - rxBufferIndex;
if (!result) {
optimistic_yield();
}
return result;
} }
int TwoWire::read(void){ int TwoWire::read(void){

View File

@ -61,6 +61,14 @@ typedef void (*int_handler_t)(void*);
#define ETS_INTR_DISABLE(inum) \ #define ETS_INTR_DISABLE(inum) \
ets_isr_mask((1<<inum)) ets_isr_mask((1<<inum))
inline bool ETS_INTR_WITHINISR()
{
uint32_t ps;
__asm__ __volatile__("rsr %0,ps":"=a" (ps));
// PS.EXCM and PS.UM bit checks
return ((ps & ((1 << 4) | (1 << 5))) > 0);
}
inline uint32_t ETS_INTR_ENABLED(void) inline uint32_t ETS_INTR_ENABLED(void)
{ {
uint32_t enabled; uint32_t enabled;