
#ifndef AQ_SERIAL_H_
#define AQ_SERIAL_H_

#include <termios.h>
#include <stdbool.h>

#include "aq_programmer.h" // Need this for function getJandyDeviceType due to enum defined their.
emulation_type getJandyDeviceType(unsigned char ID);
const char *getJandyDeviceName(emulation_type etype);

#define CONNECTION_ERROR "ERROR No connection to RS control panel"
#ifdef AQ_MANAGER
#define CONNECTION_RUNNING_SLOG "Running serial_logger, this will take some time"
#endif

//#define SERIAL_BLOCKING_TIME 50 // (1 to 255) in 1/10th second so 1 = 0.1 sec, 255 = 25.5 sec
//#define SERIAL_BLOCKING_TIME 10

// Protocol types
#define PCOL_JANDY     0xFF
#define PCOL_PENTAIR   0xFE
#define PCOL_UNKNOWN   0xFD


// packet offsets
#define PKT_DEST        2
#define PKT_CMD         3
#define PKT_DATA        4

#define PKT_STATUS_BYTES 5


#define DEV_MASTER      0x00
#define SWG_DEV_ID      0x50
#define IAQ_DEV_ID      0x33

/* Few Device ID's in decimal for quick checking
#  Pentair pump ID's
#  0x60 to 0x6F (0x60, 0x61 0x62, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F)
#  Jandy pump ID's
#  0x78, 0x79, 0x7A, 0x7B
*/
#define PENTAIR_DEC_PUMP_MIN   96   // 0x60
#define PENTAIR_DEC_PUMP_MAX  111   // 0x6F
#define JANDY_DEC_SWG_MIN      80   // 0x50
#define JANDY_DEC_SWG_MAX      83   // 0x53
#define JANDY_DEC_PUMP_MIN    120   // 0x78
#define JANDY_DEC_PUMP_MAX    123   // 0x7b
// Have also seen epump at 0xe0 with panel rev W that supports more pumps
#define JANDY_DEC_PUMP2_MIN    224   // 0xe0
#define JANDY_DEC_PUMP2_MAX    228   // 0xe3 // (should be 0xEF?????) Their are probably more, but this is a guess

#define JANDY_DEC_JXI_MIN     104   // 0x68
#define JANDY_DEC_JXI_MAX     107   // 0x6B
#define JANDY_DEC_LX_MIN       56   // 0x38
#define JANDY_DEC_LX_MAX       59   // 0x3B 
#define JANDY_DEC_CHEM_MIN    128   // 0x80
#define JANDY_DEC_CHEM_MAX    131   // 0x83

#define JANDY_DEV_IAQLN_MIN    0xa0   // 
#define JANDY_DEV_IAQLN_MAX    0xa3   // 0

#define JANDY_DEV_AQLNK_MIN    0x30   // 
#define JANDY_DEV_AQLNK_MAX    0x33   // 0

#define JANDY_DEV_HPUMP_MIN    0x70
#define JANDY_DEV_HPUMP_MAX    0x73

#define JANDY_DEV_JLIGHT_MIN    0xF0
#define JANDY_DEV_JLIGHT_MAX    0xF4 // 0xF4 is total guess.

//#define JANDY_DEC_CHEM_SENSOR1  0x84 // Not sure if this is a range or not.
//#define JANDY_DEC_CHEM_SENSOR2  0x86 // Not sure if this is a range or not.

/* Below is a guess.  We *think* 0x84 and 0x86 are one TruSense, so assuming 0x85 and 0x87 would be a 2nd */
// 0x83 is ChemLink and 0x88 is heater, so 84 to 86 are free
#define JANDY_DEV_CHEM_ANLZ_MIN    0x84
#define JANDY_DEV_CHEM_ANLZ_MAX    0x87

