mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-26 05:54:46 -07:00
feat: Chess v1.8
This commit is contained in:
153
applications/external/chess/helpers/flipchess_file.c
vendored
Normal file
153
applications/external/chess/helpers/flipchess_file.c
vendored
Normal file
@@ -0,0 +1,153 @@
|
||||
#include "flipchess_file.h"
|
||||
#include <storage/storage.h>
|
||||
#include <loader/loader.h>
|
||||
|
||||
// #define FLIPCHESS_APP_BASE_FOLDER APP_BOARDA_PATH("flipchess")
|
||||
#define FLIPCHESS_APP_BASE_FOLDER EXT_PATH("apps_data/flipchess")
|
||||
#define FLIPCHESS_APP_BASE_FOLDER_PATH(path) FLIPCHESS_APP_BASE_FOLDER "/" path
|
||||
#define FLIPCHESS_BOARD_FILE_NAME "board_fen.txt"
|
||||
#define FLIPCHESS_BOARD_FILE_NAME_BAK "board_fen.bak"
|
||||
#define FLIPCHESS_BOARD_PATH FLIPCHESS_APP_BASE_FOLDER_PATH(FLIPCHESS_BOARD_FILE_NAME)
|
||||
#define FLIPCHESS_BOARD_PATH_BAK FLIPCHESS_APP_BASE_FOLDER_PATH(FLIPCHESS_BOARD_FILE_NAME_BAK)
|
||||
|
||||
#define FILE_MAX_PATH_LEN 48
|
||||
#define FILE_MAX_CHARS 94
|
||||
|
||||
bool flipchess_has_file(const FlipChessFile file_type, const char* file_name, const bool remove) {
|
||||
bool ret = false;
|
||||
const char* path;
|
||||
if(file_type == FlipChessFileBoard) {
|
||||
path = FLIPCHESS_BOARD_PATH;
|
||||
} else {
|
||||
char path_buf[FILE_MAX_PATH_LEN] = {0};
|
||||
strcpy(path_buf, FLIPCHESS_APP_BASE_FOLDER); // 22
|
||||
strcpy(path_buf + strlen(path_buf), "/");
|
||||
strcpy(path_buf + strlen(path_buf), file_name);
|
||||
path = path_buf;
|
||||
}
|
||||
|
||||
Storage* fs_api = furi_record_open(RECORD_STORAGE);
|
||||
if(remove) {
|
||||
ret = storage_simply_remove(fs_api, path);
|
||||
} else {
|
||||
ret = storage_file_exists(fs_api, path);
|
||||
}
|
||||
furi_record_close(RECORD_STORAGE);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool flipchess_load_file(char* contents, const FlipChessFile file_type, const char* file_name) {
|
||||
bool ret = false;
|
||||
const char* path;
|
||||
if(file_type == FlipChessFileBoard) {
|
||||
path = FLIPCHESS_BOARD_PATH;
|
||||
} else {
|
||||
char path_buf[FILE_MAX_PATH_LEN] = {0};
|
||||
strcpy(path_buf, FLIPCHESS_APP_BASE_FOLDER); // 22
|
||||
strcpy(path_buf + strlen(path_buf), "/");
|
||||
strcpy(path_buf + strlen(path_buf), file_name);
|
||||
path = path_buf;
|
||||
}
|
||||
|
||||
Storage* fs_api = furi_record_open(RECORD_STORAGE);
|
||||
|
||||
File* settings_file = storage_file_alloc(fs_api);
|
||||
if(storage_file_open(settings_file, path, FSAM_READ, FSOM_OPEN_EXISTING)) {
|
||||
char chr;
|
||||
int i = 0;
|
||||
while((storage_file_read(settings_file, &chr, 1) == 1) &&
|
||||
!storage_file_eof(settings_file)) {
|
||||
if(i < FILE_MAX_CHARS) {
|
||||
contents[i] = chr;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
ret = true;
|
||||
} else {
|
||||
contents[0] = '\0';
|
||||
ret = false;
|
||||
}
|
||||
storage_file_close(settings_file);
|
||||
storage_file_free(settings_file);
|
||||
furi_record_close(RECORD_STORAGE);
|
||||
|
||||
if(strlen(contents) > 0) {
|
||||
Storage* fs_api = furi_record_open(RECORD_STORAGE);
|
||||
FileInfo layout_file_info;
|
||||
FS_Error file_check_err = storage_common_stat(fs_api, path, &layout_file_info);
|
||||
furi_record_close(RECORD_STORAGE);
|
||||
if(file_check_err != FSE_OK) {
|
||||
contents[0] = '\0';
|
||||
ret = false;
|
||||
}
|
||||
// if(layout_file_info.size != 256) {
|
||||
// memzero(settings, strlen(settings));
|
||||
// settings[0] = '\0';
|
||||
// }
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool flipchess_save_file(
|
||||
const char* settings,
|
||||
const FlipChessFile file_type,
|
||||
const char* file_name,
|
||||
const bool append,
|
||||
const bool overwrite) {
|
||||
bool ret = false;
|
||||
const char* path;
|
||||
const char* path_bak;
|
||||
if(file_type == FlipChessFileBoard) {
|
||||
path = FLIPCHESS_BOARD_PATH;
|
||||
path_bak = FLIPCHESS_BOARD_PATH_BAK;
|
||||
} else {
|
||||
char path_buf[FILE_MAX_PATH_LEN] = {0};
|
||||
strcpy(path_buf, FLIPCHESS_APP_BASE_FOLDER); // 22
|
||||
strcpy(path_buf + strlen(path_buf), "/");
|
||||
strcpy(path_buf + strlen(path_buf), file_name);
|
||||
path = path_buf;
|
||||
path_bak = NULL;
|
||||
}
|
||||
int open_mode = FSOM_OPEN_ALWAYS;
|
||||
if(append) {
|
||||
open_mode = FSOM_OPEN_APPEND;
|
||||
}
|
||||
|
||||
Storage* fs_api = furi_record_open(RECORD_STORAGE);
|
||||
|
||||
// try to create the folder
|
||||
storage_simply_mkdir(fs_api, FLIPCHESS_APP_BASE_FOLDER);
|
||||
|
||||
if(overwrite) {
|
||||
storage_simply_remove(fs_api, path);
|
||||
}
|
||||
|
||||
File* settings_file = storage_file_alloc(fs_api);
|
||||
if(storage_file_open(settings_file, path, FSAM_WRITE, open_mode)) {
|
||||
storage_file_write(settings_file, settings, strlen(settings));
|
||||
storage_file_write(settings_file, "\n", 1);
|
||||
ret = true;
|
||||
}
|
||||
storage_file_close(settings_file);
|
||||
storage_file_free(settings_file);
|
||||
|
||||
if(path_bak != NULL) {
|
||||
if(overwrite) {
|
||||
storage_simply_remove(fs_api, path_bak);
|
||||
}
|
||||
|
||||
File* settings_file_bak = storage_file_alloc(fs_api);
|
||||
if(storage_file_open(settings_file_bak, path_bak, FSAM_WRITE, open_mode)) {
|
||||
storage_file_write(settings_file_bak, settings, strlen(settings));
|
||||
storage_file_write(settings_file_bak, "\n", 1);
|
||||
}
|
||||
storage_file_close(settings_file_bak);
|
||||
storage_file_free(settings_file_bak);
|
||||
}
|
||||
|
||||
furi_record_close(RECORD_STORAGE);
|
||||
|
||||
return ret;
|
||||
}
|
||||
Reference in New Issue
Block a user