Using littlefs (#438)
* add submodule littlefs * base fs * Save settings using littlefs * Small fixes and suggestions from PR * More small fixes from PR suggestions * Code clean up * Change SpiNorFlash functions to be private in FS
This commit is contained in:
		
							parent
							
								
									61a4642221
								
							
						
					
					
						commit
						084123b752
					
				
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							@ -1,3 +1,6 @@
 | 
				
			|||||||
[submodule "src/libs/lvgl"]
 | 
					[submodule "src/libs/lvgl"]
 | 
				
			||||||
	path = src/libs/lvgl
 | 
						path = src/libs/lvgl
 | 
				
			||||||
	url = https://github.com/joaquimorg/lvgl.git
 | 
						url = https://github.com/joaquimorg/lvgl.git
 | 
				
			||||||
 | 
					[submodule "src/libs/littlefs"]
 | 
				
			||||||
 | 
						path = src/libs/littlefs
 | 
				
			||||||
 | 
						url = https://github.com/littlefs-project/littlefs.git
 | 
				
			||||||
 | 
				
			|||||||
@ -166,6 +166,13 @@ set(NIMBLE_SRC
 | 
				
			|||||||
        libs/mynewt-nimble/nimble/host/util/src/addr.c
 | 
					        libs/mynewt-nimble/nimble/host/util/src/addr.c
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set(LITTLEFS_SRC
 | 
				
			||||||
 | 
					        libs/littlefs/lfs_util.h
 | 
				
			||||||
 | 
					        libs/littlefs/lfs.h
 | 
				
			||||||
 | 
					        libs/littlefs/lfs_util.c
 | 
				
			||||||
 | 
					        libs/littlefs/lfs.c
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set(LVGL_SRC
 | 
					set(LVGL_SRC
 | 
				
			||||||
        libs/lv_conf.h
 | 
					        libs/lv_conf.h
 | 
				
			||||||
        libs/lvgl/lvgl.h
 | 
					        libs/lvgl/lvgl.h
 | 
				
			||||||
@ -465,6 +472,7 @@ list(APPEND SOURCE_FILES
 | 
				
			|||||||
        components/motor/MotorController.cpp
 | 
					        components/motor/MotorController.cpp
 | 
				
			||||||
        components/settings/Settings.cpp
 | 
					        components/settings/Settings.cpp
 | 
				
			||||||
        components/timer/TimerController.cpp
 | 
					        components/timer/TimerController.cpp
 | 
				
			||||||
 | 
					        components/fs/FS.cpp
 | 
				
			||||||
        drivers/Cst816s.cpp
 | 
					        drivers/Cst816s.cpp
 | 
				
			||||||
        FreeRTOS/port.c
 | 
					        FreeRTOS/port.c
 | 
				
			||||||
        FreeRTOS/port_cmsis_systick.c
 | 
					        FreeRTOS/port_cmsis_systick.c
 | 
				
			||||||
@ -543,6 +551,7 @@ list(APPEND RECOVERY_SOURCE_FILES
 | 
				
			|||||||
        components/heartrate/Biquad.cpp
 | 
					        components/heartrate/Biquad.cpp
 | 
				
			||||||
        components/heartrate/Ptagc.cpp
 | 
					        components/heartrate/Ptagc.cpp
 | 
				
			||||||
        components/motor/MotorController.cpp
 | 
					        components/motor/MotorController.cpp
 | 
				
			||||||
 | 
					        components/fs/FS.cpp
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
list(APPEND RECOVERYLOADER_SOURCE_FILES
 | 
					list(APPEND RECOVERYLOADER_SOURCE_FILES
 | 
				
			||||||
@ -801,13 +810,25 @@ target_compile_options(lvgl PRIVATE
 | 
				
			|||||||
        $<$<COMPILE_LANGUAGE:ASM>: -MP -MD -x assembler-with-cpp>
 | 
					        $<$<COMPILE_LANGUAGE:ASM>: -MP -MD -x assembler-with-cpp>
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# LITTLEFS_SRC
 | 
				
			||||||
 | 
					add_library(littlefs STATIC ${LITTLEFS_SRC})
 | 
				
			||||||
 | 
					target_include_directories(littlefs SYSTEM PUBLIC . ../)
 | 
				
			||||||
 | 
					target_include_directories(littlefs SYSTEM PUBLIC ${INCLUDES_FROM_LIBS})
 | 
				
			||||||
 | 
					target_compile_options(littlefs PRIVATE
 | 
				
			||||||
 | 
					        $<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:DEBUG>>: ${COMMON_FLAGS} -Wno-unused-function -Og -g3>
 | 
				
			||||||
 | 
					        $<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:RELEASE>>: ${COMMON_FLAGS} -Wno-unused-function -Os>
 | 
				
			||||||
 | 
					        $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CONFIG:DEBUG>>: ${COMMON_FLAGS} -Wno-unused-function -Og -g3 -fno-rtti>
 | 
				
			||||||
 | 
					        $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CONFIG:RELEASE>>: ${COMMON_FLAGS} -Wno-unused-function -Os -fno-rtti>
 | 
				
			||||||
 | 
					        $<$<COMPILE_LANGUAGE:ASM>: -MP -MD -x assembler-with-cpp>
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Build autonomous binary (without support for bootloader)
 | 
					# Build autonomous binary (without support for bootloader)
 | 
				
			||||||
set(EXECUTABLE_NAME "pinetime-app")
 | 
					set(EXECUTABLE_NAME "pinetime-app")
 | 
				
			||||||
set(EXECUTABLE_FILE_NAME ${EXECUTABLE_NAME}-${pinetime_VERSION_MAJOR}.${pinetime_VERSION_MINOR}.${pinetime_VERSION_PATCH})
 | 
					set(EXECUTABLE_FILE_NAME ${EXECUTABLE_NAME}-${pinetime_VERSION_MAJOR}.${pinetime_VERSION_MINOR}.${pinetime_VERSION_PATCH})
 | 
				
			||||||
set(NRF5_LINKER_SCRIPT "${CMAKE_SOURCE_DIR}/gcc_nrf52.ld")
 | 
					set(NRF5_LINKER_SCRIPT "${CMAKE_SOURCE_DIR}/gcc_nrf52.ld")
 | 
				
			||||||
add_executable(${EXECUTABLE_NAME} ${SOURCE_FILES})
 | 
					add_executable(${EXECUTABLE_NAME} ${SOURCE_FILES})
 | 
				
			||||||
set_target_properties(${EXECUTABLE_NAME} PROPERTIES OUTPUT_NAME ${EXECUTABLE_FILE_NAME})
 | 
					set_target_properties(${EXECUTABLE_NAME} PROPERTIES OUTPUT_NAME ${EXECUTABLE_FILE_NAME})
 | 
				
			||||||
target_link_libraries(${EXECUTABLE_NAME} nimble nrf-sdk lvgl)
 | 
					target_link_libraries(${EXECUTABLE_NAME} nimble nrf-sdk lvgl littlefs)
 | 
				
			||||||
target_compile_options(${EXECUTABLE_NAME} PUBLIC
 | 
					target_compile_options(${EXECUTABLE_NAME} PUBLIC
 | 
				
			||||||
        $<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:DEBUG>>: ${COMMON_FLAGS} -Og -g3>
 | 
					        $<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:DEBUG>>: ${COMMON_FLAGS} -Og -g3>
 | 
				
			||||||
        $<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:RELEASE>>: ${COMMON_FLAGS} -Os>
 | 
					        $<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:RELEASE>>: ${COMMON_FLAGS} -Os>
 | 
				
			||||||
@ -836,7 +857,7 @@ set(IMAGE_MCUBOOT_FILE_NAME ${EXECUTABLE_MCUBOOT_NAME}-image-${pinetime_VERSION_
 | 
				
			|||||||
set(DFU_MCUBOOT_FILE_NAME ${EXECUTABLE_MCUBOOT_NAME}-dfu-${pinetime_VERSION_MAJOR}.${pinetime_VERSION_MINOR}.${pinetime_VERSION_PATCH}.zip)
 | 
					set(DFU_MCUBOOT_FILE_NAME ${EXECUTABLE_MCUBOOT_NAME}-dfu-${pinetime_VERSION_MAJOR}.${pinetime_VERSION_MINOR}.${pinetime_VERSION_PATCH}.zip)
 | 
				
			||||||
set(NRF5_LINKER_SCRIPT_MCUBOOT "${CMAKE_SOURCE_DIR}/gcc_nrf52-mcuboot.ld")
 | 
					set(NRF5_LINKER_SCRIPT_MCUBOOT "${CMAKE_SOURCE_DIR}/gcc_nrf52-mcuboot.ld")
 | 
				
			||||||
add_executable(${EXECUTABLE_MCUBOOT_NAME} ${SOURCE_FILES})
 | 
					add_executable(${EXECUTABLE_MCUBOOT_NAME} ${SOURCE_FILES})
 | 
				
			||||||
target_link_libraries(${EXECUTABLE_MCUBOOT_NAME} nimble nrf-sdk lvgl)
 | 
					target_link_libraries(${EXECUTABLE_MCUBOOT_NAME} nimble nrf-sdk lvgl littlefs)
 | 
				
			||||||
set_target_properties(${EXECUTABLE_MCUBOOT_NAME} PROPERTIES OUTPUT_NAME ${EXECUTABLE_MCUBOOT_FILE_NAME})
 | 
					set_target_properties(${EXECUTABLE_MCUBOOT_NAME} PROPERTIES OUTPUT_NAME ${EXECUTABLE_MCUBOOT_FILE_NAME})
 | 
				
			||||||
target_compile_options(${EXECUTABLE_MCUBOOT_NAME} PUBLIC
 | 
					target_compile_options(${EXECUTABLE_MCUBOOT_NAME} PUBLIC
 | 
				
			||||||
        $<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:DEBUG>>: ${COMMON_FLAGS} -Og -g3>
 | 
					        $<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:DEBUG>>: ${COMMON_FLAGS} -Og -g3>
 | 
				
			||||||
@ -872,7 +893,7 @@ endif()
 | 
				
			|||||||
set(EXECUTABLE_RECOVERY_NAME "pinetime-recovery")
 | 
					set(EXECUTABLE_RECOVERY_NAME "pinetime-recovery")
 | 
				
			||||||
set(EXECUTABLE_RECOVERY_FILE_NAME ${EXECUTABLE_RECOVERY_NAME}-${pinetime_VERSION_MAJOR}.${pinetime_VERSION_MINOR}.${pinetime_VERSION_PATCH})
 | 
					set(EXECUTABLE_RECOVERY_FILE_NAME ${EXECUTABLE_RECOVERY_NAME}-${pinetime_VERSION_MAJOR}.${pinetime_VERSION_MINOR}.${pinetime_VERSION_PATCH})
 | 
				
			||||||
add_executable(${EXECUTABLE_RECOVERY_NAME} ${RECOVERY_SOURCE_FILES})
 | 
					add_executable(${EXECUTABLE_RECOVERY_NAME} ${RECOVERY_SOURCE_FILES})
 | 
				
			||||||
target_link_libraries(${EXECUTABLE_RECOVERY_NAME} nimble nrf-sdk)
 | 
					target_link_libraries(${EXECUTABLE_RECOVERY_NAME} nimble nrf-sdk littlefs)
 | 
				
			||||||
set_target_properties(${EXECUTABLE_RECOVERY_NAME} PROPERTIES OUTPUT_NAME ${EXECUTABLE_RECOVERY_FILE_NAME})
 | 
					set_target_properties(${EXECUTABLE_RECOVERY_NAME} PROPERTIES OUTPUT_NAME ${EXECUTABLE_RECOVERY_FILE_NAME})
 | 
				
			||||||
target_compile_definitions(${EXECUTABLE_RECOVERY_NAME} PUBLIC "PINETIME_IS_RECOVERY")
 | 
					target_compile_definitions(${EXECUTABLE_RECOVERY_NAME} PUBLIC "PINETIME_IS_RECOVERY")
 | 
				
			||||||
target_compile_options(${EXECUTABLE_RECOVERY_NAME} PUBLIC
 | 
					target_compile_options(${EXECUTABLE_RECOVERY_NAME} PUBLIC
 | 
				
			||||||
@ -902,7 +923,7 @@ set(EXECUTABLE_RECOVERY_MCUBOOT_FILE_NAME ${EXECUTABLE_RECOVERY_MCUBOOT_NAME}-${
 | 
				
			|||||||
set(IMAGE_RECOVERY_MCUBOOT_FILE_NAME ${EXECUTABLE_RECOVERY_MCUBOOT_NAME}-image-${pinetime_VERSION_MAJOR}.${pinetime_VERSION_MINOR}.${pinetime_VERSION_PATCH}.bin)
 | 
					set(IMAGE_RECOVERY_MCUBOOT_FILE_NAME ${EXECUTABLE_RECOVERY_MCUBOOT_NAME}-image-${pinetime_VERSION_MAJOR}.${pinetime_VERSION_MINOR}.${pinetime_VERSION_PATCH}.bin)
 | 
				
			||||||
set(DFU_RECOVERY_MCUBOOT_FILE_NAME ${EXECUTABLE_RECOVERY_MCUBOOT_NAME}-dfu-${pinetime_VERSION_MAJOR}.${pinetime_VERSION_MINOR}.${pinetime_VERSION_PATCH}.zip)
 | 
					set(DFU_RECOVERY_MCUBOOT_FILE_NAME ${EXECUTABLE_RECOVERY_MCUBOOT_NAME}-dfu-${pinetime_VERSION_MAJOR}.${pinetime_VERSION_MINOR}.${pinetime_VERSION_PATCH}.zip)
 | 
				
			||||||
add_executable(${EXECUTABLE_RECOVERY_MCUBOOT_NAME} ${RECOVERY_SOURCE_FILES})
 | 
					add_executable(${EXECUTABLE_RECOVERY_MCUBOOT_NAME} ${RECOVERY_SOURCE_FILES})
 | 
				
			||||||
target_link_libraries(${EXECUTABLE_RECOVERY_MCUBOOT_NAME} nimble nrf-sdk)
 | 
					target_link_libraries(${EXECUTABLE_RECOVERY_MCUBOOT_NAME} nimble nrf-sdk littlefs)
 | 
				
			||||||
set_target_properties(${EXECUTABLE_RECOVERY_MCUBOOT_NAME} PROPERTIES OUTPUT_NAME ${EXECUTABLE_RECOVERY_MCUBOOT_FILE_NAME})
 | 
					set_target_properties(${EXECUTABLE_RECOVERY_MCUBOOT_NAME} PROPERTIES OUTPUT_NAME ${EXECUTABLE_RECOVERY_MCUBOOT_FILE_NAME})
 | 
				
			||||||
target_compile_definitions(${EXECUTABLE_RECOVERY_MCUBOOT_NAME} PUBLIC "PINETIME_IS_RECOVERY")
 | 
					target_compile_definitions(${EXECUTABLE_RECOVERY_MCUBOOT_NAME} PUBLIC "PINETIME_IS_RECOVERY")
 | 
				
			||||||
target_compile_options(${EXECUTABLE_RECOVERY_MCUBOOT_NAME} PUBLIC
 | 
					target_compile_options(${EXECUTABLE_RECOVERY_MCUBOOT_NAME} PUBLIC
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										197
									
								
								src/components/fs/FS.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										197
									
								
								src/components/fs/FS.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,197 @@
 | 
				
			|||||||
 | 
					#include "FS.h"
 | 
				
			||||||
 | 
					#include <cstring>
 | 
				
			||||||
 | 
					#include <littlefs/lfs.h>
 | 
				
			||||||
 | 
					#include <lvgl/lvgl.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using namespace Pinetime::Controllers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FS::FS(Pinetime::Drivers::SpiNorFlash& driver) :
 | 
				
			||||||
 | 
					  flashDriver{ driver },
 | 
				
			||||||
 | 
					  lfsConfig{
 | 
				
			||||||
 | 
					    .context = this,
 | 
				
			||||||
 | 
					    .read = SectorRead,
 | 
				
			||||||
 | 
					    .prog = SectorProg,
 | 
				
			||||||
 | 
					    .erase = SectorErase,
 | 
				
			||||||
 | 
					    .sync = SectorSync,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .read_size = 16,
 | 
				
			||||||
 | 
					    .prog_size = 8,
 | 
				
			||||||
 | 
					    .block_size = blockSize,
 | 
				
			||||||
 | 
					    .block_count = size / blockSize,
 | 
				
			||||||
 | 
					    .block_cycles = 1000u,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .cache_size = 16,
 | 
				
			||||||
 | 
					    .lookahead_size = 16,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .name_max = 50,
 | 
				
			||||||
 | 
					    .attr_max = 50,
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					{ }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void FS::Init() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // try mount
 | 
				
			||||||
 | 
					  int err = lfs_mount(&lfs, &lfsConfig);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // reformat if we can't mount the filesystem
 | 
				
			||||||
 | 
					  // this should only happen on the first boot
 | 
				
			||||||
 | 
					  if (err != LFS_ERR_OK) {
 | 
				
			||||||
 | 
					    lfs_format(&lfs, &lfsConfig);
 | 
				
			||||||
 | 
					    err = lfs_mount(&lfs, &lfsConfig);
 | 
				
			||||||
 | 
					    if (err != LFS_ERR_OK) {
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef PINETIME_IS_RECOVERY
 | 
				
			||||||
 | 
					  VerifyResource();
 | 
				
			||||||
 | 
					  LVGLFileSystemInit();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void FS::VerifyResource() {
 | 
				
			||||||
 | 
					  // validate the resource metadata
 | 
				
			||||||
 | 
					  resourcesValid = true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int  FS::FileOpen(lfs_file_t* file_p, const char* fileName, const int flags) {
 | 
				
			||||||
 | 
					  return lfs_file_open(&lfs, file_p, fileName, flags);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int FS::FileClose(lfs_file_t* file_p) {
 | 
				
			||||||
 | 
					  return lfs_file_close(&lfs, file_p);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int FS::FileRead(lfs_file_t* file_p, uint8_t* buff, uint32_t size) {
 | 
				
			||||||
 | 
					  return lfs_file_read(&lfs, file_p, buff, size);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int FS::FileWrite(lfs_file_t* file_p, const uint8_t* buff, uint32_t size) {
 | 
				
			||||||
 | 
					  return lfs_file_write(&lfs, file_p, buff, size);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int FS::FileSeek(lfs_file_t* file_p, uint32_t pos) {
 | 
				
			||||||
 | 
					  return lfs_file_seek(&lfs, file_p, pos, LFS_SEEK_SET);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int FS::FileDelete(const char* fileName) {
 | 
				
			||||||
 | 
					  return lfs_remove(&lfs, fileName);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int FS::DirCreate(const char* path) {
 | 
				
			||||||
 | 
					  return lfs_mkdir(&lfs, path);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Delete directory and all files inside
 | 
				
			||||||
 | 
					int FS::DirDelete(const char* path) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  lfs_dir_t lfs_dir;
 | 
				
			||||||
 | 
					  lfs_info entryInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int err;
 | 
				
			||||||
 | 
					  err = lfs_dir_open(&lfs, &lfs_dir, path);
 | 
				
			||||||
 | 
					  if (err) {
 | 
				
			||||||
 | 
					    return err;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  while (lfs_dir_read(&lfs, &lfs_dir, &entryInfo)) {
 | 
				
			||||||
 | 
					    lfs_remove(&lfs, entryInfo.name);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  lfs_dir_close(&lfs, &lfs_dir);
 | 
				
			||||||
 | 
					  return LFS_ERR_OK;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ----------- Interface between littlefs and SpiNorFlash -----------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					int FS::SectorSync(const struct lfs_config* c) {
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int FS::SectorErase(const struct lfs_config* c, lfs_block_t block) {
 | 
				
			||||||
 | 
					  Pinetime::Controllers::FS& lfs = *(static_cast<Pinetime::Controllers::FS*>(c->context));
 | 
				
			||||||
 | 
					  const size_t address = startAddress + (block * blockSize);
 | 
				
			||||||
 | 
					  lfs.flashDriver.SectorErase(address);
 | 
				
			||||||
 | 
					  return lfs.flashDriver.EraseFailed() ? -1 : 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int FS::SectorProg(const struct lfs_config* c, lfs_block_t block, lfs_off_t off, const void* buffer, lfs_size_t size) {
 | 
				
			||||||
 | 
					  Pinetime::Controllers::FS& lfs = *(static_cast<Pinetime::Controllers::FS*>(c->context));
 | 
				
			||||||
 | 
					  const size_t address = startAddress + (block * blockSize) + off;
 | 
				
			||||||
 | 
					  lfs.flashDriver.Write(address, (uint8_t*) buffer, size);
 | 
				
			||||||
 | 
					  return lfs.flashDriver.ProgramFailed() ? -1 : 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int FS::SectorRead(const struct lfs_config* c, lfs_block_t block, lfs_off_t off, void* buffer, lfs_size_t size) {
 | 
				
			||||||
 | 
					  Pinetime::Controllers::FS& lfs = *(static_cast<Pinetime::Controllers::FS*>(c->context));
 | 
				
			||||||
 | 
					  const size_t address = startAddress + (block * blockSize) + off;
 | 
				
			||||||
 | 
					  lfs.flashDriver.Read(address, static_cast<uint8_t*>(buffer), size);
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ----------- LVGL filesystem integration -----------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace {
 | 
				
			||||||
 | 
					  lv_fs_res_t lvglOpen(lv_fs_drv_t* drv, void* file_p, const char* path, lv_fs_mode_t mode) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    lfs_file_t* file = static_cast<lfs_file_t*>(file_p);
 | 
				
			||||||
 | 
					    FS* filesys = static_cast<FS*>(drv->user_data);
 | 
				
			||||||
 | 
					    filesys->FileOpen(file, path, LFS_O_RDONLY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (file->type == 0) {
 | 
				
			||||||
 | 
					      return LV_FS_RES_FS_ERR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					      return LV_FS_RES_OK;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  lv_fs_res_t lvglClose(lv_fs_drv_t* drv, void* file_p) {
 | 
				
			||||||
 | 
					    FS* filesys = static_cast<FS*>(drv->user_data);
 | 
				
			||||||
 | 
					    lfs_file_t* file = static_cast<lfs_file_t*>(file_p);
 | 
				
			||||||
 | 
					    filesys->FileClose(file);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return LV_FS_RES_OK;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  lv_fs_res_t lvglRead(lv_fs_drv_t* drv, void* file_p, void* buf, uint32_t btr, uint32_t* br) {
 | 
				
			||||||
 | 
					    FS* filesys = static_cast<FS*>(drv->user_data);
 | 
				
			||||||
 | 
					    lfs_file_t* file = static_cast<lfs_file_t*>(file_p);
 | 
				
			||||||
 | 
					    filesys->FileRead(file, static_cast<uint8_t*>(buf), btr);
 | 
				
			||||||
 | 
					    *br = btr;
 | 
				
			||||||
 | 
					    return LV_FS_RES_OK;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  lv_fs_res_t lvglSeek(lv_fs_drv_t* drv, void* file_p, uint32_t pos) {
 | 
				
			||||||
 | 
					    FS* filesys = static_cast<FS*>(drv->user_data);
 | 
				
			||||||
 | 
					    lfs_file_t* file = static_cast<lfs_file_t*>(file_p);
 | 
				
			||||||
 | 
					    filesys->FileSeek(file, pos);
 | 
				
			||||||
 | 
					    return LV_FS_RES_OK;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void FS::LVGLFileSystemInit() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  lv_fs_drv_t fs_drv;
 | 
				
			||||||
 | 
					  lv_fs_drv_init(&fs_drv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  fs_drv.file_size = sizeof(lfs_file_t);
 | 
				
			||||||
 | 
					  fs_drv.letter = 'F';
 | 
				
			||||||
 | 
					  fs_drv.open_cb = lvglOpen;
 | 
				
			||||||
 | 
					  fs_drv.close_cb = lvglClose;
 | 
				
			||||||
 | 
					  fs_drv.read_cb = lvglRead;
 | 
				
			||||||
 | 
					  fs_drv.seek_cb = lvglSeek;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  fs_drv.user_data = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  lv_fs_drv_register(&fs_drv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										71
									
								
								src/components/fs/FS.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								src/components/fs/FS.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,71 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <cstdint>
 | 
				
			||||||
 | 
					#include "drivers/SpiNorFlash.h"
 | 
				
			||||||
 | 
					#include <littlefs/lfs.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Pinetime {
 | 
				
			||||||
 | 
					  namespace Controllers {
 | 
				
			||||||
 | 
					    class FS {
 | 
				
			||||||
 | 
					    public:
 | 
				
			||||||
 | 
					      FS(Pinetime::Drivers::SpiNorFlash&);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      void Init();
 | 
				
			||||||
 | 
					      void LVGLFileSystemInit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      int FileOpen(lfs_file_t* file_p, const char* fileName, const int flags);
 | 
				
			||||||
 | 
					      int FileClose(lfs_file_t* file_p);
 | 
				
			||||||
 | 
					      int FileRead(lfs_file_t* file_p, uint8_t* buff, uint32_t size);
 | 
				
			||||||
 | 
					      int FileWrite(lfs_file_t* file_p, const uint8_t* buff, uint32_t size);
 | 
				
			||||||
 | 
					      int FileSeek(lfs_file_t* file_p, uint32_t pos);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      int FileDelete(const char* fileName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      int DirCreate(const char* path);
 | 
				
			||||||
 | 
					      int DirDelete(const char* path);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      void VerifyResource();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      Pinetime::Drivers::SpiNorFlash& flashDriver;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					      * External Flash MAP (4 MBytes)
 | 
				
			||||||
 | 
					      *
 | 
				
			||||||
 | 
					      * 0x000000 +---------------------------------------+
 | 
				
			||||||
 | 
					      *          |  Bootloader Assets                    |
 | 
				
			||||||
 | 
					      *          |  256 KBytes                           |
 | 
				
			||||||
 | 
					      *          |                                       |
 | 
				
			||||||
 | 
					      * 0x040000 +---------------------------------------+
 | 
				
			||||||
 | 
					      *          |  OTA                                  |
 | 
				
			||||||
 | 
					      *          |  464 KBytes                           |
 | 
				
			||||||
 | 
					      *          |                                       |
 | 
				
			||||||
 | 
					      *          |                                       |
 | 
				
			||||||
 | 
					      *          |                                       |
 | 
				
			||||||
 | 
					      * 0x0B4000 +---------------------------------------+
 | 
				
			||||||
 | 
					      *          |  File System                          |
 | 
				
			||||||
 | 
					      *          |                                       |
 | 
				
			||||||
 | 
					      *          |                                       |
 | 
				
			||||||
 | 
					      *          |                                       |
 | 
				
			||||||
 | 
					      *          |                                       |
 | 
				
			||||||
 | 
					      * 0x400000 +---------------------------------------+
 | 
				
			||||||
 | 
					      *
 | 
				
			||||||
 | 
					      */
 | 
				
			||||||
 | 
					      static constexpr size_t startAddress = 0x0B4000;
 | 
				
			||||||
 | 
					      static constexpr size_t size = 0x3C0000;
 | 
				
			||||||
 | 
					      static constexpr size_t blockSize = 4096;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      bool resourcesValid = false;
 | 
				
			||||||
 | 
					      const struct lfs_config lfsConfig;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      lfs_t lfs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      static int SectorSync(const struct lfs_config* c);
 | 
				
			||||||
 | 
					      static int SectorErase(const struct lfs_config* c, lfs_block_t block);
 | 
				
			||||||
 | 
					      static int SectorProg(const struct lfs_config* c, lfs_block_t block, lfs_off_t off, const void* buffer, lfs_size_t size);
 | 
				
			||||||
 | 
					      static int SectorRead(const struct lfs_config* c, lfs_block_t block, lfs_off_t off, void* buffer, lfs_size_t size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -4,108 +4,44 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
using namespace Pinetime::Controllers;
 | 
					using namespace Pinetime::Controllers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct SettingsHeader {
 | 
					Settings::Settings(Pinetime::Controllers::FS& fs) : fs {fs} {
 | 
				
			||||||
  uint8_t isActive; // 0xF1 = Block is active, 0xF0 = Block is inactive
 | 
					 | 
				
			||||||
  uint16_t version; // Current version, to verify if the saved data is for the current Version
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define HEADER_SIZE sizeof(SettingsHeader)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Settings::Settings(Pinetime::Drivers::SpiNorFlash& spiNorFlash) : spiNorFlash {spiNorFlash} {
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Settings::Init() {
 | 
					void Settings::Init() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Load default settings from Flash
 | 
					  // Load default settings from Flash
 | 
				
			||||||
  LoadSettingsFromFlash();
 | 
					  LoadSettingsFromFile();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Settings::SaveSettings() {
 | 
					void Settings::SaveSettings() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // verify if is necessary to save
 | 
					  // verify if is necessary to save
 | 
				
			||||||
  if (settingsChanged) {
 | 
					  if (settingsChanged) {
 | 
				
			||||||
    SaveSettingsToFlash();
 | 
					    SaveSettingsToFile();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  settingsChanged = false;
 | 
					  settingsChanged = false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool Settings::FindHeader() {
 | 
					void Settings::LoadSettingsFromFile() {
 | 
				
			||||||
  SettingsHeader settingsHeader;
 | 
					  SettingsData bufferSettings;
 | 
				
			||||||
  uint8_t bufferHead[sizeof(settingsHeader)];
 | 
					  lfs_file_t settingsFile;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (uint8_t block = 0; block < 10; block++) {
 | 
					  if ( fs.FileOpen(&settingsFile, "/settings.dat", LFS_O_RDWR | LFS_O_CREAT) != LFS_ERR_OK) {
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
    spiNorFlash.Read(settingsBaseAddr + (block * 0x1000), bufferHead, sizeof(settingsHeader));
 | 
					 | 
				
			||||||
    std::memcpy(&settingsHeader, bufferHead, sizeof(settingsHeader));
 | 
					 | 
				
			||||||
    if (settingsHeader.isActive == 0xF1 && settingsHeader.version == settingsVersion) {
 | 
					 | 
				
			||||||
      settingsFlashBlock = block;
 | 
					 | 
				
			||||||
      return true;
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  }
 | 
					  fs.FileRead(&settingsFile, reinterpret_cast<uint8_t*>(&bufferSettings), sizeof(settings));
 | 
				
			||||||
  return false;
 | 
					  fs.FileClose(&settingsFile);
 | 
				
			||||||
}
 | 
					  if ( bufferSettings.version == settingsVersion ) {
 | 
				
			||||||
 | 
					    settings = bufferSettings;
 | 
				
			||||||
void Settings::ReadSettingsData() {
 | 
					 | 
				
			||||||
  uint8_t bufferSettings[sizeof(settings)];
 | 
					 | 
				
			||||||
  spiNorFlash.Read(settingsBaseAddr + (settingsFlashBlock * 0x1000) + HEADER_SIZE, bufferSettings, sizeof(settings));
 | 
					 | 
				
			||||||
  std::memcpy(&settings, bufferSettings, sizeof(settings));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void Settings::EraseBlock() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  spiNorFlash.SectorErase(settingsBaseAddr + (settingsFlashBlock * 0x1000));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void Settings::SetHeader(bool state) {
 | 
					 | 
				
			||||||
  SettingsHeader settingsHeader;
 | 
					 | 
				
			||||||
  uint8_t bufferHead[sizeof(settingsHeader)];
 | 
					 | 
				
			||||||
  settingsHeader.isActive = state ? 0xF1 : 0xF0;
 | 
					 | 
				
			||||||
  settingsHeader.version = settingsVersion;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  std::memcpy(bufferHead, &settingsHeader, sizeof(settingsHeader));
 | 
					 | 
				
			||||||
  spiNorFlash.Write(settingsBaseAddr + (settingsFlashBlock * 0x1000), bufferHead, sizeof(settingsHeader));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void Settings::SaveSettingsData() {
 | 
					 | 
				
			||||||
  uint8_t bufferSettings[sizeof(settings)];
 | 
					 | 
				
			||||||
  std::memcpy(bufferSettings, &settings, sizeof(settings));
 | 
					 | 
				
			||||||
  spiNorFlash.Write(settingsBaseAddr + (settingsFlashBlock * 0x1000) + HEADER_SIZE, bufferSettings, sizeof(settings));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void Settings::LoadSettingsFromFlash() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (settingsFlashBlock == 99) {
 | 
					 | 
				
			||||||
    // Find current Block, if can't find use default settings and set block to 0 ans save !
 | 
					 | 
				
			||||||
    if (FindHeader()) {
 | 
					 | 
				
			||||||
      ReadSettingsData();
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      SaveSettingsToFlash();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  } else {
 | 
					 | 
				
			||||||
    // Read Settings from flash...
 | 
					 | 
				
			||||||
    // never used :)
 | 
					 | 
				
			||||||
    ReadSettingsData();
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Settings::SaveSettingsToFlash() {
 | 
					void Settings::SaveSettingsToFile() {
 | 
				
			||||||
 | 
					  lfs_file_t settingsFile;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // calculate where to save...
 | 
					  if ( fs.FileOpen(&settingsFile, "/settings.dat", LFS_O_RDWR | LFS_O_CREAT) != LFS_ERR_OK) {
 | 
				
			||||||
  // mark current to inactive
 | 
					    return;
 | 
				
			||||||
  // erase the new location and save
 | 
					 | 
				
			||||||
  // set settingsFlashBlock
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // if first time hever, only saves to block 0 and set settingsFlashBlock
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (settingsFlashBlock != 99) {
 | 
					 | 
				
			||||||
    SetHeader(false);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  fs.FileWrite(&settingsFile, reinterpret_cast<uint8_t*>(&settings), sizeof(settings));
 | 
				
			||||||
  settingsFlashBlock++;
 | 
					  fs.FileClose(&settingsFile);
 | 
				
			||||||
  if (settingsFlashBlock > 9)
 | 
					 | 
				
			||||||
    settingsFlashBlock = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  EraseBlock();
 | 
					 | 
				
			||||||
  SetHeader(true);
 | 
					 | 
				
			||||||
  SaveSettingsData();
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -2,25 +2,26 @@
 | 
				
			|||||||
#include <cstdint>
 | 
					#include <cstdint>
 | 
				
			||||||
#include "components/datetime/DateTimeController.h"
 | 
					#include "components/datetime/DateTimeController.h"
 | 
				
			||||||
#include "components/brightness/BrightnessController.h"
 | 
					#include "components/brightness/BrightnessController.h"
 | 
				
			||||||
#include "drivers/SpiNorFlash.h"
 | 
					#include "components/fs/FS.h"
 | 
				
			||||||
#include "drivers/Cst816s.h"
 | 
					#include "drivers/Cst816s.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Pinetime {
 | 
					namespace Pinetime {
 | 
				
			||||||
  namespace Controllers {
 | 
					  namespace Controllers {
 | 
				
			||||||
    class Settings {
 | 
					    class Settings {
 | 
				
			||||||
    public:
 | 
					    public:
 | 
				
			||||||
      enum class ClockType { H24, H12 };
 | 
					      enum class ClockType : uint8_t { H24, H12 };
 | 
				
			||||||
      enum class Vibration { ON, OFF };
 | 
					      enum class Vibration : uint8_t { ON, OFF };
 | 
				
			||||||
      enum class WakeUpMode { None, SingleTap, DoubleTap, RaiseWrist };
 | 
					      enum class WakeUpMode : uint8_t { None, SingleTap, DoubleTap, RaiseWrist };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      Settings(Pinetime::Drivers::SpiNorFlash& spiNorFlash);
 | 
					      Settings(Pinetime::Controllers::FS& fs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      void Init();
 | 
					      void Init();
 | 
				
			||||||
      void SaveSettings();
 | 
					      void SaveSettings();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      void SetClockFace(uint8_t face) {
 | 
					      void SetClockFace(uint8_t face) {
 | 
				
			||||||
        if (face != settings.clockFace)
 | 
					        if (face != settings.clockFace) {
 | 
				
			||||||
          settingsChanged = true;
 | 
					          settingsChanged = true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        settings.clockFace = face;
 | 
					        settings.clockFace = face;
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      uint8_t GetClockFace() const {
 | 
					      uint8_t GetClockFace() const {
 | 
				
			||||||
@ -42,8 +43,9 @@ namespace Pinetime {
 | 
				
			|||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      void SetClockType(ClockType clocktype) {
 | 
					      void SetClockType(ClockType clocktype) {
 | 
				
			||||||
        if (clocktype != settings.clockType)
 | 
					        if (clocktype != settings.clockType) {
 | 
				
			||||||
          settingsChanged = true;
 | 
					          settingsChanged = true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        settings.clockType = clocktype;
 | 
					        settings.clockType = clocktype;
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      ClockType GetClockType() const {
 | 
					      ClockType GetClockType() const {
 | 
				
			||||||
@ -51,8 +53,9 @@ namespace Pinetime {
 | 
				
			|||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      void SetVibrationStatus(Vibration status) {
 | 
					      void SetVibrationStatus(Vibration status) {
 | 
				
			||||||
        if (status != settings.vibrationStatus)
 | 
					        if (status != settings.vibrationStatus) {
 | 
				
			||||||
          settingsChanged = true;
 | 
					          settingsChanged = true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        settings.vibrationStatus = status;
 | 
					        settings.vibrationStatus = status;
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      Vibration GetVibrationStatus() const {
 | 
					      Vibration GetVibrationStatus() const {
 | 
				
			||||||
@ -60,8 +63,9 @@ namespace Pinetime {
 | 
				
			|||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      void SetScreenTimeOut(uint32_t timeout) {
 | 
					      void SetScreenTimeOut(uint32_t timeout) {
 | 
				
			||||||
        if (timeout != settings.screenTimeOut)
 | 
					        if (timeout != settings.screenTimeOut) {
 | 
				
			||||||
          settingsChanged = true;
 | 
					          settingsChanged = true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        settings.screenTimeOut = timeout;
 | 
					        settings.screenTimeOut = timeout;
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      uint32_t GetScreenTimeOut() const {
 | 
					      uint32_t GetScreenTimeOut() const {
 | 
				
			||||||
@ -69,8 +73,9 @@ namespace Pinetime {
 | 
				
			|||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      void setWakeUpMode(WakeUpMode wakeUp) {
 | 
					      void setWakeUpMode(WakeUpMode wakeUp) {
 | 
				
			||||||
        if (wakeUp != settings.wakeUpMode)
 | 
					        if (wakeUp != settings.wakeUpMode) {
 | 
				
			||||||
          settingsChanged = true;
 | 
					          settingsChanged = true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        settings.wakeUpMode = wakeUp;
 | 
					        settings.wakeUpMode = wakeUp;
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      WakeUpMode getWakeUpMode() const {
 | 
					      WakeUpMode getWakeUpMode() const {
 | 
				
			||||||
@ -78,8 +83,9 @@ namespace Pinetime {
 | 
				
			|||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      void SetBrightness(Controllers::BrightnessController::Levels level) {
 | 
					      void SetBrightness(Controllers::BrightnessController::Levels level) {
 | 
				
			||||||
        if (level != settings.brightLevel)
 | 
					        if (level != settings.brightLevel) {
 | 
				
			||||||
          settingsChanged = true;
 | 
					          settingsChanged = true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        settings.brightLevel = level;
 | 
					        settings.brightLevel = level;
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      Controllers::BrightnessController::Levels GetBrightness() const {
 | 
					      Controllers::BrightnessController::Levels GetBrightness() const {
 | 
				
			||||||
@ -87,25 +93,29 @@ namespace Pinetime {
 | 
				
			|||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      void SetStepsGoal( uint32_t goal ) { 
 | 
					      void SetStepsGoal( uint32_t goal ) { 
 | 
				
			||||||
        if ( goal != settings.stepsGoal ) 
 | 
					        if ( goal != settings.stepsGoal ) {
 | 
				
			||||||
          settingsChanged = true;
 | 
					          settingsChanged = true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        settings.stepsGoal = goal; 
 | 
					        settings.stepsGoal = goal; 
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      
 | 
					      
 | 
				
			||||||
      uint32_t GetStepsGoal() const { return settings.stepsGoal; };
 | 
					      uint32_t GetStepsGoal() const { return settings.stepsGoal; };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private:
 | 
					    private:
 | 
				
			||||||
      Pinetime::Drivers::SpiNorFlash& spiNorFlash;
 | 
					      Pinetime::Controllers::FS& fs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      static constexpr uint32_t settingsVersion = 0x0001;
 | 
				
			||||||
      struct SettingsData {
 | 
					      struct SettingsData {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        uint32_t version = settingsVersion;
 | 
				
			||||||
 | 
					        uint32_t stepsGoal = 10000;
 | 
				
			||||||
 | 
					        uint32_t screenTimeOut = 15000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ClockType clockType = ClockType::H24;
 | 
					        ClockType clockType = ClockType::H24;
 | 
				
			||||||
        Vibration vibrationStatus = Vibration::ON;
 | 
					        Vibration vibrationStatus = Vibration::ON;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        uint8_t clockFace = 0;
 | 
					        uint8_t clockFace = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        uint32_t stepsGoal = 10000;
 | 
					 | 
				
			||||||
        uint32_t screenTimeOut = 15000;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        WakeUpMode wakeUpMode = WakeUpMode::None;
 | 
					        WakeUpMode wakeUpMode = WakeUpMode::None;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium;
 | 
					        Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium;
 | 
				
			||||||
@ -117,20 +127,8 @@ namespace Pinetime {
 | 
				
			|||||||
      uint8_t appMenu = 0;
 | 
					      uint8_t appMenu = 0;
 | 
				
			||||||
      uint8_t settingsMenu = 0;
 | 
					      uint8_t settingsMenu = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // There are 10 blocks of reserved flash to save settings
 | 
					      void LoadSettingsFromFile();
 | 
				
			||||||
      // to minimize wear, the recording is done in a rotating way by the 10 blocks
 | 
					      void SaveSettingsToFile();
 | 
				
			||||||
      uint8_t settingsFlashBlock = 99; // default to indicate it needs to find the active block
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      static constexpr uint32_t settingsBaseAddr = 0x3F6000; // Flash Settings Location
 | 
					 | 
				
			||||||
      static constexpr uint16_t settingsVersion = 0x0100;    // Flash Settings Version
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      bool FindHeader();
 | 
					 | 
				
			||||||
      void ReadSettingsData();
 | 
					 | 
				
			||||||
      void EraseBlock();
 | 
					 | 
				
			||||||
      void SetHeader(bool state);
 | 
					 | 
				
			||||||
      void SaveSettingsData();
 | 
					 | 
				
			||||||
      void LoadSettingsFromFlash();
 | 
					 | 
				
			||||||
      void SaveSettingsToFlash();
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										1
									
								
								src/libs/littlefs
									
									
									
									
									
										Submodule
									
								
							
							
								
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								src/libs/littlefs
									
									
									
									
									
										Submodule
									
								
							@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					Subproject commit ead50807f1ca3fdf2da00b77a0ce02651ded2d13
 | 
				
			||||||
@ -204,7 +204,7 @@ e.g. "stm32f769xx.h" or "stm32f429xx.h" */
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* 1: Enable file system (might be required for images */
 | 
					/* 1: Enable file system (might be required for images */
 | 
				
			||||||
// TODO: Enable FS
 | 
					// TODO: Enable FS
 | 
				
			||||||
#define LV_USE_FILESYSTEM       0
 | 
					#define LV_USE_FILESYSTEM       1
 | 
				
			||||||
#if LV_USE_FILESYSTEM
 | 
					#if LV_USE_FILESYSTEM
 | 
				
			||||||
/*Declare the type of the user data of file system drivers (can be e.g. `void *`, `int`, `struct`)*/
 | 
					/*Declare the type of the user data of file system drivers (can be e.g. `void *`, `int`, `struct`)*/
 | 
				
			||||||
typedef void * lv_fs_drv_user_data_t;
 | 
					typedef void * lv_fs_drv_user_data_t;
 | 
				
			||||||
@ -236,7 +236,7 @@ typedef void * lv_fs_drv_user_data_t;
 | 
				
			|||||||
 * With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images.
 | 
					 * With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images.
 | 
				
			||||||
 * However the opened images might consume additional RAM.
 | 
					 * However the opened images might consume additional RAM.
 | 
				
			||||||
 * LV_IMG_CACHE_DEF_SIZE must be >= 1 */
 | 
					 * LV_IMG_CACHE_DEF_SIZE must be >= 1 */
 | 
				
			||||||
#define LV_IMG_CACHE_DEF_SIZE       1
 | 
					#define LV_IMG_CACHE_DEF_SIZE       6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*Declare the type of the user data of image decoder (can be e.g. `void *`, `int`, `struct`)*/
 | 
					/*Declare the type of the user data of image decoder (can be e.g. `void *`, `int`, `struct`)*/
 | 
				
			||||||
typedef void* lv_img_decoder_user_data_t;
 | 
					typedef void* lv_img_decoder_user_data_t;
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										13
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								src/main.cpp
									
									
									
									
									
								
							@ -35,6 +35,7 @@
 | 
				
			|||||||
#include "components/motor/MotorController.h"
 | 
					#include "components/motor/MotorController.h"
 | 
				
			||||||
#include "components/datetime/DateTimeController.h"
 | 
					#include "components/datetime/DateTimeController.h"
 | 
				
			||||||
#include "components/heartrate/HeartRateController.h"
 | 
					#include "components/heartrate/HeartRateController.h"
 | 
				
			||||||
 | 
					#include "components/fs/FS.h"
 | 
				
			||||||
#include "drivers/Spi.h"
 | 
					#include "drivers/Spi.h"
 | 
				
			||||||
#include "drivers/SpiMaster.h"
 | 
					#include "drivers/SpiMaster.h"
 | 
				
			||||||
#include "drivers/SpiNorFlash.h"
 | 
					#include "drivers/SpiNorFlash.h"
 | 
				
			||||||
@ -108,10 +109,6 @@ void ble_manager_set_ble_disconnection_callback(void (*disconnection)());
 | 
				
			|||||||
static constexpr uint8_t pinTouchIrq = 28;
 | 
					static constexpr uint8_t pinTouchIrq = 28;
 | 
				
			||||||
static constexpr uint8_t pinPowerPresentIrq = 19;
 | 
					static constexpr uint8_t pinPowerPresentIrq = 19;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Pinetime::Controllers::Settings settingsController {spiNorFlash};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Pinetime::Controllers::MotorController motorController {settingsController};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Pinetime::Controllers::HeartRateController heartRateController;
 | 
					Pinetime::Controllers::HeartRateController heartRateController;
 | 
				
			||||||
Pinetime::Applications::HeartRateTask heartRateApp(heartRateSensor, heartRateController);
 | 
					Pinetime::Applications::HeartRateTask heartRateApp(heartRateSensor, heartRateController);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -122,6 +119,11 @@ Pinetime::Controllers::NotificationManager notificationManager;
 | 
				
			|||||||
Pinetime::Controllers::MotionController motionController;
 | 
					Pinetime::Controllers::MotionController motionController;
 | 
				
			||||||
Pinetime::Controllers::TimerController timerController;
 | 
					Pinetime::Controllers::TimerController timerController;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Pinetime::Controllers::FS fs {spiNorFlash};
 | 
				
			||||||
 | 
					Pinetime::Controllers::Settings settingsController {fs};
 | 
				
			||||||
 | 
					Pinetime::Controllers::MotorController motorController {settingsController};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Pinetime::Applications::DisplayApp displayApp(lcd,
 | 
					Pinetime::Applications::DisplayApp displayApp(lcd,
 | 
				
			||||||
                                              lvgl,
 | 
					                                              lvgl,
 | 
				
			||||||
                                              touchPanel,
 | 
					                                              touchPanel,
 | 
				
			||||||
@ -155,7 +157,8 @@ Pinetime::System::SystemTask systemTask(spi,
 | 
				
			|||||||
                                        settingsController,
 | 
					                                        settingsController,
 | 
				
			||||||
                                        heartRateController,
 | 
					                                        heartRateController,
 | 
				
			||||||
                                        displayApp,
 | 
					                                        displayApp,
 | 
				
			||||||
                                        heartRateApp);
 | 
					                                        heartRateApp,
 | 
				
			||||||
 | 
					                                        fs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void nrfx_gpiote_evt_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) {
 | 
					void nrfx_gpiote_evt_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) {
 | 
				
			||||||
  if (pin == pinTouchIrq) {
 | 
					  if (pin == pinTouchIrq) {
 | 
				
			||||||
 | 
				
			|||||||
@ -59,7 +59,8 @@ SystemTask::SystemTask(Drivers::SpiMaster& spi,
 | 
				
			|||||||
                       Controllers::Settings& settingsController,
 | 
					                       Controllers::Settings& settingsController,
 | 
				
			||||||
                       Pinetime::Controllers::HeartRateController& heartRateController,
 | 
					                       Pinetime::Controllers::HeartRateController& heartRateController,
 | 
				
			||||||
                       Pinetime::Applications::DisplayApp& displayApp,
 | 
					                       Pinetime::Applications::DisplayApp& displayApp,
 | 
				
			||||||
                       Pinetime::Applications::HeartRateTask& heartRateApp)
 | 
					                       Pinetime::Applications::HeartRateTask& heartRateApp,
 | 
				
			||||||
 | 
					                       Pinetime::Controllers::FS& fs)
 | 
				
			||||||
  : spi {spi},
 | 
					  : spi {spi},
 | 
				
			||||||
    lcd {lcd},
 | 
					    lcd {lcd},
 | 
				
			||||||
    spiNorFlash {spiNorFlash},
 | 
					    spiNorFlash {spiNorFlash},
 | 
				
			||||||
@ -77,10 +78,11 @@ SystemTask::SystemTask(Drivers::SpiMaster& spi,
 | 
				
			|||||||
    motionSensor {motionSensor},
 | 
					    motionSensor {motionSensor},
 | 
				
			||||||
    settingsController {settingsController},
 | 
					    settingsController {settingsController},
 | 
				
			||||||
    heartRateController{heartRateController},
 | 
					    heartRateController{heartRateController},
 | 
				
			||||||
    nimbleController(*this, bleController, dateTimeController, notificationManager, batteryController, spiNorFlash, heartRateController),
 | 
					 | 
				
			||||||
    motionController{motionController},
 | 
					    motionController{motionController},
 | 
				
			||||||
    displayApp{displayApp},
 | 
					    displayApp{displayApp},
 | 
				
			||||||
    heartRateApp(heartRateApp) {
 | 
					    heartRateApp(heartRateApp),
 | 
				
			||||||
 | 
					    fs{fs},
 | 
				
			||||||
 | 
					    nimbleController(*this, bleController, dateTimeController, notificationManager, batteryController, spiNorFlash, heartRateController) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -107,6 +109,9 @@ void SystemTask::Work() {
 | 
				
			|||||||
  spi.Init();
 | 
					  spi.Init();
 | 
				
			||||||
  spiNorFlash.Init();
 | 
					  spiNorFlash.Init();
 | 
				
			||||||
  spiNorFlash.Wakeup();
 | 
					  spiNorFlash.Wakeup();
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  fs.Init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  nimbleController.Init();
 | 
					  nimbleController.Init();
 | 
				
			||||||
  nimbleController.StartAdvertising();
 | 
					  nimbleController.StartAdvertising();
 | 
				
			||||||
  brightnessController.Init();
 | 
					  brightnessController.Init();
 | 
				
			||||||
 | 
				
			|||||||
@ -16,6 +16,8 @@
 | 
				
			|||||||
#include "components/ble/NotificationManager.h"
 | 
					#include "components/ble/NotificationManager.h"
 | 
				
			||||||
#include "components/motor/MotorController.h"
 | 
					#include "components/motor/MotorController.h"
 | 
				
			||||||
#include "components/timer/TimerController.h"
 | 
					#include "components/timer/TimerController.h"
 | 
				
			||||||
 | 
					#include "components/fs/FS.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef PINETIME_IS_RECOVERY
 | 
					#ifdef PINETIME_IS_RECOVERY
 | 
				
			||||||
  #include "displayapp/DisplayAppRecovery.h"
 | 
					  #include "displayapp/DisplayAppRecovery.h"
 | 
				
			||||||
  #include "displayapp/DummyLittleVgl.h"
 | 
					  #include "displayapp/DummyLittleVgl.h"
 | 
				
			||||||
@ -59,7 +61,8 @@ namespace Pinetime {
 | 
				
			|||||||
                 Controllers::Settings& settingsController,
 | 
					                 Controllers::Settings& settingsController,
 | 
				
			||||||
                 Pinetime::Controllers::HeartRateController& heartRateController,
 | 
					                 Pinetime::Controllers::HeartRateController& heartRateController,
 | 
				
			||||||
                 Pinetime::Applications::DisplayApp& displayApp,
 | 
					                 Pinetime::Applications::DisplayApp& displayApp,
 | 
				
			||||||
                 Pinetime::Applications::HeartRateTask& heartRateApp);
 | 
					                 Pinetime::Applications::HeartRateTask& heartRateApp,
 | 
				
			||||||
 | 
					                 Pinetime::Controllers::FS& fs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      void Start();
 | 
					      void Start();
 | 
				
			||||||
      void PushMessage(Messages msg);
 | 
					      void PushMessage(Messages msg);
 | 
				
			||||||
@ -103,13 +106,14 @@ namespace Pinetime {
 | 
				
			|||||||
      Pinetime::Drivers::Bma421& motionSensor;
 | 
					      Pinetime::Drivers::Bma421& motionSensor;
 | 
				
			||||||
      Pinetime::Controllers::Settings& settingsController;
 | 
					      Pinetime::Controllers::Settings& settingsController;
 | 
				
			||||||
      Pinetime::Controllers::HeartRateController& heartRateController;
 | 
					      Pinetime::Controllers::HeartRateController& heartRateController;
 | 
				
			||||||
      Pinetime::Controllers::NimbleController nimbleController;
 | 
					            
 | 
				
			||||||
      Controllers::BrightnessController brightnessController;
 | 
					      Controllers::BrightnessController brightnessController;
 | 
				
			||||||
      Pinetime::Controllers::MotionController& motionController;
 | 
					      Pinetime::Controllers::MotionController& motionController;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      Pinetime::Applications::DisplayApp& displayApp;
 | 
					      Pinetime::Applications::DisplayApp& displayApp;
 | 
				
			||||||
      Pinetime::Applications::HeartRateTask& heartRateApp;
 | 
					      Pinetime::Applications::HeartRateTask& heartRateApp;
 | 
				
			||||||
 | 
					      Pinetime::Controllers::FS& fs;
 | 
				
			||||||
 | 
					      Pinetime::Controllers::NimbleController nimbleController;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      static constexpr uint8_t pinSpiSck = 2;
 | 
					      static constexpr uint8_t pinSpiSck = 2;
 | 
				
			||||||
      static constexpr uint8_t pinSpiMosi = 3;
 | 
					      static constexpr uint8_t pinSpiMosi = 3;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user