// AS5040 support routines

#ifndef _AS5040_H_
#define _AS5040_H_

// change to match your micro's connections to these pins on the Unicoder ME-110:
#define AS_CS   0x01
#define AS_CLK  0x02
#define AS_DO   0x04
#define AS_PROG 0x08
#define AS_SDA  0x10
#define AS_SCL  0x20
#define AS_CHA  0x40
#define AS_CHB  0x80

typedef struct _as5040 {
   int16 par : 1;
   int16 mag_dec : 1;
   int16 mag_inc : 1;
   int16 lin : 1;
   int16 cof : 1;
   int16 ocf : 1;
   int16 angle : 10;
} AS5040;


typedef struct _as5040_prog {
   int16 mode : 2;
   int16 div : 2;
   int16 index : 1;
   int16 z : 10;
   int16 ccw : 1;
} AS5040PROG;

#define AP_QUAD_512 0x0001 // 0000 0000 0000 0001
#define AP_QUAD_256 0x0005 // 0000 0000 0000 0101
#define AP_QUAD_128 0x0009 // 0000 0000 0000 1001
#define AP_QUAD_64  0x000D // 0000 0000 0000 1101
#define AP_SNMG_512 0x0002 // 0000 0000 0000 0010
#define AP_SNMG_256 0x0006 // 0000 0000 0000 0110
#define AP_SNMG_128 0x000A // 0000 0000 0000 1010
#define AP_SNMG_64  0x000E // 0000 0000 0000 1110

#define APM_MODE  0x0002
#define APR_MODE  0
#define APM_DIV   0x0002
#define APR_DIV   2
#define APM_INDEX 0x0001
#define APR_INDEX 4
#define APM_Z     0x03ff
#define APR_Z     5
#define APM_CCW   0x0001
#define APR_CCW   15

extern WORD factory;
extern bit good_checksum;
extern void delay(void);
extern void long_delay(void);
extern int16 get_orientation(void);
extern void set_prog_register(WORD value, bit read_fact);
extern void init_as5040(void);
extern void enter_alignment_mode(void);

extern void control_cs(bit set, bit long_time);
extern void control_clk(bit set, bit long_time);
extern void control_prog(bit set, bit long_time);

#endif

