#ifndef CONFIG_H
#define CONFIG_H

#include <Arduino.h>
#include <stdint.h>

////////////////////////////////////////////////////////////////////////////////
//
// Platform

// #define PLATFORM_PORTENTA_H7_M7
// #define BOARD_NAME "Portenta H7 M7"
#define PLATFORM_CONTROLLINO_MEGA

#ifdef PLATFORM_PORTENTA_H7_M7
#include <Arduino_MachineControl.h>
using namespace machinecontrol;
#endif

#ifdef PLATFORM_CONTROLLINO_MEGA
#include <Controllino.h>
#endif

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// App Features

#define HAS_EXTRUDER_FEED
#define MODBUS_BRIDGE

// App Debugging (see more in)

// Print the Modbus registers on startup
#define PRINT_MODBUS_REGISTERS 1

// When printing Modbus registers (via serial), print register descriptions
#define HAS_MODBUS_REGISTER_DESCRIPTIONS 1

///////////////////////////////////////////////////////
//
// Status Feedback Settings

#define HAS_STATUS
#define STATUS_WARNING_PIN CONTROLLINO_R12
#define STATUS_ERROR_PIN CONTROLLINO_R13
#define STATUS_BLINK_INTERVAL 800

///////////////////////////////////////////////////////
//
// Serial Port Settings
/** @brief Serial port baud rate */
#define SERIAL_BAUD_RATE 19200
/** @brief Parse commands every 100ms */
#define SERIAL_COMMAND_PARSE_INTERVAL 100

///////////////////////////////////////////////////////
//
// Features - Modbus

#ifdef MODBUS_BRIDGE
static uint8_t mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x03};
static uint8_t ip[] = {192, 168, 1, 177};
static uint8_t gateway[] = {192, 168, 1, 1};
static uint8_t subnet[] = {255, 255, 255, 0};
#endif

/////////////////////////////////////////////////////////////
//
// Motor load settings, this requires a current sensor or can be
// taken from the VFD's output.

// Motor overload pin, if defined, this will be used to detect jamming
// On an OmronM2X :
//  - set the output via C21 (for output pin 11) to 03 for
//  - set C28 = 01 (Output Current) (../vendor/omron/mx2/I570-E2-02B.pdf Page - 252)
// 'Overload' (which is set in C41 )
//
// See wiring details ../vendor/omron/mx2/I570-E2-02B.pdf Page - 52

#define MOTOR_LOAD_PIN CONTROLLINO_A4

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Modbus - Commons

#define MODBUS_RS485_BAUDRATE 19200
#define MODBUS_RS485_PORT SERIAL_8N1
#define MODBUS_RS485_TIMEOUT 2000

#define MODBUS_SAME_REQUEST_INTERVAL 1000
#define MODBUS_QUEUE_MIN_FREE 2

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//  Omron Pids - E5.x series - Modbus interface

#define NB_OMRON_PIDS 2
#define OMRON_PID_SLAVE_START 4
#define OMRON_PID_UPDATE_INTERVAL 55
#define OMRON_PID_WRITE_INTERVAL 150
#define OMRON_PID_MAX_TEMPERATURE 280
#define OMRON_PID_READ_STATUS_REGISTERS 7

////////////////////////////////////////////////////////////////
//
// Modbus settings - Omron - MX2

#define OMRON_MX2_SLAVE_ID 1
#define OMRON_MX2_STATE_INTERVAL 60
#define OMRON_MX2_MB_INTERVAL 60
#define OMRON_MX2_DEBUG_INTERVAL 100
#define OMRON_MX2_LOOP_INTERVAL 60
#define OMRON_MX2_SAME_REQUEST_INTERVAL 400

#define OMRON_VFD_MAX_FREQ 100
#define VFD_RETRACT_REVERSE_DURATION 1000

////////////////////////////////////////////////////////////////
//
// Auxiliary Settings : Relays

