mirror of
https://github.com/InfiniTimeOrg/InfiniTime.git
synced 2024-10-22 15:11:51 +02:00
Read program from external flash
This commit is contained in:
parent
46c25e83bc
commit
3556687e2e
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue