//************************************************************************************
//**  
//**  Source name:   C:\Users\Jari\Downloads\Test-Modbus_PresetSingleRegister.fcfx
//**  Title:         
//**  Description:   
//**  Device:        AVR.ATXMEGA.ATXMEGA32A4
//**  
//**  Generated by:  Flowcode v6.1.3.2
//**  Date:          Monday, July 25, 2016 20:29:24
//**  Users:         1
//**  Registered to: **********
//**  Licence key:   **********
//**  
//**  
//**  http://www.matrixtsl.com
//**  
//************************************************************************************


#define MX_AVR
#define MX_CAL_AVR
#define MX_CLK_SPEED 32000000
#define FCP_NULL Unconnected_Port
#define MX_XMEGA

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <avr\io.h>
#include <avr\interrupt.h>
#include <avr\eeprom.h>
#include <avr\wdt.h>


/*========================================================================*\
   Use :Include the type definitions
\*========================================================================*/
#include "C:\Program Files (x86)\Flowcode 6\CAL\internals.c"

MX_UINT8 FCLV_LOOP1;
MX_UINT8 FCLV_LOOP2;
MX_UINT8 FCLV_LOOP3;
MX_UINT8 FCLV_LOOP4;


/*========================================================================*\
   Use :panel
       :Variable declarations
       :Macro function declarations
\*========================================================================*/
#define FCVsz_R25S 5
#define FCVsz_VBFS 4
#define FCVsz_TWIRES 4
#define FCVsz_SETMAXPOWERS 4
#define FCVsz_POUTS 2
#define FCVsz_VOFS 5
#define FCVsz_IOFS 5
#define FCVsz_ATIS 6
#define FCVsz_ROFSAMPLES 5
#define FCVsz_ANIS 6
#define FCVsz_RNTCS 5
#define FCVsz_ICGFS 4
#define FCVsz_WOS 2
#define FCVsz_ROFINITSAMPLES 5
#define FCVsz_AX 2
#define FCVsz_TSTR 5
#define FCVsz_ROFS 5
#define FCVsz_RETSTR 1
#define FCVsz_VT1KS 5
#define FCVsz_HLTS 3
#define FCVsz_SETMAXPOWERS1 3
#define FCV_FALSE (0)
#define FCV_TRUE (1)
MX_GLOBAL MX_FLOAT FCV_VTNTC;
MX_GLOBAL MX_UINT16 FCV_ADC_UINT_TEMPBOARD;
MX_GLOBAL MX_FLOAT FCV_PID;
MX_GLOBAL MX_UINT8 FCV_STEPPERCENT;
MX_GLOBAL MX_SINT16 FCV_TWIREZ;
MX_GLOBAL MX_FLOAT FCV_VBFL1;
MX_GLOBAL MX_UINT8 FCV_DELAYSTEPMENU;
MX_GLOBAL MX_UINT8 FCV_COSSPATIUP;
MX_GLOBAL MX_UINT8 FCV_SETFULLBATT;
MX_GLOBAL MX_SINT16 FCV_PWMFIRE;
MX_GLOBAL MX_UINT8 FCV_LED_GREEN;
MX_GLOBAL MX_FLOAT FCV_VBF2;
MX_GLOBAL MX_FLOAT FCV_WOF;
MX_GLOBAL MX_FLOAT FCV_TWIRE4;
MX_GLOBAL MX_UINT8 FCV_RESETCOUNTCONNATZ;
MX_GLOBAL MX_FLOAT FCV_ICGF;
MX_GLOBAL MX_UINT16 FCV_COUNT;
MX_GLOBAL MX_SINT16 FCV_VDI3;
MX_GLOBAL MX_UINT8 FCV_MODE;
MX_GLOBAL MX_FLOAT FCV_VBF1;
MX_GLOBAL MX_FLOAT FCV_TWIRE3;
MX_GLOBAL MX_UINT8 FCV_BP;
MX_GLOBAL MX_UINT8 FCV_IN;
MX_GLOBAL MX_FLOAT FCV_POUT;
MX_GLOBAL MX_SINT16 FCV_HIGHLIMITDELAYBALANCE;
MX_GLOBAL MX_FLOAT FCV_VDI2;
MX_GLOBAL MX_SINT16 FCV_COUNTDELAYSOFTSTART;
MX_GLOBAL MX_UINT16 FCV_COUNTDELAYFIRE;
MX_GLOBAL MX_UINT8 FCV_STEPBALANCE;
MX_GLOBAL MX_FLOAT FCV_TWIRE2;
MX_GLOBAL MX_SINT16 FCV_BFP3;
MX_GLOBAL MX_UINT16 FCV_COUNTINIT;
MX_GLOBAL MX_FLOAT FCV_VDI1;
MX_GLOBAL MX_FLOAT FCV_MAXSTEPTEMPLIMIT;
MX_GLOBAL MX_UINT8 FCV_SW_UP;
MX_GLOBAL MX_UINT8 FCV_LED_BLUE;
MX_GLOBAL MX_UINT8 FCV_SETENABLE;
MX_GLOBAL MX_SINT16 FCV_COUNTSAMPLEROF;
MX_GLOBAL MX_FLOAT FCV_TWIRE1;
MX_GLOBAL MX_FLOAT FCV_BFP2;
MX_GLOBAL MX_UINT8 FCV_COUNTCLEARDISPLAY;
MX_GLOBAL MX_UINT8 FCV_RT;
MX_GLOBAL MX_CHAR FCV_R25S[FCVsz_R25S];
MX_GLOBAL MX_CHAR FCV_VBFS[FCVsz_VBFS];
MX_GLOBAL MX_UINT8 FCV_FLASHTIMERENABLE;
MX_GLOBAL MX_UINT8 FCV_COUNTDELAYLOWRES;
MX_GLOBAL MX_FLOAT FCV_BFP1;
MX_GLOBAL MX_UINT8 FCV_INITIALVALUE;
MX_GLOBAL MX_FLOAT FCV_B;
MX_GLOBAL MX_SINT16 FCV_DELAYONPERIOD;
MX_GLOBAL MX_SINT16 FCV_DELAYBACKMENU1_2;
MX_GLOBAL MX_FLOAT FCV_SETPRCRESISTORF1;
MX_GLOBAL MX_UINT8 FCV_STOREVALUE;
MX_GLOBAL MX_CHAR FCV_TWIRES[FCVsz_TWIRES];
MX_GLOBAL MX_UINT8 FCV_COSINGW;
MX_GLOBAL MX_UINT8 FCV_LENGHSETMAX;
MX_GLOBAL MX_UINT8 FCV_COUNTCOSNO3;
MX_GLOBAL MX_UINT8 FCV_CHECKATOMIZER;
MX_GLOBAL MX_FLOAT FCV_A;
MX_GLOBAL MX_SINT16 FCV_TZ;
MX_GLOBAL MX_UINT8 FCV_MULSTEPPERCENT;
MX_GLOBAL MX_UINT8 FCV_FLASHTIMES;
MX_GLOBAL MX_UINT8 FCV_THERMALLOCK;
MX_GLOBAL MX_FLOAT FCV_MINSETPRCRESISTOR;
MX_GLOBAL MX_FLOAT FCV_DT;
MX_GLOBAL MX_SINT16 FCV_COUNTSAMPLEROF0;
MX_GLOBAL MX_CHAR FCV_SETMAXPOWERS[FCVsz_SETMAXPOWERS];
MX_GLOBAL MX_UINT8 FCV_COUNTCOSNO2;
MX_GLOBAL MX_UINT8 FCV_COSNO3;
MX_GLOBAL MX_FLOAT FCV_RO;
MX_GLOBAL MX_SINT16 FCV_COUNTCHECKLOWWATTAGE;
MX_GLOBAL MX_FLOAT FCV_VOF2;
MX_GLOBAL MX_UINT8 FCV_CLEARMENUSTEP;
MX_GLOBAL MX_UINT8 FCV_COSNO2;
MX_GLOBAL MX_UINT8 FCV_COUNTCOSNO1;
MX_GLOBAL MX_UINT8 FCV_COSSPANIDW;
MX_GLOBAL MX_SINT16 FCV_COUNT_TIMER;
MX_GLOBAL MX_UINT8 FCV_FIRST_SAMPLE;
MX_GLOBAL MX_FLOAT FCV_VOF1;
MX_GLOBAL MX_UINT8 FCV_COUNTSTEPINGW;
MX_GLOBAL MX_UINT8 FCV_COSNO1;
MX_GLOBAL MX_UINT8 FCV_COUNTBP_STB;
MX_GLOBAL MX_UINT8 FCV_SETSW;
MX_GLOBAL MX_CHAR FCV_POUTS[FCVsz_POUTS];
MX_GLOBAL MX_UINT8 FCV_HIGHLIMITDELAYBALANCE1;
MX_GLOBAL MX_FLOAT FCV_IOF3;
MX_GLOBAL MX_UINT8 FCV_COSDNGW;
MX_GLOBAL MX_UINT8 FCV_RTDB_1;
MX_GLOBAL MX_FLOAT FCV_RSUM;
MX_GLOBAL MX_FLOAT FCV_ROFSAMPLE;
MX_GLOBAL MX_UINT16 FCV_ADC_UINT_VOUT;
MX_GLOBAL MX_FLOAT FCV_IOF2;
MX_GLOBAL MX_UINT8 FCV_DETECTION;
MX_GLOBAL MX_FLOAT FCV_STEPTEMPPERCENT;
MX_GLOBAL MX_FLOAT FCV_VT1K;
MX_GLOBAL MX_UINT8 FCV_FIRE;
MX_GLOBAL MX_FLOAT FCV_IOF1;
MX_GLOBAL MX_SINT16 FCV_COUNTATOMIZERCONNECTED;
MX_GLOBAL MX_CHAR FCV_VOFS[FCVsz_VOFS];
MX_GLOBAL MX_UINT8 FCV_LOCK;
MX_GLOBAL MX_UINT8 FCV_COUNTSTEPDNGW;
MX_GLOBAL MX_UINT16 FCV_ADC_UINT_IOUT;
MX_GLOBAL MX_FLOAT FCV_ROF;
MX_GLOBAL MX_UINT8 FCV_READSTORAGEVALUE;
MX_GLOBAL MX_FLOAT FCV_ROFSAMPLE1;
MX_GLOBAL MX_UINT8 FCV_FILLBATTERY = (0x1d);
MX_GLOBAL MX_FLOAT FCV_ICGF4;
MX_GLOBAL MX_FLOAT FCV_INTC;
MX_GLOBAL MX_CHAR FCV_IOFS[FCVsz_IOFS];
MX_GLOBAL MX_UINT8 FCV_OVERLIMIT;
MX_GLOBAL MX_CHAR FCV_ATIS[FCVsz_ATIS];
MX_GLOBAL MX_FLOAT FCV_ICGF3;
MX_GLOBAL MX_UINT8 FCV_RTCOIL;
MX_GLOBAL MX_SINT16 FCV_COUNTBATTERYLOW;
MX_GLOBAL MX_FLOAT FCV_ROFINITSAMPLE;
MX_GLOBAL MX_FLOAT FCV_ICGF2;
MX_GLOBAL MX_SINT16 FCV_ADC_UINT_ICHRG;
MX_GLOBAL MX_UINT8 FCV_RTNV;
MX_GLOBAL MX_UINT8 FCV_LED_RED;
MX_GLOBAL MX_FLOAT FCV_IOF;
MX_GLOBAL MX_UINT8 FCV_LIMIT;
MX_GLOBAL MX_FLOAT FCV_HIGHLIMITTEMPF2;
MX_GLOBAL MX_UINT8 FCV_TP;
MX_GLOBAL MX_UINT8 FCV_TOGLE;
MX_GLOBAL MX_SINT16 FCV_ROFMULINTRN;
MX_GLOBAL MX_UINT8 FCV_WOZ;
MX_GLOBAL MX_UINT8 FCV_CHARGING;
MX_GLOBAL MX_CHAR FCV_ROFSAMPLES[FCVsz_ROFSAMPLES];
MX_GLOBAL MX_FLOAT FCV_ICGF1;
MX_GLOBAL MX_FLOAT FCV_ATI;
MX_GLOBAL MX_CHAR FCV_ANIS[FCVsz_ANIS];
MX_GLOBAL MX_CHAR FCV_RNTCS[FCVsz_RNTCS];
MX_GLOBAL MX_FLOAT FCV_TO;
MX_GLOBAL MX_FLOAT FCV_HIGHLIMITTEMPF1;
MX_GLOBAL MX_UINT8 FCV_RESETDELAYOFF1_2;
MX_GLOBAL MX_UINT16 FCV_COUNTMESSAGELOCK;
MX_GLOBAL MX_UINT8 FCV_COSSPATIDW;
MX_GLOBAL MX_UINT8 FCV_RESPONSE;
MX_GLOBAL MX_UINT8 FCV_ACTIVEENERGY;
MX_GLOBAL MX_FLOAT FCV_R25_2;
MX_GLOBAL MX_UINT16 FCV_ADC_UINT_VBATTERY;
MX_GLOBAL MX_UINT8 FCV_SHUNDOFF;
MX_GLOBAL MX_SINT16 FCV_DELAYLOCKMENU;
MX_GLOBAL MX_UINT8 FCV_CLEARDOSPLAY;
MX_GLOBAL MX_SINT16 FCV_COUNTFLASH;
MX_GLOBAL MX_SINT16 FCV_COUNTDELAYCHECKATMZR;
MX_GLOBAL MX_UINT16 FCV_COUNTFILLBATTERY;
MX_GLOBAL MX_UINT8 FCV_CLEARTEMPSTEP2;
MX_GLOBAL MX_FLOAT FCV_R25_1;
MX_GLOBAL MX_UINT8 FCV_COUNTCOSYES2;
MX_GLOBAL MX_UINT8 FCV_CLEARTEMPSTEP1;
MX_GLOBAL MX_CHAR FCV_ICGFS[FCVsz_ICGFS];
MX_GLOBAL MX_UINT8 FCV_SETPOWERBALANCE;
MX_GLOBAL MX_FLOAT FCV_MAXPOWER;
MX_GLOBAL MX_UINT8 FCV_COUNTCOSYES1;
MX_GLOBAL MX_UINT8 FCV_RB;
MX_GLOBAL MX_FLOAT FCV_TK;
MX_GLOBAL MX_UINT8 FCV_ENABLESTEPMENU;
MX_GLOBAL MX_UINT8 FCV_SETSTEPINGW;
MX_GLOBAL MX_UINT8 FCV_COSSPTEMPDOWN;
MX_GLOBAL MX_FLOAT FCV_SETPRCRESISTOR;
MX_GLOBAL MX_UINT8 FCV_SW_MENU;
MX_GLOBAL MX_UINT8 FCV_BFPC;
MX_GLOBAL MX_FLOAT FCV_SETMAXPOWER;
MX_GLOBAL MX_UINT8 FCV_WIRENITI;
MX_GLOBAL MX_UINT8 FCV_COSSPTEMPUP;
MX_GLOBAL MX_UINT8 FCV_COSCHECKATOMIZER;
MX_GLOBAL MX_FLOAT FCV_T;
MX_GLOBAL MX_UINT8 FCV_LOWRESISTANT;
MX_GLOBAL MX_CHAR FCV_WOS[FCVsz_WOS];
MX_GLOBAL MX_UINT8 FCV_TEMPCONTROL;
MX_GLOBAL MX_FLOAT FCV_ANI;
MX_GLOBAL MX_UINT8 FCV_RET;
MX_GLOBAL MX_UINT8 FCV_SWITCHMENUSTEPS;
MX_GLOBAL MX_UINT16 FCV_COUNT1;
MX_GLOBAL MX_FLOAT FCV_VOF;
MX_GLOBAL MX_CHAR FCV_ROFINITSAMPLES[FCVsz_ROFINITSAMPLES];
MX_GLOBAL MX_UINT16 FCV_AX[FCVsz_AX];
MX_GLOBAL MX_UINT16 FCV_CLOCK;
MX_GLOBAL MX_UINT8 FCV_ROFINT2;
MX_GLOBAL MX_UINT8 FCV_BFP;
MX_GLOBAL MX_UINT16 FCV_COUNTINGW;
MX_GLOBAL MX_UINT8 FCV_SETSTEPDNGW;
MX_GLOBAL MX_UINT8 FCV_COSSPANIUP;
MX_GLOBAL MX_SINT16 FCV_DELAYBACKMENU3_4;
MX_GLOBAL MX_UINT8 FCV_SWTICKLATCH;
MX_GLOBAL MX_SINT16 FCV_DELAYOFFMENU;
MX_GLOBAL MX_SINT16 FCV_COUNTDELAYOFF;
MX_GLOBAL MX_UINT8 FCV_FLASH;
MX_GLOBAL MX_UINT8 FCV_ROFINT1;
MX_GLOBAL MX_FLOAT FCV_B5;
MX_GLOBAL MX_SINT16 FCV_COUNTFLASHCHECKATMZR;
MX_GLOBAL MX_SINT16 FCV_WOZF;
MX_GLOBAL MX_UINT8 FCV_TP_A;
MX_GLOBAL MX_FLOAT FCV_ATIF;
MX_GLOBAL MX_FLOAT FCV_B4;
MX_GLOBAL MX_CHAR FCV_TSTR[FCVsz_TSTR];
MX_GLOBAL MX_SINT16 FCV_COUNTFAULT4;
MX_GLOBAL MX_UINT8 FCV_FAULT;
MX_GLOBAL MX_UINT8 FCV_LED_INDICATOR;
MX_GLOBAL MX_FLOAT FCV_VBF_;
MX_GLOBAL MX_FLOAT FCV_RNTC;
MX_GLOBAL MX_FLOAT FCV_B3;
MX_GLOBAL MX_UINT16 FCV_INT10BIT;
MX_GLOBAL MX_FLOAT FCV_ADJSETTMP;
MX_GLOBAL MX_UINT8 FCV_READMSTEPS;
MX_GLOBAL MX_SINT16 FCV_COUNTFLASHERDETECTION;
MX_GLOBAL MX_SINT16 FCV_COUNTINITRESISTOR;
MX_GLOBAL MX_UINT8 FCV_SETLOCK;
MX_GLOBAL MX_UINT16 FCV_COUNTDNGW;
MX_GLOBAL MX_CHAR FCV_ROFS[FCVsz_ROFS];
MX_GLOBAL MX_FLOAT FCV_ANIF;
MX_GLOBAL MX_FLOAT FCV_VT1K1;
MX_GLOBAL MX_FLOAT FCV_B2;
MX_GLOBAL MX_UINT8 FCV_BP_OLD;
MX_GLOBAL MX_CHAR FCV_RETSTR[FCVsz_RETSTR];
MX_GLOBAL MX_FLOAT FCV_B1;
MX_GLOBAL MX_UINT8 FCV_SW_DOWN;
MX_GLOBAL MX_SINT16 FCV_DELAYOFF;
MX_GLOBAL MX_FLOAT FCV_BP2;
MX_GLOBAL MX_FLOAT FCV_HIGHLIMITTEMPF;
MX_GLOBAL MX_FLOAT FCV_BP1;
MX_GLOBAL MX_UINT8 FCV_COSYES3;
MX_GLOBAL MX_CHAR FCV_VT1KS[FCVsz_VT1KS];
MX_GLOBAL MX_FLOAT FCV_R25;
MX_GLOBAL MX_UINT8 FCV_FIRECMDOUT;
MX_GLOBAL MX_FLOAT FCV_MAXSETPRCRESISTOR;
MX_GLOBAL MX_UINT8 FCV_SETDELAYOFF;
MX_GLOBAL MX_FLOAT FCV_VBF;
MX_GLOBAL MX_UINT8 FCV_COSINITVALUE;
MX_GLOBAL MX_UINT8 FCV_COUNTBP_STB1;
MX_GLOBAL MX_UINT8 FCV_COSYES2;
MX_GLOBAL MX_FLOAT FCV_ADCT10BIT;
MX_GLOBAL MX_SINT16 FCV_COUNTOVERBATWATT;
MX_GLOBAL MX_UINT8 FCV_CMDDELAYSWITCH;
MX_GLOBAL MX_UINT8 FCV_FLIPFLOP_LOCK;
MX_GLOBAL MX_FLOAT FCV_RF12;
MX_GLOBAL MX_CHAR FCV_HLTS[FCVsz_HLTS];
MX_GLOBAL MX_FLOAT FCV_TWIRE;
MX_GLOBAL MX_CHAR FCV_SETMAXPOWERS1[FCVsz_SETMAXPOWERS1];
MX_GLOBAL MX_UINT8 FCV_COSYES1;