/*
//===== Device ID's =====//
//=========================================================================//
DEV_MASTER_MASK     =     0x00; // MASTER(S???0               00-03  0b0 0000 0XX //
DEV_CTL_MASK        =     0x08; // HOME CONTROLLER (RS-8?)    08-0b  0b0 0001 0XX //
//                        0x10; // XXXXX DEVICE               10-13  0b0 0010 0XX //
//                        0x18; // XXXXX DEVICE               18-1b  0b0 0011 0XX //
DEV_SPA_MASK        =     0x20; // SPA DEVICE                 20-23  0b0 0100 0XX //
DEV_RPC_MASK        =     0x28; // REMOTE POWER CENTER DEVICE 28-2b  0b0 0101 0XX //
DEV_AQUALINK_MASK   =     0x30; // AQUALINK DEVICE            30-33  0b0 0110 0XX //
DEV_LX_HTR_MASK     =     0x38; // LX HEATER                  38-3b  0b0 0111 0XX //
DEV_ONETOUCH_MASK   =     0x40; // XXXXX ONE TOUCH DEVICE     40-43  0b0 1000 0XX //
//                        0x48; // XXXXX DEVICE               48-4b  0b0 1001 0XX //
DEV_AQUARITE_MASK   =     0x50; // AQUARITE DEVICE            50-53  0b0 1010 0XX //
DEV_PCDOCK_MASK     =     0x58; // PCDOCK DEVICE              58-5b  0b0 1011 0XX //
DEV_PDA_JDA_MASK    =     0x60; // AQUAPALM DEVICE            60-63  0b0 1100 0XX //
DEV_LXI_LRZE_MASK   =     0x68; // LXi/LZRE DEVICE            68-6b  0b0 1101 0XX //
DEV_HEATPUMP_MASK   =     0x70; // HEAT PUMP DEVICE           70-73  0b0 1110 0XX //
JANDY_EPUMP_MASK    =     0x78; // EPUMP DEVICE               78-7b  0b0 1111 0XX //
DEV_CHEMLINK_MASK   =     0x80; // CHEMLINK DEVICE            80-83  0b1 0000 0XX //
Heater                    0x88; // XXXXX DEVICE               88-8b  0b1 0001 0XX //
//                        0x90; // XXXXX DEVICE               90-93  0b1 0010 0XX //
//                        0x98; // XXXXX DEVICE               98-9b  0b1 0011 0XX //
DEV_AQUALINK_2_MASK =     0xA0; // AQUALINK 2                 A0-A3  0b1 0100 0XX //
DEV_UNKNOWN_MASK    =     0xF8; // Unknown mask, used to reset values
*/

// PACKET DEFINES Jandy
#define NUL  0x00
#define DLE  0x10
#define STX  0x02
#define ETX  0x03

// Pentair packet headder (first 4 bytes)
#define PP1 0xFF
#define PP2 0x00
#define PP3 0xFF
#define PP4 0xA5

#define PEN_DEV_MASTER 0x10

#define PEN_CMD_SPEED     0x01
#define PEN_CMD_REMOTECTL 0x04
#define PEN_CMD_POWER     0x06
#define PEN_CMD_STATUS    0x07



#define PEN_PKT_FROM 6
#define PEN_PKT_DEST 5
#define PEN_PKT_CMD 7

// Pentair VSP
#define PEN_MODE        10
#define PEN_DRIVE_STATE 11
#define PEN_HI_B_WAT    12
#define PEN_LO_B_WAT    13
#define PEN_HI_B_RPM    14
#define PEN_LO_B_RPM    15
#define PEN_FLOW        16
#define PEN_PPC         17  // Pump pressure curve
#define PEN_HI_B_STATUS 20  // The current status value of the pump. following values: ok, filterWarning, overCurrent, priming, systemBlocked, generalAlarm, powerOutage, overCurrent2, overVoltage, commLost
#define PEN_LO_B_STATUS 21
// END Pentair

