mirror of
https://github.com/suchmememanyskill/TegraExplorer.git
synced 2024-11-09 13:41:45 +00:00
Add errors
and prepare for file menu more and fix that you can't go left right when going up down
This commit is contained in:
parent
b97bab3661
commit
1a931b0256
16 changed files with 167 additions and 30 deletions
53
source/err.c
Normal file
53
source/err.c
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
#include "err.h"
|
||||||
|
#include "gfx/gfx.h"
|
||||||
|
#include "hid/hid.h"
|
||||||
|
#include "gfx/gfxutils.h"
|
||||||
|
|
||||||
|
const char *fatfsErrors[] = {
|
||||||
|
"I/O ERROR",
|
||||||
|
"NO DISK",
|
||||||
|
"NOT READY",
|
||||||
|
"NO FILE",
|
||||||
|
"NO PATH",
|
||||||
|
"PATH INVALID",
|
||||||
|
"ACCESS DENIED",
|
||||||
|
"ACCESS DENIED",
|
||||||
|
"INVALID PTR",
|
||||||
|
"PROTECTED",
|
||||||
|
"INVALID DRIVE",
|
||||||
|
"NO MEM",
|
||||||
|
"NO FAT",
|
||||||
|
"MKFS ABORT"
|
||||||
|
};
|
||||||
|
|
||||||
|
const char *TEErrors[] = {
|
||||||
|
"Unimplemented"
|
||||||
|
};
|
||||||
|
|
||||||
|
const char *GetErrStr(u32 err){
|
||||||
|
--err; // obv error codes cannot be 0
|
||||||
|
if (err >= 0 && err < ARRAY_SIZE(fatfsErrors))
|
||||||
|
return fatfsErrors[err];
|
||||||
|
|
||||||
|
if (err >= 20 && err < ARRAY_SIZE(TEErrors) + 20)
|
||||||
|
return TEErrors[err - 20];
|
||||||
|
|
||||||
|
return "(Unknown)";
|
||||||
|
}
|
||||||
|
|
||||||
|
#define lx 256
|
||||||
|
#define ly 240
|
||||||
|
#define lenx 768
|
||||||
|
#define leny 240
|
||||||
|
|
||||||
|
void DrawError(ErrCode_t err){
|
||||||
|
SETCOLOR(COLOR_ORANGE, COLOR_DARKGREY);
|
||||||
|
gfx_box(lx, ly, lx + lenx, ly + leny, COLOR_ORANGE);
|
||||||
|
gfx_boxGrey(lx + 16, ly + 16, lx + lenx - 16, ly + leny - 16, 0x33);
|
||||||
|
gfx_con_setpos(lx + ((lenx - 17 * 16) / 2), ly + 32);
|
||||||
|
gfx_printf("An error occured!\n\n%bErr : %d\nLine: %d\nFile: %s\nDesc: %s%b", lx + 48, err.err, err.loc, err.file, GetErrStr(err.err), 0);
|
||||||
|
gfx_con_setpos(lx + ((lenx - 19 * 16) / 2), ly + leny - 48);
|
||||||
|
gfx_printf("Press A to continue");
|
||||||
|
|
||||||
|
hidWaitMask((JoyA | JoyB));
|
||||||
|
}
|
15
source/err.h
Normal file
15
source/err.h
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#pragma once
|
||||||
|
#include <utils/types.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
u16 err;
|
||||||
|
u16 loc;
|
||||||
|
char* file;
|
||||||
|
} ErrCode_t;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
TE_ERR_UNIMPLEMENTED = 21,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define newErrCode(err) (ErrCode_t) {err, __LINE__, __FILE__}
|
||||||
|
void DrawError(ErrCode_t err);
|
25
source/fs/fstypes.h
Normal file
25
source/fs/fstypes.h
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
#pragma once
|
||||||
|
#include <utils/types.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char *name;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
u8 readOnly:1;
|
||||||
|
u8 hidden:1;
|
||||||
|
u8 system:1;
|
||||||
|
u8 volume:1;
|
||||||
|
u8 isDir:1;
|
||||||
|
u8 archive:1;
|
||||||
|
};
|
||||||
|
u8 optionUnion;
|
||||||
|
};
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
u16 size:12;
|
||||||
|
u16 showSize:1;
|
||||||
|
u16 sizeDef:3;
|
||||||
|
};
|
||||||
|
u16 sizeUnion;
|
||||||
|
};
|
||||||
|
} FSEntry_t;
|
|
@ -4,6 +4,7 @@
|
||||||
#include "../utils/utils.h"
|
#include "../utils/utils.h"
|
||||||
#include <utils/sprintf.h>
|
#include <utils/sprintf.h>
|
||||||
#include <libs/fatfs/ff.h>
|
#include <libs/fatfs/ff.h>
|
||||||
|
#include "readers/folderReader.h"
|
||||||
|
|
||||||
char *CombinePaths(const char *current, const char *add){
|
char *CombinePaths(const char *current, const char *add){
|
||||||
char *ret;
|
char *ret;
|
||||||
|
@ -36,3 +37,9 @@ u64 GetFileSize(char *path){
|
||||||
f_stat(path, &fno);
|
f_stat(path, &fno);
|
||||||
return fno.fsize;
|
return fno.fsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *GetFileAttribs(FSEntry_t entry){
|
||||||
|
char *ret = CpyStr("RHSVDA");
|
||||||
|
MaskIn(ret, entry.optionUnion, '-');
|
||||||
|
return ret;
|
||||||
|
}
|
|
@ -1,6 +1,8 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <utils/types.h>
|
#include <utils/types.h>
|
||||||
|
#include "fstypes.h"
|
||||||
|
|
||||||
u64 GetFileSize(char *path);
|
u64 GetFileSize(char *path);
|
||||||
char *EscapeFolder(char *current);
|
char *EscapeFolder(char *current);
|
||||||
char *CombinePaths(const char *current, const char *add);
|
char *CombinePaths(const char *current, const char *add);
|
||||||
|
char *GetFileAttribs(FSEntry_t entry);
|
|
@ -6,6 +6,7 @@
|
||||||
#include "../../gfx/gfx.h"
|
#include "../../gfx/gfx.h"
|
||||||
#include "../../gfx/gfxutils.h"
|
#include "../../gfx/gfxutils.h"
|
||||||
#include "../../utils/utils.h"
|
#include "../../utils/utils.h"
|
||||||
|
#include "filemenu.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <mem/heap.h>
|
#include <mem/heap.h>
|
||||||
|
|
||||||
|
@ -55,6 +56,10 @@ void FileExplorer(char *path){
|
||||||
|
|
||||||
gfx_con_setpos(144, 16);
|
gfx_con_setpos(144, 16);
|
||||||
gfx_boxGrey(0, 16, 160, 31, 0x1B);
|
gfx_boxGrey(0, 16, 160, 31, 0x1B);
|
||||||
|
|
||||||
|
if (res >= fileVec.count + ARR_LEN(topEntries))
|
||||||
|
res = 0;
|
||||||
|
|
||||||
res = newMenu(&entries, res, 60, 42, ENABLEB | ENABLEPAGECOUNT, (int)fileVec.count);
|
res = newMenu(&entries, res, 60, 42, ENABLEB | ENABLEPAGECOUNT, (int)fileVec.count);
|
||||||
|
|
||||||
if (res < ARR_LEN(topEntries)) {
|
if (res < ARR_LEN(topEntries)) {
|
||||||
|
@ -66,14 +71,19 @@ void FileExplorer(char *path){
|
||||||
char *copy = CpyStr(storedPath);
|
char *copy = CpyStr(storedPath);
|
||||||
storedPath = EscapeFolder(copy);
|
storedPath = EscapeFolder(copy);
|
||||||
free(copy);
|
free(copy);
|
||||||
|
res = 0;
|
||||||
}
|
}
|
||||||
else if (fsEntries[res - ARR_LEN(topEntries)].isDir) {
|
else if (fsEntries[res - ARR_LEN(topEntries)].isDir) {
|
||||||
char *copy = CpyStr(storedPath);
|
char *copy = CpyStr(storedPath);
|
||||||
storedPath = CombinePaths(copy, fsEntries[res - ARR_LEN(topEntries)].name);
|
storedPath = CombinePaths(copy, fsEntries[res - ARR_LEN(topEntries)].name);
|
||||||
free(copy);
|
free(copy);
|
||||||
|
res = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
FileMenu(fsEntries[res - ARR_LEN(topEntries)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
res = 0;
|
|
||||||
clearFileVector(&fileVec);
|
clearFileVector(&fileVec);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
#include "filemenu.h"
|
||||||
|
#include "../../err.h"
|
||||||
|
#include "../../gfx/menu.h"
|
||||||
|
|
||||||
|
MenuEntry_t FileMenuEntries[] = {
|
||||||
|
// Still have to think up the options
|
||||||
|
};
|
||||||
|
|
||||||
|
void FileMenu(FSEntry_t entry){
|
||||||
|
DrawError(newErrCode(TE_ERR_UNIMPLEMENTED));
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
#pragma once
|
||||||
|
#include "../fstypes.h"
|
||||||
|
|
||||||
|
void FileMenu(FSEntry_t entry);
|
|
@ -14,7 +14,8 @@ Vector_t /* of type FSEntry_t */ ReadFolder(char *path){
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!f_readdir(&dir, &fno) && fno.fname[0]) {
|
while (!f_readdir(&dir, &fno) && fno.fname[0]) {
|
||||||
FSEntry_t newEntry = {.isDir = (fno.fattrib & AM_DIR) ? 1 : 0, .name = CpyStr(fno.fname)};
|
FSEntry_t newEntry = {.optionUnion = fno.fattrib, .name = CpyStr(fno.fname)};
|
||||||
|
|
||||||
if (!newEntry.isDir){
|
if (!newEntry.isDir){
|
||||||
u64 total = fno.fsize;
|
u64 total = fno.fsize;
|
||||||
u8 type = 0;
|
u8 type = 0;
|
||||||
|
@ -33,5 +34,7 @@ Vector_t /* of type FSEntry_t */ ReadFolder(char *path){
|
||||||
vecAddElem(&out, newEntry);
|
vecAddElem(&out, newEntry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
f_closedir(&dir);
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,23 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <utils/types.h>
|
#include <utils/types.h>
|
||||||
#include "../../utils/vector.h"
|
#include "../../utils/vector.h"
|
||||||
|
#include "../fstypes.h"
|
||||||
typedef struct {
|
|
||||||
char *name;
|
|
||||||
union {
|
|
||||||
struct {
|
|
||||||
u8 isDir:1;
|
|
||||||
};
|
|
||||||
u8 optionUnion;
|
|
||||||
};
|
|
||||||
union {
|
|
||||||
struct {
|
|
||||||
u16 size:12;
|
|
||||||
u16 showSize:1;
|
|
||||||
u16 sizeDef:3;
|
|
||||||
};
|
|
||||||
u16 sizeUnion;
|
|
||||||
};
|
|
||||||
} FSEntry_t;
|
|
||||||
|
|
||||||
Vector_t /* of type FSEntry_t */ ReadFolder(char *path);
|
Vector_t /* of type FSEntry_t */ ReadFolder(char *path);
|
|
@ -123,6 +123,8 @@ static const u8 _gfx_font[] = {
|
||||||
0x00, 0x0E, 0x12, 0x22, 0x22, 0x22, 0x3E, 0x00, // Char 128 (file)
|
0x00, 0x0E, 0x12, 0x22, 0x22, 0x22, 0x3E, 0x00, // Char 128 (file)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
u32 YLeftConfig = YLEFT;
|
||||||
|
|
||||||
void gfx_clear_grey(u8 color)
|
void gfx_clear_grey(u8 color)
|
||||||
{
|
{
|
||||||
memset(gfx_ctxt.fb, color, gfx_ctxt.width * gfx_ctxt.height * 4);
|
memset(gfx_ctxt.fb, color, gfx_ctxt.width * gfx_ctxt.height * 4);
|
||||||
|
@ -240,13 +242,13 @@ void gfx_putc(char c)
|
||||||
|
|
||||||
gfx_con.y -= 16;
|
gfx_con.y -= 16;
|
||||||
if (gfx_con.y < 16){
|
if (gfx_con.y < 16){
|
||||||
gfx_con.y = YLEFT;
|
gfx_con.y = YLeftConfig;
|
||||||
gfx_con.x += 16;
|
gfx_con.x += 16;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (c == '\n')
|
else if (c == '\n')
|
||||||
{
|
{
|
||||||
gfx_con.y = YLEFT;
|
gfx_con.y = YLeftConfig;
|
||||||
gfx_con.x += 16;
|
gfx_con.x += 16;
|
||||||
if (gfx_con.x > gfx_ctxt.width - 16)
|
if (gfx_con.x > gfx_ctxt.width - 16)
|
||||||
gfx_con.x = 0;
|
gfx_con.x = 0;
|
||||||
|
@ -256,7 +258,7 @@ void gfx_putc(char c)
|
||||||
else if (c == '\a')
|
else if (c == '\a')
|
||||||
gfx_con.y = 639;
|
gfx_con.y = 639;
|
||||||
else if (c == '\r')
|
else if (c == '\r')
|
||||||
gfx_con.y = YLEFT;
|
gfx_con.y = YLeftConfig;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
|
@ -282,14 +284,14 @@ void gfx_putc(char c)
|
||||||
|
|
||||||
gfx_con.y -= 8;
|
gfx_con.y -= 8;
|
||||||
if (gfx_con.y < 8){
|
if (gfx_con.y < 8){
|
||||||
gfx_con.y = YLEFT;
|
gfx_con.y = YLeftConfig;
|
||||||
gfx_con.x += 8;
|
gfx_con.x += 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (c == '\n')
|
else if (c == '\n')
|
||||||
{
|
{
|
||||||
gfx_con.y = YLEFT;
|
gfx_con.y = YLeftConfig;
|
||||||
gfx_con.x += 8;
|
gfx_con.x += 8;
|
||||||
if (gfx_con.x > gfx_ctxt.width - 8)
|
if (gfx_con.x > gfx_ctxt.width - 8)
|
||||||
gfx_con.x = 0;
|
gfx_con.x = 0;
|
||||||
|
@ -299,7 +301,7 @@ void gfx_putc(char c)
|
||||||
else if (c == '\a')
|
else if (c == '\a')
|
||||||
gfx_con.y = 639;
|
gfx_con.y = 639;
|
||||||
else if (c == '\r')
|
else if (c == '\r')
|
||||||
gfx_con.y = YLEFT;
|
gfx_con.y = YLeftConfig;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -449,6 +451,11 @@ void gfx_vprintf(const char *fmt, va_list ap)
|
||||||
gfx_con.bgcol = va_arg(ap, u32);
|
gfx_con.bgcol = va_arg(ap, u32);
|
||||||
gfx_con.fillbg = 1;
|
gfx_con.fillbg = 1;
|
||||||
break;
|
break;
|
||||||
|
case 'b':;
|
||||||
|
u32 b = YLEFT - va_arg(ap, u32);
|
||||||
|
gfx_con.y = b;
|
||||||
|
YLeftConfig = gfx_con.y;
|
||||||
|
break;
|
||||||
case '%':
|
case '%':
|
||||||
gfx_putc('%');
|
gfx_putc('%');
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#define COLOR_WHITE 0xFFFFFFFF
|
#define COLOR_WHITE 0xFFFFFFFF
|
||||||
#define COLOR_DEFAULT 0xFF1B1B1B
|
#define COLOR_DEFAULT 0xFF1B1B1B
|
||||||
#define COLOR_GREY 0xFF888888
|
#define COLOR_GREY 0xFF888888
|
||||||
|
#define COLOR_DARKGREY 0xFF333333
|
||||||
|
|
||||||
#define COLORTORGB(color) (color & 0x00FFFFFF)
|
#define COLORTORGB(color) (color & 0x00FFFFFF)
|
||||||
#define SETCOLOR(fg, bg) gfx_con_setcol(fg, 1, bg)
|
#define SETCOLOR(fg, bg) gfx_con_setcol(fg, 1, bg)
|
||||||
|
|
|
@ -129,7 +129,7 @@ int newMenu(Vector_t* vec, int startIndex, int screenLenX, int screenLenY, u8 op
|
||||||
else if (input->b && options & ENABLEB)
|
else if (input->b && options & ENABLEB)
|
||||||
return 0;
|
return 0;
|
||||||
else if (input->down || input->rDown || input->right){ //Rdown should probs not trigger a page change. Same for RUp
|
else if (input->down || input->rDown || input->right){ //Rdown should probs not trigger a page change. Same for RUp
|
||||||
u32 temp = (input->right) ? screenLenY : 1;
|
u32 temp = (input->right && !(input->down || input->rDown)) ? screenLenY : 1;
|
||||||
|
|
||||||
if (vec->count > selected + temp){
|
if (vec->count > selected + temp){
|
||||||
selected += temp;
|
selected += temp;
|
||||||
|
@ -141,7 +141,7 @@ int newMenu(Vector_t* vec, int startIndex, int screenLenX, int screenLenY, u8 op
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (input->up || input->rUp || input->left){
|
else if (input->up || input->rUp || input->left){
|
||||||
u32 temp = (input->left) ? screenLenY : 1;
|
u32 temp = (input->left && !(input->up || input->rUp)) ? screenLenY : 1;
|
||||||
if (selected >= temp){
|
if (selected >= temp){
|
||||||
selected -= temp;
|
selected -= temp;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -47,6 +47,7 @@
|
||||||
#include "gfx/gfxutils.h"
|
#include "gfx/gfxutils.h"
|
||||||
#include "tegraexplorer/mainmenu.h"
|
#include "tegraexplorer/mainmenu.h"
|
||||||
#include "tegraexplorer/tconf.h"
|
#include "tegraexplorer/tconf.h"
|
||||||
|
#include "err.h"
|
||||||
|
|
||||||
|
|
||||||
hekate_config h_cfg;
|
hekate_config h_cfg;
|
||||||
|
@ -209,6 +210,7 @@ void ipl_main()
|
||||||
//u32 res = newMenu(&a, 0, 40, 5, testAdd, NULL);
|
//u32 res = newMenu(&a, 0, 40, 5, testAdd, NULL);
|
||||||
|
|
||||||
//gfx_clearscreen();
|
//gfx_clearscreen();
|
||||||
|
//DrawError(newErrCode(1));
|
||||||
|
|
||||||
EnterMainMenu();
|
EnterMainMenu();
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <utils/types.h>
|
||||||
#include <mem/heap.h>
|
#include <mem/heap.h>
|
||||||
|
|
||||||
char *CpyStr(const char* in){
|
char *CpyStr(const char* in){
|
||||||
|
@ -9,3 +10,14 @@ char *CpyStr(const char* in){
|
||||||
memcpy(out, in, len);
|
memcpy(out, in, len);
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MaskIn(char *mod, u32 bitstream, char mask){
|
||||||
|
u32 len = strlen(mod);
|
||||||
|
for (int i = 0; i < len; i++){
|
||||||
|
if (bitstream & 1)
|
||||||
|
*mod = mask;
|
||||||
|
|
||||||
|
bitstream >>= 1;
|
||||||
|
mod++;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,5 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include <utils/types.h>
|
||||||
|
|
||||||
char *CpyStr(const char* in);
|
char *CpyStr(const char* in);
|
||||||
|
void MaskIn(char *mod, u32 bitstream, char mask);
|
Loading…
Reference in a new issue