/*
 * register_map.h
 *
 * Created: 5/6/2018 2:23:53 PM
 *  Author: Penguin
 */ 

#include <asf.h>
#ifndef _REGISTER_MAP_H_
#define _REGISTER_MAP_H_

//takes care of dynamic addresses
void register_map_init(void);

//--MPU9250--
#ifndef MPU_REGISTER_MAP
#define MPU_REGISTER_MAP

#define MPU_ADDR_HIGH			0x69
#define MPU_ADDR_LOW			0x68

//Mag slave address
#define AK8963_ADDRESS			0x0C
#define AK8963_WHO_AM_I			0x00 // should return 0x48
#define AK8963_INFO				0x01
#define AK8963_ST1				0x02  // data ready status bit 0
#define AK8963_XOUT_L			0x03  // data
#define AK8963_XOUT_H			0x04
#define AK8963_YOUT_L			0x05
#define AK8963_YOUT_H			0x06
#define AK8963_ZOUT_L			0x07
#define AK8963_ZOUT_H			0x08
#define AK8963_ST2				0x09  // Data overflow bit 3 and data read error status bit 2
#define AK8963_CNTL				0x0A  // Power down (0000), single-measurement (0001), self-test (1000) and Fuse ROM (1111) modes on bits 3:0
#define AK8963_RSV				0x0B  //
#define AK8963_ASTC				0x0C  // Self test control
#define AK8963_I2CDIS			0x0F  // I2C disable
#define AK8963_ASAX				0x10  // Fuse ROM x-axis sensitivity adjustment value
#define AK8963_ASAY				0x11  // Fuse ROM y-axis sensitivity adjustment value
#define AK8963_ASAZ				0x12  // Fuse ROM z-axis sensitivity adjustment value

#define SELF_TEST_X_GYRO		0x00
#define SELF_TEST_Y_GYRO		0x01
#define SELF_TEST_Z_GYRO		0x02

#define SELF_TEST_X_ACCEL		0x0D
#define SELF_TEST_Y_ACCEL		0x0E
#define SELF_TEST_Z_ACCEL		0x0F

#define SELF_TEST_A				0x10

#define XG_OFFSET_H				0x13  // User-defined trim values for gyroscope
#define XG_OFFSET_L				0x14
#define YG_OFFSET_H				0x15
#define YG_OFFSET_L				0x16
#define ZG_OFFSET_H				0x17
#define ZG_OFFSET_L				0x18
#define SMPLRT_DIV				0x19
#define MPU_CONFIG				0x1A
#define GYRO_CONFIG				0x1B
#define ACCEL_CONFIG			0x1C
#define ACCEL_CONFIG2			0x1D
#define LP_ACCEL_ODR			0x1E
#define WOM_THR					0x1F

#define MOT_DUR					0x20  // Duration counter threshold for motion interrupt generation, 1 kHz rate, LSB = 1 ms
#define ZMOT_THR				0x21  // Zero-motion detection threshold bits [7:0]
#define ZRMOT_DUR				0x22  // Duration counter threshold for zero motion interrupt generation, 16 Hz rate, LSB = 64 ms

