From 7ea54956cdef8b5729543b56cf654ccf3fead30a Mon Sep 17 00:00:00 2001 From: M5Stack Date: Thu, 10 Aug 2017 11:56:43 +0800 Subject: [PATCH] update --- M5Stack.cpp | 30 +- examples/Advanced/AppStore/AppStore.ino | 163 --- examples/Advanced/AppStore/clock.cpp | 232 ---- examples/Advanced/AppStore/clock.h | 11 - examples/Advanced/Camera/Adafruit_ILI9341.cpp | 669 ---------- examples/Advanced/Camera/Adafruit_ILI9341.h | 214 ---- examples/Advanced/Camera/Camera.ino | 337 ----- examples/Advanced/Camera/JPEG_functions.ino | 185 --- examples/Advanced/Camera/integer.h | 37 - examples/Advanced/Camera/tjpgd.c | 951 -------------- examples/Advanced/Camera/tjpgd.h | 70 -- examples/Advanced/Changer/Changer.ino | 61 - examples/Advanced/ParamConfig/ParamConfig.ino | 81 -- .../Advanced/ParamConfig/azure-config.json | 6 - .../Advanced/TFCardPicture/TFCardPicture.ino | 18 - examples/Advanced/WavPlayer/WavPlayer.ino | 135 -- .../Advanced/httpUpdate/ESP8266HTTPClient.cpp | 1119 ----------------- .../Advanced/httpUpdate/ESP8266HTTPClient.h | 228 ---- .../Advanced/httpUpdate/ESP8266httpUpdate.cpp | 391 ------ .../Advanced/httpUpdate/ESP8266httpUpdate.h | 116 -- examples/Advanced/httpUpdate/Update.h | 161 --- examples/Advanced/httpUpdate/Updater.cpp | 279 ---- examples/Advanced/httpUpdate/httpUpdate.ino | 80 -- .../httpUpdate/httpUpdate.ino.esp32.bin | Bin 542320 -> 0 bytes .../matrix-serial-draw/matrix-serial-draw.ino | 305 ----- .../matrix-serial-draw/matrix_rgb.cpp | 109 -- .../Advanced/matrix-serial-draw/matrix_rgb.h | 135 -- examples/Basics/FactoryTest/FactoryTest.ino | 32 +- examples/Basics/Speaker/Speaker.ino | 2 +- examples/Basics/bitmap/bitmap.ino | 316 ----- keywords.txt | 3 + utility/Display.h | 3 - utility/Speaker.cpp | 2 - 33 files changed, 17 insertions(+), 6464 deletions(-) delete mode 100644 examples/Advanced/AppStore/AppStore.ino delete mode 100644 examples/Advanced/AppStore/clock.cpp delete mode 100644 examples/Advanced/AppStore/clock.h delete mode 100644 examples/Advanced/Camera/Adafruit_ILI9341.cpp delete mode 100644 examples/Advanced/Camera/Adafruit_ILI9341.h delete mode 100644 examples/Advanced/Camera/Camera.ino delete mode 100644 examples/Advanced/Camera/JPEG_functions.ino delete mode 100644 examples/Advanced/Camera/integer.h delete mode 100644 examples/Advanced/Camera/tjpgd.c delete mode 100644 examples/Advanced/Camera/tjpgd.h delete mode 100644 examples/Advanced/Changer/Changer.ino delete mode 100644 examples/Advanced/ParamConfig/ParamConfig.ino delete mode 100644 examples/Advanced/ParamConfig/azure-config.json delete mode 100644 examples/Advanced/TFCardPicture/TFCardPicture.ino delete mode 100644 examples/Advanced/WavPlayer/WavPlayer.ino delete mode 100644 examples/Advanced/httpUpdate/ESP8266HTTPClient.cpp delete mode 100644 examples/Advanced/httpUpdate/ESP8266HTTPClient.h delete mode 100644 examples/Advanced/httpUpdate/ESP8266httpUpdate.cpp delete mode 100644 examples/Advanced/httpUpdate/ESP8266httpUpdate.h delete mode 100644 examples/Advanced/httpUpdate/Update.h delete mode 100644 examples/Advanced/httpUpdate/Updater.cpp delete mode 100644 examples/Advanced/httpUpdate/httpUpdate.ino delete mode 100644 examples/Advanced/httpUpdate/httpUpdate.ino.esp32.bin delete mode 100644 examples/Advanced/matrix-serial-draw/matrix-serial-draw.ino delete mode 100644 examples/Advanced/matrix-serial-draw/matrix_rgb.cpp delete mode 100644 examples/Advanced/matrix-serial-draw/matrix_rgb.h delete mode 100644 examples/Basics/bitmap/bitmap.ino diff --git a/M5Stack.cpp b/M5Stack.cpp index b6d62c2..bb768eb 100644 --- a/M5Stack.cpp +++ b/M5Stack.cpp @@ -44,38 +44,32 @@ void M5Stack::update() { void M5Stack::startupLogo() { static uint8_t brightness, pre_brightness; uint32_t length = strlen((char*)m5stack_startup_music); - uint8_t _volume = 2; - uint16_t delay_interval = ((uint32_t)1000000/20000); Lcd.setBrightness(0); Lcd.drawBitmap(0, 0, 320, 240, (uint16_t *)gImage_logoM5); - if(_volume != 0) { - for(int i=0; i>2); - delayMicroseconds(40); - brightness = (i/157); - if(pre_brightness != brightness) { - pre_brightness = brightness; - Lcd.setBrightness(brightness); - } + for(int i=0; i>2); + delayMicroseconds(40); + brightness = (i/157); + if(pre_brightness != brightness) { + pre_brightness = brightness; + Lcd.setBrightness(brightness); } } - for(int i=32; i>0; i--) { - dacWrite(SPEAKER_PIN, i); - delay(2); - } - for(int i=255; i>=0; i--) { lcd.setBrightness(i); + if(i<=32) { + dacWrite(SPEAKER_PIN, i); + } delay(2); } + Lcd.fillScreen(BLACK); - delay(1000); + delay(800); for(int i=0; i>=100; i++) { Lcd.setBrightness(i); delay(2); } - Lcd.setBrightness(100); } M5Stack m5; diff --git a/examples/Advanced/AppStore/AppStore.ino b/examples/Advanced/AppStore/AppStore.ino deleted file mode 100644 index 9ed22f1..0000000 --- a/examples/Advanced/AppStore/AppStore.ino +++ /dev/null @@ -1,163 +0,0 @@ -#include -#include "clock.h" -#include "DHT.h" - -#define DHTPIN 22 // what digital pin we're connected to -#define DHTTYPE DHT11 // DHT 11 -DHT dht(DHTPIN, DHTTYPE); -uint8_t select_app_id; - -void setup() -{ - m5.begin(); - select_app_id = m5.bootSetup(); - - m5.lcd.fillScreen(WHITE); - m5.lcd.drawPicture(47, 38, 120, 96, gImage_logo); - - switch (select_app_id) { - case 0: - wifi_scan_setup(); - break; - - case 1: - DHT11_setup(); - break; - - case 2: - clock_setup(); - break; - } -} - -void loop() -{ - switch (select_app_id) { - case 0: - wifi_scan_loop(); - break; - - case 1: - DHT11_loop(); - break; - - case 2: - clock_loop(); - break; - } - - m5.loop(); -} - -//------------------------- -void DHT11_setup() -{ - dht.begin(); - m5.lcd.fillScreen(WHITE); - m5.lcd.drawTitle("Environment", 0x09F1); - #define X_OFFSET 40 - #define Y_POS 165 -} - -void DHT11_loop() -{ - static uint32_t sampling_tick; - static float pre_hif, pre_hic; - static bool f2c_flag=0; - - if(millis() > sampling_tick) { - sampling_tick = millis() + 1000; - // Reading temperature or humidity takes about 250 milliseconds! - // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) - float h = dht.readHumidity(); - // Read temperature as Celsius (the default) - float t = dht.readTemperature(); - // Read temperature as Fahrenheit (isFahrenheit = true) - float f = dht.readTemperature(true); - - // Check if any reads failed and exit early (to try again). - if (isnan(h) || isnan(t) || isnan(f)) { - Serial.println("Failed to read from DHT sensor!"); - return; - } - - // Compute heat index in Fahrenheit (the default) - float hif = dht.computeHeatIndex(f, h); - // Compute heat index in Celsius (isFahreheit = false) - float hic = dht.computeHeatIndex(t, h, false); - - Serial.print("Humidity: "); - Serial.print(h); - Serial.print(" %\t"); - Serial.print("Temperature: "); - Serial.print(t); - Serial.print(" *C "); - Serial.print(f); - Serial.print(" *F\t"); - Serial.print("Heat index: "); - Serial.print(hic); - Serial.print(" *C "); - Serial.print(hif); - Serial.println(" *F"); - - if((pre_hif!=hif) || (pre_hic!=hic)) { - pre_hif = hif; - pre_hic = hic; - - m5.lcd.setFont(&FreeMonoBoldOblique12pt7b); - // m5.lcd.setFont(&FreeMonoBoldOblique18pt7b); - m5.lcd.fillRect(19, 70, 190, 30, WHITE); - m5.lcd.setTextColor(GRAY); - m5.lcd.setTextSize(1); - m5.lcd.setCursor(25, 90); - if(f2c_flag) { - m5.lcd.printf("%2.1fF %2.1f%%", hif, h); - } else { - m5.lcd.printf("%2.1fC %2.1f%%", hic, h); - } - } - } - if(m5.pressed(BUTTON_B)) { - f2c_flag = !f2c_flag; - sampling_tick = 0; - pre_hif=0; - } -} - -void wifi_scan_setup() -{ - m5.lcd.setFont(); -} - -void wifi_scan_loop() -{ - m5.lcd.setCursor(0, 0); - // m5.lcd.println("scan start"); - // WiFi.scanNetworks will return the number of networks found - int n = WiFi.scanNetworks(); - m5.lcd.fillScreen(BLACK); - m5.lcd.println("wifi scan done"); - if (n == 0) - { - m5.lcd.println("no networks found"); - } - else - { - m5.lcd.print(n); - m5.lcd.println(" networks found"); - for (int i = 0; i < n; ++i) - { - // Print SSID and RSSI for each network found - m5.lcd.printf("%2d", i + 1); - m5.lcd.print(": "); - m5.lcd.print(WiFi.SSID(i)); - m5.lcd.print(" ("); - m5.lcd.print(WiFi.RSSI(i)); - m5.lcd.print(")"); - m5.lcd.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*"); - delay(10); - } - } - Serial.println(""); - delay(3000); -} diff --git a/examples/Advanced/AppStore/clock.cpp b/examples/Advanced/AppStore/clock.cpp deleted file mode 100644 index 260c1cb..0000000 --- a/examples/Advanced/AppStore/clock.cpp +++ /dev/null @@ -1,232 +0,0 @@ -/* - WiFi Web Server LED Blink - - A simple web server that lets you blink an LED via the web. - This sketch will print the IP address of your WiFi Shield (once connected) - to the Serial monitor. From there, you can open that address in a web browser - to turn on and off the LED on pin 5. - - If the IP address of your shield is yourAddress: - http://yourAddress/H turns the LED on - http://yourAddress/L turns it off - - This example is written for a network using WPA encryption. For - WEP or WPA, change the Wifi.begin() call accordingly. - - Circuit: - * WiFi shield attached - * LED attached to pin 5 - - created for arduino 25 Nov 2012 - by Tom Igoe - -ported for sparkfun esp32 -31.01.2017 by Jan Hendrik Berlin - - */ -#include "clock.h" - -WiFiUDP ntpUDP; -// NTPClient timeClient(ntpUDP); -NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000); - -TimerObject *timer1 = new TimerObject(1000); -TimerObject *timer_setting_select = new TimerObject(500); -TimerObject *timer_button_draw = new TimerObject(10); - -typedef void (*CallBackType)(); -#define X_POS_OFFSET 15 -#define Y_POS_OFFSET 45 - -// M5Stack_Button button[3]; -void upCursorBlink(); - -class AlarmClock { - -enum week {SUN, MON, TUE, WED, THU, FRI, SAT, EVERYDAY}; - -public: - AlarmClock() { - state = 0; - } - - AlarmClock(uint8_t h, uint8_t m) { - hours = h; - minutes = m; - // seconds = s; - repeat_week_mask = EVERYDAY; - state = 1; - } - - AlarmClock(uint8_t h, uint8_t m, uint8_t repeat_mask) { - AlarmClock(h, m); - repeat_week_mask = repeat_mask; - state = 1; - } - - void setAlarmTime(uint8_t h, uint8_t m) { - hours = h; - minutes = m; - // seconds = s; - } - - void setEnable() { - state = 1; - } - - void setDisable() { - state = 0; - } - - void setOnClock(CallBackType callback) { - on_alarm_clock = callback; - } - - void update(uint64_t epoch_time) { - if(state == 1) { - unsigned long rawTime = epoch_time; - unsigned long local_hours = (rawTime % 86400L) / 3600; - unsigned long local_minutes = (rawTime % 3600) / 60; - // unsigned long local_seconds = rawTime % 60; - - if((local_minutes==minutes)&&(local_hours==hours)) { - if(on_alarm_clock) { - on_alarm_clock(); - } - } - } - } - -// private: - bool state; - int8_t hours; - int8_t minutes; - int8_t seconds; - int8_t repeat_week_mask; - CallBackType on_alarm_clock; -}; - -AlarmClock alarm_clock(6, 30); - -// AlarmClock alarm_clock; //= new AlarmClock(7, 30, 00); -uint8_t alarm_state = 0; -uint8_t setting_state = 0; -#define ACLOCK_RUNING 0 -#define ACLOCK_SETTING 1 - -void upTimeDisplay() -{ - m5.lcd.setTextSize(4); - m5.lcd.setTextColor(BLACK, WHITE); - m5.lcd.setCursor(X_POS_OFFSET, 45); - m5.lcd.print(timeClient.getFormattedTime().c_str()); -} - -void upCursorBlink() -{ - static bool tg = 1; - - m5.lcd.setTextSize(4); - m5.lcd.setCursor(X_POS_OFFSET+35, 95); - - if((setting_state == 1) && (tg)) { - m5.lcd.setTextColor(WHITE, BLACK); - } else { - m5.lcd.setTextColor(BLACK, WHITE); - } - m5.lcd.printf("%2.2d", alarm_clock.hours); - - m5.lcd.setTextColor(BLACK, WHITE); - m5.lcd.printf(":"); - - if((setting_state == 2) && (tg)) { - m5.lcd.setTextColor(WHITE, BLACK); - } else { - m5.lcd.setTextColor(BLACK, WHITE); - } - m5.lcd.printf("%2.2d", alarm_clock.minutes); -} - -void clock_setup() -{ - -//--------------------------------------- - m5.lcd.setFont(); - m5.lcd.fillScreen(WHITE); - m5.lcd.fillRect(0, 0, 220, 22, 0x09F1); - m5.lcd.setCursor(4, 4); - m5.lcd.setTextColor(WHITE); - m5.lcd.setTextSize(2); - m5.lcd.printf("Alarm Clock"); - - #define X_OFFSET 40 - #define Y_POS 165 - - m5.lcd.buttonSet(BTN_A, "+"); - m5.lcd.buttonSet(BTN_B, "-"); - m5.lcd.buttonSet(BTN_C, "+SET"); - -//--------------------------------------------- - - m5.lcd.setTextSize(4); - m5.lcd.setCursor(X_POS_OFFSET, 45); - // m5.lcd.setTextColor(BLACK); - m5.lcd.setTextColor(BLACK, WHITE); - - // m5.lcd.setTextWrap(boolean w); - // m5.lcd.print("hello world!"); - // m5.lcd.print(timeClient.getFormattedTime().c_str()); - - // alarm_state = ACLOCK_SETTING; - // setting_state = 1; - - //--------timeClient------ - // wifi_connect(); - timeClient.begin(); - timeClient.setTimeOffset(28800); - - timer1->setOnTimer(&upTimeDisplay); - timer1->Start(); - timer_setting_select->setOnTimer(upCursorBlink); - upTimeDisplay(); - upCursorBlink(); -} - - -void clock_loop(){ - switch (alarm_state) { - case ACLOCK_RUNING: - if(m5.pressed(BTN_C)) { - setting_state = 1; - alarm_state = ACLOCK_SETTING; - timer_setting_select->Start(); - } - break; - - case ACLOCK_SETTING: - if(m5.pressed(BTN_C)) { - if(++setting_state == 3) { - setting_state = 0; - alarm_state = ACLOCK_RUNING; - // timer_setting_select->Stop(); - } - } - switch (setting_state) { - case 1: - if(m5.pressed(BTN_A)) {if(++alarm_clock.hours == 24) alarm_clock.hours = 0;} - if(m5.pressed(BTN_B)) {if(--alarm_clock.hours == -1) alarm_clock.hours = 23;} - break; - - case 2: - if(m5.pressed(BTN_A)) {if(++alarm_clock.minutes == 60) alarm_clock.minutes = 0;} - if(m5.pressed(BTN_B)) {if(--alarm_clock.minutes == -1) alarm_clock.minutes = 59;} - break; - } - break; - } - - timer1->Update(); - timer_setting_select->Update(); - // timer_button_draw->Update(); - timeClient.update(); -} diff --git a/examples/Advanced/AppStore/clock.h b/examples/Advanced/AppStore/clock.h deleted file mode 100644 index ac6526d..0000000 --- a/examples/Advanced/AppStore/clock.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _CLOCK_H_ -#define _CLOCK_H_ - -#include "M5Stack.h" -#include "NTPClient.h" -#include "TimerObject.h" - -void clock_setup(); -void clock_loop(); - -#endif diff --git a/examples/Advanced/Camera/Adafruit_ILI9341.cpp b/examples/Advanced/Camera/Adafruit_ILI9341.cpp deleted file mode 100644 index 79fd0b1..0000000 --- a/examples/Advanced/Camera/Adafruit_ILI9341.cpp +++ /dev/null @@ -1,669 +0,0 @@ -/*************************************************** - This is our library for the Adafruit ILI9341 Breakout and Shield - ----> http://www.adafruit.com/products/1651 - - Check out the links above for our tutorials and wiring diagrams - These displays use SPI to communicate, 4 or 5 pins are required to - interface (RST is optional) - Adafruit invests time and resources providing this open source code, - please support Adafruit and open-source hardware by purchasing - products from Adafruit! - - Written by Limor Fried/Ladyada for Adafruit Industries. - MIT license, all text above must be included in any redistribution - ****************************************************/ - -#include "Adafruit_ILI9341.h" -#ifndef ARDUINO_STM32_FEATHER - #include "pins_arduino.h" -#ifndef RASPI - #include "wiring_private.h" -#endif -#endif -#include - - -#define MADCTL_MY 0x80 -#define MADCTL_MX 0x40 -#define MADCTL_MV 0x20 -#define MADCTL_ML 0x10 -#define MADCTL_RGB 0x00 -#define MADCTL_BGR 0x08 -#define MADCTL_MH 0x04 - -/* - * Control Pins - * */ - -#ifdef USE_FAST_PINIO -#define SPI_DC_HIGH() *dcport |= dcpinmask -#define SPI_DC_LOW() *dcport &= ~dcpinmask -#define SPI_CS_HIGH() *csport |= cspinmask -#define SPI_CS_LOW() *csport &= ~cspinmask -#else -#define SPI_DC_HIGH() digitalWrite(_dc, HIGH) -#define SPI_DC_LOW() digitalWrite(_dc, LOW) -#define SPI_CS_HIGH() digitalWrite(_cs, HIGH) -#define SPI_CS_LOW() digitalWrite(_cs, LOW) -#endif - -/* - * Software SPI Macros - * */ - -#ifdef USE_FAST_PINIO -#define SSPI_MOSI_HIGH() *mosiport |= mosipinmask -#define SSPI_MOSI_LOW() *mosiport &= ~mosipinmask -#define SSPI_SCK_HIGH() *clkport |= clkpinmask -#define SSPI_SCK_LOW() *clkport &= ~clkpinmask -#define SSPI_MISO_READ() ((*misoport & misopinmask) != 0) -#else -#define SSPI_MOSI_HIGH() digitalWrite(_mosi, HIGH) -#define SSPI_MOSI_LOW() digitalWrite(_mosi, LOW) -#define SSPI_SCK_HIGH() digitalWrite(_sclk, HIGH) -#define SSPI_SCK_LOW() digitalWrite(_sclk, LOW) -#define SSPI_MISO_READ() digitalRead(_miso) -#endif - -#define SSPI_BEGIN_TRANSACTION() -#define SSPI_END_TRANSACTION() -#define SSPI_WRITE(v) spiWrite(v) -#define SSPI_WRITE16(s) SSPI_WRITE((s) >> 8); SSPI_WRITE(s) -#define SSPI_WRITE32(l) SSPI_WRITE((l) >> 24); SSPI_WRITE((l) >> 16); SSPI_WRITE((l) >> 8); SSPI_WRITE(l) -#define SSPI_WRITE_PIXELS(c,l) for(uint32_t i=0; i<(l); i+=2){ SSPI_WRITE(((uint8_t*)(c))[i+1]); SSPI_WRITE(((uint8_t*)(c))[i]); } - -/* - * Hardware SPI Macros - * */ - -#ifndef ESP32 - #define SPI_OBJECT SPI -#else - #define SPI_OBJECT _spi -#endif - -#if defined (__AVR__) || defined(TEENSYDUINO) || defined(ARDUINO_ARCH_STM32F1) - #define HSPI_SET_CLOCK() SPI_OBJECT.setClockDivider(SPI_CLOCK_DIV2); -#elif defined (__arm__) - #define HSPI_SET_CLOCK() SPI_OBJECT.setClockDivider(11); -#elif defined(ESP8266) || defined(ESP32) - #define HSPI_SET_CLOCK() SPI_OBJECT.setFrequency(_freq); -#elif defined(RASPI) - #define HSPI_SET_CLOCK() SPI_OBJECT.setClock(_freq); -#elif defined(ARDUINO_ARCH_STM32F1) - #define HSPI_SET_CLOCK() SPI_OBJECT.setClock(_freq); -#else - #define HSPI_SET_CLOCK() -#endif - -#ifdef SPI_HAS_TRANSACTION - #define HSPI_BEGIN_TRANSACTION() SPI_OBJECT.beginTransaction(SPISettings(_freq, MSBFIRST, SPI_MODE0)) - #define HSPI_END_TRANSACTION() SPI_OBJECT.endTransaction() -#else - #define HSPI_BEGIN_TRANSACTION() HSPI_SET_CLOCK(); SPI_OBJECT.setBitOrder(MSBFIRST); SPI_OBJECT.setDataMode(SPI_MODE0) - #define HSPI_END_TRANSACTION() -#endif - -#ifdef ESP32 - #define SPI_HAS_WRITE_PIXELS -#endif -#if defined(ESP8266) || defined(ESP32) - // Optimized SPI (ESP8266 and ESP32) - #define HSPI_READ() SPI_OBJECT.transfer(0) - #define HSPI_WRITE(b) SPI_OBJECT.write(b) - #define HSPI_WRITE16(s) SPI_OBJECT.write16(s) - #define HSPI_WRITE32(l) SPI_OBJECT.write32(l) - #ifdef SPI_HAS_WRITE_PIXELS - #define SPI_MAX_PIXELS_AT_ONCE 32 - #define HSPI_WRITE_PIXELS(c,l) SPI_OBJECT.writePixels(c,l) - #else - #define HSPI_WRITE_PIXELS(c,l) for(uint32_t i=0; i<((l)/2); i++){ SPI_WRITE16(((uint16_t*)(c))[i]); } - #endif -#else - // Standard Byte-by-Byte SPI - - #if defined (__AVR__) || defined(TEENSYDUINO) -static inline uint8_t _avr_spi_read(void) __attribute__((always_inline)); -static inline uint8_t _avr_spi_read(void) { - uint8_t r = 0; - SPDR = r; - while(!(SPSR & _BV(SPIF))); - r = SPDR; - return r; -} - #define HSPI_WRITE(b) {SPDR = (b); while(!(SPSR & _BV(SPIF)));} - #define HSPI_READ() _avr_spi_read() - #else - #define HSPI_WRITE(b) SPI_OBJECT.transfer((uint8_t)(b)) - #define HSPI_READ() HSPI_WRITE(0) - #endif - #define HSPI_WRITE16(s) HSPI_WRITE((s) >> 8); HSPI_WRITE(s) - #define HSPI_WRITE32(l) HSPI_WRITE((l) >> 24); HSPI_WRITE((l) >> 16); HSPI_WRITE((l) >> 8); HSPI_WRITE(l) - #define HSPI_WRITE_PIXELS(c,l) for(uint32_t i=0; i<(l); i+=2){ HSPI_WRITE(((uint8_t*)(c))[i+1]); HSPI_WRITE(((uint8_t*)(c))[i]); } -#endif - -/* - * Final SPI Macros - * */ -#if defined (ARDUINO_ARCH_ARC32) -#define SPI_DEFAULT_FREQ 16000000 -#elif defined (__AVR__) || defined(TEENSYDUINO) -#define SPI_DEFAULT_FREQ 8000000 -#elif defined(ESP8266) || defined(ESP32) -#define SPI_DEFAULT_FREQ 78000000 -#elif defined(RASPI) -#define SPI_DEFAULT_FREQ 80000000 -#elif defined(ARDUINO_ARCH_STM32F1) -#define SPI_DEFAULT_FREQ 36000000 -#else -#define SPI_DEFAULT_FREQ 24000000 -#endif - -#define SPI_BEGIN() if(_sclk < 0){SPI_OBJECT.begin();} -#define SPI_BEGIN_TRANSACTION() if(_sclk < 0){HSPI_BEGIN_TRANSACTION();} -#define SPI_END_TRANSACTION() if(_sclk < 0){HSPI_END_TRANSACTION();} -#define SPI_WRITE16(s) if(_sclk < 0){HSPI_WRITE16(s);}else{SSPI_WRITE16(s);} -#define SPI_WRITE32(l) if(_sclk < 0){HSPI_WRITE32(l);}else{SSPI_WRITE32(l);} -#define SPI_WRITE_PIXELS(c,l) if(_sclk < 0){HSPI_WRITE_PIXELS(c,l);}else{SSPI_WRITE_PIXELS(c,l);} - -// Pass 8-bit (each) R,G,B, get back 16-bit packed color -uint16_t Adafruit_ILI9341::color565(uint8_t r, uint8_t g, uint8_t b) { - return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | ((b & 0xF8) >> 3); -} - -Adafruit_ILI9341::Adafruit_ILI9341(int8_t cs, int8_t dc, int8_t mosi, - int8_t sclk, int8_t rst, int8_t miso) : Adafruit_GFX(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT) { - _cs = cs; - _dc = dc; - _rst = rst; - _sclk = sclk; - _mosi = mosi; - _miso = miso; - _freq = 0; -#ifdef USE_FAST_PINIO - csport = portOutputRegister(digitalPinToPort(_cs)); - cspinmask = digitalPinToBitMask(_cs); - dcport = portOutputRegister(digitalPinToPort(_dc)); - dcpinmask = digitalPinToBitMask(_dc); - clkport = portOutputRegister(digitalPinToPort(_sclk)); - clkpinmask = digitalPinToBitMask(_sclk); - mosiport = portOutputRegister(digitalPinToPort(_mosi)); - mosipinmask = digitalPinToBitMask(_mosi); - if(miso >= 0){ - misoport = portInputRegister(digitalPinToPort(_miso)); - misopinmask = digitalPinToBitMask(_miso); - } else { - misoport = 0; - misopinmask = 0; - } -#endif -} - -Adafruit_ILI9341::Adafruit_ILI9341(int8_t cs, int8_t dc, int8_t rst) : Adafruit_GFX(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT) { - _cs = cs; - _dc = dc; - _rst = rst; - _sclk = -1; - _mosi = -1; - _miso = -1; - _freq = 0; -#ifdef USE_FAST_PINIO - csport = portOutputRegister(digitalPinToPort(_cs)); - cspinmask = digitalPinToBitMask(_cs); - dcport = portOutputRegister(digitalPinToPort(_dc)); - dcpinmask = digitalPinToBitMask(_dc); - clkport = 0; - clkpinmask = 0; - mosiport = 0; - mosipinmask = 0; - misoport = 0; - misopinmask = 0; -#endif -} - - -#ifdef ESP32 -void Adafruit_ILI9341::begin(uint32_t freq, SPIClass &spi) -#else -void Adafruit_ILI9341::begin(uint32_t freq) -#endif -{ -#ifdef ESP32 - _spi = spi; -#endif - if(!freq){ - freq = SPI_DEFAULT_FREQ; - } - _freq = freq; - - // Control Pins - pinMode(_dc, OUTPUT); - digitalWrite(_dc, LOW); - pinMode(_cs, OUTPUT); - digitalWrite(_cs, HIGH); - - // Software SPI - if(_sclk >= 0){ - pinMode(_mosi, OUTPUT); - digitalWrite(_mosi, LOW); - pinMode(_sclk, OUTPUT); - digitalWrite(_sclk, HIGH); - if(_miso >= 0){ - pinMode(_miso, INPUT); - } - } - - // Hardware SPI - SPI_BEGIN(); - - // toggle RST low to reset - if (_rst >= 0) { - pinMode(_rst, OUTPUT); - digitalWrite(_rst, HIGH); - delay(100); - digitalWrite(_rst, LOW); - delay(100); - digitalWrite(_rst, HIGH); - delay(200); - } - - startWrite(); - - writeCommand(0xEF); - spiWrite(0x03); - spiWrite(0x80); - spiWrite(0x02); - - writeCommand(0xCF); - spiWrite(0x00); - spiWrite(0XC1); - spiWrite(0X30); - - writeCommand(0xED); - spiWrite(0x64); - spiWrite(0x03); - spiWrite(0X12); - spiWrite(0X81); - - writeCommand(0xE8); - spiWrite(0x85); - spiWrite(0x00); - spiWrite(0x78); - - writeCommand(0xCB); - spiWrite(0x39); - spiWrite(0x2C); - spiWrite(0x00); - spiWrite(0x34); - spiWrite(0x02); - - writeCommand(0xF7); - spiWrite(0x20); - - writeCommand(0xEA); - spiWrite(0x00); - spiWrite(0x00); - - writeCommand(ILI9341_PWCTR1); //Power control - spiWrite(0x23); //VRH[5:0] - - writeCommand(ILI9341_PWCTR2); //Power control - spiWrite(0x10); //SAP[2:0];BT[3:0] - - writeCommand(ILI9341_VMCTR1); //VCM control - spiWrite(0x3e); - spiWrite(0x28); - - writeCommand(ILI9341_VMCTR2); //VCM control2 - spiWrite(0x86); //-- - - writeCommand(ILI9341_MADCTL); // Memory Access Control - // spiWrite(0x48); - spiWrite(0x48); - - writeCommand(ILI9341_VSCRSADD); // Vertical scroll - SPI_WRITE16(0); // Zero - - writeCommand(ILI9341_PIXFMT); - spiWrite(0x55); - - writeCommand(ILI9341_FRMCTR1); - spiWrite(0x00); - spiWrite(0x18); - - writeCommand(ILI9341_DFUNCTR); // Display Function Control - spiWrite(0x08); - spiWrite(0x82); - spiWrite(0x27); - - writeCommand(0xF2); // 3Gamma Function Disable - spiWrite(0x00); - - writeCommand(ILI9341_GAMMASET); //Gamma curve selected - spiWrite(0x01); - - writeCommand(ILI9341_GMCTRP1); //Set Gamma - spiWrite(0x0F); - spiWrite(0x31); - spiWrite(0x2B); - spiWrite(0x0C); - spiWrite(0x0E); - spiWrite(0x08); - spiWrite(0x4E); - spiWrite(0xF1); - spiWrite(0x37); - spiWrite(0x07); - spiWrite(0x10); - spiWrite(0x03); - spiWrite(0x0E); - spiWrite(0x09); - spiWrite(0x00); - - writeCommand(ILI9341_GMCTRN1); //Set Gamma - spiWrite(0x00); - spiWrite(0x0E); - spiWrite(0x14); - spiWrite(0x03); - spiWrite(0x11); - spiWrite(0x07); - spiWrite(0x31); - spiWrite(0xC1); - spiWrite(0x48); - spiWrite(0x08); - spiWrite(0x0F); - spiWrite(0x0C); - spiWrite(0x31); - spiWrite(0x36); - spiWrite(0x0F); - - writeCommand(ILI9341_SLPOUT); //Exit Sleep - delay(120); - writeCommand(ILI9341_DISPON); //Display on - delay(120); - endWrite(); - - _width = ILI9341_TFTWIDTH; - _height = ILI9341_TFTHEIGHT; - setRotation(0); -} - -void Adafruit_ILI9341::setRotation(uint8_t m) { - rotation = m % 4; // can't be higher than 3 - switch (rotation) { - case 0: - // m = (MADCTL_MX | MADCTL_BGR); - m = ( MADCTL_BGR); - _width = ILI9341_TFTWIDTH; - _height = ILI9341_TFTHEIGHT; - break; - case 1: - m = (MADCTL_MX | MADCTL_MV | MADCTL_BGR); - _width = ILI9341_TFTHEIGHT; - _height = ILI9341_TFTWIDTH; - break; - case 2: - m = (MADCTL_MX | MADCTL_MY | MADCTL_BGR); - _width = ILI9341_TFTWIDTH; - _height = ILI9341_TFTHEIGHT; - break; - case 3: - // m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); - m = (MADCTL_MY | MADCTL_MV | MADCTL_BGR); - _width = ILI9341_TFTHEIGHT; - _height = ILI9341_TFTWIDTH; - break; - } - - startWrite(); - writeCommand(ILI9341_MADCTL); - spiWrite(m); - endWrite(); -} - -void Adafruit_ILI9341::invertDisplay(boolean i) { - startWrite(); - writeCommand(i ? ILI9341_INVON : ILI9341_INVOFF); - endWrite(); -} - -void Adafruit_ILI9341::scrollTo(uint16_t y) { - startWrite(); - writeCommand(ILI9341_VSCRSADD); - SPI_WRITE16(y); - endWrite(); -} - -uint8_t Adafruit_ILI9341::spiRead() { - if(_sclk < 0){ - return HSPI_READ(); - } - if(_miso < 0){ - return 0; - } - uint8_t r = 0; - for (uint8_t i=0; i<8; i++) { - SSPI_SCK_LOW(); - SSPI_SCK_HIGH(); - r <<= 1; - if (SSPI_MISO_READ()){ - r |= 0x1; - } - } - return r; -} - -void Adafruit_ILI9341::spiWrite(uint8_t b) { - if(_sclk < 0){ - HSPI_WRITE(b); - return; - } - for(uint8_t bit = 0x80; bit; bit >>= 1){ - if((b) & bit){ - SSPI_MOSI_HIGH(); - } else { - SSPI_MOSI_LOW(); - } - SSPI_SCK_LOW(); - SSPI_SCK_HIGH(); - } -} - - -/* - * Transaction API - * */ - -void Adafruit_ILI9341::startWrite(void){ - SPI_BEGIN_TRANSACTION(); - SPI_CS_LOW(); -} - -void Adafruit_ILI9341::endWrite(void){ - SPI_CS_HIGH(); - SPI_END_TRANSACTION(); -} - -void Adafruit_ILI9341::writeCommand(uint8_t cmd){ - SPI_DC_LOW(); - spiWrite(cmd); - SPI_DC_HIGH(); -} - -void Adafruit_ILI9341::setAddrWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h) { - // x = ILI9341_TFTWIDTH - x; - uint32_t xa = ((uint32_t)x << 16) | (x+w-1); - uint32_t ya = ((uint32_t)y << 16) | (y+h-1); - writeCommand(ILI9341_CASET); // Column addr set - SPI_WRITE32(xa); - writeCommand(ILI9341_PASET); // Row addr set - SPI_WRITE32(ya); - writeCommand(ILI9341_RAMWR); // write to RAM -} - -void Adafruit_ILI9341::pushColor(uint16_t color) { - startWrite(); - SPI_WRITE16(color); - endWrite(); -} - - -void Adafruit_ILI9341::writePixel(uint16_t color){ - SPI_WRITE16(color); -} - -void Adafruit_ILI9341::writePixels(uint16_t * colors, uint32_t len){ - SPI_WRITE_PIXELS((uint8_t*)colors , len * 2); -} - -void Adafruit_ILI9341::writeColor(uint16_t color, uint32_t len){ -#ifdef SPI_HAS_WRITE_PIXELS - if(_sclk >= 0){ - for (uint32_t t=0; t SPI_MAX_PIXELS_AT_ONCE)?SPI_MAX_PIXELS_AT_ONCE:len; - uint16_t tlen = 0; - - for (uint32_t t=0; tblen)?blen:len; - writePixels(temp, tlen); - len -= tlen; - } -#else - uint8_t hi = color >> 8, lo = color; - if(_sclk < 0){ //AVR Optimization - for (uint32_t t=len; t; t--){ - HSPI_WRITE(hi); - HSPI_WRITE(lo); - } - return; - } - for (uint32_t t=len; t; t--){ - spiWrite(hi); - spiWrite(lo); - } -#endif -} - -void Adafruit_ILI9341::writePixel(int16_t x, int16_t y, uint16_t color) { - if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return; - setAddrWindow(x,y,1,1); - writePixel(color); -} - -void Adafruit_ILI9341::writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color){ - if((x >= _width) || (y >= _height)) return; - int16_t x2 = x + w - 1, y2 = y + h - 1; - if((x2 < 0) || (y2 < 0)) return; - - // Clip left/top - if(x < 0) { - x = 0; - w = x2 + 1; - } - if(y < 0) { - y = 0; - h = y2 + 1; - } - - // Clip right/bottom - if(x2 >= _width) w = _width - x; - if(y2 >= _height) h = _height - y; - - int32_t len = (int32_t)w * h; - setAddrWindow(x, y, w, h); - writeColor(color, len); -} - -void Adafruit_ILI9341::writeFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color){ - writeFillRect(x, y, 1, h, color); -} - -void Adafruit_ILI9341::writeFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color){ - writeFillRect(x, y, w, 1, color); -} - -uint8_t Adafruit_ILI9341::readcommand8(uint8_t c, uint8_t index) { - uint32_t freq = _freq; - if(_freq > 24000000){ - _freq = 24000000; - } - startWrite(); - writeCommand(0xD9); // woo sekret command? - spiWrite(0x10 + index); - writeCommand(c); - uint8_t r = spiRead(); - endWrite(); - _freq = freq; - return r; -} - -void Adafruit_ILI9341::drawPixel(int16_t x, int16_t y, uint16_t color){ - startWrite(); - writePixel(x, y, color); - endWrite(); -} - -void Adafruit_ILI9341::drawFastVLine(int16_t x, int16_t y, - int16_t h, uint16_t color) { - startWrite(); - writeFastVLine(x, y, h, color); - endWrite(); -} - -void Adafruit_ILI9341::drawFastHLine(int16_t x, int16_t y, - int16_t w, uint16_t color) { - startWrite(); - writeFastHLine(x, y, w, color); - endWrite(); -} - -void Adafruit_ILI9341::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, - uint16_t color) { - startWrite(); - writeFillRect(x,y,w,h,color); - endWrite(); -} - -// This code was ported/adapted from https://github.com/PaulStoffregen/ILI9341_t3 -// by Marc MERLIN. See examples/pictureEmbed to use this. -void Adafruit_ILI9341::drawBitmap(int16_t x, int16_t y, int16_t w, int16_t h, - const uint16_t *pcolors) { - - int16_t x2, y2; // Lower-right coord - if(( x >= _width ) || // Off-edge right - ( y >= _height) || // " top - ((x2 = (x+w-1)) < 0 ) || // " left - ((y2 = (y+h-1)) < 0) ) return; // " bottom - - int16_t bx1=0, by1=0, // Clipped top-left within bitmap - saveW=w; // Save original bitmap width value - if(x < 0) { // Clip left - w += x; - bx1 = -x; - x = 0; - } - if(y < 0) { // Clip top - h += y; - by1 = -y; - y = 0; - } - if(x2 >= _width ) w = _width - x; // Clip right - if(y2 >= _height) h = _height - y; // Clip bottom - - pcolors += by1 * saveW + bx1; // Offset bitmap ptr to clipped top-left - startWrite(); - setAddrWindow(x, y, w, h); // Clipped area - while(h--) { // For each (clipped) scanline... - writePixels((uint16_t*)pcolors, w); // Push one (clipped) row - pcolors += saveW; // Advance pointer by one full (unclipped) line - } - endWrite(); -} diff --git a/examples/Advanced/Camera/Adafruit_ILI9341.h b/examples/Advanced/Camera/Adafruit_ILI9341.h deleted file mode 100644 index b57d1e9..0000000 --- a/examples/Advanced/Camera/Adafruit_ILI9341.h +++ /dev/null @@ -1,214 +0,0 @@ -/****************************************************************** - This is our library for the Adafruit ILI9341 Breakout and Shield - ----> http://www.adafruit.com/products/1651 - - Check out the links above for our tutorials and wiring diagrams - These displays use SPI to communicate, 4 or 5 pins are required - to interface (RST is optional) - Adafruit invests time and resources providing this open source - code, please support Adafruit and open-source hardware by - purchasing products from Adafruit! - - Written by Limor Fried/Ladyada for Adafruit Industries. - MIT license, all text above must be included in any redistribution - *******************************************************************/ - -#ifndef _ADAFRUIT_ILI9341H_ -#define _ADAFRUIT_ILI9341H_ - -#if ARDUINO >= 100 - #include "Arduino.h" - #include "Print.h" -#else - #include "WProgram.h" -#endif -#include -#include "Adafruit_GFX.h" - -#if defined(ARDUINO_STM32_FEATHER) -typedef volatile uint32 RwReg; -#endif -#if defined(ARDUINO_FEATHER52) -typedef volatile uint32_t RwReg; -#endif - -#define ILI9341_TFTWIDTH 320 -#define ILI9341_TFTHEIGHT 240 - -#define ILI9341_NOP 0x00 -#define ILI9341_SWRESET 0x01 -#define ILI9341_RDDID 0x04 -#define ILI9341_RDDST 0x09 - -#define ILI9341_SLPIN 0x10 -#define ILI9341_SLPOUT 0x11 -#define ILI9341_PTLON 0x12 -#define ILI9341_NORON 0x13 - -#define ILI9341_RDMODE 0x0A -#define ILI9341_RDMADCTL 0x0B -#define ILI9341_RDPIXFMT 0x0C -#define ILI9341_RDIMGFMT 0x0D -#define ILI9341_RDSELFDIAG 0x0F - -#define ILI9341_INVOFF 0x20 -#define ILI9341_INVON 0x21 -#define ILI9341_GAMMASET 0x26 -#define ILI9341_DISPOFF 0x28 -#define ILI9341_DISPON 0x29 - -#define ILI9341_CASET 0x2A -#define ILI9341_PASET 0x2B -#define ILI9341_RAMWR 0x2C -#define ILI9341_RAMRD 0x2E - -#define ILI9341_PTLAR 0x30 -#define ILI9341_MADCTL 0x36 -#define ILI9341_VSCRSADD 0x37 -#define ILI9341_PIXFMT 0x3A - -#define ILI9341_FRMCTR1 0xB1 -#define ILI9341_FRMCTR2 0xB2 -#define ILI9341_FRMCTR3 0xB3 -#define ILI9341_INVCTR 0xB4 -#define ILI9341_DFUNCTR 0xB6 - -#define ILI9341_PWCTR1 0xC0 -#define ILI9341_PWCTR2 0xC1 -#define ILI9341_PWCTR3 0xC2 -#define ILI9341_PWCTR4 0xC3 -#define ILI9341_PWCTR5 0xC4 -#define ILI9341_VMCTR1 0xC5 -#define ILI9341_VMCTR2 0xC7 - -#define ILI9341_RDID1 0xDA -#define ILI9341_RDID2 0xDB -#define ILI9341_RDID3 0xDC -#define ILI9341_RDID4 0xDD - -#define ILI9341_GMCTRP1 0xE0 -#define ILI9341_GMCTRN1 0xE1 -/* -#define ILI9341_PWCTR6 0xFC - - */ - -// Color definitions -#define ILI9341_BLACK 0x0000 /* 0, 0, 0 */ -#define ILI9341_NAVY 0x000F /* 0, 0, 128 */ -#define ILI9341_DARKGREEN 0x03E0 /* 0, 128, 0 */ -#define ILI9341_DARKCYAN 0x03EF /* 0, 128, 128 */ -#define ILI9341_MAROON 0x7800 /* 128, 0, 0 */ -#define ILI9341_PURPLE 0x780F /* 128, 0, 128 */ -#define ILI9341_OLIVE 0x7BE0 /* 128, 128, 0 */ -#define ILI9341_LIGHTGREY 0xC618 /* 192, 192, 192 */ -#define ILI9341_DARKGREY 0x7BEF /* 128, 128, 128 */ -#define ILI9341_BLUE 0x001F /* 0, 0, 255 */ -#define ILI9341_GREEN 0x07E0 /* 0, 255, 0 */ -#define ILI9341_CYAN 0x07FF /* 0, 255, 255 */ -#define ILI9341_RED 0xF800 /* 255, 0, 0 */ -#define ILI9341_MAGENTA 0xF81F /* 255, 0, 255 */ -#define ILI9341_YELLOW 0xFFE0 /* 255, 255, 0 */ -#define ILI9341_WHITE 0xFFFF /* 255, 255, 255 */ -#define ILI9341_ORANGE 0xFD20 /* 255, 165, 0 */ -#define ILI9341_GREENYELLOW 0xAFE5 /* 173, 255, 47 */ -#define ILI9341_PINK 0xF81F - -#if defined (__AVR__) || defined(TEENSYDUINO) || defined(ESP8266) || defined (ESP32) || defined(__arm__) -#define USE_FAST_PINIO -#endif - -class Adafruit_ILI9341 : public Adafruit_GFX { - protected: - - public: - Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _MOSI, int8_t _SCLK, int8_t _RST = -1, int8_t _MISO = -1); - Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _RST = -1); - -#ifndef ESP32 - void begin(uint32_t freq = 0); -#else - void begin(uint32_t freq = 0, SPIClass &spi=SPI); -#endif - void setRotation(uint8_t r); - void invertDisplay(boolean i); - void scrollTo(uint16_t y); - - // Required Non-Transaction - void drawPixel(int16_t x, int16_t y, uint16_t color); - - // Transaction API - void startWrite(void); - void endWrite(void); - void writePixel(int16_t x, int16_t y, uint16_t color); - void writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color); - void writeFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color); - void writeFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color); - - // Transaction API not used by GFX - void setAddrWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h); - void writePixel(uint16_t color); - void writePixels(uint16_t * colors, uint32_t len); - void writeColor(uint16_t color, uint32_t len); - void pushColor(uint16_t color); - - // Recommended Non-Transaction - void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color); - void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color); - void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color); - void drawBitmap(int16_t x, int16_t y, int16_t w, int16_t h, const uint16_t *pcolors); - - uint8_t readcommand8(uint8_t reg, uint8_t index = 0); - - uint16_t color565(uint8_t r, uint8_t g, uint8_t b); - - // via Charles Bailey on stackoverflow: - // "Functions in derived classes which don't override functions in base - // classes but which have the same name will hide other functions of the - // same name in the base class. - // "It is generally considered bad practice to have have functions in - // derived classes which have the same name as functions in the base - // class which aren't intended to override the base class functions as - // what you are seeing is not usually desirable behaviour. It is usually - // preferable to give different functions different names." - // i.e. this function in ILI9341 should not have been called this; it's - // fundamentally different from GFX's drawBitmap(). But here we are, - // painted into the proverbial corner. C++11 has the 'using' keyword - // to allow access to base class functions. This'll band-aid the issue - // for now but might be inadequate for "vintage" complier variants that - // some board support packages might possibly be using, dunno. - using Adafruit_GFX::drawBitmap; - - private: -#ifdef ESP32 - SPIClass _spi; -#endif - uint32_t _freq; -#if defined (__AVR__) || defined(TEENSYDUINO) - int8_t _cs, _dc, _rst, _sclk, _mosi, _miso; -#ifdef USE_FAST_PINIO - volatile uint8_t *mosiport, *misoport, *clkport, *dcport, *csport; - uint8_t mosipinmask, misopinmask, clkpinmask, cspinmask, dcpinmask; -#endif -#elif defined (__arm__) - int32_t _cs, _dc, _rst, _sclk, _mosi, _miso; -#ifdef USE_FAST_PINIO - volatile RwReg *mosiport, *misoport, *clkport, *dcport, *csport; - uint32_t mosipinmask, misopinmask, clkpinmask, cspinmask, dcpinmask; -#endif -#elif defined (ESP8266) || defined (ESP32) - int8_t _cs, _dc, _rst, _sclk, _mosi, _miso; -#ifdef USE_FAST_PINIO - volatile uint32_t *mosiport, *misoport, *clkport, *dcport, *csport; - uint32_t mosipinmask, misopinmask, clkpinmask, cspinmask, dcpinmask; -#endif -#else - int8_t _cs, _dc, _rst, _sclk, _mosi, _miso; -#endif - - void writeCommand(uint8_t cmd); - void spiWrite(uint8_t v); - uint8_t spiRead(void); -}; - -#endif diff --git a/examples/Advanced/Camera/Camera.ino b/examples/Advanced/Camera/Camera.ino deleted file mode 100644 index f8f894a..0000000 --- a/examples/Advanced/Camera/Camera.ino +++ /dev/null @@ -1,337 +0,0 @@ -/* - This sketch is based on the sdFatTftBitmap example sketch from the ILI9341_due library. - - See: http://marekburiak.github.io/ILI9341_due/ - - Adapted by Bodmer 20th January 2017 to incorporate the JPEGDecoder library and draw - Jpeg images that have been stored on an SD card. - - It is compatible with the Mega and Due boards, modify the defined CS, DC pins - for the TFT and SD connections to suit your setup. - - You can generate your own Jpeg images from digital photographs by cropping and resizing - by using commonly available picture/image editors such as Paint or IrfanView. - The example image used by the sketch is in the extras folder in the JPEGDecoder library, - copy the "arduino.jpg" file to the SD card. - - See: https://github.com/Bodmer/JPEGDecoder - - The Arduino IDE's built in SD library is used: - - https://www.arduino.cc/en/reference/SD -*/ - -// IMPORTANT: Edit the ILI9341_due_config.h to select: -// #define ILI9341_SPI_MODE_NORMAL // uses SPI library -// this sketch will not work if the Due DMA or SPI extended mode is enabled. -// Use the hardware SPI lines MOSI, MISO and SCK to interface with both the TFT and -// the SD card. - -//==================================================================================== -// libraries -//==================================================================================== - -#include -#include // Use the Arduino IDE built-in SD library - -#include "Adafruit_ILI9341.h" -#include // JPEG decoder library -#include -#include - -#define USE_SERIAL Serial - -WiFiMulti wifiMulti; - -/////////////////// -#include -#include -#include -#include "tjpgd.h" - -//=====================PTC08======================= -HardwareSerial PTC08(2); - -// the setup routine runs once when M5Stack starts up -// 复位指令:56 00 26 00 返回:76 00 26 00 +DSP 版 信息 -const uint8_t ptc_reset[] = {0x56, 0x00, 0x26, 0x00}; - -// 拍照指令:56 00 36 01 00 返回:76 00 36 00 00 -const uint8_t ptc_kaca[] = {0x56, 0x00, 0x36, 0x01, 0x00}; - -// 清空图片缓存指令:56 00 36 01 02 返回:76 00 36 00 00 -const uint8_t ptc_clean_cache[] = {0x56, 0x00, 0x36, 0x01, 0x02}; - -// 读所拍图片长度指令:56 00 34 01 00 返回:76 00 34 00 04 00 00 XX YY -// XX YY -------图片数据长度,XX为高位字节,YY为低位字节 -const uint8_t ptc_read_length[] = {0x56, 0x00, 0x34, 0x01, 0x00}; - -// 读取所拍图片数据指令:56 00 32 0C 00 0A 00 00 XX(8) XX 00 00 YY(12) YY 00 FF -// 返回:7600320000 FFD8 。FFD9 7600320000 -uint8_t ptc_read_data[16] = {0x56, 0x00, 0x32, 0x0c, 0x00, 0x0a, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x11, 0x11, 0x00, 0xff}; - -// 设置拍照图片压缩率指令:56 00 31 05 01 01 12 04 XX(8) 返回:76 00 31 00 00 -// XX 一般选 36 (范围:00 ----FF) -uint8_t ptc_set_compress[] = {0x56, 0x00, 0x31, 0x05, 0x01, 0x01, 0x12, 0x04, 0x00}; - -// 修改串口初始波特率指令: 56 00 31 06 04 02 00 08 XX(8) YY -const uint8_t ptc_set_baud[] = {0x56, 0x00, 0x31, 0x06, 0x04, 0x02, 0x00, 0x08, 0x0d, 0xa6}; - -void camera_set_baud() { - PTC08.write(ptc_set_baud, 10); - delay(100); - while(PTC08.available()) { - Serial.printf("%2.2x ", PTC08.read()); - } - Serial.printf("\r\n"); -} - -void camera_reset() { - Serial.printf("PTC reset.\r\n"); - delay(1000); - PTC08.write(ptc_clean_cache, 5); - delay(100); - while(PTC08.available()) { - Serial.printf("%2.2x ", PTC08.read()); - } - Serial.printf("\r\n"); -} - -void camera_clean_cache() { - Serial.printf("PTC clean cache.\r\n"); - PTC08.write(ptc_clean_cache, 5); - delay(100); - while(PTC08.available()) { - Serial.printf("%2.2x ", PTC08.read()); - } - Serial.printf("\r\n"); -} - -void camera_shutter() { - Serial.printf("PTC shutter.\r\n"); - PTC08.write(ptc_kaca, 5); - delay(100); - while(PTC08.available()) { - Serial.printf("%2.2x ", PTC08.read()); - } - Serial.printf("\r\n"); -} - -uint16_t camera_get_length() { - uint8_t buffer[10]; - uint8_t idx = 0; - Serial.printf("PTC get length.\r\n"); - PTC08.write(ptc_read_length, 5); - delay(100); - while(PTC08.available()) { - buffer[idx] = PTC08.read(); - // Serial.write(buffer[idx]); - // Serial.printf("%2.2x ", buffer[idx]); - // Serial.write(PTC08.read()); - idx++; - } - return (buffer[7]<<8 | buffer[8]); -} - -void camera_read_data(uint16_t addr, uint16_t length, uint8_t* dest) { - int idx = 0; - ptc_read_data[9] = (uint8_t)(addr&0x00ff); - ptc_read_data[8] = (uint8_t)(addr>>8); - ptc_read_data[13] = (uint8_t)(length&0x00ff); - ptc_read_data[12] = (uint8_t)(length>>8); - - PTC08.write(ptc_read_data, 16); - delay(100); - while(PTC08.available()) { - int ch = PTC08.read(); - // Serial.printf("%2.2x ", ch); - if(++idx >= 6) { - dest[idx-6] = ch; - } - } -} - -void camera_set_compress(uint8_t val) { - Serial.printf("PTC set compress.\r\n"); - ptc_set_compress[8] = val; - PTC08.write(ptc_set_compress, 9); - delay(100); - while(PTC08.available()) { - int ch = PTC08.read(); - Serial.printf("%2.2x ", ch); - } -} -//------------------------------------------------------ - - -//==================================================================================== -// defines -//==================================================================================== -// For the Adafruit shield, these are the default. -#define TFT_DC 27 -#define TFT_CS 14 -#define TFT_MOSI 23 -#define TFT_CLK 18 -#define TFT_RST 2 -#define TFT_MISO 0 - -#define LED_PIN 12 -#define SD_CS 4 // Chip Select for SD card - -#define TFT_BLACK 0x0000 -#define TFT_WHITE 0xFFFF - - -const uint8_t bmp_header[] = { -0x42,0x4d,0x36,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x28, \ -0x00,0x00,0x00,0x40,0x01,0x00,0x00,0xf0,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x84, \ -0x03,0x00,0xc4,0x0e,0x00,0x00,0xc4,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; - -void take_picture() { - camera_clean_cache(); - camera_shutter(); - - int pic_length = camera_get_length(); - Serial.printf("picture length:%d\r\n", pic_length); - delay(80); - - int count = 0; - uint8_t get_buf[512]; - File file = SD.open("/camera.jpg", FILE_WRITE); - Serial.printf("PTC read data.\r\n"); - for(int i=0; i 128) { - camera_read_data(i, 128, get_buf); - file.write(get_buf, 128); - } else { - camera_read_data(i, pic_length-i, get_buf); - file.write(get_buf, pic_length-i); - } - } - file.close(); -} - -void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ - Serial.printf("Listing directory: %s\n", dirname); - - File root = fs.open(dirname); - if(!root){ - Serial.println("Failed to open directory"); - return; - } - if(!root.isDirectory()){ - Serial.println("Not a directory"); - return; - } - - File file = root.openNextFile(); - while(file){ - if(file.isDirectory()){ - Serial.print(" DIR : "); - Serial.println(file.name()); - if(levels){ - listDir(fs, file.name(), levels -1); - } - } else { - Serial.print(" FILE: "); - Serial.print(file.name()); - Serial.print(" SIZE: "); - Serial.println(file.size()); - } - file = root.openNextFile(); - } -} -//==================================================================================== -// setup -//==================================================================================== -// ILI9341_due tft = ILI9341_due(TFT_CS, TFT_DC, TFT_RST); -Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST); - -void setup() { - Serial.begin(115200); - PTC08.begin(115200); - - // Make sure the SD card chip select is high before we initialise the TFT - pinMode(SD_CS, OUTPUT); - digitalWrite(SD_CS, HIGH); - pinMode(LED_PIN, OUTPUT); - digitalWrite(LED_PIN, HIGH); - - // Initialise the TFT - tft.begin(); - tft.fillScreen(TFT_BLACK); - // tft.drawRGBBitmap(0, 0, uint16_t *pcolors, int16_t w, int16_t h); - - Serial.print(F("Initialising SD card...")); - - if (!SD.begin(SD_CS)) { - Serial.println(F("failed!")); - return; - } - Serial.println(F("OK!")); - - listDir(SD, "/", 0); - -//------------------------ - wifiMulti.addAP("MasterHax_2.4G", "wittyercheese551"); - - // File fsFile = SD.open("/camera2.bmp", FILE_READ); - // uint8_t buffer[512]; - // fsFile.read(buffer, 54); - // Serial.printf("\r\n\r\n\r\n\r\n"); - // for(int i=0; i<54; i++) { - // Serial.printf("0x%2.2x,", buffer[i]); - // } - // Serial.printf("\r\n\r\n\r\n\r\n"); - - // for(int j=0; j<240; j++) { - // fsFile.read(buffer, 320); - // uint16_t *pt16 = (uint16_t*)buffer; - // for(int k=0; k<160; k++) { - // Serial.printf("%4.4x ", pt16[k]); - // } - // Serial.printf("\r\n"); - // } - - // tft.drawBitmap(0, 0, 320, 240, fsFile.flashRead()); - Serial.printf("reset.\r\n"); - camera_reset(); - delay(2500); - - while(PTC08.available()) { - Serial.printf("%2.2x ", PTC08.read()); - } - Serial.printf("\r\n"); -} - - -//==================================================================================== -// loop -//==================================================================================== - -void loop() { - // draw Arduino logo at a random position - // drawJpeg( "/arduino.jpg", random(tft.width() - 160), random(tft.height() - 128) ); - take_picture(); - drawJpeg("/camera.jpg", 0, 0); - - File jpegFile = SD.open("/camera.jpg", FILE_READ); - // // File jpegFile = SD.open("/pic.jpg"); - // // File jpegFile = SD.open("/EagleEye.jpg", FILE_READ); - - // wait for WiFi connection - if((wifiMulti.run() == WL_CONNECTED)) { - HTTPClient http; - USE_SERIAL.print("[HTTP] begin...\n"); - - // configure server and url - // http.begin("http://api.heclouds.com/bindata?device_id=5811741&datastream_id=pic"); - http.begin("http://api.yeelink.net/v1.0/device/18607/sensor/407330/photos"); - // http.addHeader("api-key", "3siYnijpqzOtLKaqdGFIvj5PcM4="); - http.addHeader("U-ApiKey", "e92dea44e2c4b29838fea13b9cf7ab59"); - http.sendRequest("POST", &jpegFile, jpegFile.size()); - USE_SERIAL.print("[HTTP] POST...\n"); - http.end(); - } -} - diff --git a/examples/Advanced/Camera/JPEG_functions.ino b/examples/Advanced/Camera/JPEG_functions.ino deleted file mode 100644 index 60ab2db..0000000 --- a/examples/Advanced/Camera/JPEG_functions.ino +++ /dev/null @@ -1,185 +0,0 @@ -/*==================================================================================== - This sketch contains support functions to render the Jpeg images. - - Created by Bodmer 15th Jan 2017 - ==================================================================================*/ - -// Return the minimum of two values a and b -#define minimum(a,b) (((a) < (b)) ? (a) : (b)) - -//==================================================================================== -// Opens the image file and prime the Jpeg decoder -//==================================================================================== -void drawJpeg(const char *filename, int xpos, int ypos) { - - // Open the named file (the Jpeg decoder library will close it) - File jpegFile = SD.open( filename, FILE_READ); // or, file handle reference for SD library - - if ( !jpegFile ) { - Serial.print("ERROR: File \""); Serial.print(filename); Serial.println ("\" not found!"); - return; - } - - Serial.println("==========================="); - Serial.print("Drawing file: "); Serial.println(filename); - Serial.println("==========================="); - - // Use one of the following methods to initialise the decoder: - boolean decoded = JpegDec.decodeSdFile(jpegFile); // Pass the SD file handle to the decoder, - // boolean decoded = JpegDec.decodeSdFile(filename); // or pass the filename (String or character array) - - if (decoded) { - // print information about the image to the serial port - jpegInfo(); - // render the image onto the screen at given coordinates - jpegRender(xpos, ypos); - } - else { - Serial.println("Jpeg file format not supported!"); - } -} - -//==================================================================================== -// Decode and render the Jpeg image onto the TFT screen -//==================================================================================== -void jpegRender(int xpos, int ypos) { - - // retrieve information about the image - uint16_t mcu_w = JpegDec.MCUWidth; - uint16_t mcu_h = JpegDec.MCUHeight; - uint32_t max_x = JpegDec.width; - uint32_t max_y = JpegDec.height; - - uint16_t *pImg; // Pointer for the returned image block - - // Jpeg images are draw as a set of image block (tiles) called Minimum Coding Units (MCUs) - // Typically these MCUs are 16x16 pixel blocks - // Determine the width and height of the right and bottom edge image blocks - uint32_t min_w = minimum(mcu_w, max_x % mcu_w); - uint32_t min_h = minimum(mcu_h, max_y % mcu_h); - - // save the current image block size - uint32_t win_w = mcu_w; - uint32_t win_h = mcu_h; - - // record the current time so we can measure how long it takes to draw an image - uint32_t drawTime = millis(); - - // save the coordinate of the right and bottom edges to assist image cropping - // to the screen size - max_x += xpos; - max_y += ypos; - - File fsFile = SD.open("/camera.bmp", FILE_WRITE); - fsFile.write(bmp_header, 54); - - // read each MCU block until there are no more - while ( JpegDec.read()) { - - // save a pointer to the image block - pImg = JpegDec.pImage; // Pointer to block - - // calculate where the image block should be drawn on the screen - int mcu_x = JpegDec.MCUx * mcu_w + xpos; - int mcu_y = JpegDec.MCUy * mcu_h + ypos; - - // check if the image block size needs to be changed for the right and bottom edges - if (mcu_x + mcu_w <= max_x) win_w = mcu_w; - else win_w = min_w; - if (mcu_y + mcu_h <= max_y) win_h = mcu_h; - else win_h = min_h; - - // calculate how many pixels must be drawn - uint32_t mcu_pixels = win_w * win_h; - fsFile.write((uint8_t*)pImg, mcu_pixels*2); - - // draw image MCU block only if it will fit on the screen - if ( ( mcu_x + win_w) <= tft.width() && ( mcu_y + win_h) <= tft.height()) - { - tft.drawRGBBitmap(mcu_x, mcu_y, pImg, win_w, win_h); - // Now set a MCU bounding window on the TFT to push pixels into (x, y, x + width - 1, y + height - 1) - // tft.setAddrWindow(mcu_x, mcu_y, mcu_x + win_w - 1, mcu_y + win_h - 1); - - // Write all MCU pixels to the TFT window - // while (mcu_pixels--) tft.pushColor(*pImg++); // Send to TFT 16 bits at a time - // tft.pushColors(pImg, 0, mcu_pixels); // Send the whole buffer, this is faster - // tft.writePixels(pImg, mcu_pixels); - } - - // Stop drawing blocks if the bottom of the screen has been reached, - // the abort function will close the file - else if ( ( mcu_y + win_h) >= tft.height()) JpegDec.abort(); - - } - fsFile.close(); - - // calculate how long it took to draw the image - drawTime = millis() - drawTime; - - // print the results to the serial port - Serial.print ("Total render time was : "); Serial.print(drawTime); Serial.println(" ms"); - Serial.println("====================================="); -} - -//==================================================================================== -// Print information decoded from the Jpeg image -//==================================================================================== -void jpegInfo() { - Serial.println(F("===============")); - Serial.println(F("JPEG image info")); - Serial.println(F("===============")); - Serial.print(F( "Width :")); Serial.println(JpegDec.width); - Serial.print(F( "Height :")); Serial.println(JpegDec.height); - Serial.print(F( "Components :")); Serial.println(JpegDec.comps); - Serial.print(F( "MCU / row :")); Serial.println(JpegDec.MCUSPerRow); - Serial.print(F( "MCU / col :")); Serial.println(JpegDec.MCUSPerCol); - Serial.print(F( "Scan type :")); Serial.println(JpegDec.scanType); - Serial.print(F( "MCU width :")); Serial.println(JpegDec.MCUWidth); - Serial.print(F( "MCU height :")); Serial.println(JpegDec.MCUHeight); - Serial.println(F("===============")); -} - -//==================================================================================== -// Open a Jpeg file and send it to the Serial port in a C array compatible format -//==================================================================================== -void createArray(const char *filename) { - - // Open the named file - //fs::File jpgFile = SPIFFS.open( filename, "r"); // File handle reference for SPIFFS - File jpgFile = SD.open( filename, FILE_READ); // or, file handle reference for SD library - - if ( !jpgFile ) { - Serial.print("ERROR: File \""); Serial.print(filename); Serial.println ("\" not found!"); - return; - } - - uint8_t data; - byte line_len = 0; - Serial.println(""); - Serial.println("// Generated by a JPEGDecoder library example sketch:"); - Serial.println("// https://github.com/Bodmer/JPEGDecoder"); - Serial.println(""); - Serial.println("#if defined(__AVR__)"); - Serial.println(" #include "); - Serial.println("#endif"); - Serial.println(""); - Serial.print ("const uint8_t "); - while (*filename != '.') Serial.print(*filename++); - Serial.println("[] PROGMEM = {"); // PROGMEM added for AVR processors, it is ignored by Due - - while ( jpgFile.available()) { - - data = jpgFile.read(); - Serial.print("0x"); if (abs(data) < 16) Serial.print("0"); - Serial.print(data, HEX); Serial.print(",");// Add value and comma - line_len++; - if ( line_len >= 32) { - line_len = 0; - Serial.println(); - } - } - - Serial.println("};\r\n"); - jpgFile.close(); -} -//==================================================================================== diff --git a/examples/Advanced/Camera/integer.h b/examples/Advanced/Camera/integer.h deleted file mode 100644 index 7dcaef4..0000000 --- a/examples/Advanced/Camera/integer.h +++ /dev/null @@ -1,37 +0,0 @@ -/*-------------------------------------------*/ -/* Integer type definitions for FatFs module */ -/*-------------------------------------------*/ - -#ifndef _INTEGER -#define _INTEGER - -#ifdef _WIN32 /* FatFs development platform */ - -// #include -// #include - -#else /* Embedded platform */ - -/* These types must be 16-bit, 32-bit or larger integer */ -typedef int INT; -typedef unsigned int UINT; - -/* These types must be 8-bit integer */ -typedef char CHAR; -typedef unsigned char UCHAR; -typedef unsigned char BYTE; - -/* These types must be 16-bit integer */ -typedef short SHORT; -typedef unsigned short USHORT; -typedef unsigned short WORD; -typedef unsigned short WCHAR; - -/* These types must be 32-bit integer */ -typedef long LONG; -typedef unsigned long ULONG; -typedef unsigned long DWORD; - -#endif - -#endif diff --git a/examples/Advanced/Camera/tjpgd.c b/examples/Advanced/Camera/tjpgd.c deleted file mode 100644 index cc8557e..0000000 --- a/examples/Advanced/Camera/tjpgd.c +++ /dev/null @@ -1,951 +0,0 @@ -/*----------------------------------------------------------------------------/ -/ TJpgDec - Tiny JPEG Decompressor R0.01a (C)ChaN, 2012 -/-----------------------------------------------------------------------------/ -/ The TJpgDec is a generic JPEG decompressor module for tiny embedded systems. -/ This is a free software that opened for education, research and commercial -/ developments under license policy of following terms. -/ -/ Copyright (C) 2012, ChaN, all right reserved. -/ -/ * The TJpgDec module is a free software and there is NO WARRANTY. -/ * No restriction on use. You can use, modify and redistribute it for -/ personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. -/ * Redistributions of source code must retain the above copyright notice. -/ -/-----------------------------------------------------------------------------/ -/ Oct 04,'11 R0.01 First release. -/ Feb 19,'12 R0.01a Fixed decompression fails when scan starts with an escape seq. -/----------------------------------------------------------------------------*/ - -#include "tjpgd.h" - - -/*-----------------------------------------------*/ -/* Zigzag-order to raster-order conversion table */ -/*-----------------------------------------------*/ - -#define ZIG(n) Zig[n] - -static -const BYTE Zig[64] = { /* Zigzag-order to raster-order conversion table */ - 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63 -}; - - - -/*-------------------------------------------------*/ -/* Input scale factor of Arai algorithm */ -/* (scaled up 16 bits for fixed point operations) */ -/*-------------------------------------------------*/ - -#define IPSF(n) Ipsf[n] - -static -const WORD Ipsf[64] = { /* See also aa_idct.png */ - (WORD)(1.00000*8192), (WORD)(1.38704*8192), (WORD)(1.30656*8192), (WORD)(1.17588*8192), (WORD)(1.00000*8192), (WORD)(0.78570*8192), (WORD)(0.54120*8192), (WORD)(0.27590*8192), - (WORD)(1.38704*8192), (WORD)(1.92388*8192), (WORD)(1.81226*8192), (WORD)(1.63099*8192), (WORD)(1.38704*8192), (WORD)(1.08979*8192), (WORD)(0.75066*8192), (WORD)(0.38268*8192), - (WORD)(1.30656*8192), (WORD)(1.81226*8192), (WORD)(1.70711*8192), (WORD)(1.53636*8192), (WORD)(1.30656*8192), (WORD)(1.02656*8192), (WORD)(0.70711*8192), (WORD)(0.36048*8192), - (WORD)(1.17588*8192), (WORD)(1.63099*8192), (WORD)(1.53636*8192), (WORD)(1.38268*8192), (WORD)(1.17588*8192), (WORD)(0.92388*8192), (WORD)(0.63638*8192), (WORD)(0.32442*8192), - (WORD)(1.00000*8192), (WORD)(1.38704*8192), (WORD)(1.30656*8192), (WORD)(1.17588*8192), (WORD)(1.00000*8192), (WORD)(0.78570*8192), (WORD)(0.54120*8192), (WORD)(0.27590*8192), - (WORD)(0.78570*8192), (WORD)(1.08979*8192), (WORD)(1.02656*8192), (WORD)(0.92388*8192), (WORD)(0.78570*8192), (WORD)(0.61732*8192), (WORD)(0.42522*8192), (WORD)(0.21677*8192), - (WORD)(0.54120*8192), (WORD)(0.75066*8192), (WORD)(0.70711*8192), (WORD)(0.63638*8192), (WORD)(0.54120*8192), (WORD)(0.42522*8192), (WORD)(0.29290*8192), (WORD)(0.14932*8192), - (WORD)(0.27590*8192), (WORD)(0.38268*8192), (WORD)(0.36048*8192), (WORD)(0.32442*8192), (WORD)(0.27590*8192), (WORD)(0.21678*8192), (WORD)(0.14932*8192), (WORD)(0.07612*8192) -}; - - - -/*---------------------------------------------*/ -/* Conversion table for fast clipping process */ -/*---------------------------------------------*/ - -#define BYTECLIP(v) Clip8[(UINT)(v) & 0x3FF] - -static -const BYTE Clip8[1024] = { - /* 0..255 */ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - /* 256..511 */ - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - /* -512..-257 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* -256..-1 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - - - - -/*-----------------------------------------------------------------------*/ -/* Allocate a memory block from memory pool */ -/*-----------------------------------------------------------------------*/ - -static -void* alloc_pool ( /* Pointer to allocated memory block (NULL:no memory available) */ - JDEC* jd, /* Pointer to the decompressor object */ - UINT nd /* Number of bytes to allocate */ -) -{ - char *rp = 0; - - - nd = (nd + 3) & ~3; /* Align block size to the word boundary */ - - if (jd->sz_pool >= nd) { - jd->sz_pool -= nd; - rp = (char*)jd->pool; /* Get start of available memory pool */ - jd->pool = (void*)(rp + nd); /* Allocate requierd bytes */ - } - - return (void*)rp; /* Return allocated memory block (NULL:no memory to allocate) */ -} - - - - -/*-----------------------------------------------------------------------*/ -/* Create de-quantization and prescaling tables with a DQT segment */ -/*-----------------------------------------------------------------------*/ - -static -UINT create_qt_tbl ( /* 0:OK, !0:Failed */ - JDEC* jd, /* Pointer to the decompressor object */ - const BYTE* data, /* Pointer to the quantizer tables */ - UINT ndata /* Size of input data */ -) -{ - UINT i; - BYTE d, z; - LONG *pb; - - - while (ndata) { /* Process all tables in the segment */ - if (ndata < 65) return JDR_FMT1; /* Err: table size is unaligned */ - ndata -= 65; - d = *data++; /* Get table property */ - if (d & 0xF0) return JDR_FMT1; /* Err: not 8-bit resolution */ - i = d & 3; /* Get table ID */ - pb = alloc_pool(jd, 64 * sizeof (LONG));/* Allocate a memory block for the table */ - if (!pb) return JDR_MEM1; /* Err: not enough memory */ - jd->qttbl[i] = pb; /* Register the table */ - for (i = 0; i < 64; i++) { /* Load the table */ - z = ZIG(i); /* Zigzag-order to raster-order conversion */ - pb[z] = (LONG)((DWORD)*data++ * IPSF(z)); /* Apply scale factor of Arai algorithm to the de-quantizers */ - } - } - - return JDR_OK; -} - - - - -/*-----------------------------------------------------------------------*/ -/* Create huffman code tables with a DHT segment */ -/*-----------------------------------------------------------------------*/ - -static -UINT create_huffman_tbl ( /* 0:OK, !0:Failed */ - JDEC* jd, /* Pointer to the decompressor object */ - const BYTE* data, /* Pointer to the packed huffman tables */ - UINT ndata /* Size of input data */ -) -{ - UINT i, j, b, np, cls, num; - BYTE d, *pb, *pd; - WORD hc, *ph; - - - while (ndata) { /* Process all tables in the segment */ - if (ndata < 17) return JDR_FMT1; /* Err: wrong data size */ - ndata -= 17; - d = *data++; /* Get table number and class */ - cls = (d >> 4); num = d & 0x0F; /* class = dc(0)/ac(1), table number = 0/1 */ - if (d & 0xEE) return JDR_FMT1; /* Err: invalid class/number */ - pb = alloc_pool(jd, 16); /* Allocate a memory block for the bit distribution table */ - if (!pb) return JDR_MEM1; /* Err: not enough memory */ - jd->huffbits[num][cls] = pb; - for (np = i = 0; i < 16; i++) { /* Load number of patterns for 1 to 16-bit code */ - pb[i] = b = *data++; - np += b; /* Get sum of code words for each code */ - } - - ph = alloc_pool(jd, np * sizeof (WORD));/* Allocate a memory block for the code word table */ - if (!ph) return JDR_MEM1; /* Err: not enough memory */ - jd->huffcode[num][cls] = ph; - hc = 0; - for (j = i = 0; i < 16; i++) { /* Re-build huffman code word table */ - b = pb[i]; - while (b--) ph[j++] = hc++; - hc <<= 1; - } - - if (ndata < np) return JDR_FMT1; /* Err: wrong data size */ - ndata -= np; - pd = alloc_pool(jd, np); /* Allocate a memory block for the decoded data */ - if (!pd) return JDR_MEM1; /* Err: not enough memory */ - jd->huffdata[num][cls] = pd; - for (i = 0; i < np; i++) { /* Load decoded data corresponds to each code ward */ - d = *data++; - if (!cls && d > 11) return JDR_FMT1; - *pd++ = d; - } - } - - return JDR_OK; -} - - - - -/*-----------------------------------------------------------------------*/ -/* Extract N bits from input stream */ -/*-----------------------------------------------------------------------*/ - -static -INT bitext ( /* >=0: extracted data, <0: error code */ - JDEC* jd, /* Pointer to the decompressor object */ - UINT nbit /* Number of bits to extract (1 to 11) */ -) -{ - BYTE msk, s, *dp; - UINT dc, v, f; - - - msk = jd->dmsk; dc = jd->dctr; dp = jd->dptr; /* Bit mask, number of data available, read ptr */ - s = *dp; v = f = 0; - do { - if (!msk) { /* Next byte? */ - if (!dc) { /* No input data is available, re-fill input buffer */ - dp = jd->inbuf; /* Top of input buffer */ - dc = jd->infunc(jd, dp, JD_SZBUF); - if (!dc) return 0 - JDR_INP; /* Err: read error or wrong stream termination */ - } else { - dp++; /* Next data ptr */ - } - dc--; /* Decrement number of available bytes */ - if (f) { /* In flag sequence? */ - f = 0; /* Exit flag sequence */ - if (*dp != 0) return 0 - JDR_FMT1; /* Err: unexpected flag is detected (may be collapted data) */ - *dp = s = 0xFF; /* The flag is a data 0xFF */ - } else { - s = *dp; /* Get next data byte */ - if (s == 0xFF) { /* Is start of flag sequence? */ - f = 1; continue; /* Enter flag sequence */ - } - } - msk = 0x80; /* Read from MSB */ - } - v <<= 1; /* Get a bit */ - if (s & msk) v++; - msk >>= 1; - nbit--; - } while (nbit); - jd->dmsk = msk; jd->dctr = dc; jd->dptr = dp; - - return (INT)v; -} - - - - -/*-----------------------------------------------------------------------*/ -/* Extract a huffman decoded data from input stream */ -/*-----------------------------------------------------------------------*/ - -static -INT huffext ( /* >=0: decoded data, <0: error code */ - JDEC* jd, /* Pointer to the decompressor object */ - const BYTE* hbits, /* Pointer to the bit distribution table */ - const WORD* hcode, /* Pointer to the code word table */ - const BYTE* hdata /* Pointer to the data table */ -) -{ - BYTE msk, s, *dp; - UINT dc, v, f, bl, nd; - - - msk = jd->dmsk; dc = jd->dctr; dp = jd->dptr; /* Bit mask, number of data available, read ptr */ - s = *dp; v = f = 0; - bl = 16; /* Max code length */ - do { - if (!msk) { /* Next byte? */ - if (!dc) { /* No input data is available, re-fill input buffer */ - dp = jd->inbuf; /* Top of input buffer */ - dc = jd->infunc(jd, dp, JD_SZBUF); - if (!dc) return 0 - JDR_INP; /* Err: read error or wrong stream termination */ - } else { - dp++; /* Next data ptr */ - } - dc--; /* Decrement number of available bytes */ - if (f) { /* In flag sequence? */ - f = 0; /* Exit flag sequence */ - if (*dp != 0) - return 0 - JDR_FMT1;/* Err: unexpected flag is detected (may be collapted data) */ - *dp = s = 0xFF; /* The flag is a data 0xFF */ - } else { - s = *dp; /* Get next data byte */ - if (s == 0xFF) { /* Is start of flag sequence? */ - f = 1; continue; /* Enter flag sequence, get trailing byte */ - } - } - msk = 0x80; /* Read from MSB */ - } - v <<= 1; /* Get a bit */ - if (s & msk) v++; - msk >>= 1; - - for (nd = *hbits++; nd; nd--) { /* Search the code word in this bit length */ - if (v == *hcode++) { /* Matched? */ - jd->dmsk = msk; jd->dctr = dc; jd->dptr = dp; - return *hdata; /* Return the decoded data */ - } - hdata++; - } - bl--; - } while (bl); - - return 0 - JDR_FMT1; /* Err: code not found (may be collapted data) */ -} - - - - -/*-----------------------------------------------------------------------*/ -/* Apply Inverse-DCT in Arai Algorithm (see also aa_idct.png) */ -/*-----------------------------------------------------------------------*/ - -static -void block_idct ( - LONG* src, /* Input block data (de-quantized and pre-scaled for Arai Algorithm) */ - BYTE* dst /* Pointer to the destination to store the block as byte array */ -) -{ - const LONG M13 = (LONG)(1.41421*4096), M2 = (LONG)(1.08239*4096), M4 = (LONG)(2.61313*4096), M5 = (LONG)(1.84776*4096); - LONG v0, v1, v2, v3, v4, v5, v6, v7; - LONG t10, t11, t12, t13; - UINT i; - - /* Process columns */ - for (i = 0; i < 8; i++) { - v0 = src[8 * 0]; /* Get even elements */ - v1 = src[8 * 2]; - v2 = src[8 * 4]; - v3 = src[8 * 6]; - - t10 = v0 + v2; /* Process the even elements */ - t12 = v0 - v2; - t11 = (v1 - v3) * M13 >> 12; - v3 += v1; - t11 -= v3; - v0 = t10 + v3; - v3 = t10 - v3; - v1 = t11 + t12; - v2 = t12 - t11; - - v4 = src[8 * 7]; /* Get odd elements */ - v5 = src[8 * 1]; - v6 = src[8 * 5]; - v7 = src[8 * 3]; - - t10 = v5 - v4; /* Process the odd elements */ - t11 = v5 + v4; - t12 = v6 - v7; - v7 += v6; - v5 = (t11 - v7) * M13 >> 12; - v7 += t11; - t13 = (t10 + t12) * M5 >> 12; - v4 = t13 - (t10 * M2 >> 12); - v6 = t13 - (t12 * M4 >> 12) - v7; - v5 -= v6; - v4 -= v5; - - src[8 * 0] = v0 + v7; /* Write-back transformed values */ - src[8 * 7] = v0 - v7; - src[8 * 1] = v1 + v6; - src[8 * 6] = v1 - v6; - src[8 * 2] = v2 + v5; - src[8 * 5] = v2 - v5; - src[8 * 3] = v3 + v4; - src[8 * 4] = v3 - v4; - - src++; /* Next column */ - } - - /* Process rows */ - src -= 8; - for (i = 0; i < 8; i++) { - v0 = src[0] + (128L << 8); /* Get even elements (remove DC offset (-128) here) */ - v1 = src[2]; - v2 = src[4]; - v3 = src[6]; - - t10 = v0 + v2; /* Process the even elements */ - t12 = v0 - v2; - t11 = (v1 - v3) * M13 >> 12; - v3 += v1; - t11 -= v3; - v0 = t10 + v3; - v3 = t10 - v3; - v1 = t11 + t12; - v2 = t12 - t11; - - v4 = src[7]; /* Get odd elements */ - v5 = src[1]; - v6 = src[5]; - v7 = src[3]; - - t10 = v5 - v4; /* Process the odd elements */ - t11 = v5 + v4; - t12 = v6 - v7; - v7 += v6; - v5 = (t11 - v7) * M13 >> 12; - v7 += t11; - t13 = (t10 + t12) * M5 >> 12; - v4 = t13 - (t10 * M2 >> 12); - v6 = t13 - (t12 * M4 >> 12) - v7; - v5 -= v6; - v4 -= v5; - - dst[0] = BYTECLIP((v0 + v7) >> 8); /* Descale the transformed values 8 bits and output */ - dst[7] = BYTECLIP((v0 - v7) >> 8); - dst[1] = BYTECLIP((v1 + v6) >> 8); - dst[6] = BYTECLIP((v1 - v6) >> 8); - dst[2] = BYTECLIP((v2 + v5) >> 8); - dst[5] = BYTECLIP((v2 - v5) >> 8); - dst[3] = BYTECLIP((v3 + v4) >> 8); - dst[4] = BYTECLIP((v3 - v4) >> 8); - dst += 8; - - src += 8; /* Next row */ - } -} - - - - -/*-----------------------------------------------------------------------*/ -/* Load all blocks in the MCU into working buffer */ -/*-----------------------------------------------------------------------*/ - -static -JRESULT mcu_load ( - JDEC* jd /* Pointer to the decompressor object */ -) -{ - LONG *tmp = (LONG*)jd->workbuf; /* Block working buffer for de-quantize and IDCT */ - UINT blk, nby, nbc, i, z, id, cmp; - INT b, d, e; - BYTE *bp; - const BYTE *hb, *hd; - const WORD *hc; - const LONG *dqf; - - - nby = jd->msx * jd->msy; /* Number of Y blocks (1, 2 or 4) */ - nbc = 2; /* Number of C blocks (2) */ - bp = jd->mcubuf; /* Pointer to the first block */ - - for (blk = 0; blk < nby + nbc; blk++) { - cmp = (blk < nby) ? 0 : blk - nby + 1; /* Component number 0:Y, 1:Cb, 2:Cr */ - id = cmp ? 1 : 0; /* Huffman table ID of the component */ - - /* Extract a DC element from input stream */ - hb = jd->huffbits[id][0]; /* Huffman table for the DC element */ - hc = jd->huffcode[id][0]; - hd = jd->huffdata[id][0]; - b = huffext(jd, hb, hc, hd); /* Extract a huffman coded data (bit length) */ - if (b < 0) return 0 - b; /* Err: invalid code or input */ - d = jd->dcv[cmp]; /* DC value of previous block */ - if (b) { /* If there is any difference from previous block */ - e = bitext(jd, b); /* Extract data bits */ - if (e < 0) return 0 - e; /* Err: input */ - b = 1 << (b - 1); /* MSB position */ - if (!(e & b)) e -= (b << 1) - 1; /* Restore sign if needed */ - d += e; /* Get current value */ - jd->dcv[cmp] = (SHORT)d; /* Save current DC value for next block */ - } - dqf = jd->qttbl[jd->qtid[cmp]]; /* De-quantizer table ID for this component */ - tmp[0] = d * dqf[0] >> 8; /* De-quantize, apply scale factor of Arai algorithm and descale 8 bits */ - - /* Extract following 63 AC elements from input stream */ - for (i = 1; i < 64; i++) tmp[i] = 0; /* Clear rest of elements */ - hb = jd->huffbits[id][1]; /* Huffman table for the AC elements */ - hc = jd->huffcode[id][1]; - hd = jd->huffdata[id][1]; - i = 1; /* Top of the AC elements */ - do { - b = huffext(jd, hb, hc, hd); /* Extract a huffman coded value (zero runs and bit length) */ - if (b == 0) break; /* EOB? */ - if (b < 0) return 0 - b; /* Err: invalid code or input error */ - z = (UINT)b >> 4; /* Number of leading zero elements */ - if (z) { - i += z; /* Skip zero elements */ - if (i >= 64) return JDR_FMT1; /* Too long zero run */ - } - if (b &= 0x0F) { /* Bit length */ - d = bitext(jd, b); /* Extract data bits */ - if (d < 0) return 0 - d; /* Err: input device */ - b = 1 << (b - 1); /* MSB position */ - if (!(d & b)) d -= (b << 1) - 1;/* Restore negative value if needed */ - z = ZIG(i); /* Zigzag-order to raster-order converted index */ - tmp[z] = d * dqf[z] >> 8; /* De-quantize, apply scale factor of Arai algorithm and descale 8 bits */ - } - } while (++i < 64); /* Next AC element */ - - if (JD_USE_SCALE && jd->scale == 3) - *bp = (*tmp / 256) + 128; /* If scale ratio is 1/8, IDCT can be ommited and only DC element is used */ - else - block_idct(tmp, bp); /* Apply IDCT and store the block to the MCU buffer */ - - bp += 64; /* Next block */ - } - - return JDR_OK; /* All blocks have been loaded successfully */ -} - - - - -/*-----------------------------------------------------------------------*/ -/* Output an MCU: Convert YCrCb to RGB and output it in RGB form */ -/*-----------------------------------------------------------------------*/ - -static -JRESULT mcu_output ( - JDEC* jd, /* Pointer to the decompressor object */ - UINT (*outfunc)(JDEC*, void*, JRECT*), /* RGB output function */ - UINT x, /* MCU position in the image (left of the MCU) */ - UINT y /* MCU position in the image (top of the MCU) */ -) -{ - const INT CVACC = (sizeof (INT) > 2) ? 1024 : 128; - UINT ix, iy, mx, my, rx, ry; - INT yy, cb, cr; - BYTE *py, *pc, *rgb24; - JRECT rect; - - - mx = jd->msx * 8; my = jd->msy * 8; /* MCU size (pixel) */ - rx = (x + mx <= jd->width) ? mx : jd->width - x; /* Output rectangular size (it may be clipped at right/bottom end) */ - ry = (y + my <= jd->height) ? my : jd->height - y; - if (JD_USE_SCALE) { - rx >>= jd->scale; ry >>= jd->scale; - if (!rx || !ry) return JDR_OK; /* Skip this MCU if all pixel is to be rounded off */ - x >>= jd->scale; y >>= jd->scale; - } - rect.left = x; rect.right = x + rx - 1; /* Rectangular area in the frame buffer */ - rect.top = y; rect.bottom = y + ry - 1; - - - if (!JD_USE_SCALE || jd->scale != 3) { /* Not for 1/8 scaling */ - - /* Build an RGB MCU from discrete comopnents */ - rgb24 = (BYTE*)jd->workbuf; - for (iy = 0; iy < my; iy++) { - pc = jd->mcubuf; - py = pc + iy * 8; - if (my == 16) { /* Double block height? */ - pc += 64 * 4 + (iy >> 1) * 8; - if (iy >= 8) py += 64; - } else { /* Single block height */ - pc += mx * 8 + iy * 8; - } - for (ix = 0; ix < mx; ix++) { - cb = pc[0] - 128; /* Get Cb/Cr component and restore right level */ - cr = pc[64] - 128; - if (mx == 16) { /* Double block width? */ - if (ix == 8) py += 64 - 8; /* Jump to next block if double block heigt */ - pc += ix & 1; /* Increase chroma pointer every two pixels */ - } else { /* Single block width */ - pc++; /* Increase chroma pointer every pixel */ - } - yy = *py++; /* Get Y component */ - - /* Convert YCbCr to RGB */ - *rgb24++ = /* R */ BYTECLIP(yy + ((INT)(1.402 * CVACC) * cr) / CVACC); - *rgb24++ = /* G */ BYTECLIP(yy - ((INT)(0.344 * CVACC) * cb + (INT)(0.714 * CVACC) * cr) / CVACC); - *rgb24++ = /* B */ BYTECLIP(yy + ((INT)(1.772 * CVACC) * cb) / CVACC); - } - } - - /* Descale the MCU rectangular if needed */ - if (JD_USE_SCALE && jd->scale) { - UINT x, y, r, g, b, s, w, a; - BYTE *op; - - /* Get averaged RGB value of each square correcponds to a pixel */ - s = jd->scale * 2; /* Bumber of shifts for averaging */ - w = 1 << jd->scale; /* Width of square */ - a = (mx - w) * 3; /* Bytes to skip for next line in the square */ - op = (BYTE*)jd->workbuf; - for (iy = 0; iy < my; iy += w) { - for (ix = 0; ix < mx; ix += w) { - rgb24 = (BYTE*)jd->workbuf + (iy * mx + ix) * 3; - r = g = b = 0; - for (y = 0; y < w; y++) { /* Accumulate RGB value in the square */ - for (x = 0; x < w; x++) { - r += *rgb24++; - g += *rgb24++; - b += *rgb24++; - } - rgb24 += a; - } /* Put the averaged RGB value as a pixel */ - *op++ = (BYTE)(r >> s); - *op++ = (BYTE)(g >> s); - *op++ = (BYTE)(b >> s); - } - } - } - - } else { /* For only 1/8 scaling (left-top pixel in each block are the DC value of the block) */ - - /* Build a 1/8 descaled RGB MCU from discrete comopnents */ - rgb24 = (BYTE*)jd->workbuf; - pc = jd->mcubuf + mx * my; - cb = pc[0] - 128; /* Get Cb/Cr component and restore right level */ - cr = pc[64] - 128; - for (iy = 0; iy < my; iy += 8) { - py = jd->mcubuf; - if (iy == 8) py += 64 * 2; - for (ix = 0; ix < mx; ix += 8) { - yy = *py; /* Get Y component */ - py += 64; - - /* Convert YCbCr to RGB */ - *rgb24++ = /* R */ BYTECLIP(yy + ((INT)(1.402 * CVACC) * cr / CVACC)); - *rgb24++ = /* G */ BYTECLIP(yy - ((INT)(0.344 * CVACC) * cb + (INT)(0.714 * CVACC) * cr) / CVACC); - *rgb24++ = /* B */ BYTECLIP(yy + ((INT)(1.772 * CVACC) * cb / CVACC)); - } - } - } - - /* Squeeze up pixel table if a part of MCU is to be truncated */ - mx >>= jd->scale; - if (rx < mx) { - BYTE *s, *d; - UINT x, y; - - s = d = (BYTE*)jd->workbuf; - for (y = 0; y < ry; y++) { - for (x = 0; x < rx; x++) { /* Copy effective pixels */ - *d++ = *s++; - *d++ = *s++; - *d++ = *s++; - } - s += (mx - rx) * 3; /* Skip truncated pixels */ - } - } - - /* Convert RGB888 to RGB565 if needed */ - if (JD_FORMAT == 1) { - BYTE *s = (BYTE*)jd->workbuf; - WORD w, *d = (WORD*)s; - UINT n = rx * ry; - - do { - w = (*s++ & 0xF8) << 8; /* RRRRR----------- */ - w |= (*s++ & 0xFC) << 3; /* -----GGGGGG----- */ - w |= *s++ >> 3; /* -----------BBBBB */ - *d++ = w; - } while (--n); - } - - /* Output the RGB rectangular */ - return outfunc(jd, jd->workbuf, &rect) ? JDR_OK : JDR_INTR; -} - - - - -/*-----------------------------------------------------------------------*/ -/* Process restart interval */ -/*-----------------------------------------------------------------------*/ - -static -JRESULT restart ( - JDEC* jd, /* Pointer to the decompressor object */ - WORD rstn /* Expected restert sequense number */ -) -{ - UINT i, dc; - WORD d; - BYTE *dp; - - - /* Discard padding bits and get two bytes from the input stream */ - dp = jd->dptr; dc = jd->dctr; - d = 0; - for (i = 0; i < 2; i++) { - if (!dc) { /* No input data is available, re-fill input buffer */ - dp = jd->inbuf; - dc = jd->infunc(jd, dp, JD_SZBUF); - if (!dc) return JDR_INP; - } else { - dp++; - } - dc--; - d = (d << 8) | *dp; /* Get a byte */ - } - jd->dptr = dp; jd->dctr = dc; jd->dmsk = 0; - - /* Check the marker */ - if ((d & 0xFFD8) != 0xFFD0 || (d & 7) != (rstn & 7)) - return JDR_FMT1; /* Err: expected RSTn marker is not detected (may be collapted data) */ - - /* Reset DC offset */ - jd->dcv[2] = jd->dcv[1] = jd->dcv[0] = 0; - - return JDR_OK; -} - - - - -/*-----------------------------------------------------------------------*/ -/* Analyze the JPEG image and Initialize decompressor object */ -/*-----------------------------------------------------------------------*/ - -#define LDB_WORD(ptr) (WORD)(((WORD)*((BYTE*)(ptr))<<8)|(WORD)*(BYTE*)((ptr)+1)) - - -JRESULT jd_prepare ( - JDEC* jd, /* Blank decompressor object */ - UINT (*infunc)(JDEC*, BYTE*, UINT), /* JPEG strem input function */ - void* pool, /* Working buffer for the decompression session */ - UINT sz_pool, /* Size of working buffer */ - void* dev /* I/O device identifier for the session */ -) -{ - BYTE *seg, b; - WORD marker; - DWORD ofs; - UINT n, i, j, len; - JRESULT rc; - - - if (!pool) return JDR_PAR; - - jd->pool = pool; /* Work memroy */ - jd->sz_pool = sz_pool; /* Size of given work memory */ - jd->infunc = infunc; /* Stream input function */ - jd->device = dev; /* I/O device identifier */ - jd->nrst = 0; /* No restart interval (default) */ - - for (i = 0; i < 2; i++) { /* Nulls pointers */ - for (j = 0; j < 2; j++) { - jd->huffbits[i][j] = 0; - jd->huffcode[i][j] = 0; - jd->huffdata[i][j] = 0; - } - } - for (i = 0; i < 4; i++) jd->qttbl[i] = 0; - - jd->inbuf = seg = alloc_pool(jd, JD_SZBUF); /* Allocate stream input buffer */ - if (!seg) return JDR_MEM1; - - if (jd->infunc(jd, seg, 2) != 2) return JDR_INP;/* Check SOI marker */ - if (LDB_WORD(seg) != 0xFFD8) return JDR_FMT1; /* Err: SOI is not detected */ - ofs = 2; - - for (;;) { - /* Get a JPEG marker */ - if (jd->infunc(jd, seg, 4) != 4) return JDR_INP; - marker = LDB_WORD(seg); /* Marker */ - len = LDB_WORD(seg + 2); /* Length field */ - if (len <= 2 || (marker >> 8) != 0xFF) return JDR_FMT1; - len -= 2; /* Content size excluding length field */ - ofs += 4 + len; /* Number of bytes loaded */ - - switch (marker & 0xFF) { - case 0xC0: /* SOF0 (baseline JPEG) */ - /* Load segment data */ - if (len > JD_SZBUF) return JDR_MEM2; - if (jd->infunc(jd, seg, len) != len) return JDR_INP; - - jd->width = LDB_WORD(seg+3); /* Image width in unit of pixel */ - jd->height = LDB_WORD(seg+1); /* Image height in unit of pixel */ - if (seg[5] != 3) return JDR_FMT3; /* Err: Supports only Y/Cb/Cr format */ - - /* Check three image components */ - for (i = 0; i < 3; i++) { - b = seg[7 + 3 * i]; /* Get sampling factor */ - if (!i) { /* Y component */ - if (b != 0x11 && b != 0x22 && b != 0x21)/* Check sampling factor */ - return JDR_FMT3; /* Err: Supports only 4:4:4, 4:2:0 or 4:2:2 */ - jd->msx = b >> 4; jd->msy = b & 15; /* Size of MCU [blocks] */ - } else { /* Cb/Cr component */ - if (b != 0x11) return JDR_FMT3; /* Err: Sampling factor of Cr/Cb must be 1 */ - } - b = seg[8 + 3 * i]; /* Get dequantizer table ID for this component */ - if (b > 3) return JDR_FMT3; /* Err: Invalid ID */ - jd->qtid[i] = b; - } - break; - - case 0xDD: /* DRI */ - /* Load segment data */ - if (len > JD_SZBUF) return JDR_MEM2; - if (jd->infunc(jd, seg, len) != len) return JDR_INP; - - /* Get restart interval (MCUs) */ - jd->nrst = LDB_WORD(seg); - break; - - case 0xC4: /* DHT */ - /* Load segment data */ - if (len > JD_SZBUF) return JDR_MEM2; - if (jd->infunc(jd, seg, len) != len) return JDR_INP; - - /* Create huffman tables */ - rc = create_huffman_tbl(jd, seg, len); - if (rc) return rc; - break; - - case 0xDB: /* DQT */ - /* Load segment data */ - if (len > JD_SZBUF) return JDR_MEM2; - if (jd->infunc(jd, seg, len) != len) return JDR_INP; - - /* Create de-quantizer tables */ - rc = create_qt_tbl(jd, seg, len); - if (rc) return rc; - break; - - case 0xDA: /* SOS */ - /* Load segment data */ - if (len > JD_SZBUF) return JDR_MEM2; - if (jd->infunc(jd, seg, len) != len) return JDR_INP; - - if (!jd->width || !jd->height) return JDR_FMT1; /* Err: Invalid image size */ - - if (seg[0] != 3) return JDR_FMT3; /* Err: Supports only three color components format */ - - /* Check if all tables corresponding to each components have been loaded */ - for (i = 0; i < 3; i++) { - b = seg[2 + 2 * i]; /* Get huffman table ID */ - if (b != 0x00 && b != 0x11) return JDR_FMT3; /* Err: Different table number for DC/AC element */ - b = i ? 1 : 0; - if (!jd->huffbits[b][0] || !jd->huffbits[b][1]) /* Check huffman table for this component */ - return JDR_FMT1; /* Err: Huffman table not loaded */ - if (!jd->qttbl[jd->qtid[i]]) return JDR_FMT1; /* Err: Dequantizer table not loaded */ - } - - /* Allocate working buffer for MCU and RGB */ - n = jd->msy * jd->msx; /* Number of Y blocks in the MCU */ - if (!n) return JDR_FMT1; /* Err: SOF0 has not been loaded */ - len = n * 64 * 2 + 64; /* Allocate buffer for IDCT and RGB output */ - if (len < 256) len = 256; /* but at least 256 byte is required for IDCT */ - jd->workbuf = alloc_pool(jd, len); /* and it may occupy a part of following MCU working buffer for RGB output */ - if (!jd->workbuf) return JDR_MEM1; /* Err: not enough memory */ - jd->mcubuf = alloc_pool(jd, (n + 2) * 64); /* Allocate MCU working buffer */ - if (!jd->mcubuf) return JDR_MEM1; /* Err: not enough memory */ - - /* Pre-load the JPEG data to extract it from the bit stream */ - jd->dptr = seg; jd->dctr = 0; jd->dmsk = 0; /* Prepare to read bit stream */ - if (ofs %= JD_SZBUF) { /* Align read offset to JD_SZBUF */ - jd->dctr = jd->infunc(jd, seg + ofs, JD_SZBUF - (UINT)ofs); - jd->dptr = seg + ofs - 1; - } - - return JDR_OK; /* Initialization succeeded. Ready to decompress the JPEG image. */ - - case 0xC1: /* SOF1 */ - case 0xC2: /* SOF2 */ - case 0xC3: /* SOF3 */ - case 0xC5: /* SOF5 */ - case 0xC6: /* SOF6 */ - case 0xC7: /* SOF7 */ - case 0xC9: /* SOF9 */ - case 0xCA: /* SOF10 */ - case 0xCB: /* SOF11 */ - case 0xCD: /* SOF13 */ - case 0xCE: /* SOF14 */ - case 0xCF: /* SOF15 */ - case 0xD9: /* EOI */ - return JDR_FMT3; /* Unsuppoted JPEG standard (may be progressive JPEG) */ - - default: /* Unknown segment (comment, exif or etc..) */ - /* Skip segment data */ - if (jd->infunc(jd, 0, len) != len) /* Null pointer specifies to skip bytes of stream */ - return JDR_INP; - } - } -} - - - - -/*-----------------------------------------------------------------------*/ -/* Start to decompress the JPEG picture */ -/*-----------------------------------------------------------------------*/ - -JRESULT jd_decomp ( - JDEC* jd, /* Initialized decompression object */ - UINT (*outfunc)(JDEC*, void*, JRECT*), /* RGB output function */ - BYTE scale /* Output de-scaling factor (0 to 3) */ -) -{ - UINT x, y, mx, my; - WORD rst, rsc; - JRESULT rc; - - - if (scale > (JD_USE_SCALE ? 3 : 0)) return JDR_PAR; - jd->scale = scale; - - mx = jd->msx * 8; my = jd->msy * 8; /* Size of the MCU (pixel) */ - - jd->dcv[2] = jd->dcv[1] = jd->dcv[0] = 0; /* Initialize DC values */ - rst = rsc = 0; - - rc = JDR_OK; - for (y = 0; y < jd->height; y += my) { /* Vertical loop of MCUs */ - for (x = 0; x < jd->width; x += mx) { /* Horizontal loop of MCUs */ - if (jd->nrst && rst++ == jd->nrst) { /* Process restart interval if enabled */ - rc = restart(jd, rsc++); - if (rc != JDR_OK) return rc; - rst = 1; - } - rc = mcu_load(jd); /* Load an MCU (decompress huffman coded stream and IDCT) */ - if (rc != JDR_OK) return rc; - rc = mcu_output(jd, outfunc, x, y); /* Output the MCU (color space conversion, scaling and output) */ - if (rc != JDR_OK) return rc; - } - } - - return rc; -} - - - diff --git a/examples/Advanced/Camera/tjpgd.h b/examples/Advanced/Camera/tjpgd.h deleted file mode 100644 index 7965c64..0000000 --- a/examples/Advanced/Camera/tjpgd.h +++ /dev/null @@ -1,70 +0,0 @@ -/*----------------------------------------------------------------------------/ -/ TJpgDec - Tiny JPEG Decompressor include file (C)ChaN, 2011 -/----------------------------------------------------------------------------*/ - -/* System Configurations */ - -#define JD_SZBUF 512 /* Size of stream input buffer (should be multiple of 512) */ -#define JD_FORMAT 0 /* Output RGB format 0:RGB888 (3 BYTE/pix), 1:RGB565 (1 WORD/pix) */ -#define JD_USE_SCALE 1 /* Use descaling feature for output */ - - -/*---------------------------------------------------------------------------*/ - -#include "integer.h" - - -/* Error code */ -typedef enum { - JDR_OK = 0, /* 0: Succeeded */ - JDR_INTR, /* 1: Interrupted by output function */ - JDR_INP, /* 2: Device error or wrong termination of input stream */ - JDR_MEM1, /* 3: Insufficient memory pool for the image */ - JDR_MEM2, /* 4: Insufficient stream input buffer */ - JDR_PAR, /* 5: Parameter error */ - JDR_FMT1, /* 6: Data format error (may be damaged data) */ - JDR_FMT2, /* 7: Right format but not supported */ - JDR_FMT3 /* 8: Not supported JPEG standard */ -} JRESULT; - - -typedef struct { - WORD left, right, top, bottom; -} JRECT; - - -/* Decompressor object structure */ -typedef struct JDEC JDEC; -struct JDEC { - UINT dctr; /* Number of bytes available in the input buffer */ - BYTE* dptr; /* Current data read ptr */ - BYTE* inbuf; /* Bit stream input buffer */ - BYTE dmsk; /* Current bit in the current read byte */ - BYTE scale; /* Output scaling ratio */ - BYTE msx, msy; /* MCU size in unit of block (width, height) */ - BYTE qtid[3]; /* Quantization table ID of each component */ - SHORT dcv[3]; /* Previous DC element of each component */ - WORD nrst; /* Restart inverval */ - UINT width, height; /* Size of the input image (pixel) */ - BYTE* huffbits[2][2]; /* Huffman bit distribution tables [id][dcac] */ - WORD* huffcode[2][2]; /* Huffman code word tables [id][dcac] */ - BYTE* huffdata[2][2]; /* Huffman decoded data tables [id][dcac] */ - LONG* qttbl[4]; /* Dequaitizer tables [id] */ - void* workbuf; /* Working buffer for IDCT and RGB output */ - BYTE* mcubuf; /* Working buffer for the MCU */ - void* pool; /* Pointer to available memory pool */ - UINT sz_pool; /* Size of momory pool (bytes available) */ - UINT (*infunc)(JDEC*, BYTE*, UINT);/* Pointer to jpeg stream input function */ - UINT (*outfunc)(JDEC*, void*, JRECT*); /* Pointer to RGB output function */ - void* device; /* Pointer to I/O device identifiler for the session */ -}; - - -#define LDB_WORD(ptr) (WORD)(((WORD)*((BYTE*)(ptr))<<8)|(WORD)*(BYTE*)((ptr)+1)) - - - -/* TJpgDec API functions */ -JRESULT jd_prepare (JDEC*, UINT(*)(JDEC*,BYTE*,UINT), void*, UINT, void*); -JRESULT jd_decomp (JDEC*, UINT(*)(JDEC*,void*,JRECT*), BYTE); - diff --git a/examples/Advanced/Changer/Changer.ino b/examples/Advanced/Changer/Changer.ino deleted file mode 100644 index 5ecf479..0000000 --- a/examples/Advanced/Changer/Changer.ino +++ /dev/null @@ -1,61 +0,0 @@ -/* - Blink - Turns on an LED on for one second, then off for one second, repeatedly. - - Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO - it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to - the correct LED pin independent of which board is used. - If you want to know what pin the on-board LED is connected to on your Arduino model, check - the Technical Specs of your board at https://www.arduino.cc/en/Main/Products - - This example code is in the public domain. - - modified 8 May 2014 - by Scott Fitzgerald - - modified 2 Sep 2016 - by Arturo Guadalupi - - modified 8 Sep 2016 - by Colby Newman -*/ - -#include - -// the setup function runs once when you press reset or power the board -void setup() { - // initialize the M5Stack object - // m5.begin(); - Wire.begin(); - Serial.begin(115200); - Serial.printf("start\r\n"); - - // initialize digital pin LED_BUILTIN as an output. - // pinMode(LED_PIN, OUTPUT); -} - -// the loop function runs over and over again forever -void loop() { - uint8_t data1, data2; - Wire.beginTransmission(0x75); - Wire.write(0xa3); - Wire.endTransmission(); - - Wire.requestFrom((int)0x75, 1); - - // while(Wire.available()) - { - data1 = Wire.read(); // receive a byte as character - // data2 = Wire.read(); // receive a byte as character - // Serial.printf("data: 0x%x, 0x%x\r\n", data1, data2); - Serial.printf("data: 0x%x\r\n", data1); - } - - // Wire.beginTransmission(0x75); - // Wire.write(2); - // Wire.write((uint8_t)0x78); - // // Wire.write((uint8_t)0x78); - // Wire.endTransmission(); - - delay(2000); -} diff --git a/examples/Advanced/ParamConfig/ParamConfig.ino b/examples/Advanced/ParamConfig/ParamConfig.ino deleted file mode 100644 index c93f7e6..0000000 --- a/examples/Advanced/ParamConfig/ParamConfig.ino +++ /dev/null @@ -1,81 +0,0 @@ -#include -#include - -bool getParamFromTFCard(const char* filename, const char* keyword, char* strout) { - // fs file read - File fsFile; - uint8_t fsbuffer[255]; - // const char* filename = "/azure-config.json"; - if(SD.exists(filename)) { - fsFile = SD.open(filename, "r"); - if(fsFile) { - Serial.printf("Success open file:\r\n"); - fsFile.read(fsbuffer, fsFile.size()); - Serial.printf("\r\n"); - fsbuffer[fsFile.size()] = 0; - Serial.printf("%s", fsbuffer); - } else { - Serial.printf("Fail open file!\r\n"); - return false; - } - } - - // Memory pool for JSON object tree. - // - // Inside the brackets, 200 is the size of the pool in bytes, - // If the JSON object is more complex, you need to increase that value. - StaticJsonBuffer<200> jsonBuffer; - - // StaticJsonBuffer allocates memory on the stack, it can be - // replaced by DynamicJsonBuffer which allocates in the heap. - // It's simpler but less efficient. - // - // DynamicJsonBuffer jsonBuffer; - - // Root of the object tree. - // - // It's a reference to the JsonObject, the actual bytes are inside the - // JsonBuffer with all the other nodes of the object tree. - // Memory is freed when jsonBuffer goes out of scope. - JsonObject& root = jsonBuffer.parseObject(fsbuffer); - - // Test if parsing succeeds. - if (!root.success()) { - Serial.println("parseObject() failed"); - return false; - } - - // Fetch values. - // - // Most of the time, you can rely on the implicit casts. - // In other case, you can do root["time"].as(); - const char* value = root[keyword]; - - // Copy values. - strcpy((char*)strout, value); - Serial.printf("Keyword:%s\r\nValue:%s\r\n", keyword, strout); - return true; -} - -// the setup routine runs once when M5Stack starts up -void setup(){ - - // initialize the M5Stack object - m5.begin(); - - // lcd display - m5.lcd.printf("JSON test"); - - char ssid[30]; - if(getParamFromTFCard("/azure-config.json", "WiFi_SSID", ssid)) { - Serial.printf("Read Value:%s", ssid); - } - -} - -// the loop routine runs over and over again forever -void loop(){ - - m5.loop(); -} - diff --git a/examples/Advanced/ParamConfig/azure-config.json b/examples/Advanced/ParamConfig/azure-config.json deleted file mode 100644 index 07c5159..0000000 --- a/examples/Advanced/ParamConfig/azure-config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "WiFi_SSID":"MasterHax_2.4G", - "WiFi_PASSWORD":"wittyercheese551", - "AzureDeviceID":"test001", - "ConnectingString":"m5statck-abcde" -} \ No newline at end of file diff --git a/examples/Advanced/TFCardPicture/TFCardPicture.ino b/examples/Advanced/TFCardPicture/TFCardPicture.ino deleted file mode 100644 index 5aac1ba..0000000 --- a/examples/Advanced/TFCardPicture/TFCardPicture.ino +++ /dev/null @@ -1,18 +0,0 @@ -#include - -// the setup routine runs once when M5Stack starts up -void setup(){ - // initialize the M5Stack object - m5.begin(); -} - -// the loop routine runs over and over again forever -void loop(){ - - m5.lcd.drawPicture("/ROBOT2.bmp"); - m5.lcd.drawPicture("/ROBOT3.bmp"); - m5.lcd.drawPicture("/ROBOT4.bmp"); - m5.lcd.drawPicture("/ROBOT5.bmp"); - - m5.loop(); -} diff --git a/examples/Advanced/WavPlayer/WavPlayer.ino b/examples/Advanced/WavPlayer/WavPlayer.ino deleted file mode 100644 index f7c2a79..0000000 --- a/examples/Advanced/WavPlayer/WavPlayer.ino +++ /dev/null @@ -1,135 +0,0 @@ -/* -wavPlayer -Madnerd.org -Primitive wav file player -Only read : Wav Unsigned 8-bit PCM file -Track will stopped if saturation -If you want to make a real mp3 player , use a DFPlayer Mini instead -This is just a proof of concept. -Components -- Micro SD card adapter -- Headphone input -- 2 buttons -- Arduino mini pro 3v -* Open MP3 with Audacity -* File/Export Audio -* Save as type: Other uncompressed files -* Header: Wav (Microsoft) -* Encoding : Unsigned 8_bit PCM -* Save to 0.wav -Wiring: -SD card -1 --> X -2 --> 12 -3 --> GND -4 --> 13 -5 --> VCC -6 --> GND -7 --> 11 -8 --> 10 (Chip select) -Audio: 6 -Button Previous track: 7 -Button Next track:8 -Source: http://garagelab.com/profiles/blogs/tutorial-playing-music-with-garagino-or-arduino-wav-player -*/ -// #include -// #include -#include - -File myFile; -const int b_prev = 8; -const int b_next = 7; -int file = 1; -bool playing = true; -String string_filename; -char* filename; -int check_buttons = 0; - -void setup() { - // // Open serial communications and wait for port to open: - // Serial.begin(115200); - // // pinMode(6, OUTPUT); - // // TCCR0B = 0x01; // Sets the PWM frequency to 64KHz in pins 5 and 6. - // //while (!Serial) { - // // ; // wait for serial port to connect. Needed for native USB port only - // //} - - // Serial.print("Initializing SD card..."); - // while (!SD.begin(10)) { - // Serial.println("initialization failed!"); - // } - - // Serial.println("initialization done."); - - //Enable buttons - // pinMode(b_prev, INPUT_PULLUP); - // pinMode(b_next, INPUT_PULLUP); - m5.begin(); -} - -void loop() { - //Convert string to char - // string_filename = String(file) + ".wav"; - // string_filename = "/1.wav"; - // string_filename = "/500miles.wav"; - string_filename = "/8k8bitpcm.wav"; - unsigned int bufSize = string_filename.length() + 1; //String length + null terminator - filename = new char[bufSize]; - string_filename.toCharArray(filename, bufSize); - - if (SD.exists(filename)) { - Serial.println(string_filename); - myFile = SD.open(filename, FILE_READ); - } - else { - Serial.println(string_filename + "doesn't exists"); - file = 0; - } - - unsigned char data; - for (int count = 0; count < 128; count++) { - data = myFile.read(); - } - Serial.println("Start"); - playing = true; - check_buttons = 0; - while (data != 255) { - data = myFile.read(); - dacWrite(25, data); - // analogWrite(6, data); - // delayMicroseconds(10); - delayMicroseconds(125); - // checkButtons(); - - if (!playing) { - break; - } - } - - //Serial.println("Stop"); - myFile.close(); - Serial.println("Replay"); - // nothing happens after setup finishes. - delay(1000); -} - -// void checkButtons() { -// check_buttons++; -// //We reduce check because our arduino is really time sensitive when reading wav files. -// if (check_buttons == 1000) { -// check_buttons = 0; -// if (!digitalRead(b_prev)) { -// Serial.println("Button previous"); -// file--; -// playing = false; -// delay(1000); -// } - -// if (!digitalRead(b_next)) { -// Serial.println("Button next"); -// file++; -// playing = false; -// delay(1000); -// } -// } -// } diff --git a/examples/Advanced/httpUpdate/ESP8266HTTPClient.cpp b/examples/Advanced/httpUpdate/ESP8266HTTPClient.cpp deleted file mode 100644 index de1fde4..0000000 --- a/examples/Advanced/httpUpdate/ESP8266HTTPClient.cpp +++ /dev/null @@ -1,1119 +0,0 @@ -/** - * ESP8266HTTPClient.cpp - * - * Created on: 02.11.2015 - * - * Copyright (c) 2015 Markus Sattler. All rights reserved. - * This file is part of the ESP8266HTTPClient for Arduino. - * - * 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 -#include -#include - -#include "ESP8266HTTPClient.h" - -class TransportTraits -{ -public: - virtual ~TransportTraits() - { - } - - virtual std::unique_ptr create() - { - return std::unique_ptr(new WiFiClient()); - } - - virtual bool verify(WiFiClient& client, const char* host) - { - return true; - } -}; - -class TLSTraits : public TransportTraits -{ -public: - TLSTraits(const String& fingerprint) : - _fingerprint(fingerprint) - { - } - - std::unique_ptr create() override - { - // return std::unique_ptr(new WiFiClientSecure()); - } - - bool verify(WiFiClient& client, const char* host) override - { - // auto wcs = static_cast(client); - // return wcs.verify(_fingerprint.c_str(), host); - } - -protected: - String _fingerprint; -}; - -/** - * constructor - */ -HTTPClient::HTTPClient() -{ -} - -/** - * destructor - */ -HTTPClient::~HTTPClient() -{ - if(_tcp) { - _tcp->stop(); - } - if(_currentHeaders) { - delete[] _currentHeaders; - } -} - -void HTTPClient::clear() -{ - _returnCode = 0; - _size = -1; - _headers = ""; -} - - -bool HTTPClient::begin(String url, String httpsFingerprint) -{ - _transportTraits.reset(nullptr); - _port = 443; - if (httpsFingerprint.length() == 0) { - return false; - } - if (!beginInternal(url, "https")) { - return false; - } - _transportTraits = TransportTraitsPtr(new TLSTraits(httpsFingerprint)); - DEBUG_HTTPCLIENT("[HTTP-Client][begin] httpsFingerprint: %s\n", httpsFingerprint.c_str()); - return true; -} - -/** - * parsing the url for all needed parameters - * @param url String - */ -bool HTTPClient::begin(String url) -{ - _transportTraits.reset(nullptr); - _port = 80; - if (!beginInternal(url, "http")) { - return false; - } - _transportTraits = TransportTraitsPtr(new TransportTraits()); - return true; -} - -bool HTTPClient::beginInternal(String url, const char* expectedProtocol) -{ - DEBUG_HTTPCLIENT("[HTTP-Client][begin] url: %s\n", url.c_str()); - bool hasPort = false; - clear(); - - // check for : (http: or https: - int index = url.indexOf(':'); - if(index < 0) { - DEBUG_HTTPCLIENT("[HTTP-Client][begin] failed to parse protocol\n"); - return false; - } - - _protocol = url.substring(0, index); - url.remove(0, (index + 3)); // remove http:// or https:// - - index = url.indexOf('/'); - String host = url.substring(0, index); - url.remove(0, index); // remove host part - - // get Authorization - index = host.indexOf('@'); - if(index >= 0) { - // auth info - String auth = host.substring(0, index); - host.remove(0, index + 1); // remove auth part including @ - _base64Authorization = base64::encode(auth); - } - - // get port - index = host.indexOf(':'); - if(index >= 0) { - _host = host.substring(0, index); // hostname - host.remove(0, (index + 1)); // remove hostname + : - _port = host.toInt(); // get port - } else { - _host = host; - } - _uri = url; - if (_protocol != expectedProtocol) { - DEBUG_HTTPCLIENT("[HTTP-Client][begin] unexpected protocol: %s, expected %s\n", _protocol.c_str(), expectedProtocol); - return false; - } - DEBUG_HTTPCLIENT("[HTTP-Client][begin] host: %s port: %d url: %s\n", _host.c_str(), _port, _uri.c_str()); - return true; -} - -bool HTTPClient::begin(String host, uint16_t port, String uri) -{ - clear(); - _host = host; - _port = port; - _uri = uri; - _transportTraits = TransportTraitsPtr(new TransportTraits()); - DEBUG_HTTPCLIENT("[HTTP-Client][begin] host: %s port: %d uri: %s\n", host.c_str(), port, uri.c_str()); - return true; -} - -bool HTTPClient::begin(String host, uint16_t port, String uri, bool https, String httpsFingerprint) -{ - if (https) { - return begin(host, port, uri, httpsFingerprint); - } else { - return begin(host, port, uri); - } -} - -bool HTTPClient::begin(String host, uint16_t port, String uri, String httpsFingerprint) -{ - clear(); - _host = host; - _port = port; - _uri = uri; - - if (httpsFingerprint.length() == 0) { - return false; - } - _transportTraits = TransportTraitsPtr(new TLSTraits(httpsFingerprint)); - DEBUG_HTTPCLIENT("[HTTP-Client][begin] host: %s port: %d url: %s httpsFingerprint: %s\n", host.c_str(), port, uri.c_str(), httpsFingerprint.c_str()); - return true; -} - -/** - * end - * called after the payload is handled - */ -void HTTPClient::end(void) -{ - if(connected()) { - if(_tcp->available() > 0) { - DEBUG_HTTPCLIENT("[HTTP-Client][end] still data in buffer (%d), clean up.\n", _tcp->available()); - while(_tcp->available() > 0) { - _tcp->read(); - } - } - if(_reuse && _canReuse) { - DEBUG_HTTPCLIENT("[HTTP-Client][end] tcp keep open for reuse\n"); - } else { - DEBUG_HTTPCLIENT("[HTTP-Client][end] tcp stop\n"); - _tcp->stop(); - } - } else { - DEBUG_HTTPCLIENT("[HTTP-Client][end] tcp is closed\n"); - } -} - -/** - * connected - * @return connected status - */ -bool HTTPClient::connected() -{ - if(_tcp) { - return (_tcp->connected() || (_tcp->available() > 0)); - } - return false; -} - -/** - * try to reuse the connection to the server - * keep-alive - * @param reuse bool - */ -void HTTPClient::setReuse(bool reuse) -{ - _reuse = reuse; -} - -/** - * set User Agent - * @param userAgent const char * - */ -void HTTPClient::setUserAgent(const String& userAgent) -{ - _userAgent = userAgent; -} - -/** - * set the Authorizatio for the http request - * @param user const char * - * @param password const char * - */ -void HTTPClient::setAuthorization(const char * user, const char * password) -{ - if(user && password) { - String auth = user; - auth += ":"; - auth += password; - _base64Authorization = base64::encode(auth); - } -} - -/** - * set the Authorizatio for the http request - * @param auth const char * base64 - */ -void HTTPClient::setAuthorization(const char * auth) -{ - if(auth) { - _base64Authorization = auth; - } -} - -/** - * set the timeout for the TCP connection - * @param timeout unsigned int - */ -void HTTPClient::setTimeout(uint16_t timeout) -{ - _tcpTimeout = timeout; - if(connected()) { - _tcp->setTimeout(timeout); - } -} - -/** - * use HTTP1.0 - * @param timeout - */ -void HTTPClient::useHTTP10(bool useHTTP10) -{ - _useHTTP10 = useHTTP10; -} - -/** - * send a GET request - * @return http code - */ -int HTTPClient::GET() -{ - return sendRequest("GET"); -} - -/** - * sends a post request to the server - * @param payload uint8_t * - * @param size size_t - * @return http code - */ -int HTTPClient::POST(uint8_t * payload, size_t size) -{ - return sendRequest("POST", payload, size); -} - -int HTTPClient::POST(String payload) -{ - return POST((uint8_t *) payload.c_str(), payload.length()); -} - -/** - * sends a put request to the server - * @param payload uint8_t * - * @param size size_t - * @return http code - */ -int HTTPClient::PUT(uint8_t * payload, size_t size) { - return sendRequest("PUT", payload, size); -} - -int HTTPClient::PUT(String payload) { - return PUT((uint8_t *) payload.c_str(), payload.length()); -} - -/** - * sendRequest - * @param type const char * "GET", "POST", .... - * @param payload String data for the message body - * @return - */ -int HTTPClient::sendRequest(const char * type, String payload) -{ - return sendRequest(type, (uint8_t *) payload.c_str(), payload.length()); -} - -/** - * sendRequest - * @param type const char * "GET", "POST", .... - * @param payload uint8_t * data for the message body if null not send - * @param size size_t size for the message body if 0 not send - * @return -1 if no info or > 0 when Content-Length is set by server - */ -int HTTPClient::sendRequest(const char * type, uint8_t * payload, size_t size) -{ - // connect to server - if(!connect()) { - return returnError(HTTPC_ERROR_CONNECTION_REFUSED); - } - - if(payload && size > 0) { - addHeader(F("Content-Length"), String(size)); - } - - // send Header - if(!sendHeader(type)) { - return returnError(HTTPC_ERROR_SEND_HEADER_FAILED); - } - - // send Payload if needed - if(payload && size > 0) { - if(_tcp->write(&payload[0], size) != size) { - return returnError(HTTPC_ERROR_SEND_PAYLOAD_FAILED); - } - } - - // handle Server Response (Header) - return returnError(handleHeaderResponse()); -} - -/** - * sendRequest - * @param type const char * "GET", "POST", .... - * @param stream Stream * data stream for the message body - * @param size size_t size for the message body if 0 not Content-Length is send - * @return -1 if no info or > 0 when Content-Length is set by server - */ -int HTTPClient::sendRequest(const char * type, Stream * stream, size_t size) -{ - - if(!stream) { - return returnError(HTTPC_ERROR_NO_STREAM); - } - - // connect to server - if(!connect()) { - return returnError(HTTPC_ERROR_CONNECTION_REFUSED); - } - - if(size > 0) { - addHeader("Content-Length", String(size)); - } - - // send Header - if(!sendHeader(type)) { - return returnError(HTTPC_ERROR_SEND_HEADER_FAILED); - } - - int buff_size = HTTP_TCP_BUFFER_SIZE; - - int len = size; - int bytesWritten = 0; - - if(len == 0) { - len = -1; - } - - // if possible create smaller buffer then HTTP_TCP_BUFFER_SIZE - if((len > 0) && (len < HTTP_TCP_BUFFER_SIZE)) { - buff_size = len; - } - - // create buffer for read - uint8_t * buff = (uint8_t *) malloc(buff_size); - - if(buff) { - // read all data from stream and send it to server - while(connected() && (stream->available() > -1) && (len > 0 || len == -1)) { - - // get available data size - int sizeAvailable = stream->available(); - - if(sizeAvailable) { - - int readBytes = sizeAvailable; - - // read only the asked bytes - if(len > 0 && readBytes > len) { - readBytes = len; - } - - // not read more the buffer can handle - if(readBytes > buff_size) { - readBytes = buff_size; - } - - // read data - int bytesRead = stream->readBytes(buff, readBytes); - - // write it to Stream - int bytesWrite = _tcp->write((const uint8_t *) buff, bytesRead); - bytesWritten += bytesWrite; - - // are all Bytes a writen to stream ? - if(bytesWrite != bytesRead) { - DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] short write, asked for %d but got %d retry...\n", bytesRead, bytesWrite); - - // check for write error - if(_tcp->getWriteError()) { - DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] stream write error %d\n", _tcp->getWriteError()); - - //reset write error for retry - _tcp->clearWriteError(); - } - - // some time for the stream - delay(1); - - int leftBytes = (readBytes - bytesWrite); - - // retry to send the missed bytes - bytesWrite = _tcp->write((const uint8_t *) (buff + bytesWrite), leftBytes); - bytesWritten += bytesWrite; - - if(bytesWrite != leftBytes) { - // failed again - DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] short write, asked for %d but got %d failed.\n", leftBytes, bytesWrite); - free(buff); - return returnError(HTTPC_ERROR_SEND_PAYLOAD_FAILED); - } - } - - // check for write error - if(_tcp->getWriteError()) { - DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] stream write error %d\n", _tcp->getWriteError()); - free(buff); - return returnError(HTTPC_ERROR_SEND_PAYLOAD_FAILED); - } - - // count bytes to read left - if(len > 0) { - len -= readBytes; - } - - delay(0); - } else { - delay(1); - } - } - - free(buff); - - if(size && (int) size != bytesWritten) { - DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] Stream payload bytesWritten %d and size %d mismatch!.\n", bytesWritten, size); - DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] ERROR SEND PAYLOAD FAILED!"); - return returnError(HTTPC_ERROR_SEND_PAYLOAD_FAILED); - } else { - DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] Stream payload written: %d\n", bytesWritten); - } - - } else { - DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] too less ram! need %d\n", HTTP_TCP_BUFFER_SIZE); - return returnError(HTTPC_ERROR_TOO_LESS_RAM); - } - - // handle Server Response (Header) - return returnError(handleHeaderResponse()); -} - -/** - * size of message body / payload - * @return -1 if no info or > 0 when Content-Length is set by server - */ -int HTTPClient::getSize(void) -{ - return _size; -} - -/** - * returns the stream of the tcp connection - * @return WiFiClient - */ -WiFiClient& HTTPClient::getStream(void) -{ - if(connected()) { - return *_tcp; - } - - DEBUG_HTTPCLIENT("[HTTP-Client] getStream: not connected\n"); - static WiFiClient empty; - return empty; -} - -/** - * returns the stream of the tcp connection - * @return WiFiClient * - */ -WiFiClient* HTTPClient::getStreamPtr(void) -{ - if(connected()) { - return _tcp.get(); - } - - DEBUG_HTTPCLIENT("[HTTP-Client] getStreamPtr: not connected\n"); - return nullptr; -} - -/** - * write all message body / payload to Stream - * @param stream Stream * - * @return bytes written ( negative values are error codes ) - */ -int HTTPClient::writeToStream(Stream * stream) -{ - - if(!stream) { - return returnError(HTTPC_ERROR_NO_STREAM); - } - - if(!connected()) { - return returnError(HTTPC_ERROR_NOT_CONNECTED); - } - - // get length of document (is -1 when Server sends no Content-Length header) - int len = _size; - int ret = 0; - - if(_transferEncoding == HTTPC_TE_IDENTITY) { - ret = writeToStreamDataBlock(stream, len); - - // have we an error? - if(ret < 0) { - return returnError(ret); - } - } else if(_transferEncoding == HTTPC_TE_CHUNKED) { - int size = 0; - while(1) { - if(!connected()) { - return returnError(HTTPC_ERROR_CONNECTION_LOST); - } - String chunkHeader = _tcp->readStringUntil('\n'); - - if(chunkHeader.length() <= 0) { - return returnError(HTTPC_ERROR_READ_TIMEOUT); - } - - chunkHeader.trim(); // remove \r - - // read size of chunk - len = (uint32_t) strtol((const char *) chunkHeader.c_str(), NULL, 16); - size += len; - DEBUG_HTTPCLIENT("[HTTP-Client] read chunk len: %d\n", len); - - // data left? - if(len > 0) { - int r = writeToStreamDataBlock(stream, len); - if(r < 0) { - // error in writeToStreamDataBlock - return returnError(r); - } - ret += r; - } else { - - // if no length Header use global chunk size - if(_size <= 0) { - _size = size; - } - - // check if we have write all data out - if(ret != _size) { - return returnError(HTTPC_ERROR_STREAM_WRITE); - } - break; - } - - // read trailing \r\n at the end of the chunk - char buf[2]; - auto trailing_seq_len = _tcp->readBytes((uint8_t*)buf, 2); - if (trailing_seq_len != 2 || buf[0] != '\r' || buf[1] != '\n') { - return returnError(HTTPC_ERROR_READ_TIMEOUT); - } - - delay(0); - } - } else { - return returnError(HTTPC_ERROR_ENCODING); - } - - end(); - return ret; -} - -/** - * return all payload as String (may need lot of ram or trigger out of memory!) - * @return String - */ -String HTTPClient::getString(void) -{ - StreamString sstring; - - if(_size) { - // try to reserve needed memmory - if(!sstring.reserve((_size + 1))) { - DEBUG_HTTPCLIENT("[HTTP-Client][getString] not enough memory to reserve a string! need: %d\n", (_size + 1)); - return ""; - } - } - - writeToStream(&sstring); - return sstring; -} - -/** - * converts error code to String - * @param error int - * @return String - */ -String HTTPClient::errorToString(int error) -{ - switch(error) { - case HTTPC_ERROR_CONNECTION_REFUSED: - return F("connection refused"); - case HTTPC_ERROR_SEND_HEADER_FAILED: - return F("send header failed"); - case HTTPC_ERROR_SEND_PAYLOAD_FAILED: - return F("send payload failed"); - case HTTPC_ERROR_NOT_CONNECTED: - return F("not connected"); - case HTTPC_ERROR_CONNECTION_LOST: - return F("connection lost"); - case HTTPC_ERROR_NO_STREAM: - return F("no stream"); - case HTTPC_ERROR_NO_HTTP_SERVER: - return F("no HTTP server"); - case HTTPC_ERROR_TOO_LESS_RAM: - return F("too less ram"); - case HTTPC_ERROR_ENCODING: - return F("Transfer-Encoding not supported"); - case HTTPC_ERROR_STREAM_WRITE: - return F("Stream write error"); - case HTTPC_ERROR_READ_TIMEOUT: - return F("read Timeout"); - default: - return String(); - } -} - -/** - * adds Header to the request - * @param name - * @param value - * @param first - */ -void HTTPClient::addHeader(const String& name, const String& value, bool first, bool replace) -{ - // not allow set of Header handled by code - if(!name.equalsIgnoreCase(F("Connection")) && - !name.equalsIgnoreCase(F("User-Agent")) && - !name.equalsIgnoreCase(F("Host")) && - !(name.equalsIgnoreCase(F("Authorization")) && _base64Authorization.length())){ - - String headerLine = name; - headerLine += ": "; - - if (replace) { - int headerStart = _headers.indexOf(headerLine); - if (headerStart != -1) { - int headerEnd = _headers.indexOf('\n', headerStart); - _headers = _headers.substring(0, headerStart) + _headers.substring(headerEnd + 1); - } - } - - headerLine += value; - headerLine += "\r\n"; - if(first) { - _headers = headerLine + _headers; - } else { - _headers += headerLine; - } - } - -} - -void HTTPClient::collectHeaders(const char* headerKeys[], const size_t headerKeysCount) -{ - _headerKeysCount = headerKeysCount; - if(_currentHeaders) { - delete[] _currentHeaders; - } - _currentHeaders = new RequestArgument[_headerKeysCount]; - for(size_t i = 0; i < _headerKeysCount; i++) { - _currentHeaders[i].key = headerKeys[i]; - } -} - -String HTTPClient::header(const char* name) -{ - for(size_t i = 0; i < _headerKeysCount; ++i) { - if(_currentHeaders[i].key == name) { - return _currentHeaders[i].value; - } - } - return String(); -} - -String HTTPClient::header(size_t i) -{ - if(i < _headerKeysCount) { - return _currentHeaders[i].value; - } - return String(); -} - -String HTTPClient::headerName(size_t i) -{ - if(i < _headerKeysCount) { - return _currentHeaders[i].key; - } - return String(); -} - -int HTTPClient::headers() -{ - return _headerKeysCount; -} - -bool HTTPClient::hasHeader(const char* name) -{ - for(size_t i = 0; i < _headerKeysCount; ++i) { - if((_currentHeaders[i].key == name) && (_currentHeaders[i].value.length() > 0)) { - return true; - } - } - return false; -} - -/** - * init TCP connection and handle ssl verify if needed - * @return true if connection is ok - */ -bool HTTPClient::connect(void) -{ - - if(connected()) { - DEBUG_HTTPCLIENT("[HTTP-Client] connect. already connected, try reuse!\n"); - while(_tcp->available() > 0) { - _tcp->read(); - } - return true; - } - - if (!_transportTraits) { - DEBUG_HTTPCLIENT("[HTTP-Client] connect: HTTPClient::begin was not called or returned error\n"); - return false; - } - - _tcp = _transportTraits->create(); - - if(!_tcp->connect(_host.c_str(), _port)) { - DEBUG_HTTPCLIENT("[HTTP-Client] failed connect to %s:%u\n", _host.c_str(), _port); - return false; - } - - DEBUG_HTTPCLIENT("[HTTP-Client] connected to %s:%u\n", _host.c_str(), _port); - - if (!_transportTraits->verify(*_tcp, _host.c_str())) { - DEBUG_HTTPCLIENT("[HTTP-Client] transport level verify failed\n"); - _tcp->stop(); - return false; - } - - // set Timeout for readBytesUntil and readStringUntil - _tcp->setTimeout(_tcpTimeout); - -#ifdef ESP8266 - _tcp->setNoDelay(true); -#endif - return connected(); -} - -/** - * sends HTTP request header - * @param type (GET, POST, ...) - * @return status - */ -bool HTTPClient::sendHeader(const char * type) -{ - if(!connected()) { - return false; - } - - String header = String(type) + " " + _uri + F(" HTTP/1."); - - if(_useHTTP10) { - header += "0"; - } else { - header += "1"; - } - - header += String(F("\r\nHost: ")) + _host; - if (_port != 80 && _port != 443) - { - header += ':'; - header += String(_port); - } - header += String(F("\r\nUser-Agent: ")) + _userAgent + - F("\r\nConnection: "); - - if(_reuse) { - header += F("keep-alive"); - } else { - header += F("close"); - } - header += "\r\n"; - - if(!_useHTTP10) { - header += F("Accept-Encoding: identity;q=1,chunked;q=0.1,*;q=0\r\n"); - } - - if(_base64Authorization.length()) { - _base64Authorization.replace("\n", ""); - header += F("Authorization: Basic "); - header += _base64Authorization; - header += "\r\n"; - } - - header += _headers + "\r\n"; - - return (_tcp->write((const uint8_t *) header.c_str(), header.length()) == header.length()); -} - -/** - * reads the response from the server - * @return int http code - */ -int HTTPClient::handleHeaderResponse() -{ - - if(!connected()) { - return HTTPC_ERROR_NOT_CONNECTED; - } - - String transferEncoding; - _returnCode = -1; - _size = -1; - _transferEncoding = HTTPC_TE_IDENTITY; - unsigned long lastDataTime = millis(); - - while(connected()) { - size_t len = _tcp->available(); - if(len > 0) { - String headerLine = _tcp->readStringUntil('\n'); - headerLine.trim(); // remove \r - - lastDataTime = millis(); - - DEBUG_HTTPCLIENT("[HTTP-Client][handleHeaderResponse] RX: '%s'\n", headerLine.c_str()); - - if(headerLine.startsWith("HTTP/1.")) { - _returnCode = headerLine.substring(9, headerLine.indexOf(' ', 9)).toInt(); - } else if(headerLine.indexOf(':')) { - String headerName = headerLine.substring(0, headerLine.indexOf(':')); - String headerValue = headerLine.substring(headerLine.indexOf(':') + 1); - headerValue.trim(); - - if(headerName.equalsIgnoreCase("Content-Length")) { - _size = headerValue.toInt(); - } - - if(headerName.equalsIgnoreCase("Connection")) { - _canReuse = headerValue.equalsIgnoreCase("keep-alive"); - } - - if(headerName.equalsIgnoreCase("Transfer-Encoding")) { - transferEncoding = headerValue; - } - - for(size_t i = 0; i < _headerKeysCount; i++) { - if(_currentHeaders[i].key.equalsIgnoreCase(headerName)) { - _currentHeaders[i].value = headerValue; - break; - } - } - } - - if(headerLine == "") { - DEBUG_HTTPCLIENT("[HTTP-Client][handleHeaderResponse] code: %d\n", _returnCode); - - if(_size > 0) { - DEBUG_HTTPCLIENT("[HTTP-Client][handleHeaderResponse] size: %d\n", _size); - } - - if(transferEncoding.length() > 0) { - DEBUG_HTTPCLIENT("[HTTP-Client][handleHeaderResponse] Transfer-Encoding: %s\n", transferEncoding.c_str()); - if(transferEncoding.equalsIgnoreCase("chunked")) { - _transferEncoding = HTTPC_TE_CHUNKED; - } else { - return HTTPC_ERROR_ENCODING; - } - } else { - _transferEncoding = HTTPC_TE_IDENTITY; - } - - if(_returnCode) { - return _returnCode; - } else { - DEBUG_HTTPCLIENT("[HTTP-Client][handleHeaderResponse] Remote host is not an HTTP Server!"); - return HTTPC_ERROR_NO_HTTP_SERVER; - } - } - - } else { - if((millis() - lastDataTime) > _tcpTimeout) { - return HTTPC_ERROR_READ_TIMEOUT; - } - delay(0); - } - } - - return HTTPC_ERROR_CONNECTION_LOST; -} - -/** - * write one Data Block to Stream - * @param stream Stream * - * @param size int - * @return < 0 = error >= 0 = size written - */ -int HTTPClient::writeToStreamDataBlock(Stream * stream, int size) -{ - int buff_size = HTTP_TCP_BUFFER_SIZE; - int len = size; - int bytesWritten = 0; - - // if possible create smaller buffer then HTTP_TCP_BUFFER_SIZE - if((len > 0) && (len < HTTP_TCP_BUFFER_SIZE)) { - buff_size = len; - } - - // create buffer for read - uint8_t * buff = (uint8_t *) malloc(buff_size); - - if(buff) { - // read all data from server - while(connected() && (len > 0 || len == -1)) { - - // get available data size - size_t sizeAvailable = _tcp->available(); - - if(sizeAvailable) { - - int readBytes = sizeAvailable; - - // read only the asked bytes - if(len > 0 && readBytes > len) { - readBytes = len; - } - - // not read more the buffer can handle - if(readBytes > buff_size) { - readBytes = buff_size; - } - - // read data - int bytesRead = _tcp->readBytes(buff, readBytes); - - // write it to Stream - int bytesWrite = stream->write(buff, bytesRead); - bytesWritten += bytesWrite; - - // are all Bytes a writen to stream ? - if(bytesWrite != bytesRead) { - DEBUG_HTTPCLIENT("[HTTP-Client][writeToStream] short write asked for %d but got %d retry...\n", bytesRead, bytesWrite); - - // check for write error - if(stream->getWriteError()) { - DEBUG_HTTPCLIENT("[HTTP-Client][writeToStreamDataBlock] stream write error %d\n", stream->getWriteError()); - - //reset write error for retry - stream->clearWriteError(); - } - - // some time for the stream - delay(1); - - int leftBytes = (readBytes - bytesWrite); - - // retry to send the missed bytes - bytesWrite = stream->write((buff + bytesWrite), leftBytes); - bytesWritten += bytesWrite; - - if(bytesWrite != leftBytes) { - // failed again - DEBUG_HTTPCLIENT("[HTTP-Client][writeToStream] short write asked for %d but got %d failed.\n", leftBytes, bytesWrite); - free(buff); - return HTTPC_ERROR_STREAM_WRITE; - } - } - - // check for write error - if(stream->getWriteError()) { - DEBUG_HTTPCLIENT("[HTTP-Client][writeToStreamDataBlock] stream write error %d\n", stream->getWriteError()); - free(buff); - return HTTPC_ERROR_STREAM_WRITE; - } - - // count bytes to read left - if(len > 0) { - len -= readBytes; - } - - delay(0); - } else { - delay(1); - } - } - - free(buff); - - DEBUG_HTTPCLIENT("[HTTP-Client][writeToStreamDataBlock] connection closed or file end (written: %d).\n", bytesWritten); - - if((size > 0) && (size != bytesWritten)) { - DEBUG_HTTPCLIENT("[HTTP-Client][writeToStreamDataBlock] bytesWritten %d and size %d mismatch!.\n", bytesWritten, size); - return HTTPC_ERROR_STREAM_WRITE; - } - - } else { - DEBUG_HTTPCLIENT("[HTTP-Client][writeToStreamDataBlock] too less ram! need %d\n", HTTP_TCP_BUFFER_SIZE); - return HTTPC_ERROR_TOO_LESS_RAM; - } - - return bytesWritten; -} - -/** - * called to handle error return, may disconnect the connection if still exists - * @param error - * @return error - */ -int HTTPClient::returnError(int error) -{ - if(error < 0) { - DEBUG_HTTPCLIENT("[HTTP-Client][returnError] error(%d): %s\n", error, errorToString(error).c_str()); - if(connected()) { - DEBUG_HTTPCLIENT("[HTTP-Client][returnError] tcp stop\n"); - _tcp->stop(); - } - } - return error; -} diff --git a/examples/Advanced/httpUpdate/ESP8266HTTPClient.h b/examples/Advanced/httpUpdate/ESP8266HTTPClient.h deleted file mode 100644 index f0ecab3..0000000 --- a/examples/Advanced/httpUpdate/ESP8266HTTPClient.h +++ /dev/null @@ -1,228 +0,0 @@ -/** - * ESP8266HTTPClient.h - * - * Created on: 02.11.2015 - * - * Copyright (c) 2015 Markus Sattler. All rights reserved. - * This file is part of the ESP8266HTTPClient for Arduino. - * - * 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 ESP8266HTTPClient_H_ -#define ESP8266HTTPClient_H_ - -#include -#include -#include - -#ifdef DEBUG_ESP_HTTP_CLIENT -#ifdef DEBUG_ESP_PORT -#define DEBUG_HTTPCLIENT(...) DEBUG_ESP_PORT.printf( __VA_ARGS__ ) -#endif -#endif - -#ifndef DEBUG_HTTPCLIENT -#define DEBUG_HTTPCLIENT(...) -#endif - -#define HTTPCLIENT_DEFAULT_TCP_TIMEOUT (5000) - -/// HTTP client errors -#define HTTPC_ERROR_CONNECTION_REFUSED (-1) -#define HTTPC_ERROR_SEND_HEADER_FAILED (-2) -#define HTTPC_ERROR_SEND_PAYLOAD_FAILED (-3) -#define HTTPC_ERROR_NOT_CONNECTED (-4) -#define HTTPC_ERROR_CONNECTION_LOST (-5) -#define HTTPC_ERROR_NO_STREAM (-6) -#define HTTPC_ERROR_NO_HTTP_SERVER (-7) -#define HTTPC_ERROR_TOO_LESS_RAM (-8) -#define HTTPC_ERROR_ENCODING (-9) -#define HTTPC_ERROR_STREAM_WRITE (-10) -#define HTTPC_ERROR_READ_TIMEOUT (-11) - -/// size for the stream handling -#define HTTP_TCP_BUFFER_SIZE (1460) - -/// HTTP codes see RFC7231 -typedef enum { - HTTP_CODE_CONTINUE = 100, - HTTP_CODE_SWITCHING_PROTOCOLS = 101, - HTTP_CODE_PROCESSING = 102, - HTTP_CODE_OK = 200, - HTTP_CODE_CREATED = 201, - HTTP_CODE_ACCEPTED = 202, - HTTP_CODE_NON_AUTHORITATIVE_INFORMATION = 203, - HTTP_CODE_NO_CONTENT = 204, - HTTP_CODE_RESET_CONTENT = 205, - HTTP_CODE_PARTIAL_CONTENT = 206, - HTTP_CODE_MULTI_STATUS = 207, - HTTP_CODE_ALREADY_REPORTED = 208, - HTTP_CODE_IM_USED = 226, - HTTP_CODE_MULTIPLE_CHOICES = 300, - HTTP_CODE_MOVED_PERMANENTLY = 301, - HTTP_CODE_FOUND = 302, - HTTP_CODE_SEE_OTHER = 303, - HTTP_CODE_NOT_MODIFIED = 304, - HTTP_CODE_USE_PROXY = 305, - HTTP_CODE_TEMPORARY_REDIRECT = 307, - HTTP_CODE_PERMANENT_REDIRECT = 308, - HTTP_CODE_BAD_REQUEST = 400, - HTTP_CODE_UNAUTHORIZED = 401, - HTTP_CODE_PAYMENT_REQUIRED = 402, - HTTP_CODE_FORBIDDEN = 403, - HTTP_CODE_NOT_FOUND = 404, - HTTP_CODE_METHOD_NOT_ALLOWED = 405, - HTTP_CODE_NOT_ACCEPTABLE = 406, - HTTP_CODE_PROXY_AUTHENTICATION_REQUIRED = 407, - HTTP_CODE_REQUEST_TIMEOUT = 408, - HTTP_CODE_CONFLICT = 409, - HTTP_CODE_GONE = 410, - HTTP_CODE_LENGTH_REQUIRED = 411, - HTTP_CODE_PRECONDITION_FAILED = 412, - HTTP_CODE_PAYLOAD_TOO_LARGE = 413, - HTTP_CODE_URI_TOO_LONG = 414, - HTTP_CODE_UNSUPPORTED_MEDIA_TYPE = 415, - HTTP_CODE_RANGE_NOT_SATISFIABLE = 416, - HTTP_CODE_EXPECTATION_FAILED = 417, - HTTP_CODE_MISDIRECTED_REQUEST = 421, - HTTP_CODE_UNPROCESSABLE_ENTITY = 422, - HTTP_CODE_LOCKED = 423, - HTTP_CODE_FAILED_DEPENDENCY = 424, - HTTP_CODE_UPGRADE_REQUIRED = 426, - HTTP_CODE_PRECONDITION_REQUIRED = 428, - HTTP_CODE_TOO_MANY_REQUESTS = 429, - HTTP_CODE_REQUEST_HEADER_FIELDS_TOO_LARGE = 431, - HTTP_CODE_INTERNAL_SERVER_ERROR = 500, - HTTP_CODE_NOT_IMPLEMENTED = 501, - HTTP_CODE_BAD_GATEWAY = 502, - HTTP_CODE_SERVICE_UNAVAILABLE = 503, - HTTP_CODE_GATEWAY_TIMEOUT = 504, - HTTP_CODE_HTTP_VERSION_NOT_SUPPORTED = 505, - HTTP_CODE_VARIANT_ALSO_NEGOTIATES = 506, - HTTP_CODE_INSUFFICIENT_STORAGE = 507, - HTTP_CODE_LOOP_DETECTED = 508, - HTTP_CODE_NOT_EXTENDED = 510, - HTTP_CODE_NETWORK_AUTHENTICATION_REQUIRED = 511 -} t_http_codes; - -typedef enum { - HTTPC_TE_IDENTITY, - HTTPC_TE_CHUNKED -} transferEncoding_t; - -class TransportTraits; -typedef std::unique_ptr TransportTraitsPtr; - -class HTTPClient -{ -public: - HTTPClient(); - ~HTTPClient(); - - bool begin(String url); - bool begin(String url, String httpsFingerprint); - bool begin(String host, uint16_t port, String uri = "/"); - bool begin(String host, uint16_t port, String uri, String httpsFingerprint); - // deprecated, use the overload above instead - bool begin(String host, uint16_t port, String uri, bool https, String httpsFingerprint) __attribute__ ((deprecated)); - - void end(void); - - bool connected(void); - - void setReuse(bool reuse); /// keep-alive - void setUserAgent(const String& userAgent); - void setAuthorization(const char * user, const char * password); - void setAuthorization(const char * auth); - void setTimeout(uint16_t timeout); - - void useHTTP10(bool usehttp10 = true); - - /// request handling - int GET(); - int POST(uint8_t * payload, size_t size); - int POST(String payload); - int PUT(uint8_t * payload, size_t size); - int PUT(String payload); - int sendRequest(const char * type, String payload); - int sendRequest(const char * type, uint8_t * payload = NULL, size_t size = 0); - int sendRequest(const char * type, Stream * stream, size_t size = 0); - - void addHeader(const String& name, const String& value, bool first = false, bool replace = true); - - /// Response handling - void collectHeaders(const char* headerKeys[], const size_t headerKeysCount); - String header(const char* name); // get request header value by name - String header(size_t i); // get request header value by number - String headerName(size_t i); // get request header name by number - int headers(); // get header count - bool hasHeader(const char* name); // check if header exists - - - int getSize(void); - - WiFiClient& getStream(void); - WiFiClient* getStreamPtr(void); - int writeToStream(Stream* stream); - String getString(void); - - static String errorToString(int error); - -protected: - struct RequestArgument { - String key; - String value; - }; - - bool beginInternal(String url, const char* expectedProtocol); - void clear(); - int returnError(int error); - bool connect(void); - bool sendHeader(const char * type); - int handleHeaderResponse(); - int writeToStreamDataBlock(Stream * stream, int len); - - - TransportTraitsPtr _transportTraits; - std::unique_ptr _tcp; - - /// request handling - String _host; - uint16_t _port = 0; - bool _reuse = false; - uint16_t _tcpTimeout = HTTPCLIENT_DEFAULT_TCP_TIMEOUT; - bool _useHTTP10 = false; - - String _uri; - String _protocol; - String _headers; - String _userAgent = "ESP8266HTTPClient"; - String _base64Authorization; - - /// Response handling - RequestArgument* _currentHeaders = nullptr; - size_t _headerKeysCount = 0; - - int _returnCode = 0; - int _size = -1; - bool _canReuse = false; - transferEncoding_t _transferEncoding = HTTPC_TE_IDENTITY; -}; - - - -#endif /* ESP8266HTTPClient_H_ */ diff --git a/examples/Advanced/httpUpdate/ESP8266httpUpdate.cpp b/examples/Advanced/httpUpdate/ESP8266httpUpdate.cpp deleted file mode 100644 index a7a83af..0000000 --- a/examples/Advanced/httpUpdate/ESP8266httpUpdate.cpp +++ /dev/null @@ -1,391 +0,0 @@ -/** - * - * @file ESP8266HTTPUpdate.cpp - * @date 21.06.2015 - * @author Markus Sattler - * - * Copyright (c) 2015 Markus Sattler. All rights reserved. - * This file is part of the ESP8266 Http Updater. - * - * 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 "ESP8266httpUpdate.h" -#include - -// extern "C" uint32_t _SPIFFS_start; -// extern "C" uint32_t _SPIFFS_end; - -ESP8266HTTPUpdate::ESP8266HTTPUpdate(void) -{ -} - -ESP8266HTTPUpdate::~ESP8266HTTPUpdate(void) -{ -} - -HTTPUpdateResult ESP8266HTTPUpdate::update(const String& url, const String& currentVersion, - const String& httpsFingerprint, bool reboot) -{ - rebootOnUpdate(reboot); - return update(url, currentVersion, httpsFingerprint); -} - -HTTPUpdateResult ESP8266HTTPUpdate::update(const String& url, const String& currentVersion) -{ - HTTPClient http; - http.begin(url); - return handleUpdate(http, currentVersion, false); -} - -HTTPUpdateResult ESP8266HTTPUpdate::update(const String& url, const String& currentVersion, - const String& httpsFingerprint) -{ - HTTPClient http; - http.begin(url, httpsFingerprint); - return handleUpdate(http, currentVersion, false); -} - -HTTPUpdateResult ESP8266HTTPUpdate::updateSpiffs(const String& url, const String& currentVersion, const String& httpsFingerprint) -{ - HTTPClient http; - http.begin(url, httpsFingerprint); - return handleUpdate(http, currentVersion, true); -} - -HTTPUpdateResult ESP8266HTTPUpdate::updateSpiffs(const String& url, const String& currentVersion) -{ - HTTPClient http; - http.begin(url); - return handleUpdate(http, currentVersion, true); -} - -HTTPUpdateResult ESP8266HTTPUpdate::update(const String& host, uint16_t port, const String& uri, const String& currentVersion, - bool https, const String& httpsFingerprint, bool reboot) -{ - rebootOnUpdate(reboot); - if (httpsFingerprint.length() == 0) { - return update(host, port, uri, currentVersion); - } else { - return update(host, port, uri, currentVersion, httpsFingerprint); - } -} - -HTTPUpdateResult ESP8266HTTPUpdate::update(const String& host, uint16_t port, const String& uri, - const String& currentVersion) -{ - HTTPClient http; - http.begin(host, port, uri); - return handleUpdate(http, currentVersion, false); -} -HTTPUpdateResult ESP8266HTTPUpdate::update(const String& host, uint16_t port, const String& url, - const String& currentVersion, const String& httpsFingerprint) -{ - HTTPClient http; - http.begin(host, port, url, httpsFingerprint); - return handleUpdate(http, currentVersion, false); - -} - -/** - * return error code as int - * @return int error code - */ -int ESP8266HTTPUpdate::getLastError(void) -{ - return _lastError; -} - -/** - * return error code as String - * @return String error - */ -String ESP8266HTTPUpdate::getLastErrorString(void) -{ - - if(_lastError == 0) { - return String(); // no error - } - - // error from Update class - if(_lastError > 0) { - StreamString error; - Update.printError(error); - error.trim(); // remove line ending - return String(F("Update error: ")) + error; - } - - // error from http client - if(_lastError > -100) { - return String(F("HTTP error: ")) + HTTPClient::errorToString(_lastError); - } - - switch(_lastError) { - case HTTP_UE_TOO_LESS_SPACE: - return F("To less space"); - case HTTP_UE_SERVER_NOT_REPORT_SIZE: - return F("Server not Report Size"); - case HTTP_UE_SERVER_FILE_NOT_FOUND: - return F("File not Found (404)"); - case HTTP_UE_SERVER_FORBIDDEN: - return F("Forbidden (403)"); - case HTTP_UE_SERVER_WRONG_HTTP_CODE: - return F("Wrong HTTP code"); - case HTTP_UE_SERVER_FAULTY_MD5: - return F("Faulty MD5"); - case HTTP_UE_BIN_VERIFY_HEADER_FAILED: - return F("Verify bin header failed"); - case HTTP_UE_BIN_FOR_WRONG_FLASH: - return F("bin for wrong flash size"); - } - - return String(); -} - - -/** - * - * @param http HTTPClient * - * @param currentVersion const char * - * @return HTTPUpdateResult - */ -HTTPUpdateResult ESP8266HTTPUpdate::handleUpdate(HTTPClient& http, const String& currentVersion, bool spiffs) -{ - - HTTPUpdateResult ret = HTTP_UPDATE_FAILED; - - // use HTTP/1.0 for update since the update handler not support any transfer Encoding - http.useHTTP10(true); - http.setTimeout(8000); - http.setUserAgent(F("ESP8266-http-Update")); - // http.addHeader(F("x-ESP8266-STA-MAC"), WiFi.macAddress()); - // http.addHeader(F("x-ESP8266-AP-MAC"), WiFi.softAPmacAddress()); - // http.addHeader(F("x-ESP8266-free-space"), String(ESP.getFreeSketchSpace())); - // http.addHeader(F("x-ESP8266-sketch-size"), String(ESP.getSketchSize())); - // http.addHeader(F("x-ESP8266-sketch-md5"), String(ESP.getSketchMD5())); - // http.addHeader(F("x-ESP8266-chip-size"), String(ESP.getFlashChipRealSize())); - // http.addHeader(F("x-ESP8266-sdk-version"), ESP.getSdkVersion()); - - if(spiffs) { - http.addHeader(F("x-ESP8266-mode"), F("spiffs")); - } else { - http.addHeader(F("x-ESP8266-mode"), F("sketch")); - } - - if(currentVersion && currentVersion[0] != 0x00) { - http.addHeader(F("x-ESP8266-version"), currentVersion); - } - - const char * headerkeys[] = { "x-MD5" }; - size_t headerkeyssize = sizeof(headerkeys) / sizeof(char*); - - // track these headers - http.collectHeaders(headerkeys, headerkeyssize); - - int code = http.GET(); - int len = http.getSize(); - - if(code <= 0) { - DEBUG_HTTP_UPDATE("[httpUpdate] HTTP error: %s\n", http.errorToString(code).c_str()); - _lastError = code; - http.end(); - return HTTP_UPDATE_FAILED; - } - - DEBUG_HTTP_UPDATE("[httpUpdate] Header read fin.\n"); - DEBUG_HTTP_UPDATE("[httpUpdate] Server header:\n"); - DEBUG_HTTP_UPDATE("[httpUpdate] - code: %d\n", code); - DEBUG_HTTP_UPDATE("[httpUpdate] - len: %d\n", len); - - if(http.hasHeader("x-MD5")) { - DEBUG_HTTP_UPDATE("[httpUpdate] - MD5: %s\n", http.header("x-MD5").c_str()); - } - - DEBUG_HTTP_UPDATE("[httpUpdate] ESP8266 info:\n"); - DEBUG_HTTP_UPDATE("[httpUpdate] - free Space: %d\n", ESP.getFreeSketchSpace()); - DEBUG_HTTP_UPDATE("[httpUpdate] - current Sketch Size: %d\n", ESP.getSketchSize()); - - if(currentVersion && currentVersion[0] != 0x00) { - DEBUG_HTTP_UPDATE("[httpUpdate] - current version: %s\n", currentVersion.c_str() ); - } - - switch(code) { - case HTTP_CODE_OK: ///< OK (Start Update) - if(len > 0) { - bool startUpdate = true; - // if(spiffs) { - // size_t spiffsSize = ((size_t) &_SPIFFS_end - (size_t) &_SPIFFS_start); - // if(len > (int) spiffsSize) { - // DEBUG_HTTP_UPDATE("[httpUpdate] spiffsSize to low (%d) needed: %d\n", spiffsSize, len); - // startUpdate = false; - // } - // } else { - // if(0/*len > (int) ESP.getFreeSketchSpace()*/) { - // // DEBUG_HTTP_UPDATE("[httpUpdate] FreeSketchSpace to low (%d) needed: %d\n", ESP.getFreeSketchSpace(), len); - // startUpdate = false; - // } - // } - - if(!startUpdate) { - _lastError = HTTP_UE_TOO_LESS_SPACE; - ret = HTTP_UPDATE_FAILED; - } else { - - WiFiClient * tcp = http.getStreamPtr(); - - // WiFiUDP::stop(); - // WiFiClient::stopAllExcept(tcp); - - delay(100); - - int command; - - if(spiffs) { - command = U_SPIFFS; - DEBUG_HTTP_UPDATE("[httpUpdate] runUpdate spiffs...\n"); - } else { - command = U_FLASH; - DEBUG_HTTP_UPDATE("[httpUpdate] runUpdate flash...\n"); - Serial.print("[httpUpdate] runUpdate flash...\n"); - } - - // if(!spiffs) { - // uint8_t buf[4]; - // if(tcp->peekBytes(&buf[0], 4) != 4) { - // DEBUG_HTTP_UPDATE("[httpUpdate] peekBytes magic header failed\n"); - // _lastError = HTTP_UE_BIN_VERIFY_HEADER_FAILED; - // http.end(); - // return HTTP_UPDATE_FAILED; - // } - - // check for valid first magic byte - // if(buf[0] != 0xE9) { - // DEBUG_HTTP_UPDATE("[httpUpdate] magic header not starts with 0xE9\n"); - // _lastError = HTTP_UE_BIN_VERIFY_HEADER_FAILED; - // http.end(); - // return HTTP_UPDATE_FAILED; - // } - - // uint32_t bin_flash_size = ESP.magicFlashChipSize((buf[3] & 0xf0) >> 4); - - // check if new bin fits to SPI flash - // if(bin_flash_size > ESP.getFlashChipRealSize()) { - // DEBUG_HTTP_UPDATE("[httpUpdate] magic header, new bin not fits SPI Flash\n"); - // _lastError = HTTP_UE_BIN_FOR_WRONG_FLASH; - // http.end(); - // return HTTP_UPDATE_FAILED; - // } - // } - - if(runUpdate(*tcp, len, http.header("x-MD5"), command)) { - ret = HTTP_UPDATE_OK; - DEBUG_HTTP_UPDATE("[httpUpdate] Update ok\n"); - Serial.print("[httpUpdate] Update ok\n"); - http.end(); - - if(_rebootOnUpdate && !spiffs) { - ESP.restart(); - } - - } else { - ret = HTTP_UPDATE_FAILED; - DEBUG_HTTP_UPDATE("[httpUpdate] Update failed\n"); - } - } - } else { - _lastError = HTTP_UE_SERVER_NOT_REPORT_SIZE; - ret = HTTP_UPDATE_FAILED; - DEBUG_HTTP_UPDATE("[httpUpdate] Content-Length is 0 or not set by Server?!\n"); - } - break; - case HTTP_CODE_NOT_MODIFIED: - ///< Not Modified (No updates) - ret = HTTP_UPDATE_NO_UPDATES; - break; - case HTTP_CODE_NOT_FOUND: - _lastError = HTTP_UE_SERVER_FILE_NOT_FOUND; - ret = HTTP_UPDATE_FAILED; - break; - case HTTP_CODE_FORBIDDEN: - _lastError = HTTP_UE_SERVER_FORBIDDEN; - ret = HTTP_UPDATE_FAILED; - break; - default: - _lastError = HTTP_UE_SERVER_WRONG_HTTP_CODE; - ret = HTTP_UPDATE_FAILED; - DEBUG_HTTP_UPDATE("[httpUpdate] HTTP Code is (%d)\n", code); - //http.writeToStream(&Serial1); - break; - } - - http.end(); - return ret; -} - -/** - * write Update to flash - * @param in Stream& - * @param size uint32_t - * @param md5 String - * @return true if Update ok - */ -bool ESP8266HTTPUpdate::runUpdate(Stream& in, uint32_t size, String md5, int command) -{ - - StreamString error; - - if(!Update.begin(size, command)) { - _lastError = Update.getError(); - Update.printError(error); - error.trim(); // remove line ending - DEBUG_HTTP_UPDATE("[httpUpdate] Update.begin failed! (%s)\n", error.c_str()); - Serial.printf("[httpUpdate] Update.begin failed! (%s)\n", error.c_str()); - return false; - } - - if(md5.length()) { - if(!Update.setMD5(md5.c_str())) { - _lastError = HTTP_UE_SERVER_FAULTY_MD5; - DEBUG_HTTP_UPDATE("[httpUpdate] Update.setMD5 failed! (%s)\n", md5.c_str()); - Serial.printf("[httpUpdate] Update.setMD5 failed! (%s)\n", md5.c_str()); - return false; - } - } - - if(Update.writeStream(in) != size) { - _lastError = Update.getError(); - Update.printError(error); - error.trim(); // remove line ending - DEBUG_HTTP_UPDATE("[httpUpdate] Update.writeStream failed! (%s)\n", error.c_str()); - Serial.printf("[httpUpdate] Update.writeStream failed! (%s)\n", error.c_str()); - return false; - } - - if(!Update.end()) { - _lastError = Update.getError(); - Update.printError(error); - error.trim(); // remove line ending - DEBUG_HTTP_UPDATE("[httpUpdate] Update.end failed! (%s)\n", error.c_str()); - Serial.printf("[httpUpdate] Update.end failed! (%s)\n", error.c_str()); - return false; - } - - return true; -} - -#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_HTTPUPDATE) -ESP8266HTTPUpdate ESPhttpUpdate; -#endif diff --git a/examples/Advanced/httpUpdate/ESP8266httpUpdate.h b/examples/Advanced/httpUpdate/ESP8266httpUpdate.h deleted file mode 100644 index 0f9b1f8..0000000 --- a/examples/Advanced/httpUpdate/ESP8266httpUpdate.h +++ /dev/null @@ -1,116 +0,0 @@ -/** - * - * @file ESP8266HTTPUpdate.h - * @date 21.06.2015 - * @author Markus Sattler - * - * Copyright (c) 2015 Markus Sattler. All rights reserved. - * This file is part of the ESP8266 Http Updater. - * - * 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 ESP8266HTTPUPDATE_H_ -#define ESP8266HTTPUPDATE_H_ - -#include -#include -#include -#include "ESP8266HTTPClient.h" -#include "Update.h" -#include "WiFiUdp.h" - - -#define DEBUG_ESP_HTTP_UPDATE - -#ifdef DEBUG_ESP_HTTP_UPDATE -#ifdef DEBUG_ESP_PORT -#define DEBUG_HTTP_UPDATE(...) DEBUG_ESP_PORT.printf( __VA_ARGS__ ) -#endif -#endif - -#ifndef DEBUG_HTTP_UPDATE -#define DEBUG_HTTP_UPDATE(...) -#endif - -/// note we use HTTP client errors too so we start at 100 -#define HTTP_UE_TOO_LESS_SPACE (-100) -#define HTTP_UE_SERVER_NOT_REPORT_SIZE (-101) -#define HTTP_UE_SERVER_FILE_NOT_FOUND (-102) -#define HTTP_UE_SERVER_FORBIDDEN (-103) -#define HTTP_UE_SERVER_WRONG_HTTP_CODE (-104) -#define HTTP_UE_SERVER_FAULTY_MD5 (-105) -#define HTTP_UE_BIN_VERIFY_HEADER_FAILED (-106) -#define HTTP_UE_BIN_FOR_WRONG_FLASH (-107) - -enum HTTPUpdateResult { - HTTP_UPDATE_FAILED, - HTTP_UPDATE_NO_UPDATES, - HTTP_UPDATE_OK -}; - -typedef HTTPUpdateResult t_httpUpdate_return; // backward compatibility - -class ESP8266HTTPUpdate -{ -public: - ESP8266HTTPUpdate(void); - ~ESP8266HTTPUpdate(void); - - void rebootOnUpdate(bool reboot) - { - _rebootOnUpdate = reboot; - } - - // This function is deprecated, use rebootOnUpdate and the next one instead - t_httpUpdate_return update(const String& url, const String& currentVersion, - const String& httpsFingerprint, bool reboot) __attribute__((deprecated)); - t_httpUpdate_return update(const String& url, const String& currentVersion = ""); - t_httpUpdate_return update(const String& url, const String& currentVersion, - const String& httpsFingerprint); - - // This function is deprecated, use one of the overloads below along with rebootOnUpdate - t_httpUpdate_return update(const String& host, uint16_t port, const String& uri, const String& currentVersion, - bool https, const String& httpsFingerprint, bool reboot) __attribute__((deprecated)); - - t_httpUpdate_return update(const String& host, uint16_t port, const String& uri = "/", - const String& currentVersion = ""); - t_httpUpdate_return update(const String& host, uint16_t port, const String& url, - const String& currentVersion, const String& httpsFingerprint); - - // This function is deprecated, use rebootOnUpdate and the next one instead - t_httpUpdate_return updateSpiffs(const String& url, const String& currentVersion, - const String& httpsFingerprint, bool reboot) __attribute__((deprecated)); - t_httpUpdate_return updateSpiffs(const String& url, const String& currentVersion = ""); - t_httpUpdate_return updateSpiffs(const String& url, const String& currentVersion, const String& httpsFingerprint); - - - int getLastError(void); - String getLastErrorString(void); - -protected: - t_httpUpdate_return handleUpdate(HTTPClient& http, const String& currentVersion, bool spiffs = false); - bool runUpdate(Stream& in, uint32_t size, String md5, int command = U_FLASH); - - int _lastError; - bool _rebootOnUpdate = true; -}; - -#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_HTTPUPDATE) -extern ESP8266HTTPUpdate ESPhttpUpdate; -#endif - -#endif /* ESP8266HTTPUPDATE_H_ */ diff --git a/examples/Advanced/httpUpdate/Update.h b/examples/Advanced/httpUpdate/Update.h deleted file mode 100644 index 6f733d4..0000000 --- a/examples/Advanced/httpUpdate/Update.h +++ /dev/null @@ -1,161 +0,0 @@ -#ifndef ESP8266UPDATER_H -#define ESP8266UPDATER_H - -#include -#include -#include "esp_partition.h" - -#define UPDATE_ERROR_OK (0) -#define UPDATE_ERROR_WRITE (1) -#define UPDATE_ERROR_ERASE (2) -#define UPDATE_ERROR_READ (3) -#define UPDATE_ERROR_SPACE (4) -#define UPDATE_ERROR_SIZE (5) -#define UPDATE_ERROR_STREAM (6) -#define UPDATE_ERROR_MD5 (7) -#define UPDATE_ERROR_MAGIC_BYTE (8) -#define UPDATE_ERROR_ACTIVATE (9) -#define UPDATE_ERROR_NO_PARTITION (10) -#define UPDATE_ERROR_BAD_ARGUMENT (11) -#define UPDATE_ERROR_ABORT (12) - -#define UPDATE_SIZE_UNKNOWN 0xFFFFFFFF - -#define U_FLASH 0 -#define U_SPIFFS 100 -#define U_AUTH 200 - -class UpdateClass { - public: - UpdateClass(); - /* - Call this to check the space needed for the update - Will return false if there is not enough space - */ - bool begin(size_t size=UPDATE_SIZE_UNKNOWN, int command = U_FLASH); - - /* - Writes a buffer to the flash and increments the address - Returns the amount written - */ - size_t write(uint8_t *data, size_t len); - - /* - Writes the remaining bytes from the Stream to the flash - Uses readBytes() and sets UPDATE_ERROR_STREAM on timeout - Returns the bytes written - Should be equal to the remaining bytes when called - Usable for slow streams like Serial - */ - size_t writeStream(Stream &data); - - /* - If all bytes are written - this call will write the config to eboot - and return true - If there is already an update running but is not finished and !evenIfRemainanig - or there is an error - this will clear everything and return false - the last error is available through getError() - evenIfRemaining is helpfull when you update without knowing the final size first - */ - bool end(bool evenIfRemaining = false); - - /* - Aborts the running update - */ - void abort(); - - /* - Prints the last error to an output stream - */ - void printError(Stream &out); - - /* - sets the expected MD5 for the firmware (hexString) - */ - bool setMD5(const char * expected_md5); - - /* - returns the MD5 String of the sucessfully ended firmware - */ - String md5String(void){ return _md5.toString(); } - - /* - populated the result with the md5 bytes of the sucessfully ended firmware - */ - void md5(uint8_t * result){ return _md5.getBytes(result); } - - //Helpers - uint8_t getError(){ return _error; } - void clearError(){ _error = UPDATE_ERROR_OK; } - bool hasError(){ return _error != UPDATE_ERROR_OK; } - bool isRunning(){ return _size > 0; } - bool isFinished(){ return _progress == _size; } - size_t size(){ return _size; } - size_t progress(){ return _progress; } - size_t remaining(){ return _size - _progress; } - - /* - Template to write from objects that expose - available() and read(uint8_t*, size_t) methods - faster than the writeStream method - writes only what is available - */ - template - size_t write(T &data){ - size_t written = 0; - if (hasError() || !isRunning()) - return 0; - - size_t available = data.available(); - while(available) { - if(_bufferLen + available > remaining()){ - available = remaining() - _bufferLen; - } - if(_bufferLen + available > 4096) { - size_t toBuff = 4096 - _bufferLen; - data.read(_buffer + _bufferLen, toBuff); - _bufferLen += toBuff; - if(!_writeBuffer()) - return written; - written += toBuff; - } else { - data.read(_buffer + _bufferLen, available); - _bufferLen += available; - written += available; - if(_bufferLen == remaining()) { - if(!_writeBuffer()) { - return written; - } - } - } - if(remaining() == 0) - return written; - available = data.available(); - } - return written; - } - - private: - void _reset(); - void _abort(uint8_t err); - bool _writeBuffer(); - bool _verifyHeader(uint8_t data); - bool _verifyEnd(); - - uint8_t _error; - uint8_t *_buffer; - size_t _bufferLen; - size_t _size; - uint32_t _progress; - uint32_t _command; - const esp_partition_t* _partition; - - String _target_md5; - MD5Builder _md5; -}; - -extern UpdateClass Update; - -#endif diff --git a/examples/Advanced/httpUpdate/Updater.cpp b/examples/Advanced/httpUpdate/Updater.cpp deleted file mode 100644 index 1ff4b26..0000000 --- a/examples/Advanced/httpUpdate/Updater.cpp +++ /dev/null @@ -1,279 +0,0 @@ -#include "Update.h" -#include "Arduino.h" -#include "esp_spi_flash.h" -#include "esp_ota_ops.h" -#include "esp_image_format.h" - -static const char * _err2str(uint8_t _error){ - if(_error == UPDATE_ERROR_OK){ - return ("No Error"); - } else if(_error == UPDATE_ERROR_WRITE){ - return ("Flash Write Failed"); - } else if(_error == UPDATE_ERROR_ERASE){ - return ("Flash Erase Failed"); - } else if(_error == UPDATE_ERROR_READ){ - return ("Flash Read Failed"); - } else if(_error == UPDATE_ERROR_SPACE){ - return ("Not Enough Space"); - } else if(_error == UPDATE_ERROR_SIZE){ - return ("Bad Size Given"); - } else if(_error == UPDATE_ERROR_STREAM){ - return ("Stream Read Timeout"); - } else if(_error == UPDATE_ERROR_MD5){ - return ("MD5 Check Failed"); - } else if(_error == UPDATE_ERROR_MAGIC_BYTE){ - return ("Wrong Magic Byte"); - } else if(_error == UPDATE_ERROR_ACTIVATE){ - return ("Could Not Activate The Firmware"); - } else if(_error == UPDATE_ERROR_NO_PARTITION){ - return ("Partition Could Not be Found"); - } else if(_error == UPDATE_ERROR_BAD_ARGUMENT){ - return ("Bad Argument"); - } else if(_error == UPDATE_ERROR_ABORT){ - return ("Aborted"); - } - return ("UNKNOWN"); -} - -UpdateClass::UpdateClass() -: _error(0) -, _buffer(0) -, _bufferLen(0) -, _size(0) -, _progress(0) -, _command(U_FLASH) -, _partition(NULL) -{ -} - -void UpdateClass::_reset() { - if (_buffer) - delete[] _buffer; - _buffer = 0; - _bufferLen = 0; - _progress = 0; - _size = 0; - _command = U_FLASH; -} - -bool UpdateClass::begin(size_t size, int command) { - if(_size > 0){ - log_w("already running"); - return false; - } - - _reset(); - _error = 0; - - if(size == 0) { - _error = UPDATE_ERROR_SIZE; - return false; - } - - if (command == U_FLASH) { - _partition = esp_ota_get_next_update_partition(NULL); - if(!_partition){ - _error = UPDATE_ERROR_NO_PARTITION; - return false; - } - log_d("OTA Partition: %s", _partition->label); - } - else if (command == U_SPIFFS) { - _partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_SPIFFS, NULL); - if(!_partition){ - _error = UPDATE_ERROR_NO_PARTITION; - return false; - } - } - else { - _error = UPDATE_ERROR_BAD_ARGUMENT; - log_e("bad command %u", command); - return false; - } - - if(size == UPDATE_SIZE_UNKNOWN){ - size = _partition->size; - } else if(size > _partition->size){ - _error = UPDATE_ERROR_SIZE; - log_e("too large %u > %u", size, _partition->size); - return false; - } - - //initialize - _buffer = (uint8_t*)malloc(SPI_FLASH_SEC_SIZE); - if(!_buffer){ - log_e("malloc failed"); - return false; - } - _size = size; - _command = command; - _md5.begin(); - return true; -} - -void UpdateClass::_abort(uint8_t err){ - _reset(); - _error = err; -} - -void UpdateClass::abort(){ - _abort(UPDATE_ERROR_ABORT); -} - -bool UpdateClass::_writeBuffer(){ - if(!ESP.flashEraseSector((_partition->address + _progress)/SPI_FLASH_SEC_SIZE)){ - _abort(UPDATE_ERROR_ERASE); - return false; - } - if (!ESP.flashWrite(_partition->address + _progress, (uint32_t*)_buffer, _bufferLen)) { - _abort(UPDATE_ERROR_WRITE); - return false; - } - _md5.add(_buffer, _bufferLen); - _progress += _bufferLen; - _bufferLen = 0; - return true; -} - -bool UpdateClass::_verifyHeader(uint8_t data) { - if(_command == U_FLASH) { - if(data != ESP_IMAGE_HEADER_MAGIC) { - _abort(UPDATE_ERROR_MAGIC_BYTE); - return false; - } - return true; - } else if(_command == U_SPIFFS) { - return true; - } - return false; -} - -bool UpdateClass::_verifyEnd() { - if(_command == U_FLASH) { - uint8_t buf[4]; - if(!ESP.flashRead(_partition->address, (uint32_t*)buf, 4)) { - _abort(UPDATE_ERROR_READ); - return false; - } - - if(buf[0] != ESP_IMAGE_HEADER_MAGIC) { - _abort(UPDATE_ERROR_MAGIC_BYTE); - return false; - } - - if(esp_ota_set_boot_partition(_partition)){ - _abort(UPDATE_ERROR_ACTIVATE); - return false; - } - _reset(); - return true; - } else if(_command == U_SPIFFS) { - return true; - } - return false; -} - -bool UpdateClass::setMD5(const char * expected_md5){ - if(strlen(expected_md5) != 32) - { - return false; - } - _target_md5 = expected_md5; - return true; -} - -bool UpdateClass::end(bool evenIfRemaining){ - if(hasError() || _size == 0){ - return false; - } - - if(!isFinished() && !evenIfRemaining){ - log_e("premature end: res:%u, pos:%u/%u\n", getError(), progress(), _size); - _abort(UPDATE_ERROR_ABORT); - return false; - } - - if(evenIfRemaining) { - if(_bufferLen > 0) { - _writeBuffer(); - } - _size = progress(); - } - - _md5.calculate(); - if(_target_md5.length()) { - if(_target_md5 != _md5.toString()){ - _abort(UPDATE_ERROR_MD5); - return false; - } - } - - return _verifyEnd(); -} - -size_t UpdateClass::write(uint8_t *data, size_t len) { - if(hasError() || !isRunning()){ - return 0; - } - - if(len > remaining()){ - _abort(UPDATE_ERROR_SPACE); - return 0; - } - - size_t left = len; - - while((_bufferLen + left) > SPI_FLASH_SEC_SIZE) { - size_t toBuff = SPI_FLASH_SEC_SIZE - _bufferLen; - memcpy(_buffer + _bufferLen, data + (len - left), toBuff); - _bufferLen += toBuff; - if(!_writeBuffer()){ - return len - left; - } - left -= toBuff; - } - memcpy(_buffer + _bufferLen, data + (len - left), left); - _bufferLen += left; - if(_bufferLen == remaining()){ - if(!_writeBuffer()){ - return len - left; - } - } - return len; -} - -size_t UpdateClass::writeStream(Stream &data) { - size_t written = 0; - size_t toRead = 0; - if(hasError() || !isRunning()) - return 0; - - // if(!_verifyHeader(data.peek())) { - // Serial.print("_reset\r\n"); - // _reset(); - // return 0; - // } - - while(remaining()) { - toRead = data.readBytes(_buffer + _bufferLen, (SPI_FLASH_SEC_SIZE - _bufferLen)); - if(toRead == 0) { //Timeout - delay(100); - toRead = data.readBytes(_buffer + _bufferLen, (SPI_FLASH_SEC_SIZE - _bufferLen)); - if(toRead == 0) { //Timeout - _abort(UPDATE_ERROR_STREAM); - return written; - } - } - _bufferLen += toRead; - if((_bufferLen == remaining() || _bufferLen == SPI_FLASH_SEC_SIZE) && !_writeBuffer()) - return written; - written += toRead; - } - return written; -} - -void UpdateClass::printError(Stream &out){ - out.println(_err2str(_error)); -} - -UpdateClass Update; diff --git a/examples/Advanced/httpUpdate/httpUpdate.ino b/examples/Advanced/httpUpdate/httpUpdate.ino deleted file mode 100644 index f636121..0000000 --- a/examples/Advanced/httpUpdate/httpUpdate.ino +++ /dev/null @@ -1,80 +0,0 @@ -/** - * httpUpdate.ino - * - * Created on: 27.11.2015 - * - */ - -#include - -#include -#include - -#include "ESP8266HTTPClient.h" -#include "ESP8266httpUpdate.h" -#include - -#define USE_SERIAL Serial - -WiFiMulti wifiMulti; - -void setup() { - - USE_SERIAL.begin(115200); - // USE_SERIAL.setDebugOutput(true); - - USE_SERIAL.println(); - USE_SERIAL.println(); - USE_SERIAL.println(); - // Serial.print("update success!\r\n"); - - for(uint8_t t = 4; t > 0; t--) { - USE_SERIAL.printf("[SETUP] WAIT %d...\n", t); - USE_SERIAL.flush(); - delay(100); - } - - WiFi.begin("MasterHax_2.4G", "wittyercheese551"); - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } - - Serial.println(""); - Serial.println("WiFi connected"); - Serial.println("IP address: "); - Serial.println(WiFi.localIP()); - - // wifiMulti.addAP("MasterHax_2.4G", "wittyercheese551"); - // Serial.println("Connecting Wifi..."); - // if(wifiMulti.run() == WL_CONNECTED) { - // Serial.println(""); - // Serial.println("WiFi connected"); - // Serial.println("IP address: "); - // Serial.println(WiFi.localIP()); - // } -} - -void loop() { - // wait for WiFi connection - // if((wifiMulti.run() == WL_CONNECTED)) { - if(1) { - Serial.printf("connect...\n"); - t_httpUpdate_return ret = ESPhttpUpdate.update("http://olcunuug8.bkt.clouddn.com/httpUpdate.ino.esp32.bin"); - //t_httpUpdate_return ret = ESPhttpUpdate.update("https://server/file.bin"); - - switch(ret) { - case HTTP_UPDATE_FAILED: - USE_SERIAL.printf("HTTP_UPDATE_FAILD Error (%d): %s", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str()); - break; - - case HTTP_UPDATE_NO_UPDATES: - USE_SERIAL.println("HTTP_UPDATE_NO_UPDATES"); - break; - - case HTTP_UPDATE_OK: - USE_SERIAL.println("HTTP_UPDATE_OK"); - break; - } - } -} diff --git a/examples/Advanced/httpUpdate/httpUpdate.ino.esp32.bin b/examples/Advanced/httpUpdate/httpUpdate.ino.esp32.bin deleted file mode 100644 index a3f6ed1465c4438e457b92e75d3506afa3da3235..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 542320 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

o7ndYeg4$dNMIatLtZ=9S$EYV{i4dq20`h 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 -#include "matrix_rgb.h" -#include -#include //The DHT12 uses I2C comunication. - -HardwareSerial Serial2(2); -MATRIX_RGB matrix; -DHT12 dht12; //Preset scale CELSIUS and ID 0x5c. - - -/*************************************************** - This is our GFX example for the Adafruit ILI9341 Breakout and Shield - ----> http://www.adafruit.com/products/1651 - - Check out the links above for our tutorials and wiring diagrams - These displays use SPI to communicate, 4 or 5 pins are required to - interface (RST is optional) - Adafruit invests time and resources providing this open source code, - please support Adafruit and open-source hardware by purchasing - products from Adafruit! - - Written by Limor Fried/Ladyada for Adafruit Industries. - MIT license, all text above must be included in any redistribution - ****************************************************/ - -// void updateEnvLCD(float tmp, float humidty, float pressure, float light) { - void updateEnvLCD(float tmp, float humidty) { - - // m5.lcd.setFont(&FreeMonoBoldOblique12pt7b); - // m5.lcd.fillScreen(WHITE); - m5.lcd.setFont(&FreeSansOblique9pt7b); - m5.lcd.setTextSize(1); - m5.lcd.setTextColor(BLACK); - - //tmp - m5.lcd.fillRect(10, 51, 38, 28, WHITE); - m5.lcd.setCursor(18, 72); - m5.lcd.printf("%0.0f", tmp); - - //humidty - m5.lcd.fillRect(83, 51, 38, 28, WHITE); - m5.lcd.setCursor(88, 72); - m5.lcd.printf("%0.0f", humidty); - - // //pressure - // m5.lcd.fillRect(152, 51, 38, 28, WHITE); - // m5.lcd.setCursor(153, 72); - // m5.lcd.printf("%0.0f", pressure); - - // //light - // m5.lcd.fillRect(10, 110, 42, 28, WHITE); - // m5.lcd.setCursor(13, 130); - // m5.lcd.printf("%3.0f", light); -} - -void setup() { - // Serial2.begin(9600); - // Serial2.println("ILI9341 Test!"); - Serial.begin(74880); - // Serial.begin(250000); - Serial2.begin(115200); - m5.begin(); - Wire.begin(); - matrix.begin(); - // tft.begin(); - - // testFillScreen(); - // tft.fillScreen(ILI9341_GREEN); - matrix.fillScreen(ILI9341_BLACK); - // testText(); - - - - // testCircles(5, ILI9341_GREEN); - // draw a pixel in solid white - matrix.drawPixel(0, 0, matrix.Color333(7, 7, 7)); - delay(500); - - // fix the screen with green - matrix.fillRect(0, 0, matrix.width(), matrix.height(), matrix.Color333(0, 7, 0)); - delay(500); - - // draw a box in yellow - matrix.drawRect(0, 0, matrix.width(), matrix.height(), matrix.Color333(7, 7, 0)); - delay(500); - - // draw an 'X' in red - matrix.drawLine(0, 0, matrix.width()-1, matrix.height()-1, matrix.Color333(7, 0, 0)); - matrix.drawLine(matrix.width()-1, 0, 0, matrix.height()-1, matrix.Color333(7, 0, 0)); - delay(500); - - // draw a blue circle - matrix.drawCircle(10, 10, 10, matrix.Color333(0, 0, 7)); - delay(500); - - // fill a violet circle - matrix.fillCircle(40, 21, 10, matrix.Color333(7, 0, 7)); - delay(500); - - // fill the screen with 'black' - matrix.fillScreen(matrix.Color333(0, 0, 0)); - - // draw some text! - matrix.setTextSize(1); // size 1 == 8 pixels high - matrix.setTextWrap(false); // Don't wrap at end of line - will do ourselves - - matrix.setCursor(8, 0); // start at top left, with 8 pixel of spacing - uint8_t w = 0; - char *str = "AdafruitIndustries"; - for (w=0; w<8; w++) { - matrix.setTextColor(Wheel(w)); - matrix.print(str[w]); - } - matrix.setCursor(2, 8); // next line - for (w=8; w<18; w++) { - matrix.setTextColor(Wheel(w)); - matrix.print(str[w]); - } - matrix.println(); - //matrix.setTextColor(matrix.Color333(4,4,4)); - //matrix.println("Industries"); - matrix.setTextColor(matrix.Color333(7,7,7)); - matrix.println("LED MATRIX!"); - - // print each letter with a rainbow color - matrix.setTextColor(matrix.Color333(7,0,0)); - matrix.print('3'); - matrix.setTextColor(matrix.Color333(7,4,0)); - matrix.print('2'); - matrix.setTextColor(matrix.Color333(7,7,0)); - matrix.print('x'); - matrix.setTextColor(matrix.Color333(4,7,0)); - matrix.print('6'); - matrix.setTextColor(matrix.Color333(0,7,0)); - matrix.print('4'); - matrix.setCursor(34, 24); - matrix.setTextColor(matrix.Color333(0,7,7)); - matrix.print("*"); - matrix.setTextColor(matrix.Color333(0,4,7)); - matrix.print('R'); - matrix.setTextColor(matrix.Color333(0,0,7)); - matrix.print('G'); - matrix.setTextColor(matrix.Color333(4,0,7)); - matrix.print("B"); - matrix.setTextColor(matrix.Color333(7,0,4)); - matrix.println("*"); - -} - -// Input a value 0 to 24 to get a color value. -// The colours are a transition r - g - b - back to r. -uint16_t Wheel(byte WheelPos) { - if(WheelPos < 8) { - return matrix.Color333(7 - WheelPos, WheelPos, 0); - } else if(WheelPos < 16) { - WheelPos -= 8; - return matrix.Color333(0, 7-WheelPos, WheelPos); - } else { - WheelPos -= 16; - return matrix.Color333(0, WheelPos, 7 - WheelPos); - } -} - - -void loop(void) { - updateEnvLCD(dht12.readTemperature(), dht12.readHumidity()); -} - -// static const int8_t PROGMEM sinetab[256] = { -// 0, 2, 5, 8, 11, 15, 18, 21, -// 24, 27, 30, 33, 36, 39, 42, 45, -// 48, 51, 54, 56, 59, 62, 65, 67, -// 70, 72, 75, 77, 80, 82, 85, 87, -// 89, 91, 93, 96, 98, 100, 101, 103, -// 105, 107, 108, 110, 111, 113, 114, 116, -// 117, 118, 119, 120, 121, 122, 123, 123, -// 124, 125, 125, 126, 126, 126, 126, 126, -// 127, 126, 126, 126, 126, 126, 125, 125, -// 124, 123, 123, 122, 121, 120, 119, 118, -// 117, 116, 114, 113, 111, 110, 108, 107, -// 105, 103, 101, 100, 98, 96, 93, 91, -// 89, 87, 85, 82, 80, 77, 75, 72, -// 70, 67, 65, 62, 59, 56, 54, 51, -// 48, 45, 42, 39, 36, 33, 30, 27, -// 24, 21, 18, 15, 11, 8, 5, 2, -// 0, -3, -6, -9, -12, -16, -19, -22, -// -25, -28, -31, -34, -37, -40, -43, -46, -// -49, -52, -55, -57, -60, -63, -66, -68, -// -71, -73, -76, -78, -81, -83, -86, -88, -// -90, -92, -94, -97, -99,-101,-102,-104, -// -106,-108,-109,-111,-112,-114,-115,-117, -// -118,-119,-120,-121,-122,-123,-124,-124, -// -125,-126,-126,-127,-127,-127,-127,-127, -// -128,-127,-127,-127,-127,-127,-126,-126, -// -125,-124,-124,-123,-122,-121,-120,-119, -// -118,-117,-115,-114,-112,-111,-109,-108, -// -106,-104,-102,-101, -99, -97, -94, -92, -// -90, -88, -86, -83, -81, -78, -76, -73, -// -71, -68, -66, -63, -60, -57, -55, -52, -// -49, -46, -43, -40, -37, -34, -31, -28, -// -25, -22, -19, -16, -12, -9, -6, -3 -// }; - -// const float radius1 = 16.3, radius2 = 23.0, radius3 = 40.8, radius4 = 44.2, -// centerx1 = 16.1, centerx2 = 11.6, centerx3 = 23.4, centerx4 = 4.1, -// centery1 = 8.7, centery2 = 6.5, centery3 = 14.0, centery4 = -2.9; -// float angle1 = 0.0, angle2 = 0.0, angle3 = 0.0, angle4 = 0.0; -// long hueShift = 0; - -// void loop() { -// int x1, x2, x3, x4, y1, y2, y3, y4, sx1, sx2, sx3, sx4; -// unsigned char x, y; -// long value; - -// sx1 = (int)(cos(angle1) * radius1 + centerx1); -// sx2 = (int)(cos(angle2) * radius2 + centerx2); -// sx3 = (int)(cos(angle3) * radius3 + centerx3); -// sx4 = (int)(cos(angle4) * radius4 + centerx4); -// y1 = (int)(sin(angle1) * radius1 + centery1); -// y2 = (int)(sin(angle2) * radius2 + centery2); -// y3 = (int)(sin(angle3) * radius3 + centery3); -// y4 = (int)(sin(angle4) * radius4 + centery4); - -// for(y=0; y> 2)) -// + (int8_t)pgm_read_byte(sinetab + (uint8_t)((x2 * x2 + y2 * y2) >> 2)) -// + (int8_t)pgm_read_byte(sinetab + (uint8_t)((x3 * x3 + y3 * y3) >> 3)) -// + (int8_t)pgm_read_byte(sinetab + (uint8_t)((x4 * x4 + y4 * y4) >> 3)); -// matrix.drawPixel(x, y, matrix.ColorHSV(value * 3, 255, 255, true)); -// x1--; x2--; x3--; x4--; -// } -// y1--; y2--; y3--; y4--; -// } - -// angle1 += 0.03; -// angle2 -= 0.07; -// angle3 += 0.13; -// angle4 -= 0.15; -// hueShift += 2; -// } - - -// unsigned long testFillScreen() { -// unsigned long start = micros(); -// tft.fillScreen(ILI9341_BLACK); -// yield(); -// tft.fillScreen(ILI9341_RED); -// yield(); -// tft.fillScreen(ILI9341_GREEN); -// yield(); -// tft.fillScreen(ILI9341_BLUE); -// yield(); -// tft.fillScreen(ILI9341_BLACK); -// yield(); -// return micros() - start; -// } - -// unsigned long testCircles(uint8_t radius, uint16_t color) { -// unsigned long start; -// int x, y, r2 = radius * 2, -// w = tft.width() + radius, -// h = tft.height() + radius; - -// // Screen is not cleared for this one -- this is -// // intentional and does not affect the reported time. -// start = micros(); -// for(x=0; x>8)); -} - -// Promote 3/3/3 RGB to Adafruit_GFX 5/6/5 -uint16_t MATRIX_RGB::Color333(uint8_t r, uint8_t g, uint8_t b) { - // RRRrrGGGgggBBBbb - return ((r & 0x7) << 13) | ((r & 0x6) << 10) | - ((g & 0x7) << 8) | ((g & 0x7) << 5) | - ((b & 0x7) << 2) | ((b & 0x6) >> 1); -} - -// Promote 4/4/4 RGB to Adafruit_GFX 5/6/5 -uint16_t MATRIX_RGB::Color444(uint8_t r, uint8_t g, uint8_t b) { - // RRRRrGGGGggBBBBb - return ((r & 0xF) << 12) | ((r & 0x8) << 8) | - ((g & 0xF) << 7) | ((g & 0xC) << 3) | - ((b & 0xF) << 1) | ((b & 0x8) >> 3); -} - -// Demote 8/8/8 to Adafruit_GFX 5/6/5 -// If no gamma flag passed, assume linear color -uint16_t MATRIX_RGB::Color888(uint8_t r, uint8_t g, uint8_t b) { - return ((uint16_t)(r & 0xF8) << 8) | ((uint16_t)(g & 0xFC) << 3) | (b >> 3); -} - -// 8/8/8 -> gamma -> 5/6/5 -uint16_t MATRIX_RGB::Color888( - uint8_t r, uint8_t g, uint8_t b, boolean gflag) { - if(gflag) { // Gamma-corrected color? - r = pgm_read_byte(&gamma[r]); // Gamma correction table maps - g = pgm_read_byte(&gamma[g]); // 8-bit input to 4-bit output - b = pgm_read_byte(&gamma[b]); - return ((uint16_t)r << 12) | ((uint16_t)(r & 0x8) << 8) | // 4/4/4->5/6/5 - ((uint16_t)g << 7) | ((uint16_t)(g & 0xC) << 3) | - ( b << 1) | ( b >> 3); - } // else linear (uncorrected) color - return ((uint16_t)(r & 0xF8) << 8) | ((uint16_t)(g & 0xFC) << 3) | (b >> 3); -} - -uint16_t MATRIX_RGB::ColorHSV( - long hue, uint8_t sat, uint8_t val, boolean gflag) { - - uint8_t r, g, b, lo; - uint16_t s1, v1; - - // Hue - hue %= 1536; // -1535 to +1535 - if(hue < 0) hue += 1536; // 0 to +1535 - lo = hue & 255; // Low byte = primary/secondary color mix - switch(hue >> 8) { // High byte = sextant of colorwheel - case 0 : r = 255 ; g = lo ; b = 0 ; break; // R to Y - case 1 : r = 255 - lo; g = 255 ; b = 0 ; break; // Y to G - case 2 : r = 0 ; g = 255 ; b = lo ; break; // G to C - case 3 : r = 0 ; g = 255 - lo; b = 255 ; break; // C to B - case 4 : r = lo ; g = 0 ; b = 255 ; break; // B to M - default: r = 255 ; g = 0 ; b = 255 - lo; break; // M to R - } - - // Saturation: add 1 so range is 1 to 256, allowig a quick shift operation - // on the result rather than a costly divide, while the type upgrade to int - // avoids repeated type conversions in both directions. - s1 = sat + 1; - r = 255 - (((255 - r) * s1) >> 8); - g = 255 - (((255 - g) * s1) >> 8); - b = 255 - (((255 - b) * s1) >> 8); - - // Value (brightness) & 16-bit color reduction: similar to above, add 1 - // to allow shifts, and upgrade to int makes other conversions implicit. - v1 = val + 1; - if(gflag) { // Gamma-corrected color? - r = pgm_read_byte(&gamma[(r * v1) >> 8]); // Gamma correction table maps - g = pgm_read_byte(&gamma[(g * v1) >> 8]); // 8-bit input to 4-bit output - b = pgm_read_byte(&gamma[(b * v1) >> 8]); - } else { // linear (uncorrected) color - r = (r * v1) >> 12; // 4-bit results - g = (g * v1) >> 12; - b = (b * v1) >> 12; - } - return (r << 12) | ((r & 0x8) << 8) | // 4/4/4 -> 5/6/5 - (g << 7) | ((g & 0xC) << 3) | - (b << 1) | ( b >> 3); -} diff --git a/examples/Advanced/matrix-serial-draw/matrix_rgb.h b/examples/Advanced/matrix-serial-draw/matrix_rgb.h deleted file mode 100644 index e765f9f..0000000 --- a/examples/Advanced/matrix-serial-draw/matrix_rgb.h +++ /dev/null @@ -1,135 +0,0 @@ -#ifndef MATRIX_RGB_H -#define MATRIX_RGB_H - -#include -#include -#include "Adafruit_GFX.h" -#include "utility/config.h" -#include "FS.h" -#include "SD.h" - -#define ILI9341_TFTWIDTH 240 -#define ILI9341_TFTHEIGHT 320 - -#define ILI9341_NOP 0x00 -#define ILI9341_SWRESET 0x01 -#define ILI9341_RDDID 0x04 -#define ILI9341_RDDST 0x09 - -#define ILI9341_SLPIN 0x10 -#define ILI9341_SLPOUT 0x11 -#define ILI9341_PTLON 0x12 -#define ILI9341_NORON 0x13 - -#define ILI9341_RDMODE 0x0A -#define ILI9341_RDMADCTL 0x0B -#define ILI9341_RDPIXFMT 0x0C -#define ILI9341_RDIMGFMT 0x0D -#define ILI9341_RDSELFDIAG 0x0F - -#define ILI9341_INVOFF 0x20 -#define ILI9341_INVON 0x21 -#define ILI9341_GAMMASET 0x26 -#define ILI9341_DISPOFF 0x28 -#define ILI9341_DISPON 0x29 - -#define ILI9341_CASET 0x2A -#define ILI9341_PASET 0x2B -#define ILI9341_RAMWR 0x2C -#define ILI9341_RAMRD 0x2E - -#define ILI9341_PTLAR 0x30 -#define ILI9341_MADCTL 0x36 -#define ILI9341_VSCRSADD 0x37 -#define ILI9341_PIXFMT 0x3A - -#define ILI9341_FRMCTR1 0xB1 -#define ILI9341_FRMCTR2 0xB2 -#define ILI9341_FRMCTR3 0xB3 -#define ILI9341_INVCTR 0xB4 -#define ILI9341_DFUNCTR 0xB6 - -#define ILI9341_PWCTR1 0xC0 -#define ILI9341_PWCTR2 0xC1 -#define ILI9341_PWCTR3 0xC2 -#define ILI9341_PWCTR4 0xC3 -#define ILI9341_PWCTR5 0xC4 -#define ILI9341_VMCTR1 0xC5 -#define ILI9341_VMCTR2 0xC7 - -#define ILI9341_RDID1 0xDA -#define ILI9341_RDID2 0xDB -#define ILI9341_RDID3 0xDC -#define ILI9341_RDID4 0xDD - -#define ILI9341_GMCTRP1 0xE0 -#define ILI9341_GMCTRN1 0xE1 -/* -#define ILI9341_PWCTR6 0xFC - - */ - -// Color definitions -#define ILI9341_BLACK 0x0000 /* 0, 0, 0 */ -#define ILI9341_NAVY 0x000F /* 0, 0, 128 */ -#define ILI9341_DARKGREEN 0x03E0 /* 0, 128, 0 */ -#define ILI9341_DARKCYAN 0x03EF /* 0, 128, 128 */ -#define ILI9341_MAROON 0x7800 /* 128, 0, 0 */ -#define ILI9341_PURPLE 0x780F /* 128, 0, 128 */ -#define ILI9341_OLIVE 0x7BE0 /* 128, 128, 0 */ -#define ILI9341_LIGHTGREY 0xC618 /* 192, 192, 192 */ -#define ILI9341_DARKGREY 0x7BEF /* 128, 128, 128 */ -#define ILI9341_BLUE 0x001F /* 0, 0, 255 */ -#define ILI9341_GREEN 0x07E0 /* 0, 255, 0 */ -#define ILI9341_CYAN 0x07FF /* 0, 255, 255 */ -#define ILI9341_RED 0xF800 /* 255, 0, 0 */ -#define ILI9341_MAGENTA 0xF81F /* 255, 0, 255 */ -#define ILI9341_YELLOW 0xFFE0 /* 255, 255, 0 */ -#define ILI9341_WHITE 0xFFFF /* 255, 255, 255 */ -#define ILI9341_ORANGE 0xFD20 /* 255, 165, 0 */ -#define ILI9341_GREENYELLOW 0xAFE5 /* 173, 255, 47 */ -#define ILI9341_PINK 0xF81F - -#define WHITE 0xFFFF -#define BLACK 0x0000 -#define BLUE 0x001F -#define BRED 0XF81F -#define GRED 0XFFE0 -#define GBLUE 0X07FF -#define RED 0xF800 -#define MAGENTA 0xF81F -#define GREEN 0x07E0 -#define CYAN 0x7FFF -#define YELLOW 0xFFE0 -#define BROWN 0XBC40 -#define BRRED 0XFC07 -#define GRAY 0X8430 - -#ifndef _swap_int16_t -#define _swap_int16_t(a, b) { int16_t t = a; a = b; b = t; } -#endif - -class MATRIX_RGB : public Adafruit_GFX { - - public: -// M5STACK_TFTLCD(int8_t _CS = SPI_CS_PIN, int8_t _DC = LCD_RS_PIN, int8_t _RST = LCD_RST_PIN); - MATRIX_RGB(); - - void begin(void); - void drawPixel(int16_t x, int16_t y, uint16_t color); -// void writePixel(int16_t x, int16_t y, uint16_t color); - - uint16_t - Color333(uint8_t r, uint8_t g, uint8_t b), - Color444(uint8_t r, uint8_t g, uint8_t b), - Color888(uint8_t r, uint8_t g, uint8_t b), - Color888(uint8_t r, uint8_t g, uint8_t b, boolean gflag), - ColorHSV(long hue, uint8_t sat, uint8_t val, boolean gflag); - - private: - -}; - - - -#endif diff --git a/examples/Basics/FactoryTest/FactoryTest.ino b/examples/Basics/FactoryTest/FactoryTest.ino index 64a15ac..c73d84b 100644 --- a/examples/Basics/FactoryTest/FactoryTest.ino +++ b/examples/Basics/FactoryTest/FactoryTest.ino @@ -56,7 +56,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ } } -void readFile(fs::FS &fs, const char * path){ +void readFile(fs::FS &fs, const char * path) { Serial.printf("Reading file: %s\n", path); m5.Lcd.printf("Reading file: %s\n", path); @@ -95,34 +95,6 @@ void writeFile(fs::FS &fs, const char * path, const char * message){ } } -// void startup_logo() { -// m5.lcd.setBrightness(0); -// m5.lcd.drawBitmap(0, 0, 320, 240, (uint16_t *)gImage_logoM5); -// static uint8_t brightness, pre_b; -// uint32_t length = strlen((char*)m5stack_startup_music); -// uint8_t _volume = 2; -// uint16_t delay_interval = ((uint32_t)1000000/20000); -// if(_volume != 0) { -// for(int i=0; i>2); -// delayMicroseconds(40); -// brightness = (i/157); -// if(pre_b != brightness) { -// pre_b = brightness; -// m5.lcd.setBrightness(brightness); -// } -// } -// } - -// for(int i=255; i>=0; i--) { -// m5.lcd.setBrightness(i); -// // delayMicroseconds(1500); -// delay(2); -// } -// m5.Lcd.fillScreen(BLACK); -// delay(1000); -// } - void buttons_test() { if(M5.BtnA.wasPressed()) { M5.Lcd.printf("A"); @@ -171,9 +143,7 @@ void wifi_test() { // the setup routine runs once when M5Stack starts up void setup() { // initialize the M5Stack object - // GPIO_test(); m5.begin(); - // startup_logo(); m5.startupLogo(); // Lcd display diff --git a/examples/Basics/Speaker/Speaker.ino b/examples/Basics/Speaker/Speaker.ino index 533b15c..60df9eb 100644 --- a/examples/Basics/Speaker/Speaker.ino +++ b/examples/Basics/Speaker/Speaker.ino @@ -30,7 +30,7 @@ void setup() { // Initialize the M5Stack object M5.begin(); - + M5.Speaker.setVolume(8); M5.Speaker.playMusic(m5stack_startup_music, 25000); } diff --git a/examples/Basics/bitmap/bitmap.ino b/examples/Basics/bitmap/bitmap.ino deleted file mode 100644 index a8c129f..0000000 --- a/examples/Basics/bitmap/bitmap.ino +++ /dev/null @@ -1,316 +0,0 @@ -/*************************************************** - This is our Bitmap drawing example for the Adafruit ILI9341 Breakout and Shield - ----> http://www.adafruit.com/products/1651 - - Check out the links above for our tutorials and wiring diagrams - These displays use SPI to communicate, 4 or 5 pins are required to - interface (RST is optional) - Adafruit invests time and resources providing this open source code, - please support Adafruit and open-source hardware by purchasing - products from Adafruit! - - Written by Limor Fried/Ladyada for Adafruit Industries. - MIT license, all text above must be included in any redistribution - ****************************************************/ - - -// #include // Hardware-specific library -// #include -// #include -#include - -// TFT display and SD card will share the hardware SPI interface. -// Hardware SPI pins are specific to the Arduino board type and -// cannot be remapped to alternate pins. For Arduino Uno, -// Duemilanove, etc., pin 11 = MOSI, pin 12 = MISO, pin 13 = SCK. - -// #define TFT_DC 9 -// #define TFT_CS 10 -// ILI9341_t3 tft = ILI9341_t3(TFT_CS, TFT_DC); -// #define SD_CS 4 - -void setup(void) { - delay(2000); - Serial.begin(115200); - - // M5.Lcd.begin(); - M5.begin(); - M5.Lcd.fillScreen(ILI9341_BLUE); - - Serial.print("Initializing SD card..."); - if (!SD.begin(TFCARD_CS_PIN)) { - Serial.println("failed!"); - } - Serial.println("OK!"); - // bmpDraw("/WechatIMG128.bmp", 0, 0); -} - -void loop() { - delay(2000); - Serial.println("Try using writeRect"); - M5.Lcd.fillScreen(ILI9341_BLACK); - M5.Lcd.bmpDraw("/camera2.bmp", 0, 0); - // bmpDrawWriteRect("/WechatIMG410.bmp", 64, 64); - // bmpDrawWriteRect("/WechatIMG128.bmp", 0, 0); - // M5.Lcd.bmp("/WechatIMG128.bmp", 0, 0); - - // delay(2000); - // Serial.println("Using pushCOlor"); - // M5.Lcd.fillScreen(ILI9341_BLUE); - // bmpDraw("/WechatIMG410.bmp", 0, 0); -} - -// This function opens a Windows Bitmap (BMP) file and -// displays it at the given coordinates. It's sped up -// by reading many pixels worth of data at a time -// (rather than pixel by pixel). Increasing the buffer -// size takes more of the Arduino's precious RAM but -// makes loading a little faster. 20 pixels seems a -// good balance. - -// #define BUFFPIXEL 20 - -// void bmpDraw(char *filename, uint8_t x, uint16_t y) { - -// File bmpFile; -// int bmpWidth, bmpHeight; // W+H in pixels -// uint8_t bmpDepth; // Bit depth (currently must be 24) -// uint32_t bmpImageoffset; // Start of image data in file -// uint32_t rowSize; // Not always = bmpWidth; may have padding -// uint8_t sdbuffer[3*BUFFPIXEL]; // pixel buffer (R+G+B per pixel) -// uint8_t buffidx = sizeof(sdbuffer); // Current position in sdbuffer -// boolean goodBmp = false; // Set to true on valid header parse -// boolean flip = true; // BMP is stored bottom-to-top -// int w, h, row, col; -// uint8_t r, g, b; -// uint32_t pos = 0, startTime = millis(); - -// if((x >= M5.Lcd.width()) || (y >= M5.Lcd.height())) return; - -// Serial.println(); -// Serial.print(F("Loading image '")); -// Serial.print(filename); -// Serial.println('\''); - -// // Open requested file on SD card -// if ((bmpFile = SD.open(filename)) == NULL) { -// Serial.print(F("File not found")); -// return; -// } - -// // Parse BMP header -// if(read16(bmpFile) == 0x4D42) { // BMP signature -// Serial.print(F("File size: ")); Serial.println(read32(bmpFile)); -// (void)read32(bmpFile); // Read & ignore creator bytes -// bmpImageoffset = read32(bmpFile); // Start of image data -// Serial.print(F("Image Offset: ")); Serial.println(bmpImageoffset, DEC); -// // Read DIB header -// Serial.print(F("Header size: ")); Serial.println(read32(bmpFile)); -// bmpWidth = read32(bmpFile); -// bmpHeight = read32(bmpFile); -// if(read16(bmpFile) == 1) { // # planes -- must be '1' -// bmpDepth = read16(bmpFile); // bits per pixel -// Serial.print(F("Bit Depth: ")); Serial.println(bmpDepth); -// if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed - -// goodBmp = true; // Supported BMP format -- proceed! -// Serial.print(F("Image size: ")); -// Serial.print(bmpWidth); -// Serial.print('x'); -// Serial.println(bmpHeight); - -// // BMP rows are padded (if needed) to 4-byte boundary -// rowSize = (bmpWidth * 3 + 3) & ~3; - -// // If bmpHeight is negative, image is in top-down order. -// // This is not canon but has been observed in the wild. -// if(bmpHeight < 0) { -// bmpHeight = -bmpHeight; -// flip = false; -// } - -// // Crop area to be loaded -// w = bmpWidth; -// h = bmpHeight; -// if((x+w-1) >= M5.Lcd.width()) w = M5.Lcd.width() - x; -// if((y+h-1) >= M5.Lcd.height()) h = M5.Lcd.height() - y; - -// // Set TFT address window to clipped image bounds -// M5.Lcd.setAddrWindow(x, y, x+w-1, y+h-1); - -// for (row=0; row= sizeof(sdbuffer)) { // Indeed -// bmpFile.read(sdbuffer, sizeof(sdbuffer)); -// buffidx = 0; // Set index to beginning -// } - -// // Convert pixel from BMP to TFT format, push to display -// b = sdbuffer[buffidx++]; -// g = sdbuffer[buffidx++]; -// r = sdbuffer[buffidx++]; -// M5.Lcd.pushColor(M5.Lcd.color565(r,g,b)); -// } // end pixel -// } // end scanline -// Serial.print(F("Loaded in ")); -// Serial.print(millis() - startTime); -// Serial.println(" ms"); -// } // end goodBmp -// } -// } - -// bmpFile.close(); -// if(!goodBmp) Serial.println(F("BMP format not recognized.")); -// } - - -// //=========================================================== -// // Try Draw using writeRect -// void bmpDrawWriteRect(char *filename, uint8_t x, uint16_t y) { - -// File bmpFile; -// int bmpWidth, bmpHeight; // W+H in pixels -// uint8_t bmpDepth; // Bit depth (currently must be 24) -// uint32_t bmpImageoffset; // Start of image data in file -// uint32_t rowSize; // Not always = bmpWidth; may have padding -// uint8_t sdbuffer[3*BUFFPIXEL]; // pixel buffer (R+G+B per pixel) -// uint8_t buffidx = sizeof(sdbuffer); // Current position in sdbuffer -// boolean goodBmp = false; // Set to true on valid header parse -// boolean flip = true; // BMP is stored bottom-to-top -// int w, h, row, col; -// uint8_t r, g, b; -// uint32_t pos = 0, startTime = millis(); - -// uint16_t awColors[320]; // hold colors for one row at a time... - -// if((x >= M5.Lcd.width()) || (y >= M5.Lcd.height())) return; - -// Serial.println(); -// Serial.print(F("Loading image '")); -// Serial.print(filename); -// Serial.println('\''); - -// // Open requested file on SD card -// if ((bmpFile = SD.open(filename)) == NULL) { -// Serial.print(F("File not found")); -// return; -// } - -// // Parse BMP header -// if(read16(bmpFile) == 0x4D42) { // BMP signature -// Serial.print(F("File size: ")); Serial.println(read32(bmpFile)); -// (void)read32(bmpFile); // Read & ignore creator bytes -// bmpImageoffset = read32(bmpFile); // Start of image data -// Serial.print(F("Image Offset: ")); Serial.println(bmpImageoffset, DEC); -// // Read DIB header -// Serial.print(F("Header size: ")); Serial.println(read32(bmpFile)); -// bmpWidth = read32(bmpFile); -// bmpHeight = read32(bmpFile); -// if(read16(bmpFile) == 1) { // # planes -- must be '1' -// bmpDepth = read16(bmpFile); // bits per pixel -// Serial.print(F("Bit Depth: ")); Serial.println(bmpDepth); -// if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed - -// goodBmp = true; // Supported BMP format -- proceed! -// Serial.print(F("Image size: ")); -// Serial.print(bmpWidth); -// Serial.print('x'); -// Serial.println(bmpHeight); - -// // BMP rows are padded (if needed) to 4-byte boundary -// rowSize = (bmpWidth * 3 + 3) & ~3; - -// // If bmpHeight is negative, image is in top-down order. -// // This is not canon but has been observed in the wild. -// if(bmpHeight < 0) { -// bmpHeight = -bmpHeight; -// flip = false; -// } - -// // Crop area to be loaded -// w = bmpWidth; -// h = bmpHeight; -// if((x+w-1) >= M5.Lcd.width()) w = M5.Lcd.width() - x; -// if((y+h-1) >= M5.Lcd.height()) h = M5.Lcd.height() - y; - -// for (row=0; row= sizeof(sdbuffer)) { // Indeed -// bmpFile.read(sdbuffer, sizeof(sdbuffer)); -// buffidx = 0; // Set index to beginning -// } - -// // Convert pixel from BMP to TFT format, push to display -// b = sdbuffer[buffidx++]; -// g = sdbuffer[buffidx++]; -// r = sdbuffer[buffidx++]; -// awColors[col] = M5.Lcd.color565(r,g,b); -// } // end pixel -// // M5.Lcd.writeRect(0, row, w, 1, awColors); -// // M5.Lcd.drawBitmap(0, row, w, 1, awColors); -// M5.Lcd.drawBitmap(x, row+y, w, 1, awColors); -// } // end scanline -// Serial.print(F("Loaded in ")); -// Serial.print(millis() - startTime); -// Serial.println(" ms"); -// } // end goodBmp -// } -// } - -// bmpFile.close(); -// if(!goodBmp) Serial.println(F("BMP format not recognized.")); -// } - -// These read 16- and 32-bit types from the SD card file. -// BMP data is stored little-endian, Arduino is little-endian too. -// May need to reverse subscript order if porting elsewhere. - -// uint16_t read16(File &f) { -// uint16_t result; -// ((uint8_t *)&result)[0] = f.read(); // LSB -// ((uint8_t *)&result)[1] = f.read(); // MSB -// return result; -// } - -// uint32_t read32(File &f) { -// uint32_t result; -// ((uint8_t *)&result)[0] = f.read(); // LSB -// ((uint8_t *)&result)[1] = f.read(); -// ((uint8_t *)&result)[2] = f.read(); -// ((uint8_t *)&result)[3] = f.read(); // MSB -// return result; -// } diff --git a/keywords.txt b/keywords.txt index 6827607..6079cb8 100644 --- a/keywords.txt +++ b/keywords.txt @@ -18,6 +18,8 @@ */ M5Stack KEYWORD3 +M5 KEYWORD3 +m5 KEYWORD3 display KEYWORD1 buttons KEYWORD1 @@ -25,6 +27,7 @@ buttons KEYWORD1 begin KEYWORD1 update KEYWORD1 startupLogo KEYWORD1 +Speaker KEYWORD1 ////////////////////////buttons pressed KEYWORD1 diff --git a/utility/Display.h b/utility/Display.h index 3e32eab..cdec863 100644 --- a/utility/Display.h +++ b/utility/Display.h @@ -42,9 +42,6 @@ typedef struct { // Data stored for FONT AS A WHOLE: #include -// #include -// #include "utility/GFX_Library/dafruit_GFX.h" -// #include "gfxfont.h" #include #define ILI9341_TFTWIDTH 320 diff --git a/utility/Speaker.cpp b/utility/Speaker.cpp index 1545a7a..d3be562 100644 --- a/utility/Speaker.cpp +++ b/utility/Speaker.cpp @@ -66,6 +66,4 @@ void SPEAKER::playMusic(const uint8_t* music_data, uint16_t sample_rate) { delay(2); } } - pinMode(25, OUTPUT); - digitalWrite(25, 0); }