
#ifndef __LABJACK_MESSAGES_H_INCLUDED__
#define __LABJACK_MESSAGES_H_INCLUDED__

#include <stdint.h>


const int	adc_resolution			= 12;

enum gains {
	unipolar_gain_of_1		= 0,
	unipolar_gain_of_2		= 1,
	unipolar_gain_of_4		= 2,
	unipolar_gain_of_8		= 3,
	bipolar_gain_of_1		= 8
};

enum internal_connections {
	voltage_reference		= 14,				// Approximately 2.43V
	ground					= 15,
	supply_voltage			= 132,
	temperature_sensor		= 133
};

typedef struct {
	uint8_t	checksum8;							// Offset  0
	uint8_t	command[3];							// Offset  1
	uint8_t	checksum16_lsb;						// Offset  4
	uint8_t	checksum16_msb;						// Offset  5
	uint8_t	fio_mask;							// Offset  6
	uint8_t	fio_direction;						// Offset  7
	uint8_t	fio_state;							// Offset  8
	uint8_t	eio_mask;							// Offset  9
	uint8_t	eio_direction;						// Offset 10
	uint8_t	eio_state;							// Offset 11
	uint8_t	cio_mask;							// Offset 12
	uint8_t	cio_direction		:	4;			// Offset 13
	uint8_t	cio_state			:	4;
	uint8_t	mio_mask;							// Offset 14
	uint8_t	mio_direction		:	4;			// Offset 15
	uint8_t	mio_state			:	4;
	uint8_t	dac_0_lsb;							// offset 16
	uint8_t	dac_0_msb			:	6;			// Offset 17
	uint8_t	dac_0_update		:	1;
	uint8_t	dac_0_enabled		:	1;
	uint8_t	dac_1_lsb;							// Offset 18
	uint8_t	dac_1_msb			:	6;			// Offset 19
	uint8_t	dac_1_update		:	1;
	uint8_t	dac_1_enabled		:	1;
	uint8_t	ain_mask_lsb;						// Offset 20
	uint8_t	ain_mask_msb;						// Offset 21
	uint8_t	ain_14_channel_number;				// Offset 22
	uint8_t	ain_15_channel_number;				// Offset 23
	uint8_t	ain_resolution;						// Offset 24
	uint8_t	ain_settling_time;					// Offset 25
	uint8_t	ain_0_bipolar_gain	:	4;			// Offset 26
	uint8_t	ain_1_bipolar_gain	:	4;
	uint8_t	ain_2_bipolar_gain	:	4;			// Offset 27
	uint8_t	ain_3_bipolar_gain	:	4;
	uint8_t	ain_4_bipolar_gain	:	4;			// Offset 28
	uint8_t	ain_5_bipolar_gain	:	4;
	uint8_t	ain_6_bipolar_gain	:	4;			// Offset 29
	uint8_t	ain_7_bipolar_gain	:	4;
	uint8_t	ain_8_bipolar_gain	:	4;			// Offset 30
	uint8_t	ain_9_bipolar_gain	:	4;
	uint8_t	ain_10_bipolar_gain	:	4;			// Offset 31
	uint8_t	ain_11_bipolar_gain	:	4;
	uint8_t	ain_12_bipolar_gain	:	4;			// Offset 32
	uint8_t	ain_13_bipolar_gain	:	4;
	uint8_t	ain_14_bipolar_gain	:	4;			// Offset 33
	uint8_t	ain_15_bipolar_gain	:	4;
} LabjackCommandRequest;

