mirror of
https://github.com/Dejvino/lilybook.git
synced 2024-12-22 11:38:49 +00:00
Added app modes, extracted into mode controllers.
This commit is contained in:
parent
f343983184
commit
a32fcd8785
@ -3,5 +3,5 @@
|
|||||||
#
|
#
|
||||||
# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.)
|
# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.)
|
||||||
|
|
||||||
COMPONENT_SRCDIRS := .
|
COMPONENT_SRCDIRS := . core modes
|
||||||
COMPONENT_ADD_INCLUDEDIRS := .
|
COMPONENT_ADD_INCLUDEDIRS := .
|
||||||
|
@ -1,4 +1,12 @@
|
|||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
void buttons_init();
|
void buttons_init();
|
||||||
bool buttons_pressed_ok();
|
bool buttons_pressed_ok();
|
||||||
bool buttons_pressed_plus();
|
bool buttons_pressed_plus();
|
||||||
bool buttons_pressed_minus();
|
bool buttons_pressed_minus();
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
7
main/core/common.c
Normal file
7
main/core/common.c
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/task.h"
|
||||||
|
|
||||||
|
void delay(unsigned int ms)
|
||||||
|
{
|
||||||
|
vTaskDelay(ms / portTICK_RATE_MS);
|
||||||
|
}
|
14
main/core/common.h
Normal file
14
main/core/common.h
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#ifndef _COMMON_H_
|
||||||
|
#define _COMMON_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void delay(unsigned int ms);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
@ -1,3 +1,7 @@
|
|||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
void display_init();
|
void display_init();
|
||||||
void spi_init();
|
void spi_init();
|
||||||
void display_connect();
|
void display_connect();
|
||||||
@ -8,4 +12,8 @@ void display_refresh();
|
|||||||
void display_update();
|
void display_update();
|
||||||
|
|
||||||
void display_wake();
|
void display_wake();
|
||||||
void display_sleep();
|
void display_sleep();
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
9
main/core/storage.h
Normal file
9
main/core/storage.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int storage_init();
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
114
main/main.cpp
114
main/main.cpp
@ -4,8 +4,6 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "freertos/FreeRTOS.h"
|
|
||||||
#include "freertos/task.h"
|
|
||||||
#include "esp_system.h"
|
#include "esp_system.h"
|
||||||
#include "driver/gpio.h"
|
#include "driver/gpio.h"
|
||||||
#include "esp_system.h"
|
#include "esp_system.h"
|
||||||
@ -14,16 +12,15 @@
|
|||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
static const char *TAG = "main";
|
static const char *TAG = "main";
|
||||||
|
|
||||||
extern "C" {
|
#include "core/common.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "buttons.h"
|
#include "core/buttons.h"
|
||||||
#include "storage.h"
|
#include "core/storage.h"
|
||||||
#include "display.h"
|
#include "core/display.h"
|
||||||
}
|
|
||||||
|
#include "modes/ModeRunner.h"
|
||||||
|
#include "modes/BootMode.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];
|
||||||
@ -32,11 +29,6 @@ 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 sleep(unsigned int ms)
|
|
||||||
{
|
|
||||||
vTaskDelay(ms / portTICK_RATE_MS);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" void app_main()
|
extern "C" void app_main()
|
||||||
{
|
{
|
||||||
printf("\n LilyBook v%s\n\n", APP_VERSION);
|
printf("\n LilyBook v%s\n\n", APP_VERSION);
|
||||||
@ -46,99 +38,15 @@ extern "C" void app_main()
|
|||||||
display_init();
|
display_init();
|
||||||
spi_init();
|
spi_init();
|
||||||
|
|
||||||
sleep(500);
|
delay(500);
|
||||||
|
|
||||||
display_connect();
|
display_connect();
|
||||||
display_splash_screen();
|
|
||||||
|
|
||||||
sleep(500);
|
|
||||||
|
|
||||||
printf("==== START ====\r\n\n");
|
printf("==== START ====\r\n\n");
|
||||||
|
|
||||||
Typesetter typesetter;
|
getModeRunner()->init();
|
||||||
PagePrinter pagePrinter;
|
getModeRunner()->startMainMode(new BootMode());
|
||||||
TextStorage textStorage;
|
|
||||||
TextReader* textReader = textStorage.open("/sdcard/book.txt");
|
|
||||||
Page* pageLast = NULL;
|
|
||||||
Page* pageCurrent = NULL;
|
|
||||||
|
|
||||||
long bookmark = 0;
|
|
||||||
//bool displaySleeping = false;
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
char text[1024];
|
getModeRunner()->loop();
|
||||||
if (textReader != NULL) {
|
|
||||||
if (pageCurrent == NULL) {
|
|
||||||
size_t read = textReader->read(bookmark, text, sizeof(text));
|
|
||||||
pageCurrent = typesetter.preparePage(text, read);
|
|
||||||
pageCurrent->start = bookmark;
|
|
||||||
}
|
|
||||||
if (pageLast == NULL) {
|
|
||||||
// align with the start?
|
|
||||||
if (bookmark < sizeof(text)) {
|
|
||||||
size_t read = textReader->read(0, text, sizeof(text));
|
|
||||||
pageLast = typesetter.preparePage(text, read);
|
|
||||||
pageLast->start = 0;
|
|
||||||
} else {
|
|
||||||
size_t read = textReader->read((bookmark - sizeof(text)), text, sizeof(text));
|
|
||||||
pageLast = typesetter.preparePreviousPage(text, read);
|
|
||||||
pageLast->start = bookmark - pageLast->len;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
typesetter.destroyPage(pageCurrent);
|
|
||||||
strcpy(text, "File could not be opened.");
|
|
||||||
pageCurrent = typesetter.preparePage(text, sizeof(text));
|
|
||||||
}
|
|
||||||
|
|
||||||
display_clear();
|
|
||||||
pagePrinter.print(pageCurrent);
|
|
||||||
display_update();
|
|
||||||
|
|
||||||
//time_t idleStart = clock();
|
|
||||||
while (1) {
|
|
||||||
sleep(10);
|
|
||||||
if (buttons_pressed_ok()) {
|
|
||||||
ESP_LOGI(TAG, "Clear page.");
|
|
||||||
display_refresh();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (buttons_pressed_plus()) {
|
|
||||||
ESP_LOGI(TAG, "Turn page PLUS.");
|
|
||||||
if (pageCurrent != NULL) {
|
|
||||||
bookmark = pageCurrent->start + pageCurrent->len;
|
|
||||||
// TODO: limit bookmark to file size
|
|
||||||
typesetter.destroyPage(pageLast);
|
|
||||||
pageLast = pageCurrent;
|
|
||||||
pageCurrent = NULL;
|
|
||||||
} else {
|
|
||||||
ESP_LOGW(TAG, "No current page.");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (buttons_pressed_minus()) {
|
|
||||||
ESP_LOGI(TAG, "Turn page MINUS.");
|
|
||||||
if (pageLast != NULL) {
|
|
||||||
bookmark = pageLast->start;
|
|
||||||
typesetter.destroyPage(pageCurrent);
|
|
||||||
pageCurrent = pageLast;
|
|
||||||
pageLast = NULL;
|
|
||||||
} else {
|
|
||||||
ESP_LOGW(TAG, "No last page.");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/*if (!displaySleeping && (clock() - idleStart > DISPLAY_SLEEP_TIMEOUT)) {
|
|
||||||
displaySleeping = true;
|
|
||||||
ESP_LOGI(TAG, "Display going to sleep after %d ms.", DISPLAY_SLEEP_TIMEOUT);
|
|
||||||
display_sleep();
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
/*if (displaySleeping) {
|
|
||||||
displaySleeping = false;
|
|
||||||
ESP_LOGI(TAG, "Display waking up.");
|
|
||||||
display_wake();
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
12
main/modes/AppMode.h
Normal file
12
main/modes/AppMode.h
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#ifndef _APPMODE_H_
|
||||||
|
#define _APPMODE_H_
|
||||||
|
|
||||||
|
class AppMode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void start();
|
||||||
|
virtual void loop();
|
||||||
|
virtual void finish();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
19
main/modes/BootMode.cpp
Normal file
19
main/modes/BootMode.cpp
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#include "core/common.h"
|
||||||
|
#include "core/display.h"
|
||||||
|
#include "ModeRunner.h"
|
||||||
|
#include "MainMenuMode.h"
|
||||||
|
#include "BootMode.h"
|
||||||
|
|
||||||
|
void BootMode::start()
|
||||||
|
{}
|
||||||
|
|
||||||
|
void BootMode::loop()
|
||||||
|
{
|
||||||
|
display_splash_screen();
|
||||||
|
delay(500);
|
||||||
|
|
||||||
|
getModeRunner()->startMainMode(new MainMenuMode());
|
||||||
|
}
|
||||||
|
|
||||||
|
void BootMode::finish()
|
||||||
|
{}
|
9
main/modes/BootMode.h
Normal file
9
main/modes/BootMode.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#include "AppMode.h"
|
||||||
|
|
||||||
|
class BootMode : public AppMode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void start();
|
||||||
|
virtual void loop();
|
||||||
|
virtual void finish();
|
||||||
|
};
|
25
main/modes/MainMenuMode.cpp
Normal file
25
main/modes/MainMenuMode.cpp
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#include "core/common.h"
|
||||||
|
#include "core/buttons.h"
|
||||||
|
#include "core/display.h"
|
||||||
|
#include <EPD.h>
|
||||||
|
#include "MainMenuMode.h"
|
||||||
|
|
||||||
|
void MainMenuMode::start()
|
||||||
|
{}
|
||||||
|
|
||||||
|
void MainMenuMode::loop()
|
||||||
|
{
|
||||||
|
display_clear();
|
||||||
|
EPD_print("Main Menu", CENTER, 0);
|
||||||
|
display_update();
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
delay(5);
|
||||||
|
if (buttons_pressed_ok()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainMenuMode::finish()
|
||||||
|
{}
|
9
main/modes/MainMenuMode.h
Normal file
9
main/modes/MainMenuMode.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#include "AppMode.h"
|
||||||
|
|
||||||
|
class MainMenuMode : public AppMode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void start();
|
||||||
|
virtual void loop();
|
||||||
|
virtual void finish();
|
||||||
|
};
|
55
main/modes/ModeRunner.cpp
Normal file
55
main/modes/ModeRunner.cpp
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#include "ModeRunner.h"
|
||||||
|
|
||||||
|
#include "esp_log.h"
|
||||||
|
static const char *TAG = "ModeRunner";
|
||||||
|
|
||||||
|
void ModeRunner::init()
|
||||||
|
{
|
||||||
|
this->modeStackDepth = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ModeRunner::loop()
|
||||||
|
{
|
||||||
|
if (this->modeStackDepth < 0) {
|
||||||
|
ESP_LOGE(TAG, "Cannot run app mode. None activated (depth %d).", this->modeStackDepth);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this->modeStack[this->modeStackDepth]->loop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ModeRunner::startMainMode(AppMode* mode)
|
||||||
|
{
|
||||||
|
this->finishMode(NULL);
|
||||||
|
this->modeStackDepth = -1;
|
||||||
|
this->startInnerMode(mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ModeRunner::startInnerMode(AppMode* mode)
|
||||||
|
{
|
||||||
|
if (this->modeStackDepth + 1 >= MODE_STACK_SIZE) {
|
||||||
|
ESP_LOGE(TAG, "Cannot start inner mode. Stack overflow.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this->modeStackDepth++;
|
||||||
|
this->modeStack[this->modeStackDepth] = mode;
|
||||||
|
ESP_LOGI(TAG, "Starting new mode (depth %d).", this->modeStackDepth);
|
||||||
|
mode->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ModeRunner::finishMode(AppMode* mode)
|
||||||
|
{
|
||||||
|
for (int i = this->modeStackDepth; i >= 0; i--) {
|
||||||
|
ESP_LOGI(TAG, "Finishing mode (depth %d).", this->modeStackDepth);
|
||||||
|
this->modeStack[i]->finish();
|
||||||
|
this->modeStackDepth--;
|
||||||
|
if (mode == this->modeStack[i]) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ModeRunner modeRunner;
|
||||||
|
ModeRunner* getModeRunner()
|
||||||
|
{
|
||||||
|
return &modeRunner;
|
||||||
|
}
|
20
main/modes/ModeRunner.h
Normal file
20
main/modes/ModeRunner.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#include "AppMode.h"
|
||||||
|
#define MODE_STACK_SIZE 5
|
||||||
|
|
||||||
|
class ModeRunner
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void init();
|
||||||
|
void loop();
|
||||||
|
|
||||||
|
void startMainMode(AppMode* mode);
|
||||||
|
void startInnerMode(AppMode* mode);
|
||||||
|
|
||||||
|
void finishMode(AppMode* mode);
|
||||||
|
|
||||||
|
private:
|
||||||
|
AppMode* modeStack[MODE_STACK_SIZE];
|
||||||
|
int modeStackDepth = -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
ModeRunner* getModeRunner();
|
106
main/modes/ReaderMode.cpp
Normal file
106
main/modes/ReaderMode.cpp
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
#include "core/common.h"
|
||||||
|
#include "string.h"
|
||||||
|
#include "core/buttons.h"
|
||||||
|
#include "core/display.h"
|
||||||
|
#include "reader/Typesetter.h"
|
||||||
|
#include "reader/TextStorage.h"
|
||||||
|
#include "reader/PagePrinter.h"
|
||||||
|
#include "ReaderMode.h"
|
||||||
|
|
||||||
|
#include "esp_log.h"
|
||||||
|
static const char *TAG = "ReaderMode";
|
||||||
|
|
||||||
|
// TODO: class members
|
||||||
|
Typesetter typesetter;
|
||||||
|
PagePrinter pagePrinter;
|
||||||
|
TextStorage textStorage;
|
||||||
|
TextReader* textReader = textStorage.open("/sdcard/book.txt");
|
||||||
|
Page* pageLast = NULL;
|
||||||
|
Page* pageCurrent = NULL;
|
||||||
|
|
||||||
|
long bookmark = 0;
|
||||||
|
//bool displaySleeping = false;
|
||||||
|
|
||||||
|
void ReaderMode::start()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReaderMode::loop()
|
||||||
|
{
|
||||||
|
char text[1024];
|
||||||
|
if (textReader != NULL) {
|
||||||
|
if (pageCurrent == NULL) {
|
||||||
|
size_t read = textReader->read(bookmark, text, sizeof(text));
|
||||||
|
pageCurrent = typesetter.preparePage(text, read);
|
||||||
|
pageCurrent->start = bookmark;
|
||||||
|
}
|
||||||
|
if (pageLast == NULL) {
|
||||||
|
// align with the start?
|
||||||
|
if (bookmark < sizeof(text)) {
|
||||||
|
size_t read = textReader->read(0, text, sizeof(text));
|
||||||
|
pageLast = typesetter.preparePage(text, read);
|
||||||
|
pageLast->start = 0;
|
||||||
|
} else {
|
||||||
|
size_t read = textReader->read((bookmark - sizeof(text)), text, sizeof(text));
|
||||||
|
pageLast = typesetter.preparePreviousPage(text, read);
|
||||||
|
pageLast->start = bookmark - pageLast->len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
typesetter.destroyPage(pageCurrent);
|
||||||
|
strcpy(text, "File could not be opened.");
|
||||||
|
pageCurrent = typesetter.preparePage(text, sizeof(text));
|
||||||
|
}
|
||||||
|
|
||||||
|
display_clear();
|
||||||
|
pagePrinter.print(pageCurrent);
|
||||||
|
display_update();
|
||||||
|
|
||||||
|
//time_t idleStart = clock();
|
||||||
|
while (1) {
|
||||||
|
delay(10);
|
||||||
|
if (buttons_pressed_ok()) {
|
||||||
|
ESP_LOGI(TAG, "Clear page.");
|
||||||
|
display_refresh();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (buttons_pressed_plus()) {
|
||||||
|
ESP_LOGI(TAG, "Turn page PLUS.");
|
||||||
|
if (pageCurrent != NULL) {
|
||||||
|
bookmark = pageCurrent->start + pageCurrent->len;
|
||||||
|
// TODO: limit bookmark to file size
|
||||||
|
typesetter.destroyPage(pageLast);
|
||||||
|
pageLast = pageCurrent;
|
||||||
|
pageCurrent = NULL;
|
||||||
|
} else {
|
||||||
|
ESP_LOGW(TAG, "No current page.");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (buttons_pressed_minus()) {
|
||||||
|
ESP_LOGI(TAG, "Turn page MINUS.");
|
||||||
|
if (pageLast != NULL) {
|
||||||
|
bookmark = pageLast->start;
|
||||||
|
typesetter.destroyPage(pageCurrent);
|
||||||
|
pageCurrent = pageLast;
|
||||||
|
pageLast = NULL;
|
||||||
|
} else {
|
||||||
|
ESP_LOGW(TAG, "No last page.");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/*if (!displaySleeping && (clock() - idleStart > DISPLAY_SLEEP_TIMEOUT)) {
|
||||||
|
displaySleeping = true;
|
||||||
|
ESP_LOGI(TAG, "Display going to sleep after %d ms.", DISPLAY_SLEEP_TIMEOUT);
|
||||||
|
display_sleep();
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
/*if (displaySleeping) {
|
||||||
|
displaySleeping = false;
|
||||||
|
ESP_LOGI(TAG, "Display waking up.");
|
||||||
|
display_wake();
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReaderMode::finish()
|
||||||
|
{}
|
9
main/modes/ReaderMode.h
Normal file
9
main/modes/ReaderMode.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#include "AppMode.h"
|
||||||
|
|
||||||
|
class ReaderMode : AppMode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void start();
|
||||||
|
virtual void loop();
|
||||||
|
virtual void finish();
|
||||||
|
};
|
@ -1,2 +0,0 @@
|
|||||||
|
|
||||||
int storage_init();
|
|
Loading…
Reference in New Issue
Block a user