#define AQ_MINPKTLEN    5
//#define AQ_MAXPKTLEN   64
//#define AQ_MAXPKTLEN   128  // Max 79 bytes so far, so 128 is a guess at the moment, just seen large packets from iAqualink
//#define AQ_MAXPKTLEN   256  // Still getting this at 128, so temp increase to 256 and print message over 128 in aq_serial.c
#define AQ_MAXPKTLEN   512  // Still getting this at 128, so temp increase to 256 and print message over 128 in aq_serial.c
#define AQ_MAXPKTLEN_SEND 32 // Out biggest send buffer
#define AQ_PSTLEN       5
#define AQ_MSGLEN      16
#define AQ_MSGLONGLEN 128
#define AQ_TADLEN      13

// For printing warning & debug messages for packets. 
// The below are related to AQ_MAXPKTLEN
#define AQ_MAXPKTLEN_WARNING   128 // Print warning message if over this
//#define AQ_PACKET_PRINT_BUFFER 1400 // Must be at least AQ_MAXPKTLEN * 5 + 100

/* COMMANDS */
#define CMD_PROBE       0x00
#define CMD_ACK         0x01
#define CMD_STATUS      0x02
#define CMD_MSG         0x03
#define CMD_MSG_LONG    0x04
#define CMD_MSG_LOOP_ST 0x08

/* ACK RETURN COMMANDS */
/*
#define ACK_NORMAL               0x00
#define ACK_SCREEN_BUSY_SCROLL   0x01 // Seems to be busy displaying last message, but can cache next message,
#define ACK_SCREEN_BUSY_BLOCK    0x03 // Seems to be don't send me any more shit.
*/
// Some keypads use 0x00 some 0x80 (think it's something to do with version, but need to figure it out)
// But if you use 0x80 for ack then you get a start loop cycle CMD_MSG_LOOP_ST
#define ACK_NORMAL               0x80
#define ACK_SCREEN_BUSY_SCROLL   0x81 // Seems to be busy displaying last message, but can cache next message,
#define ACK_SCREEN_BUSY_BLOCK    0x83 // Seems to be don't send me any more shit.



// Remove this and fix all compile errors when get time.
#define ACK_SCREEN_BUSY ACK_SCREEN_BUSY_SCROLL

#define ACK_IAQ_TOUCH            0x00
#define ACK_PDA                  0x40
#define ACK_ONETOUCH             0x80
#define ACK_ALLB_SIM             0x80 // Jandy's Allbutton simulator uses this and not ACK_NORMAL
#define ACK_ALLB_SIM_BUSY        0x81 // Jandy's Allbutton simulator uses this and not ACK_SCREEN_BUSY_SCROLL

/* ONE TOUCH KEYCODES */
#define KEY_ONET_UP              0x06
#define KEY_ONET_DOWN            0x05
#define KEY_ONET_SELECT          0x04
#define KEY_ONET_PAGE_UP         0x03  // Top
#define KEY_ONET_BACK            0x02  // Middle
#define KEY_ONET_PAGE_DN         0x01  // Bottom
#define KEY_ONET_SELECT_1        KEY_ONET_PAGE_UP  
#define KEY_ONET_SELECT_2        KEY_ONET_BACK  
#define KEY_ONET_SELECT_3        KEY_ONET_PAGE_DN  

/* AquaRite commands */
#define CMD_GETID       0x14  // May be remote control control
#define CMD_PERCENT     0x11  // Set Percent
#define CMD_PPM         0x16  // Received PPM

/* LXi Heater commands */
#define CMD_JXI_PING     0x0c
#define CMD_JXI_STATUS   0x0d

/* PDA KEY CODES */  // Just plating at the moment
#define KEY_PDA_UP     0x06
#define KEY_PDA_DOWN   0x05
#define KEY_PDA_BACK   0x02
#define KEY_PDA_SELECT 0x04
//#define KEY_PDA_PGUP   0x01 // Think these are hot key #1
//#define KEY_PDA_PGDN   0x03 // Think these are hot key #2

