77 lines
1.7 KiB
C++
77 lines
1.7 KiB
C++
#ifndef CARD_H
|
|
#define CARD_H
|
|
|
|
#include "flash.h"
|
|
|
|
#include <pico/stdlib.h>
|
|
|
|
class CardSlot
|
|
{
|
|
private:
|
|
static constexpr size_t FLASH_SIZE_MB = 2;
|
|
|
|
public:
|
|
CardSlot(lib::Flash& flash, uint16_t card_index);
|
|
|
|
void set_name(const uint8_t* name, uint8_t length);
|
|
void set_cmc(uint8_t cmc);
|
|
void set_colors(uint8_t colors);
|
|
|
|
void mark_unused(lib::Flash& flash);
|
|
void save_data(lib::Flash& flash);
|
|
void erase(lib::Flash& flash);
|
|
|
|
uint16_t get_image_start_page_index() const;
|
|
|
|
bool is_used() const;
|
|
uint32_t times_erased() const;
|
|
uint8_t get_colors() const;
|
|
uint8_t get_cmc() const;
|
|
const uint8_t* get_name() const;
|
|
uint8_t get_name_length() const;
|
|
|
|
bool operator<=(const CardSlot&) const;
|
|
bool operator>=(const CardSlot&) const;
|
|
|
|
void each_pixel(lib::Flash& flash, void (*fn)(void*, uint8_t),
|
|
void* userdata);
|
|
|
|
static int32_t get_unused(lib::Flash& flash);
|
|
|
|
private:
|
|
static constexpr size_t IMAGE_LENGTH = 320 * 240 * 3;
|
|
|
|
static constexpr size_t NAME_BITS = 5;
|
|
static constexpr size_t MAX_NAME_LENGTH = 1 << NAME_BITS;
|
|
|
|
struct
|
|
{
|
|
bool in_use;
|
|
uint8_t cmc;
|
|
uint8_t colors;
|
|
uint8_t name_length : NAME_BITS;
|
|
uint32_t times_erased;
|
|
} status;
|
|
uint8_t name[MAX_NAME_LENGTH];
|
|
|
|
uint16_t card_index;
|
|
|
|
void load_data(lib::Flash& flash);
|
|
|
|
public:
|
|
static constexpr size_t IMAGE_PAGE_COUNT
|
|
= IMAGE_LENGTH / lib::Flash::Page::SIZE;
|
|
|
|
// round up to nearest multiple of 16 since
|
|
// that's how many pages there are per sector
|
|
static constexpr size_t TOTAL_PAGE_COUNT
|
|
= 16 * ((IMAGE_PAGE_COUNT + 16) / 16);
|
|
|
|
// based on flash size
|
|
static constexpr uint16_t MAX_CARDS
|
|
= FLASH_SIZE_MB * 1024 * 1024
|
|
/ (lib::Flash::Page::SIZE * TOTAL_PAGE_COUNT);
|
|
};
|
|
|
|
#endif // CARD_H
|