Explorar el Código

Added app modes, extracted into mode controllers.

master
dejvino hace 4 años
padre
commit
a32fcd8785
Se han modificado 32 ficheros con 323 adiciones y 107 borrados
  1. +1
    -1
      main/component.mk
  2. +0
    -0
      main/core/buttons.c
  3. +8
    -0
      main/core/buttons.h
  4. +7
    -0
      main/core/common.c
  5. +14
    -0
      main/core/common.h
  6. +0
    -0
      main/core/display.c
  7. +9
    -1
      main/core/display.h
  8. +0
    -0
      main/core/storage.c
  9. +9
    -0
      main/core/storage.h
  10. +11
    -103
      main/main.cpp
  11. +12
    -0
      main/modes/AppMode.h
  12. +19
    -0
      main/modes/BootMode.cpp
  13. +9
    -0
      main/modes/BootMode.h
  14. +25
    -0
      main/modes/MainMenuMode.cpp
  15. +9
    -0
      main/modes/MainMenuMode.h
  16. +55
    -0
      main/modes/ModeRunner.cpp
  17. +20
    -0
      main/modes/ModeRunner.h
  18. +106
    -0
      main/modes/ReaderMode.cpp
  19. +9
    -0
      main/modes/ReaderMode.h
  20. +0
    -0
      main/modes/reader/Page.cpp
  21. +0
    -0
      main/modes/reader/Page.h
  22. +0
    -0
      main/modes/reader/PagePrinter.cpp
  23. +0
    -0
      main/modes/reader/PagePrinter.h
  24. +0
    -0
      main/modes/reader/PageSettingsProvider.cpp
  25. +0
    -0
      main/modes/reader/PageSettingsProvider.h
  26. +0
    -0
      main/modes/reader/TextReader.cpp
  27. +0
    -0
      main/modes/reader/TextReader.h
  28. +0
    -0
      main/modes/reader/TextStorage.cpp
  29. +0
    -0
      main/modes/reader/TextStorage.h
  30. +0
    -0
      main/modes/reader/Typesetter.cpp
  31. +0
    -0
      main/modes/reader/Typesetter.h
  32. +0
    -2
      main/storage.h

+ 1
- 1
main/component.mk Ver fichero

@@ -3,5 +3,5 @@
#
# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.)

COMPONENT_SRCDIRS := .
COMPONENT_SRCDIRS := . core modes
COMPONENT_ADD_INCLUDEDIRS := .

main/buttons.c → main/core/buttons.c Ver fichero


main/buttons.h → main/core/buttons.h Ver fichero

@@ -1,4 +1,12 @@
#ifdef __cplusplus
extern "C" {
#endif

void buttons_init();
bool buttons_pressed_ok();
bool buttons_pressed_plus();
bool buttons_pressed_minus();

#ifdef __cplusplus
}
#endif

+ 7
- 0
main/core/common.c Ver fichero

@@ -0,0 +1,7 @@
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

void delay(unsigned int ms)
{
vTaskDelay(ms / portTICK_RATE_MS);
}

+ 14
- 0
main/core/common.h Ver fichero

@@ -0,0 +1,14 @@
#ifndef _COMMON_H_
#define _COMMON_H_

#ifdef __cplusplus
extern "C" {
#endif

void delay(unsigned int ms);

#ifdef __cplusplus
}
#endif

#endif

main/display.c → main/core/display.c Ver fichero


main/display.h → main/core/display.h Ver fichero

@@ -1,3 +1,7 @@
#ifdef __cplusplus
extern "C" {
#endif

void display_init();
void spi_init();
void display_connect();
@@ -8,4 +12,8 @@ void display_refresh();
void display_update();

void display_wake();
void display_sleep();
void display_sleep();

#ifdef __cplusplus
}
#endif

main/storage.c → main/core/storage.c Ver fichero


+ 9
- 0
main/core/storage.h Ver fichero