/*========================================================================*\
   Use :InjectorBase1
       :Variable declarations
       :Macro function declarations
\*========================================================================*/

/*========================================================================*\
   Use :dash_IO_flasher1
       :Variable declarations
       :Macro function declarations
\*========================================================================*/

/*========================================================================*\
   Use :COMPort1
       :Variable declarations
       :Macro function declarations
\*========================================================================*/

/*========================================================================*\
   Use :fcdhelper
       :Variable declarations
       :Macro function declarations
\*========================================================================*/

/*========================================================================*\
   Use :cal_uart
       :Variable declarations
       :Macro function declarations
\*========================================================================*/
#define MX_UART_TX_TRIS_1 trise
#define MX_UART_REF1 
#define MX_UART_RTS_PIN_1 (4)
#define MX_UART_DBITS_1 (8)
#define MX_UART_RETURN_1 (0)
#define MX_UART_RX_PORT_1 porte
#define MX_UART_RTS_PORT_1 portb
#define MX_UART_ECHO_1 (0)
#define MX_UART_FLOWEN_1 (0)
#define MX_UART_CTS_PORT_1 portb
#define MX_UART_TX_PIN_1 (3)
#define MX_UART_RX_TRIS_1 trise
#define MX_UART_RTS_TRIS_1 trisb
#define MX_UART_BAUD_1 (9600)
#define MX_UART_TX_PORT_1 porte
#define MX_UART_RX_PIN_1 (2)
#define MX_UART_CTS_TRIS_1 trisb
#define MX_UART_CHANNEL_1 (5)
#define MX_UART_CTS_PIN_1 (3)
#define MX_UART_INT_1 (0)

MX_GLOBAL MX_UINT32 FCV_05481_cal_uart__CONSOLE;

void FCD_05481_cal_uart__Prv_TextConsole(MX_CHAR *FCL_STR, MX_UINT16 FCLsz_STR);
void FC_CAL_UART_UpdateBaud_1(MX_UINT8 FCL_NEW_BAUD);
MX_SINT16 FC_CAL_UART_Receive_1(MX_UINT8 FCL_TIMEOUT);
void FC_CAL_UART_Send_1(MX_UINT16 FCL_CHAR);
void FC_CAL_UART_Init_1();
void FC_CAL_UART_Delay_1();
void FC_CAL_UART_Uninit_1();

/*========================================================================*\
   Use :ModbusMaster1
       :Variable declarations
       :Macro function declarations
\*========================================================================*/
#define FCVsz_0cc41_ModbusMaster1__RESPONSEBUFFER 50
MX_GLOBAL MX_UINT8 FCV_0cc41_ModbusMaster1__SUM = (0x0);
MX_GLOBAL MX_UINT8 FCV_0cc41_ModbusMaster1__RESPONSEBUFFER[FCVsz_0cc41_ModbusMaster1__RESPONSEBUFFER];

MX_UINT8 FCD_0cc41_ModbusMaster1__ReadHoldingRegister(MX_UINT16 FCL_SLAVEID, MX_UINT16 FCL_REGADDRESS, MX_UINT16 FCL_REGCOUNT);
MX_UINT8 FCD_0cc41_ModbusMaster1__ForceSingleCoil(MX_UINT16 FCL_SLAVEID, MX_UINT16 FCL_COILADDRESS, MX_UINT8 FCL_COILSTATE);
MX_UINT8 FCD_0cc41_ModbusMaster1__GetResponse();
MX_UINT8 FCD_0cc41_ModbusMaster1__ReadCoilStatus(MX_UINT16 FCL_SLAVEID, MX_UINT16 FCL_COILADDRESS, MX_UINT16 FCL_COILCOUNT);
MX_UINT8 FCD_0cc41_ModbusMaster1__GetResponseByte(MX_UINT8 FCL_INDEX);
MX_UINT8 FCD_0cc41_ModbusMaster1__ReadInputStatus(MX_UINT16 FCL_SLAVEID, MX_UINT16 FCL_DATAADDRESS, MX_UINT16 FCL_DATACOUNT);
void FCD_0cc41_ModbusMaster1__SendValueAsASCII(MX_UINT8 FCL_VALUE);
MX_UINT8 FCD_0cc41_ModbusMaster1__PresetSingleRegister(MX_UINT16 FCL_SLAVEID, MX_UINT16 FCL_REGADDRESS, MX_UINT16 FCL_REGVALUE);
MX_UINT8 FCD_0cc41_ModbusMaster1__ReadInputRegister(MX_UINT16 FCL_SLAVEID, MX_UINT16 FCL_REGADDRESS, MX_UINT16 FCL_REGCOUNT);
MX_UINT16 FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(MX_UINT8 FCL_DATABYTE, MX_UINT16 FCL_CRC16);
MX_UINT8 FCD_0cc41_ModbusMaster1__PresetMultipleRegisters(MX_UINT16 FCL_SLAVEID, MX_UINT16 FCL_REGADDRESS, MX_UINT16 FCL_REGCOUNT, MX_UINT16 *FCL_REGVALUE, MX_UINT16 FCLsz_REGVALUE);
void FCD_0cc41_ModbusMaster1__Initialise();

/*========================================================================*\
   Use :ASCII6
       :Variable declarations
       :Macro function declarations
\*========================================================================*/
#define FCVsz_00fb8_ASCII6__FLOATFIXEDLIST 1
#define FCVsz_00fb8_ASCII6__INTLIST 60
#define FCVsz_00fb8_ASCII6__FLOATLIST 1
#define FCVsz_00fb8_ASCII6__INTFIXEDLIST 1
#define FCD_00fb8_ASCII6__INTLIST(ix) FCD_00fb8_ASCII6__INTLIST_LUT[ix]
ROMARRAY_(MX_UINT8) FCD_00fb8_ASCII6__INTLIST_LUT ROMARRAY_E =
{
// Property added elements
  127, 4, 4, 120, 0, 0, 0, 125, 0, 0, 64, 128, 132, 125, 0, 127, 16,
 40, 68, 0, 0, 0, 127, 64, 0, 124, 4, 24, 4, 120, 124, 4, 4,
 120, 0, 56, 68, 68, 68, 56, 252, 68, 68, 68, 56, 56, 68, 68, 68,
 252, 68, 120, 68, 4, 8, 8, 84, 84, 84, 32
// Dynamically added elements
 
};


