From: Nils Forssén Date: Mon, 12 Aug 2024 05:47:26 +0000 (+0200) Subject: old uncommited changes X-Git-Url: https://gitweb.forssennils.se/?a=commitdiff_plain;ds=sidebyside;p=e-paper-project.git old uncommited changes --- diff --git a/.gitignore b/.gitignore index 83bda18..f79ca8a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ -credentials.h -*.txt +credentials.h +*.txt .vscode \ No newline at end of file diff --git a/e-paper-project/bmp.cpp b/e-paper-project/bmp.cpp index 6e0798d..480908e 100644 --- a/e-paper-project/bmp.cpp +++ b/e-paper-project/bmp.cpp @@ -1,46 +1,46 @@ -#include "include/bmp.h" -#include "include/sd_card.h" - -BMP::BMP(const char* filename) : - bmp_file{SD_card_fs::get_file(filename)}, - data_idx{0} -{ - - bmp_file->seek(10); // idx of 4 bytes representing start of image data - - data_idx = bmp_file->read(); - - for(uint8_t i{0}; i < 3; i++) - { - data_idx << 8; - data_idx |= bmp_file->read(); - } - - bmp_file->seek(data_idx); -} - -char BMP::read_pixel() -{ - return bmp_file->read(); -} - -void BMP::read_pixel(const char* buffer, const uint32_t len) -{ - bmp_file->read((uint8_t*)buffer, len); -} - -uint32_t BMP::position() const -{ - return bmp_file->position(); -} - -uint32_t BMP::available() const -{ - return bmp_file->available(); -} - -void BMP::seek(const uint32_t pos) -{ - if (pos < data_idx) bmp_file->seek(data_idx); - else bmp_file->seek(pos); -} +#include "include/bmp.h" +#include "include/sd_card.h" + +BMP::BMP(const char* filename) : + bmp_file{SD_card_fs::get_file(filename)}, + data_idx{0} +{ + + bmp_file->seek(10); // idx of 4 bytes representing start of image data + + data_idx = bmp_file->read(); + + for(uint8_t i{0}; i < 3; i++) + { + data_idx << 8; + data_idx |= bmp_file->read(); + } + + bmp_file->seek(data_idx); +} + +char BMP::read_pixel() +{ + return bmp_file->read(); +} + +void BMP::read_pixel(const char* buffer, const uint32_t len) +{ + bmp_file->read((uint8_t*)buffer, len); +} + +uint32_t BMP::position() const +{ + return bmp_file->position(); +} + +uint32_t BMP::available() const +{ + return bmp_file->available(); +} + +void BMP::seek(const uint32_t pos) +{ + if (pos < data_idx) bmp_file->seek(data_idx); + else bmp_file->seek(pos); +} diff --git a/e-paper-project/e-paper-project.ino b/e-paper-project/e-paper-project.ino index c3f5dba..0f7984e 100644 --- a/e-paper-project/e-paper-project.ino +++ b/e-paper-project/e-paper-project.ino @@ -1,41 +1,41 @@ -#include "include/sd_card.h" -#include "include/bmp.h" -#include "include/web_server.h" - -/** - * @file e-paper-project.ino - * @author Nils Forssén (nilsforssen.se) - * @brief - * Project-sketch to fetch images from an web-server, process them (scaling and dithering) - * and then display them on an E-paper-display (SPI). Should switch image every 24 hours - * and go to sleep in between. Should support adding, removing and listing images on SD-card - * via a webserver as long as a physical switch is set high. When switched low, the - * device go back to the daily sleep->image->sleep cycle. - * - * @version 1.0 - * @date 2023-12-13 - * - * @copyright Copyright (c) 2023 - */ - - -/** - * Connect the SPI bus to SD-card and E-paper - * MOSI - GPIO 23 - * MISO - GPIO 19 - * SCLK - GPIO 18 - * CS - [SD to GPIO 5] or [E-paper to GPIO 17] -*/ - -void setup(){ - Serial.begin(115200); - - SD_card_fs::init_SD(5); - Web_server::init_wifi(); - Web_server::init_server(); -} - -void loop() -{ - Web_server::handle_client(); +#include "include/sd_card.h" +#include "include/bmp.h" +#include "include/web_server.h" + +/** + * @file e-paper-project.ino + * @author Nils Forssén (nilsforssen.se) + * @brief + * Project-sketch to fetch images from an web-server, process them (scaling and dithering) + * and then display them on an E-paper-display (SPI). Should switch image every 24 hours + * and go to sleep in between. Should support adding, removing and listing images on SD-card + * via a webserver as long as a physical switch is set high. When switched low, the + * device go back to the daily sleep->image->sleep cycle. + * + * @version 1.0 + * @date 2023-12-13 + * + * @copyright Copyright (c) 2023 + */ + + +/** + * Connect the SPI bus to SD-card and E-paper + * MOSI - GPIO 23 + * MISO - GPIO 19 + * SCLK - GPIO 18 + * CS - [SD to GPIO 5] or [E-paper to GPIO 17] +*/ + +void setup(){ + Serial.begin(115200); + + SD_card_fs::init_SD(5); + Web_server::init_wifi(); + Web_server::init_server(); +} + +void loop() +{ + Web_server::handle_client(); } \ No newline at end of file diff --git a/e-paper-project/epd_spi.cpp b/e-paper-project/epd_spi.cpp index b2bab5d..93b2ed3 100644 --- a/e-paper-project/epd_spi.cpp +++ b/e-paper-project/epd_spi.cpp @@ -1,155 +1,155 @@ -#include "include/epd_spi.h" -#include "include/bmp.h" - -EPD_SPI_interface::EPD_SPI_interface(const epd_spi_pinout& p) : pinout{p} -{ - // init SPI pins - pinMode(pinout.pin_busy, INPUT); - pinMode(pinout.pin_rst, OUTPUT); - pinMode(pinout.pin_dc, OUTPUT); - pinMode(pinout.pin_clk, OUTPUT); - pinMode(pinout.pin_din, OUTPUT); - pinMode(pinout.pin_cs, OUTPUT); - - digitalWrite(pinout.pin_cs , HIGH); - digitalWrite(pinout.pin_clk, LOW); - - // init EPD - digitalWrite(pinout.pin_rst, HIGH); - delay(200); - digitalWrite(pinout.pin_rst, LOW); - delay(5); - digitalWrite(pinout.pin_rst, HIGH); - delay(200); - - // send init-data - waitfor_busyhigh(); - send_command(0x00); - send_byte(0xEF); - send_byte(0x08); - send_command(0x01); - send_byte(0x37); - send_byte(0x00); - send_byte(0x23); - send_byte(0x23); - send_command(0x03); - send_byte(0x00); - send_command(0x06); - send_byte(0xC7); - send_byte(0xC7); - send_byte(0x1D); - send_command(0x30); - send_byte(0x3C); - send_command(0x41); - send_byte(0x00); - send_command(0x50); - send_byte(0x37); - send_command(0x60); - send_byte(0x22); - send_command(0x61); - send_byte(0x02); - send_byte(0x58); - send_byte(0x01); - send_byte(0xC0); - send_command(0xE3); - send_byte(0xAA); - delay(100); - send_command(0x50); - send_byte(0x37); - send_command(0x61); - send_byte(0x02); - send_byte(0x58); - send_byte(0x01); - send_byte(0xC0); - send_command(0x10); -} - -void EPD_SPI_interface::send_byte(byte data) -{ - digitalWrite(pinout.pin_dc, HIGH); - send_spi_data(data); -} - -void EPD_SPI_interface::send_command(byte command) -{ - digitalWrite(pinout.pin_dc, LOW); - send_spi_data(command); -} - -void EPD_SPI_interface::show() -{ - send_command(0x04); - waitfor_busyhigh(); - send_command(0x12); - waitfor_busyhigh(); - send_command(0x02); - waitfor_busylow(); - delay(200); -} - -void EPD_SPI_interface::sleep() -{ - delay(100); - send_command(0x07); - send_byte(0xA5); - delay(100); - digitalWrite(pinout.pin_rst, LOW); -} - -void EPD_SPI_interface::send_spi_data(byte data) -{ - digitalWrite(pinout.pin_cs, LOW); - - for (int i = 0; i < 8; i++) - { - if ((data & 0x80)) - { - digitalWrite(pinout.pin_din, HIGH); - } - else - { - digitalWrite(pinout.pin_din, LOW); - } - - data <<= 1; - digitalWrite(pinout.pin_clk, HIGH); - digitalWrite(pinout.pin_clk, LOW); - } - - digitalWrite(pinout.pin_cs, HIGH); -} - -void EPD_SPI_interface::waitfor_busyhigh() const -{ - while(!(digitalRead(pinout.pin_busy))); -} - -void EPD_SPI_interface::waitfor_busylow() const -{ - while(digitalRead(pinout.pin_busy)); -} - -void EPD_SPI_interface::display(std::unique_ptr bmp) -{ - bmp->seek(0); - for (uint32_t i{0}; i < EPD_HEIGHT; i++) - { - for (uint32_t j{0}; j < EPD_WIDTH / 2; i++) // Every byte is 2 pixels - { - send_byte(bmp->read_pixel()); - } - } - show(); -} - -void EPD_SPI_interface::fill(color c) -{ - for (uint32_t i{0}; i < EPD_HEIGHT; i++) - { - for (uint32_t j{0}; j < EPD_WIDTH / 2; i++) // Every byte is 2 pixels - { - send_byte((c << 4)|c); - } - } - show(); +#include "include/epd_spi.h" +#include "include/bmp.h" + +EPD_SPI_interface::EPD_SPI_interface(const epd_spi_pinout& p) : pinout{p} +{ + // init SPI pins + pinMode(pinout.pin_busy, INPUT); + pinMode(pinout.pin_rst, OUTPUT); + pinMode(pinout.pin_dc, OUTPUT); + pinMode(pinout.pin_clk, OUTPUT); + pinMode(pinout.pin_din, OUTPUT); + pinMode(pinout.pin_cs, OUTPUT); + + digitalWrite(pinout.pin_cs , HIGH); + digitalWrite(pinout.pin_clk, LOW); + + // init EPD + digitalWrite(pinout.pin_rst, HIGH); + delay(200); + digitalWrite(pinout.pin_rst, LOW); + delay(5); + digitalWrite(pinout.pin_rst, HIGH); + delay(200); + + // send init-data + waitfor_busyhigh(); + send_command(0x00); + send_byte(0xEF); + send_byte(0x08); + send_command(0x01); + send_byte(0x37); + send_byte(0x00); + send_byte(0x23); + send_byte(0x23); + send_command(0x03); + send_byte(0x00); + send_command(0x06); + send_byte(0xC7); + send_byte(0xC7); + send_byte(0x1D); + send_command(0x30); + send_byte(0x3C); + send_command(0x41); + send_byte(0x00); + send_command(0x50); + send_byte(0x37); + send_command(0x60); + send_byte(0x22); + send_command(0x61); + send_byte(0x02); + send_byte(0x58); + send_byte(0x01); + send_byte(0xC0); + send_command(0xE3); + send_byte(0xAA); + delay(100); + send_command(0x50); + send_byte(0x37); + send_command(0x61); + send_byte(0x02); + send_byte(0x58); + send_byte(0x01); + send_byte(0xC0); + send_command(0x10); +} + +void EPD_SPI_interface::send_byte(byte data) +{ + digitalWrite(pinout.pin_dc, HIGH); + send_spi_data(data); +} + +void EPD_SPI_interface::send_command(byte command) +{ + digitalWrite(pinout.pin_dc, LOW); + send_spi_data(command); +} + +void EPD_SPI_interface::show() +{ + send_command(0x04); + waitfor_busyhigh(); + send_command(0x12); + waitfor_busyhigh(); + send_command(0x02); + waitfor_busylow(); + delay(200); +} + +void EPD_SPI_interface::sleep() +{ + delay(100); + send_command(0x07); + send_byte(0xA5); + delay(100); + digitalWrite(pinout.pin_rst, LOW); +} + +void EPD_SPI_interface::send_spi_data(byte data) +{ + digitalWrite(pinout.pin_cs, LOW); + + for (int i = 0; i < 8; i++) + { + if ((data & 0x80)) + { + digitalWrite(pinout.pin_din, HIGH); + } + else + { + digitalWrite(pinout.pin_din, LOW); + } + + data <<= 1; + digitalWrite(pinout.pin_clk, HIGH); + digitalWrite(pinout.pin_clk, LOW); + } + + digitalWrite(pinout.pin_cs, HIGH); +} + +void EPD_SPI_interface::waitfor_busyhigh() const +{ + while(!(digitalRead(pinout.pin_busy))); +} + +void EPD_SPI_interface::waitfor_busylow() const +{ + while(digitalRead(pinout.pin_busy)); +} + +void EPD_SPI_interface::display(std::unique_ptr bmp) +{ + bmp->seek(0); + for (uint32_t i{0}; i < EPD_HEIGHT; i++) + { + for (uint32_t j{0}; j < EPD_WIDTH / 2; i++) // Every byte is 2 pixels + { + send_byte(bmp->read_pixel()); + } + } + show(); +} + +void EPD_SPI_interface::fill(color c) +{ + for (uint32_t i{0}; i < EPD_HEIGHT; i++) + { + for (uint32_t j{0}; j < EPD_WIDTH / 2; i++) // Every byte is 2 pixels + { + send_byte((c << 4)|c); + } + } + show(); } \ No newline at end of file diff --git a/e-paper-project/include/bmp.h b/e-paper-project/include/bmp.h index aeb3624..f47c120 100644 --- a/e-paper-project/include/bmp.h +++ b/e-paper-project/include/bmp.h @@ -1,38 +1,38 @@ -#ifndef BMP_H_ -#define BMP_H_ - -/** - * @file sd_card.h - * @author Nils Forssén (nilsforssen.se) - * @brief - * Useful filesystem functions for interacting with an SD-card - * - * @version 0.1 - * @date 2023-12-13 - * - * @copyright Copyright (c) 2023 - */ - -#include -#include - -class BMP -{ -public: - BMP(const char* filename); - ~BMP() = default; // Smart pointer closes itself! - - char read_pixel(); - void read_pixel(const char* buffer, const uint32_t len); - uint32_t position() const; - uint32_t available() const; - void seek(const uint32_t pos); - -protected: -private: - std::unique_ptr bmp_file; - uint32_t data_idx; -}; - - +#ifndef BMP_H_ +#define BMP_H_ + +/** + * @file sd_card.h + * @author Nils Forssén (nilsforssen.se) + * @brief + * Useful filesystem functions for interacting with an SD-card + * + * @version 0.1 + * @date 2023-12-13 + * + * @copyright Copyright (c) 2023 + */ + +#include +#include + +class BMP +{ +public: + BMP(const char* filename); + ~BMP() = default; // Smart pointer closes itself! + + char read_pixel(); + void read_pixel(const char* buffer, const uint32_t len); + uint32_t position() const; + uint32_t available() const; + void seek(const uint32_t pos); + +protected: +private: + std::unique_ptr bmp_file; + uint32_t data_idx; +}; + + #endif \ No newline at end of file diff --git a/e-paper-project/include/epd_spi.h b/e-paper-project/include/epd_spi.h index d19be33..7a63ff4 100644 --- a/e-paper-project/include/epd_spi.h +++ b/e-paper-project/include/epd_spi.h @@ -1,55 +1,55 @@ -#ifndef SIMPLE_SPI_H_ -#define SIMPLE_SPI_H_ - -#include -#include - -#define EPD_WIDTH 600 -#define EPD_HEIGHT 448 - -enum color: byte -{ - EPD_5IN65F_BLACK, /// 000 - EPD_5IN65F_WHITE, /// 001 - EPD_5IN65F_GREEN, /// 010 - EPD_5IN65F_BLUE, /// 011 - EPD_5IN65F_RED, /// 100 - EPD_5IN65F_YELLOW, /// 101 - EPD_5IN65F_ORANGE /// 110 -}; - -struct epd_spi_pinout -{ - const uint8_t pin_busy; - const uint8_t pin_rst; - const uint8_t pin_dc; - const uint8_t pin_cs; - const uint8_t pin_clk; - const uint8_t pin_din; -}; - -class BMP; - -class EPD_SPI_interface -{ -public: - EPD_SPI_interface(const epd_spi_pinout& p); - ~EPD_SPI_interface() = default; - - void send_byte(byte data); - void send_command(byte command); - void display(std::unique_ptr bmp); - void fill(color c); - - void show(); - void sleep(); -protected: -private: - void send_spi_data(byte data); - void waitfor_busyhigh() const; - void waitfor_busylow() const; - - const epd_spi_pinout pinout; -}; - -#endif +#ifndef SIMPLE_SPI_H_ +#define SIMPLE_SPI_H_ + +#include +#include + +#define EPD_WIDTH 600 +#define EPD_HEIGHT 448 + +enum color: byte +{ + EPD_5IN65F_BLACK, /// 000 + EPD_5IN65F_WHITE, /// 001 + EPD_5IN65F_GREEN, /// 010 + EPD_5IN65F_BLUE, /// 011 + EPD_5IN65F_RED, /// 100 + EPD_5IN65F_YELLOW, /// 101 + EPD_5IN65F_ORANGE /// 110 +}; + +struct epd_spi_pinout +{ + const uint8_t pin_busy; + const uint8_t pin_rst; + const uint8_t pin_dc; + const uint8_t pin_cs; + const uint8_t pin_clk; + const uint8_t pin_din; +}; + +class BMP; + +class EPD_SPI_interface +{ +public: + EPD_SPI_interface(const epd_spi_pinout& p); + ~EPD_SPI_interface() = default; + + void send_byte(byte data); + void send_command(byte command); + void display(std::unique_ptr bmp); + void fill(color c); + + void show(); + void sleep(); +protected: +private: + void send_spi_data(byte data); + void waitfor_busyhigh() const; + void waitfor_busylow() const; + + const epd_spi_pinout pinout; +}; + +#endif diff --git a/e-paper-project/include/sd_card.h b/e-paper-project/include/sd_card.h index 3bf689d..c4e4314 100644 --- a/e-paper-project/include/sd_card.h +++ b/e-paper-project/include/sd_card.h @@ -1,40 +1,40 @@ -#ifndef SD_CARD_H_ -#define SD_CARD_H_ - -/** - * @file sd_card.h - * @author Nils Forssén (nilsforssen.se) - * @brief - * Useful filesystem functions for interacting with an SD-card - * - * @date 2023-12-13 - * - * @copyright Copyright (c) 2023 - */ - -#include -#include - -typedef enum : uint8_t -{ - FS_OK = 0, - FS_FAIL = 1, - FS_WARNING = 2, -} fs_error_t; - -namespace SD_card_fs -{ - fs_error_t init_SD(const uint16_t cs); - fs_error_t create_dir(const char* path); - fs_error_t remove_dir(const char* path); - std::unique_ptr get_file(const char* path); - fs_error_t write_to_file(const char* path, const uint8_t* data, uint32_t len); // Make sure data is null-terminated - fs_error_t close_file(); - fs_error_t open_file(const char* path); - fs_error_t append_to_file(const uint8_t* data, uint32_t len); // Make sure data is null-terminated - fs_error_t rename_file(const char* path1, const char* path2); - fs_error_t delete_file(const char* path); -}; - - +#ifndef SD_CARD_H_ +#define SD_CARD_H_ + +/** + * @file sd_card.h + * @author Nils Forssén (nilsforssen.se) + * @brief + * Useful filesystem functions for interacting with an SD-card + * + * @date 2023-12-13 + * + * @copyright Copyright (c) 2023 + */ + +#include +#include + +typedef enum : uint8_t +{ + FS_OK = 0, + FS_FAIL = 1, + FS_WARNING = 2, +} fs_error_t; + +namespace SD_card_fs +{ + fs_error_t init_SD(const uint16_t cs); + fs_error_t create_dir(const char* path); + fs_error_t remove_dir(const char* path); + std::unique_ptr get_file(const char* path); + fs_error_t write_to_file(const char* path, const uint8_t* data, uint32_t len); // Make sure data is null-terminated + fs_error_t close_file(); + fs_error_t open_file(const char* path); + fs_error_t append_to_file(const uint8_t* data, uint32_t len); // Make sure data is null-terminated + fs_error_t rename_file(const char* path1, const char* path2); + fs_error_t delete_file(const char* path); +}; + + #endif \ No newline at end of file diff --git a/e-paper-project/include/web_HTML.h b/e-paper-project/include/web_HTML.h index d2043d3..6f1318b 100644 --- a/e-paper-project/include/web_HTML.h +++ b/e-paper-project/include/web_HTML.h @@ -1,31 +1,31 @@ -#ifndef WEB_HTML_H_ -#define WEB_HTML_H_ - -/** - * @file web_HTML.h - * @author Nils Forssén (nilsforssen.se) - * @brief - * web-server functionality based on https://github.com/G6EJD/ESP32-ESP8266-File-Download-Upload-Delete-Stream-and-Directory/tree/master - * - * @date 2023-12-14 - * - * @copyright Copyright (c) 2023 - */ - -namespace HTML_data -{ - const char home_page_str[] PROGMEM = ""; - - const char file_upload_str[] PROGMEM = "