@@ -0,0 +1,9 @@
#ifdef __cplusplus
extern "C" {
#endif

int storage_init();

#ifdef __cplusplus
}
#endif

+ 11
- 103
main/main.cpp Ver fichero

@@ -4,8 +4,6 @@
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "driver/gpio.h"
#include "esp_system.h"
@@ -14,16 +12,15 @@
#include "esp_log.h"
static const char *TAG = "main";

extern "C" {
#include "core/common.h"
#include "config.h"
#include "buttons.h"
#include "storage.h"
#include "display.h"
}
#include "core/buttons.h"
#include "core/storage.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 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]";
esp_err_t ret;

void sleep(unsigned int ms)
{
vTaskDelay(ms / portTICK_RATE_MS);
}

extern "C" void app_main()
{
printf("\n LilyBook v%s\n\n", APP_VERSION);
@@ -46,99 +38,15 @@ extern "C" void app_main()
display_init();
spi_init();

sleep(500);
delay(500);

display_connect();
display_splash_screen();

sleep(500);

printf("==== START ====\r\n\n");

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;

getModeRunner()->init();
getModeRunner()->startMainMode(new BootMode());
while (1) {
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) {
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();
}*/
getModeRunner()->loop();
}

}

+ 12
- 0
main/modes/AppMode.h Ver fichero

@@ -0,0 +1,12 @@
#ifndef _APPMODE_H_
#define _APPMODE_H_

class AppMode
{
public:
virtual void start();
virtual void loop();
virtual void finish();
};

#endif

+ 19
- 0
main/modes/BootMode.cpp Ver fichero

@@ -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
- 0
main/modes/BootMode.h Ver fichero

@@ -0,0 +1,9 @@
#include "AppMode.h"

class BootMode : public AppMode
{
public:
virtual void start();
virtual void loop();
virtual void finish();
};

+ 25
- 0
main/modes/MainMenuMode.cpp Ver fichero

@@ -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
- 0
main/modes/MainMenuMode.h Ver fichero

@@ -0,0 +1,9 @@
#include "AppMode.h"

class MainMenuMode : public AppMode
{
public:
virtual void start();
virtual void loop();
virtual void finish();
};

+ 55
- 0
main/modes/ModeRunner.cpp Ver fichero

@@ -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
- 0
main/modes/ModeRunner.h Ver fichero

@@ -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
- 0
main/modes/ReaderMode.cpp Ver fichero

@@ -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
- 0
main/modes/ReaderMode.h Ver fichero

@@ -0,0 +1,9 @@
#include "AppMode.h"

class ReaderMode : AppMode
{
public:
virtual void start();
virtual void loop();
virtual void finish();
};

main/Page.cpp → main/modes/reader/Page.cpp Ver fichero


main/Page.h → main/modes/reader/Page.h Ver fichero


main/PagePrinter.cpp → main/modes/reader/PagePrinter.cpp Ver fichero


main/PagePrinter.h → main/modes/reader/PagePrinter.h Ver fichero


main/PageSettingsProvider.cpp → main/modes/reader/PageSettingsProvider.cpp Ver fichero


main/PageSettingsProvider.h → main/modes/reader/PageSettingsProvider.h Ver fichero


main/TextReader.cpp → main/modes/reader/TextReader.cpp Ver fichero


main/TextReader.h → main/modes/reader/TextReader.h Ver fichero


main/TextStorage.cpp → main/modes/reader/TextStorage.cpp Ver fichero


main/TextStorage.h → main/modes/reader/TextStorage.h Ver fichero


main/Typesetter.cpp → main/modes/reader/Typesetter.cpp Ver fichero


main/Typesetter.h → main/modes/reader/Typesetter.h Ver fichero


+ 0
- 2
main/storage.h Ver fichero

@@ -1,2 +0,0 @@

int storage_init();

Cargando…
Cancelar
Guardar