/*========================================================================*\
   Use :ASCII7
       :Variable declarations
       :Macro function declarations
\*========================================================================*/
#define FCVsz_00fb7_ASCII7__FLOATFIXEDLIST 1
#define FCVsz_00fb7_ASCII7__INTLIST 55
#define FCVsz_00fb7_ASCII7__FLOATLIST 1
#define FCVsz_00fb7_ASCII7__INTFIXEDLIST 1
#define FCD_00fb7_ASCII7__INTLIST(ix) FCD_00fb7_ASCII7__INTLIST_LUT[ix]
ROMARRAY_(MX_UINT8) FCD_00fb7_ASCII7__INTLIST_LUT ROMARRAY_E =
{
// Property added elements
  4, 62, 68, 36, 0, 60, 64, 32, 124, 0, 28, 32, 64, 32, 28, 60, 96,
 48, 96, 60, 108, 16, 16, 108, 0, 156, 160, 96, 60, 0, 100, 84, 84,
 76, 0, 8, 62, 65, 65, 0, 0, 0, 127, 0, 0, 0, 65, 65, 62,
 8, 2, 1, 2, 1, 0
// Dynamically added elements
 
};


/*========================================================================*\
   Use :ASCII5
       :Variable declarations
       :Macro function declarations
\*========================================================================*/
#define FCVsz_00fb6_ASCII5__FLOATFIXEDLIST 1
#define FCVsz_00fb6_ASCII5__INTLIST 60
#define FCVsz_00fb6_ASCII5__FLOATLIST 1
#define FCVsz_00fb6_ASCII5__INTFIXEDLIST 1
#define FCD_00fb6_ASCII5__INTLIST(ix) FCD_00fb6_ASCII5__INTLIST_LUT[ix]
ROMARRAY_(MX_UINT8) FCD_00fb6_ASCII5__INTLIST_LUT ROMARRAY_E =
{
// Property added elements
  2, 4, 8, 16, 32, 0, 65, 65, 127, 0, 4, 2, 1, 2, 4, 128, 128,
 128, 128, 128, 0, 3, 7, 0, 0, 32, 84, 84, 84, 120, 127, 68, 68,
 68, 56, 56, 68, 68, 68, 40, 56, 68, 68, 68, 127, 56, 84, 84, 84,
 24, 8, 126, 9, 9, 0, 24, 164, 164, 164, 124
// Dynamically added elements
 
};


/*========================================================================*\
   Use :ASCII4
       :Variable declarations
       :Macro function declarations
\*========================================================================*/
#define FCVsz_00fb5_ASCII4__FLOATFIXEDLIST 1
#define FCVsz_00fb5_ASCII4__INTLIST 60
#define FCVsz_00fb5_ASCII4__FLOATLIST 1
#define FCVsz_00fb5_ASCII4__INTFIXEDLIST 1
#define FCD_00fb5_ASCII4__INTLIST(ix) FCD_00fb5_ASCII4__INTLIST_LUT[ix]
ROMARRAY_(MX_UINT8) FCD_00fb5_ASCII4__INTLIST_LUT ROMARRAY_E =
{
// Property added elements
  127, 9, 9, 9, 6, 62, 65, 81, 33, 94, 127, 9, 9, 25, 102, 38, 73,
 73, 73, 50, 1, 1, 127, 1, 1, 63, 64, 64, 64, 63, 31, 32, 64,
 32, 31, 63, 64, 60, 64, 63, 99, 20, 8, 20, 99, 7, 8, 112, 8,
 7, 113, 73, 69, 67, 0, 0, 127, 65, 65, 0
// Dynamically added elements
 
};


/*========================================================================*\
   Use :ASCII3
       :Variable declarations
       :Macro function declarations
\*========================================================================*/
#define FCVsz_00fb4_ASCII3__FLOATFIXEDLIST 1
#define FCVsz_00fb4_ASCII3__INTLIST 60
#define FCVsz_00fb4_ASCII3__FLOATLIST 1
#define FCVsz_00fb4_ASCII3__INTFIXEDLIST 1
#define FCD_00fb4_ASCII3__INTLIST(ix) FCD_00fb4_ASCII3__INTLIST_LUT[ix]
ROMARRAY_(MX_UINT8) FCD_00fb4_ASCII3__INTLIST_LUT ROMARRAY_E =
{
// Property added elements
  127, 65, 65, 65, 62, 127, 73, 73, 73, 65, 127, 9, 9, 9, 1, 62, 65,
 73, 73, 122, 127, 8, 8, 8, 127, 0, 65, 127, 65, 0, 48, 64, 64,
 64, 63, 127, 8, 20, 34, 65, 127, 64, 64, 64, 64, 127, 2, 4, 2,
 127, 127, 2, 4, 8, 127, 62, 65, 65, 65, 62
// Dynamically added elements
 
};


/*========================================================================*\
   Use :ASCII2
       :Variable declarations
       :Macro function declarations
\*========================================================================*/
#define FCVsz_00fb3_ASCII2__FLOATFIXEDLIST 1
#define FCVsz_00fb3_ASCII2__INTLIST 60
#define FCVsz_00fb3_ASCII2__FLOATLIST 1
#define FCVsz_00fb3_ASCII2__INTFIXEDLIST 1
#define FCD_00fb3_ASCII2__INTLIST(ix) FCD_00fb3_ASCII2__INTLIST_LUT[ix]
ROMARRAY_(MX_UINT8) FCD_00fb3_ASCII2__INTLIST_LUT ROMARRAY_E =
{
// Property added elements
  54, 73, 73, 73, 54, 6, 73, 73, 41, 30, 0, 108, 108, 0, 0, 0, 236,
 108, 0, 0, 8, 20, 34, 65, 0, 36, 36, 36, 36, 36, 0, 65, 34,
 20, 8, 2, 1, 89, 9, 6, 62, 65, 93, 85, 30, 126, 9, 9, 9,
 126, 127, 73, 73, 73, 54, 62, 65, 65, 65, 34
// Dynamically added elements
 
};


/*========================================================================*\
   Use :ASCII1
       :Variable declarations
       :Macro function declarations
\*========================================================================*/
#define FCVsz_00fb2_ASCII1__FLOATFIXEDLIST 1
#define FCVsz_00fb2_ASCII1__INTLIST 60
#define FCVsz_00fb2_ASCII1__FLOATLIST 1
#define FCVsz_00fb2_ASCII1__INTFIXEDLIST 1
#define FCD_00fb2_ASCII1__INTLIST(ix) FCD_00fb2_ASCII1__INTLIST_LUT[ix]
ROMARRAY_(MX_UINT8) FCD_00fb2_ASCII1__INTLIST_LUT ROMARRAY_E =
{
// Property added elements
  0, 224, 96, 0, 0, 8, 8, 8, 8, 8, 0, 96, 96, 0, 0, 32, 16,
 8, 4, 2, 62, 81, 73, 69, 62, 0, 66, 127, 64, 0, 98, 81, 73,
 73, 70, 34, 73, 73, 73, 54, 24, 20, 18, 127, 16, 39, 69, 69, 69,
 57, 60, 74, 73, 73, 48, 1, 113, 9, 5, 3
// Dynamically added elements
 
};


/*========================================================================*\
   Use :ASCII0
       :Variable declarations
       :Macro function declarations
\*========================================================================*/
#define FCVsz_00fb1_ASCII0__FLOATFIXEDLIST 1
#define FCVsz_00fb1_ASCII0__INTLIST 60
#define FCVsz_00fb1_ASCII0__FLOATLIST 1
#define FCVsz_00fb1_ASCII0__INTFIXEDLIST 1
#define FCD_00fb1_ASCII0__INTLIST(ix) FCD_00fb1_ASCII0__INTLIST_LUT[ix]
ROMARRAY_(MX_UINT8) FCD_00fb1_ASCII0__INTLIST_LUT ROMARRAY_E =
{
// Property added elements
  0, 0, 0, 0, 0, 0, 6, 95, 6, 0, 7, 3, 0, 7, 3, 36, 126,
 36, 126, 36, 36, 43, 106, 18, 0, 99, 19, 8, 100, 99, 54, 73, 86,
 32, 80, 0, 7, 3, 0, 0, 0, 62, 65, 0, 0, 0, 65, 62, 0,
 0, 8, 62, 28, 62, 8, 8, 8, 62, 8, 8
// Dynamically added elements
 
};


/*========================================================================*\
   Use :Base_GLCD
       :Variable declarations
       :Macro function declarations
\*========================================================================*/
MX_UINT8 FCD_0ba71_Base_GLCD__ReadASCIILUT(MX_UINT8 FCL_POS_STR, MX_UINT8 FCL_COUNT);

/*========================================================================*\
   Use :gLCD_SSD1306_buffered1
       :Variable declarations
       :Macro function declarations
\*========================================================================*/
#define FCVsz_05bc1_gLCD_SSD1306_buffered1__DRAM7 128
#define FCVsz_05bc1_gLCD_SSD1306_buffered1__DRAM6 128
#define FCVsz_05bc1_gLCD_SSD1306_buffered1__DRAM5 128
#define FCVsz_05bc1_gLCD_SSD1306_buffered1__DRAM4 128
#define FCVsz_05bc1_gLCD_SSD1306_buffered1__DRAM3 128
#define FCVsz_05bc1_gLCD_SSD1306_buffered1__DRAM2 128
#define FCVsz_05bc1_gLCD_SSD1306_buffered1__DRAM1 128
#define FCVsz_05bc1_gLCD_SSD1306_buffered1__DRAM0 128
#define FCV_05bc1_gLCD_SSD1306_buffered1__BLACK (0)
#define FCV_05bc1_gLCD_SSD1306_buffered1__WHITE (255)
MX_GLOBAL MX_UINT16 FCV_05bc1_gLCD_SSD1306_buffered1__BACKGROUND_COL_VAR;
MX_GLOBAL MX_UINT8 FCV_05bc1_gLCD_SSD1306_buffered1__PAGE;
MX_GLOBAL MX_UINT8 FCV_05bc1_gLCD_SSD1306_buffered1__CURRENTY;
MX_GLOBAL MX_UINT8 FCV_05bc1_gLCD_SSD1306_buffered1__CURRENTX;
MX_GLOBAL MX_UINT16 FCV_05bc1_gLCD_SSD1306_buffered1__FOREGROUND_COL_VAR;
MX_GLOBAL MX_UINT8 FCV_05bc1_gLCD_SSD1306_buffered1__ORIENTATION = (0x0);
MX_GLOBAL MX_UINT8 FCV_05bc1_gLCD_SSD1306_buffered1__DRAM7[FCVsz_05bc1_gLCD_SSD1306_buffered1__DRAM7];
MX_GLOBAL MX_UINT8 FCV_05bc1_gLCD_SSD1306_buffered1__DRAM6[FCVsz_05bc1_gLCD_SSD1306_buffered1__DRAM6];
MX_GLOBAL MX_UINT8 FCV_05bc1_gLCD_SSD1306_buffered1__DRAM5[FCVsz_05bc1_gLCD_SSD1306_buffered1__DRAM5];
MX_GLOBAL MX_UINT8 FCV_05bc1_gLCD_SSD1306_buffered1__INVERTED = (0x0);
MX_GLOBAL MX_UINT8 FCV_05bc1_gLCD_SSD1306_buffered1__DRAM4[FCVsz_05bc1_gLCD_SSD1306_buffered1__DRAM4];
MX_GLOBAL MX_UINT8 FCV_05bc1_gLCD_SSD1306_buffered1__DRAM3[FCVsz_05bc1_gLCD_SSD1306_buffered1__DRAM3];
MX_GLOBAL MX_UINT8 FCV_05bc1_gLCD_SSD1306_buffered1__DRAM2[FCVsz_05bc1_gLCD_SSD1306_buffered1__DRAM2];
MX_GLOBAL MX_UINT8 FCV_05bc1_gLCD_SSD1306_buffered1__DRAM1[FCVsz_05bc1_gLCD_SSD1306_buffered1__DRAM1];
MX_GLOBAL MX_UINT8 FCV_05bc1_gLCD_SSD1306_buffered1__DRAM0[FCVsz_05bc1_gLCD_SSD1306_buffered1__DRAM0];

void FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(MX_UINT8 FCL_COMMAND);
void FCD_05bc1_gLCD_SSD1306_buffered1__PrintNumber(MX_SINT16 FCL_NUMBER, MX_UINT16 FCL_X, MX_UINT16 FCL_Y, MX_UINT8 FCL_FONT, MX_UINT8 FCL_TRANSPARENT);
void FCD_05bc1_gLCD_SSD1306_buffered1__DrawLine(MX_UINT16 FCL_X1, MX_UINT16 FCL_Y1, MX_UINT16 FCL_X2, MX_UINT16 FCL_Y2);
void FCD_05bc1_gLCD_SSD1306_buffered1__Plot(MX_UINT16 FCL_X1, MX_UINT16 FCL_Y1);
void FCD_05bc1_gLCD_SSD1306_buffered1__Goto_XY(MX_UINT8 FCL_X, MX_UINT8 FCL_Y);
void FCD_05bc1_gLCD_SSD1306_buffered1__ControlDisplay(MX_UINT8 FCL_CONTROL);
void FCD_05bc1_gLCD_SSD1306_buffered1__SendByte(MX_UINT8 FCL_DATA);
void FCD_05bc1_gLCD_SSD1306_buffered1__SendData(MX_UINT8 FCL_BYTE);
void FCD_05bc1_gLCD_SSD1306_buffered1__SetDisplayOrientation(MX_UINT8 FCL_ORIENTATION);
void FCD_05bc1_gLCD_SSD1306_buffered1__BPlot(MX_UINT16 FCL_X1, MX_UINT16 FCL_Y1);
void FCD_05bc1_gLCD_SSD1306_buffered1__Print(MX_CHAR *FCL_STR, MX_UINT16 FCLsz_STR, MX_UINT16 FCL_X1, MX_UINT16 FCL_Y1, MX_UINT8 FCL_FONT, MX_UINT8 FCL_TRANSPARENT);
void FCD_05bc1_gLCD_SSD1306_buffered1__ControlContrast(MX_UINT8 FCL_CONTRAST);
void FCD_05bc1_gLCD_SSD1306_buffered1__ClearDisplay();
void FCD_05bc1_gLCD_SSD1306_buffered1__SetBackgroundColour(MX_UINT8 FCL_PIXELCOLOUR);
void FCD_05bc1_gLCD_SSD1306_buffered1__SetForegroundColour(MX_UINT8 FCL_PIXELCOLOUR);
void FCD_05bc1_gLCD_SSD1306_buffered1__DrawRectangle(MX_UINT16 FCL_X1, MX_UINT16 FCL_Y1, MX_UINT16 FCL_X2, MX_UINT16 FCL_Y2, MX_UINT8 FCL_TRANSPARENT, MX_UINT8 FCL_SOLID);
void FCD_05bc1_gLCD_SSD1306_buffered1__Initialise();
void FCD_05bc1_gLCD_SSD1306_buffered1__InvertDisplay();

/*========================================================================*\
   Use :Include the chip adaption layer
\*========================================================================*/
#include "C:\Program Files (x86)\Flowcode 6\CAL\includes.c"


/*========================================================================*\
   Use :InjectorBase1
       :Macro implementations
\*========================================================================*/

/*========================================================================*\
   Use :dash_IO_flasher1
       :Macro implementations
\*========================================================================*/

/*========================================================================*\
   Use :COMPort1
       :Macro implementations
\*========================================================================*/

/*========================================================================*\
   Use :fcdhelper
       :Macro implementations
\*========================================================================*/

/*========================================================================*\
   Use :cal_uart
       :Macro implementations
\*========================================================================*/
/*=----------------------------------------------------------------------=*\
   Use :Parameters for macro Prv_TextConsole:
       :  Str[20] : MX_CHAR (by-ref)
\*=----------------------------------------------------------------------=*/
void FCD_05481_cal_uart__Prv_TextConsole(MX_CHAR *FCL_STR, MX_UINT16 FCLsz_STR)
{


}


/*========================================================================*\
   Use :ModbusMaster1
       :Macro implementations
\*========================================================================*/
/*=----------------------------------------------------------------------=*\
   Use :This command requests the analogue holding register values starting from the start RegAddress and going through to RegAddress plus RegCount.
       :Returns 0 for success, 1 for CRC fail and 255 for no reply.
       :
       :Parameters for macro ReadHoldingRegister:
       :  SlaveID : The ID of the MODBUS slave
       :  RegAddress : Address: 0=40001, 1=40002, ...
       :  RegCount : Number of consecutive registers to read, starting from RegAddress
       :
       :Returns : MX_UINT8
\*=----------------------------------------------------------------------=*/
MX_UINT8 FCD_0cc41_ModbusMaster1__ReadHoldingRegister(MX_UINT16 FCL_SLAVEID, MX_UINT16 FCL_REGADDRESS, MX_UINT16 FCL_REGCOUNT)
{
	//Local variable definitions
	MX_UINT16 FCL_CRC = (0xffff);
	MX_UINT8 FCR_RETVAL;


	#if (0) // 0 == 1

	//Code has been optimised out by the pre-processor
	// #else

	#endif

	#if (0) // 1 > 1

	//Code has been optimised out by the pre-processor
	// #else

	#endif

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_SLAVEID, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(0x03, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_REGADDRESS >> 8, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_REGADDRESS, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_REGCOUNT >> 8, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_REGCOUNT, FCL_CRC);

	#if (0) // 0 == 1

	//Code has been optimised out by the pre-processor
	#else

		FC_CAL_UART_Send_1(FCL_CRC & 0xFF);

		FC_CAL_UART_Send_1(FCL_CRC >> 8);

	#endif

	FCR_RETVAL = FCD_0cc41_ModbusMaster1__GetResponse();

	return (FCR_RETVAL);

}

/*=----------------------------------------------------------------------=*\
   Use :This command writes the contents of a discrete coil at the location CoilAddress.
       :Returns 0 for success, 1 for CRC fail and 255 for no reply.
       :
       :Parameters for macro ForceSingleCoil:
       :  SlaveID : The ID of the MODBUS slave
       :  CoilAddress : Coil Address: 0=Coil1, 1=Coil2, 2=Coil3, ...
       :  CoilState : 0=Off, 1=On
       :
       :Returns : MX_UINT8
\*=----------------------------------------------------------------------=*/
MX_UINT8 FCD_0cc41_ModbusMaster1__ForceSingleCoil(MX_UINT16 FCL_SLAVEID, MX_UINT16 FCL_COILADDRESS, MX_UINT8 FCL_COILSTATE)
{
	//Local variable definitions
	MX_UINT16 FCL_CRC = (0xffff);
	MX_UINT8 FCR_RETVAL;


	#if (0) // 0 == 1

	//Code has been optimised out by the pre-processor
	// #else

	#endif

	#if (0) // 1 > 1

	//Code has been optimised out by the pre-processor
	// #else

	#endif

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_SLAVEID, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(0x05, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_COILADDRESS >> 8, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_COILADDRESS, FCL_CRC);

	if (FCL_COILSTATE)
	{

		FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(0xFF, FCL_CRC);

		FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(0x00, FCL_CRC);

	} else {

		FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(0x00, FCL_CRC);

		FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(0x00, FCL_CRC);

	}

	#if (0) // 0 == 1

	//Code has been optimised out by the pre-processor
	#else

		FC_CAL_UART_Send_1(FCL_CRC & 0xFF);

		FC_CAL_UART_Send_1(FCL_CRC >> 8);

	#endif

	FCR_RETVAL = FCD_0cc41_ModbusMaster1__GetResponse();

	return (FCR_RETVAL);

}

/*=----------------------------------------------------------------------=*\
   Use :Collects as much incoming data as possible and stored into the response buffer. The number of bytes received will be stored into location 0 of the response buffer.
       :Return value indicates validity of incoming CRC. 0 = OK, 1 = CRC fail, 255 = No Data
       :
       :Returns : MX_UINT8
\*=----------------------------------------------------------------------=*/
MX_UINT8 FCD_0cc41_ModbusMaster1__GetResponse()
{
	//Local variable definitions
	MX_UINT8 FCL_IN;
	MX_UINT8 FCL_INDEX = (0x0);
	MX_UINT16 FCL_CRC = (0xffff);
	MX_UINT8 FCL_BIT;
	MX_UINT16 FCL_CRCTEST;
	MX_UINT8 FCR_RETVAL;


	#if (0) // 0 == 1

	//Code has been optimised out by the pre-processor
	// #else

	#endif

	FCV_0cc41_ModbusMaster1__RESPONSEBUFFER[0] = 0;

	while (1)
	{

		FCL_IN = FC_CAL_UART_Receive_1(120);

		if (FCL_IN < 255)
		{

			FCV_0cc41_ModbusMaster1__RESPONSEBUFFER[0] = FCV_0cc41_ModbusMaster1__RESPONSEBUFFER[0] + 1;

			FCL_INDEX = FCL_INDEX + 1;

			FCV_0cc41_ModbusMaster1__RESPONSEBUFFER[FCL_INDEX] = FCL_IN;

		} else {

			goto FCC_GetResponse_A;

		}


		if ((FCL_INDEX < 50) == 0) break;
	}

FCC_GetResponse_A:
;

	if (FCV_0cc41_ModbusMaster1__RESPONSEBUFFER[0] >= 2)
	{

		FCV_0cc41_ModbusMaster1__RESPONSEBUFFER[0] = FCV_0cc41_ModbusMaster1__RESPONSEBUFFER[0] - 2;

		FCL_INDEX = 0;

		while (FCL_INDEX < FCV_0cc41_ModbusMaster1__RESPONSEBUFFER[0])
		{

			FCL_INDEX = FCL_INDEX + 1;

			FCL_CRC = FCL_CRC ^ FCV_0cc41_ModbusMaster1__RESPONSEBUFFER[FCL_INDEX];

			for (FCLV_LOOP1=0; (FCLV_LOOP1)<(8); (FCLV_LOOP1)++)
			{

				FCL_BIT = FCL_CRC & 0x01;

				FCL_CRC = FCL_CRC >> 1;

				if (FCL_BIT)
				{

					FCL_CRC = FCL_CRC ^ 0xA001;

				} else {

					#if 0 // Disabled code
					FCL_CRC = FCL_CRC & 0x7FFF;

					#endif // #if 0: Disabled code
				}


			}


		}

		FCL_CRCTEST = (FCV_0cc41_ModbusMaster1__RESPONSEBUFFER[FCL_INDEX] << 8) + FCV_0cc41_ModbusMaster1__RESPONSEBUFFER[FCL_INDEX + 1];

		if ((FCL_CRCTEST & 0xFF) == (FCL_CRC & 0xFF))
		{

			FCR_RETVAL = 0;

		} else {

			FCR_RETVAL = 1;

		}

	} else {

		FCR_RETVAL = 255;

	}

	#if (0) // 0 == 1

	//Code has been optimised out by the pre-processor
	// #else

	#endif

	return (FCR_RETVAL);

}

/*=----------------------------------------------------------------------=*\
   Use :This command requests the ON/OFF status of discrete coils starting from the start CoilAddress and going through to CoilAddress plus CoilCount.
       :Returns 0 for success, 1 for CRC fail and 255 for no reply.
       :
       :Parameters for macro ReadCoilStatus:
       :  SlaveID : The ID of the MODBUS slave
       :  CoilAddress : Coil Address: 0=Coil1, 1=Coil2, 2=Coil3, ...
       :  CoilCount : Number of consecutive coils to try and read
       :
       :Returns : MX_UINT8
\*=----------------------------------------------------------------------=*/
MX_UINT8 FCD_0cc41_ModbusMaster1__ReadCoilStatus(MX_UINT16 FCL_SLAVEID, MX_UINT16 FCL_COILADDRESS, MX_UINT16 FCL_COILCOUNT)
{
	//Local variable definitions
	MX_UINT16 FCL_CRC = (0xffff);
	MX_UINT8 FCR_RETVAL;


	#if (0) // 0 == 1

	//Code has been optimised out by the pre-processor
	// #else

	#endif

	#if (0) // 1 > 1

	//Code has been optimised out by the pre-processor
	// #else

	#endif

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_SLAVEID, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(0x01, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_COILADDRESS >> 8, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_COILADDRESS, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_COILCOUNT >> 8, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_COILCOUNT, FCL_CRC);

	#if (0) // 0 == 1

	//Code has been optimised out by the pre-processor
	#else

		FC_CAL_UART_Send_1(FCL_CRC & 0xFF);

		FC_CAL_UART_Send_1(FCL_CRC >> 8);

	#endif

	FCR_RETVAL = FCD_0cc41_ModbusMaster1__GetResponse();

	return (FCR_RETVAL);

}

/*=----------------------------------------------------------------------=*\
   Use :Reads a byte from the last received response. The Index parametes specifies which byte to read back.
       :
       :Parameters for macro GetResponseByte:
       :  Index : 0=NumBytes, 1=SlaveAddress, 2=FunctionCode/ExceptionCode, .....
       :
       :Returns : MX_UINT8
\*=----------------------------------------------------------------------=*/
MX_UINT8 FCD_0cc41_ModbusMaster1__GetResponseByte(MX_UINT8 FCL_INDEX)
{
	//Local variable definitions
	MX_UINT8 FCR_RETVAL;


	FCR_RETVAL = FCV_0cc41_ModbusMaster1__RESPONSEBUFFER[FCL_INDEX];

	return (FCR_RETVAL);

}

/*=----------------------------------------------------------------------=*\
   Use :This command requests the ON/OFF status of discrete inputs starting from the start DataAddress and going through to DataAddress plus DataCount.
       :Returns 0 for success, 1 for CRC fail and 255 for no reply.
       :
       :Parameters for macro ReadInputStatus:
       :  SlaveID : The ID of the MODBUS slave
       :  DataAddress : Input Address: 0=10001, 1=10002, 2=10003, ...
       :  DataCount : Number of consecutive inputs to read, starting from RegAddress
       :
       :Returns : MX_UINT8
\*=----------------------------------------------------------------------=*/
MX_UINT8 FCD_0cc41_ModbusMaster1__ReadInputStatus(MX_UINT16 FCL_SLAVEID, MX_UINT16 FCL_DATAADDRESS, MX_UINT16 FCL_DATACOUNT)
{
	//Local variable definitions
	MX_UINT16 FCL_CRC = (0xffff);
	MX_UINT8 FCR_RETVAL;


	#if (0) // 0 == 1

	//Code has been optimised out by the pre-processor
	// #else

	#endif

	#if (0) // 1 > 1

	//Code has been optimised out by the pre-processor
	// #else

	#endif

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_SLAVEID, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(0x02, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_DATAADDRESS >> 8, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_DATAADDRESS, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_DATACOUNT >> 8, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_DATACOUNT, FCL_CRC);

	#if (0) // 0 == 1

	//Code has been optimised out by the pre-processor
	#else

		FC_CAL_UART_Send_1(FCL_CRC & 0xFF);

		FC_CAL_UART_Send_1(FCL_CRC >> 8);

	#endif

	FCR_RETVAL = FCD_0cc41_ModbusMaster1__GetResponse();

	return (FCR_RETVAL);

}