Select File to Upload




[Back]

"; - - const char upload_finished_str[] PROGMEM = "

File was successfully uploaded

"; - - const char dir_page_str[] PROGMEM = "

SD Card Contents


"; - - const char append_page_header[] PROGMEM = "File Server

File Server

"; - - const char append_page_footer[] PROGMEM = ""; -}; - - +#ifndef WEB_HTML_H_ +#define WEB_HTML_H_ + +/** + * @file web_HTML.h + * @author Nils Forssén (nilsforssen.se) + * @brief + * web-server functionality based on https://github.com/G6EJD/ESP32-ESP8266-File-Download-Upload-Delete-Stream-and-Directory/tree/master + * + * @date 2023-12-14 + * + * @copyright Copyright (c) 2023 + */ + +namespace HTML_data +{ + const char home_page_str[] PROGMEM = ""; + + const char file_upload_str[] PROGMEM = "

Select File to Upload




[Back]

"; + + const char upload_finished_str[] PROGMEM = "

File was successfully uploaded

"; + + const char dir_page_str[] PROGMEM = "

SD Card Contents


Name/TypeType File/DirFile Size
"; + + const char append_page_header[] PROGMEM = "File Server

File Server

"; + + const char append_page_footer[] PROGMEM = ""; +}; + + #endif \ No newline at end of file diff --git a/e-paper-project/include/web_server.h b/e-paper-project/include/web_server.h index 7e6d880..47cc880 100644 --- a/e-paper-project/include/web_server.h +++ b/e-paper-project/include/web_server.h @@ -1,35 +1,35 @@ -#ifndef WEB_SERVER_H_ -#define WEB_SERVER_H_ - -/** - * @file web_server.h - * @author Nils Forssén (nilsforssen.se) - * @brief - * web-server functionality based on https://github.com/G6EJD/ESP32-ESP8266-File-Download-Upload-Delete-Stream-and-Directory/tree/master - * - * @date 2023-12-14 - * - * @copyright Copyright (c) 2023 - */ - -#ifdef ESP8266 - #include - #include - #include -#else - #include - #include -#endif - -#include "credentials.h" - -#define SERVER_PORT 80 - -namespace Web_server -{ - void init_wifi(); - void init_server(); - void handle_client(); -}; - +#ifndef WEB_SERVER_H_ +#define WEB_SERVER_H_ + +/** + * @file web_server.h + * @author Nils Forssén (nilsforssen.se) + * @brief + * web-server functionality based on https://github.com/G6EJD/ESP32-ESP8266-File-Download-Upload-Delete-Stream-and-Directory/tree/master + * + * @date 2023-12-14 + * + * @copyright Copyright (c) 2023 + */ + +#ifdef ESP8266 + #include + #include + #include +#else + #include + #include +#endif + +#include "credentials.h" + +#define SERVER_PORT 80 + +namespace Web_server +{ + void init_wifi(); + void init_server(); + void handle_client(); +}; + #endif \ No newline at end of file diff --git a/e-paper-project/sd_card.cpp b/e-paper-project/sd_card.cpp index f2bce73..2ef90d5 100644 --- a/e-paper-project/sd_card.cpp +++ b/e-paper-project/sd_card.cpp @@ -1,118 +1,118 @@ -#include "include/sd_card.h" - -static File file; -namespace SD_card_fs -{ - fs_error_t init_SD(const uint16_t cs) - { - if(!SD.begin(cs)){ - Serial.println("Card Mount Failed"); - return FS_FAIL; - } - uint8_t cardType = SD.cardType(); - - if(cardType == CARD_NONE){ - Serial.println("No SD card attached"); - return FS_FAIL; - } - - Serial.printf("SD card initialized!\nSize: %lluMB\n", SD.cardSize() / (1024 * 1024)); - return FS_OK; - } - - fs_error_t create_dir(const char* path) - { - if(SD.mkdir(path)){ - Serial.printf("Created directory: %s\n", path); - return FS_OK; - } else { - Serial.printf("failed to create directory: %s\n", path); - return FS_FAIL; - } - } - - fs_error_t remove_dir(const char* path) - { - if(SD.rmdir(path)){ - Serial.printf("Removed directory: %s\n", path); - return FS_OK; - } else { - Serial.printf("failed to remove directory: %s\n", path); - return FS_FAIL; - } - } - - std::unique_ptr get_file(const char* path) - { - File* file = new File{SD.open(path)}; - if(!(*file)){ - Serial.printf("failed to open file: %s\n", path); - return nullptr; - } - return std::unique_ptr{file}; - } - - fs_error_t open_file(const char* path) - { - file = SD.open(path, FILE_WRITE); - if(!file){ - Serial.printf("failed to open file: %s\n", path); - return FS_FAIL; - } - return FS_OK; - } - - fs_error_t close_file() - { - file.close(); - return FS_OK; - } - - fs_error_t write_to_file(const char* path, const uint8_t* data, uint32_t len) - { - open_file(path); - - if(file.write(&data[0], len)){ - Serial.printf("File written: %s\n", path); - close_file(); - return FS_OK; - } else { - Serial.printf("Write failed: %s\n", path); - close_file(); - return FS_FAIL; - } - } - - - - fs_error_t append_to_file(const uint8_t* data, uint32_t len) - { - if(file.write(&data[0], len)){ - Serial.printf("Message appended\n"); - return FS_OK; - } else { - Serial.printf("Append failed\n"); - return FS_FAIL; - } - } - - fs_error_t rename_file(const char* path1, const char* path2){ - if (SD.rename(path1, path2)) { - Serial.printf("File renamed: %s to %s\n", path1, path2); - return FS_OK; - } else { - Serial.printf("Rename failed: %s to %s\n", path1, path2); - return FS_FAIL; - } - } - - fs_error_t delete_file(const char* path){ - if(SD.remove(path)){ - Serial.printf("File deleted: %s\n", path); - return FS_OK; - } else { - Serial.printf("Delete failed: %s\n", path); - return FS_FAIL; - } - } +#include "include/sd_card.h" + +static File file; +namespace SD_card_fs +{ + fs_error_t init_SD(const uint16_t cs) + { + if(!SD.begin(cs)){ + Serial.println("Card Mount Failed"); + return FS_FAIL; + } + uint8_t cardType = SD.cardType(); + + if(cardType == CARD_NONE){ + Serial.println("No SD card attached"); + return FS_FAIL; + } + + Serial.printf("SD card initialized!\nSize: %lluMB\n", SD.cardSize() / (1024 * 1024)); + return FS_OK; + } + + fs_error_t create_dir(const char* path) + { + if(SD.mkdir(path)){ + Serial.printf("Created directory: %s\n", path); + return FS_OK; + } else { + Serial.printf("failed to create directory: %s\n", path); + return FS_FAIL; + } + } + + fs_error_t remove_dir(const char* path) + { + if(SD.rmdir(path)){ + Serial.printf("Removed directory: %s\n", path); + return FS_OK; + } else { + Serial.printf("failed to remove directory: %s\n", path); + return FS_FAIL; + } + } + + std::unique_ptr get_file(const char* path) + { + File* file = new File{SD.open(path)}; + if(!(*file)){ + Serial.printf("failed to open file: %s\n", path); + return nullptr; + } + return std::unique_ptr{file}; + } + + fs_error_t open_file(const char* path) + { + file = SD.open(path, FILE_WRITE); + if(!file){ + Serial.printf("failed to open file: %s\n", path); + return FS_FAIL; + } + return FS_OK; + } + + fs_error_t close_file() + { + file.close(); + return FS_OK; + } + + fs_error_t write_to_file(const char* path, const uint8_t* data, uint32_t len) + { + open_file(path); + + if(file.write(&data[0], len)){ + Serial.printf("File written: %s\n", path); + close_file(); + return FS_OK; + } else { + Serial.printf("Write failed: %s\n", path); + close_file(); + return FS_FAIL; + } + } + + + + fs_error_t append_to_file(const uint8_t* data, uint32_t len) + { + if(file.write(&data[0], len)){ + Serial.printf("Message appended\n"); + return FS_OK; + } else { + Serial.printf("Append failed\n"); + return FS_FAIL; + } + } + + fs_error_t rename_file(const char* path1, const char* path2){ + if (SD.rename(path1, path2)) { + Serial.printf("File renamed: %s to %s\n", path1, path2); + return FS_OK; + } else { + Serial.printf("Rename failed: %s to %s\n", path1, path2); + return FS_FAIL; + } + } + + fs_error_t delete_file(const char* path){ + if(SD.remove(path)){ + Serial.printf("File deleted: %s\n", path); + return FS_OK; + } else { + Serial.printf("Delete failed: %s\n", path); + return FS_FAIL; + } + } } \ No newline at end of file diff --git a/e-paper-project/web_server.cpp b/e-paper-project/web_server.cpp index 5eeacb7..d43b522 100644 --- a/e-paper-project/web_server.cpp +++ b/e-paper-project/web_server.cpp @@ -1,159 +1,159 @@ -#include "include/web_server.h" -#include "include/web_HTML.h" -#include "include/sd_card.h" - -#ifdef ESP8266 - static ESP8266WebServer server{SERVER_PORT}; -#else - static ESP32WebServer server{SERVER_PORT}; -#endif - -static void send_HTML_page(const char* webpage) -{ - server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); - server.sendHeader("Pragma", "no-cache"); - server.sendHeader("Expires", "-1"); - server.setContentLength(CONTENT_LENGTH_UNKNOWN); - server.send(200, "text/html", ""); // Empty content inhibits Content-length header so we have to close the socket ourselves. - server.sendContent(HTML_data::append_page_header); - - server.sendContent(webpage); - server.sendContent(HTML_data::append_page_footer); - server.client().stop(); -} - -static void home_page() -{ - send_HTML_page(HTML_data::home_page_str); -} - -static void dir_page() -{ - // Only lists files and directories in root "/", no recursion into folders... - - std::unique_ptr root = SD_card_fs::get_file("/"); - if (*root) - { - root->rewindDirectory(); - String web_content {HTML_data::dir_page_str}; - - File file = root->openNextFile(); - while (file) - { - // Serial.print(String(file.name())+"\t"); - web_content += ""; - Serial.print(String(file.isDirectory() ? "Dir " : "File ") + String(file.name()) + "\t"); - web_content += ""; - int bytes = file.size(); - String fsize = ""; - if (bytes < 1024) - fsize = String(bytes) + " B"; - else if (bytes < (1024 * 1024)) - fsize = String(bytes / 1024.0, 3) + " KB"; - else if (bytes < (1024 * 1024 * 1024)) - fsize = String(bytes / 1024.0 / 1024.0, 3) + " MB"; - else - fsize = String(bytes / 1024.0 / 1024.0 / 1024.0, 3) + " GB"; - web_content += ""; - Serial.println(String(fsize)); - - file = root->openNextFile(); - } - web_content += "
Name/TypeType File/DirFile Size
" + String(file.name()) + "" + String(file.isDirectory() ? "Dir" : "File") + "" + fsize + "
"; - send_HTML_page(web_content.c_str()); - root->close(); - } - else - { - send_HTML_page("