/* KEY/BUTTON CODES */
#define KEY_PUMP      0x02
#define KEY_SPA       0x01
#define KEY_AUX1      0x05
#define KEY_AUX2      0x0a
#define KEY_AUX3      0x0f
#define KEY_AUX4      0x06
#define KEY_AUX5      0x0b
#define KEY_AUX6      0x10
#define KEY_AUX7      0x15
#define KEY_POOL_HTR  0x12
#define KEY_SPA_HTR   0x17
//#define KEY_SOLAR_HTR 0x1c
#define KEY_EXT_AUX   0x1c
#define KEY_MENU      0x09
#define KEY_CANCEL    0x0e
#define KEY_LEFT      0x13
#define KEY_RIGHT     0x18
#define KEY_HOLD      0x19
#define KEY_OVERRIDE  0x1e
#define KEY_ENTER     0x1d


//RS 12 & 16 are different from Aux4 to Aux7
#define KEY_RS16_AUX4      0x14
#define KEY_RS16_AUX5      0x03
#define KEY_RS16_AUX6      0x07
#define KEY_RS16_AUX7      0x06
// RS 12 & 16 have extra buttons
#define KEY_AUXB1     0x0b
#define KEY_AUXB2     0x10
#define KEY_AUXB3     0x15
#define KEY_AUXB4     0x1a
#define KEY_AUXB5     0x04
#define KEY_AUXB6     0x08
#define KEY_AUXB7     0x0d
#define KEY_AUXB8     0x0c
// End diff in RS12


#define BTN_PUMP      "Filter_Pump"
#define BTN_SPA       "Spa"
#define BTN_AUX1      "Aux_1"
#define BTN_AUX2      "Aux_2"
#define BTN_AUX3      "Aux_3"
#define BTN_AUX4      "Aux_4"
#define BTN_AUX5      "Aux_5"
#define BTN_AUX6      "Aux_6"
#define BTN_AUX7      "Aux_7"
#define BTN_POOL_HTR  "Pool_Heater"
#define BTN_SPA_HTR   "Spa_Heater"
//#define BTN_SOLAR_HTR "Solar_Heater"
#define BTN_EXT_AUX   "Extra_Aux"

#define BTN_TEMP1_HTR  "Temp1_Heater"
#define BTN_TEMP2_HTR  "Temp2_Heater"

#define BTN_VAUX      "Aux_V"  // A number will be appended


#define BTN_AUXB1      "Aux_B1"
#define BTN_AUXB2      "Aux_B2"
#define BTN_AUXB3      "Aux_B3"
#define BTN_AUXB4      "Aux_B4"
#define BTN_AUXB5      "Aux_B5"
#define BTN_AUXB6      "Aux_B6"
#define BTN_AUXB7      "Aux_B7"
#define BTN_AUXB8      "Aux_B8"


#define BTN_PDA_PUMP      "FILTER PUMP"
#define BTN_PDA_SPA       "SPA"
#define BTN_PDA_AUX1      "AUX1"
#define BTN_PDA_AUX2      "AUX2"
#define BTN_PDA_AUX3      "AUX3"
#define BTN_PDA_AUX4      "AUX4"
#define BTN_PDA_AUX5      "AUX5"
#define BTN_PDA_AUX6      "AUX6"
#define BTN_PDA_AUX7      "AUX7"
#define BTN_PDA_POOL_HTR  "POOL HEAT"
#define BTN_PDA_SPA_HTR   "SPA HEAT"
//#define BTN_PDA_SOLAR_HTR "EXTRA AUX"
#define BTN_PDA_EXT_AUX "EXTRA AUX"

#define BUTTON_LABEL_LENGTH 20




// Index starting at 1
#define POOL_HTR_LED_INDEX   15
#define SPA_HTR_LED_INDEX    17
#define SOLAR_HTR_LED_INDEX  19

