#include "buffered_peripheral.h"
typedef enum {
MATRIX_SLOT0 = 0,
MATRIX_SLOT1 = 1,
MATRIX_SLOT_OTHER = 2,
} matrix_slot_t;
typedef enum {
MATRIX_OFF,
MATRIX_STABLE,
MATRIX_ANIMATING,
} matrix_state_t;
typedef enum {
MATRIX_REG_NO_OP = 0,
MATRIX_REG_DIGIT0 = 1,
MATRIX_REG_DIGIT1 = 2,
MATRIX_REG_DIGIT2 = 3,
MATRIX_REG_DIGIT3 = 4,
MATRIX_REG_DIGIT4 = 5,
MATRIX_REG_DIGIT5 = 6,
MATRIX_REG_DIGIT6 = 7,
MATRIX_REG_DIGIT7 = 8,
MATRIX_REG_DECODE_MODE = 9,
MATRIX_REG_INTENSITY = 10,
MATRIX_REG_SCAN_LIMIT = 11,
MATRIX_REG_SHUTDOWN = 12,
MATRIX_REG_DISPLAY_TEST = 13,
} matrix_register_t;
typedef struct {
buffered_transceiver_t* transceiver;
uint32_t shift_period;
matrix_slot_t slot;
matrix_state_t state;
uint8_t* buffers[2];
uint32_t state_cycle;
uint32_t cycle;
} matrix_t;
void matrix_init(matrix_t* matrix, buffered_transceiver_t* transceiver, uint32_t shift_period);
void matrix_setup(matrix_t* matrix);
void matrix_enable(matrix_t* matrix, bool enable);
void matrix_send(matrix_t* matrix, matrix_register_t reg, uint8_t value);
void matrix_set_buffer(matrix_t* matrix, matrix_slot_t slot, uint8_t* buffer);
void matrix_swap(matrix_t* matrix);
void matrix_animate_swap(matrix_t* matrix);
void matrix_update(matrix_t* matrix, buffered_transceiver_t* transceiver);