#define FIFO_EN					0x23
#define I2C_MST_CTRL			0x24
#define I2C_SLV0_ADDR			0x25
#define I2C_SLV0_REG			0x26
#define I2C_SLV0_CTRL			0x27
#define I2C_SLV1_ADDR			0x28
#define I2C_SLV1_REG			0x29
#define I2C_SLV1_CTRL			0x2A
#define I2C_SLV2_ADDR			0x2B
#define I2C_SLV2_REG			0x2C
#define I2C_SLV2_CTRL			0x2D
#define I2C_SLV3_ADDR			0x2E
#define I2C_SLV3_REG			0x2F
#define I2C_SLV3_CTRL			0x30
#define I2C_SLV4_ADDR			0x31
#define I2C_SLV4_REG			0x32
#define I2C_SLV4_DO				0x33
#define I2C_SLV4_CTRL			0x34
#define I2C_SLV4_DI				0x35
#define I2C_MST_STATUS			0x36
#define INT_PIN_CFG				0x37
#define INT_ENABLE				0x38
#define DMP_INT_STATUS			0x39  // Check DMP interrupt
#define INT_STATUS				0x3A
#define ACCEL_XOUT_H			0x3B
#define ACCEL_XOUT_L			0x3C
#define ACCEL_YOUT_H			0x3D
#define ACCEL_YOUT_L			0x3E
#define ACCEL_ZOUT_H			0x3F
#define ACCEL_ZOUT_L			0x40
#define TEMP_OUT_H				0x41
#define TEMP_OUT_L				0x42
#define GYRO_XOUT_H				0x43
#define GYRO_XOUT_L				0x44
#define GYRO_YOUT_H				0x45
#define GYRO_YOUT_L				0x46
#define GYRO_ZOUT_H				0x47
#define GYRO_ZOUT_L				0x48
#define EXT_SENS_DATA_00		0x49
#define EXT_SENS_DATA_01		0x4A
#define EXT_SENS_DATA_02		0x4B
#define EXT_SENS_DATA_03		0x4C
#define EXT_SENS_DATA_04		0x4D
#define EXT_SENS_DATA_05		0x4E
#define EXT_SENS_DATA_06		0x4F
#define EXT_SENS_DATA_07		0x50
#define EXT_SENS_DATA_08		0x51
#define EXT_SENS_DATA_09		0x52
#define EXT_SENS_DATA_10		0x53
#define EXT_SENS_DATA_11		0x54
#define EXT_SENS_DATA_12		0x55
#define EXT_SENS_DATA_13		0x56
#define EXT_SENS_DATA_14		0x57
#define EXT_SENS_DATA_15		0x58
#define EXT_SENS_DATA_16		0x59
#define EXT_SENS_DATA_17		0x5A
#define EXT_SENS_DATA_18		0x5B
#define EXT_SENS_DATA_19		0x5C
#define EXT_SENS_DATA_20		0x5D
#define EXT_SENS_DATA_21		0x5E
#define EXT_SENS_DATA_22		0x5F
#define EXT_SENS_DATA_23		0x60
#define MOT_DETECT_STATUS		0x61
#define I2C_SLV0_DO				0x63
#define I2C_SLV1_DO				0x64
#define I2C_SLV2_DO				0x65
#define I2C_SLV3_DO				0x66
#define I2C_MST_DELAY_CTRL		0x67
#define SIGNAL_PATH_RESET		0x68
#define MOT_DETECT_CTRL			0x69
#define USER_CTRL				0x6A  // Bit 7 enable DMP, bit 3 reset DMP
#define PWR_MGMT_1				0x6B // Device defaults to the SLEEP mode
#define PWR_MGMT_2				0x6C
#define DMP_BANK				0x6D  // Activates a specific bank in the DMP
#define DMP_RW_PNT				0x6E  // Set read/write pointer to a specific start address in specified DMP bank
#define DMP_REG					0x6F  // Register in DMP from which to read or to which to write
#define DMP_REG_1				0x70
#define DMP_REG_2				0x71
#define FIFO_COUNTH				0x72
#define FIFO_COUNTL				0x73
#define FIFO_R_W				0x74
#define WHO_AM_I_MPU9250		0x75 // Should return 0x71
#define XA_OFFSET_H				0x77
#define XA_OFFSET_L				0x78
#define YA_OFFSET_H				0x7A
#define YA_OFFSET_L				0x7B
#define ZA_OFFSET_H				0x7D
#define ZA_OFFSET_L				0x7E
#endif