#define LNG_MSG_SERVICE_ACTIVE        "SERVICE MODE IS ACTIVE"
#define LNG_MSG_TIMEOUT_ACTIVE        "TIMEOUT MODE IS ACTIVE"
#define LNG_MSG_POOL_TEMP_SET         "POOL TEMP IS SET TO"
#define LNG_MSG_SPA_TEMP_SET          "SPA TEMP IS SET TO"
#define LNG_MSG_FREEZE_PROTECTION_SET "FREEZE PROTECTION IS SET TO"
#define LNG_MSG_CLEANER_DELAY         "CLEANER WILL TURN ON AFTER SAFETY DELAY"
#define LNG_MSG_BATTERY_LOW           "BATTERY LOW"
//#define LNG_MSG_FREEZE_PROTECTION_ACTIVATED "FREEZE PROTECTION ACTIVATED"
#define LNG_MSG_FREEZE_PROTECTION_ACTIVATED "FREEZE PROTECTION IS ACTIVATED"

// These are
#define LNG_MSG_CHEM_FEED_ON          "CHEM FEED ON"
#define LNG_MSG_CHEM_FEED_OFF         "CHEM FEED OFF"


#define MSG_AIR_TEMP   "AIR TEMP"
#define MSG_POOL_TEMP  "POOL TEMP"
#define MSG_SPA_TEMP   "SPA TEMP"
#define MSG_AIR_TEMP_LEN   8
#define MSG_POOL_TEMP_LEN  9
#define MSG_SPA_TEMP_LEN   8

// Will get water temp rather than pool in some cases. not sure if it's REV specific or device (ie no spa) specific yet
#define MSG_WATER_TEMP       "WATER TEMP"
#define MSG_WATER_TEMP_LEN   10
#define LNG_MSG_WATER_TEMP1_SET "TEMP1 (HIGH TEMP) IS SET TO"
#define LNG_MSG_WATER_TEMP2_SET "TEMP2 (LOW TEMP) IS SET TO"

/*
// All Messages listed in the manual, This is obviously not complete, but it's everything Jandy has published
BATTERY IS LOW, BATTERY LOCATED AT THE POWER CENTER
CLEANER CANNOT BE TURNED ON WHILE SPA IS ON 
CLEANER CANNOT BE TURNED ON WHILE SPILLOVER IS ON
FREEZE PROTECTION ACTIVATED
SENSOR OPENED
POOL HEATER ENABLED
PUMP WILL REMAIN ON WHILE SPILLOVER IS ON
PUMP WILL TURN OFF AFTER COOL DOWN CYCLE
PUMP WILL TURN ON AFTER DELAY 
SERVICE MODE IS ACTIVE
SENSOR SHORTED
SPA WILL TURN OFF AFTER COOL DOWN CYCLE
TIMED AUX ON, WILL TURN OFF AFTER 30 MINUTES
TIMEOUT MODE IS ACTIVE
SPILLOVER IS DISABLED WHILE SPA IS ON
*/

#define MSG_SWG_PCT   "AQUAPURE"  // AquaPure 55%
#define MSG_SWG_PPM   "SALT"  // Salt 3000 PPM 
#define MSG_SWG_PCT_LEN  8
#define MSG_SWG_PPM_LEN  4

#define MSG_SWG_NO_FLOW   "Check AQUAPURE No Flow"
#define MSG_SWG_LOW_SALT  "Check AQUAPURE Low Salt"
#define MSG_SWG_HIGH_SALT "Check AQUAPURE High Salt"
#define MSG_SWG_FAULT     "Check AQUAPURE General Fault"

#define MSG_PMP_RPM   "RPM:" 
#define MSG_PMP_WAT   "Watts:"  
#define MSG_PMP_GPM   "GPM:" 


/* AQUAPURE SWG */

// These are madeup.
//#define SWG_STATUS_OFF     0xFF
//#define SWG_STATUS_OFFLINE 0xFE

//#define SWG_STATUS_UNKNOWN -128 // Idiot.  unsigned char....Derr.
#define SWG_STATUS_OFF      0xFF // Documented this as off in API, so don't change.
#define SWG_STATUS_UNKNOWN  0xFE 
#define SWG_STATUS_GENFAULT 0xFD //This is displayed in the panel, so adding it
// These are actual from RS485

