mirror of
https://github.com/Dejvino/lilybook.git
synced 2024-12-22 11:38:49 +00:00
Restructured into modules and classes.
This commit is contained in:
parent
bd2b673a30
commit
8fc6843995
Binary file not shown.
4
main/Page.cpp
Normal file
4
main/Page.cpp
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#include "Page.h"
|
||||||
|
|
||||||
|
Page::Page()
|
||||||
|
{}
|
16
main/Page.h
Normal file
16
main/Page.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#ifndef _PAGE_H_
|
||||||
|
#define _PAGE_H_
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
class Page
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Page();
|
||||||
|
|
||||||
|
char* text;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
27
main/PagePrinter.cpp
Normal file
27
main/PagePrinter.cpp
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#include "display.h"
|
||||||
|
#include "EPD.h"
|
||||||
|
#include "PagePrinter.h"
|
||||||
|
|
||||||
|
#include "esp_log.h"
|
||||||
|
static const char *TAG = "PagePrinter";
|
||||||
|
|
||||||
|
int font = DEJAVU18_FONT;//DEFAULT_FONT;
|
||||||
|
|
||||||
|
PagePrinter::PagePrinter()
|
||||||
|
{}
|
||||||
|
|
||||||
|
void PagePrinter::print(Page* page)
|
||||||
|
{
|
||||||
|
if (page->text == NULL) {
|
||||||
|
ESP_LOGE(TAG, "Page text is NULL");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (page->len == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
EPD_setFont(font, NULL);
|
||||||
|
text_wrap = 1;
|
||||||
|
EPD_print(page->text, 0, 0);
|
||||||
|
EPD_UpdateScreen();
|
||||||
|
|
||||||
|
}
|
11
main/PagePrinter.h
Normal file
11
main/PagePrinter.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#include "Page.h"
|
||||||
|
|
||||||
|
class PagePrinter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PagePrinter();
|
||||||
|
|
||||||
|
void print(Page* page);
|
||||||
|
|
||||||
|
private:
|
||||||
|
};
|
34
main/TextReader.cpp
Normal file
34
main/TextReader.cpp
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#include "TextReader.h"
|
||||||
|
|
||||||
|
#include "esp_log.h"
|
||||||
|
static const char *TAG = "TextReader";
|
||||||
|
|
||||||
|
TextReader::TextReader(FILE* file)
|
||||||
|
{
|
||||||
|
this->f = file;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextReader::close()
|
||||||
|
{
|
||||||
|
fclose(this->f);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t TextReader::read(long pos, char* text, size_t len)
|
||||||
|
{
|
||||||
|
if (this->f == NULL) {
|
||||||
|
ESP_LOGE(TAG, "File not opened.");
|
||||||
|
sprintf(text, "File could not be opened.");
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
fseek(this->f, pos, SEEK_SET);
|
||||||
|
size_t read = fread(text, 1, len, this->f);
|
||||||
|
if (read > 0) {
|
||||||
|
ESP_LOGI(TAG, "Read content: %s", text);
|
||||||
|
} else {
|
||||||
|
ESP_LOGI(TAG, "End of file. Closing.");
|
||||||
|
fclose(this->f);
|
||||||
|
this->f = NULL;
|
||||||
|
}
|
||||||
|
return read;
|
||||||
|
}
|
||||||
|
}
|
16
main/TextReader.h
Normal file
16
main/TextReader.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
class TextReader
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TextReader(FILE* file);
|
||||||
|
|
||||||
|
size_t read(long pos, char* text, size_t len);
|
||||||
|
|
||||||
|
void close();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
FILE* f;
|
||||||
|
};
|
25
main/TextStorage.cpp
Normal file
25
main/TextStorage.cpp
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#include "TextStorage.h"
|
||||||
|
|
||||||
|
#include "esp_log.h"
|
||||||
|
static const char *TAG = "TextStorage";
|
||||||
|
|
||||||
|
TextStorage::TextStorage()
|
||||||
|
{}
|
||||||
|
|
||||||
|
TextReader* TextStorage::open(char* filename)
|
||||||
|
{
|
||||||
|
FILE* f = fopen("/sdcard/book.txt", "r");
|
||||||
|
if (f == NULL) {
|
||||||
|
ESP_LOGE(TAG, "File could not be opened");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
ESP_LOGI(TAG, "File opened for reading.");
|
||||||
|
return new TextReader(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextStorage::close(TextReader* reader)
|
||||||
|
{
|
||||||
|
reader->close();
|
||||||
|
delete reader;
|
||||||
|
ESP_LOGI(TAG, "File closed.");
|
||||||
|
}
|
10
main/TextStorage.h
Normal file
10
main/TextStorage.h
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#include "TextReader.h"
|
||||||
|
|
||||||
|
class TextStorage
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TextStorage();
|
||||||
|
|
||||||
|
TextReader* open(char* filename);
|
||||||
|
void close(TextReader* reader);
|
||||||
|
};
|
10
main/Typesetter.cpp
Normal file
10
main/Typesetter.cpp
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#include "Typesetter.h"
|
||||||
|
|
||||||
|
Typesetter::Typesetter()
|
||||||
|
{}
|
||||||
|
|
||||||
|
void Typesetter::preparePage(Page* page, char* text, size_t len)
|
||||||
|
{
|
||||||
|
page->text = text;
|
||||||
|
page->len = len;
|
||||||
|
}
|
13
main/Typesetter.h
Normal file
13
main/Typesetter.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include "Page.h"
|
||||||
|
|
||||||
|
class Typesetter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Typesetter();
|
||||||
|
|
||||||
|
void preparePage(Page* page, char* text, size_t len);
|
||||||
|
|
||||||
|
//private:
|
||||||
|
|
||||||
|
};
|
27
main/buttons.c
Normal file
27
main/buttons.c
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "driver/gpio.h"
|
||||||
|
#include "buttons.h"
|
||||||
|
|
||||||
|
#define BTN_PIN_PLUS ((gpio_num_t)39)
|
||||||
|
#define BTN_PIN_OK ((gpio_num_t)37)
|
||||||
|
#define BTN_PIN_MINUS ((gpio_num_t)38)
|
||||||
|
|
||||||
|
void buttons_init()
|
||||||
|
{
|
||||||
|
gpio_config_t buttons_config;
|
||||||
|
buttons_config.intr_type = (gpio_int_type_t)GPIO_PIN_INTR_DISABLE;
|
||||||
|
buttons_config.mode = GPIO_MODE_INPUT;
|
||||||
|
buttons_config.pull_up_en = (gpio_pullup_t)1;
|
||||||
|
buttons_config.pull_down_en = (gpio_pulldown_t)0;
|
||||||
|
buttons_config.pin_bit_mask = (1LL << BTN_PIN_MINUS);
|
||||||
|
gpio_config(&buttons_config);
|
||||||
|
buttons_config.pin_bit_mask = (1LL << BTN_PIN_OK);
|
||||||
|
gpio_config(&buttons_config);
|
||||||
|
buttons_config.pin_bit_mask = (1LL << BTN_PIN_PLUS);
|
||||||
|
gpio_config(&buttons_config);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool buttons_pressed_ok() { return gpio_get_level(BTN_PIN_OK) == 0; }
|
||||||
|
bool buttons_pressed_plus() { return gpio_get_level(BTN_PIN_PLUS) == 0; }
|
||||||
|
bool buttons_pressed_minus() { return gpio_get_level(BTN_PIN_MINUS) == 0; }
|
4
main/buttons.h
Normal file
4
main/buttons.h
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
void buttons_init();
|
||||||
|
bool buttons_pressed_ok();
|
||||||
|
bool buttons_pressed_plus();
|
||||||
|
bool buttons_pressed_minus();
|
2
main/config.h
Normal file
2
main/config.h
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
|
||||||
|
#define APP_VERSION "0.1"
|
102
main/display.c
Normal file
102
main/display.c
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
|
||||||
|
#include "spi_master_lobo.h"
|
||||||
|
#include "EPD.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "esp_system.h"
|
||||||
|
#include "driver/gpio.h"
|
||||||
|
#include "esp_system.h"
|
||||||
|
#include "esp_heap_alloc_caps.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "config.h"
|
||||||
|
#include "display.h"
|
||||||
|
|
||||||
|
void display_init()
|
||||||
|
{
|
||||||
|
disp_buffer = (uint8_t*)pvPortMallocCaps(EPD_DISPLAY_WIDTH * (EPD_DISPLAY_HEIGHT/8), MALLOC_CAP_DMA);
|
||||||
|
assert(disp_buffer);
|
||||||
|
drawBuff = disp_buffer;
|
||||||
|
|
||||||
|
gs_disp_buffer = (uint8_t*)pvPortMallocCaps(EPD_DISPLAY_WIDTH * EPD_DISPLAY_HEIGHT, MALLOC_CAP_DMA);
|
||||||
|
assert(gs_disp_buffer);
|
||||||
|
gs_drawBuff = gs_disp_buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
spi_lobo_device_interface_config_t devcfg;
|
||||||
|
spi_lobo_bus_config_t buscfg;
|
||||||
|
void spi_init()
|
||||||
|
{
|
||||||
|
gpio_set_direction(DC_Pin, GPIO_MODE_OUTPUT);
|
||||||
|
gpio_set_level(DC_Pin, 1);
|
||||||
|
gpio_set_direction(RST_Pin, GPIO_MODE_OUTPUT);
|
||||||
|
gpio_set_level(RST_Pin, 0);
|
||||||
|
gpio_set_direction(BUSY_Pin, GPIO_MODE_INPUT);
|
||||||
|
gpio_set_pull_mode(BUSY_Pin, GPIO_PULLUP_ONLY);
|
||||||
|
|
||||||
|
#ifdef POWER_Pin
|
||||||
|
gpio_set_direction(POWER_Pin, GPIO_MODE_OUTPUT);
|
||||||
|
gpio_set_level(POWER_Pin, 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
buscfg.miso_io_num = -1; // set SPI MISO pin
|
||||||
|
buscfg.mosi_io_num = MOSI_Pin; // set SPI MOSI pin
|
||||||
|
buscfg.sclk_io_num = SCK_Pin; // set SPI CLK pin
|
||||||
|
buscfg.quadwp_io_num=-1;
|
||||||
|
buscfg.quadhd_io_num=-1;
|
||||||
|
buscfg.max_transfer_sz = 5*1024; // max transfer size is 4736 bytes
|
||||||
|
|
||||||
|
devcfg.clock_speed_hz=40000000; // SPI clock is 40 MHz
|
||||||
|
devcfg.mode=0; // SPI mode 0
|
||||||
|
devcfg.spics_io_num=-1; // we will use external CS pin
|
||||||
|
devcfg.spics_ext_io_num = CS_Pin; // external CS pin
|
||||||
|
devcfg.flags=SPI_DEVICE_HALFDUPLEX; // ALWAYS SET to HALF DUPLEX MODE for display spi !!
|
||||||
|
}
|
||||||
|
|
||||||
|
void display_connect()
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret=spi_lobo_bus_add_device(SPI_BUS, &buscfg, &devcfg, &disp_spi);
|
||||||
|
assert(ret==ESP_OK);
|
||||||
|
printf("SPI: display device added to spi bus\r\n");
|
||||||
|
|
||||||
|
ret = spi_lobo_device_select(disp_spi, 1);
|
||||||
|
assert(ret==ESP_OK);
|
||||||
|
ret = spi_lobo_device_deselect(disp_spi);
|
||||||
|
assert(ret==ESP_OK);
|
||||||
|
|
||||||
|
printf("SPI: attached display device, speed=%u\r\n", spi_lobo_get_speed(disp_spi));
|
||||||
|
printf("SPI: bus uses native pins: %s\r\n", spi_lobo_uses_native_pins(disp_spi) ? "true" : "false");
|
||||||
|
|
||||||
|
//EPD_PowerOn();
|
||||||
|
}
|
||||||
|
|
||||||
|
void display_splash_screen()
|
||||||
|
{
|
||||||
|
EPD_DisplayClearPart();
|
||||||
|
EPD_fillScreen(0);
|
||||||
|
EPD_UpdateScreen();
|
||||||
|
|
||||||
|
EPD_setFont(COMIC24_FONT, NULL);
|
||||||
|
EPD_print("LilyBook", 30, 30);
|
||||||
|
EPD_setFont(DEFAULT_FONT, NULL);
|
||||||
|
EPD_print("Version:", 30, 70);
|
||||||
|
EPD_print(APP_VERSION, 100, 70);
|
||||||
|
EPD_UpdateScreen();
|
||||||
|
}
|
||||||
|
|
||||||
|
void display_clear()
|
||||||
|
{
|
||||||
|
EPD_fillScreen(_bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void display_refresh()
|
||||||
|
{
|
||||||
|
EPD_DisplayClearPart();
|
||||||
|
EPD_fillScreen(_bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void display_update()
|
||||||
|
{
|
||||||
|
EPD_UpdateScreen();
|
||||||
|
}
|
8
main/display.h
Normal file
8
main/display.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
void display_init();
|
||||||
|
void spi_init();
|
||||||
|
void display_connect();
|
||||||
|
void display_splash_screen();
|
||||||
|
|
||||||
|
void display_clear();
|
||||||
|
void display_refresh();
|
||||||
|
void display_update();
|
2382
main/img_hacking.c
2382
main/img_hacking.c
File diff suppressed because it is too large
Load Diff
197
main/main.cpp
197
main/main.cpp
@ -1,7 +1,6 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sys/fcntl.h>
|
#include <sys/fcntl.h>
|
||||||
#include <stdio.h>
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -11,21 +10,21 @@
|
|||||||
#include "driver/gpio.h"
|
#include "driver/gpio.h"
|
||||||
#include "esp_system.h"
|
#include "esp_system.h"
|
||||||
#include "esp_heap_alloc_caps.h"
|
#include "esp_heap_alloc_caps.h"
|
||||||
#include "spiffs_vfs.h"
|
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "spi_master_lobo.h"
|
|
||||||
#include "img_hacking.c"
|
|
||||||
#include "EPD.h"
|
|
||||||
#include "storage.h"
|
|
||||||
|
|
||||||
#define APP_VERSION "0.1"
|
|
||||||
|
|
||||||
#define BTN_PIN_PLUS ((gpio_num_t)39)
|
|
||||||
#define BTN_PIN_OK ((gpio_num_t)37)
|
|
||||||
#define BTN_PIN_MINUS ((gpio_num_t)38)
|
|
||||||
|
|
||||||
static const char *TAG = "main";
|
static const char *TAG = "main";
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include "config.h"
|
||||||
|
#include "buttons.h"
|
||||||
|
#include "storage.h"
|
||||||
|
#include "display.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "Typesetter.h"
|
||||||
|
#include "TextStorage.h"
|
||||||
|
#include "PagePrinter.h"
|
||||||
|
|
||||||
static struct tm* tm_info;
|
static struct tm* tm_info;
|
||||||
static char tmp_buff[128];
|
static char tmp_buff[128];
|
||||||
static time_t time_now, time_last = 0;
|
static time_t time_now, time_last = 0;
|
||||||
@ -33,172 +32,64 @@ static const char *file_fonts[3] = {"/spiffs/fonts/DotMatrix_M.fon", "/spiffs/fo
|
|||||||
static const char tag[] = "[LilyBook]";
|
static const char tag[] = "[LilyBook]";
|
||||||
esp_err_t ret;
|
esp_err_t ret;
|
||||||
|
|
||||||
void display_init()
|
void sleep(unsigned int ms)
|
||||||
{
|
{
|
||||||
disp_buffer = (uint8_t*)pvPortMallocCaps(EPD_DISPLAY_WIDTH * (EPD_DISPLAY_HEIGHT/8), MALLOC_CAP_DMA);
|
vTaskDelay(ms / portTICK_RATE_MS);
|
||||||
assert(disp_buffer);
|
|
||||||
drawBuff = disp_buffer;
|
|
||||||
|
|
||||||
gs_disp_buffer = (uint8_t*)pvPortMallocCaps(EPD_DISPLAY_WIDTH * EPD_DISPLAY_HEIGHT, MALLOC_CAP_DMA);
|
|
||||||
assert(gs_disp_buffer);
|
|
||||||
gs_drawBuff = gs_disp_buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
spi_lobo_device_interface_config_t devcfg;
|
|
||||||
spi_lobo_bus_config_t buscfg;
|
|
||||||
void spi_init()
|
|
||||||
{
|
|
||||||
gpio_set_direction(DC_Pin, GPIO_MODE_OUTPUT);
|
|
||||||
gpio_set_level(DC_Pin, 1);
|
|
||||||
gpio_set_direction(RST_Pin, GPIO_MODE_OUTPUT);
|
|
||||||
gpio_set_level(RST_Pin, 0);
|
|
||||||
gpio_set_direction(BUSY_Pin, GPIO_MODE_INPUT);
|
|
||||||
gpio_set_pull_mode(BUSY_Pin, GPIO_PULLUP_ONLY);
|
|
||||||
|
|
||||||
#ifdef POWER_Pin
|
|
||||||
gpio_set_direction(POWER_Pin, GPIO_MODE_OUTPUT);
|
|
||||||
gpio_set_level(POWER_Pin, 1);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
buscfg.miso_io_num = -1; // set SPI MISO pin
|
|
||||||
buscfg.mosi_io_num = MOSI_Pin; // set SPI MOSI pin
|
|
||||||
buscfg.sclk_io_num = SCK_Pin; // set SPI CLK pin
|
|
||||||
buscfg.quadwp_io_num=-1;
|
|
||||||
buscfg.quadhd_io_num=-1;
|
|
||||||
buscfg.max_transfer_sz = 5*1024; // max transfer size is 4736 bytes
|
|
||||||
|
|
||||||
devcfg.clock_speed_hz=40000000; // SPI clock is 40 MHz
|
|
||||||
devcfg.mode=0; // SPI mode 0
|
|
||||||
devcfg.spics_io_num=-1; // we will use external CS pin
|
|
||||||
devcfg.spics_ext_io_num = CS_Pin; // external CS pin
|
|
||||||
devcfg.flags=SPI_DEVICE_HALFDUPLEX; // ALWAYS SET to HALF DUPLEX MODE for display spi !!
|
|
||||||
}
|
|
||||||
|
|
||||||
void display_connect()
|
|
||||||
{
|
|
||||||
ret=spi_lobo_bus_add_device(SPI_BUS, &buscfg, &devcfg, &disp_spi);
|
|
||||||
assert(ret==ESP_OK);
|
|
||||||
printf("SPI: display device added to spi bus\r\n");
|
|
||||||
|
|
||||||
ret = spi_lobo_device_select(disp_spi, 1);
|
|
||||||
assert(ret==ESP_OK);
|
|
||||||
ret = spi_lobo_device_deselect(disp_spi);
|
|
||||||
assert(ret==ESP_OK);
|
|
||||||
|
|
||||||
printf("SPI: attached display device, speed=%u\r\n", spi_lobo_get_speed(disp_spi));
|
|
||||||
printf("SPI: bus uses native pins: %s\r\n", spi_lobo_uses_native_pins(disp_spi) ? "true" : "false");
|
|
||||||
|
|
||||||
//EPD_PowerOn();
|
|
||||||
}
|
|
||||||
|
|
||||||
void fs_init()
|
|
||||||
{
|
|
||||||
vfs_spiffs_register();
|
|
||||||
if (spiffs_is_mounted) {
|
|
||||||
ESP_LOGI(tag, "File system mounted.");
|
|
||||||
} else {
|
|
||||||
ESP_LOGE(tag, "Error mounting file system.");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (storage_init() == 0) {
|
|
||||||
ESP_LOGI(tag, "SD card mounted.");
|
|
||||||
} else {
|
|
||||||
ESP_LOGE(tag, "Error mounting SD card.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" void app_main()
|
extern "C" void app_main()
|
||||||
{
|
{
|
||||||
gpio_config_t buttons_config;
|
printf("\n LilyBook v%s\n\n", APP_VERSION);
|
||||||
buttons_config.intr_type = (gpio_int_type_t)GPIO_PIN_INTR_DISABLE;
|
|
||||||
buttons_config.mode = GPIO_MODE_INPUT;
|
|
||||||
buttons_config.pull_up_en = (gpio_pullup_t)1;
|
|
||||||
buttons_config.pull_down_en = (gpio_pulldown_t)0;
|
|
||||||
buttons_config.pin_bit_mask = (1LL << BTN_PIN_MINUS);
|
|
||||||
gpio_config(&buttons_config);
|
|
||||||
buttons_config.pin_bit_mask = (1LL << BTN_PIN_OK);
|
|
||||||
gpio_config(&buttons_config);
|
|
||||||
buttons_config.pin_bit_mask = (1LL << BTN_PIN_PLUS);
|
|
||||||
gpio_config(&buttons_config);
|
|
||||||
|
|
||||||
|
storage_init();
|
||||||
|
buttons_init();
|
||||||
display_init();
|
display_init();
|
||||||
spi_init();
|
spi_init();
|
||||||
|
|
||||||
vTaskDelay(500 / portTICK_RATE_MS);
|
sleep(500);
|
||||||
|
|
||||||
printf("\n LilyBook v%s\n\n", APP_VERSION);
|
|
||||||
|
|
||||||
display_connect();
|
display_connect();
|
||||||
|
display_splash_screen();
|
||||||
|
|
||||||
EPD_DisplayClearPart();
|
sleep(500);
|
||||||
EPD_fillScreen(0);
|
|
||||||
EPD_UpdateScreen();
|
|
||||||
|
|
||||||
EPD_setFont(COMIC24_FONT, NULL);
|
|
||||||
EPD_print("LilyBook", 30, 30);
|
|
||||||
EPD_setFont(DEFAULT_FONT, NULL);
|
|
||||||
EPD_print("Version:", 30, 70);
|
|
||||||
EPD_print(APP_VERSION, 100, 70);
|
|
||||||
EPD_UpdateScreen();
|
|
||||||
|
|
||||||
EPD_wait(500);
|
|
||||||
|
|
||||||
fs_init();
|
|
||||||
|
|
||||||
printf("==== START ====\r\n\n");
|
printf("==== START ====\r\n\n");
|
||||||
|
|
||||||
_gs = 1;
|
Typesetter typesetter;
|
||||||
uint32_t tstart;
|
PagePrinter pagePrinter;
|
||||||
int pass = 0;
|
TextStorage textStorage;
|
||||||
int font = DEJAVU18_FONT;//DEFAULT_FONT;
|
TextReader* textReader = textStorage.open("/sdcard/book.txt");
|
||||||
EPD_setFont(font, NULL);
|
Page page;
|
||||||
|
|
||||||
EPD_wait(100);
|
long bookmark = 0;
|
||||||
|
|
||||||
FILE* f = fopen("/sdcard/book.txt", "r");
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
EPD_fillScreen(_bg);
|
char text[1024];
|
||||||
_fg = 15;
|
if (textReader != NULL) {
|
||||||
_bg = 0;
|
size_t read = textReader->read(bookmark, text, sizeof(text));
|
||||||
|
|
||||||
char text[1024];
|
|
||||||
|
|
||||||
if (f == NULL) {
|
|
||||||
ESP_LOGE(TAG, "Failed to open file for reading");
|
|
||||||
sprintf(text, "Could not open SD card.");
|
|
||||||
f = fopen("/sdcard/book.txt", "r");
|
|
||||||
} else {
|
} else {
|
||||||
if (fread(text, 1, sizeof(text), f) > 0) {
|
strcpy(text, "File could not be opened.");
|
||||||
ESP_LOGI(TAG, "Read content: %s", text);
|
|
||||||
} else {
|
|
||||||
ESP_LOGI(TAG, "End of file. Closing.");
|
|
||||||
fclose(f);
|
|
||||||
f = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
typesetter.preparePage(&page, text, sizeof(text));
|
||||||
text_wrap = 1;
|
display_clear();
|
||||||
EPD_print(text, 0, 0);
|
pagePrinter.print(&page);
|
||||||
EPD_UpdateScreen();
|
display_update();
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
EPD_wait(100);
|
sleep(10);
|
||||||
if (gpio_get_level(BTN_PIN_OK) == 0) {
|
if (buttons_pressed_ok()) {
|
||||||
ESP_LOGI(TAG, "Clear page.");
|
ESP_LOGI(TAG, "Clear page.");
|
||||||
EPD_DisplayClearPart();
|
display_refresh();
|
||||||
EPD_fillScreen(_bg);
|
|
||||||
EPD_print(text, 10, 10);
|
|
||||||
EPD_UpdateScreen();
|
|
||||||
}
|
|
||||||
if (gpio_get_level(BTN_PIN_PLUS) == 0) {
|
|
||||||
ESP_LOGI(TAG, "Turn page PLUS.");
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (gpio_get_level(BTN_PIN_MINUS) == 0) {
|
if (buttons_pressed_plus()) {
|
||||||
|
ESP_LOGI(TAG, "Turn page PLUS.");
|
||||||
|
bookmark += sizeof(text);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (buttons_pressed_minus()) {
|
||||||
ESP_LOGI(TAG, "Turn page MINUS.");
|
ESP_LOGI(TAG, "Turn page MINUS.");
|
||||||
fseek(f, 2 * sizeof(text), SEEK_CUR);
|
bookmark -= sizeof(text);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,9 +9,10 @@
|
|||||||
#include "driver/sdmmc_host.h"
|
#include "driver/sdmmc_host.h"
|
||||||
#include "driver/sdspi_host.h"
|
#include "driver/sdspi_host.h"
|
||||||
#include "sdmmc_cmd.h"
|
#include "sdmmc_cmd.h"
|
||||||
|
#include "spiffs_vfs.h"
|
||||||
#include "storage.h"
|
#include "storage.h"
|
||||||
|
|
||||||
static const char *TAG = "storage";
|
static const char *tag = "storage";
|
||||||
|
|
||||||
// This example can use SDMMC and SPI peripherals to communicate with SD card.
|
// This example can use SDMMC and SPI peripherals to communicate with SD card.
|
||||||
// By default, SDMMC peripheral is used.
|
// By default, SDMMC peripheral is used.
|
||||||
@ -33,10 +34,10 @@ static const char *TAG = "storage";
|
|||||||
#define PIN_NUM_CS ((gpio_num_t)13)
|
#define PIN_NUM_CS ((gpio_num_t)13)
|
||||||
#endif //USE_SPI_MODE
|
#endif //USE_SPI_MODE
|
||||||
|
|
||||||
int storage_init()
|
int sdcard_init()
|
||||||
{
|
{
|
||||||
#ifndef USE_SPI_MODE
|
#ifndef USE_SPI_MODE
|
||||||
ESP_LOGI(TAG, "Using SDMMC peripheral");
|
ESP_LOGI(tag, "Using SDMMC peripheral");
|
||||||
sdmmc_host_t host = SDMMC_HOST_DEFAULT();
|
sdmmc_host_t host = SDMMC_HOST_DEFAULT();
|
||||||
|
|
||||||
// This initializes the slot without card detect (CD) and write protect (WP) signals.
|
// This initializes the slot without card detect (CD) and write protect (WP) signals.
|
||||||
@ -86,10 +87,10 @@ int storage_init()
|
|||||||
|
|
||||||
if (ret != ESP_OK) {
|
if (ret != ESP_OK) {
|
||||||
if (ret == ESP_FAIL) {
|
if (ret == ESP_FAIL) {
|
||||||
ESP_LOGE(TAG, "Failed to mount filesystem. "
|
ESP_LOGE(tag, "Failed to mount filesystem. "
|
||||||
"If you want the card to be formatted, set format_if_mount_failed = true.");
|
"If you want the card to be formatted, set format_if_mount_failed = true.");
|
||||||
} else {
|
} else {
|
||||||
ESP_LOGE(TAG, "Failed to initialize the card (%s). "
|
ESP_LOGE(tag, "Failed to initialize the card (%s). "
|
||||||
"Make sure SD card lines have pull-up resistors in place.", esp_err_to_name(ret));
|
"Make sure SD card lines have pull-up resistors in place.", esp_err_to_name(ret));
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
@ -100,3 +101,25 @@ int storage_init()
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int storage_init()
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
vfs_spiffs_register();
|
||||||
|
if (spiffs_is_mounted) {
|
||||||
|
ESP_LOGI(tag, "File system mounted.");
|
||||||
|
} else {
|
||||||
|
ESP_LOGE(tag, "Error mounting file system.");
|
||||||
|
ret += 1 << 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sdcard_init() == 0) {
|
||||||
|
ESP_LOGI(tag, "SD card mounted.");
|
||||||
|
} else {
|
||||||
|
ESP_LOGE(tag, "Error mounting SD card.");
|
||||||
|
ret += 1 << 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
@ -1,2 +1,2 @@
|
|||||||
|
|
||||||
int storage_init();
|
int storage_init();
|
||||||
|
Loading…
Reference in New Issue
Block a user