No Files Found

"); - } -} - -static void file_upload() -{ - send_HTML_page(HTML_data::file_upload_str); -} - -static void handle_file_upload() -{ - HTTPUpload &uploadfile = server.upload(); - - if (uploadfile.status == UPLOAD_FILE_START) - { - String filename {uploadfile.filename}; - - if (!filename.startsWith("/")) - filename = "/" + filename; - - Serial.print("Upload File Name: "); - Serial.println(filename); - SD_card_fs::delete_file(filename.c_str()); // Remove a previous version, otherwise data is appended the file again - SD_card_fs::open_file(filename.c_str()); // Open the file for writing in SPIFFS (create it, if doesn't exist) - } - else if (uploadfile.status == UPLOAD_FILE_WRITE) - { - Serial.println("Writing file..."); - SD_card_fs::append_to_file(uploadfile.buf, uploadfile.currentSize); - } - else if (uploadfile.status == UPLOAD_FILE_END) - { - Serial.print("Upload Size: "); - Serial.println(uploadfile.totalSize); - SD_card_fs::close_file(); - - send_HTML_page(HTML_data::upload_finished_str); - - epd_spi_pinout pinout{ - - } - EPD_SPI_interface epd_display{} - BMP my_bitmap{filename.c_str()}; - - - } - else - { - server.send(500, "text/plain", "500: couldn't create file"); - } -} - -namespace Web_server -{ - void init_server() - { - server.on("/", home_page); - server.on("/upload", file_upload); - server.on("/fupload", HTTP_POST,[](){server.send(200);}, handle_file_upload); - //server.on("/delete", file_delete); - server.on("/dir", dir_page); - Serial.println("Web-server starting!"); - server.begin(); - } - - void init_wifi() - { - WiFi.mode(WIFI_STA); - WiFi.begin(ssid, passw); - Serial.println("Connecting"); - - while(WiFi.status() != WL_CONNECTED){ - Serial.print("."); - delay(500); - } - - Serial.println("\nConnected to the WiFi network"); - Serial.print("Local ESP32 IP: "); - Serial.println(WiFi.localIP()); - } - - void handle_client() - { - server.handleClient(); - } -}; - - - - - - +#include "include/web_server.h" +#include "include/web_HTML.h" +#include "include/sd_card.h" + +#ifdef ESP8266 + static ESP8266WebServer server{SERVER_PORT}; +#else + static ESP32WebServer server{SERVER_PORT}; +#endif + +static void send_HTML_page(const char* webpage) +{ + server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + server.sendHeader("Pragma", "no-cache"); + server.sendHeader("Expires", "-1"); + server.setContentLength(CONTENT_LENGTH_UNKNOWN); + server.send(200, "text/html", ""); // Empty content inhibits Content-length header so we have to close the socket ourselves. + server.sendContent(HTML_data::append_page_header); + + server.sendContent(webpage); + server.sendContent(HTML_data::append_page_footer); + server.client().stop(); +} + +static void home_page() +{ + send_HTML_page(HTML_data::home_page_str); +} + +static void dir_page() +{ + // Only lists files and directories in root "/", no recursion into folders... + + std::unique_ptr root = SD_card_fs::get_file("/"); + if (*root) + { + root->rewindDirectory(); + String web_content {HTML_data::dir_page_str}; + + File file = root->openNextFile(); + while (file) + { + // Serial.print(String(file.name())+"\t"); + web_content += "" + String(file.name()) + ""; + Serial.print(String(file.isDirectory() ? "Dir " : "File ") + String(file.name()) + "\t"); + web_content += "" + String(file.isDirectory() ? "Dir" : "File") + ""; + int bytes = file.size(); + String fsize = ""; + if (bytes < 1024) + fsize = String(bytes) + " B"; + else if (bytes < (1024 * 1024)) + fsize = String(bytes / 1024.0, 3) + " KB"; + else if (bytes < (1024 * 1024 * 1024)) + fsize = String(bytes / 1024.0 / 1024.0, 3) + " MB"; + else + fsize = String(bytes / 1024.0 / 1024.0 / 1024.0, 3) + " GB"; + web_content += "" + fsize + ""; + Serial.println(String(fsize)); + + file = root->openNextFile(); + } + web_content += ""; + send_HTML_page(web_content.c_str()); + root->close(); + } + else + { + send_HTML_page("

