Read program from external flash

This commit is contained in:
Felipe Martinez 2024-07-08 12:49:58 +00:00
parent 46c25e83bc
commit 3556687e2e
2 changed files with 44 additions and 15 deletions

View file

@ -4,8 +4,6 @@
#include <assert.h>
#include <cstdio>
#include "asm_data.h"
using namespace Pinetime::Applications::Screens;
constexpr lv_font_t* fonts[] = {
@ -19,10 +17,16 @@ constexpr lv_font_t* fonts[] = {
};
constexpr int num_fonts = sizeof(fonts) / sizeof(fonts[0]);
ASM::ASM(Controllers::DateTime& dateTimeController, const Controllers::Battery& batteryController, const Controllers::Ble& bleController)
: dateTimeController(dateTimeController), statusIcons(batteryController, bleController) {
this->code = out_bin;
this->code_len = out_bin_len;
ASM::ASM(Controllers::DateTime& dateTimeController,
const Controllers::Battery& batteryController,
const Controllers::Ble& bleController,
Controllers::FS& fsController)
: dateTimeController(dateTimeController), statusIcons(batteryController, bleController), fs(fsController) {
int result = fsController.FileOpen(&file, "program.bin", LFS_O_RDONLY);
asm_assert(result >= 0);
populate_cache(0);
Refresh();
}
@ -32,13 +36,25 @@ ASM::~ASM() {
lv_task_del(taskRefresh);
}
fs.FileClose(&file);
// We don't need to clean the screen since all objects are deleted when their shared_ptr is dropped
// lv_obj_clean(lv_scr_act());
}
void ASM::populate_cache(size_t pos) {
int result = fs.FileSeek(&file, pos);
asm_assert(result >= 0);
result = fs.FileRead(&file, cache, cache_size);
asm_assert(result >= 0);
cache_start = pos;
}
void ASM::run() {
for (;;) {
if (pc >= code_len) {
if (pc >= program_size) {
break;
}

View file

@ -24,7 +24,7 @@ namespace Pinetime {
namespace Screens {
class ASM : public Screen {
public:
ASM(Controllers::DateTime&, const Controllers::Battery&, const Controllers::Ble&);
ASM(Controllers::DateTime&, const Controllers::Battery&, const Controllers::Ble&, Controllers::FS&);
~ASM();
void Refresh() override;
@ -33,6 +33,7 @@ namespace Pinetime {
static constexpr int num_slots = 16;
static constexpr int max_locals = 16;
static constexpr int stack_size = 32;
static constexpr int cache_size = 16;
enum DataType : uint8_t { Integer, String, LvglObject, DateTime };
@ -174,24 +175,32 @@ namespace Pinetime {
enum class OpcodeLong : uint16_t {};
void populate_cache(size_t pos);
uint8_t read_byte(size_t pos) {
return code[pos];
if (pos < cache_start || pos >= cache_start + cache_size) {
populate_cache(pos);
}
return cache[pos - cache_start];
}
uint16_t read_u16(size_t pos) {
return static_cast<uint16_t>(code[pos + 1] << 8 | code[pos]);
return static_cast<uint16_t>(read_byte(pos + 1) << 8 | read_byte(pos));
}
uint32_t read_u24(size_t pos) {
return static_cast<uint32_t>(code[pos + 2] << 16 | code[pos + 1] << 8 | code[pos]);
return static_cast<uint32_t>(read_byte(pos + 2) << 16 | read_byte(pos + 1) << 8 | read_byte(pos));
}
uint32_t read_u32(size_t pos) {
return static_cast<uint32_t>(code[pos + 3] << 24 | code[pos + 2] << 16 | code[pos + 1] << 8 | code[pos]);
return static_cast<uint32_t>(read_byte(pos + 3) << 24 | read_byte(pos + 2) << 16 | read_byte(pos + 1) << 8 | read_byte(pos));
}
uint8_t* code;
size_t code_len;
lfs_file_t file;
uint8_t cache[cache_size];
size_t cache_start;
size_t program_size;
size_t pc = 0;
std::shared_ptr<Value> locals[max_locals] = {};
@ -203,6 +212,7 @@ namespace Pinetime {
Controllers::DateTime& dateTimeController;
Widgets::StatusIcons statusIcons;
Controllers::FS& fs;
bool showingStatusIcons = false;
@ -248,7 +258,10 @@ namespace Pinetime {
static constexpr const char* icon = Screens::Symbols::eye;
static Screens::Screen* Create(AppControllers& controllers) {
return new Screens::ASM(controllers.dateTimeController, controllers.batteryController, controllers.bleController);
return new Screens::ASM(controllers.dateTimeController,
controllers.batteryController,
controllers.bleController,
controllers.filesystem);
};
};
};