/*=----------------------------------------------------------------------=*\
   Use :Parameters for macro SendValueAsASCII:
       :  Value : Value to break up into ASCII characters
\*=----------------------------------------------------------------------=*/
void FCD_0cc41_ModbusMaster1__SendValueAsASCII(MX_UINT8 FCL_VALUE)
{
	//Local variable definitions
	MX_UINT8 FCL_CHARACTER;


	FCV_0cc41_ModbusMaster1__SUM = FCV_0cc41_ModbusMaster1__SUM + FCL_VALUE;

	FCL_CHARACTER = (FCL_VALUE & 0xF0) >> 4;

	if (FCL_CHARACTER > 9)
	{

		FCL_CHARACTER = FCL_CHARACTER + 'A';

	} else {

		FCL_CHARACTER = FCL_CHARACTER + '0';

	}

	FC_CAL_UART_Send_1(FCL_CHARACTER);

	FCL_CHARACTER = FCL_VALUE & 0x0F;

	if (FCL_CHARACTER > 9)
	{

		FCL_CHARACTER = FCL_CHARACTER + 'A';

	} else {

		FCL_CHARACTER = FCL_CHARACTER + '0';

	}

	FC_CAL_UART_Send_1(FCL_CHARACTER);

}

/*=----------------------------------------------------------------------=*\
   Use :This command writes the contents of a analogue output holding registerl at the location RegAddress.
       :Returns 0 for success, 1 for CRC fail and 255 for no reply.
       :
       :Parameters for macro PresetSingleRegister:
       :  SlaveID : The ID of the MODBUS slave
       :  RegAddress : Address: 0=40001, 1=40002, ...
       :  RegValue : Value to send to the selected register
       :
       :Returns : MX_UINT8
\*=----------------------------------------------------------------------=*/
MX_UINT8 FCD_0cc41_ModbusMaster1__PresetSingleRegister(MX_UINT16 FCL_SLAVEID, MX_UINT16 FCL_REGADDRESS, MX_UINT16 FCL_REGVALUE)
{
	//Local variable definitions
	MX_UINT16 FCL_CRC = (0xffff);
	MX_UINT8 FCR_RETVAL;


	#if (0) // 0 == 1

	//Code has been optimised out by the pre-processor
	// #else

	#endif

	#if (0) // 1 > 1

	//Code has been optimised out by the pre-processor
	// #else

	#endif

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_SLAVEID, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(0x06, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_REGADDRESS >> 8, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_REGADDRESS, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_REGVALUE >> 8, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_REGVALUE, FCL_CRC);

	#if (0) // 0 == 1

	//Code has been optimised out by the pre-processor
	#else

		FC_CAL_UART_Send_1(FCL_CRC & 0xFF);

		FC_CAL_UART_Send_1(FCL_CRC >> 8);

	#endif

	FCR_RETVAL = FCD_0cc41_ModbusMaster1__GetResponse();

	return (FCR_RETVAL);

}

/*=----------------------------------------------------------------------=*\
   Use :This command requests the analogue input register values starting from the start RegAddress and going through to RegAddress plus RegCount.
       :Returns 0 for success, 1 for CRC fail and 255 for no reply.
       :
       :Parameters for macro ReadInputRegister:
       :  SlaveID : The ID of the MODBUS slave
       :  RegAddress : Input Address: 0=10001, 1=10002, 2=10003, ...
       :  RegCount : Number of consecutive inputs to read, starting from RegAddress
       :
       :Returns : MX_UINT8
\*=----------------------------------------------------------------------=*/
MX_UINT8 FCD_0cc41_ModbusMaster1__ReadInputRegister(MX_UINT16 FCL_SLAVEID, MX_UINT16 FCL_REGADDRESS, MX_UINT16 FCL_REGCOUNT)
{
	//Local variable definitions
	MX_UINT16 FCL_CRC = (0xffff);
	MX_UINT8 FCR_RETVAL;


	#if (0) // 0 == 1

	//Code has been optimised out by the pre-processor
	// #else

	#endif

	#if (0) // 1 > 1

	//Code has been optimised out by the pre-processor
	// #else

	#endif

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_SLAVEID, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(0x04, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_REGADDRESS >> 8, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_REGADDRESS, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_REGCOUNT >> 8, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_REGCOUNT, FCL_CRC);

	#if (0) // 0 == 1

	//Code has been optimised out by the pre-processor
	#else

		FC_CAL_UART_Send_1(FCL_CRC & 0xFF);

		FC_CAL_UART_Send_1(FCL_CRC >> 8);

	#endif

	FCR_RETVAL = FCD_0cc41_ModbusMaster1__GetResponse();

	return (FCR_RETVAL);

}

/*=----------------------------------------------------------------------=*\
   Use :Transmits a databyte to the bus and calculates the current value of the CRC, returns the CRC updated with the new data byte.
       :
       :Parameters for macro SendAndCalcCRC16:
       :  DataByte : MX_UINT8
       :  CRC16 : MX_UINT16
       :
       :Returns : MX_UINT16
\*=----------------------------------------------------------------------=*/
MX_UINT16 FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(MX_UINT8 FCL_DATABYTE, MX_UINT16 FCL_CRC16)
{
	//Local variable definitions
	MX_UINT8 FCL_BIT;
	MX_UINT16 FCR_RETVAL;


	#if (0) // 0 == 1

	//Code has been optimised out by the pre-processor
	#else

		FCL_CRC16 = FCL_CRC16 ^ FCL_DATABYTE;

		FC_CAL_UART_Send_1(FCL_DATABYTE);

		for (FCLV_LOOP4=0; (FCLV_LOOP4)<(8); (FCLV_LOOP4)++)
		{

			FCL_BIT = FCL_CRC16 & 0x01;

			FCL_CRC16 = FCL_CRC16 >> 1;

			if (FCL_BIT)
			{

				FCL_CRC16 = FCL_CRC16 & 0x7FFF;
				FCL_CRC16 = FCL_CRC16 ^ 0xA001;

			} else {

				FCL_CRC16 = FCL_CRC16 & 0x7FFF;

			}


		}

		FCR_RETVAL = FCL_CRC16;

	#endif

	return (FCR_RETVAL);

}

/*=----------------------------------------------------------------------=*\
   Use :This command writes the contents of several analogue output holding registers starting at the location RegAddress through to location RegAddress + RegCount .
       :Returns 0 for success, 1 for CRC fail and 255 for no reply.
       :
       :Parameters for macro PresetMultipleRegisters:
       :  SlaveID : The ID of the MODBUS slave
       :  RegAddress : Address: 0=40001, 1=40002, ...
       :  RegCount : Number of consecutive registers to write, starting from RegAddress
       :  RegValue[10] : Array of values to send to the registers
       :
       :Returns : MX_UINT8
\*=----------------------------------------------------------------------=*/
MX_UINT8 FCD_0cc41_ModbusMaster1__PresetMultipleRegisters(MX_UINT16 FCL_SLAVEID, MX_UINT16 FCL_REGADDRESS, MX_UINT16 FCL_REGCOUNT, MX_UINT16 *FCL_REGVALUE, MX_UINT16 FCLsz_REGVALUE)
{
	//Local variable definitions
	MX_UINT16 FCL_CRC = (0xffff);
	MX_UINT8 FCL_BYTECOUNT;
	MX_UINT8 FCL_INDEX = (0x0);
	MX_UINT8 FCR_RETVAL;


	#if (0) // 0 == 1

	//Code has been optimised out by the pre-processor
	// #else

	#endif

	#if (0) // 1 > 1

	//Code has been optimised out by the pre-processor
	// #else

	#endif

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_SLAVEID, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(0x10, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_REGADDRESS >> 8, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_REGADDRESS, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_REGCOUNT >> 8, FCL_CRC);

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_REGCOUNT, FCL_CRC);

	FCL_BYTECOUNT = FCL_REGCOUNT * 2;

	FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_BYTECOUNT, FCL_CRC);

	while (FCL_INDEX < FCL_REGCOUNT)
	{

		FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_REGVALUE[FCL_INDEX] >> 8, FCL_CRC);

		FCL_CRC = FCD_0cc41_ModbusMaster1__SendAndCalcCRC16(FCL_REGVALUE[FCL_INDEX], FCL_CRC);

		FCL_INDEX = FCL_INDEX + 1;


	}

	#if (0) // 0 == 1

	//Code has been optimised out by the pre-processor
	#else

		FC_CAL_UART_Send_1(FCL_CRC & 0xFF);

		FC_CAL_UART_Send_1(FCL_CRC >> 8);

	#endif

	FCR_RETVAL = FCD_0cc41_ModbusMaster1__GetResponse();

	return (FCR_RETVAL);

}

/*=----------------------------------------------------------------------=*\
   Use :Starts up the UART to allow communications
\*=----------------------------------------------------------------------=*/
void FCD_0cc41_ModbusMaster1__Initialise()
{

	#if (0) // 0 == 1

	//Code has been optimised out by the pre-processor
	// #else

	#endif

	FC_CAL_UART_Init_1();

}


/*========================================================================*\
   Use :ASCII6
       :Macro implementations
\*========================================================================*/

/*========================================================================*\
   Use :ASCII7
       :Macro implementations
\*========================================================================*/

/*========================================================================*\
   Use :ASCII5
       :Macro implementations
\*========================================================================*/

/*========================================================================*\
   Use :ASCII4
       :Macro implementations
\*========================================================================*/

/*========================================================================*\
   Use :ASCII3
       :Macro implementations
\*========================================================================*/

/*========================================================================*\
   Use :ASCII2
       :Macro implementations
\*========================================================================*/

/*========================================================================*\
   Use :ASCII1
       :Macro implementations
\*========================================================================*/

/*========================================================================*\
   Use :ASCII0
       :Macro implementations
\*========================================================================*/

/*========================================================================*\
   Use :Base_GLCD
       :Macro implementations
\*========================================================================*/
/*=----------------------------------------------------------------------=*\
   Use :Gets a byte of the embedded ASCII font data.
       :
       :Parameters for macro ReadASCIILUT:
       :  pos_str : ASCII position -32 so A = 'A' - 32 = 33
       :  count : Font column Ranging 0-4
       :
       :Returns : MX_UINT8
\*=----------------------------------------------------------------------=*/
MX_UINT8 FCD_0ba71_Base_GLCD__ReadASCIILUT(MX_UINT8 FCL_POS_STR, MX_UINT8 FCL_COUNT)
{
	//Local variable definitions
	MX_UINT8 FCL_POSITION;
	MX_UINT8 FCR_RETVAL;


	#if (1) // 1 == 1

		FCL_POSITION = FCL_POS_STR / 12;

		switch (FCL_POSITION)
		{
			case 0:
			{
				FCL_POSITION = (FCL_POS_STR * 5) + FCL_COUNT;

				FCR_RETVAL = FCD_00fb1_ASCII0__INTLIST(FCL_POSITION);

				break;
			}
			case 1:
			{
				FCL_POSITION = ((FCL_POS_STR - 12) * 5) + FCL_COUNT;

				FCR_RETVAL = FCD_00fb2_ASCII1__INTLIST(FCL_POSITION);

				break;
			}
			case 2:
			{
				FCL_POSITION = ((FCL_POS_STR - 24) * 5) + FCL_COUNT;

				FCR_RETVAL = FCD_00fb3_ASCII2__INTLIST(FCL_POSITION);

				break;
			}
			case 3:
			{
				FCL_POSITION = ((FCL_POS_STR - 36) * 5) + FCL_COUNT;

				FCR_RETVAL = FCD_00fb4_ASCII3__INTLIST(FCL_POSITION);

				break;
			}
			case 4:
			{
				FCL_POSITION = ((FCL_POS_STR - 48) * 5) + FCL_COUNT;

				FCR_RETVAL = FCD_00fb5_ASCII4__INTLIST(FCL_POSITION);

				break;
			}
			case 5:
			{
				FCL_POSITION = ((FCL_POS_STR - 60) * 5) + FCL_COUNT;

				FCR_RETVAL = FCD_00fb6_ASCII5__INTLIST(FCL_POSITION);

				break;
			}
			case 6:
			{
				FCL_POSITION = ((FCL_POS_STR - 72) * 5) + FCL_COUNT;

				FCR_RETVAL = FCD_00fb8_ASCII6__INTLIST(FCL_POSITION);

				break;
			}
			case 7:
			{
				FCL_POSITION = ((FCL_POS_STR - 84) * 5) + FCL_COUNT;

				FCR_RETVAL = FCD_00fb7_ASCII7__INTLIST(FCL_POSITION);

				break;
			}
			default:
			{
				FCR_RETVAL = 0;

				FCR_RETVAL = 0xaa;

			}
		}

	// #else

	//Code has been optimised out by the pre-processor
	#endif

	return (FCR_RETVAL);

}