#define SWG_STATUS_ON           0x00
#define SWG_STATUS_NO_FLOW      0x01 // no flow 0x01
#define SWG_STATUS_LOW_SALT     0x02 // low salt 0x02
//#define SWG_STATUS_VLOW_SALT    0x04 // very low salt 0x04
#define SWG_STATUS_HI_SALT      0x04 // high salt 0x04
#define SWG_STATUS_CLEAN_CELL   0x08 // clean cell 0x10
#define SWG_STATUS_TURNING_OFF  0x09 // turning off 0x09
#define SWG_STATUS_HIGH_CURRENT 0x10 // high current 0x08
#define SWG_STATUS_LOW_VOLTS    0x20 // low voltage 0x20
#define SWG_STATUS_LOW_TEMP     0x40 // low watertemp 0x40
#define SWG_STATUS_CHECK_PCB    0x80 // check PCB 0x80
// Other SWG codes not deciphered yes 0x03 & 0x0b seem to be messages when salt is low and turning on / off

#define CMD_PDA_0x04           0x04 // No idea, might be building menu
#define CMD_PDA_0x05           0x05 // No idea
#define CMD_PDA_0x1B           0x1b
#define CMD_PDA_HIGHLIGHT      0x08
#define CMD_PDA_CLEAR          0x09
#define CMD_PDA_SHIFTLINES     0x0F
#define CMD_PDA_HIGHLIGHTCHARS 0x10

/* ePump */
#define CMD_EPUMP_STATUS       0x1F
#define CMD_EPUMP_RPM          0x44
#define CMD_EPUMP_WATTS        0x45
// One Touch commands
//#define CMD_PDA_0x04           0x04 // No idea, might be building menu

/* iAqualink */

#define CMD_IAQ_PAGE_MSG      0x25
#define CMD_IAQ_TABLE_MSG     0x26  // ??? Some form of table populate
#define CMD_IAQ_PAGE_BUTTON   0x24
#define CMD_IAQ_PAGE_START    0x23  // Start a new menu // wait for 0x28 before sending anything
#define CMD_IAQ_PAGE_END      0x28  // Some kind a finished
#define CMD_IAQ_STARTUP       0x29  //  Startup message
#define CMD_IAQ_POLL          0x30  // Poll message or ready to receive command
#define CMD_IAQ_CTRL_READY    0x31  // Get this when we can send big control command
#define CMD_IAQ_PAGE_CONTINUE 0x40  // Seems we get this on AUX device page when there is another page, keeps circuling through pages.
#define CMD_IAQ_TITLE_MESSAGE 0x2d  // This is what the product name is set to (Jandy RS) usually
//#define CMD_IAQ_VSP_ERROR     0x2c  // Error when setting speed too high
#define CMD_IAQ_MSG_LONG      0x2c  // This this is display popup message.  Next 2 bytes 0x00|0x01 = wait and then 0x00|0x00 clear

// If
#define CMD_IAQ_MAIN_STATUS   0x70
#define CMD_IAQ_1TOUCH_STATUS 0x71
#define CMD_IAQ_AUX_STATUS    0x72 // Get this on AqualinkTouch protocol when iAqualink protocol sends 0x18 (get aux status I assume)

#define CMD_IAQ_CMD_READY     0x73 // iAqualink ready to receive command
/*
#define CMD_IAQ_MSG_3         0x2d  // Equiptment status message??
#define CMD_IAQ_0x31          0x31 // Some pump speed info
*/
#define ACK_CMD_READY_CTRL      0x80 // Send this before sending big control command