#ifdef PLATFORM_PORTENTA_H7_M7
#define MB_RELAY_0 0
#define MB_RELAY_1 1
#define MB_RELAY_2 2
#define MB_RELAY_3 3
#define MB_RELAY_4 4
#define MB_RELAY_5 5
#define MB_RELAY_6 6
#define MB_RELAY_7 7
#endif

#ifdef PLATFORM_CONTROLLINO_MEGA
#define MB_RELAY_0 CONTROLLINO_R10
#define MB_RELAY_1 CONTROLLINO_R11
#define MB_RELAY_2 CONTROLLINO_R02
#define MB_RELAY_3 CONTROLLINO_R03
#define MB_RELAY_4 CONTROLLINO_R04
#define MB_RELAY_5 CONTROLLINO_R05
#define MB_RELAY_6 CONTROLLINO_R06
#define MB_RELAY_7 CONTROLLINO_R07
#endif

#define MB_RELAY_0_DEFAULT 1
#define MB_RELAY_1_DEFAULT 0
////////////////////////////////////////////////////////////////
//
// Auxiliary Settings : Analog Inputs

#ifdef PLATFORM_PORTENTA_H7_M7
#define MB_ANALOG_0 0
#define MB_ANALOG_1 1
#define MB_ANALOG_2 2
#endif

#ifdef PLATFORM_CONTROLLINO_MEGA
#define MB_ANALOG_0 CONTROLLINO_A0
#define MB_ANALOG_1 CONTROLLINO_A1
// #define MB_ANALOG_2 CONTROLLINO_A2
#endif

////////////////////////////////////////////////////////////////
//
// Auxiliary Settings : Analog Switch Inputs (3 Position Switches)
//
#ifdef PLATFORM_PORTENTA_H7_M7
#define MB_ANALOG_3POS_SWITCH_0 0
#define MB_ANALOG_3POS_SWITCH_1 1
#define MB_ANALOG_3POS_SWITCH_2 2
#define MB_ANALOG_3POS_SWITCH_3 3
#endif

#ifdef PLATFORM_CONTROLLINO_MEGA
#define MB_ANALOG_3POS_SWITCH_0 CONTROLLINO_A10
#define MB_ANALOG_3POS_SWITCH_1 CONTROLLINO_A11
#define MB_ANALOG_3POS_SWITCH_2 CONTROLLINO_A12
#define MB_ANALOG_3POS_SWITCH_3 CONTROLLINO_A13
#endif

////////////////////////////////////////////////////////////////
//
// Auxiliary Settings : Stepper / PWM - 2 Wire
//
#ifdef PLATFORM_PORTENTA_H7_M7
#define MB_ANALOG_3POS_SWITCH_0 0
#define MB_ANALOG_3POS_SWITCH_1 1
#define MB_ANALOG_3POS_SWITCH_2 2
#define MB_ANALOG_3POS_SWITCH_3 3
#endif

#ifdef PLATFORM_CONTROLLINO_MEGA
#define MB_STEPPER_DIR_0 CONTROLLINO_D18
#define MB_STEPPER_PULSE_0 CONTROLLINO_D17
#define MB_STEPPER_OVERLOAD_0 CONTROLLINO_A5
#define MB_STEPPER_ENABLED_0 CONTROLLINO_D15
#define MB_STEPPER_FEEDBACK_0 CONTROLLINO_D16

// see ./config_adv.h for more settings
#endif

// Turn on Extruder-Feed (using stepper_0)
#define HAS_FEED_SERVO

// Extruder Feed Coupling to VFD Speed
//  Range : 0 - 100 (Percentage, Modbus has no floats ...)
#define MB_RW_FEED_VFD_DEFAULT_SPEED_RATIO 90

////////////////////////////////////////////////////////////////

#include "config_adv.h"
#include "debug_config.h"
#include "config_validation.h"

#endif // CONFIG_H