/*========================================================================*\
   Use :gLCD_SSD1306_buffered1
       :Macro implementations
\*========================================================================*/
/*=----------------------------------------------------------------------=*\
   Use :Parameters for macro SendCommand:
       :  Command : MX_UINT8
\*=----------------------------------------------------------------------=*/
void FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(MX_UINT8 FCL_COMMAND)
{

	FCP_SET(B, C, 0x10, 0x4, 0);
	FCP_SET(B, C, 0x4, 0x2, 0);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendByte(FCL_COMMAND);

	FCP_SET(B, C, 0x4, 0x2, 1);

}

/*=----------------------------------------------------------------------=*\
   Use :This macro prints a decimal number to the Graphical LCD.
       :
       :Parameters for macro PrintNumber:
       :  Number : Byte or Integer number to send to the display.
       :  X : X pixel coordinate to set the output string position.
       :  Y : Y pixel coordinate to set the output string position.
       :  Font : Size of the font - 0 = Normal, 1 = Double Width, 2 = Double Width and Height, 3 = Double Height
       :  Transparent : Specifies if the background of the text is drawn - 0 = Background colour is drawn, 1 = Background colour not drawn.
\*=----------------------------------------------------------------------=*/
void FCD_05bc1_gLCD_SSD1306_buffered1__PrintNumber(MX_SINT16 FCL_NUMBER, MX_UINT16 FCL_X, MX_UINT16 FCL_Y, MX_UINT8 FCL_FONT, MX_UINT8 FCL_TRANSPARENT)
{
	//Local variable definitions
	#define FCLsz_TEMP 6
	MX_CHAR FCL_TEMP[FCLsz_TEMP];


	FCI_TOSTRING(FCL_NUMBER, FCL_TEMP,6);

	FCD_05bc1_gLCD_SSD1306_buffered1__Print(FCL_TEMP, FCLsz_TEMP, FCL_X, FCL_Y, FCL_FONT, FCL_TRANSPARENT);

	//Local variable definitions
	#undef FCLsz_TEMP
}

/*=----------------------------------------------------------------------=*\
   Use :Draws a line with the current foreground colour from pixel location X1, Y1 to pixel location X2, Y2.
       :
       :Parameters for macro DrawLine:
       :  X1 : MX_UINT16
       :  Y1 : MX_UINT16
       :  X2 : MX_UINT16
       :  Y2 : MX_UINT16
\*=----------------------------------------------------------------------=*/
void FCD_05bc1_gLCD_SSD1306_buffered1__DrawLine(MX_UINT16 FCL_X1, MX_UINT16 FCL_Y1, MX_UINT16 FCL_X2, MX_UINT16 FCL_Y2)
{
	//Local variable definitions
	MX_SINT16 FCL_C1;
	MX_SINT16 FCL_M1;
	MX_SINT16 FCL_D1 = (0);
	MX_SINT16 FCL_PIXELX;
	MX_SINT16 FCL_PIXELY;
	MX_SINT16 FCL_YINC = (1);
	MX_SINT16 FCL_XINC = (1);
	MX_SINT16 FCL_X;
	MX_SINT16 FCL_Y;


	FCL_PIXELX = FCL_X2 - FCL_X1;
	FCL_PIXELY = FCL_Y2 - FCL_Y1;

	FCL_X = FCL_X1;
	FCL_Y = FCL_Y1;

	if (FCL_PIXELX < 0)
	{

		FCL_XINC = -1;
		FCL_PIXELX = FCL_PIXELX * -1;

	// } else {

	}

	if (FCL_PIXELY < 0)
	{

		FCL_YINC = -1;
		FCL_PIXELY = FCL_PIXELY * -1;

	// } else {

	}

	if (FCL_PIXELY <= FCL_PIXELX)
	{

		FCL_C1 = 2 * FCL_PIXELX;
		FCL_M1 = 2 * FCL_PIXELY;

		while (FCL_X != FCL_X2)
		{

			FCD_05bc1_gLCD_SSD1306_buffered1__Plot(FCL_X, FCL_Y);

			FCL_X = FCL_X + FCL_XINC;

			FCL_D1 = FCL_D1 + FCL_M1;

			if (FCL_D1 > FCL_PIXELX)
			{

				FCL_Y = FCL_Y + FCL_YINC;

				FCL_D1 = FCL_D1 - FCL_C1;

			// } else {

			}


		}

	} else {

		FCL_C1 = 2 * FCL_PIXELY;
		FCL_M1 = 2 * FCL_PIXELX;

		while (FCL_Y != FCL_Y2)
		{

			FCD_05bc1_gLCD_SSD1306_buffered1__Plot(FCL_X, FCL_Y);

			FCL_Y = FCL_Y + FCL_YINC;

			FCL_D1 = FCL_D1 + FCL_M1;

			if (FCL_D1 > FCL_PIXELY)
			{

				FCL_X = FCL_X + FCL_XINC;

				FCL_D1 = FCL_D1 - FCL_C1;

			// } else {

			}


		}

	}

	FCD_05bc1_gLCD_SSD1306_buffered1__Plot(FCL_X, FCL_Y);

}

/*=----------------------------------------------------------------------=*\
   Use :Sets a pixel with the current foreground colour at pixel location X, Y.
       :
       :Parameters for macro Plot:
       :  X1 : MX_UINT16
       :  Y1 : MX_UINT16
\*=----------------------------------------------------------------------=*/
void FCD_05bc1_gLCD_SSD1306_buffered1__Plot(MX_UINT16 FCL_X1, MX_UINT16 FCL_Y1)
{
	//Local variable definitions
	MX_UINT16 FCL_TEMP;
	MX_UINT8 FCL_DATA;
	MX_UINT8 FCL_MOD_Y;
	MX_UINT8 FCL_OLD_DATA;


	switch (FCV_05bc1_gLCD_SSD1306_buffered1__ORIENTATION)
	{
		case 1:
		{
			FCL_TEMP = 128 - FCL_Y1;
			FCL_Y1 = FCL_X1;
			FCL_X1 = FCL_TEMP;

			break;
		}
		case 2:
		{
			FCL_X1 = 128 - FCL_X1;
			FCL_Y1 = 32 - FCL_Y1;

			break;
		}
		case 3:
		{
			FCL_TEMP = FCL_Y1;
			FCL_Y1 = 32 - FCL_X1;
			FCL_X1 = FCL_TEMP;

			break;
		}
		// default:

	}

	FCL_MOD_Y = FCL_Y1 & 0x07;

	switch (FCL_Y1 >> 3)
	{
		case 1:
		{
			FCL_DATA = FCV_05bc1_gLCD_SSD1306_buffered1__DRAM1[FCL_X1];

			break;
		}
		case 2:
		{
			FCL_DATA = FCV_05bc1_gLCD_SSD1306_buffered1__DRAM2[FCL_X1];

			break;
		}
		case 3:
		{
			FCL_DATA = FCV_05bc1_gLCD_SSD1306_buffered1__DRAM3[FCL_X1];

			break;
		}
		case 4:
		{
			FCL_DATA = FCV_05bc1_gLCD_SSD1306_buffered1__DRAM4[FCL_X1];

			break;
		}
		case 5:
		{
			FCL_DATA = FCV_05bc1_gLCD_SSD1306_buffered1__DRAM5[FCL_X1];

			break;
		}
		case 6:
		{
			FCL_DATA = FCV_05bc1_gLCD_SSD1306_buffered1__DRAM6[FCL_X1];

			break;
		}
		case 7:
		{
			FCL_DATA = FCV_05bc1_gLCD_SSD1306_buffered1__DRAM7[FCL_X1];

			break;
		}
		default:
		{
			FCL_DATA = FCV_05bc1_gLCD_SSD1306_buffered1__DRAM0[FCL_X1];

		}
	}

	FCL_OLD_DATA = FCL_DATA;

	if (FCV_05bc1_gLCD_SSD1306_buffered1__FOREGROUND_COL_VAR)
	{

		FCL_DATA = FCL_DATA | (0x01 << FCL_MOD_Y);

	} else {

		FCL_DATA = FCL_DATA & (~(0x01 << FCL_MOD_Y));

	}

	if (FCL_OLD_DATA == FCL_DATA)
	{

	} else {

		FCD_05bc1_gLCD_SSD1306_buffered1__Goto_XY(FCL_X1, FCL_Y1);

		FCD_05bc1_gLCD_SSD1306_buffered1__SendData(FCL_DATA);

		switch (FCL_Y1 >> 3)
		{
			case 1:
			{
				FCV_05bc1_gLCD_SSD1306_buffered1__DRAM1[FCL_X1] = FCL_DATA;

				break;
			}
			case 2:
			{
				FCV_05bc1_gLCD_SSD1306_buffered1__DRAM2[FCL_X1] = FCL_DATA;

				break;
			}
			case 3:
			{
				FCV_05bc1_gLCD_SSD1306_buffered1__DRAM3[FCL_X1] = FCL_DATA;

				break;
			}
			case 4:
			{
				FCV_05bc1_gLCD_SSD1306_buffered1__DRAM4[FCL_X1] = FCL_DATA;

				break;
			}
			case 5:
			{
				FCV_05bc1_gLCD_SSD1306_buffered1__DRAM5[FCL_X1] = FCL_DATA;

				break;
			}
			case 6:
			{
				FCV_05bc1_gLCD_SSD1306_buffered1__DRAM6[FCL_X1] = FCL_DATA;

				break;
			}
			case 7:
			{
				FCV_05bc1_gLCD_SSD1306_buffered1__DRAM7[FCL_X1] = FCL_DATA;

				break;
			}
			default:
			{
				FCV_05bc1_gLCD_SSD1306_buffered1__DRAM0[FCL_X1] = FCL_DATA;

			}
		}

	}

}

/*=----------------------------------------------------------------------=*\
   Use :Parameters for macro Goto_XY:
       :  X : MX_UINT8
       :  Y : MX_UINT8
\*=----------------------------------------------------------------------=*/
void FCD_05bc1_gLCD_SSD1306_buffered1__Goto_XY(MX_UINT8 FCL_X, MX_UINT8 FCL_Y)
{
	//Local variable definitions
	MX_UINT8 FCL_CHIP;
	MX_UINT8 FCL_CMD;


	FCV_05bc1_gLCD_SSD1306_buffered1__CURRENTX = FCL_X;
	FCV_05bc1_gLCD_SSD1306_buffered1__CURRENTY = FCL_Y;
	FCV_05bc1_gLCD_SSD1306_buffered1__PAGE = FCL_Y >> 3;

	#if (0) // 128 < 128

	//Code has been optimised out by the pre-processor
	// #else

	#endif

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0xb0 | FCV_05bc1_gLCD_SSD1306_buffered1__PAGE);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0x10 | (FCV_05bc1_gLCD_SSD1306_buffered1__CURRENTX >> 4));

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(FCV_05bc1_gLCD_SSD1306_buffered1__CURRENTX & 0x0F);

}

/*=----------------------------------------------------------------------=*\
   Use :Allows the display to be switched on and off
       :
       :Parameters for macro ControlDisplay:
       :  Control : 0=Off, 1=On
\*=----------------------------------------------------------------------=*/
void FCD_05bc1_gLCD_SSD1306_buffered1__ControlDisplay(MX_UINT8 FCL_CONTROL)
{

	if (FCL_CONTROL > 0)
	{

		FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0xAF);

	} else {

		FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0xAE);

	}

}

/*=----------------------------------------------------------------------=*\
   Use :Parameters for macro SendByte:
       :  Data : MX_UINT8
\*=----------------------------------------------------------------------=*/
void FCD_05bc1_gLCD_SSD1306_buffered1__SendByte(MX_UINT8 FCL_DATA)
{
	//Local variable definitions
	MX_UINT8 FCL_INDEX = (0x0);


	while (FCL_INDEX < 8)
	{

		FCP_SET(B, C, 0x20, 0x5, 0);

		if (FCL_DATA & (1 << (7 - FCL_INDEX)))
		{

			FCP_SET(B, C, 0x40, 0x6, 1);

		} else {

			FCP_SET(B, C, 0x40, 0x6, 0);

		}

		FCP_SET(B, C, 0x20, 0x5, 1);

		FCL_INDEX = FCL_INDEX + 1;


	}

}

/*=----------------------------------------------------------------------=*\
   Use :Parameters for macro SendData:
       :  Byte : MX_UINT8
\*=----------------------------------------------------------------------=*/
void FCD_05bc1_gLCD_SSD1306_buffered1__SendData(MX_UINT8 FCL_BYTE)
{

	FCP_SET(B, C, 0x10, 0x4, 1);
	FCP_SET(B, C, 0x4, 0x2, 0);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendByte(FCL_BYTE);

	FCP_SET(B, C, 0x4, 0x2, 1);

}

/*=----------------------------------------------------------------------=*\
   Use :Controls the way data is printed out on the display allowing multiple different viewing orientations. Default is 0.
       :
       :Parameters for macro SetDisplayOrientation:
       :  Orientation : 0=Default, 1=90??CW, 2=180??CW, 3=270??CW
\*=----------------------------------------------------------------------=*/
void FCD_05bc1_gLCD_SSD1306_buffered1__SetDisplayOrientation(MX_UINT8 FCL_ORIENTATION)
{

	FCV_05bc1_gLCD_SSD1306_buffered1__ORIENTATION = FCL_ORIENTATION;

}

