x

Dependents:   20180621_FT813

Files at this revision

API Documentation at this revision

Comitter:
JackB
Date:
Mon Jul 23 12:24:05 2018 +0000
Commit message:
AP

Changed in this revision

AP3000.cpp Show annotated file Show diff for this revision Revisions of this file
AP3000.h Show annotated file Show diff for this revision Revisions of this file
SetupPage.cpp Show annotated file Show diff for this revision Revisions of this file
SetupPage.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 0ee5e6b7245e AP3000.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/AP3000.cpp	Mon Jul 23 12:24:05 2018 +0000
@@ -0,0 +1,2002 @@
+#include "mbed.h"
+#include "AP3000.h"
+#include "FT_Platform.h"
+#include "SDBlockDevice.h"
+#include "FATFileSystem.h"
+//#include "HeapBlockDevice.h"
+#include "SPIFBlockDevice.h"
+#include "I2CEEBlockDevice.h"
+//#include "FRAMSPI.h"
+#include "BurstSPI.h"
+#include "NMEA0183.h"
+#include "nmea_parser.h"
+
+
+Button main_button;
+Indicator main_indicator;
+Indicator main_indicator_previous;  // Track changes
+Indicator main_indicator_backup;
+
+//Timer touchTimer;
+Timer blinker;
+//Ticker blinkLights;
+
+uint8_t brightnessLow;
+uint8_t brightnessHigh;
+uint8_t brightnessSelect;
+
+uint8_t mainBlink;
+
+void InitAP3000(void)
+{
+//    blinkLights.attach(&updateAlarmLights, 0.5);
+    
+    blinker.reset();
+    blinker.start();
+    mainBlink = false;
+    
+    setDisplayBrighnessLow(40);
+    setDisplayBrighnessHigh(255);
+    setDisplayBrighnessSelect(BIGHTNESS_SELECT_HIGH);
+    
+    main_button.accept_alarm_pressed        = BUTTON_RELEASED;
+    main_button.accept_horn_pressed         = BUTTON_RELEASED;
+    main_button.set_pressed                 = BUTTON_RELEASED;
+    main_button.dim_pressed                 = BUTTON_RELEASED;
+
+    setPumpInUse(PUMP_OFF);
+    setPumpInUseBlinkStatus(STEADY_OFF);
+
+//    main_indicator.pump_in_use              = PUMP_IN_USE_MAIN;
+//    main_indicator.pump_in_use_light        = STEADY_OFF;
+    
+    // All Main and Aux alarms
+    for(int system = MAIN_SYSTEM; system <= GLOBAL_SYSTEM; system++) {
+        // MAIN_SYSTEM, AUX_SYSTEM, GLOBAL_SYSTEM
+        for(int alarm = PHASE_FAIL; alarm <= FU_FAILURE; alarm++) {
+            // PHASE_FAIL, MAIN_POWER, CTRL_POWER, OIL_PRESS, HYDR_LOCK,
+            // OVERLOAD, OIL_LEVEL, OIL_FILTER, OIL_TEMP, FU_FAILURE
+            setAlarmStatus((System)system, (Alarm)alarm, ALARM_STATUS_OFF);
+            setAlarmBlinkStatus((System)system, (Alarm)alarm, STEADY_OFF);
+        }
+        if (system != GLOBAL_SYSTEM) {
+            setPumpRunningStatus((System)system, RUN_STATUS_OFF);
+            setPumpRunningBlinkStatus((System)system, STEADY_OFF);
+        }
+    }
+
+//    main_indicator.md_main_running          = RUN_STATUS_OFF;
+//    main_indicator.md_main_running_light    = STEADY_OFF;
+//    main_indicator.md_aux_running           = RUN_STATUS_OFF;
+//    main_indicator.md_aux_running_light     = STEADY_OFF;
+
+//    main_indicator.rb_main_phase_fail       = ALARM_STATUS_OFF;
+//    main_indicator.rb_main_phase_fail_light = STEADY_OFF;
+//    main_indicator.rb_main_main_power       = ALARM_STATUS_OFF;
+//    main_indicator.rb_main_main_power_light = STEADY_OFF;
+//    main_indicator.rb_main_ctrl_power       = ALARM_STATUS_OFF;
+//    main_indicator.rb_main_ctrl_power_light = STEADY_OFF;
+//    main_indicator.rb_main_oil_press        = ALARM_STATUS_OFF;
+//    main_indicator.rb_main_oil_press_light  = STEADY_OFF;
+//    main_indicator.rb_main_hydr_lock        = ALARM_STATUS_OFF;
+//    main_indicator.rb_main_hydr_lock_light  = STEADY_OFF;
+//    main_indicator.rb_main_overload         = ALARM_STATUS_OFF;
+//    main_indicator.rb_main_overload_light   = STEADY_OFF;
+//    main_indicator.rb_main_oil_level        = ALARM_STATUS_OFF;
+//    main_indicator.rb_main_oil_level_light  = STEADY_OFF;
+//    main_indicator.rb_main_oil_filter       = ALARM_STATUS_OFF;
+//    main_indicator.rb_main_oil_filter_light = STEADY_OFF;
+//    main_indicator.rb_main_oil_temp         = ALARM_STATUS_OFF;
+//    main_indicator.rb_main_oil_temp_light   = STEADY_OFF;
+//
+//    main_indicator.rb_aux_phase_fail        = ALARM_STATUS_OFF;
+//    main_indicator.rb_aux_phase_fail_light  = STEADY_OFF;
+//    main_indicator.rb_aux_main_power        = ALARM_STATUS_OFF;
+//    main_indicator.rb_aux_main_power_light  = STEADY_OFF;
+//    main_indicator.rb_aux_ctrl_power        = ALARM_STATUS_OFF;
+//    main_indicator.rb_aux_ctrl_power_light  = STEADY_OFF;
+//    main_indicator.rb_aux_oil_press         = ALARM_STATUS_OFF;
+//    main_indicator.rb_aux_oil_press_light   = STEADY_OFF;
+//    main_indicator.rb_aux_hydr_lock         = ALARM_STATUS_OFF;
+//    main_indicator.rb_aux_hydr_lock_light   = STEADY_OFF;
+//    main_indicator.rb_aux_overload          = ALARM_STATUS_OFF;
+//    main_indicator.rb_aux_overload_light    = STEADY_OFF;
+//    main_indicator.rb_aux_oil_level         = ALARM_STATUS_OFF;
+//    main_indicator.rb_aux_oil_level_light   = STEADY_OFF;
+//    main_indicator.rb_aux_oil_filter        = ALARM_STATUS_OFF;
+//    main_indicator.rb_aux_oil_filter_light  = STEADY_OFF;
+//    main_indicator.rb_aux_oil_temp          = ALARM_STATUS_OFF;
+//    main_indicator.rb_aux_oil_temp_light    = STEADY_OFF;
+//
+//    main_indicator.rb_fu_failure            = ALARM_STATUS_OFF;
+//    main_indicator.rb_fu_failure_light      = STEADY_OFF;
+    
+    main_indicator_previous = main_indicator;   // Copy to previous state
+}
+
+void loadBitmaps(void)
+{
+    TFT.ResetInflateFileBitmap();
+
+//    TFT.LoadInflateFileBitmap("/fs/BACKGROUND_01_C_20x20_BL.bin", L8, 20, 20);
+//    TFT.LoadInflateFileBitmap("/fs/BACKGROUND_01_C_20x20_BR.bin", L8, 20, 20);
+//    TFT.LoadInflateFileBitmap("/fs/BACKGROUND_01_C_20x20_TL.bin", L8, 20, 20);
+//    TFT.LoadInflateFileBitmap("/fs/BACKGROUND_01_C_20x20_TR.bin", L8, 20, 20);
+//    TFT.LoadInflateFileBitmap("/fs/BACKGROUND_01_H_5x4.bin", L8, 5, 4);
+//    TFT.LoadInflateFileBitmap("/fs/BACKGROUND_01_H_10x4.bin", L8, 10, 4);
+//    TFT.LoadInflateFileBitmap("/fs/BACKGROUND_01_H_25x4.bin", L8, 25, 4);
+//    TFT.LoadInflateFileBitmap("/fs/BACKGROUND_01_H_190x4.bin", L8, 190, 4);
+//    TFT.LoadInflateFileBitmap("/fs/BACKGROUND_01_V_4x535.bin", L8, 4, 535);
+//    TFT.LoadInflateFileBitmap("/fs/BACKGROUND_01_V_4x21.bin", L8, 4, 21);
+
+//    TFT.LoadInflateFileBitmap("/fs/RegularButtonBlk_220x51r4t.bin", ARGB4, 220, 51);
+//    TFT.LoadInflateFileBitmap("/fs/RegularButtonGray_220x51r10t.bin", ARGB4, 220, 51);
+//    TFT.LoadInflateFileBitmap("/fs/RegularButtonRed_220x51r10t.bin", ARGB4, 220, 51);
+//    TFT.LoadInflateFileBitmap("/fs/RegularButtonYel_220x51r10t.bin", ARGB4, 220, 51);
+//    TFT.LoadInflateFileBitmap("/fs/RegularButtonGray_220x51r0t.bin", ARGB4, 220, 51);
+//    TFT.LoadInflateFileBitmap("/fs/RegularButtonRed_220x51r0t.bin", ARGB4, 220, 51);
+//    TFT.LoadInflateFileBitmap("/fs/RegularButtonYel_220x51r0t.bin", ARGB4, 220, 51);
+//    TFT.LoadInflateFileBitmap("/fs/RegularButtonGray_220x51r0r10t.bin", ARGB4, 220, 51); // 40 characters
+//    TFT.LoadInflateFileBitmap("/fs/RegularButtonRed_220x51r0r10t.bin", ARGB4, 220, 51);
+//    TFT.LoadInflateFileBitmap("/fs/RegularButtonYel_220x51r0r10t.bin", ARGB4, 220, 51);
+
+    TFT.LoadInflateFileBitmap("/fs/SwitchOn_234x132_blk.bin", L8, 234, 132);
+    TFT.LoadInflateFileBitmap("/fs/SwitchOff_234x132_blk.bin", L8, 234, 132);
+    TFT.LoadInflateFileBitmap("/fs/SwitchOn_100x132_blk.bin", L8, 100, 132);
+    TFT.LoadInflateFileBitmap("/fs/SwitchOff_100x132_blk.bin", L8, 100, 132);
+    TFT.LoadInflateFileBitmap("/fs/SwitchOn_115x66_t.bin", L8, 115, 66);
+    TFT.LoadInflateFileBitmap("/fs/SwitchOff_115x66_t.bin", L8, 115, 66);
+
+    TFT.LoadInflateFileBitmap("/fs/settings_40x40.bin", L8, 40, 40);
+    TFT.LoadInflateFileBitmap("/fs/light-bulb_40x40.bin", L8, 40, 40);
+
+
+    // Markus Adobe Ilustrator
+//    TFT.LoadInflateFileBitmap("/fs/MD_DISABLED_230x70.bin", ARGB4, 230, 70);
+//    TFT.LoadInflateFileBitmap("/fs/MD_OFF_230x70.bin", ARGB4, 230, 70);
+//    TFT.LoadInflateFileBitmap("/fs/MD_OFF_GREY_230x70.bin", ARGB4, 230, 70);
+//    TFT.LoadInflateFileBitmap("/fs/MD_RUNNING_230x70.bin", ARGB4, 230, 70);
+//    TFT.LoadInflateFileBitmap("/fs/MD_WARNING_230x70.bin", ARGB4, 230, 70);
+    
+    // SVG generated bitmaps, FT813 Font: Google Yantramanav
+    // https://www.w3schools.com/howto/tryit.asp?font=Yantramanav
+    // https://fonts.google.com/?query=Yantramanav
+    TFT.LoadInflateFileBitmap("/fs/MD_DISABLED_220x51bt.bin", ARGB4, 220, 51);
+    TFT.LoadInflateFileBitmap("/fs/MD_OFF_Grey_220x51bt.bin", ARGB4, 220, 51);
+    TFT.LoadInflateFileBitmap("/fs/MD_OFF_Red_220x51bt.bin", ARGB4, 220, 51);
+    TFT.LoadInflateFileBitmap("/fs/MD_RUNNING_220x51bt.bin", ARGB4, 220, 51);
+    TFT.LoadInflateFileBitmap("/fs/MD_WARNING_220x51bt.bin", ARGB4, 220, 51);
+
+    TFT.LoadInflateFileBitmap("/fs/RUN_TIME_C_ON_21_X_21.bin", ARGB4, 21, 21);
+    TFT.LoadInflateFileBitmap("/fs/RUN_TIME_C_OFF_21_X_21.bin", ARGB4, 21, 21);
+    TFT.LoadInflateFileBitmap("/fs/RUN_TIME_L_ON_21_X_21.bin", ARGB4, 21, 21);
+    TFT.LoadInflateFileBitmap("/fs/RUN_TIME_L_OFF_21_X_21.bin", ARGB4, 21, 21);
+    TFT.LoadInflateFileBitmap("/fs/RUN_TIME_R_ON_21_X_21.bin", ARGB4, 21, 21);
+    TFT.LoadInflateFileBitmap("/fs/RUN_TIME_R_OFF_21_X_21.bin", ARGB4, 21, 21);
+
+//    TFT.DL(DISPLAY());                          // Display the image
+    TFT.Swap();                                 // Swap the current display list
+    TFT.Flush_Co_Buffer();                      // Download the command list into fifo
+    TFT.WaitCmdfifo_empty();                    // Wait till coprocessor completes the operation
+}
+
+void loadSplashScreen(void)
+{
+    TFT.DLstart();                              // start a new display command list
+    TFT.DL(CLEAR_COLOR_RGB(0x00, 0x00, 0x00));  // set the clear color to white
+    TFT.DL(CLEAR(1, 1, 1));                     // clear buffers -> color buffer,stencil buffer, tag buffer
+    TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));  // set the clear color to white
+    TFT.DL(DISPLAY());                          // Display the image
+    TFT.Swap();                                 // Swap the current display list
+    TFT.Flush_Co_Buffer();                      // Download the command list into fifo
+    TFT.WaitCmdfifo_empty();                    // Wait till coprocessor completes the operation
+
+    TFT.ResetInflateFileBitmap();
+    TFT.LoadInflateFileBitmap("/fs/DMC_logo_438x154.bin", ARGB4, 438, 154);
+//    TFT.LoadInflateFileBitmap("/fs/DMC_logo_black_438x154.bin", RGB332, 438, 154); // smaller, scattering effect
+}
+
+void showSplashScreen(void)
+{
+    TFT.DLstart();                              // start a new display command list
+    TFT.DL(CLEAR_COLOR_RGB(0x00, 0x00, 0x00));  // set the clear color to white
+    TFT.DL(CLEAR(1, 1, 1));                     // clear buffers -> color buffer,stencil buffer, tag buffer
+    TFT.DL(COLOR_RGB(0xff, 0x80, 0x00));        // set current color to gray
+
+//    // Use bitmap
+//    TFT.DL(BEGIN(BITMAPS));
+//    TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//    TFT.ShowBitmapByName("DMC_logo", 21, 323);
+
+    // Use text (preserves space)
+    TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+    TFT.Text(240, 400, 31, OPT_CENTER, "DMC");     // text SYSTEM
+
+    TFT.DL(DISPLAY());                          // Display the image
+    TFT.Swap();                                 // Swap the current display list
+    TFT.Flush_Co_Buffer();                      // Download the command list into fifo
+    TFT.WaitCmdfifo_empty();                    // Wait till coprocessor completes the operation
+}
+
+void showMainPage(void)
+{
+//    printf("showMainPage\n");
+    
+    TFT.DLstart();                              // start a new display command list
+    TFT.DL(CLEAR_COLOR_RGB(0x10, 0x10, 0x10));  // set the clear color to white
+    TFT.DL(CLEAR(1, 1, 1));                     // clear buffers -> color buffer,stencil buffer, tag buffer
+    TFT.DL(COLOR_RGB(0xff, 0xff, 0xff));  // set the clear color to white
+
+    TFT.DL(BEGIN(BITMAPS));
+
+// Main box
+RoundedRectangle(5, 5, 229, 541, 20, 2, 0xC8, 0xC8, 0xC8, 0x00, 0x00, 0x00, 0, "");
+// Black cut-out at the top
+RoundedRectangle(50, 3, 140, 8, 0, 0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0, "");
+
+// Aux box
+RoundedRectangle(245, 5, 229, 541, 20, 2, 0xC8, 0xC8, 0xC8, 0x00, 0x00, 0x00, 0, "");
+// Black cut-out at the top
+RoundedRectangle(290, 3, 140, 8, 0, 0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0, "");
+
+int yFuBox = 557;
+
+// FU box
+RoundedRectangle(125, yFuBox, 229, 58, 20, 2, 0xC8, 0xC8, 0xC8, 0x00, 0x00, 0x00, 0, "");
+
+    TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+
+    // Build the background for main and aux
+//    TFT.ShowBitmapByName("BACKGROUND_01_C_20x20_TL", 5,       5);
+//    TFT.ShowBitmapByName("BACKGROUND_01_C_20x20_TL", 5 + 240, 5);
+//    TFT.ShowBitmapByName("BACKGROUND_01_H_25x4",  25,       5);
+//    TFT.ShowBitmapByName("BACKGROUND_01_H_25x4", 190,       5);
+//    TFT.ShowBitmapByName("BACKGROUND_01_H_25x4",  25 + 240, 5);
+//    TFT.ShowBitmapByName("BACKGROUND_01_H_25x4", 190 + 240, 5);
+//    TFT.ShowBitmapByName("BACKGROUND_01_C_20x20_TR", 215,       5);
+//    TFT.ShowBitmapByName("BACKGROUND_01_C_20x20_TR", 215 + 240, 5);
+//    TFT.ShowBitmapByName("BACKGROUND_01_V_4x535",   5,       25);
+//    TFT.ShowBitmapByName("BACKGROUND_01_V_4x535", 231,       25);
+//    TFT.ShowBitmapByName("BACKGROUND_01_V_4x535",   5 + 240, 25);
+//    TFT.ShowBitmapByName("BACKGROUND_01_V_4x535", 231 + 240, 25);
+//    TFT.ShowBitmapByName("BACKGROUND_01_C_20x20_BL", 5,       560);
+//    TFT.ShowBitmapByName("BACKGROUND_01_C_20x20_BL", 5 + 240, 560);
+//    TFT.ShowBitmapByName("BACKGROUND_01_C_20x20_BR", 215,       560);
+//    TFT.ShowBitmapByName("BACKGROUND_01_C_20x20_BR", 215 + 240, 560);
+//    TFT.ShowBitmapByName("BACKGROUND_01_H_190x4", 25,       576);
+//    TFT.ShowBitmapByName("BACKGROUND_01_H_190x4", 25 + 240, 576);
+    
+    // Build the background for FU FAILURE box
+//    TFT.ShowBitmapByName("BACKGROUND_01_C_20x20_TL", 125, 588);
+//    TFT.ShowBitmapByName("BACKGROUND_01_C_20x20_TR", 335, 588);
+//    TFT.ShowBitmapByName("BACKGROUND_01_C_20x20_BL", 125, 629);
+//    TFT.ShowBitmapByName("BACKGROUND_01_C_20x20_BR", 335, 629);
+//    TFT.ShowBitmapByName("BACKGROUND_01_V_4x21", 125, 608);
+//    TFT.ShowBitmapByName("BACKGROUND_01_V_4x21", 351, 608);
+//    TFT.ShowBitmapByName("BACKGROUND_01_H_190x4", 145, 588);
+//    TFT.ShowBitmapByName("BACKGROUND_01_H_190x4", 145, 645);
+
+    // Text SYSTEM at the top
+    TFT.DL(COLOR_RGB(0xC8, 0xC8, 0xC8));        // set current color to gray
+    TFT.Text(118,       15, 30, OPT_CENTER, "SYSTEM");     // text SYSTEM
+    TFT.Text(118 + 240, 15, 30, OPT_CENTER, "SYSTEM");     // text SYSTEM
+//    TFT.Text(118,       25, 30, OPT_CENTER, "RUNNING");     // text SYSTEM
+//    TFT.Text(118 + 240, 25, 30, OPT_CENTER, "WARNING");     // text SYSTEM
+
+
+    // Draw indicators
+    
+    // Pump Running Indicators (small triangles)
+    TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+    switch(main_indicator.pump_in_use) {
+        case PUMP_IN_USE :
+            TFT.ShowBitmapByName("RUN_TIME_C_ON_21_X_21",  230, 2);
+            TFT.ShowBitmapByName("RUN_TIME_L_OFF_21_X_21", 207, 9);
+            TFT.ShowBitmapByName("RUN_TIME_R_OFF_21_X_21", 253, 9);
+            break;
+        case PUMP_IN_USE_MAIN :
+            TFT.ShowBitmapByName("RUN_TIME_C_OFF_21_X_21", 230, 2);
+            TFT.ShowBitmapByName("RUN_TIME_L_ON_21_X_21",  207, 9);
+            TFT.ShowBitmapByName("RUN_TIME_R_OFF_21_X_21", 253, 9);
+            break;
+        case PUMP_IN_USE_AUX :
+            TFT.ShowBitmapByName("RUN_TIME_C_OFF_21_X_21", 230, 2);
+            TFT.ShowBitmapByName("RUN_TIME_L_OFF_21_X_21", 207, 9);
+            TFT.ShowBitmapByName("RUN_TIME_R_ON_21_X_21",  253, 9);
+            break;
+        default :
+            // PUMP_OFF
+            TFT.ShowBitmapByName("RUN_TIME_C_OFF_21_X_21", 230, 2);
+            TFT.ShowBitmapByName("RUN_TIME_L_OFF_21_X_21", 207, 9);
+            TFT.ShowBitmapByName("RUN_TIME_R_OFF_21_X_21", 253, 9);
+    }
+
+    // Draw indicators and buttons
+    int y = 0;
+    int x1 = 120;
+    int x2 = 120 + 240;
+    int xc = 240;
+    int x1b = 10;
+    int x2b = 250;
+    int xcb = 130;
+    uint8_t box_radius = 15;
+    
+    
+    // MD Running indicators
+    y += 65;
+    TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//    TFT.ShowBitmapByName("RegularButtonBlk_220x51r4t", 10,       y-25);
+//    TFT.ShowBitmapByName("RegularButtonBlk_220x51r4t", 10 + 240, y-25);
+
+RoundedRectangle(x1b, y-25+1, 219, 48, 5, 2, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0, "");
+RoundedRectangle(x2b, y-25+1, 219, 48, 5, 2, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0, "");
+
+    // SVG indicators, FT813 Font: Google Yantramanav
+    // https://www.w3schools.com/howto/tryit.asp?font=Yantramanav
+    // https://fonts.google.com/?query=Yantramanav
+//    TFT.ShowBitmapByName("MD_RUNNING_220x51", 10,       y-27);
+//    TFT.ShowBitmapByName("MD_WARNING_220x51", 10 + 240, y-27);
+//    Markus Adobe Ilustrator
+//            TFT.ShowBitmapByName("MD_RUNNING_230x70", 5, y-35);
+//            TFT.ShowBitmapByName("MD_WARNING_230x70", 245, y-35);
+
+    TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+    switch(main_indicator.md_main_running) {
+        case RUN_STATUS_RUNNING :
+            TFT.ShowBitmapByName("MD_RUNNING_220x51bt", 10, y-27);
+            break;
+        case RUN_STATUS_WARNING :
+            TFT.ShowBitmapByName("MD_WARNING_220x51bt", 10, y-27);
+            break;
+        case RUN_STATUS_DISABLED :
+            TFT.ShowBitmapByName("MD_DISABLED_220x51bt", 10, y-27);
+            break;
+        case RUN_STATUS_OFF_RED :
+            TFT.ShowBitmapByName("MD_OFF_Red_220x51bt", 10, y-27);
+            break;
+        case RUN_STATUS_OFF :
+            TFT.ShowBitmapByName("MD_OFF_Grey_220x51bt", 10, y-27);
+            break;
+        default :
+            // RUN_STATUS_BLANK: No bitmap
+            break;
+    }
+
+    switch(main_indicator.md_aux_running) {
+        case RUN_STATUS_RUNNING :
+            TFT.ShowBitmapByName("MD_RUNNING_220x51bt", 250, y-27);
+            break;
+        case RUN_STATUS_WARNING :
+            TFT.ShowBitmapByName("MD_WARNING_220x51bt", 250, y-27);
+            break;
+        case RUN_STATUS_DISABLED :
+            TFT.ShowBitmapByName("MD_DISABLED_220x51bt", 250, y-27);
+            break;
+        case RUN_STATUS_OFF_RED :
+            TFT.ShowBitmapByName("MD_OFF_Red_220x51bt", 250, y-27);
+            break;
+        case RUN_STATUS_OFF :
+            TFT.ShowBitmapByName("MD_OFF_Grey_220x51bt", 250, y-27);
+            break;
+        default :
+            // RUN_STATUS_BLANK: No bitmap
+            break;
+    }
+
+    // PHASE FAIL
+    y += 60;
+    switch(main_indicator.rb_main_phase_fail) {
+        case ALARM_STATUS_OFF :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonGray_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x1, y, 30, OPT_CENTER, "PHASE FAIL");     // text PHASE FAIL
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0x80, 0x80, 0x80, 0, "PHASE FAIL");
+            break;
+        case ALARM_STATUS_WARNING :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonYel_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x1, y, 30, OPT_CENTER, "PHASE FAIL");     // text PHASE FAIL
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0xFF, 0xFF, 0x00, 0, "PHASE FAIL");
+            break;
+        default : // ALARM_STATUS_FAILURE
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonRed_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.Text(x1, y, 30, OPT_CENTER, "PHASE FAIL");     // text PHASE FAIL
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0xFE, 0x00, 0x00, 1, "PHASE FAIL");
+    }
+
+    switch(main_indicator.rb_aux_phase_fail) {
+        case ALARM_STATUS_OFF :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonGray_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x2, y, 30, OPT_CENTER, "PHASE FAIL");     // text PHASE FAIL
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0x80, 0x80, 0x80, 0, "PHASE FAIL");
+            break;
+        case ALARM_STATUS_WARNING :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonYel_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x2, y, 30, OPT_CENTER, "PHASE FAIL");     // text PHASE FAIL
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0xFF, 0xFF, 0x00, 0, "PHASE FAIL");
+            break;
+        default : // ALARM_STATUS_FAILURE
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonRed_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.Text(x2, y, 30, OPT_CENTER, "PHASE FAIL");     // text PHASE FAIL
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0xFE, 0x00, 0x00, 1, "PHASE FAIL");
+    }
+
+    // MAIN POWER
+    y += 49;
+    switch(main_indicator.rb_main_main_power) {
+        case ALARM_STATUS_OFF :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonGray_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x1, y, 30, OPT_CENTER, "MAIN POWER");     // text MAIN POWER
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0x80, 0x80, 0x80, 0, "MAIN POWER");
+            break;
+        case ALARM_STATUS_WARNING :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonYel_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x1, y, 30, OPT_CENTER, "MAIN POWER");     // text MAIN POWER
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0xFF, 0xFF, 0x00, 0, "MAIN POWER");
+            break;
+        default : // ALARM_STATUS_FAILURE
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonRed_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.Text(x1, y, 30, OPT_CENTER, "MAIN POWER");     // text MAIN POWER
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0xFE, 0x00, 0x00, 1, "MAIN POWER");
+    }
+    
+    switch(main_indicator.rb_aux_main_power) {
+        case ALARM_STATUS_OFF :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonGray_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x2, y, 30, OPT_CENTER, "MAIN POWER");     // text MAIN POWER
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0x80, 0x80, 0x80, 0, "MAIN POWER");
+            break;
+        case ALARM_STATUS_WARNING :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonYel_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x2, y, 30, OPT_CENTER, "MAIN POWER");     // text MAIN POWER
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0xFF, 0xFF, 0x00, 0, "MAIN POWER");
+            break;
+        default : // ALARM_STATUS_FAILURE
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonRed_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.Text(x2, y, 30, OPT_CENTER, "MAIN POWER");     // text MAIN POWER
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0xFE, 0x00, 0x00, 1, "MAIN POWER");
+    }
+
+    // CTRL POWER
+    y += 49;
+    switch(main_indicator.rb_main_ctrl_power) {
+        case ALARM_STATUS_OFF :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonGray_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x1, y, 30, OPT_CENTER, "CTRL POWER");     // text CTRL POWER
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0x80, 0x80, 0x80, 0, "CTRL POWER");
+            break;
+        case ALARM_STATUS_WARNING :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonYel_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x1, y, 30, OPT_CENTER, "CTRL POWER");     // text CTRL POWER
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0xFF, 0xFF, 0x00, 0, "CTRL POWER");
+            break;
+        default : // ALARM_STATUS_FAILURE
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonRed_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.Text(x1, y, 30, OPT_CENTER, "CTRL POWER");     // text CTRL POWER
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0xFE, 0x00, 0x00, 1, "CTRL POWER");
+    }
+
+    switch(main_indicator.rb_aux_ctrl_power) {
+        case ALARM_STATUS_OFF :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonGray_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x2, y, 30, OPT_CENTER, "CTRL POWER");     // text CTRL POWER
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0x80, 0x80, 0x80, 0, "CTRL POWER");
+            break;
+        case ALARM_STATUS_WARNING :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonYel_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x2, y, 30, OPT_CENTER, "CTRL POWER");     // text CTRL POWER
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0xFF, 0xFF, 0x00, 0, "CTRL POWER");
+            break;
+        default : // ALARM_STATUS_FAILURE
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonRed_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.Text(x2, y, 30, OPT_CENTER, "CTRL POWER");     // text CTRL POWER
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0xFE, 0x00, 0x00, 1, "CTRL POWER");
+    }
+
+    // OIL PRESS
+    y += 49;
+    switch(main_indicator.rb_main_oil_press) {
+        case ALARM_STATUS_OFF :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonGray_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x1, y, 30, OPT_CENTER, "OIL PRESS");     // text OIL PRESS
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0x80, 0x80, 0x80, 0, "OIL PRESS");
+            break;
+        case ALARM_STATUS_WARNING :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonYel_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x1, y, 30, OPT_CENTER, "OIL PRESS");     // text OIL PRESS
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0xFF, 0xFF, 0x00, 0, "OIL PRESS");
+            break;
+        default : // ALARM_STATUS_FAILURE
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonRed_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.Text(x1, y, 30, OPT_CENTER, "OIL PRESS");     // text OIL PRESS
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0xFE, 0x00, 0x00, 1, "OIL PRESS");
+    }
+
+    switch(main_indicator.rb_aux_oil_press) {
+        case ALARM_STATUS_OFF :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonGray_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x2, y, 30, OPT_CENTER, "OIL PRESS");     // text OIL PRESS
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0x80, 0x80, 0x80, 0, "OIL PRESS");
+            break;
+        case ALARM_STATUS_WARNING :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonYel_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x2, y, 30, OPT_CENTER, "OIL PRESS");     // text OIL PRESS
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0xFF, 0xFF, 0x00, 0, "OIL PRESS");
+            break;
+        default : // ALARM_STATUS_FAILURE
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonRed_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.Text(x2, y, 30, OPT_CENTER, "OIL PRESS");     // text OIL PRESS
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0xFE, 0x00, 0x00, 1, "OIL PRESS");
+    }
+
+    // HYDR LOCK
+    y += 49;
+    TFT.DL(TAG(100));                             // assign TAG
+    switch(main_indicator.rb_main_hydr_lock) {
+        case ALARM_STATUS_OFF :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonGray_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x1, y, 30, OPT_CENTER, "HYDR LOCK");     // text HYDR LOCK
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0x80, 0x80, 0x80, 0, "HYDR LOCK");
+            break;
+        case ALARM_STATUS_WARNING :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonYel_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x1, y, 30, OPT_CENTER, "HYDR LOCK");     // text HYDR LOCK
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0xFF, 0xFF, 0x00, 0, "HYDR LOCK");
+            break;
+        default : // ALARM_STATUS_FAILURE
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonRed_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.Text(x1, y, 30, OPT_CENTER, "HYDR LOCK");     // text HYDR LOCK
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0xFE, 0x00, 0x00, 1, "HYDR LOCK");
+    }
+
+    TFT.DL(TAG(101));                             // assign TAG
+    switch(main_indicator.rb_aux_hydr_lock) {
+        case ALARM_STATUS_OFF :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonGray_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x2, y, 30, OPT_CENTER, "HYDR LOCK");     // text HYDR LOCK
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0x80, 0x80, 0x80, 0, "HYDR LOCK");
+            break;
+        case ALARM_STATUS_WARNING :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonYel_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x2, y, 30, OPT_CENTER, "HYDR LOCK");     // text HYDR LOCK
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0xFF, 0xFF, 0x00, 0, "HYDR LOCK");
+            break;
+        default : // ALARM_STATUS_FAILURE
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonRed_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.Text(x2, y, 30, OPT_CENTER, "HYDR LOCK");     // text HYDR LOCK
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0xFE, 0x00, 0x00, 1, "HYDR LOCK");
+    }
+
+    // OVERLOAD
+    y += 49;
+
+    switch(main_indicator.rb_main_overload) {
+        case ALARM_STATUS_OFF :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonGray_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x1, y, 30, OPT_CENTER, "OVERLOAD");     // text OVERLOAD
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0x80, 0x80, 0x80, 0, "OVERLOAD");
+            break;
+        case ALARM_STATUS_WARNING :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonYel_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x1, y, 30, OPT_CENTER, "OVERLOAD");     // text OVERLOAD
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0xFF, 0xFF, 0x00, 0, "OVERLOAD");
+            break;
+        default : // ALARM_STATUS_FAILURE
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonRed_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.Text(x1, y, 30, OPT_CENTER, "OVERLOAD");     // text OVERLOAD
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0xFE, 0x00, 0x00, 1, "OVERLOAD");
+    }
+
+    switch(main_indicator.rb_aux_overload) {
+        case ALARM_STATUS_OFF :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonGray_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x2, y, 30, OPT_CENTER, "OVERLOAD");     // text OVERLOAD
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0x80, 0x80, 0x80, 0, "OVERLOAD");
+            break;
+        case ALARM_STATUS_WARNING :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonYel_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x2, y, 30, OPT_CENTER, "OVERLOAD");     // text OVERLOAD
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0xFF, 0xFF, 0x00, 0, "OVERLOAD");
+            break;
+        default : // ALARM_STATUS_FAILURE
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonRed_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.Text(x2, y, 30, OPT_CENTER, "OVERLOAD");     // text OVERLOAD
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0xFE, 0x00, 0x00, 1, "OVERLOAD");
+    }
+
+    // OIL LEVEL
+    y += 49;
+    switch(main_indicator.rb_main_oil_level) {
+        case ALARM_STATUS_OFF :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonGray_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x1, y, 30, OPT_CENTER, "OIL LEVEL");     // text OIL LEVEL
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0x80, 0x80, 0x80, 0, "OIL LEVEL");
+            break;
+        case ALARM_STATUS_WARNING :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonYel_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x1, y, 30, OPT_CENTER, "OIL LEVEL");     // text OIL LEVEL
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0xFF, 0xFF, 0x00, 0, "OIL LEVEL");
+            break;
+        default : // ALARM_STATUS_FAILURE
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonRed_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.Text(x1, y, 30, OPT_CENTER, "OIL LEVEL");     // text OIL LEVEL
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0xFE, 0x00, 0x00, 1, "OIL LEVEL");
+    }
+
+    switch(main_indicator.rb_aux_oil_level) {
+        case ALARM_STATUS_OFF :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonGray_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x2, y, 30, OPT_CENTER, "OIL LEVEL");     // text OIL LEVEL
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0x80, 0x80, 0x80, 0, "OIL LEVEL");
+            break;
+        case ALARM_STATUS_WARNING :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonYel_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x2, y, 30, OPT_CENTER, "OIL LEVEL");     // text OIL LEVEL
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0xFF, 0xFF, 0x00, 0, "OIL LEVEL");
+            break;
+        default : // ALARM_STATUS_FAILURE
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonRed_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.Text(x2, y, 30, OPT_CENTER, "OIL LEVEL");     // text OIL LEVEL
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0xFE, 0x00, 0x00, 1, "OIL LEVEL");
+    }
+
+    // OIL FILTER
+    y += 49;
+    switch(main_indicator.rb_main_oil_filter) {
+        case ALARM_STATUS_OFF :
+            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//    TFT.DL(COLOR_RGB(0x60, 0x60, 0x60));        // set current color to white    
+//    TFT.RectWH(x1b+1, y-25+1, 217, 48, 1);
+//    TFT.DL(COLOR_RGB(0x80, 0x80, 0x80));        // set current color to white    
+//    TFT.RectWH(x1b+1+4, y-25+1+4, 217-8, 48-8, 1);
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0x80, 0x80, 0x80, 0, "OIL FILTER");
+//            TFT.ShowBitmapByName("RegularButtonGray_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+            break;
+        case ALARM_STATUS_WARNING :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonYel_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x1, y, 30, OPT_CENTER, "OIL FILTER");     // text OIL FILTER
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0xFF, 0xFF, 0x00, 0, "OIL FILTER");
+            break;
+        default : // ALARM_STATUS_FAILURE
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonRed_220x51r0t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.Text(x1, y, 30, OPT_CENTER, "OIL FILTER");     // text OIL FILTER
+    RegularButton(x1b, y-25+1, 219, 48, 1, 0, 0xFE, 0x00, 0x00, 1, "OIL FILTER");
+    }
+
+//    TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to white
+//    TFT.Text(x1, y, 30, OPT_CENTER, "OIL FILTER");     // text OIL FILTER
+
+
+
+    switch(main_indicator.rb_aux_oil_filter) {
+        case ALARM_STATUS_OFF :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonGray_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x2, y, 30, OPT_CENTER, "OIL FILTER");     // text OIL FILTER
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0x80, 0x80, 0x80, 0, "OIL FILTER");
+            break;
+        case ALARM_STATUS_WARNING :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonYel_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x2, y, 30, OPT_CENTER, "OIL FILTER");     // text OIL FILTER
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0xFF, 0xFF, 0x00, 0, "OIL FILTER");
+            break;
+        default : // ALARM_STATUS_FAILURE
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonRed_220x51r0t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.Text(x2, y, 30, OPT_CENTER, "OIL FILTER");     // text OIL FILTER
+    RegularButton(x2b, y-25+1, 219, 48, 1, 0, 0xFE, 0x00, 0x00, 1, "OIL FILTER");
+    }
+
+    // OIL TEMP
+    y += 49;
+    switch(main_indicator.rb_main_oil_temp) {
+        case ALARM_STATUS_OFF :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonGray_220x51r0r10t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x1, y, 30, OPT_CENTER, "OIL TEMP");     // text OIL TEMP
+    RegularButton(x1b, y-25+1, 219, 48, box_radius, 1, 0x80, 0x80, 0x80, 0, "OIL TEMP");
+            break;
+        case ALARM_STATUS_WARNING :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonYel_220x51r0r10t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x1, y, 30, OPT_CENTER, "OIL TEMP");     // text OIL TEMP
+    RegularButton(x1b, y-25+1, 219, 48, box_radius, 1, 0xFF, 0xFF, 0x00, 0, "OIL TEMP");
+            break;
+        default : // ALARM_STATUS_FAILURE
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonRed_220x51r0r10t", x1b, y-25);
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.Text(x1, y, 30, OPT_CENTER, "OIL TEMP");     // text OIL TEMP
+    RegularButton(x1b, y-25+1, 219, 48, box_radius, 1, 0xFE, 0x00, 0x00, 1, "OIL TEMP");
+    }
+
+//    TFT.Text(x1, y, 30, OPT_CENTER, "OIL TEMP");     // text OIL TEMP
+
+    switch(main_indicator.rb_aux_oil_temp) {
+        case ALARM_STATUS_OFF :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonGray_220x51r0r10t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x2, y, 30, OPT_CENTER, "OIL TEMP");     // text OIL TEMP
+    RegularButton(x2b, y-25+1, 219, 48, box_radius, 1, 0x80, 0x80, 0x80, 0, "OIL TEMP");
+            break;
+        case ALARM_STATUS_WARNING :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonYel_220x51r0r10t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(x2, y, 30, OPT_CENTER, "OIL TEMP");     // text OIL TEMP
+    RegularButton(x2b, y-25+1, 219, 48, box_radius, 1, 0xFF, 0xFF, 0x00, 0, "OIL TEMP");
+            break;
+        default : // ALARM_STATUS_FAILURE
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonRed_220x51r0r10t", x2b, y-25);
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.Text(x2, y, 30, OPT_CENTER, "OIL TEMP");     // text OIL TEMP
+    RegularButton(x2b, y-25+1, 219, 48, box_radius, 1, 0xFE, 0x00, 0x00, 1, "OIL TEMP");
+    }
+
+    // FU FAILURE
+    y = yFuBox; // 557
+    switch(main_indicator.rb_fu_failure) {
+        case ALARM_STATUS_OFF :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonGray_220x51r10t", xcb, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(xc, y, 30, OPT_CENTER, "FU FAILURE");     // text FU FAILURE
+    RegularButton(xcb, y+5, 219, 48, box_radius, 2, 0x80, 0x80, 0x80, 0, "FU FAILURE");
+            break;
+        case ALARM_STATUS_WARNING :
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonYel_220x51r10t", xcb, y-25);
+//            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+//            TFT.Text(xc, y, 30, OPT_CENTER, "FU FAILURE");     // text FU FAILURE
+    RegularButton(xcb, y+5, 219, 48, box_radius, 2, 0xFF, 0xFF, 0x00, 0, "FU FAILURE");
+            break;
+        default : // ALARM_STATUS_FAILURE
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.ShowBitmapByName("RegularButtonRed_220x51r10t", xcb, y-25);
+//            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+//            TFT.Text(xc, y, 30, OPT_CENTER, "FU FAILURE");     // text FU FAILURE
+    RegularButton(xcb, y+5, 219, 48, box_radius, 2, 0xFE, 0x00, 0x00, 1, "FU FAILURE");
+    }
+
+
+    // BUTTON SET
+    TFT.DL(TAG(BUTTON_SET_TAG));                             // assign TAG
+    TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+    if (main_button.set_pressed == 0) {
+        TFT.ShowBitmapByName("SwitchOn_115x66_t", 5,   y-4);
+        TFT.DL(COLOR_RGB(0xB0, 0xB0, 0xB0));        // set current color to white
+    } else {
+        TFT.ShowBitmapByName("SwitchOff_115x66_t", 5,   y-4);
+        TFT.DL(COLOR_RGB(0x90, 0x90, 0x90));        // set current color to white
+    }
+//    TFT.Text(63, y+1, 30, OPT_CENTER, "SET");         // text SET
+    TFT.ShowBitmapByName("settings_40x40", 42,   y-4+13);
+
+    // BUTTON DIM
+    TFT.DL(TAG(BUTTON_DIM_TAG));                             // assign TAG
+    TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+    if (main_button.dim_pressed == 0) {
+        TFT.ShowBitmapByName("SwitchOn_115x66_t", 360, y-4);
+        TFT.DL(COLOR_RGB(0xB0, 0xB0, 0xB0));        // set current color to white
+    } else {
+        TFT.ShowBitmapByName("SwitchOff_115x66_t", 360, y-4);
+        TFT.DL(COLOR_RGB(0x90, 0x90, 0x90));        // set current color to white
+    }
+//    TFT.Text(418, y+1, 30, OPT_CENTER, "DIM");        // text DIM
+    TFT.ShowBitmapByName("light-bulb_40x40", 397,   y-4+13);
+
+
+    // Accept Switches
+    y = 623;
+    // BUTTON ACCEPT ALARM
+    TFT.DL(TAG(BUTTON_ACCEPT_ALARM_TAG));                             // assign TAG
+    TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+    if (main_button.accept_alarm_pressed == 0)
+        TFT.ShowBitmapByName("SwitchOn_234x132", 3, y);
+    else
+        TFT.ShowBitmapByName("SwitchOff_234x132", 3, y);
+    TFT.Text(x1, y+49, 30, OPT_CENTER, "ACCEPT");     // text OIL PRESS
+    TFT.Text(x1, y+84, 30, OPT_CENTER, "ALARM");     // text OIL PRESS
+
+    // BUTTON ACCEPT HORN
+    TFT.DL(TAG(BUTTON_ACCEPT_HORN_TAG));                             // assign TAG
+    TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+    if (main_button.accept_horn_pressed == 0)
+        TFT.ShowBitmapByName("SwitchOn_234x132", 3 + 240, y);
+    else
+        TFT.ShowBitmapByName("SwitchOff_234x132", 3 + 240, y);
+    TFT.Text(x2, y+49, 30, OPT_CENTER, "ACCEPT");     // text OIL PRESS
+    TFT.Text(x2, y+84, 30, OPT_CENTER, "HORN");     // text OIL PRESS
+
+    TFT.DL(DISPLAY());                          // Display the image
+    TFT.Swap();                                 // Swap the current display list
+    TFT.Flush_Co_Buffer();                      // Download the command list into fifo
+    TFT.WaitCmdfifo_empty();                    // Wait till coprocessor completes the operation
+}
+
+void RegularButton(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t corner, uint8_t style, uint8_t R, uint8_t G, uint8_t B, uint8_t text_color, char *text)
+{
+    uint8_t linewidth = 4;
+    uint8_t corner_inner = corner - linewidth;
+    if (corner_inner < 1) {
+       corner_inner = 1;
+    }
+    uint8_t Rd = R * 0.5;
+    uint8_t Gd = G * 0.5;
+    uint8_t Bd = B * 0.5;
+    uint16_t x1 = x0 + w / 2;
+    uint16_t y1 = y0 + h / 2;
+    if (style == 0) {
+        TFT.DL(COLOR_RGB(Rd, Gd, Bd));        // set current color to white    
+        TFT.RectWH(x0, y0, w, h, 1);
+        TFT.DL(COLOR_RGB(R, G, B));        // set current color to white    
+        TFT.RectWH(x0+linewidth, y0+linewidth, w-linewidth*2, h-linewidth*2, 1);
+    } else if (style == 1) {
+        if (corner < linewidth) {
+            corner = linewidth;
+        }
+        if (corner_inner < 1) {
+            corner_inner = 1;
+        }
+        TFT.DL(COLOR_RGB(Rd, Gd, Bd));        // set current color to white    
+        TFT.RectWH(x0, y0, corner, corner, 1);              // left top rect
+        TFT.RectWH(x0+w-corner, y0, corner, corner, 1);     // right top rect
+        TFT.RectWH(x0, y0, w, h, corner);
+        TFT.DL(COLOR_RGB(R, G, B));        // set current color to white    
+        TFT.RectWH(x0+linewidth, y0+linewidth, corner, corner, 1);                          // left top rect
+        TFT.RectWH(x0+w-linewidth-corner, y0+linewidth, corner, corner, 1);    // right top rect
+        TFT.RectWH(x0+linewidth, y0+linewidth, w-linewidth*2, h-linewidth*2, corner_inner);
+    } else if (style == 2) {
+        if (corner < linewidth) {
+            corner = linewidth;
+        }
+        if (corner_inner < 1) {
+            corner_inner = 1;
+        }
+        TFT.DL(COLOR_RGB(Rd, Gd, Bd));        // set current color to white    
+        TFT.RectWH(x0, y0, w, h, corner);
+        TFT.DL(COLOR_RGB(R, G, B));        // set current color to white    
+        TFT.RectWH(x0+linewidth, y0+linewidth, w-linewidth*2, h-linewidth*2, corner_inner);
+    }
+    if (text_color == 0) {
+        TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+    }
+    else {
+        TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+    }
+    TFT.Text(x1, y1, 30, OPT_CENTER, text);     // text OIL TEMP   
+}
+
+void RoundedRectangle(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t corner, uint8_t style, uint8_t Ro, uint8_t Go, uint8_t Bo, uint8_t Ri, uint8_t Gi, uint8_t Bi, uint8_t text_color, char *text)
+{
+    uint8_t linewidth = 4;
+    uint8_t corner_inner = corner - linewidth;
+    uint16_t x1 = x0 + w / 2;
+    uint16_t y1 = y0 + h / 2;
+    if (style == 0) {
+        TFT.DL(COLOR_RGB(Ro, Go, Bo));        // set current color to white    
+        TFT.RectWH(x0, y0, w, h, 1);
+        TFT.DL(COLOR_RGB(Ri, Gi, Bi));        // set current color to white    
+        TFT.RectWH(x0+linewidth, y0+linewidth, w-linewidth*2, h-linewidth*2, 1);
+    } else if (style == 1) {
+        if (corner < linewidth) {
+            corner = linewidth;
+        }
+        if (corner_inner < linewidth) {
+            corner_inner = linewidth;
+        }
+        TFT.DL(COLOR_RGB(Ro, Go, Bo));        // set current color to white    
+        TFT.RectWH(x0, y0, corner, corner, 1);
+        TFT.RectWH(x0+w-corner, y0, corner, corner, 1);
+        TFT.RectWH(x0, y0, w, h, corner);
+        TFT.DL(COLOR_RGB(Ri, Gi, Bi));        // set current color to white    
+        TFT.RectWH(x0+linewidth, y0+linewidth, corner, corner, 1);
+        TFT.RectWH(x0+linewidth+w-corner-corner_inner, y0+linewidth, corner, corner, 1);
+        TFT.RectWH(x0+linewidth, y0+linewidth, w-linewidth*2, h-linewidth*2, corner_inner);
+    } else if (style == 2) {
+        if (corner < linewidth) {
+            corner = linewidth;
+        }
+        if (corner_inner < linewidth) {
+            corner_inner = linewidth;
+        }
+        TFT.DL(COLOR_RGB(Ro, Go, Bo));        // set current color to white    
+        TFT.RectWH(x0, y0, w, h, corner);
+        TFT.DL(COLOR_RGB(Ri, Gi, Bi));        // set current color to white    
+        TFT.RectWH(x0+linewidth, y0+linewidth, w-linewidth*2, h-linewidth*2, corner_inner);
+    }
+    // Text
+//    if (strlen(text) > 0) {
+        if (text_color == 0) {
+            TFT.DL(COLOR_RGB(0x00, 0x00, 0x00));        // set current color to black
+        }
+        else {
+            TFT.DL(COLOR_RGB(0xFF, 0xFF, 0xFF));        // set current color to white
+        }
+        TFT.Text(x1, y1, 30, OPT_CENTER, text);     // text   
+//    }
+}
+
+void updateAlarmLights(void)
+{
+    // Set indicators to OFF, BLINK, or STEADY_OFF ON
+    // Status can be OFF, WARNING, and FAILURE
+    // Update screen if something changed
+    
+    bool updatePage = false;
+    if (blinker.read() >= 0.5) {
+        blinker.reset();
+        
+        
+        // Blink all indicators synchonously
+        mainBlink = !mainBlink;
+                
+        // All Main and Aux alarms
+        for(int system = MAIN_SYSTEM; system <= GLOBAL_SYSTEM; system++) {
+            // MAIN_SYSTEM, AUX_SYSTEM, GLOBAL_SYSTEM
+            for(int alarm = PHASE_FAIL; alarm <= FU_FAILURE; alarm++) {
+                // PHASE_FAIL, MAIN_POWER, CTRL_POWER, OIL_PRESS, HYDR_LOCK,
+                // OVERLOAD, OIL_LEVEL, OIL_FILTER, OIL_TEMP, FU_FAILURE
+    
+                if (getAlarmBlinkStatus((System)system, (Alarm)alarm) == STEADY_OFF) {
+                    setAlarmStatus((System)system, (Alarm)alarm, ALARM_STATUS_OFF);
+                }
+                if (getAlarmBlinkStatus((System)system, (Alarm)alarm) == BLINK_WARNING_ON) {
+                    toggleAlarmStatus((System)system, (Alarm)alarm, ALARM_STATUS_WARNING);
+                }
+                if (getAlarmBlinkStatus((System)system, (Alarm)alarm) == STEADY_WARNING_ON) {
+                    setAlarmStatus((System)system, (Alarm)alarm, ALARM_STATUS_WARNING);
+                }
+                if (getAlarmBlinkStatus((System)system, (Alarm)alarm) == BLINK_FAILURE_ON) {
+                    toggleAlarmStatus((System)system, (Alarm)alarm, ALARM_STATUS_FAILURE);
+                }
+                if (getAlarmBlinkStatus((System)system, (Alarm)alarm) == STEADY_FAILURE_ON) {
+                    setAlarmStatus((System)system, (Alarm)alarm, ALARM_STATUS_FAILURE);
+                }
+            }
+            if (system != GLOBAL_SYSTEM) {
+//                printf("getPumpRunningBlinkStatus(%d) = %d\n", system, getPumpRunningBlinkStatus((System)system));
+                if (getPumpRunningBlinkStatus((System)system) == STEADY_OFF) {
+                    setPumpRunningStatus((System)system, RUN_STATUS_OFF);
+                }
+                if (getPumpRunningBlinkStatus((System)system) == BLINK_WARNING_ON) {
+                    togglePumpRunningStatus((System)system, RUN_STATUS_WARNING);
+                }
+                if (getPumpRunningBlinkStatus((System)system) == STEADY_WARNING_ON) {
+                    setPumpRunningStatus((System)system, RUN_STATUS_WARNING);
+                }
+                if (getPumpRunningBlinkStatus((System)system) == BLINK_DISABLED_ON) {
+                    togglePumpRunningStatus((System)system, RUN_STATUS_DISABLED);
+                }
+                if (getPumpRunningBlinkStatus((System)system) == STEADY_DISABLED_ON) {
+                    setPumpRunningStatus((System)system, RUN_STATUS_DISABLED);
+                }
+                if (getPumpRunningBlinkStatus((System)system) == BLINK_RUNNING_ON) {
+                    togglePumpRunningStatus((System)system, RUN_STATUS_RUNNING);
+                }
+                if (getPumpRunningBlinkStatus((System)system) == STEADY_RUNNING_ON) {
+                    setPumpRunningStatus((System)system, RUN_STATUS_RUNNING);
+                }
+                if (getPumpRunningBlinkStatus((System)system) == BLINK_OFF_RED_ON) {
+                    togglePumpRunningStatus((System)system, RUN_STATUS_OFF_RED);
+                }
+                if (getPumpRunningBlinkStatus((System)system) == STEADY_OFF_RED_ON) {
+                    setPumpRunningStatus((System)system, RUN_STATUS_OFF_RED);
+                }
+            }    
+        }
+        if (checkIndicatorsChanged()) {
+            main_indicator_previous = main_indicator;
+            updatePage = true;
+        }
+        if (updatePage) {
+            showMainPage();
+        }
+    }
+}
+
+void processButtonPressed(uint16_t tagval)
+{
+    switch(tagval) {
+        case BUTTON_ACCEPT_ALARM_TAG :
+            setButtonAcceptAlarm(BUTTON_PRESSED);       // Flag Accept Alarm button is in pressed state
+            break;
+        case BUTTON_ACCEPT_HORN_TAG :
+            setButtonAcceptHorn(BUTTON_PRESSED);        // Flag Accept Horn button is in pressed state
+            break;
+        case BUTTON_SET_TAG :
+            setButtonSet(BUTTON_PRESSED);               // Flag Set button is in pressed state
+//            testIndicators();                   // Jack TEST
+            break;
+        case BUTTON_DIM_TAG :
+            setButtonDim(BUTTON_PRESSED);               // Flag Dim button is in pressed state
+            toggleDisplayBrighnessSelect();             // Toggle display brightness
+            break;
+        case 100 :
+            testIndicators();                   // Jack TEST
+            break;
+    }
+}
+
+void processButtonReleased(void)
+{
+    if (getButtonAcceptAlarm() != BUTTON_RELEASED) {
+        setButtonAcceptAlarm(BUTTON_RELEASED);          // Flag Accept Alarm button is in released state
+    }
+    if (getButtonAcceptHorn() != BUTTON_RELEASED) {
+        setButtonAcceptHorn(BUTTON_RELEASED);           // Flag Accept Horn button is in released state
+    }
+    if (getButtonSet() != BUTTON_RELEASED) {
+        setButtonSet(BUTTON_RELEASED);                  // Flag Set button is in released state
+    }
+    if (getButtonDim() != BUTTON_RELEASED) {
+        setButtonDim(BUTTON_RELEASED);                  // Flag Dim button is in released state
+    }
+}
+
+void backupAlarms(void)
+{
+    main_indicator_backup = main_indicator;
+}
+
+void restoreAlarms(void)
+{
+    main_indicator = main_indicator_backup;
+}
+
+uint8_t getDisplayBrighnessSelect(void)
+{
+    return brightnessSelect;
+}
+
+void setDisplayBrighnessSelect(uint8_t select)
+{
+    brightnessSelect = select;
+    if (select == BIGHTNESS_SELECT_LOW) {
+        TFT.SetBacklight(brightnessLow); // Brightness Low
+    }
+    if (select == BIGHTNESS_SELECT_HIGH) {
+        TFT.SetBacklight(brightnessHigh); // Brightness High
+    }
+}
+
+void toggleDisplayBrighnessSelect(void)
+{
+    if (getDisplayBrighnessSelect() == BIGHTNESS_SELECT_HIGH) {
+        setDisplayBrighnessSelect(BIGHTNESS_SELECT_LOW);
+    } else {
+        setDisplayBrighnessSelect(BIGHTNESS_SELECT_HIGH);
+    }
+}
+
+void setDisplayBrighnessHigh(uint8_t value)
+{
+    brightnessHigh = value;
+}
+
+void setDisplayBrighnessLow(uint8_t value)
+{
+    brightnessLow = value;
+}
+
+uint8_t getButtonAcceptAlarm(void)
+{
+    return main_button.accept_alarm_pressed;
+}
+
+void setButtonAcceptAlarm(uint8_t status)
+{
+    main_button.accept_alarm_pressed = status;
+}
+
+uint8_t getButtonAcceptHorn(void)
+{
+    return main_button.accept_horn_pressed;
+}
+
+void setButtonAcceptHorn(uint8_t status)
+{
+    main_button.accept_horn_pressed = status;
+}
+
+uint8_t getButtonSet(void)
+{
+    return main_button.set_pressed;
+}
+
+void setButtonSet(uint8_t status)
+{
+    main_button.set_pressed = status;
+}
+
+uint8_t getButtonDim(void)
+{
+    return main_button.dim_pressed;
+}
+
+void setButtonDim(uint8_t status)
+{
+    main_button.dim_pressed = status;
+}
+
+Pump getPumpInUse(void)
+{
+    return main_indicator.pump_in_use;
+}
+
+void setPumpInUse(Pump status)
+{
+    main_indicator.pump_in_use = status;
+}
+
+IndicatorLightStatus getPumpInUseBlinkStatus(void)
+{
+    return main_indicator.pump_in_use_light;
+}
+
+void setPumpInUseBlinkStatus(IndicatorLightStatus status)
+{
+    main_indicator.pump_in_use_light = status;
+}
+
+
+
+IndicatorLightStatus getPumpRunningBlinkStatus(System system)
+{
+    if (system == MAIN_SYSTEM) {
+       return main_indicator.md_main_running_light;
+    }
+    if (system == AUX_SYSTEM) {
+        return main_indicator.md_aux_running_light;
+    }
+    return STEADY_OFF;
+}
+
+void setPumpRunningBlinkStatus(System system, IndicatorLightStatus status)
+{
+    if (system == MAIN_SYSTEM) {
+        main_indicator.md_main_running_light = status;
+    } else if (system == AUX_SYSTEM) {
+        main_indicator.md_aux_running_light = status;
+    }
+}
+
+IndicatorRunStatus getPumpRunningStatus(System system)
+{
+    if (system == MAIN_SYSTEM) {
+        return main_indicator.md_main_running;
+    } else if (system == AUX_SYSTEM) {
+        return main_indicator.md_aux_running;
+    }
+    return RUN_STATUS_BLANK;
+}
+
+void setPumpRunningStatus(System system, IndicatorRunStatus status)
+{
+    if (system == MAIN_SYSTEM) {
+        main_indicator.md_main_running = status;
+    } else if (system == AUX_SYSTEM) {
+        main_indicator.md_aux_running = status;
+    }
+}
+
+void togglePumpRunningStatus(System system, IndicatorRunStatus status)
+{
+    if (mainBlink) {
+        setPumpRunningStatus(system, status);
+    } else {       
+        setPumpRunningStatus(system, RUN_STATUS_BLANK);
+    }
+}
+
+IndicatorLightStatus getAlarmBlinkStatus(System system, Alarm alarm)
+{
+    if (system == MAIN_SYSTEM) {
+        // MAIN_SYSTEM
+        switch(alarm) {
+            case PHASE_FAIL :
+                return main_indicator.rb_main_phase_fail_light;
+            case MAIN_POWER :
+                return main_indicator.rb_main_main_power_light;
+            case CTRL_POWER :
+                return main_indicator.rb_main_ctrl_power_light;
+            case OIL_PRESS :
+                return main_indicator.rb_main_oil_press_light;
+            case HYDR_LOCK :
+                return main_indicator.rb_main_hydr_lock_light;
+            case OVERLOAD :
+                return main_indicator.rb_main_overload_light;
+            case OIL_LEVEL :
+                return main_indicator.rb_main_oil_level_light;
+            case OIL_FILTER :
+                return main_indicator.rb_main_oil_filter_light;
+            case OIL_TEMP :
+                return main_indicator.rb_main_oil_temp_light;
+            default :
+                return STEADY_OFF;
+        }
+    } else if (system == AUX_SYSTEM) {
+        // AUX_SYSTEM
+        switch(alarm) {
+            case PHASE_FAIL :
+                return main_indicator.rb_aux_phase_fail_light;
+            case MAIN_POWER :
+                return main_indicator.rb_aux_main_power_light;
+            case CTRL_POWER :
+                return main_indicator.rb_aux_ctrl_power_light;
+            case OIL_PRESS :
+                return main_indicator.rb_aux_oil_press_light;
+            case HYDR_LOCK :
+                return main_indicator.rb_aux_hydr_lock_light;
+            case OVERLOAD :
+                return main_indicator.rb_aux_overload_light;
+            case OIL_LEVEL :
+                return main_indicator.rb_aux_oil_level_light;
+            case OIL_FILTER :
+                return main_indicator.rb_aux_oil_filter_light;
+            case OIL_TEMP :
+                return main_indicator.rb_aux_oil_temp_light;
+            default :
+                return STEADY_OFF;
+        }
+    } else if (system == GLOBAL_SYSTEM) {
+        // GLOBAL_SYSTEM
+        switch(alarm) {
+            case FU_FAILURE :
+                return main_indicator.rb_fu_failure_light;
+            default :
+                return STEADY_OFF;
+        }
+    }
+    return STEADY_OFF;
+}
+
+void setAlarmBlinkStatus(System system, Alarm alarm, IndicatorLightStatus status)
+{
+    if (system == MAIN_SYSTEM) {
+        // MAIN_SYSTEM
+        switch(alarm) {
+            case PHASE_FAIL :
+                main_indicator.rb_main_phase_fail_light = status;
+                break;
+            case MAIN_POWER :
+                main_indicator.rb_main_main_power_light = status;
+                break;
+            case CTRL_POWER :
+                main_indicator.rb_main_ctrl_power_light = status;
+                break;
+            case OIL_PRESS :
+                main_indicator.rb_main_oil_press_light = status;
+                break;
+            case HYDR_LOCK :
+                main_indicator.rb_main_hydr_lock_light = status;
+                break;
+            case OVERLOAD :
+                main_indicator.rb_main_overload_light = status;
+                break;
+            case OIL_LEVEL :
+                main_indicator.rb_main_oil_level_light = status;
+                break;
+            case OIL_FILTER :
+                main_indicator.rb_main_oil_filter_light = status;
+                break;
+            case OIL_TEMP :
+                main_indicator.rb_main_oil_temp_light = status;
+                break;
+        }
+    } else if (system == AUX_SYSTEM) {
+        // AUX_SYSTEM
+        switch(alarm) {
+            case PHASE_FAIL :
+                main_indicator.rb_aux_phase_fail_light = status;
+                break;
+            case MAIN_POWER :
+                main_indicator.rb_aux_main_power_light = status;
+                break;
+            case CTRL_POWER :
+                main_indicator.rb_aux_ctrl_power_light = status;
+                break;
+            case OIL_PRESS :
+                main_indicator.rb_aux_oil_press_light = status;
+                break;
+            case HYDR_LOCK :
+                main_indicator.rb_aux_hydr_lock_light = status;
+                break;
+            case OVERLOAD :
+                main_indicator.rb_aux_overload_light = status;
+                break;
+            case OIL_LEVEL :
+                main_indicator.rb_aux_oil_level_light = status;
+                break;
+            case OIL_FILTER :
+                main_indicator.rb_aux_oil_filter_light = status;
+                break;
+            case OIL_TEMP :
+                main_indicator.rb_aux_oil_temp_light = status;
+                break;
+        }
+    } else if (system == GLOBAL_SYSTEM) {
+        // GLOBAL_SYSTEM
+        switch(alarm) {
+            case FU_FAILURE :
+                main_indicator.rb_fu_failure_light = status;
+                break;
+        }
+    }
+}
+
+IndicatorAlarmStatus getAlarmStatus(System system, Alarm alarm)
+{
+    if (system == MAIN_SYSTEM) {
+        // MAIN_SYSTEM
+        switch(alarm) {
+            case PHASE_FAIL :
+                return main_indicator.rb_main_phase_fail;
+            case MAIN_POWER :
+                return main_indicator.rb_main_main_power;
+            case CTRL_POWER :
+                return main_indicator.rb_main_ctrl_power;
+            case OIL_PRESS :
+                return main_indicator.rb_main_oil_press;
+            case HYDR_LOCK :
+                return main_indicator.rb_main_hydr_lock;
+            case OVERLOAD :
+                return main_indicator.rb_main_overload;
+            case OIL_LEVEL :
+                return main_indicator.rb_main_oil_level;
+            case OIL_FILTER :
+                return main_indicator.rb_main_oil_filter;
+            case OIL_TEMP :
+                return main_indicator.rb_main_oil_temp;
+            default :
+                return ALARM_STATUS_OFF;
+        }
+    } else if (system == AUX_SYSTEM) {
+        // AUX_SYSTEM
+        switch(alarm) {
+            case PHASE_FAIL :
+                return main_indicator.rb_aux_phase_fail;
+            case MAIN_POWER :
+                return main_indicator.rb_aux_main_power;
+            case CTRL_POWER :
+                return main_indicator.rb_aux_ctrl_power;
+            case OIL_PRESS :
+                return main_indicator.rb_aux_oil_press;
+            case HYDR_LOCK :
+                return main_indicator.rb_aux_hydr_lock;
+            case OVERLOAD :
+                return main_indicator.rb_aux_overload;
+            case OIL_LEVEL :
+                return main_indicator.rb_aux_oil_level;
+            case OIL_FILTER :
+                return main_indicator.rb_aux_oil_filter;
+            case OIL_TEMP :
+                return main_indicator.rb_aux_oil_temp;
+            default :
+                return ALARM_STATUS_OFF;
+        }
+    } else if (system == GLOBAL_SYSTEM) {
+        // GLOBAL_SYSTEM
+        switch(alarm) {
+            case FU_FAILURE :
+                return main_indicator.rb_fu_failure;
+            default :
+                return ALARM_STATUS_OFF;
+        }
+    }
+    return ALARM_STATUS_OFF;
+}
+
+void setAlarmStatus(System system, Alarm alarm, IndicatorAlarmStatus status)
+{
+    if (system == MAIN_SYSTEM) {
+        // MAIN_SYSTEM
+        switch(alarm) {
+            case PHASE_FAIL :
+                main_indicator.rb_main_phase_fail = status;
+                break;
+            case MAIN_POWER :
+                main_indicator.rb_main_main_power = status;
+                break;
+            case CTRL_POWER :
+                main_indicator.rb_main_ctrl_power = status;
+                break;
+            case OIL_PRESS :
+                main_indicator.rb_main_oil_press = status;
+                break;
+            case HYDR_LOCK :
+                main_indicator.rb_main_hydr_lock = status;
+                break;
+            case OVERLOAD :
+                main_indicator.rb_main_overload = status;
+                break;
+            case OIL_LEVEL :
+                main_indicator.rb_main_oil_level = status;
+                break;
+            case OIL_FILTER :
+                main_indicator.rb_main_oil_filter = status;
+                break;
+            case OIL_TEMP :
+                main_indicator.rb_main_oil_temp = status;
+                break;
+        }
+    } else if (system == AUX_SYSTEM) {
+        // AUX_SYSTEM
+        switch(alarm) {
+            case PHASE_FAIL :
+                main_indicator.rb_aux_phase_fail = status;
+                break;
+            case MAIN_POWER :
+                main_indicator.rb_aux_main_power = status;
+                break;
+            case CTRL_POWER :
+                main_indicator.rb_aux_ctrl_power = status;
+                break;
+            case OIL_PRESS :
+                main_indicator.rb_aux_oil_press = status;
+                break;
+            case HYDR_LOCK :
+                main_indicator.rb_aux_hydr_lock = status;
+                break;
+            case OVERLOAD :
+                main_indicator.rb_aux_overload = status;
+                break;
+            case OIL_LEVEL :
+                main_indicator.rb_aux_oil_level = status;
+                break;
+            case OIL_FILTER :
+                main_indicator.rb_aux_oil_filter = status;
+                break;
+            case OIL_TEMP :
+                main_indicator.rb_aux_oil_temp = status;
+                break;
+        }
+    } else if (system == GLOBAL_SYSTEM) {
+        // GLOBAL_SYSTEM
+        switch(alarm) {
+            case FU_FAILURE :
+                main_indicator.rb_fu_failure = status;
+                break;
+        }
+    }
+}
+
+void toggleAlarmStatus(System system, Alarm alarm, IndicatorAlarmStatus status)
+{
+    int changed = false;
+    if (mainBlink) {
+        setAlarmStatus(system, alarm, status);
+    } else {       
+        setAlarmStatus(system, alarm, ALARM_STATUS_OFF);
+    }
+}
+
+bool checkIndicatorsChanged(void)
+{
+    bool changed = false;
+    
+    // Check if anything on the Main page was chnaged, so it can be refreshed
+    // C provides no language facilities to compare two instances of structs for equality (in standard C)
+    // Problems with memcmp: Structures can be padded, and the contents of padding bytes are undefined,
+    // dynamically allocated memory pointed to by struct members, and no guarantee of contiguity.
+    // memcmp doesn't know this and will blindly compare all bytes.
+    // Don't do this:
+    // uint8_t ret = memcmp(&main_indicator, &main_indicator_previous, sizeof(main_indicator));
+    // if (ret != 0) {
+    //     changed = true;
+    // }
+    // The only thing to do is compare each member
+
+    // The safest ways is to compare member for member (can exclude something, intended or not intended)
+    if (main_indicator.md_main_running != main_indicator_previous.md_main_running) {
+        changed = true;
+    }
+    if (main_indicator.md_main_running_light != main_indicator_previous.md_main_running_light) {
+        changed = true;
+    }
+    if (main_indicator.rb_main_phase_fail != main_indicator_previous.rb_main_phase_fail) {
+        changed = true;
+    }
+    if (main_indicator.rb_main_phase_fail_light != main_indicator_previous.rb_main_phase_fail_light) {
+        changed = true;
+    }
+    if (main_indicator.rb_main_main_power != main_indicator_previous.rb_main_main_power) {
+        changed = true;
+    }
+    if (main_indicator.rb_main_main_power_light != main_indicator_previous.rb_main_main_power_light) {
+        changed = true;
+    }
+    if (main_indicator.rb_main_ctrl_power != main_indicator_previous.rb_main_ctrl_power) {
+        changed = true;
+    }
+    if (main_indicator.rb_main_ctrl_power_light != main_indicator_previous.rb_main_ctrl_power_light) {
+        changed = true;
+    }
+    if (main_indicator.rb_main_oil_press != main_indicator_previous.rb_main_oil_press) {
+        changed = true;
+    }
+    if (main_indicator.rb_main_oil_press_light != main_indicator_previous.rb_main_oil_press_light) {
+        changed = true;
+    }
+    if (main_indicator.rb_main_hydr_lock != main_indicator_previous.rb_main_hydr_lock) {
+        changed = true;
+    }
+    if (main_indicator.rb_main_hydr_lock_light != main_indicator_previous.rb_main_hydr_lock_light) {
+        changed = true;
+    }
+    if (main_indicator.rb_main_overload != main_indicator_previous.rb_main_overload) {
+        changed = true;
+    }
+    if (main_indicator.rb_main_overload_light != main_indicator_previous.rb_main_overload_light) {
+        changed = true;
+    }
+    if (main_indicator.rb_main_oil_level != main_indicator_previous.rb_main_oil_level) {
+        changed = true;
+    }
+    if (main_indicator.rb_main_oil_level_light != main_indicator_previous.rb_main_oil_level_light) {
+        changed = true;
+    }
+    if (main_indicator.rb_main_oil_filter != main_indicator_previous.rb_main_oil_filter) {
+        changed = true;
+    }
+    if (main_indicator.rb_main_oil_filter_light != main_indicator_previous.rb_main_oil_filter_light) {
+        changed = true;
+    }
+    if (main_indicator.rb_main_oil_temp != main_indicator_previous.rb_main_oil_temp) {
+        changed = true;
+    }
+    if (main_indicator.rb_main_oil_temp_light != main_indicator_previous.rb_main_oil_temp_light) {
+        changed = true;
+    }
+    
+    if (main_indicator.md_aux_running != main_indicator_previous.md_aux_running) {
+        changed = true;
+    }
+    if (main_indicator.md_aux_running_light != main_indicator_previous.md_aux_running_light) {
+        changed = true;
+    }
+    if (main_indicator.rb_aux_phase_fail != main_indicator_previous.rb_aux_phase_fail) {
+        changed = true;
+    }
+    if (main_indicator.rb_aux_phase_fail_light != main_indicator_previous.rb_aux_phase_fail_light) {
+        changed = true;
+    }
+    if (main_indicator.rb_aux_main_power != main_indicator_previous.rb_aux_main_power) {
+        changed = true;
+    }
+    if (main_indicator.rb_aux_main_power_light != main_indicator_previous.rb_aux_main_power_light) {
+        changed = true;
+    }
+    if (main_indicator.rb_aux_ctrl_power != main_indicator_previous.rb_aux_ctrl_power) {
+        changed = true;
+    }
+    if (main_indicator.rb_aux_ctrl_power_light != main_indicator_previous.rb_aux_ctrl_power_light) {
+        changed = true;
+    }
+    if (main_indicator.rb_aux_oil_press != main_indicator_previous.rb_aux_oil_press) {
+        changed = true;
+    }
+    if (main_indicator.rb_aux_oil_press_light != main_indicator_previous.rb_aux_oil_press_light) {
+        changed = true;
+    }
+    if (main_indicator.rb_aux_hydr_lock != main_indicator_previous.rb_aux_hydr_lock) {
+        changed = true;
+    }
+    if (main_indicator.rb_aux_hydr_lock_light != main_indicator_previous.rb_aux_hydr_lock_light) {
+        changed = true;
+    }
+    if (main_indicator.rb_aux_overload != main_indicator_previous.rb_aux_overload) {
+        changed = true;
+    }
+    if (main_indicator.rb_aux_overload_light != main_indicator_previous.rb_aux_overload_light) {
+        changed = true;
+    }
+    if (main_indicator.rb_aux_oil_level != main_indicator_previous.rb_aux_oil_level) {
+        changed = true;
+    }
+    if (main_indicator.rb_aux_oil_level_light != main_indicator_previous.rb_aux_oil_level_light) {
+        changed = true;
+    }
+    if (main_indicator.rb_aux_oil_filter != main_indicator_previous.rb_aux_oil_filter) {
+        changed = true;
+    }
+    if (main_indicator.rb_aux_oil_filter_light != main_indicator_previous.rb_aux_oil_filter_light) {
+        changed = true;
+    }
+    if (main_indicator.rb_aux_oil_temp != main_indicator_previous.rb_aux_oil_temp) {
+        changed = true;
+    }
+    if (main_indicator.rb_aux_oil_temp_light != main_indicator_previous.rb_aux_oil_temp_light) {
+        changed = true;
+    }
+    if (main_indicator.rb_fu_failure != main_indicator_previous.rb_fu_failure) {
+        changed = true;
+    }
+    if (main_indicator.rb_fu_failure_light != main_indicator_previous.rb_fu_failure_light) {
+        changed = true;
+    }
+    if (main_indicator.pump_in_use != main_indicator_previous.pump_in_use) {
+        changed = true;
+    }
+    if (main_indicator.pump_in_use_light != main_indicator_previous.pump_in_use_light) {
+        changed = true;
+    }
+   
+    return changed;
+}
+
+void testIndicators(void)
+{
+    float delay = 0.5;
+    backupAlarms();
+
+    setPumpInUse(PUMP_OFF);
+    setPumpRunningStatus(MAIN_SYSTEM, RUN_STATUS_OFF);
+    setPumpRunningStatus(AUX_SYSTEM, RUN_STATUS_OFF);
+    setAlarmStatus(MAIN_SYSTEM, PHASE_FAIL, ALARM_STATUS_OFF);
+    setAlarmStatus(AUX_SYSTEM, PHASE_FAIL, ALARM_STATUS_OFF);
+    setAlarmStatus(MAIN_SYSTEM, MAIN_POWER, ALARM_STATUS_OFF);
+    setAlarmStatus(AUX_SYSTEM, MAIN_POWER, ALARM_STATUS_OFF);
+    setAlarmStatus(MAIN_SYSTEM, CTRL_POWER, ALARM_STATUS_OFF);
+    setAlarmStatus(AUX_SYSTEM, CTRL_POWER, ALARM_STATUS_OFF);
+    setAlarmStatus(MAIN_SYSTEM, OIL_PRESS, ALARM_STATUS_OFF);
+    setAlarmStatus(AUX_SYSTEM, OIL_PRESS, ALARM_STATUS_OFF);
+    setAlarmStatus(MAIN_SYSTEM, HYDR_LOCK, ALARM_STATUS_OFF);
+    setAlarmStatus(AUX_SYSTEM, HYDR_LOCK, ALARM_STATUS_OFF);
+    setAlarmStatus(MAIN_SYSTEM, OVERLOAD, ALARM_STATUS_OFF);
+    setAlarmStatus(AUX_SYSTEM, OVERLOAD, ALARM_STATUS_OFF);
+    setAlarmStatus(MAIN_SYSTEM, OIL_LEVEL, ALARM_STATUS_OFF);
+    setAlarmStatus(AUX_SYSTEM, OIL_LEVEL, ALARM_STATUS_OFF);
+    setAlarmStatus(MAIN_SYSTEM, OIL_FILTER, ALARM_STATUS_OFF);
+    setAlarmStatus(AUX_SYSTEM, OIL_FILTER, ALARM_STATUS_OFF);
+    setAlarmStatus(MAIN_SYSTEM, OIL_TEMP, ALARM_STATUS_OFF);
+    setAlarmStatus(AUX_SYSTEM, OIL_TEMP, ALARM_STATUS_OFF);
+    setAlarmStatus(GLOBAL_SYSTEM, FU_FAILURE, ALARM_STATUS_OFF);
+    showMainPage();
+    wait(1); 
+    wdt.Service();
+    
+//    for (int i = 0; i < 2; i++) {
+        setPumpInUse(PUMP_IN_USE);
+        showMainPage();
+        wait(delay); 
+        setPumpInUse(PUMP_IN_USE_MAIN);
+        showMainPage();
+        wait(delay); 
+        setPumpInUse(PUMP_IN_USE_AUX);
+        showMainPage();
+        wait(delay); 
+        setPumpInUse(PUMP_OFF);
+        showMainPage();
+        wait(delay);
+//    }
+
+    setPumpRunningStatus(MAIN_SYSTEM, RUN_STATUS_RUNNING);
+    showMainPage();
+    wait(delay); 
+    setPumpRunningStatus(MAIN_SYSTEM, RUN_STATUS_WARNING);
+    showMainPage();
+    wait(delay); 
+    setPumpRunningStatus(MAIN_SYSTEM, RUN_STATUS_DISABLED);
+    showMainPage();
+    wait(delay); 
+    setPumpRunningStatus(MAIN_SYSTEM, RUN_STATUS_OFF_RED);
+    showMainPage();
+    wait(delay);
+    setPumpRunningStatus(MAIN_SYSTEM, RUN_STATUS_OFF);
+    showMainPage();
+    wait(delay); 
+        wdt.Service();
+
+    setPumpRunningStatus(AUX_SYSTEM, RUN_STATUS_RUNNING);
+    showMainPage();
+    wait(delay); 
+    setPumpRunningStatus(AUX_SYSTEM, RUN_STATUS_WARNING);
+    showMainPage();
+    wait(delay); 
+    setPumpRunningStatus(AUX_SYSTEM, RUN_STATUS_DISABLED);
+    showMainPage();
+    wait(delay); 
+    setPumpRunningStatus(AUX_SYSTEM, RUN_STATUS_OFF_RED);
+    showMainPage();
+    wait(delay);
+    setPumpRunningStatus(AUX_SYSTEM, RUN_STATUS_OFF);
+    showMainPage();
+    wait(delay); 
+        wdt.Service();
+
+    setAlarmStatus(MAIN_SYSTEM, PHASE_FAIL, ALARM_STATUS_WARNING);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(MAIN_SYSTEM, PHASE_FAIL, ALARM_STATUS_FAILURE);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(MAIN_SYSTEM, PHASE_FAIL, ALARM_STATUS_OFF);
+    showMainPage();
+    wait(delay);
+
+    setAlarmStatus(AUX_SYSTEM, PHASE_FAIL, ALARM_STATUS_WARNING);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(AUX_SYSTEM, PHASE_FAIL, ALARM_STATUS_FAILURE);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(AUX_SYSTEM, PHASE_FAIL, ALARM_STATUS_OFF);
+    showMainPage();
+    wait(delay);
+    
+    setAlarmStatus(MAIN_SYSTEM, MAIN_POWER, ALARM_STATUS_WARNING);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(MAIN_SYSTEM, MAIN_POWER, ALARM_STATUS_FAILURE);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(MAIN_SYSTEM, MAIN_POWER, ALARM_STATUS_OFF);
+    showMainPage();
+    wait(delay);
+    wdt.Service();
+
+    setAlarmStatus(AUX_SYSTEM, MAIN_POWER, ALARM_STATUS_WARNING);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(AUX_SYSTEM, MAIN_POWER, ALARM_STATUS_FAILURE);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(AUX_SYSTEM, MAIN_POWER, ALARM_STATUS_OFF);
+    showMainPage();
+    wait(delay);
+    
+    setAlarmStatus(MAIN_SYSTEM, CTRL_POWER, ALARM_STATUS_WARNING);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(MAIN_SYSTEM, CTRL_POWER, ALARM_STATUS_FAILURE);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(MAIN_SYSTEM, CTRL_POWER, ALARM_STATUS_OFF);
+    showMainPage();
+    wait(delay);
+        wdt.Service();
+
+    setAlarmStatus(AUX_SYSTEM, CTRL_POWER, ALARM_STATUS_WARNING);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(AUX_SYSTEM, CTRL_POWER, ALARM_STATUS_FAILURE);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(AUX_SYSTEM, CTRL_POWER, ALARM_STATUS_OFF);
+    showMainPage();
+    wait(delay);
+    
+    setAlarmStatus(MAIN_SYSTEM, OIL_PRESS, ALARM_STATUS_WARNING);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(MAIN_SYSTEM, OIL_PRESS, ALARM_STATUS_FAILURE);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(MAIN_SYSTEM, OIL_PRESS, ALARM_STATUS_OFF);
+    showMainPage();
+    wait(delay);
+
+    setAlarmStatus(AUX_SYSTEM, OIL_PRESS, ALARM_STATUS_WARNING);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(AUX_SYSTEM, OIL_PRESS, ALARM_STATUS_FAILURE);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(AUX_SYSTEM, OIL_PRESS, ALARM_STATUS_OFF);
+    showMainPage();
+    wait(delay);
+        wdt.Service();
+
+    setAlarmStatus(MAIN_SYSTEM, HYDR_LOCK, ALARM_STATUS_WARNING);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(MAIN_SYSTEM, HYDR_LOCK, ALARM_STATUS_FAILURE);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(MAIN_SYSTEM, HYDR_LOCK, ALARM_STATUS_OFF);
+    showMainPage();
+    wait(delay);
+
+    setAlarmStatus(AUX_SYSTEM, HYDR_LOCK, ALARM_STATUS_WARNING);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(AUX_SYSTEM, HYDR_LOCK, ALARM_STATUS_FAILURE);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(AUX_SYSTEM, HYDR_LOCK, ALARM_STATUS_OFF);
+    showMainPage();
+    wait(delay);
+    
+    setAlarmStatus(MAIN_SYSTEM, OVERLOAD, ALARM_STATUS_WARNING);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(MAIN_SYSTEM, OVERLOAD, ALARM_STATUS_FAILURE);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(MAIN_SYSTEM, OVERLOAD, ALARM_STATUS_OFF);
+    showMainPage();
+    wait(delay);
+    wdt.Service();
+
+    setAlarmStatus(AUX_SYSTEM, OVERLOAD, ALARM_STATUS_WARNING);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(AUX_SYSTEM, OVERLOAD, ALARM_STATUS_FAILURE);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(AUX_SYSTEM, OVERLOAD, ALARM_STATUS_OFF);
+    showMainPage();
+    wait(delay);
+    
+    setAlarmStatus(MAIN_SYSTEM, OIL_LEVEL, ALARM_STATUS_WARNING);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(MAIN_SYSTEM, OIL_LEVEL, ALARM_STATUS_FAILURE);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(MAIN_SYSTEM, OIL_LEVEL, ALARM_STATUS_OFF);
+    showMainPage();
+    wait(delay);
+
+    setAlarmStatus(AUX_SYSTEM, OIL_LEVEL, ALARM_STATUS_WARNING);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(AUX_SYSTEM, OIL_LEVEL, ALARM_STATUS_FAILURE);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(AUX_SYSTEM, OIL_LEVEL, ALARM_STATUS_OFF);
+    showMainPage();
+    wait(delay);
+        wdt.Service();
+
+    setAlarmStatus(MAIN_SYSTEM, OIL_FILTER, ALARM_STATUS_WARNING);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(MAIN_SYSTEM, OIL_FILTER, ALARM_STATUS_FAILURE);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(MAIN_SYSTEM, OIL_FILTER, ALARM_STATUS_OFF);
+    showMainPage();
+    wait(delay);
+
+    setAlarmStatus(AUX_SYSTEM, OIL_FILTER, ALARM_STATUS_WARNING);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(AUX_SYSTEM, OIL_FILTER, ALARM_STATUS_FAILURE);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(AUX_SYSTEM, OIL_FILTER, ALARM_STATUS_OFF);
+    showMainPage();
+    wait(delay);
+    
+    setAlarmStatus(MAIN_SYSTEM, OIL_TEMP, ALARM_STATUS_WARNING);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(MAIN_SYSTEM, OIL_TEMP, ALARM_STATUS_FAILURE);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(MAIN_SYSTEM, OIL_TEMP, ALARM_STATUS_OFF);
+    showMainPage();
+    wait(delay);
+    wdt.Service();
+
+    setAlarmStatus(AUX_SYSTEM, OIL_TEMP, ALARM_STATUS_WARNING);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(AUX_SYSTEM, OIL_TEMP, ALARM_STATUS_FAILURE);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(AUX_SYSTEM, OIL_TEMP, ALARM_STATUS_OFF);
+    showMainPage();
+    wait(delay);
+    
+    setAlarmStatus(GLOBAL_SYSTEM, FU_FAILURE, ALARM_STATUS_WARNING);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(GLOBAL_SYSTEM, FU_FAILURE, ALARM_STATUS_FAILURE);
+    showMainPage();
+    wait(delay);
+    setAlarmStatus(GLOBAL_SYSTEM, FU_FAILURE, ALARM_STATUS_OFF);
+    showMainPage();
+    wait(delay);
+       wdt.Service();
+
+    restoreAlarms();
+    showMainPage();
+}
diff -r 000000000000 -r 0ee5e6b7245e AP3000.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/AP3000.h	Mon Jul 23 12:24:05 2018 +0000
@@ -0,0 +1,196 @@
+#ifndef __AP3000_H__
+#define __AP3000_H__
+
+#include "mbed.h"
+#include "main.h"
+
+#define TAGVAL_NONE 0xffff
+
+#define BUTTON_ACCEPT_ALARM_TAG 1
+#define BUTTON_ACCEPT_HORN_TAG 2
+#define BUTTON_SET_TAG 3
+#define BUTTON_DIM_TAG 4
+
+#define BUTTON_RELEASED 0
+#define BUTTON_PRESSED 1
+
+#define BIGHTNESS_SELECT_LOW  0
+#define BIGHTNESS_SELECT_HIGH 1
+
+#define INDICATOR_OFF 0
+#define INDICATOR_ON  1
+
+//#define INDICATOR_RUN_STATUS_OFF 0
+//#define INDICATOR_RUN_STATUS_RUNNING 1
+//#define INDICATOR_RUN_STATUS_WARNING 2
+//#define INDICATOR_RUN_STATUS_OFF_RED 3
+//#define INDICATOR_RUN_STATUS_DISABLED 4
+//
+//#define INDICATOR_ALARM_STATUS_OFF 0
+//#define INDICATOR_ALARM_STATUS_WARNING 1
+//#define INDICATOR_ALARM_STATUS_FAILURE 2
+
+enum System {
+    MAIN_SYSTEM = 0,
+    AUX_SYSTEM,
+    GLOBAL_SYSTEM
+};
+
+enum Alarm {
+    PHASE_FAIL = 0,
+    MAIN_POWER,
+    CTRL_POWER,
+    OIL_PRESS,
+    HYDR_LOCK,
+    OVERLOAD,
+    OIL_LEVEL,
+    OIL_FILTER,
+    OIL_TEMP,
+    FU_FAILURE
+};
+
+enum IndicatorRunStatus {
+    RUN_STATUS_OFF = 0,
+    RUN_STATUS_RUNNING,
+    RUN_STATUS_WARNING,
+    RUN_STATUS_DISABLED,
+    RUN_STATUS_OFF_RED,
+    RUN_STATUS_BLANK
+};
+
+enum IndicatorAlarmStatus {
+    ALARM_STATUS_OFF = 0,
+    ALARM_STATUS_WARNING,
+    ALARM_STATUS_FAILURE
+};
+
+enum Pump {
+    PUMP_OFF = 0,
+    PUMP_IN_USE,
+    PUMP_IN_USE_MAIN,
+    PUMP_IN_USE_AUX
+};
+
+enum IndicatorLightStatus {
+    STEADY_OFF = 0,
+    BLINK_WARNING_ON,
+    STEADY_WARNING_ON,
+    BLINK_FAILURE_ON,
+    STEADY_FAILURE_ON,
+    BLINK_RUNNING_ON,
+    STEADY_RUNNING_ON,
+    BLINK_DISABLED_ON,
+    STEADY_DISABLED_ON,
+    BLINK_OFF_RED_ON,
+    STEADY_OFF_RED_ON
+};
+
+typedef struct Button {
+    uint8_t accept_alarm_pressed;
+    uint8_t accept_horn_pressed;
+    uint8_t set_pressed;
+    uint8_t dim_pressed;
+} button;
+
+typedef struct Indicator {
+    enum IndicatorRunStatus   md_main_running;
+    enum IndicatorLightStatus md_main_running_light;
+    enum IndicatorAlarmStatus rb_main_phase_fail;
+    enum IndicatorLightStatus rb_main_phase_fail_light;
+    enum IndicatorAlarmStatus rb_main_main_power;
+    enum IndicatorLightStatus rb_main_main_power_light;
+    enum IndicatorAlarmStatus rb_main_ctrl_power;
+    enum IndicatorLightStatus rb_main_ctrl_power_light;
+    enum IndicatorAlarmStatus rb_main_oil_press;
+    enum IndicatorLightStatus rb_main_oil_press_light;
+    enum IndicatorAlarmStatus rb_main_hydr_lock;
+    enum IndicatorLightStatus rb_main_hydr_lock_light;
+    enum IndicatorAlarmStatus rb_main_overload;
+    enum IndicatorLightStatus rb_main_overload_light;
+    enum IndicatorAlarmStatus rb_main_oil_level;
+    enum IndicatorLightStatus rb_main_oil_level_light;
+    enum IndicatorAlarmStatus rb_main_oil_filter;
+    enum IndicatorLightStatus rb_main_oil_filter_light;
+    enum IndicatorAlarmStatus rb_main_oil_temp;
+    enum IndicatorLightStatus rb_main_oil_temp_light;
+    
+    enum IndicatorRunStatus   md_aux_running;
+    enum IndicatorLightStatus md_aux_running_light;
+    enum IndicatorAlarmStatus rb_aux_phase_fail;
+    enum IndicatorLightStatus rb_aux_phase_fail_light;
+    enum IndicatorAlarmStatus rb_aux_main_power;
+    enum IndicatorLightStatus rb_aux_main_power_light;
+    enum IndicatorAlarmStatus rb_aux_ctrl_power;
+    enum IndicatorLightStatus rb_aux_ctrl_power_light;
+    enum IndicatorAlarmStatus rb_aux_oil_press;
+    enum IndicatorLightStatus rb_aux_oil_press_light;
+    enum IndicatorAlarmStatus rb_aux_hydr_lock;
+    enum IndicatorLightStatus rb_aux_hydr_lock_light;
+    enum IndicatorAlarmStatus rb_aux_overload;
+    enum IndicatorLightStatus rb_aux_overload_light;
+    enum IndicatorAlarmStatus rb_aux_oil_level;
+    enum IndicatorLightStatus rb_aux_oil_level_light;
+    enum IndicatorAlarmStatus rb_aux_oil_filter;
+    enum IndicatorLightStatus rb_aux_oil_filter_light;
+    enum IndicatorAlarmStatus rb_aux_oil_temp;
+    enum IndicatorLightStatus rb_aux_oil_temp_light;
+    
+    enum IndicatorAlarmStatus rb_fu_failure;
+    enum IndicatorLightStatus rb_fu_failure_light;
+    enum Pump                 pump_in_use;
+    enum IndicatorLightStatus pump_in_use_light;
+} indicator;
+
+void InitAP3000(void);
+void RegularButton(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t corner, uint8_t style, uint8_t R, uint8_t G, uint8_t B, uint8_t text_color, char *text);
+void RoundedRectangle(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t corner, uint8_t style, uint8_t Ro, uint8_t Go, uint8_t Bo, uint8_t Ri, uint8_t Gi, uint8_t Bi, uint8_t text_color, char *text);
+
+void updateAlarmLights(void);
+
+void processButtonPressed(uint16_t tagval);
+void processButtonReleased(void);
+void backupAlarms(void);
+void restoreAlarms(void);
+
+uint8_t getDisplayBrighnessSelect(void);
+void setDisplayBrighnessSelect(uint8_t select);
+void toggleDisplayBrighnessSelect(void);
+void setDisplayBrighnessHigh(uint8_t value);
+void setDisplayBrighnessLow(uint8_t value);
+
+uint8_t getButtonAcceptAlarm(void);
+void setButtonAcceptAlarm(uint8_t status);
+uint8_t getButtonAcceptHorn(void);
+void setButtonAcceptHorn(uint8_t status);
+uint8_t getButtonSet(void);
+void setButtonSet(uint8_t status);
+uint8_t getButtonDim(void);
+void setButtonDim(uint8_t status);
+
+Pump getPumpInUse(void);
+void setPumpInUse(Pump status);
+IndicatorLightStatus getPumpInUseBlinkStatus(void);
+void setPumpInUseBlinkStatus(IndicatorLightStatus status);
+
+IndicatorLightStatus getPumpRunningBlinkStatus(System system);
+void setPumpRunningBlinkStatus(System system, IndicatorLightStatus status);
+IndicatorRunStatus getPumpRunningStatus(System system);
+void setPumpRunningStatus(System system, IndicatorRunStatus status);
+void togglePumpRunningStatus(System system, IndicatorRunStatus status);
+
+IndicatorLightStatus getAlarmBlinkStatus(System system, Alarm alarm);
+void setAlarmBlinkStatus(System system, Alarm alarm, IndicatorLightStatus status);
+IndicatorAlarmStatus getAlarmStatus(System system, Alarm alarm);
+void setAlarmStatus(System system, Alarm alarm, IndicatorAlarmStatus status);
+void toggleAlarmStatus(System system, Alarm alarm, IndicatorAlarmStatus status);
+
+bool checkIndicatorsChanged(void);
+
+void loadSplashScreen(void);
+void loadBitmaps(void);
+void showSplashScreen(void);
+void showMainPage(void);
+
+void testIndicators(void);
+
+#endif
diff -r 000000000000 -r 0ee5e6b7245e SetupPage.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SetupPage.cpp	Mon Jul 23 12:24:05 2018 +0000
@@ -0,0 +1,13 @@
+#include "mbed.h"
+#include "SetupPage.h"
+#include "FT_Platform.h"
+#include "SDBlockDevice.h"
+#include "FATFileSystem.h"
+#include "SPIFBlockDevice.h"
+#include "I2CEEBlockDevice.h"
+#include "BurstSPI.h"
+#include "NMEA0183.h"
+#include "nmea_parser.h"
+
+
+
diff -r 000000000000 -r 0ee5e6b7245e SetupPage.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SetupPage.h	Mon Jul 23 12:24:05 2018 +0000
@@ -0,0 +1,8 @@
+#ifndef __AP3000_H__
+#define __AP3000_H__
+
+#include "mbed.h"
+#include "main.h"
+
+
+#endif