#include <stdint.h>
#include <termios.h>

#ifndef FALSE
#define FALSE 		0
#endif

#ifndef TRUE
#define TRUE 		1
#endif


/* ------------------------------------- */
/* ------------ VFD SETTINGS ----------- */

// Tecorp HC1C+ : адрес преобразователя по умолчанию
#define DEFAULT_SLAVE		1 // используется только при вызове hc1c_vfd без параметров

// Tecorp HC1C+ : коды функций чтения и записи
#define	FUNCTION_READ		0x03
#define	FUNCTION_WRITE		0x06

// PT200 : параметры для мониторинга
#define STATUS_Set_Freq		0x0001 // P00.01 - Заданная частота
#define STATUS_Output_Freq	0x0000 // P00.00 - Выходная частота
#define STATUS_Output_Current	0x0004 // P00.04 - Выходной ток
#define STATUS_Rotating_Speed	0x0005 // P00.05 - Скорость вращения
#define STATUS_DC_Bus_Voltage	0x0002 // P00.02 - Напряжение в линии
#define STATUS_Temperature	0x0009 // P00.16 - Температура

// PT200 : управляющие регистры для RS485
#define COMMAND_WORD		0x1000
#define STATUS_WORD		0x1001
#define FREQ_RANGE		0x2000 // always 100% (10000)
#define FREQ_LIMIT		0x2004 // set freq

// PT200 : command word functions
#define CONTROL_Run_Fwd		0x0001
#define CONTROL_Run_Rev		0x0002
#define CONTROL_Stop		0x0005

// Tecorp HC1C+ : максимальная и минимальная частота
#define MAX_FREQ_LIMIT		400	// Максимальная частота (24000 об/мин)
#define MIN_FREQ_LIMIT		50	// Минимальная частота (3000 об/мин)

// Tecorp HC1C+ : допустимая разница между заданной и текущей скоростью вращения
// Используется для формирования spindle-at-speed
#define MAX_DIFF		0.01	// 0.01 = 1%, 0.5 = 50%, 1.0 = 100%


/* ------------------------------------- */
/* ---------- MODBUS SETTINGS ---------- */

// Эти константы используются только при вызове hc1c_vfd без параметров
#define DEFAULT_DEVICE			"/dev/ttyUSB0"
#define DEFAULT_BAUD			9600
#define DEFAULT_BITS			8
#define DEFAULT_PARITY			"none"
#define DEFAULT_STOPBITS		1
#define DEFAULT_DEBUG			FALSE

// Количество непрерывных успешных транзакций
// для уверенности в наличии связи по Modbus
#define MODBUS_MIN_OK			10
[quote="BentScrew"]Надо заставить работать spindle-at-spped[/quote]
#define MAX_DATA_LENGTH			246
#define MAX_QUERY_LENGTH		55
#define MAX_RESPONSE_LENGTH		1024
#define MIN_QUERY_SIZE			8
#define MAX_PACKET_SIZE			21

// Time out between frames in microsecond
#define TIME_OUT_BEGIN_OF_FRAME		500000
#define TIME_OUT_END_OF_FRAME		500000

#define PORT_FAILURE 			-11
#define PATH_MAX			64

/* Local */
#define COMM_TIME_OUT			-0x0C
#define PORT_SOCKET_FAILURE		-0x0D
#define SELECT_FAILURE			-0x0E
#define TOO_MANY_DATAS			-0x0F
#define INVALID_CRC			-0x10
#define INVALID_EXCEPTION_CODE		-0x11

#define COMMS_FAILURE			0
#define ILLEGAL_FUNCTION		-1
#define ILLEGAL_PARAMETER		-2
#define ILLEGAL_DATA_VALUE		-3
#define SLAVE_DEVICE_FAILURE		-4
#define ACKNOWLEDGE			-5
#define SLAVE_DEVICE_BUSY		-6
#define NEGATIVE_ACKNOWLEDGE		-7
#define MEMORY_PARITY_ERROR		-8

/* Initializes the modbus_param_t structure for RTU.
   - device: "/dev/ttyUSB0"
   - baud:   9600, 19200, 57600, 115200, etc
   - parity: "even", "odd" or "none"
   - data_bits: 5, 6, 7, 8
   - stop_bits: 1, 2
*/

typedef struct _modbus_param_t {
	char device[PATH_MAX];		/* Device: "/dev/ttyUSB0" */
	int print_errors;		/* Whether or not to print errors: 0=no print, 1=print */
	int baud;			/* Bauds: 9600 */
	char parity[5];			/* Parity: "even", "odd", "none" */
	int data_bit;			/* Data bit */
	int stop_bit;			/* Stop bit */
	struct termios old_tios;	/* Save old termios settings */
	int fd;				/* Descriptor (tty or socket) */
	int debug;			/* Flag debug */
} modbus_param_t;

typedef struct _modbus_data_t {
	unsigned char slave;		/* slave address */
	unsigned char function;		/* function code */
	unsigned int parameter;		/* parameter */
	int data;			/* data to send */
	unsigned char ret_length;	/* length of data returned from slave */
	unsigned int ret_parameter;	/* parameter returned from slave */
	unsigned int ret_multi_data[8];	/* multi data returned from slave */
	int ret_data;			/* data returned from slave */
} modbus_data_t;
