
#ifndef AS5048A_H
#define AS5048A_H

#include <atmel_start.h>


struct io_descriptor *io;

#define AS5048A_MISO GPIO(GPIO_PORTB, 29)
#define AS5048A_MOSI GPIO(GPIO_PORTB, 27)
#define AS5048A_SCK GPIO(GPIO_PORTB, 26)
#define AS5048A_CS GPIO(GPIO_PORTB, 28)

#define AS5048A_CMD_NOP						  0x0000
#define AS5048A_READ						  0x4000
#define AS5048A_CLEAR_ERROR_FLAG			  0x0001
#define AS5048A_PROGRAMMING_CONTROL           0x0003
#define AS5048A_OTP_REGISTER_ZERO_POS_HIGH    0x0016
#define AS5048A_OTP_REGISTER_ZERO_POS_LOW     0x0017
#define AS5048A_DIAG_AGC                      0x3FFD
#define AS5048A_MAGNITUDE                     0x3FFE
#define AS5048A_ANGLE                         0x3FFF

bool AS5048A_init(void);
uint8_t spiCalcEvenParity(uint16_t value);
uint16_t read(uint16_t registerAddress);
uint16_t getRawRotation();
uint8_t getGain();
uint16_t getErrors();
void setZeroPosition(uint16_t arg_position);
uint16_t getZeroPosition();
float normalize(float angle);
float read2angle(uint16_t angle);
uint16_t getState();

struct AS5048A {
	uint8_t errorFlag;
	uint16_t position;
} as5048a;


#endif