#ifndef RVL_SDK_WPAD_MEMORY_H
#define RVL_SDK_WPAD_MEMORY_H

#include "common.h"
#include "rvl/OS/OSTime.h"
#include "rvl/WPAD/WPAD.h"


/*******************************************************************************
 * macros
 */

#define WM_MEM_ADDR(addr_) ((addr_) & 0xffff)
#define WM_EXT_REG_ADDR(type_, addr_) (((addr_) & 0xffff) | ((WPAD_EXT_REG_##type_) << 16) | (1 << 26))

/*******************************************************************************
 * types
 */

#ifdef __cplusplus
extern "C" {
#endif

typedef u8 WPADExtRegType;
enum WPADExtRegType_et {
    WPAD_EXT_REG_SPEAKER = 0xa2,
    WPAD_EXT_REG_EXTENSION = 0xa4,
    WPAD_EXT_REG_MOTION_PLUS = 0xa6,
    WPAD_EXT_REG_DPD = 0xb0,
};

// https://wiibrew.org/wiki/Wiimote#EEPROM_Memory
typedef struct WPADGameInfo {
    OSTime timestamp; // size 0x08, offset 0x00
    u16 gameName[17]; // size 0x22, offset 0x08
    char gameID[4];   // size 0x04, offset 0x2a
    u8 gameType;      // size 0x01, offset 0x2e
    u8 checksum;      // size 0x01, offset 0x2f

    /* wiibrew says this exists in the header on the Wiimote but goes unused,
     * which matches up with the code I see here
     */
    byte_t unknown[8];
} WPADGameInfo; // size 0x38

/*******************************************************************************
 * functions
 */

WPADResult
WPADWriteExtReg(WPADChannel chan, const void *data, u16 length, WPADExtRegType extReg, u16 address, WPADCallback *cb);

#ifdef __cplusplus
}
#endif

#endif // RVL_SDK_WPAD_MEMORY_H
