blob: a854a16eb9090171a854e6784fa9987f27fe17e2 [file]
#include "32blit.hpp"
#include "CDCCommandHandler.h"
#include "fatfs.h"
#include "persistence.h"
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 240
#define BUFFER_SIZE (256)
#define MAX_FILENAMES 24
#define MAX_FILENAME_LENGTH 32
#define MAX_FILESIZE_LENGTH 12
#define ROW_HEIGHT 10
#define ROW(x) Point(0,x * ROW_HEIGHT)
#define MAX_FILENAME 256+1
#define MAX_FILELEN 16+1
#define PAGE_SIZE 256
typedef struct {
char sFilename[MAX_FILENAME_LENGTH + 1] = { 0 };
FSIZE_t fstFilesize = 0;
char sFilesize[MAX_FILESIZE_LENGTH + 1] = { 0 };
} FILEMETA;
class FlashLoader : public CDCCommandHandler
{
public:
virtual StreamResult StreamData(CDCDataStream &dataStream);
virtual bool StreamInit(CDCFourCC uCommand);
void Init(void);
void Render(uint32_t time);
void Update(uint32_t time);
private:
enum State {stFlashFile, stSaveFile, stFlashCDC, stLS, stSwitch, stMassStorage};
enum ParseState {stFilename, stLength, stData};
bool Flash(const char *pszFilename);
void FSInit(void);
void RenderSaveFile(uint32_t time);
void RenderFlashCDC(uint32_t time);
void RenderFlashFile(uint32_t time);
void RenderMassStorage(uint32_t time);
bool FlashData(uint32_t uOffset, uint8_t *pBuffer, uint32_t uLen);
bool SaveData(uint8_t *pBuffer, uint32_t uLen);
FILEMETA m_filemeta[MAX_FILENAMES] = { 0 };
int32_t m_max_width_name = 0, m_max_width_size = 0;
uint8_t m_buffer[PAGE_SIZE];
uint8_t m_verifyBuffer[PAGE_SIZE];
uint8_t m_uFileCount = 0;
uint8_t m_uCurrentFile = 0;
bool m_bFsInit = false;
State m_state = stFlashFile;
ParseState m_parseState = stFilename;
char m_sFilename[MAX_FILENAME];
char m_sFilelen[MAX_FILELEN];
uint32_t m_uParseIndex = 0;
uint32_t m_uFilelen = 0;
FIL m_file;
float m_fPercent;
};