typedef struct {
	uint8_t	checksum8;							// Offset  0
	uint8_t	command[3];							// Offset  1
	uint8_t	checksum16_lsb;						// Offset  4
	uint8_t	checksum16_msb;						// Offset  5
	uint8_t	fio_direction;						// Offset  6
	uint8_t	fio_state;							// Offset  7
	uint8_t	eio_direction;						// Offset  8
	uint8_t	eio_state;							// Offset  9
	uint8_t	cio_direction		:	4;			// Offset 10
	uint8_t	cio_state			:	4;
	uint8_t	mio_direction		:	4;			// Offset 11
	uint8_t	mio_state			:	4;
	uint8_t	ain_0_lsb;							// Offset 12
	uint8_t	ain_0_msb;							// Offset 13
	uint8_t	ain_1_lsb;							// Offset 14
	uint8_t	ain_1_msb;							// Offset 15
	uint8_t	ain_2_lsb;							// Offset 16
	uint8_t	ain_2_msb;							// Offset 17
	uint8_t	ain_3_lsb;							// Offset 18
	uint8_t	ain_3_msb;							// Offset 19
	uint8_t	ain_4_lsb;							// Offset 20
	uint8_t	ain_4_msb;							// Offset 21
	uint8_t	ain_5_lsb;							// Offset 22
	uint8_t	ain_5_msb;							// Offset 23
	uint8_t	ain_6_lsb;							// Offset 24
	uint8_t	ain_6_msb;							// Offset 25
	uint8_t	ain_7_lsb;							// Offset 26
	uint8_t	ain_7_msb;							// Offset 27
	uint8_t	ain_8_lsb;							// Offset 28
	uint8_t	ain_8_msb;							// Offset 29
	uint8_t	ain_9_lsb;							// Offset 30
	uint8_t	ain_9_msb;							// Offset 31
	uint8_t	ain_10_lsb;							// Offset 32
	uint8_t	ain_10_msb;							// Offset 33
	uint8_t	ain_11_lsb;							// Offset 34
	uint8_t	ain_11_msb;							// Offset 35
	uint8_t	ain_12_lsb;							// Offset 36
	uint8_t	ain_12_msb;							// Offset 37
	uint8_t	ain_13_lsb;							// Offset 38
	uint8_t	ain_13_msb;							// Offset 39
	uint8_t	ain_14_lsb;							// Offset 40
	uint8_t	ain_14_msb;							// Offset 41
	uint8_t	ain_15_lsb;							// Offset 42
	uint8_t	ain_15_msb;							// Offset 43
	uint8_t	counter_0_lsb;						// Offset 44
	uint8_t	counter_0_nlsb;						// Offset 45
	uint8_t	counter_0_nmsb;						// Offset 46
	uint8_t	counter_0_msb;						// Offset 47
	uint8_t	counter_1_lsb;						// Offset 48
	uint8_t	counter_1_nlsb;						// Offset 49
	uint8_t	counter_1_nmsb;						// Offset 50
	uint8_t	counter_1_msb;						// Offset 51
	uint8_t	timer_a_lsb;						// Offset 52
	uint8_t	timer_a_nlsb;						// Offset 53
	uint8_t	timer_a_nmsb;						// Offset 54
	uint8_t	timer_a_msb;						// Offset 55
	uint8_t	timer_b_lsb;						// Offset 56
	uint8_t	timer_b_nlsb;						// Offset 57
	uint8_t	timer_b_nmsb;						// Offset 58
	uint8_t	timer_b_msb;						// Offset 59
	uint8_t	timer_c_lsb;						// Offset 60
	uint8_t	timer_c_nlsb;						// Offset 61
	uint8_t	timer_c_nmsb;						// Offset 62
	uint8_t	timer_c_msb;						// Offset 63
} LabjackCommandResponse;

typedef struct {
  uint8_t	prodID;
  double 	unipolarSlope[4];
  double 	unipolarOffset[4];
  double 	bipolarSlope;
  double	bipolarOffset;
  double	DACSlope[2];
  double	DACOffset[2];
  double	tempSlope;
  double	tempSlopeLow;
  double	calTemp;
  double	Vref;
  double 	VrefDiv2;
  double 	VsSlope;
  double 	hiResUnipolarSlope;
  double 	hiResUnipolarOffset;
  double 	hiResBipolarSlope;
  double 	hiResBipolarOffset;
} LabjackCalibrationInfo;

#endif /* LABJACK_LOW_LEVEL_MESSAGE_H_ */