/*=----------------------------------------------------------------------=*\
   Use :Sets a pixel with the current background colour at pixel location X, Y.
       :
       :Parameters for macro BPlot:
       :  X1 : MX_UINT16
       :  Y1 : MX_UINT16
\*=----------------------------------------------------------------------=*/
void FCD_05bc1_gLCD_SSD1306_buffered1__BPlot(MX_UINT16 FCL_X1, MX_UINT16 FCL_Y1)
{
	//Local variable definitions
	MX_UINT16 FCL_TEMP;
	MX_UINT8 FCL_MOD_Y;
	MX_UINT8 FCL_DATA;
	MX_UINT8 FCL_OLD_DATA;


	switch (FCV_05bc1_gLCD_SSD1306_buffered1__ORIENTATION)
	{
		case 1:
		{
			FCL_TEMP = 128 - FCL_Y1;
			FCL_Y1 = FCL_X1;
			FCL_X1 = FCL_TEMP;

			break;
		}
		case 2:
		{
			FCL_X1 = 128 - FCL_X1;
			FCL_Y1 = 32 - FCL_Y1;

			break;
		}
		case 3:
		{
			FCL_TEMP = FCL_Y1;
			FCL_Y1 = 32 - FCL_X1;
			FCL_X1 = FCL_TEMP;

			break;
		}
		// default:

	}

	FCL_MOD_Y = FCL_Y1 & 0x07;

	switch (FCL_Y1 >> 3)
	{
		case 1:
		{
			FCL_DATA = FCV_05bc1_gLCD_SSD1306_buffered1__DRAM1[FCL_X1];

			break;
		}
		case 2:
		{
			FCL_DATA = FCV_05bc1_gLCD_SSD1306_buffered1__DRAM2[FCL_X1];

			break;
		}
		case 3:
		{
			FCL_DATA = FCV_05bc1_gLCD_SSD1306_buffered1__DRAM3[FCL_X1];

			break;
		}
		case 4:
		{
			FCL_DATA = FCV_05bc1_gLCD_SSD1306_buffered1__DRAM4[FCL_X1];

			break;
		}
		case 5:
		{
			FCL_DATA = FCV_05bc1_gLCD_SSD1306_buffered1__DRAM5[FCL_X1];

			break;
		}
		case 6:
		{
			FCL_DATA = FCV_05bc1_gLCD_SSD1306_buffered1__DRAM6[FCL_X1];

			break;
		}
		case 7:
		{
			FCL_DATA = FCV_05bc1_gLCD_SSD1306_buffered1__DRAM7[FCL_X1];

			break;
		}
		default:
		{
			FCL_DATA = FCV_05bc1_gLCD_SSD1306_buffered1__DRAM0[FCL_X1];

		}
	}

	FCL_OLD_DATA = FCL_DATA;

	if (FCV_05bc1_gLCD_SSD1306_buffered1__BACKGROUND_COL_VAR)
	{

		FCL_DATA = FCL_DATA | (0x01 << FCL_MOD_Y);

	} else {

		FCL_DATA = FCL_DATA & (~(0x01 << FCL_MOD_Y));

	}

	if (FCL_OLD_DATA == FCL_DATA)
	{

	} else {

		FCD_05bc1_gLCD_SSD1306_buffered1__Goto_XY(FCL_X1, FCL_Y1);

		FCD_05bc1_gLCD_SSD1306_buffered1__SendData(FCL_DATA);

		switch (FCL_Y1 >> 3)
		{
			case 1:
			{
				FCV_05bc1_gLCD_SSD1306_buffered1__DRAM1[FCL_X1] = FCL_DATA;

				break;
			}
			case 2:
			{
				FCV_05bc1_gLCD_SSD1306_buffered1__DRAM2[FCL_X1] = FCL_DATA;

				break;
			}
			case 3:
			{
				FCV_05bc1_gLCD_SSD1306_buffered1__DRAM3[FCL_X1] = FCL_DATA;

				break;
			}
			case 4:
			{
				FCV_05bc1_gLCD_SSD1306_buffered1__DRAM4[FCL_X1] = FCL_DATA;

				break;
			}
			case 5:
			{
				FCV_05bc1_gLCD_SSD1306_buffered1__DRAM5[FCL_X1] = FCL_DATA;

				break;
			}
			case 6:
			{
				FCV_05bc1_gLCD_SSD1306_buffered1__DRAM6[FCL_X1] = FCL_DATA;

				break;
			}
			case 7:
			{
				FCV_05bc1_gLCD_SSD1306_buffered1__DRAM7[FCL_X1] = FCL_DATA;

				break;
			}
			default:
			{
				FCV_05bc1_gLCD_SSD1306_buffered1__DRAM0[FCL_X1] = FCL_DATA;

			}
		}

	}

}

/*=----------------------------------------------------------------------=*\
   Use :This macro prints a string of characters to the Graphical LCD.
       :
       :Parameters for macro Print:
       :  Str[20] : String of characters to send to the display.
       :  X1 : X pixel coordinate to set the output string position.
       :  Y1 : Y pixel coordinate to set the output string position.
       :  Font : Size of the font - 0 = Normal, 1 = Double Width, 2 = Double Width and Height, 3 = Double Height
       :  Transparent : Specifies if the background of the text is drawn - 0 = Background colour is drawn, 1 = Background colour not drawn.
\*=----------------------------------------------------------------------=*/
void FCD_05bc1_gLCD_SSD1306_buffered1__Print(MX_CHAR *FCL_STR, MX_UINT16 FCLsz_STR, MX_UINT16 FCL_X1, MX_UINT16 FCL_Y1, MX_UINT8 FCL_FONT, MX_UINT8 FCL_TRANSPARENT)
{
	//Local variable definitions
	MX_UINT8 FCL_XPIX;
	MX_UINT8 FCL_YPIX;
	MX_UINT8 FCL_POS_STR;
	MX_UINT8 FCL_LEN_STR;
	MX_UINT8 FCL_COUNT;
	MX_UINT8 FCL_XCOUNT;
	MX_UINT8 FCL_YCOUNT;
	MX_UINT8 FCL_HEIGHT;
	MX_UINT8 FCL_WIDTH;
	MX_UINT8 FCL_IDX;
	MX_UINT8 FCL_FONT_WIDTH = (0x1);
	MX_UINT8 FCL_FONT_HEIGHT = (0x1);
	MX_UINT8 FCL_POSITION;
	#define FCLsz_TEMP 6
	MX_UINT8 FCL_TEMP[FCLsz_TEMP];


	switch (FCL_FONT)
	{
		case 1:
		{
			FCL_FONT_WIDTH = 2;

			break;
		}
		case 2:
		{
			FCL_FONT_WIDTH = 2;
			FCL_FONT_HEIGHT = 2;

			break;
		}
		case 3:
		{
			FCL_FONT_HEIGHT = 2;

			break;
		}
		default:
		{
		}
	}

	FCL_XCOUNT = 0;
	FCL_IDX = 0;
	FCL_TEMP[5] = 0;

	FCL_LEN_STR = FCI_GETLENGTH(FCL_STR, FCLsz_STR);

	while (FCL_IDX < FCL_LEN_STR)
	{

		FCL_POS_STR = FCL_STR[FCL_IDX] - 32;

		FCL_COUNT = 0;

		while (FCL_COUNT < 5)
		{

			FCL_TEMP[FCL_COUNT] = FCD_0ba71_Base_GLCD__ReadASCIILUT(FCL_POS_STR, FCL_COUNT);

			FCL_COUNT = FCL_COUNT + 1;


		}

		FCL_XPIX = 0;
		FCL_TEMP[FCL_COUNT] = 0;

		while (FCL_XPIX < 6)
		{

			FCL_WIDTH = 0;

			while (FCL_WIDTH < FCL_FONT_WIDTH)
			{

				FCL_YCOUNT = 0;

				FCL_YPIX = 0;

				while (FCL_YPIX < 8)
				{

					FCL_HEIGHT = 0;

					while (FCL_HEIGHT < FCL_FONT_HEIGHT)
					{

						if (FCL_TEMP[FCL_XPIX] & (0x01 << FCL_YPIX))
						{

							FCD_05bc1_gLCD_SSD1306_buffered1__Plot(FCL_X1 + FCL_XCOUNT, FCL_Y1 + FCL_YCOUNT);

						} else {

							if (FCL_TRANSPARENT == 0)
							{

								FCD_05bc1_gLCD_SSD1306_buffered1__BPlot(FCL_X1 + FCL_XCOUNT, FCL_Y1 + FCL_YCOUNT);

							// } else {

							}

						}

						FCL_HEIGHT = FCL_HEIGHT + 1;
						FCL_YCOUNT = FCL_YCOUNT + 1;


					}

					FCL_YPIX = FCL_YPIX + 1;


				}

				FCL_WIDTH = FCL_WIDTH + 1;
				FCL_XCOUNT = FCL_XCOUNT + 1;


			}

			FCL_XPIX = FCL_XPIX + 1;


		}

		FCL_IDX = FCL_IDX + 1;


	}

	//Local variable definitions
	#undef FCLsz_TEMP
}

/*=----------------------------------------------------------------------=*\
   Use :Sets the display contrast from 0 to 255.
       :
       :Parameters for macro ControlContrast:
       :  Contrast : Range 0 - 255, Default 207
\*=----------------------------------------------------------------------=*/
void FCD_05bc1_gLCD_SSD1306_buffered1__ControlContrast(MX_UINT8 FCL_CONTRAST)
{

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0x81);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(FCL_CONTRAST);

}

/*=----------------------------------------------------------------------=*\
   Use :This macro clears the display of any previous output by overwriting the entire display with the background colour.
\*=----------------------------------------------------------------------=*/
void FCD_05bc1_gLCD_SSD1306_buffered1__ClearDisplay()
{
	//Local variable definitions
	MX_UINT8 FCL_PAGE = (0x0);
	MX_UINT8 FCL_COLUMN = (0x0);
	MX_UINT8 FCL_DATA;


	if (FCV_05bc1_gLCD_SSD1306_buffered1__BACKGROUND_COL_VAR)
	{

		FCL_DATA = 255;

	} else {

		FCL_DATA = 0;

	}

	while (FCL_PAGE < 8)
	{

		FCL_COLUMN = 0;

		FCD_05bc1_gLCD_SSD1306_buffered1__Goto_XY(0, FCL_PAGE << 3);

		while (FCL_COLUMN < 128)
		{

			switch (FCL_PAGE)
			{
				case 1:
				{
					FCV_05bc1_gLCD_SSD1306_buffered1__DRAM1[FCL_COLUMN] = FCL_DATA;

					break;
				}
				case 2:
				{
					FCV_05bc1_gLCD_SSD1306_buffered1__DRAM2[FCL_COLUMN] = FCL_DATA;

					break;
				}
				case 3:
				{
					FCV_05bc1_gLCD_SSD1306_buffered1__DRAM3[FCL_COLUMN] = FCL_DATA;

					break;
				}
				case 4:
				{
					FCV_05bc1_gLCD_SSD1306_buffered1__DRAM4[FCL_COLUMN] = FCL_DATA;

					break;
				}
				case 5:
				{
					FCV_05bc1_gLCD_SSD1306_buffered1__DRAM5[FCL_COLUMN] = FCL_DATA;

					break;
				}
				case 6:
				{
					FCV_05bc1_gLCD_SSD1306_buffered1__DRAM6[FCL_COLUMN] = FCL_DATA;

					break;
				}
				case 7:
				{
					FCV_05bc1_gLCD_SSD1306_buffered1__DRAM7[FCL_COLUMN] = FCL_DATA;

					break;
				}
				default:
				{
					FCV_05bc1_gLCD_SSD1306_buffered1__DRAM0[FCL_COLUMN] = FCL_DATA;

				}
			}

			FCD_05bc1_gLCD_SSD1306_buffered1__SendData(FCL_DATA);

			FCL_COLUMN = FCL_COLUMN + 1;


		}

		FCL_PAGE = FCL_PAGE + 1;


	}

}

/*=----------------------------------------------------------------------=*\
   Use :Specifies the colour of the background by creating a mixture of red, green and blue.
       :
       :Parameters for macro SetBackgroundColour:
       :  PixelColour : 0=White, 1=Black
\*=----------------------------------------------------------------------=*/
void FCD_05bc1_gLCD_SSD1306_buffered1__SetBackgroundColour(MX_UINT8 FCL_PIXELCOLOUR)
{

	if (FCL_PIXELCOLOUR)
	{

		FCV_05bc1_gLCD_SSD1306_buffered1__BACKGROUND_COL_VAR = FCV_05bc1_gLCD_SSD1306_buffered1__WHITE;

	} else {

		FCV_05bc1_gLCD_SSD1306_buffered1__BACKGROUND_COL_VAR = FCV_05bc1_gLCD_SSD1306_buffered1__BLACK;

	}

}

/*=----------------------------------------------------------------------=*\
   Use :Specifies the colour of the foreground by creating a mixture of red, green and blue.
       :
       :Parameters for macro SetForegroundColour:
       :  PixelColour : 0=White, 1=Black
\*=----------------------------------------------------------------------=*/
void FCD_05bc1_gLCD_SSD1306_buffered1__SetForegroundColour(MX_UINT8 FCL_PIXELCOLOUR)
{

	if (FCL_PIXELCOLOUR)
	{

		FCV_05bc1_gLCD_SSD1306_buffered1__FOREGROUND_COL_VAR = FCV_05bc1_gLCD_SSD1306_buffered1__WHITE;

	} else {

		FCV_05bc1_gLCD_SSD1306_buffered1__FOREGROUND_COL_VAR = FCV_05bc1_gLCD_SSD1306_buffered1__BLACK;

	}

}