#define KEY_IAQTCH_HOME          0x01
#define KEY_IAQTCH_MENU          0x02
#define KEY_IAQTCH_ONETOUCH      0x03
#define KEY_IAQTCH_HELP          0x04
#define KEY_IAQTCH_BACK          0x05
#define KEY_IAQTCH_STATUS        0x06
#define KEY_IAQTCH_PREV_PAGE     0x20
#define KEY_IAQTCH_NEXT_PAGE     0x21
#define KEY_IAQTCH_OK            0x01 //HEX: 0x10|0x02|0x00|0x01|0x00|0x01|0x14|0x10|0x03|. OK BUTTON

#define KEY_IAQTCH_PREV_PAGE_ALTERNATE   0x1d // System setup prev
#define KEY_IAQTCH_NEXT_PAGE_ALTERNATE   0x1e // System setup next

// PAGE1 (Horosontal keys) (These are duplicate so probable delete)
#define KEY_IAQTCH_HOMEP_KEY01   0x11
#define KEY_IAQTCH_HOMEP_KEY02   0x12
#define KEY_IAQTCH_HOMEP_KEY03   0x13
#define KEY_IAQTCH_HOMEP_KEY04   0x14
#define KEY_IAQTCH_HOMEP_KEY05   0x15
#define KEY_IAQTCH_HOMEP_KEY06   0x16
#define KEY_IAQTCH_HOMEP_KEY07   0x17
#define KEY_IAQTCH_HOMEP_KEY08   0x18 // Other Devices (may not be able to change)

// Numbering is colum then row.
#define KEY_IAQTCH_KEY01         0x11  // Column 1 row 1
#define KEY_IAQTCH_KEY02         0x12  // column 1 row 2
#define KEY_IAQTCH_KEY03         0x13  // column 1 row 3
#define KEY_IAQTCH_KEY04         0x14  // column 1 row 4
#define KEY_IAQTCH_KEY05         0x15  // column 1 row 5

#define KEY_IAQTCH_KEY06         0x16  // column 2 row 1
#define KEY_IAQTCH_KEY07         0x17  // column 2 row 2
#define KEY_IAQTCH_KEY08         0x18  // column 2 row 3
#define KEY_IAQTCH_KEY09         0x19  // column 2 row 4
#define KEY_IAQTCH_KEY10         0x1a  // column 2 row 5

#define KEY_IAQTCH_KEY11         0x1b  // column 3 row 1
#define KEY_IAQTCH_KEY12         0x1c  // column 3 row 2
#define KEY_IAQTCH_KEY13         0x1d  // column 3 row 3
#define KEY_IAQTCH_KEY14         0x1e  // column 3 row 4
#define KEY_IAQTCH_KEY15         0x1f  // column 3 row 5

#define IAQ_PAGE_HOME            0x01
#define IAQ_PAGE_STATUS          0x5b
#define IAQ_PAGE_STATUS2         0x2a // Something get this for Status rather than 0x5b
#define IAQ_PAGE_DEVICES         0x36
#define IAQ_PAGE_DEVICES2        0x35
#define IAQ_PAGE_DEVICES3        0x51
#define IAQ_PAGE_SET_TEMP        0x39
#define IAQ_PAGE_MENU            0x0f
#define IAQ_PAGE_SET_VSP         0x1e
#define IAQ_PAGE_SET_TIME        0x4b
#define IAQ_PAGE_SET_DATE        0x4e
#define IAQ_PAGE_SET_SWG         0x30
#define IAQ_PAGE_SET_BOOST       0x1d
#define IAQ_PAGE_SET_QBOOST      0x3f
#define IAQ_PAGE_ONETOUCH        0x4d
#define IAQ_PAGE_COLOR_LIGHT     0x48
#define IAQ_PAGE_SYSTEM_SETUP    0x14
#define IAQ_PAGE_SYSTEM_SETUP2   0x49
#define IAQ_PAGE_SYSTEM_SETUP3   0x4a
#define IAQ_PAGE_VSP_SETUP       0x2d
#define IAQ_PAGE_FREEZE_PROTECT  0x11
#define IAQ_PAGE_LABEL_AUX       0x32
#define IAQ_PAGE_HELP            0x0c
#define IAQ_PAGE_SERVICEMODE     0x5e // Also Timeout