//--MPL3115A2
#define MPL3_SLAVE_ADDR			0x60
//registers
#define MPL3_WHO_AM_I			0x0C
#define MPL3_PT_DATA_CFG		0x13
#define MPL3_INT_SOURCE			0x12
#define MPL3_SYS_MODE			0x11
#define MPL3_PRESSURE_OUT_MSB	0x01 //MSB-LSB is actually altitude in altimeter mode
#define MPL3_PRESSURE_OUT_CSB	0x02
#define MPL3_PRESSURE_OUT_LSB	0x03
#define MPL3_TEMP_OUT_MSB		0x04
#define MPL3_TEMP_OUT_LSB		0x05
#define MPL3_DATA_READY_STATUS	0x06
#define MPL3_STATUS				0x00

#define MPL3_CTRL1				0x26 //Sensor mode and power mode select
#define MPL3_CTRL2				0x27 //kinda useless for me
#define MPL3_CTRL3				0x28 //Int configuration register
#define MPL3_CTRL4				0x29 //Int enable register
#define MPL3_CTRL5				0x2A //Int configuration register 2 (Routing status registers to interrupt pins)


//MPL3 Commands
//Write to CTRL1 Register -- This writes to OST, which is a one shot read while in standby mode
#define MPL3_SINGLE_READ_PRESSURE 0x0A //pressure mode
#define MPL3_SINGLE_READ_ALTITUDE 0x8A //Altitude mode

//DS3231 Addresses
#define DS3231_ADDR			0x68
//see datasheet for formats, registers split bits
#define DS3231_SECONDS		0x00
#define DS3231_MINUTES		0x01
#define DS3231_HOURS		0x02
#define DS3231_DAYW			0x03 //Day of week
#define DS3231_DAYM			0x04 //Day of month
#define DS3231_MONTH		0x05 //Month/Century
#define DS3231_YEAR			0x06
#define DS3231_CTRL			0x0E
#define DS3231_CTRL_STATUS	0x0F
#define DS3231_AGING_OFFSET	0x10
#define DS3231_TEMP_MSB		0x11
#define DS3231_TEMP_LSB		0x12
//Alarm 1
#define DS3231_AL1_SEC		0x07 //Alarm 1 - Seconds
#define DS3231_AL1_MIN		0x08 //Alarm 1 - Minutes
#define DS3231_AL1_HRS		0x08 //Alarm 1 - Hours
#define DS3231_AL1_DAY		0x0A //Alarm 1 - Day of week + day of month
//Alarm 2
#define DS3231_AL2_MIN		0x0B //Alarm 2 - Minutes
#define DS3231_AL2_HRS		0x0C //Alarm 2 - Hours
#define DS3231_AL2_DAYW		0x0D //Alarm 2 - Day of week + day of month

//GPS
#ifndef GPS_COMMANDS
#define GPS_COMMANDS

//request only the data we need
#define PMTK_SET_NMEA_OUTPUT_RMCGGA "$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n"
#define PMTK_SET_NMEA_OUTPUT_RMCONLY "$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29\r\n"

#define PMTK_SET_NMEA_UPDATE_2HZ	"$PMTK220,500*2F\r\n"
#define PMTK_SET_NMEA_UPDATE_5HZ	"$PMTK220,200*2F\r\n"
#define PMTK_SET_NMEA_UPDATE_10HZ	"$PMTK220,100*2F\r\n"

#define PMTK_API_SET_FIX_CTL_1HZ	"$PMTK300,1000,0,0,0,0*2F\r\n"
#define PMTK_API_SET_FIX_CTL_10HZ	"$PMTK300,100,0,0,0,0*2F\r\n"
#define PMTK_API_SET_FIX_CTL_5HZ	"$PMTK300,200,0,0,0,0*2F\r\n"

#define PMTK_SET_BAUD_57600			"$PMTK251,57600*2C\r\n"
#define PMTK_SET_BAUD_115200		"$PMTK251,115200*2A\r\n"
#define PMTK_SET_BAUD_9600			"$PMTK251,9600*17\r\n"

#define PGCMD_NOANTENNA				"$PGCMD,33,0*6D\r\n" 
#endif

#endif