No Files Found

"); + } +} + +static void file_upload() +{ + send_HTML_page(HTML_data::file_upload_str); +} + +static void handle_file_upload() +{ + HTTPUpload &uploadfile = server.upload(); + + if (uploadfile.status == UPLOAD_FILE_START) + { + String filename {uploadfile.filename}; + + if (!filename.startsWith("/")) + filename = "/" + filename; + + Serial.print("Upload File Name: "); + Serial.println(filename); + SD_card_fs::delete_file(filename.c_str()); // Remove a previous version, otherwise data is appended the file again + SD_card_fs::open_file(filename.c_str()); // Open the file for writing in SPIFFS (create it, if doesn't exist) + } + else if (uploadfile.status == UPLOAD_FILE_WRITE) + { + Serial.println("Writing file..."); + SD_card_fs::append_to_file(uploadfile.buf, uploadfile.currentSize); + } + else if (uploadfile.status == UPLOAD_FILE_END) + { + Serial.print("Upload Size: "); + Serial.println(uploadfile.totalSize); + SD_card_fs::close_file(); + + send_HTML_page(HTML_data::upload_finished_str); + + epd_spi_pinout pinout{ + + } + EPD_SPI_interface epd_display{} + BMP my_bitmap{filename.c_str()}; + + + } + else + { + server.send(500, "text/plain", "500: couldn't create file"); + } +} + +namespace Web_server +{ + void init_server() + { + server.on("/", home_page); + server.on("/upload", file_upload); + server.on("/fupload", HTTP_POST,[](){server.send(200);}, handle_file_upload); + //server.on("/delete", file_delete); + server.on("/dir", dir_page); + Serial.println("Web-server starting!"); + server.begin(); + } + + void init_wifi() + { + WiFi.mode(WIFI_STA); + WiFi.begin(ssid, passw); + Serial.println("Connecting"); + + while(WiFi.status() != WL_CONNECTED){ + Serial.print("."); + delay(500); + } + + Serial.println("\nConnected to the WiFi network"); + Serial.print("Local ESP32 IP: "); + Serial.println(WiFi.localIP()); + } + + void handle_client() + { + server.handleClient(); + } +}; + + + + + +