/*=----------------------------------------------------------------------=*\
   Use :Draws a rectangle with the current foreground colour from pixel loaction X1, Y1 to pixel location X2, Y2
       :
       :Parameters for macro DrawRectangle:
       :  X1 : MX_UINT16
       :  Y1 : MX_UINT16
       :  X2 : MX_UINT16
       :  Y2 : MX_UINT16
       :  Transparent : Chooses the transparency of the box - 0 = Box contains background colour, 1 = Box contains previous pixel data.
       :  Solid : Chooses to fill the box with colour - 0 = Box contains transparency data, 1 = Box contains foreground colour.
\*=----------------------------------------------------------------------=*/
void FCD_05bc1_gLCD_SSD1306_buffered1__DrawRectangle(MX_UINT16 FCL_X1, MX_UINT16 FCL_Y1, MX_UINT16 FCL_X2, MX_UINT16 FCL_Y2, MX_UINT8 FCL_TRANSPARENT, MX_UINT8 FCL_SOLID)
{
	//Local variable definitions
	MX_UINT16 FCL_XMIN;
	MX_UINT16 FCL_XMAX;
	MX_UINT16 FCL_YMIN;
	MX_UINT16 FCL_YMAX;


	FCD_05bc1_gLCD_SSD1306_buffered1__DrawLine(FCL_X1, FCL_Y1, FCL_X2, FCL_Y1);

	FCD_05bc1_gLCD_SSD1306_buffered1__DrawLine(FCL_X2, FCL_Y1, FCL_X2, FCL_Y2);

	FCD_05bc1_gLCD_SSD1306_buffered1__DrawLine(FCL_X1, FCL_Y2, FCL_X2, FCL_Y2);

	FCD_05bc1_gLCD_SSD1306_buffered1__DrawLine(FCL_X1, FCL_Y1, FCL_X1, FCL_Y2);

	if (FCL_TRANSPARENT == 0)
	{

		if (FCL_X1 > FCL_X2)
		{

			FCL_XMAX = FCL_X1;
			FCL_XMIN = FCL_X2 + 1;

		} else {

			FCL_XMAX = FCL_X2;
			FCL_XMIN = FCL_X1 + 1;

		}

		if (FCL_Y1 > FCL_Y2)
		{

			FCL_YMAX = FCL_Y1;
			FCL_YMIN = FCL_Y2 + 1;

		} else {

			FCL_YMAX = FCL_Y2;
			FCL_YMIN = FCL_Y1 + 1;

		}

		FCL_Y1 = FCL_YMIN;

		while (FCL_Y1 < FCL_YMAX)
		{

			FCL_X1 = FCL_XMIN;

			while (FCL_X1 < FCL_XMAX)
			{

				if (FCL_SOLID)
				{

					FCD_05bc1_gLCD_SSD1306_buffered1__Plot(FCL_X1, FCL_Y1);

				} else {

					FCD_05bc1_gLCD_SSD1306_buffered1__BPlot(FCL_X1, FCL_Y1);

				}

				FCL_X1 = FCL_X1 + 1;


			}

			FCL_Y1 = FCL_Y1 + 1;


		}

	// } else {

	}

}

/*=----------------------------------------------------------------------=*\
   Use :The Init macro must be called once to initialise the Graphical LCD display before any other Graphical LCD component macros are called.
\*=----------------------------------------------------------------------=*/
void FCD_05bc1_gLCD_SSD1306_buffered1__Initialise()
{
	//Local variable definitions
	MX_UINT8 FCL_RED;
	MX_UINT8 FCL_GREEN;
	MX_UINT8 FCL_BLUE;


	FCP_SET(B, C, 0x4, 0x2, 1);
	FCP_SET(B, C, 0x8, 0x3, 1);
	FCP_SET(B, C, 0x20, 0x5, 1);
	FCP_SET(B, C, 0x40, 0x6, 0);
	FCP_SET(B, C, 0x10, 0x4, 0);

	FCI_DELAYBYTE_MS(200);

	FCP_SET(B, C, 0x8, 0x3, 0);

	FCI_DELAYBYTE_MS(200);

	FCP_SET(B, C, 0x8, 0x3, 1);

	FCI_DELAYBYTE_MS(200);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0xAE);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0xD5);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0x80);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0xA8);

	#if (0) // 32 == 64

	//Code has been optimised out by the pre-processor
	#else

		#if (1) // 32 == 32

			FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0x1F);

		#else

		//Code has been optimised out by the pre-processor
		#endif

	#endif

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0xD3);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0x00);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0x40);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0x8D);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0x14);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0xA1);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0xC8);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0xDA);

	#if (0) // 0 == 1

	//Code has been optimised out by the pre-processor
	#else

		FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0x02);

	#endif

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0x81);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0xCF);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0xD9);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0xF1);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0xA4);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0xA6);

	FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0xAF);

	#if (1) // 16777215 > 0

		FCV_05bc1_gLCD_SSD1306_buffered1__FOREGROUND_COL_VAR = FCV_05bc1_gLCD_SSD1306_buffered1__WHITE;

	#else

	//Code has been optimised out by the pre-processor
	#endif

	#if (0) // 0 > 0

	//Code has been optimised out by the pre-processor
	#else

		FCV_05bc1_gLCD_SSD1306_buffered1__BACKGROUND_COL_VAR = FCV_05bc1_gLCD_SSD1306_buffered1__BLACK;

	#endif

	FCD_05bc1_gLCD_SSD1306_buffered1__ClearDisplay();

	FCD_05bc1_gLCD_SSD1306_buffered1__Goto_XY(0, 0);

}

/*=----------------------------------------------------------------------=*\
   Use :
\*=----------------------------------------------------------------------=*/
void FCD_05bc1_gLCD_SSD1306_buffered1__InvertDisplay()
{

	if (FCV_05bc1_gLCD_SSD1306_buffered1__INVERTED == 0)
	{

		FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0xA7);

		FCV_05bc1_gLCD_SSD1306_buffered1__INVERTED = 1;

	} else {

		FCD_05bc1_gLCD_SSD1306_buffered1__SendCommand(0xA6);

		FCV_05bc1_gLCD_SSD1306_buffered1__INVERTED = 0;

	}

}


/*========================================================================*\
   Use :panel
       :Macro implementations
\*========================================================================*/


/*========================================================================*\
   Use :Main
\*========================================================================*/
int main()
{


	// ??????? C
	// C Code:
	volatile MX_UINT8 n;
	// Internal 32 kHz RC oscillator initialization
	// Enable the internal 32 kHz RC oscillator
	OSC.CTRL|=OSC_RC32KEN_bm;
	// Wait for the internal 32 kHz RC oscillator to stabilize
	while ((OSC.STATUS & OSC_RC32KRDY_bm)==0);

	// Internal 32 MHz RC oscillator initialization
	// Enable the internal 32 MHz RC oscillator
	OSC.CTRL|=OSC_RC32MEN_bm;

	// System Clock prescaler A division factor: 1
	// System Clock prescalers B & C division factors: B:1, C:1
	// ClkPer4: 32000,000 kHz
	// ClkPer2: 32000,000 kHz
	// ClkPer:  32000,000 kHz
	// ClkCPU:  32000,000 kHz
	n=(CLK.PSCTRL & (~(CLK_PSADIV_gm | CLK_PSBCDIV1_bm | CLK_PSBCDIV0_bm))) |
		CLK_PSADIV_1_gc | CLK_PSBCDIV_1_1_gc;
	CCP=CCP_IOREG_gc;
	CLK.PSCTRL=n;

	// Internal 32 MHz RC osc. calibration reference clock source: 32.768 kHz Internal Osc.
	OSC.DFLLCTRL&= ~(OSC_RC32MCREF_bm | OSC_RC2MCREF_bm);
	// Enable the autocalibration of the internal 32 MHz RC oscillator
	DFLLRC32M.CTRL|=DFLL_ENABLE_bm;

	// Wait for the internal 32 MHz RC oscillator to stabilize
	while ((OSC.STATUS & OSC_RC32MRDY_bm)==0);

	// Select the system clock source: 32 MHz Internal RC Osc.
	n=(CLK.CTRL & (~CLK_SCLKSEL_gm)) | CLK_SCLKSEL_RC32M_gc;
	CCP=CCP_IOREG_gc;
	CLK.CTRL=n;

	// Disable the unused oscillators: 2 MHz, external clock/crystal oscillator, PLL
	OSC.CTRL&= ~(OSC_RC2MEN_bm | OSC_XOSCEN_bm | OSC_PLLEN_bm);

	// Peripheral Clock output: Disabled
	PORTCFG.CLKEVOUT=(PORTCFG.CLKEVOUT & (~PORTCFG_CLKOUT_gm)) | PORTCFG_CLKOUT_OFF_gc;

	// ????? ???????????? ???????????
	// Call Component Macro: gLCD_SSD1306_buffered1::Initialise()
	FCD_05bc1_gLCD_SSD1306_buffered1__Initialise();

	// ????? ???????????? ???????????
	// Call Component Macro: gLCD_SSD1306_buffered1::ClearDisplay()
	FCD_05bc1_gLCD_SSD1306_buffered1__ClearDisplay();

	// ????? ???????????? ???????????
	// Call Component Macro: ModbusMaster1::Initialise()
	FCD_0cc41_ModbusMaster1__Initialise();

	// ??????
	// Loop: While 1
	while (1)
	{

		// ????? ???????????? ???????????
		// Call Component Macro: gLCD_SSD1306_buffered1::ControlContrast(255)
		FCD_05bc1_gLCD_SSD1306_buffered1__ControlContrast(255);

		// ????? ???????????? ???????????
		// Call Component Macro: gLCD_SSD1306_buffered1::SetDisplayOrientation(0)
		FCD_05bc1_gLCD_SSD1306_buffered1__SetDisplayOrientation(0);

		// ????? ???????????? ???????????
		// Call Component Macro: gLCD_SSD1306_buffered1::Plot(0, 1)
		FCD_05bc1_gLCD_SSD1306_buffered1__Plot(0, 1);

		// ????? ???????????? ???????????
		// Call Component Macro: gLCD_SSD1306_buffered1::Print("Command:", 0, 16, 0, 0)
		FCD_05bc1_gLCD_SSD1306_buffered1__Print("Command:", 9, 0, 16, 0, 0);

		// ????? ???????????? ???????????
		// Call Component Macro: in=ModbusMaster1::PresetSingleRegister(1, 1, Count1)
		FCV_IN = FCD_0cc41_ModbusMaster1__PresetSingleRegister(1, 1, FCV_COUNT1);

		#if 0 // Disabled code
		// Call Component Macro
		// Call Component Macro: in=ModbusMaster1::ReadInputRegister(1, 0x001, 1)
		FCV_IN = FCD_0cc41_ModbusMaster1__ReadInputRegister(1, 0x001, 1);

		#endif // #if 0: Disabled code
		// ?????????
		// Switch: in?
		switch (FCV_IN)
		{
			case 0:
			{
				// ????? ???????????? ???????????
				// Call Component Macro: gLCD_SSD1306_buffered1::Print("OK   ", 55, 16, 0, 0)
				FCD_05bc1_gLCD_SSD1306_buffered1__Print("OK   ", 6, 55, 16, 0, 0);

				break;
			}
			case 1:
			{
				// ????? ???????????? ???????????
				// Call Component Macro: gLCD_SSD1306_buffered1::Print("CRC", 55, 16, 0, 0)
				FCD_05bc1_gLCD_SSD1306_buffered1__Print("CRC", 4, 55, 16, 0, 0);

				break;
			}
			case 255:
			{
				// ????? ???????????? ???????????
				// Call Component Macro: gLCD_SSD1306_buffered1::Print("TOUT", 55, 16, 0, 0)
				FCD_05bc1_gLCD_SSD1306_buffered1__Print("TOUT", 5, 55, 16, 0, 0);

				break;
			}
			// default:

		}

		// ????????
		// Decision: Count >= 1?
		if (FCV_COUNT >= 1)
		{

			// ???????????
			// Calculation:
			//  Count = 0
			FCV_COUNT = 0;

			// ????????
			// Decision: Count1 >= 25?
			if (FCV_COUNT1 >= 25)
			{

				// ???????????
				// Calculation:
				//  Count1 = 0
				FCV_COUNT1 = 0;

			} else {

				// ???????????
				// Calculation:
				//  Count1 = Count1 + 1
				FCV_COUNT1 = FCV_COUNT1 + 1;

			}

		} else {

			// ???????????
			// Calculation:
			//  Count = Count + 1
			FCV_COUNT = FCV_COUNT + 1;

		}

		// ????? ???????????? ???????????
		// Call Component Macro: gLCD_SSD1306_buffered1::Print("DATA:", 0, 24, 0, 0)
		FCD_05bc1_gLCD_SSD1306_buffered1__Print("DATA:", 6, 0, 24, 0, 0);

		// ????? ???????????? ???????????
		// Call Component Macro: ActiveEnergy=ModbusMaster1::GetResponseByte(5)
		FCV_ACTIVEENERGY = FCD_0cc41_ModbusMaster1__GetResponseByte(5);

		// ????? ???????????? ???????????
		// Call Component Macro: gLCD_SSD1306_buffered1::PrintNumber(ActiveEnergy, 50, 24, 0, 0)
		FCD_05bc1_gLCD_SSD1306_buffered1__PrintNumber(FCV_ACTIVEENERGY, 50, 24, 0, 0);


	}

	mainendloop: goto mainendloop;
}



/*========================================================================*\
   Use :Interrupt
\*========================================================================*/