#define IAQ_PAGE_DEVICES_REV_Yg  0x0a  // Panel rev Yg (and maybe others use this)

//#define IAQ_PAGE_START_BOOST     0x3f
//#define IAQ_PAGE_DEGREES         0xFF // Added this as never want to actually select the page, just go to it.



#define RSSA_DEV_STATUS 0x13
#define RSSA_DEV_READY  0x07  // Ready to receive change command
// For the moment, rest of RS_RA are in serialadapter.h


// Errors from get_packet
#define AQSERR_READ     -1 // General fileIO read error
#define AQSERR_TIMEOUT  -2 // Timeout
#define AQSERR_CHKSUM   -3 // Checksum failed
#define AQSERR_2LARGE   -4 // Buffer Overflow
#define AQSERR_2SMALL   -5 // Not enough read


// At the moment just used for next ack
typedef enum {
  DRS_NONE,
  DRS_SWG,
  DRS_EPUMP,
  DRS_JXI,
  DRS_LX,
  DRS_CHEM_FEED,
  DRS_HEATPUMP,
  DRS_JLIGHT,
  DRS_CHEM_ANLZ
} rsDeviceType;

/*
typedef enum {
  ON,
  OFF,
  FLASH,
  ENABLE,
  LED_S_UNKNOWN
} aqledstate;

typedef struct aqualinkled
{
  //int number;
  aqledstate state;
} aqled;
*/
// Battery Status Identifiers
enum {
	OK = 0,
	LOW
};

typedef enum {
  JANDY,
  PENTAIR,
  P_UNKNOWN
} protocolType;


int init_serial_port(const char* tty);
int init_blocking_serial_port(const char* tty);
//int init_readahead_serial_port(const char* tty);

void close_serial_port(int file_descriptor);
//void close_blocking_serial_port();
//bool serial_blockingmode();

//#ifdef AQ_PDA
//void set_pda_mode(bool mode);
//bool pda_mode();
//#endif
int generate_checksum(unsigned char* packet, int length);
protocolType getProtocolType(const unsigned char* packet);
bool check_jandy_checksum(unsigned char* packet, int length);
bool check_pentair_checksum(unsigned char* packet, int length);
void send_ack(int file_descriptor, unsigned char command);
void send_extended_ack(int fd, unsigned char ack_type, unsigned char command);
//void send_cmd(int file_descriptor, unsigned char cmd, unsigned char args);
int get_packet(int file_descriptor, unsigned char* packet);
//int get_packet_lograw(int fd, unsigned char* packet);
int is_valid_port(int fd);

//int get_packet_new(int fd, unsigned char* packet);
//int get_packet_new_lograw(int fd, unsigned char* packet);
//void close_serial_port(int file_descriptor, struct termios* oldtio);
//void process_status(void const * const ptr);
void process_status(unsigned char* ptr);
const char* get_packet_type(const unsigned char* packet , int length);
/*
void set_onetouch_enabled(bool mode);
bool onetouch_enabled();
void set_iaqtouch_enabled(bool mode);
bool iaqtouch_enabled();
bool VSP_enabled();

void set_extended_device_id_programming(bool mode);
bool extended_device_id_programming();
*/

void send_jandy_command(int fd, unsigned char *packet_buffer, int size);
void send_pentair_command(int fd, unsigned char *packet_buffer, int size);
void send_command(int fd, unsigned char *packet_buffer, int size);

/*
#ifdef ONETOUCH
void set_onetouch_mode(bool mode);
bool onetouch_mode();
#endif
*/
//void send_test_cmd(int fd, unsigned char destination, unsigned char b1, unsigned char b2, unsigned char b3);
//void send_command(int fd, unsigned char destination, unsigned char b1, unsigned char b2, unsigned char b3);
//void send_messaged(int fd, unsigned char destination, char *message);
#endif // AQ_SERIAL_H_
