Repository for import to local machine
Dependencies: DMBasicGUI DMSupport
main.cpp@7:f0e645cf73a2, 2017-07-28 (annotated)
- Committer:
- jmitc91516
- Date:
- Fri Jul 28 15:53:40 2017 +0000
- Revision:
- 7:f0e645cf73a2
- Parent:
- 6:dba3fbdfd5da
- Child:
- 8:26e49e6955bd
Backup before weekend break.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jmitc91516 | 0:47c880c1463d | 1 | #include "mbed.h" |
jmitc91516 | 0:47c880c1463d | 2 | #include "DMBoard.h" |
jmitc91516 | 0:47c880c1463d | 3 | #include "lpc_swim.h" |
jmitc91516 | 0:47c880c1463d | 4 | #include "lpc_swim_font.h" |
jmitc91516 | 0:47c880c1463d | 5 | |
jmitc91516 | 0:47c880c1463d | 6 | #include <string.h> |
jmitc91516 | 0:47c880c1463d | 7 | |
jmitc91516 | 1:a5258871b33d | 8 | #include <stdio.h> |
jmitc91516 | 1:a5258871b33d | 9 | #include <stdlib.h> |
jmitc91516 | 1:a5258871b33d | 10 | |
jmitc91516 | 0:47c880c1463d | 11 | #include "GuiLib.h" |
jmitc91516 | 0:47c880c1463d | 12 | #include "GuiDisplay.h" |
jmitc91516 | 0:47c880c1463d | 13 | |
jmitc91516 | 0:47c880c1463d | 14 | #include "USBHostGC.h" |
jmitc91516 | 0:47c880c1463d | 15 | #include "TouchPanelPageSelector.h" |
jmitc91516 | 0:47c880c1463d | 16 | #include "GCHeatControl.h" |
jmitc91516 | 0:47c880c1463d | 17 | #include "GetGCStatusLoop.h" |
jmitc91516 | 0:47c880c1463d | 18 | #include "GCComponentStatusColorArea.h" |
jmitc91516 | 1:a5258871b33d | 19 | #include "GCStateAndFaultCodes.h" |
jmitc91516 | 1:a5258871b33d | 20 | #include "ProgressBar.h" |
jmitc91516 | 1:a5258871b33d | 21 | #include "EasyGUITouchAreaIndices.h" |
jmitc91516 | 1:a5258871b33d | 22 | #include "NetworkParameters.h" |
jmitc91516 | 1:a5258871b33d | 23 | #include "ServiceInterval.h" |
jmitc91516 | 1:a5258871b33d | 24 | #include "SettingsHandler.h" |
jmitc91516 | 1:a5258871b33d | 25 | #include "GasCalibrationPageHandler.h" |
jmitc91516 | 1:a5258871b33d | 26 | #include "ColumnDHAutoCalibrationPageHandler.h" |
jmitc91516 | 1:a5258871b33d | 27 | #include "ColumnDHManualCalibrationPageHandler.h" |
jmitc91516 | 1:a5258871b33d | 28 | #include "ColumnDHSensorCalibrationPageHandler.h" |
jmitc91516 | 1:a5258871b33d | 29 | #include "ColumnDHPSUDACPageHandler.h" |
jmitc91516 | 1:a5258871b33d | 30 | #include "GasBackPressureDACPageHandler.h" |
jmitc91516 | 1:a5258871b33d | 31 | #include "GasChannelDACAndADCPageHandler.h" |
jmitc91516 | 1:a5258871b33d | 32 | #include "NudgeAndDampPageHandler.h" |
jmitc91516 | 1:a5258871b33d | 33 | #include "NumericKeypadPageHandler.h" |
jmitc91516 | 1:a5258871b33d | 34 | #include "EthernetKeypadPageHandler.h" |
jmitc91516 | 1:a5258871b33d | 35 | #include "DebugCommandsPageHandler.h" |
jmitc91516 | 1:a5258871b33d | 36 | #include "QSPIBitmap.h" |
jmitc91516 | 1:a5258871b33d | 37 | #include "DetectorIgnitionHandler.h" |
jmitc91516 | 1:a5258871b33d | 38 | #include "SwimDraw.h" |
jmitc91516 | 1:a5258871b33d | 39 | #include "USBHostGCUtilities.h" |
jmitc91516 | 1:a5258871b33d | 40 | |
jmitc91516 | 1:a5258871b33d | 41 | |
jmitc91516 | 7:f0e645cf73a2 | 42 | #define BUILD_DATE "28 July 2017" // Copied to easyGUI variable "GuiVar_buildDate", displayed on both Settings pages (normal and Running). |
jmitc91516 | 1:a5258871b33d | 43 | // *** MUST update for each 'delivered' build, MUST correspond with date on 'delivered' binary file *** |
jmitc91516 | 1:a5258871b33d | 44 | // This should be updated first thing every morning, and immediately after every 'delivery' |
jmitc91516 | 1:a5258871b33d | 45 | // (to e.g. "dd mmm yyyy #2"), so that it is ready for the next one. |
jmitc91516 | 1:a5258871b33d | 46 | // Also - 'deliver' the ZIP file produced by the 'Export Program' command (right-click on the project |
jmitc91516 | 1:a5258871b33d | 47 | // in 'Program Workspace' at the left of this screen), as well as the binary executable and the ReadMe.txt file, |
jmitc91516 | 1:a5258871b33d | 48 | // and now the EasyGUI project file as well. |
jmitc91516 | 1:a5258871b33d | 49 | |
jmitc91516 | 1:a5258871b33d | 50 | // Defined in GuiDisplay.c - set the display frame address at runtime |
jmitc91516 | 1:a5258871b33d | 51 | extern "C" { |
jmitc91516 | 1:a5258871b33d | 52 | void GuiDisplay_SetFrameAddress(void *newFrameAddress); |
jmitc91516 | 1:a5258871b33d | 53 | } |
jmitc91516 | 1:a5258871b33d | 54 | |
jmitc91516 | 1:a5258871b33d | 55 | // Used by QSPIBitmaps class |
jmitc91516 | 1:a5258871b33d | 56 | bool qspiAlreadyFormatted = false; |
jmitc91516 | 1:a5258871b33d | 57 | |
jmitc91516 | 1:a5258871b33d | 58 | //#define MEMORY_TEST_OCT_2016 |
jmitc91516 | 1:a5258871b33d | 59 | #ifdef MEMORY_TEST_OCT_2016 |
jmitc91516 | 1:a5258871b33d | 60 | const int clogLength = 1000; |
jmitc91516 | 1:a5258871b33d | 61 | char clogUpMemory[clogLength]; |
jmitc91516 | 1:a5258871b33d | 62 | #endif // MEMORY_TEST_OCT_2016 |
jmitc91516 | 1:a5258871b33d | 63 | |
jmitc91516 | 1:a5258871b33d | 64 | /* |
jmitc91516 | 1:a5258871b33d | 65 | This application provides a draft implementation of the LPC4088 user interface to the GC. |
jmitc91516 | 1:a5258871b33d | 66 | It talks to the GC over a USB link. |
jmitc91516 | 1:a5258871b33d | 67 | |
jmitc91516 | 1:a5258871b33d | 68 | The associated easyGUI project is C:/easyGUI Projects/GC500_5inch.gui |
jmitc91516 | 1:a5258871b33d | 69 | |
jmitc91516 | 1:a5258871b33d | 70 | It is intended for use with the Embedded Artists LPC4088 board, 5 inch display. |
jmitc91516 | 1:a5258871b33d | 71 | |
jmitc91516 | 1:a5258871b33d | 72 | Note that the two most important functions in this application are: |
jmitc91516 | 1:a5258871b33d | 73 | main (obviously) or, more specifically, getGCStatusLoop->MainLoopWithEthernet(), called from main |
jmitc91516 | 1:a5258871b33d | 74 | TouchCallback, which handles the user's interaction with the LPC4088 touch screen |
jmitc91516 | 1:a5258871b33d | 75 | |
jmitc91516 | 1:a5258871b33d | 76 | Most other functions are (ultimately) called by those two. |
jmitc91516 | 1:a5258871b33d | 77 | */ |
jmitc91516 | 1:a5258871b33d | 78 | |
jmitc91516 | 1:a5258871b33d | 79 | // Forward declarations |
jmitc91516 | 1:a5258871b33d | 80 | GuiConst_INTCOLOR SixteenBitColorValue(GuiConst_INT8U red, GuiConst_INT8U green, GuiConst_INT8U blue); |
jmitc91516 | 1:a5258871b33d | 81 | void DrawHeatOnOffButton(void); |
jmitc91516 | 1:a5258871b33d | 82 | void SetupDoorActuatorCommandUserInterface(USBDeviceConnected* usbDevice, USBHostGC* usbHostGC, bool beforePageDisplay); |
jmitc91516 | 1:a5258871b33d | 83 | |
jmitc91516 | 1:a5258871b33d | 84 | |
jmitc91516 | 1:a5258871b33d | 85 | static bool canUnlockDoorActuators = true; // Set false if there is some reason why they cannot be unlocked even when the GC is idle |
jmitc91516 | 1:a5258871b33d | 86 | /* |
jmitc91516 | 1:a5258871b33d | 87 | Function to gives the rest of the world access to the above flag |
jmitc91516 | 1:a5258871b33d | 88 | */ |
jmitc91516 | 1:a5258871b33d | 89 | void CanUnlockDoorActuators(bool value) |
jmitc91516 | 1:a5258871b33d | 90 | { |
jmitc91516 | 1:a5258871b33d | 91 | canUnlockDoorActuators = value; |
jmitc91516 | 1:a5258871b33d | 92 | } |
jmitc91516 | 1:a5258871b33d | 93 | |
jmitc91516 | 1:a5258871b33d | 94 | |
jmitc91516 | 1:a5258871b33d | 95 | //#define ALLOW_DEBUG_PRINTS // Without this, our 'debug print' functions contain no code, and do nothing. |
jmitc91516 | 1:a5258871b33d | 96 | // So we do not have to remove all the debug prints throughout this application - |
jmitc91516 | 1:a5258871b33d | 97 | // just comment out this #define. |
jmitc91516 | 1:a5258871b33d | 98 | // Note that we are currently *not* applying this to the code in the 'DrawErrorMessage()' function, |
jmitc91516 | 1:a5258871b33d | 99 | // which is only used here in main.cpp. |
jmitc91516 | 1:a5258871b33d | 100 | |
jmitc91516 | 1:a5258871b33d | 101 | |
jmitc91516 | 1:a5258871b33d | 102 | /* |
jmitc91516 | 1:a5258871b33d | 103 | Code received from Embedded Artists, to cause the LPC4088 to reboot |
jmitc91516 | 1:a5258871b33d | 104 | (thus allowing us to restart the Ethernet connection with a different IP address) |
jmitc91516 | 1:a5258871b33d | 105 | */ |
jmitc91516 | 1:a5258871b33d | 106 | void reboot() |
jmitc91516 | 1:a5258871b33d | 107 | { |
jmitc91516 | 1:a5258871b33d | 108 | /* Disable watchdog */ |
jmitc91516 | 1:a5258871b33d | 109 | LPC_WDT->MOD = 0; |
jmitc91516 | 1:a5258871b33d | 110 | LPC_WDT->TC = 0xFF; |
jmitc91516 | 1:a5258871b33d | 111 | |
jmitc91516 | 1:a5258871b33d | 112 | /* Set WDT timeout to 0.1s using the 500kHz oscillator |
jmitc91516 | 1:a5258871b33d | 113 | and the fixed pre-scaler of 4 */ |
jmitc91516 | 1:a5258871b33d | 114 | LPC_WDT->TC = ((500000 / 4) / 10); |
jmitc91516 | 1:a5258871b33d | 115 | |
jmitc91516 | 1:a5258871b33d | 116 | /* Make sure a watchdog timeout causes a reset */ |
jmitc91516 | 1:a5258871b33d | 117 | LPC_WDT->MOD |= (1<<1); |
jmitc91516 | 1:a5258871b33d | 118 | |
jmitc91516 | 1:a5258871b33d | 119 | /* Enable the watchdog */ |
jmitc91516 | 1:a5258871b33d | 120 | LPC_WDT->MOD |= (1<<0); |
jmitc91516 | 1:a5258871b33d | 121 | |
jmitc91516 | 1:a5258871b33d | 122 | /* Initial feed to start the watchdog */ |
jmitc91516 | 1:a5258871b33d | 123 | LPC_WDT->FEED = 0xAA; |
jmitc91516 | 1:a5258871b33d | 124 | LPC_WDT->FEED = 0x55; |
jmitc91516 | 1:a5258871b33d | 125 | |
jmitc91516 | 1:a5258871b33d | 126 | /* Should reboot after 100ms */ |
jmitc91516 | 1:a5258871b33d | 127 | while(true); |
jmitc91516 | 1:a5258871b33d | 128 | } |
jmitc91516 | 0:47c880c1463d | 129 | |
jmitc91516 | 0:47c880c1463d | 130 | |
jmitc91516 | 0:47c880c1463d | 131 | // ** Start of timeout code to guard against multiple presses of the Heat On/Off button ** |
jmitc91516 | 0:47c880c1463d | 132 | // (which is in the same position as the Abort Run button) |
jmitc91516 | 0:47c880c1463d | 133 | Timeout heatOnOffTimeout; |
jmitc91516 | 0:47c880c1463d | 134 | |
jmitc91516 | 0:47c880c1463d | 135 | bool heatOnOffAvailable = true; |
jmitc91516 | 0:47c880c1463d | 136 | |
jmitc91516 | 0:47c880c1463d | 137 | void MakeHeatOnOffAvailableAgain(void) |
jmitc91516 | 0:47c880c1463d | 138 | { |
jmitc91516 | 0:47c880c1463d | 139 | heatOnOffAvailable = true; |
jmitc91516 | 0:47c880c1463d | 140 | } |
jmitc91516 | 0:47c880c1463d | 141 | |
jmitc91516 | 0:47c880c1463d | 142 | void StartHeatOnOffTimeout(void) |
jmitc91516 | 0:47c880c1463d | 143 | { |
jmitc91516 | 0:47c880c1463d | 144 | heatOnOffAvailable = false; |
jmitc91516 | 0:47c880c1463d | 145 | heatOnOffTimeout.attach(&MakeHeatOnOffAvailableAgain, 1.0); // Wait 1.0 sec before accepting touches again on Heat On/Off button |
jmitc91516 | 0:47c880c1463d | 146 | } |
jmitc91516 | 0:47c880c1463d | 147 | // ** End of Heat On/Off timeout code ** |
jmitc91516 | 0:47c880c1463d | 148 | |
jmitc91516 | 1:a5258871b33d | 149 | #define USE_HEAT_ONOFF_BUTTON_BITMAPS |
jmitc91516 | 1:a5258871b33d | 150 | |
jmitc91516 | 1:a5258871b33d | 151 | //#define TURN_HEAT_OFF_ON_ABORT // Doing this may or may not be a good idea... |
jmitc91516 | 0:47c880c1463d | 152 | |
jmitc91516 | 0:47c880c1463d | 153 | // These are 'global' - TouchCallback function, as well as main(), needs to access them |
jmitc91516 | 0:47c880c1463d | 154 | TouchPanelPageSelectors touchPanelPageSelectors; |
jmitc91516 | 0:47c880c1463d | 155 | GCHeatControl* theGCHeatControl; |
jmitc91516 | 0:47c880c1463d | 156 | |
jmitc91516 | 1:a5258871b33d | 157 | |
jmitc91516 | 0:47c880c1463d | 158 | GetGCStatusLoop* getGCStatusLoop = NULL; |
jmitc91516 | 0:47c880c1463d | 159 | |
jmitc91516 | 0:47c880c1463d | 160 | HomePageGCComponentStatusColorAreas homePageGCComponentStatusColorAreas; |
jmitc91516 | 0:47c880c1463d | 161 | SingleGCComponentPageStatusColorAreas singleGCComponentPageStatusColorAreas; |
jmitc91516 | 0:47c880c1463d | 162 | |
jmitc91516 | 1:a5258871b33d | 163 | #define USE_QSPI_BITMAPS |
jmitc91516 | 1:a5258871b33d | 164 | #ifdef USE_QSPI_BITMAPS |
jmitc91516 | 1:a5258871b33d | 165 | QSPIBitmaps qspiBitmaps; |
jmitc91516 | 1:a5258871b33d | 166 | #endif // USE_QSPI_BITMAPS |
jmitc91516 | 1:a5258871b33d | 167 | |
jmitc91516 | 1:a5258871b33d | 168 | //#define WANT_STATUS_RECTANGLE_ON_COLUMN_AUTO_CALIB_PAGE |
jmitc91516 | 1:a5258871b33d | 169 | //#define WANT_STATUS_RECTANGLE_ON_GAS_CALIB_PAGES |
jmitc91516 | 7:f0e645cf73a2 | 170 | //#define WANT_DOOR_ACTUATOR_BUTTONS_ON_COLUMN_PAGES |
jmitc91516 | 7:f0e645cf73a2 | 171 | //#define WANT_COMPONENT_ICON_ON_PROFILE_PAGES |
jmitc91516 | 0:47c880c1463d | 172 | |
jmitc91516 | 1:a5258871b33d | 173 | /* |
jmitc91516 | 1:a5258871b33d | 174 | Bodge so GuiDisplay.c ('easyGUIFixed' file) can call Thread::wait |
jmitc91516 | 1:a5258871b33d | 175 | (giving it an accurate millisecond timer) |
jmitc91516 | 1:a5258871b33d | 176 | */ |
jmitc91516 | 1:a5258871b33d | 177 | extern "C" { |
jmitc91516 | 1:a5258871b33d | 178 | void EasyGUIWaitMs(GuiConst_INT32U msec) |
jmitc91516 | 1:a5258871b33d | 179 | { |
jmitc91516 | 1:a5258871b33d | 180 | Thread::wait(msec); |
jmitc91516 | 1:a5258871b33d | 181 | } |
jmitc91516 | 1:a5258871b33d | 182 | } |
jmitc91516 | 0:47c880c1463d | 183 | |
jmitc91516 | 1:a5258871b33d | 184 | /* |
jmitc91516 | 1:a5258871b33d | 185 | Passed three 8-bit colour components - red, green and blue. |
jmitc91516 | 1:a5258871b33d | 186 | |
jmitc91516 | 1:a5258871b33d | 187 | Returns the corresponding 16-bit colour value (5 bits for red, 6 bits for green, 5 bits for blue). |
jmitc91516 | 1:a5258871b33d | 188 | */ |
jmitc91516 | 0:47c880c1463d | 189 | GuiConst_INTCOLOR SixteenBitColorValue(GuiConst_INT8U red, GuiConst_INT8U green, GuiConst_INT8U blue) |
jmitc91516 | 0:47c880c1463d | 190 | { |
jmitc91516 | 0:47c880c1463d | 191 | // Make sure we don't have numeric overflow problems during the conversion |
jmitc91516 | 0:47c880c1463d | 192 | GuiConst_INT32U red32 = red; |
jmitc91516 | 0:47c880c1463d | 193 | GuiConst_INT32U green32 = green; |
jmitc91516 | 0:47c880c1463d | 194 | GuiConst_INT32U blue32 = blue; |
jmitc91516 | 0:47c880c1463d | 195 | |
jmitc91516 | 1:a5258871b33d | 196 | //#define REVERSE_RED_AND_BLUE |
jmitc91516 | 1:a5258871b33d | 197 | #ifdef REVERSE_RED_AND_BLUE |
jmitc91516 | 1:a5258871b33d | 198 | GuiConst_INT32U rgb = (red32 << 16) | (green32 << 8) | blue32; |
jmitc91516 | 1:a5258871b33d | 199 | #else |
jmitc91516 | 0:47c880c1463d | 200 | GuiConst_INT32U rgb = (blue32 << 16) | (green32 << 8) | red32; |
jmitc91516 | 1:a5258871b33d | 201 | #endif |
jmitc91516 | 1:a5258871b33d | 202 | |
jmitc91516 | 0:47c880c1463d | 203 | return GuiLib_RgbToPixelColor(rgb); |
jmitc91516 | 0:47c880c1463d | 204 | } |
jmitc91516 | 0:47c880c1463d | 205 | |
jmitc91516 | 1:a5258871b33d | 206 | // DebugPrint without '#ifdef ALLOW_DEBUG_PRINTS' |
jmitc91516 | 1:a5258871b33d | 207 | void SpecialDebugPrint(char *stuffToPrint, GuiConst_INT16S X, GuiConst_INT16S Y) |
jmitc91516 | 1:a5258871b33d | 208 | { |
jmitc91516 | 1:a5258871b33d | 209 | static int counter = 0; |
jmitc91516 | 1:a5258871b33d | 210 | char buff[300]; |
jmitc91516 | 1:a5258871b33d | 211 | |
jmitc91516 | 1:a5258871b33d | 212 | const GuiConst_INT16U fontNo = GuiFont_Helv1; |
jmitc91516 | 1:a5258871b33d | 213 | |
jmitc91516 | 1:a5258871b33d | 214 | GuiDisplay_Lock(); |
jmitc91516 | 1:a5258871b33d | 215 | |
jmitc91516 | 1:a5258871b33d | 216 | // (Attempt to) clear previous strings from display |
jmitc91516 | 1:a5258871b33d | 217 | sprintf(buff, " "); |
jmitc91516 | 1:a5258871b33d | 218 | GuiLib_DrawStr( |
jmitc91516 | 1:a5258871b33d | 219 | X, //GuiConst_INT16S X, |
jmitc91516 | 1:a5258871b33d | 220 | Y, //GuiConst_INT16S Y, |
jmitc91516 | 1:a5258871b33d | 221 | fontNo, //GuiConst_INT16U FontNo, |
jmitc91516 | 1:a5258871b33d | 222 | buff, //GuiConst_TEXT PrefixLocate *String, |
jmitc91516 | 1:a5258871b33d | 223 | GuiLib_ALIGN_LEFT, //GuiConst_INT8U Alignment, |
jmitc91516 | 1:a5258871b33d | 224 | GuiLib_PS_ON, //GuiConst_INT8U PsWriting, |
jmitc91516 | 1:a5258871b33d | 225 | GuiLib_TRANSPARENT_OFF, //GuiConst_INT8U Transparent, |
jmitc91516 | 1:a5258871b33d | 226 | GuiLib_UNDERLINE_OFF, //GuiConst_INT8U Underlining, |
jmitc91516 | 1:a5258871b33d | 227 | 0, //GuiConst_INT16S BackBoxSizeX, |
jmitc91516 | 1:a5258871b33d | 228 | 0, //GuiConst_INT16S BackBoxSizeY1, |
jmitc91516 | 1:a5258871b33d | 229 | 0, //GuiConst_INT16S BackBoxSizeY2, |
jmitc91516 | 1:a5258871b33d | 230 | GuiLib_BBP_NONE, //GuiConst_INT8U BackBorderPixels, |
jmitc91516 | 1:a5258871b33d | 231 | SixteenBitColorValue(0, 0, 0xFF), //GuiConst_INTCOLOR ForeColor, |
jmitc91516 | 1:a5258871b33d | 232 | SixteenBitColorValue(0, 0xFF, 0) //GuiConst_INTCOLOR BackColor |
jmitc91516 | 1:a5258871b33d | 233 | ); |
jmitc91516 | 1:a5258871b33d | 234 | |
jmitc91516 | 1:a5258871b33d | 235 | sprintf(buff, "%s [%d]", stuffToPrint, ++counter); |
jmitc91516 | 1:a5258871b33d | 236 | |
jmitc91516 | 1:a5258871b33d | 237 | GuiLib_DrawStr( |
jmitc91516 | 1:a5258871b33d | 238 | X, //GuiConst_INT16S X, |
jmitc91516 | 1:a5258871b33d | 239 | Y, //GuiConst_INT16S Y, |
jmitc91516 | 1:a5258871b33d | 240 | fontNo, //GuiConst_INT16U FontNo, |
jmitc91516 | 1:a5258871b33d | 241 | buff, //GuiConst_TEXT PrefixLocate *String, |
jmitc91516 | 1:a5258871b33d | 242 | GuiLib_ALIGN_LEFT, //GuiConst_INT8U Alignment, |
jmitc91516 | 1:a5258871b33d | 243 | GuiLib_PS_ON, //GuiConst_INT8U PsWriting, |
jmitc91516 | 1:a5258871b33d | 244 | GuiLib_TRANSPARENT_OFF, //GuiConst_INT8U Transparent, |
jmitc91516 | 1:a5258871b33d | 245 | GuiLib_UNDERLINE_OFF, //GuiConst_INT8U Underlining, |
jmitc91516 | 1:a5258871b33d | 246 | 0, //GuiConst_INT16S BackBoxSizeX, |
jmitc91516 | 1:a5258871b33d | 247 | 0, //GuiConst_INT16S BackBoxSizeY1, |
jmitc91516 | 1:a5258871b33d | 248 | 0, //GuiConst_INT16S BackBoxSizeY2, |
jmitc91516 | 1:a5258871b33d | 249 | GuiLib_BBP_NONE, //GuiConst_INT8U BackBorderPixels, |
jmitc91516 | 1:a5258871b33d | 250 | SixteenBitColorValue(0, 0, 0xFF), //GuiConst_INTCOLOR ForeColor, |
jmitc91516 | 1:a5258871b33d | 251 | SixteenBitColorValue(0, 0xFF, 0) //GuiConst_INTCOLOR BackColor |
jmitc91516 | 1:a5258871b33d | 252 | ); |
jmitc91516 | 1:a5258871b33d | 253 | |
jmitc91516 | 1:a5258871b33d | 254 | GuiLib_Refresh(); |
jmitc91516 | 1:a5258871b33d | 255 | |
jmitc91516 | 1:a5258871b33d | 256 | GuiDisplay_Unlock(); |
jmitc91516 | 1:a5258871b33d | 257 | } |
jmitc91516 | 1:a5258871b33d | 258 | |
jmitc91516 | 1:a5258871b33d | 259 | /* |
jmitc91516 | 1:a5258871b33d | 260 | Prints (i.e. displays) the specified text at the specified coordinates on the screen, |
jmitc91516 | 1:a5258871b33d | 261 | blue text on a green background, using easyGUI. |
jmitc91516 | 1:a5258871b33d | 262 | |
jmitc91516 | 1:a5258871b33d | 263 | Args are: null-terminated string to print, x coord, y coord. |
jmitc91516 | 1:a5258871b33d | 264 | |
jmitc91516 | 1:a5258871b33d | 265 | No return code. |
jmitc91516 | 1:a5258871b33d | 266 | */ |
jmitc91516 | 0:47c880c1463d | 267 | void DebugPrint(char *stuffToPrint, GuiConst_INT16S X, GuiConst_INT16S Y) |
jmitc91516 | 0:47c880c1463d | 268 | { |
jmitc91516 | 1:a5258871b33d | 269 | #ifdef ALLOW_DEBUG_PRINTS |
jmitc91516 | 0:47c880c1463d | 270 | char buff[200]; |
jmitc91516 | 0:47c880c1463d | 271 | |
jmitc91516 | 0:47c880c1463d | 272 | const GuiConst_INT16U fontNo = GuiFont_Helv1; |
jmitc91516 | 0:47c880c1463d | 273 | |
jmitc91516 | 0:47c880c1463d | 274 | GuiDisplay_Lock(); |
jmitc91516 | 0:47c880c1463d | 275 | |
jmitc91516 | 0:47c880c1463d | 276 | // (Attempt to) clear previous strings from display |
jmitc91516 | 0:47c880c1463d | 277 | sprintf(buff, " "); |
jmitc91516 | 0:47c880c1463d | 278 | GuiLib_DrawStr( |
jmitc91516 | 0:47c880c1463d | 279 | X, //GuiConst_INT16S X, |
jmitc91516 | 0:47c880c1463d | 280 | Y, //GuiConst_INT16S Y, |
jmitc91516 | 0:47c880c1463d | 281 | fontNo, //GuiConst_INT16U FontNo, |
jmitc91516 | 0:47c880c1463d | 282 | buff, //GuiConst_TEXT PrefixLocate *String, |
jmitc91516 | 0:47c880c1463d | 283 | GuiLib_ALIGN_LEFT, //GuiConst_INT8U Alignment, |
jmitc91516 | 0:47c880c1463d | 284 | GuiLib_PS_ON, //GuiConst_INT8U PsWriting, |
jmitc91516 | 0:47c880c1463d | 285 | GuiLib_TRANSPARENT_OFF, //GuiConst_INT8U Transparent, |
jmitc91516 | 0:47c880c1463d | 286 | GuiLib_UNDERLINE_OFF, //GuiConst_INT8U Underlining, |
jmitc91516 | 0:47c880c1463d | 287 | 0, //GuiConst_INT16S BackBoxSizeX, |
jmitc91516 | 0:47c880c1463d | 288 | 0, //GuiConst_INT16S BackBoxSizeY1, |
jmitc91516 | 0:47c880c1463d | 289 | 0, //GuiConst_INT16S BackBoxSizeY2, |
jmitc91516 | 0:47c880c1463d | 290 | GuiLib_BBP_NONE, //GuiConst_INT8U BackBorderPixels, |
jmitc91516 | 0:47c880c1463d | 291 | SixteenBitColorValue(0, 0, 0xFF), //GuiConst_INTCOLOR ForeColor, |
jmitc91516 | 0:47c880c1463d | 292 | SixteenBitColorValue(0, 0xFF, 0) //GuiConst_INTCOLOR BackColor |
jmitc91516 | 0:47c880c1463d | 293 | ); |
jmitc91516 | 0:47c880c1463d | 294 | |
jmitc91516 | 0:47c880c1463d | 295 | GuiLib_DrawStr( |
jmitc91516 | 0:47c880c1463d | 296 | X, //GuiConst_INT16S X, |
jmitc91516 | 0:47c880c1463d | 297 | Y, //GuiConst_INT16S Y, |
jmitc91516 | 0:47c880c1463d | 298 | fontNo, //GuiConst_INT16U FontNo, |
jmitc91516 | 0:47c880c1463d | 299 | stuffToPrint, //GuiConst_TEXT PrefixLocate *String, |
jmitc91516 | 0:47c880c1463d | 300 | GuiLib_ALIGN_LEFT, //GuiConst_INT8U Alignment, |
jmitc91516 | 0:47c880c1463d | 301 | GuiLib_PS_ON, //GuiConst_INT8U PsWriting, |
jmitc91516 | 0:47c880c1463d | 302 | GuiLib_TRANSPARENT_OFF, //GuiConst_INT8U Transparent, |
jmitc91516 | 0:47c880c1463d | 303 | GuiLib_UNDERLINE_OFF, //GuiConst_INT8U Underlining, |
jmitc91516 | 0:47c880c1463d | 304 | 0, //GuiConst_INT16S BackBoxSizeX, |
jmitc91516 | 0:47c880c1463d | 305 | 0, //GuiConst_INT16S BackBoxSizeY1, |
jmitc91516 | 0:47c880c1463d | 306 | 0, //GuiConst_INT16S BackBoxSizeY2, |
jmitc91516 | 0:47c880c1463d | 307 | GuiLib_BBP_NONE, //GuiConst_INT8U BackBorderPixels, |
jmitc91516 | 0:47c880c1463d | 308 | SixteenBitColorValue(0, 0, 0xFF), //GuiConst_INTCOLOR ForeColor, |
jmitc91516 | 0:47c880c1463d | 309 | SixteenBitColorValue(0, 0xFF, 0) //GuiConst_INTCOLOR BackColor |
jmitc91516 | 0:47c880c1463d | 310 | ); |
jmitc91516 | 0:47c880c1463d | 311 | |
jmitc91516 | 0:47c880c1463d | 312 | GuiLib_Refresh(); |
jmitc91516 | 0:47c880c1463d | 313 | |
jmitc91516 | 0:47c880c1463d | 314 | GuiDisplay_Unlock(); |
jmitc91516 | 1:a5258871b33d | 315 | #endif //ALLOW_DEBUG_PRINTS |
jmitc91516 | 0:47c880c1463d | 316 | } |
jmitc91516 | 0:47c880c1463d | 317 | |
jmitc91516 | 1:a5258871b33d | 318 | /* |
jmitc91516 | 1:a5258871b33d | 319 | A 'wrapper' function for the above, so that the caller does not need access |
jmitc91516 | 1:a5258871b33d | 320 | to the easyGUI declarations |
jmitc91516 | 1:a5258871b33d | 321 | |
jmitc91516 | 1:a5258871b33d | 322 | Intended to be used as an 'extern' in other modules. |
jmitc91516 | 1:a5258871b33d | 323 | */ |
jmitc91516 | 0:47c880c1463d | 324 | void EasyGUIDebugPrint(char *stuffToPrint, short X, short Y) |
jmitc91516 | 0:47c880c1463d | 325 | { |
jmitc91516 | 1:a5258871b33d | 326 | #ifdef ALLOW_DEBUG_PRINTS |
jmitc91516 | 0:47c880c1463d | 327 | DebugPrint(stuffToPrint, (GuiConst_INT16S) X, (GuiConst_INT16S) Y); |
jmitc91516 | 1:a5258871b33d | 328 | #endif // ALLOW_DEBUG_PRINTS |
jmitc91516 | 0:47c880c1463d | 329 | } |
jmitc91516 | 0:47c880c1463d | 330 | |
jmitc91516 | 1:a5258871b33d | 331 | /* |
jmitc91516 | 1:a5258871b33d | 332 | Version of the above that increments, and displays, a counter each time it is called - |
jmitc91516 | 1:a5258871b33d | 333 | so the user can see if it is being called repeatedly, or if the application has simply hung |
jmitc91516 | 1:a5258871b33d | 334 | */ |
jmitc91516 | 1:a5258871b33d | 335 | void EasyGUIDebugPrintWithCounter(char *stuffToPrint, short X, short Y) |
jmitc91516 | 0:47c880c1463d | 336 | { |
jmitc91516 | 1:a5258871b33d | 337 | #ifdef ALLOW_DEBUG_PRINTS |
jmitc91516 | 1:a5258871b33d | 338 | static int counter = 0; |
jmitc91516 | 1:a5258871b33d | 339 | char buff[300]; |
jmitc91516 | 1:a5258871b33d | 340 | sprintf(buff, "%s [%d]", stuffToPrint, ++counter); |
jmitc91516 | 1:a5258871b33d | 341 | |
jmitc91516 | 1:a5258871b33d | 342 | DebugPrint(buff, (GuiConst_INT16S) X, (GuiConst_INT16S) Y); |
jmitc91516 | 1:a5258871b33d | 343 | #endif // ALLOW_DEBUG_PRINTS |
jmitc91516 | 0:47c880c1463d | 344 | } |
jmitc91516 | 0:47c880c1463d | 345 | |
jmitc91516 | 1:a5258871b33d | 346 | extern "C" { |
jmitc91516 | 1:a5258871b33d | 347 | void EasyGUIDebugPrintWithCounterCalledFromC(char *stuffToPrint, short X, short Y) |
jmitc91516 | 1:a5258871b33d | 348 | { |
jmitc91516 | 1:a5258871b33d | 349 | EasyGUIDebugPrintWithCounter(stuffToPrint, X, Y); |
jmitc91516 | 1:a5258871b33d | 350 | } |
jmitc91516 | 0:47c880c1463d | 351 | } |
jmitc91516 | 0:47c880c1463d | 352 | |
jmitc91516 | 1:a5258871b33d | 353 | /* |
jmitc91516 | 1:a5258871b33d | 354 | Gets the GC status. |
jmitc91516 | 1:a5258871b33d | 355 | |
jmitc91516 | 1:a5258871b33d | 356 | Args are: a pointer to the USBHostGC instance that corresponds to the GC, |
jmitc91516 | 1:a5258871b33d | 357 | a pointer to the USBDeviceConnected instance that (also) corresponds to the GC |
jmitc91516 | 1:a5258871b33d | 358 | |
jmitc91516 | 1:a5258871b33d | 359 | Returns the GC status as an integer - see the GC_STATE enumeration in GCStateAndFaultCodes.h |
jmitc91516 | 1:a5258871b33d | 360 | for the possible values. |
jmitc91516 | 1:a5258871b33d | 361 | */ |
jmitc91516 | 1:a5258871b33d | 362 | int GetGCStatus(USBDeviceConnected* usbDevice, USBHostGC* usbHostGC) |
jmitc91516 | 0:47c880c1463d | 363 | { |
jmitc91516 | 0:47c880c1463d | 364 | while(usbHostGC->ExecutingSetDeviceReport()) {} |
jmitc91516 | 0:47c880c1463d | 365 | |
jmitc91516 | 0:47c880c1463d | 366 | char response[50]; |
jmitc91516 | 1:a5258871b33d | 367 | int status; |
jmitc91516 | 0:47c880c1463d | 368 | |
jmitc91516 | 0:47c880c1463d | 369 | // Ensure we always have valid chars in the positions we are interested in, |
jmitc91516 | 0:47c880c1463d | 370 | // in case we get "DNAK" or "EPKT" back |
jmitc91516 | 0:47c880c1463d | 371 | response[6] = '0'; |
jmitc91516 | 0:47c880c1463d | 372 | response[7] = '0'; |
jmitc91516 | 0:47c880c1463d | 373 | |
jmitc91516 | 0:47c880c1463d | 374 | usbHostGC->SetDeviceReport(usbDevice, "QSTA", response); |
jmitc91516 | 1:a5258871b33d | 375 | // We expect a response like "DSTA00nn", where "nn" is the status. |
jmitc91516 | 1:a5258871b33d | 376 | sscanf(&response[6], "%d", &status); |
jmitc91516 | 1:a5258871b33d | 377 | |
jmitc91516 | 1:a5258871b33d | 378 | return status; |
jmitc91516 | 1:a5258871b33d | 379 | } |
jmitc91516 | 1:a5258871b33d | 380 | |
jmitc91516 | 1:a5258871b33d | 381 | /* |
jmitc91516 | 1:a5258871b33d | 382 | Tells the caller whether or not the GC is ready to run |
jmitc91516 | 1:a5258871b33d | 383 | |
jmitc91516 | 1:a5258871b33d | 384 | Args are: a pointer to the USBHostGC instance that corresponds to the GC, |
jmitc91516 | 1:a5258871b33d | 385 | a pointer to the USBDeviceConnected instance that (also) corresponds to the GC |
jmitc91516 | 1:a5258871b33d | 386 | |
jmitc91516 | 1:a5258871b33d | 387 | Returns true if the GC is ready to run, false if not. |
jmitc91516 | 1:a5258871b33d | 388 | */ |
jmitc91516 | 1:a5258871b33d | 389 | bool GCIsReadyToRun(USBDeviceConnected* usbDevice, USBHostGC* usbHostGC) |
jmitc91516 | 1:a5258871b33d | 390 | { |
jmitc91516 | 1:a5258871b33d | 391 | #ifdef USE_VERSION_102 // See GCStateAndFaultCodes.h |
jmitc91516 | 1:a5258871b33d | 392 | return (GetGCStatus(usbDevice, usbHostGC) == GC_STATE_102_METHOD_READY_TO_RUN); |
jmitc91516 | 1:a5258871b33d | 393 | #else |
jmitc91516 | 1:a5258871b33d | 394 | return (GetGCStatus(usbDevice, usbHostGC) == GC_STATE_READY_TO_RUN); |
jmitc91516 | 1:a5258871b33d | 395 | #endif |
jmitc91516 | 1:a5258871b33d | 396 | } |
jmitc91516 | 1:a5258871b33d | 397 | |
jmitc91516 | 1:a5258871b33d | 398 | /* |
jmitc91516 | 1:a5258871b33d | 399 | Tells the caller whether or not the GC is in the 'stabilising' state |
jmitc91516 | 0:47c880c1463d | 400 | |
jmitc91516 | 1:a5258871b33d | 401 | Args are: a pointer to the USBHostGC instance that corresponds to the GC, |
jmitc91516 | 1:a5258871b33d | 402 | a pointer to the USBDeviceConnected instance that (also) corresponds to the GC |
jmitc91516 | 1:a5258871b33d | 403 | |
jmitc91516 | 1:a5258871b33d | 404 | Returns true if the GC is stabilising, false if not. |
jmitc91516 | 1:a5258871b33d | 405 | */ |
jmitc91516 | 1:a5258871b33d | 406 | bool GCIsStabilising(USBDeviceConnected* usbDevice, USBHostGC* usbHostGC) |
jmitc91516 | 1:a5258871b33d | 407 | { |
jmitc91516 | 1:a5258871b33d | 408 | #ifdef USE_VERSION_102 // See GCStateAndFaultCodes.h |
jmitc91516 | 1:a5258871b33d | 409 | return (GetGCStatus(usbDevice, usbHostGC) == GC_STATE_102_METHOD_STABILISING); |
jmitc91516 | 1:a5258871b33d | 410 | #else |
jmitc91516 | 1:a5258871b33d | 411 | return false; // No "stabilising" state before version 1.02 |
jmitc91516 | 1:a5258871b33d | 412 | #endif |
jmitc91516 | 1:a5258871b33d | 413 | } |
jmitc91516 | 1:a5258871b33d | 414 | |
jmitc91516 | 1:a5258871b33d | 415 | /* |
jmitc91516 | 1:a5258871b33d | 416 | Tells the caller whether or not the GC is in the 'equilibrating' state |
jmitc91516 | 1:a5258871b33d | 417 | |
jmitc91516 | 1:a5258871b33d | 418 | Args are: a pointer to the USBHostGC instance that corresponds to the GC, |
jmitc91516 | 1:a5258871b33d | 419 | a pointer to the USBDeviceConnected instance that (also) corresponds to the GC |
jmitc91516 | 1:a5258871b33d | 420 | |
jmitc91516 | 1:a5258871b33d | 421 | Returns true if the GC is equilibrating, false if not. |
jmitc91516 | 1:a5258871b33d | 422 | */ |
jmitc91516 | 1:a5258871b33d | 423 | bool GCIsEquilibrating(USBDeviceConnected* usbDevice, USBHostGC* usbHostGC) |
jmitc91516 | 1:a5258871b33d | 424 | { |
jmitc91516 | 1:a5258871b33d | 425 | #ifdef USE_VERSION_102 // See GCStateAndFaultCodes.h |
jmitc91516 | 1:a5258871b33d | 426 | return (GetGCStatus(usbDevice, usbHostGC) == GC_STATE_102_METHOD_EQUILIBRATING); |
jmitc91516 | 1:a5258871b33d | 427 | #else |
jmitc91516 | 1:a5258871b33d | 428 | return (GetGCStatus(usbDevice, usbHostGC) == GC_STATE_EQUILIBRATING); |
jmitc91516 | 1:a5258871b33d | 429 | #endif |
jmitc91516 | 0:47c880c1463d | 430 | } |
jmitc91516 | 0:47c880c1463d | 431 | |
jmitc91516 | 1:a5258871b33d | 432 | /* |
jmitc91516 | 1:a5258871b33d | 433 | Tells the caller whether or not the GC is running |
jmitc91516 | 1:a5258871b33d | 434 | |
jmitc91516 | 1:a5258871b33d | 435 | Args are: a pointer to the USBHostGC instance that corresponds to the GC, |
jmitc91516 | 1:a5258871b33d | 436 | a pointer to the USBDeviceConnected instance that (also) corresponds to the GC |
jmitc91516 | 1:a5258871b33d | 437 | |
jmitc91516 | 1:a5258871b33d | 438 | Returns true if the GC is running, false if not. |
jmitc91516 | 1:a5258871b33d | 439 | */ |
jmitc91516 | 1:a5258871b33d | 440 | bool GCIsRunning(USBDeviceConnected* usbDevice, USBHostGC* usbHostGC) |
jmitc91516 | 1:a5258871b33d | 441 | { |
jmitc91516 | 1:a5258871b33d | 442 | int gcStatus = GetGCStatus(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 443 | |
jmitc91516 | 1:a5258871b33d | 444 | #ifdef USE_VERSION_102 // See GCStateAndFaultCodes.h |
jmitc91516 | 1:a5258871b33d | 445 | return ((gcStatus >= GC_STATE_102_METHOD_RUNNING_MINIMUM) && (gcStatus <= GC_STATE_102_METHOD_RUNNING_MAXIMUM)); |
jmitc91516 | 1:a5258871b33d | 446 | #else |
jmitc91516 | 1:a5258871b33d | 447 | return ((gcStatus >= GC_STATE_RUNNING_MINIMUM) && (gcStatus <= GC_STATE_RUNNING_MAXIMUM)); |
jmitc91516 | 1:a5258871b33d | 448 | #endif |
jmitc91516 | 1:a5258871b33d | 449 | } |
jmitc91516 | 1:a5258871b33d | 450 | |
jmitc91516 | 1:a5258871b33d | 451 | /* |
jmitc91516 | 1:a5258871b33d | 452 | Pass the current value of 'GuiVar_columnMaxTemp2' to the GC as the maximum column temperature. |
jmitc91516 | 1:a5258871b33d | 453 | Intended to be called by the NumericKeypadPageHandler if the user presses the Apply button |
jmitc91516 | 1:a5258871b33d | 454 | when we are editing the maximum column temperature. We pass a pointer to this function |
jmitc91516 | 1:a5258871b33d | 455 | to the NumericKeypadPageHandler instance when we start editing. |
jmitc91516 | 1:a5258871b33d | 456 | |
jmitc91516 | 1:a5258871b33d | 457 | See the definition of 'ApplyFunctionPtr' in NumericKeypadPageHandler.h |
jmitc91516 | 1:a5258871b33d | 458 | */ |
jmitc91516 | 1:a5258871b33d | 459 | void SetColumnMaxTempFromEasyGuiVariable(USBDeviceConnected* usbDevice, USBHostGC* usbHostGC) |
jmitc91516 | 1:a5258871b33d | 460 | { |
jmitc91516 | 1:a5258871b33d | 461 | int maxTemp; |
jmitc91516 | 1:a5258871b33d | 462 | sscanf(GuiVar_columnMaxTemp2, "%d", &maxTemp); |
jmitc91516 | 1:a5258871b33d | 463 | |
jmitc91516 | 1:a5258871b33d | 464 | char buff[40]; |
jmitc91516 | 1:a5258871b33d | 465 | sprintf(buff, "SCMX%.4d", maxTemp); |
jmitc91516 | 1:a5258871b33d | 466 | |
jmitc91516 | 1:a5258871b33d | 467 | while(usbHostGC->ExecutingSetDeviceReport()) {} |
jmitc91516 | 1:a5258871b33d | 468 | |
jmitc91516 | 1:a5258871b33d | 469 | char response[50]; |
jmitc91516 | 1:a5258871b33d | 470 | usbHostGC->SetDeviceReport(usbDevice, buff, response); |
jmitc91516 | 1:a5258871b33d | 471 | } |
jmitc91516 | 1:a5258871b33d | 472 | |
jmitc91516 | 1:a5258871b33d | 473 | |
jmitc91516 | 1:a5258871b33d | 474 | /* |
jmitc91516 | 1:a5258871b33d | 475 | Draws the Run button in the correct place, in the correct enabled/disabled state. |
jmitc91516 | 1:a5258871b33d | 476 | |
jmitc91516 | 1:a5258871b33d | 477 | Arg is: true to display the button in an enabled state, false to display it disabled. |
jmitc91516 | 1:a5258871b33d | 478 | |
jmitc91516 | 1:a5258871b33d | 479 | No return code. |
jmitc91516 | 1:a5258871b33d | 480 | */ |
jmitc91516 | 0:47c880c1463d | 481 | void DrawRunButton(bool enabled) |
jmitc91516 | 0:47c880c1463d | 482 | { |
jmitc91516 | 1:a5258871b33d | 483 | #define USE_BITMAPS |
jmitc91516 | 1:a5258871b33d | 484 | #ifdef USE_BITMAPS |
jmitc91516 | 2:6e94a7fd1e37 | 485 | GuiConst_INT8U bitmapIndex = GuiStruct_Bitmap_RunButtonBlank; |
jmitc91516 | 1:a5258871b33d | 486 | if(enabled) { |
jmitc91516 | 1:a5258871b33d | 487 | bitmapIndex = GuiStruct_Bitmap_RunButtonGreen; |
jmitc91516 | 1:a5258871b33d | 488 | } |
jmitc91516 | 1:a5258871b33d | 489 | GuiConst_INTCOLOR transparentColor = SixteenBitColorValue(255, 255, 255); // In the 'corners' of the bitmap |
jmitc91516 | 1:a5258871b33d | 490 | |
jmitc91516 | 1:a5258871b33d | 491 | // Hard coded coordinates copied from easyGUI (I have not found |
jmitc91516 | 1:a5258871b33d | 492 | // a way of getting them from the easyGUI code at runtime) |
jmitc91516 | 1:a5258871b33d | 493 | GuiLib_ShowBitmap(bitmapIndex, 327, 170, transparentColor); |
jmitc91516 | 1:a5258871b33d | 494 | |
jmitc91516 | 1:a5258871b33d | 495 | #else // Draw a 'button' that consists of a box containing the word 'Run'. |
jmitc91516 | 1:a5258871b33d | 496 | |
jmitc91516 | 0:47c880c1463d | 497 | // Black if enabled, grey if disabled |
jmitc91516 | 0:47c880c1463d | 498 | GuiConst_INTCOLOR buttonColor = (enabled) ? 0 : SixteenBitColorValue(0x80, 0x80, 0x80); |
jmitc91516 | 0:47c880c1463d | 499 | |
jmitc91516 | 0:47c880c1463d | 500 | GuiConst_TEXT *buttonText = "Run"; |
jmitc91516 | 0:47c880c1463d | 501 | |
jmitc91516 | 0:47c880c1463d | 502 | // These are hard-coded to match the corresponding definitions in easyGUI |
jmitc91516 | 0:47c880c1463d | 503 | // (I have not found a way of getting these values from easyGUI at run time) |
jmitc91516 | 0:47c880c1463d | 504 | const GuiConst_INT16S textX1 = 400; |
jmitc91516 | 0:47c880c1463d | 505 | const GuiConst_INT16S textY1 = 220; |
jmitc91516 | 0:47c880c1463d | 506 | const GuiConst_INT16U textFont = GuiFont_Helv1; |
jmitc91516 | 0:47c880c1463d | 507 | |
jmitc91516 | 0:47c880c1463d | 508 | const GuiConst_INT16S boxX1 = 338; |
jmitc91516 | 0:47c880c1463d | 509 | const GuiConst_INT16S boxY1 = 195; |
jmitc91516 | 0:47c880c1463d | 510 | const GuiConst_INT16S boxX2 = 462; |
jmitc91516 | 0:47c880c1463d | 511 | const GuiConst_INT16S boxY2 = 235; |
jmitc91516 | 0:47c880c1463d | 512 | |
jmitc91516 | 0:47c880c1463d | 513 | GuiLib_Box(boxX1, boxY1, boxX2, boxY2, buttonColor); |
jmitc91516 | 0:47c880c1463d | 514 | |
jmitc91516 | 0:47c880c1463d | 515 | GuiLib_DrawStr( |
jmitc91516 | 0:47c880c1463d | 516 | textX1, //GuiConst_INT16S X, |
jmitc91516 | 0:47c880c1463d | 517 | textY1, //GuiConst_INT16S Y, |
jmitc91516 | 0:47c880c1463d | 518 | textFont, //GuiConst_INT16U FontNo, |
jmitc91516 | 0:47c880c1463d | 519 | buttonText, //GuiConst_TEXT PrefixLocate *String, |
jmitc91516 | 0:47c880c1463d | 520 | GuiLib_ALIGN_CENTER, //GuiConst_INT8U Alignment, |
jmitc91516 | 0:47c880c1463d | 521 | GuiLib_PS_ON, //GuiConst_INT8U PsWriting, |
jmitc91516 | 0:47c880c1463d | 522 | GuiLib_TRANSPARENT_ON, //GuiConst_INT8U Transparent, |
jmitc91516 | 0:47c880c1463d | 523 | GuiLib_UNDERLINE_OFF, //GuiConst_INT8U Underlining, |
jmitc91516 | 0:47c880c1463d | 524 | 0, //GuiConst_INT16S BackBoxSizeX, |
jmitc91516 | 0:47c880c1463d | 525 | 0, //GuiConst_INT16S BackBoxSizeY1, |
jmitc91516 | 0:47c880c1463d | 526 | 0, //GuiConst_INT16S BackBoxSizeY2, |
jmitc91516 | 0:47c880c1463d | 527 | GuiLib_BBP_NONE, //GuiConst_INT8U BackBorderPixels, |
jmitc91516 | 0:47c880c1463d | 528 | buttonColor, //GuiConst_INTCOLOR ForeColor, |
jmitc91516 | 0:47c880c1463d | 529 | SixteenBitColorValue(0xFF, 0xFF, 0xFF) //GuiConst_INTCOLOR BackColor (should be ignored with GuiLib_TRANSPARENT_ON) |
jmitc91516 | 0:47c880c1463d | 530 | ); |
jmitc91516 | 1:a5258871b33d | 531 | #endif // USE_BITMAPS |
jmitc91516 | 1:a5258871b33d | 532 | } |
jmitc91516 | 1:a5258871b33d | 533 | |
jmitc91516 | 1:a5258871b33d | 534 | |
jmitc91516 | 1:a5258871b33d | 535 | // Make these values available to the rest of the application |
jmitc91516 | 1:a5258871b33d | 536 | GuiConst_INTCOLOR GetFakeBackgroundBitmapMainColour(void) |
jmitc91516 | 1:a5258871b33d | 537 | { |
jmitc91516 | 1:a5258871b33d | 538 | return SixteenBitColorValue(173, 222, 231); // From Background317 bitmap |
jmitc91516 | 1:a5258871b33d | 539 | //return SixteenBitColorValue(0, 148, 165); // From Background320 bitmap |
jmitc91516 | 1:a5258871b33d | 540 | } |
jmitc91516 | 1:a5258871b33d | 541 | |
jmitc91516 | 1:a5258871b33d | 542 | GuiConst_INTCOLOR GetFakeBackgroundBitmapButtonBandColour(void) |
jmitc91516 | 1:a5258871b33d | 543 | { |
jmitc91516 | 1:a5258871b33d | 544 | //return SixteenBitColorValue(173, 173, 173); // Grey band at bottom |
jmitc91516 | 1:a5258871b33d | 545 | return SixteenBitColorValue(192, 192, 192); |
jmitc91516 | 1:a5258871b33d | 546 | } |
jmitc91516 | 1:a5258871b33d | 547 | |
jmitc91516 | 1:a5258871b33d | 548 | |
jmitc91516 | 1:a5258871b33d | 549 | /* |
jmitc91516 | 1:a5258871b33d | 550 | Draws the background bitmap. It fills the screen - |
jmitc91516 | 1:a5258871b33d | 551 | so you do not need to call GuiLib_Clear if you call this. |
jmitc91516 | 1:a5258871b33d | 552 | (*** BUT - maybe this causes easyGUI to lose track of which page is displayed, |
jmitc91516 | 1:a5258871b33d | 553 | and/or of its touch areas - so reinstated as a test with |
jmitc91516 | 1:a5258871b33d | 554 | '#define WANT_GUILIB_CLEAR_BEFORE_DRAWING_BITMAP' ***) |
jmitc91516 | 1:a5258871b33d | 555 | |
jmitc91516 | 1:a5258871b33d | 556 | Alternatively - if the bitmap we are using has blocks of solid colour anyway - |
jmitc91516 | 1:a5258871b33d | 557 | draw the areas directly (we could then save memory by not including |
jmitc91516 | 1:a5258871b33d | 558 | the actual bitmap in the application) |
jmitc91516 | 1:a5258871b33d | 559 | */ |
jmitc91516 | 1:a5258871b33d | 560 | static void DrawSpecifiedBackgroundBitmap(GuiConst_INT8U bitmapIndex) |
jmitc91516 | 1:a5258871b33d | 561 | { |
jmitc91516 | 1:a5258871b33d | 562 | // Does this solve bug #4? |
jmitc91516 | 1:a5258871b33d | 563 | //#define WANT_GUILIB_CLEAR_BEFORE_DRAWING_BITMAP |
jmitc91516 | 1:a5258871b33d | 564 | #ifdef WANT_GUILIB_CLEAR_BEFORE_DRAWING_BITMAP |
jmitc91516 | 1:a5258871b33d | 565 | GuiLib_Clear(); |
jmitc91516 | 1:a5258871b33d | 566 | #undef WANT_GUILIB_CLEAR_BEFORE_DRAWING_BITMAP |
jmitc91516 | 1:a5258871b33d | 567 | #endif //WANT_GUILIB_CLEAR_BEFORE_DRAWING_BITMAP |
jmitc91516 | 1:a5258871b33d | 568 | // Answer - no, it doesn't |
jmitc91516 | 1:a5258871b33d | 569 | |
jmitc91516 | 1:a5258871b33d | 570 | //#define FAKE_BITMAP |
jmitc91516 | 1:a5258871b33d | 571 | #ifdef FAKE_BITMAP |
jmitc91516 | 1:a5258871b33d | 572 | GuiLib_FillBox(0, 0, 800, 423, GetFakeBackgroundBitmapMainColour()); |
jmitc91516 | 1:a5258871b33d | 573 | GuiLib_FillBox(0, 424, 800, 480, GetFakeBackgroundBitmapButtonBandColour()); |
jmitc91516 | 1:a5258871b33d | 574 | #undef FAKE_BITMAP |
jmitc91516 | 1:a5258871b33d | 575 | #else |
jmitc91516 | 1:a5258871b33d | 576 | GuiLib_ShowBitmap(bitmapIndex, 0, 0, -1); // -1 means 'no transparent colour' |
jmitc91516 | 1:a5258871b33d | 577 | #endif // FAKE_BITMAP |
jmitc91516 | 1:a5258871b33d | 578 | } |
jmitc91516 | 1:a5258871b33d | 579 | |
jmitc91516 | 1:a5258871b33d | 580 | /* |
jmitc91516 | 1:a5258871b33d | 581 | Draws the default background bitmap, i.e. *without* the Ellutia logo |
jmitc91516 | 1:a5258871b33d | 582 | */ |
jmitc91516 | 1:a5258871b33d | 583 | void DrawBackgroundBitmap(void) |
jmitc91516 | 1:a5258871b33d | 584 | { |
jmitc91516 | 1:a5258871b33d | 585 | DrawSpecifiedBackgroundBitmap(GuiStruct_Bitmap_BlankBackground); |
jmitc91516 | 1:a5258871b33d | 586 | } |
jmitc91516 | 1:a5258871b33d | 587 | |
jmitc91516 | 1:a5258871b33d | 588 | /* |
jmitc91516 | 1:a5258871b33d | 589 | Same as the above, but draws the background bitmap *with* the Ellutia logo |
jmitc91516 | 1:a5258871b33d | 590 | */ |
jmitc91516 | 1:a5258871b33d | 591 | void DrawBackgroundBitmapWithLogo(void) |
jmitc91516 | 1:a5258871b33d | 592 | { |
jmitc91516 | 1:a5258871b33d | 593 | DrawSpecifiedBackgroundBitmap(GuiStruct_Bitmap_BootScreen); |
jmitc91516 | 1:a5258871b33d | 594 | } |
jmitc91516 | 1:a5258871b33d | 595 | |
jmitc91516 | 1:a5258871b33d | 596 | /* |
jmitc91516 | 1:a5258871b33d | 597 | For Display (LPC4088) Bug #11, draw a background bitmap without a grey bar at the bottom. |
jmitc91516 | 1:a5258871b33d | 598 | For now, fake this with a page full of one colour |
jmitc91516 | 1:a5258871b33d | 599 | */ |
jmitc91516 | 1:a5258871b33d | 600 | void DrawFakeBackgroundBitmapForNumericKeypadPage(void) |
jmitc91516 | 1:a5258871b33d | 601 | { |
jmitc91516 | 1:a5258871b33d | 602 | // GuiLib_FillBox(0, 0, 800, 480, SixteenBitColorValue(0, 90, 99)); |
jmitc91516 | 1:a5258871b33d | 603 | // Above is for the old background bitmap. For the new "BlankBackground", we need... |
jmitc91516 | 1:a5258871b33d | 604 | GuiLib_FillBox(0, 0, 800, 480, SixteenBitColorValue(255, 255, 255)); |
jmitc91516 | 1:a5258871b33d | 605 | } |
jmitc91516 | 1:a5258871b33d | 606 | |
jmitc91516 | 1:a5258871b33d | 607 | |
jmitc91516 | 1:a5258871b33d | 608 | /* |
jmitc91516 | 1:a5258871b33d | 609 | This functions erases the portions of the door Lock and Release buttons (on the Column pages) |
jmitc91516 | 1:a5258871b33d | 610 | that remain visible when they are replaced by the Close or Unlock buttons. |
jmitc91516 | 1:a5258871b33d | 611 | |
jmitc91516 | 1:a5258871b33d | 612 | I have to admit that I still do not understand why simply redrawing the whole page |
jmitc91516 | 1:a5258871b33d | 613 | (starting with the background bitmap) does not do this. |
jmitc91516 | 1:a5258871b33d | 614 | |
jmitc91516 | 1:a5258871b33d | 615 | No arguments, no return code. |
jmitc91516 | 1:a5258871b33d | 616 | */ |
jmitc91516 | 1:a5258871b33d | 617 | void DrawBackgroundBitmapOverDoorLockAndReleaseButtons(void) |
jmitc91516 | 1:a5258871b33d | 618 | { |
jmitc91516 | 1:a5258871b33d | 619 | // I also do not understand why the first coordinate pair in the call to GuiLib_ShowBitmapArea |
jmitc91516 | 1:a5258871b33d | 620 | // needs to be 0, 0 to display the correct part of the bitmap. I expected them to be the same |
jmitc91516 | 1:a5258871b33d | 621 | // as the second coordinate pair - but that caused the top left portion of the bitmap to be displayed, |
jmitc91516 | 1:a5258871b33d | 622 | // not the part where the buttons actually are. |
jmitc91516 | 1:a5258871b33d | 623 | GuiLib_ShowBitmapArea(GuiStruct_Bitmap_BlankBackground, 0, 0, 248, 405, 323, 480, -1); // -1 means 'no transparent colour' |
jmitc91516 | 1:a5258871b33d | 624 | GuiLib_ShowBitmapArea(GuiStruct_Bitmap_BlankBackground, 0, 0, 477, 405, 552, 480, -1); // -1 means 'no transparent colour' |
jmitc91516 | 1:a5258871b33d | 625 | // GuiLib_FillBox(248, 405, 323, 480, SixteenBitColorValue(165, 165, 173)); |
jmitc91516 | 1:a5258871b33d | 626 | // GuiLib_FillBox(477, 405, 552, 480, SixteenBitColorValue(115, 123, 132)); |
jmitc91516 | 1:a5258871b33d | 627 | } |
jmitc91516 | 1:a5258871b33d | 628 | #define USING_BACKGROUND_BITMAP |
jmitc91516 | 1:a5258871b33d | 629 | |
jmitc91516 | 1:a5258871b33d | 630 | |
jmitc91516 | 1:a5258871b33d | 631 | |
jmitc91516 | 1:a5258871b33d | 632 | /* |
jmitc91516 | 1:a5258871b33d | 633 | Copies the build date (#define'd as BUILD_DATE at the top of this file) |
jmitc91516 | 1:a5258871b33d | 634 | to the easyGUI variable that displays it on the Settings page |
jmitc91516 | 1:a5258871b33d | 635 | */ |
jmitc91516 | 1:a5258871b33d | 636 | void SetupEasyGUIBuildDateVariable(void) |
jmitc91516 | 0:47c880c1463d | 637 | { |
jmitc91516 | 1:a5258871b33d | 638 | strcpy(GuiVar_buildDate, BUILD_DATE); |
jmitc91516 | 1:a5258871b33d | 639 | } |
jmitc91516 | 1:a5258871b33d | 640 | |
jmitc91516 | 1:a5258871b33d | 641 | |
jmitc91516 | 1:a5258871b33d | 642 | /* |
jmitc91516 | 1:a5258871b33d | 643 | Draw a part of a profile - which will be a quadrilateral, vertical at left and right, horizontal at the bottom, but a sloping straight line at the top - |
jmitc91516 | 1:a5258871b33d | 644 | by calling the EasyGUI GuiLib_VLine function multiple times. |
jmitc91516 | 1:a5258871b33d | 645 | |
jmitc91516 | 1:a5258871b33d | 646 | Args: colour of the profile to the left of the boundary |
jmitc91516 | 1:a5258871b33d | 647 | colour of the profile to the right of the boundary |
jmitc91516 | 1:a5258871b33d | 648 | X coords of the left and right edges of the section |
jmitc91516 | 1:a5258871b33d | 649 | X coord of the colour boundary |
jmitc91516 | 1:a5258871b33d | 650 | Y coord of the bottom |
jmitc91516 | 1:a5258871b33d | 651 | Y coords of the top left and top right |
jmitc91516 | 1:a5258871b33d | 652 | |
jmitc91516 | 1:a5258871b33d | 653 | Returns true if OK, false if it failed (e.g. the coords were invalid). |
jmitc91516 | 1:a5258871b33d | 654 | */ |
jmitc91516 | 1:a5258871b33d | 655 | bool DrawProfileSectionUsingGuiLibVLine(GuiConst_INTCOLOR colour1, GuiConst_INTCOLOR colour2, GuiConst_INT16S xLeft, GuiConst_INT16S xRight, GuiConst_INT16S xColourBoundary, |
jmitc91516 | 1:a5258871b33d | 656 | GuiConst_INT16S yBottom, GuiConst_INT16S yTopLeft, GuiConst_INT16S yTopRight) |
jmitc91516 | 1:a5258871b33d | 657 | { |
jmitc91516 | 1:a5258871b33d | 658 | if(xRight <= xLeft) return false; // Would cause divide by zero if they were equal |
jmitc91516 | 1:a5258871b33d | 659 | |
jmitc91516 | 1:a5258871b33d | 660 | // y = mx + c |
jmitc91516 | 1:a5258871b33d | 661 | double yDiff = (double) (yTopRight - yTopLeft); |
jmitc91516 | 1:a5258871b33d | 662 | double xDiff = (double) (xRight - xLeft); |
jmitc91516 | 1:a5258871b33d | 663 | double m = yDiff / xDiff; |
jmitc91516 | 1:a5258871b33d | 664 | double c = (double) yTopLeft - (m * (double) xLeft); |
jmitc91516 | 1:a5258871b33d | 665 | |
jmitc91516 | 1:a5258871b33d | 666 | GuiConst_INT16S lineX; |
jmitc91516 | 1:a5258871b33d | 667 | double lineYTop; |
jmitc91516 | 1:a5258871b33d | 668 | |
jmitc91516 | 1:a5258871b33d | 669 | // Draw first colour up to boundary. |
jmitc91516 | 1:a5258871b33d | 670 | // Allow for the boundary being past the right-hand end |
jmitc91516 | 1:a5258871b33d | 671 | for (lineX = xLeft; (lineX <= xColourBoundary) && (lineX <= xRight); ++lineX) { |
jmitc91516 | 1:a5258871b33d | 672 | lineYTop = (((double) lineX) * m) + c; |
jmitc91516 | 1:a5258871b33d | 673 | GuiLib_VLine(lineX, yBottom, (GuiConst_INT16S) lineYTop, colour1); |
jmitc91516 | 1:a5258871b33d | 674 | } |
jmitc91516 | 1:a5258871b33d | 675 | |
jmitc91516 | 1:a5258871b33d | 676 | // Draw second colour after boundary, if we have not already reached the right-hand end |
jmitc91516 | 1:a5258871b33d | 677 | for (; lineX <= xRight; ++lineX) { |
jmitc91516 | 1:a5258871b33d | 678 | lineYTop = (((double) lineX) * m) + c; |
jmitc91516 | 1:a5258871b33d | 679 | GuiLib_VLine(lineX, yBottom, (GuiConst_INT16S) lineYTop, colour2); |
jmitc91516 | 1:a5258871b33d | 680 | } |
jmitc91516 | 1:a5258871b33d | 681 | |
jmitc91516 | 1:a5258871b33d | 682 | return true; |
jmitc91516 | 1:a5258871b33d | 683 | } |
jmitc91516 | 1:a5258871b33d | 684 | |
jmitc91516 | 1:a5258871b33d | 685 | /* |
jmitc91516 | 1:a5258871b33d | 686 | Displays the specified easyGUI 'structure' (or page, to use a more easily understood term). |
jmitc91516 | 1:a5258871b33d | 687 | |
jmitc91516 | 1:a5258871b33d | 688 | Args are: the index of the structure to be displayed, |
jmitc91516 | 1:a5258871b33d | 689 | a pointer to the USBHostGC instance that corresponds to the GC, |
jmitc91516 | 1:a5258871b33d | 690 | a pointer to the USBDeviceConnected instance that (also) corresponds to the GC |
jmitc91516 | 1:a5258871b33d | 691 | a boolean - defaulting to true - that gives the caller the option to stop the 'structure' |
jmitc91516 | 1:a5258871b33d | 692 | updating its easyGUI variables (either from the GC or from its own internal values) |
jmitc91516 | 1:a5258871b33d | 693 | when it is redisplayed. This is set false by the NumericKeypadHandler, |
jmitc91516 | 1:a5258871b33d | 694 | when the user has just pressed the Apply button on the Numeric Keypad page |
jmitc91516 | 1:a5258871b33d | 695 | and NumericKeypadHandler has updated the corresponding easyGUI variable |
jmitc91516 | 1:a5258871b33d | 696 | on the page that called it, to stop the calling page/structure |
jmitc91516 | 1:a5258871b33d | 697 | from promptly overwriting that same variable. |
jmitc91516 | 1:a5258871b33d | 698 | |
jmitc91516 | 1:a5258871b33d | 699 | No return code. |
jmitc91516 | 1:a5258871b33d | 700 | |
jmitc91516 | 1:a5258871b33d | 701 | TODO: "Refactor" this function. It has had code added to it piecemeal over a long period, |
jmitc91516 | 1:a5258871b33d | 702 | and has become too large to easily understand. |
jmitc91516 | 1:a5258871b33d | 703 | */ |
jmitc91516 | 1:a5258871b33d | 704 | void DisplayEasyGuiStructure(int structureIndex, USBDeviceConnected* usbDevice, USBHostGC* usbHostGC, bool updateEasyGUIVariables = true) |
jmitc91516 | 1:a5258871b33d | 705 | { |
jmitc91516 | 1:a5258871b33d | 706 | // If required, query the GC to find out if it is ready to run, etc, *before* clearing the display - |
jmitc91516 | 0:47c880c1463d | 707 | // otherwise the display remains clear while we talk to the GC - causes noticeable flickering |
jmitc91516 | 2:6e94a7fd1e37 | 708 | GCStateSimplified simplifiedGCState = GC_IDLE; |
jmitc91516 | 0:47c880c1463d | 709 | if((structureIndex == GuiStruct_HomePage_1) && (usbDevice != NULL) && (usbHostGC != NULL)) { |
jmitc91516 | 1:a5258871b33d | 710 | int gcStatus = GetGCStatus(usbDevice, usbHostGC); |
jmitc91516 | 2:6e94a7fd1e37 | 711 | simplifiedGCState = GCStateOrFaultCode::GetSimplifiedGCState(gcStatus); |
jmitc91516 | 0:47c880c1463d | 712 | } |
jmitc91516 | 0:47c880c1463d | 713 | |
jmitc91516 | 1:a5258871b33d | 714 | #define DEBUG_HERE |
jmitc91516 | 1:a5258871b33d | 715 | #ifdef DEBUG_HERE |
jmitc91516 | 1:a5258871b33d | 716 | char dbg[100]; |
jmitc91516 | 1:a5258871b33d | 717 | sprintf(dbg, "DisplayEasyGuiStructure - structure is %d", structureIndex); |
jmitc91516 | 1:a5258871b33d | 718 | EasyGUIDebugPrint(dbg, 0, 20); |
jmitc91516 | 1:a5258871b33d | 719 | #undef DEBUG_HERE |
jmitc91516 | 1:a5258871b33d | 720 | #endif |
jmitc91516 | 0:47c880c1463d | 721 | |
jmitc91516 | 1:a5258871b33d | 722 | #ifdef USING_BACKGROUND_BITMAP |
jmitc91516 | 1:a5258871b33d | 723 | // We want the status rectangles to be 'on top' of this - |
jmitc91516 | 1:a5258871b33d | 724 | // if we include it in the easyGUI page itself, it gets drawn by GuiLib_ShowScreen, |
jmitc91516 | 1:a5258871b33d | 725 | // and overwrites the rectangles |
jmitc91516 | 1:a5258871b33d | 726 | if((structureIndex == GuiStruct_GCConnectionPage_Def) || (structureIndex == GuiStruct_EthernetConnectionPage_Def)) { |
jmitc91516 | 1:a5258871b33d | 727 | DrawBackgroundBitmapWithLogo(); |
jmitc91516 | 1:a5258871b33d | 728 | } else if ((structureIndex == GuiStruct_NumericKeypadPage_Def) || (structureIndex == GuiStruct_EthernetKeypadPage_Def)) { |
jmitc91516 | 1:a5258871b33d | 729 | DrawFakeBackgroundBitmapForNumericKeypadPage(); |
jmitc91516 | 1:a5258871b33d | 730 | } else { |
jmitc91516 | 1:a5258871b33d | 731 | DrawBackgroundBitmap(); |
jmitc91516 | 1:a5258871b33d | 732 | } |
jmitc91516 | 1:a5258871b33d | 733 | #else |
jmitc91516 | 1:a5258871b33d | 734 | GuiLib_Clear(); // Don't need this if we have drawn the background bitmap - it covers the entire screen |
jmitc91516 | 1:a5258871b33d | 735 | #endif |
jmitc91516 | 1:a5258871b33d | 736 | |
jmitc91516 | 1:a5258871b33d | 737 | // Now, display the status rectangles and the component bitmaps, as appropriate for the page we are displaying. |
jmitc91516 | 0:47c880c1463d | 738 | // Note - we draw the status rectangles after GuiLib_Clear - otherwise we wouldn't see the rectangles at all - |
jmitc91516 | 1:a5258871b33d | 739 | // and before GuiLib_ShowScreen - so text, etc, is drawn on top of the rectangles. |
jmitc91516 | 1:a5258871b33d | 740 | // We draw the component bitmaps, after - therefore, on top of - the status rectangles. |
jmitc91516 | 0:47c880c1463d | 741 | switch(structureIndex) { |
jmitc91516 | 0:47c880c1463d | 742 | case GuiStruct_HomePage_1: |
jmitc91516 | 1:a5258871b33d | 743 | #ifdef USE_QSPI_BITMAPS |
jmitc91516 | 1:a5258871b33d | 744 | qspiBitmaps.DisplayAllHomePageBitmaps(); |
jmitc91516 | 1:a5258871b33d | 745 | #else |
jmitc91516 | 0:47c880c1463d | 746 | homePageGCComponentStatusColorAreas.DisplayAll(); |
jmitc91516 | 1:a5258871b33d | 747 | #endif // USE_QSPI_BITMAPS |
jmitc91516 | 0:47c880c1463d | 748 | break; |
jmitc91516 | 3:010aeeacd7d7 | 749 | |
jmitc91516 | 0:47c880c1463d | 750 | case GuiStruct_ColumnPage1_2: |
jmitc91516 | 0:47c880c1463d | 751 | case GuiStruct_ColumnPage2_9: |
jmitc91516 | 5:aceac1035d71 | 752 | case GuiStruct_ColumnMethodPage_Def: |
jmitc91516 | 7:f0e645cf73a2 | 753 | #ifdef WANT_COMPONENT_ICON_ON_PROFILE_PAGES |
jmitc91516 | 4:6840cf2b153a | 754 | case GuiStruct_ColumnTempProfilePage_60: |
jmitc91516 | 7:f0e645cf73a2 | 755 | #endif // WANT_COMPONENT_ICON_ON_PROFILE_PAGES |
jmitc91516 | 4:6840cf2b153a | 756 | // Column status rectangle no longer used |
jmitc91516 | 3:010aeeacd7d7 | 757 | //singleGCComponentPageStatusColorAreas.DisplayGCComponentStatus(COLUMN); |
jmitc91516 | 1:a5258871b33d | 758 | qspiBitmaps.DisplayColumnComponentBitmap(); |
jmitc91516 | 0:47c880c1463d | 759 | break; |
jmitc91516 | 3:010aeeacd7d7 | 760 | |
jmitc91516 | 0:47c880c1463d | 761 | case GuiStruct_InjectorPage1_3: |
jmitc91516 | 6:dba3fbdfd5da | 762 | case GuiStruct_InjectorMethodPage_Def: |
jmitc91516 | 7:f0e645cf73a2 | 763 | #ifdef WANT_COMPONENT_ICON_ON_PROFILE_PAGES |
jmitc91516 | 1:a5258871b33d | 764 | case GuiStruct_InjectorTempProfilePage_25: |
jmitc91516 | 7:f0e645cf73a2 | 765 | #endif // WANT_COMPONENT_ICON_ON_PROFILE_PAGES |
jmitc91516 | 3:010aeeacd7d7 | 766 | // Injector status rectangle no longer used |
jmitc91516 | 3:010aeeacd7d7 | 767 | //singleGCComponentPageStatusColorAreas.DisplayGCComponentStatus(INJECTOR); |
jmitc91516 | 1:a5258871b33d | 768 | qspiBitmaps.DisplayInjectorComponentBitmap(); |
jmitc91516 | 0:47c880c1463d | 769 | break; |
jmitc91516 | 3:010aeeacd7d7 | 770 | |
jmitc91516 | 1:a5258871b33d | 771 | case GuiStruct_DetectorFIDPage_4: |
jmitc91516 | 1:a5258871b33d | 772 | case GuiStruct_DetectorECDPage_12: |
jmitc91516 | 1:a5258871b33d | 773 | case GuiStruct_DetectorFPDPage_14: |
jmitc91516 | 1:a5258871b33d | 774 | case GuiStruct_DetectorTCDPage_11: |
jmitc91516 | 1:a5258871b33d | 775 | case GuiStruct_DetectorNonePage_31: |
jmitc91516 | 1:a5258871b33d | 776 | case GuiStruct_DetectorNPDPage_28: |
jmitc91516 | 1:a5258871b33d | 777 | case GuiStruct_DetectorPIDPage_29: |
jmitc91516 | 1:a5258871b33d | 778 | case GuiStruct_DetectorSPDIDPage_30: |
jmitc91516 | 1:a5258871b33d | 779 | case GuiStruct_DetectorTXLPage_27: |
jmitc91516 | 3:010aeeacd7d7 | 780 | // Detector status rectangle no longer used |
jmitc91516 | 3:010aeeacd7d7 | 781 | //singleGCComponentPageStatusColorAreas.DisplayGCComponentStatus(DETECTOR); |
jmitc91516 | 1:a5258871b33d | 782 | qspiBitmaps.DisplayDetectorComponentBitmap(); |
jmitc91516 | 0:47c880c1463d | 783 | break; |
jmitc91516 | 3:010aeeacd7d7 | 784 | |
jmitc91516 | 7:f0e645cf73a2 | 785 | #ifdef WANT_COMPONENT_ICON_ON_PROFILE_PAGES |
jmitc91516 | 1:a5258871b33d | 786 | case GuiStruct_GasProfilePage_15: |
jmitc91516 | 7:f0e645cf73a2 | 787 | #endif // WANT_COMPONENT_ICON_ON_PROFILE_PAGES |
jmitc91516 | 6:dba3fbdfd5da | 788 | case GuiStruct_GasMethodPage_Def: |
jmitc91516 | 1:a5258871b33d | 789 | case GuiStruct_GasInformationPage_6: |
jmitc91516 | 1:a5258871b33d | 790 | #ifdef WANT_STATUS_RECTANGLE_ON_GAS_CALIB_PAGES |
jmitc91516 | 1:a5258871b33d | 791 | case GuiStruct_GasCalibrationPage_Def: |
jmitc91516 | 1:a5258871b33d | 792 | case GuiStruct_GasBackPressureDACPage_Def: |
jmitc91516 | 1:a5258871b33d | 793 | case GuiStruct_GasChannelDACAndADCPage_Def: |
jmitc91516 | 1:a5258871b33d | 794 | #endif |
jmitc91516 | 3:010aeeacd7d7 | 795 | // Gas status rectangle no longer used |
jmitc91516 | 3:010aeeacd7d7 | 796 | //singleGCComponentPageStatusColorAreas.DisplayGCComponentStatus(GAS); |
jmitc91516 | 1:a5258871b33d | 797 | qspiBitmaps.DisplayGasComponentBitmap(); |
jmitc91516 | 0:47c880c1463d | 798 | break; |
jmitc91516 | 3:010aeeacd7d7 | 799 | |
jmitc91516 | 0:47c880c1463d | 800 | default: // Don't need to display status rectangle for this page |
jmitc91516 | 0:47c880c1463d | 801 | break; |
jmitc91516 | 0:47c880c1463d | 802 | } |
jmitc91516 | 1:a5258871b33d | 803 | |
jmitc91516 | 1:a5258871b33d | 804 | if(structureIndex == GuiStruct_RunningPage1_7) { |
jmitc91516 | 1:a5258871b33d | 805 | if(getGCStatusLoop != NULL) { |
jmitc91516 | 1:a5258871b33d | 806 | getGCStatusLoop->UpdateMethodRunTimeEasyGUIVariables(false); |
jmitc91516 | 1:a5258871b33d | 807 | } |
jmitc91516 | 1:a5258871b33d | 808 | } |
jmitc91516 | 1:a5258871b33d | 809 | |
jmitc91516 | 5:aceac1035d71 | 810 | if(structureIndex == GuiStruct_ColumnPage1_2){ |
jmitc91516 | 1:a5258871b33d | 811 | if(getGCStatusLoop != NULL) { |
jmitc91516 | 1:a5258871b33d | 812 | getGCStatusLoop->UpdateColumnStatusEasyGUIVariable(); |
jmitc91516 | 1:a5258871b33d | 813 | } |
jmitc91516 | 1:a5258871b33d | 814 | } |
jmitc91516 | 1:a5258871b33d | 815 | |
jmitc91516 | 1:a5258871b33d | 816 | if(structureIndex == GuiStruct_InjectorPage1_3){ |
jmitc91516 | 1:a5258871b33d | 817 | if(getGCStatusLoop != NULL) { |
jmitc91516 | 1:a5258871b33d | 818 | getGCStatusLoop->UpdateInjectorStatusEasyGUIVariable(); |
jmitc91516 | 1:a5258871b33d | 819 | } |
jmitc91516 | 1:a5258871b33d | 820 | } |
jmitc91516 | 1:a5258871b33d | 821 | |
jmitc91516 | 1:a5258871b33d | 822 | if(structureIndex == GuiStruct_EthernetParametersPage_50) { |
jmitc91516 | 1:a5258871b33d | 823 | NetworkParameters *networkParameters = NetworkParameters::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 824 | |
jmitc91516 | 1:a5258871b33d | 825 | if(networkParameters != NULL) { |
jmitc91516 | 1:a5258871b33d | 826 | networkParameters->DisplayingEasyGUIPage(updateEasyGUIVariables); |
jmitc91516 | 1:a5258871b33d | 827 | } |
jmitc91516 | 1:a5258871b33d | 828 | } |
jmitc91516 | 1:a5258871b33d | 829 | |
jmitc91516 | 1:a5258871b33d | 830 | if(structureIndex == GuiStruct_GasCalibrationPage_Def) { |
jmitc91516 | 1:a5258871b33d | 831 | GasCalibrationPageHandler *gasCalibrationPageHandler = GasCalibrationPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 832 | |
jmitc91516 | 1:a5258871b33d | 833 | if(gasCalibrationPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 834 | gasCalibrationPageHandler->DisplayingEasyGUIPage(updateEasyGUIVariables); |
jmitc91516 | 1:a5258871b33d | 835 | } |
jmitc91516 | 1:a5258871b33d | 836 | } |
jmitc91516 | 1:a5258871b33d | 837 | |
jmitc91516 | 1:a5258871b33d | 838 | if(structureIndex == GuiStruct_GasBackPressureDACPage_Def) { |
jmitc91516 | 1:a5258871b33d | 839 | GasBackPressureDACPageHandler *gasBackPressureDACPageHandler = GasBackPressureDACPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 840 | |
jmitc91516 | 1:a5258871b33d | 841 | if(gasBackPressureDACPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 842 | gasBackPressureDACPageHandler->DisplayingEasyGUIPage(updateEasyGUIVariables); |
jmitc91516 | 1:a5258871b33d | 843 | } |
jmitc91516 | 1:a5258871b33d | 844 | } |
jmitc91516 | 1:a5258871b33d | 845 | |
jmitc91516 | 1:a5258871b33d | 846 | if(structureIndex == GuiStruct_GasChannelDACAndADCPage_Def) { |
jmitc91516 | 1:a5258871b33d | 847 | GasChannelDACAndADCPageHandler *gasChannelDACAndADCPageHandler = GasChannelDACAndADCPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 848 | |
jmitc91516 | 1:a5258871b33d | 849 | if(gasChannelDACAndADCPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 850 | gasChannelDACAndADCPageHandler->DisplayingEasyGUIPage(); |
jmitc91516 | 1:a5258871b33d | 851 | } |
jmitc91516 | 1:a5258871b33d | 852 | } |
jmitc91516 | 1:a5258871b33d | 853 | |
jmitc91516 | 1:a5258871b33d | 854 | if(structureIndex == GuiStruct_ColumnDHAutoCalibrationPage_Def) { |
jmitc91516 | 1:a5258871b33d | 855 | ColumnDHAutoCalibrationPageHandler *columnDHAutoCalibrationPageHandler = ColumnDHAutoCalibrationPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 856 | |
jmitc91516 | 1:a5258871b33d | 857 | if(columnDHAutoCalibrationPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 858 | columnDHAutoCalibrationPageHandler->DisplayingEasyGUIPage(); |
jmitc91516 | 1:a5258871b33d | 859 | } |
jmitc91516 | 1:a5258871b33d | 860 | } |
jmitc91516 | 1:a5258871b33d | 861 | |
jmitc91516 | 1:a5258871b33d | 862 | if(structureIndex == GuiStruct_ColumnDHManualCalibrationPage_Def) { |
jmitc91516 | 1:a5258871b33d | 863 | ColumnDHManualCalibrationPageHandler *columnDHManualCalibrationPageHandler = ColumnDHManualCalibrationPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 864 | |
jmitc91516 | 1:a5258871b33d | 865 | if(columnDHManualCalibrationPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 866 | columnDHManualCalibrationPageHandler->DisplayingEasyGUIPage(updateEasyGUIVariables); |
jmitc91516 | 1:a5258871b33d | 867 | } |
jmitc91516 | 1:a5258871b33d | 868 | } |
jmitc91516 | 1:a5258871b33d | 869 | |
jmitc91516 | 1:a5258871b33d | 870 | if(structureIndex == GuiStruct_ColumnDHSensorCalibration_Def) { |
jmitc91516 | 1:a5258871b33d | 871 | ColumnDHSensorCalibrationPageHandler *columnDHSensorCalibrationPageHandler = ColumnDHSensorCalibrationPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 872 | |
jmitc91516 | 1:a5258871b33d | 873 | if(columnDHSensorCalibrationPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 874 | columnDHSensorCalibrationPageHandler->DisplayingEasyGUIPage(updateEasyGUIVariables); |
jmitc91516 | 1:a5258871b33d | 875 | } |
jmitc91516 | 1:a5258871b33d | 876 | } |
jmitc91516 | 1:a5258871b33d | 877 | |
jmitc91516 | 1:a5258871b33d | 878 | if(structureIndex == GuiStruct_PSU_DAC_Page_Def) { |
jmitc91516 | 1:a5258871b33d | 879 | ColumnDHPSUDACPageHandler *columnDHPSUDACPageHandler = ColumnDHPSUDACPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 880 | |
jmitc91516 | 1:a5258871b33d | 881 | if(columnDHPSUDACPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 882 | columnDHPSUDACPageHandler->DisplayingEasyGUIPage(updateEasyGUIVariables); |
jmitc91516 | 1:a5258871b33d | 883 | } |
jmitc91516 | 1:a5258871b33d | 884 | } |
jmitc91516 | 1:a5258871b33d | 885 | |
jmitc91516 | 1:a5258871b33d | 886 | if(NudgeAndDampPageHandler::PageIsANudgeAndDampPage(structureIndex)) { |
jmitc91516 | 1:a5258871b33d | 887 | NudgeAndDampPageHandler *nudgeAndDampPageHandler = NudgeAndDampPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 888 | |
jmitc91516 | 1:a5258871b33d | 889 | if(nudgeAndDampPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 890 | nudgeAndDampPageHandler->DisplayingEasyGUIPage(structureIndex, updateEasyGUIVariables); |
jmitc91516 | 1:a5258871b33d | 891 | } |
jmitc91516 | 1:a5258871b33d | 892 | } |
jmitc91516 | 1:a5258871b33d | 893 | |
jmitc91516 | 1:a5258871b33d | 894 | |
jmitc91516 | 1:a5258871b33d | 895 | if(structureIndex == GuiStruct_ServicingHomePage_Def) { |
jmitc91516 | 1:a5258871b33d | 896 | #ifdef USE_QSPI_BITMAPS |
jmitc91516 | 1:a5258871b33d | 897 | // Use same bitmaps on Servicing Home Page, as on the main Home Page |
jmitc91516 | 1:a5258871b33d | 898 | qspiBitmaps.DisplayAllHomePageBitmaps(); |
jmitc91516 | 1:a5258871b33d | 899 | #endif |
jmitc91516 | 1:a5258871b33d | 900 | } |
jmitc91516 | 1:a5258871b33d | 901 | |
jmitc91516 | 0:47c880c1463d | 902 | GuiLib_ShowScreen(structureIndex, GuiLib_NO_CURSOR, GuiLib_RESET_AUTO_REDRAW); |
jmitc91516 | 0:47c880c1463d | 903 | |
jmitc91516 | 0:47c880c1463d | 904 | // But draw the run button, if required, on top of the fixed part of the home page |
jmitc91516 | 1:a5258871b33d | 905 | // Same for the Heat On/Off button, and the Stabilising or Equilibrating messages (again, if required) |
jmitc91516 | 0:47c880c1463d | 906 | if(structureIndex == GuiStruct_HomePage_1) { |
jmitc91516 | 2:6e94a7fd1e37 | 907 | //#define ALWAYS_WANT_RUN_BUTTON |
jmitc91516 | 2:6e94a7fd1e37 | 908 | #ifdef ALWAYS_WANT_RUN_BUTTON |
jmitc91516 | 2:6e94a7fd1e37 | 909 | DrawRunButton((simplifiedGCState == GC_READY_TO_RUN) || (simplifiedGCState == GC_RUNNING)); |
jmitc91516 | 2:6e94a7fd1e37 | 910 | #else |
jmitc91516 | 2:6e94a7fd1e37 | 911 | if((simplifiedGCState == GC_READY_TO_RUN) || (simplifiedGCState == GC_RUNNING)) { |
jmitc91516 | 2:6e94a7fd1e37 | 912 | DrawRunButton(true); |
jmitc91516 | 2:6e94a7fd1e37 | 913 | } |
jmitc91516 | 2:6e94a7fd1e37 | 914 | #endif // ALWAYS_WANT_RUN_BUTTON |
jmitc91516 | 2:6e94a7fd1e37 | 915 | |
jmitc91516 | 1:a5258871b33d | 916 | #ifdef USE_HEAT_ONOFF_BUTTON_BITMAPS |
jmitc91516 | 1:a5258871b33d | 917 | DrawHeatOnOffButton(); |
jmitc91516 | 1:a5258871b33d | 918 | #endif |
jmitc91516 | 1:a5258871b33d | 919 | |
jmitc91516 | 2:6e94a7fd1e37 | 920 | GCStateOrFaultCode::DrawSimplifiedStateMessageOnHomePageRunButton(simplifiedGCState); |
jmitc91516 | 0:47c880c1463d | 921 | } |
jmitc91516 | 0:47c880c1463d | 922 | |
jmitc91516 | 1:a5258871b33d | 923 | if(structureIndex == GuiStruct_InjectorTempProfilePage_25) { |
jmitc91516 | 1:a5258871b33d | 924 | |
jmitc91516 | 1:a5258871b33d | 925 | // Make sure the injector temperature profile graph is drawn |
jmitc91516 | 1:a5258871b33d | 926 | // on entering this page (note that we must do this *after* |
jmitc91516 | 1:a5258871b33d | 927 | // drawing the injector status rectangle and *after* 'GuiLib_ShowScreen') |
jmitc91516 | 1:a5258871b33d | 928 | |
jmitc91516 | 1:a5258871b33d | 929 | if(getGCStatusLoop != NULL) { |
jmitc91516 | 1:a5258871b33d | 930 | getGCStatusLoop->DisplayInjectorTempProfilePageGraph(); |
jmitc91516 | 1:a5258871b33d | 931 | } |
jmitc91516 | 1:a5258871b33d | 932 | } |
jmitc91516 | 1:a5258871b33d | 933 | |
jmitc91516 | 1:a5258871b33d | 934 | if(structureIndex == GuiStruct_GasProfilePage_15) { |
jmitc91516 | 1:a5258871b33d | 935 | |
jmitc91516 | 1:a5258871b33d | 936 | // Make sure the gas pressure profile graph is drawn |
jmitc91516 | 1:a5258871b33d | 937 | // on entering this page (note that we must do this *after* |
jmitc91516 | 1:a5258871b33d | 938 | // drawing the gas status rectangle and *after* 'GuiLib_ShowScreen') |
jmitc91516 | 1:a5258871b33d | 939 | |
jmitc91516 | 1:a5258871b33d | 940 | if(getGCStatusLoop != NULL) { |
jmitc91516 | 1:a5258871b33d | 941 | getGCStatusLoop->DisplayGasFlowProfilePageGraph(); |
jmitc91516 | 1:a5258871b33d | 942 | } |
jmitc91516 | 1:a5258871b33d | 943 | } |
jmitc91516 | 1:a5258871b33d | 944 | |
jmitc91516 | 1:a5258871b33d | 945 | if(structureIndex == GuiStruct_ColumnTempProfilePage_60) { |
jmitc91516 | 1:a5258871b33d | 946 | |
jmitc91516 | 1:a5258871b33d | 947 | // Make sure the column temperature profile graph is drawn |
jmitc91516 | 1:a5258871b33d | 948 | // on entering this page (note that we must do this *after* |
jmitc91516 | 1:a5258871b33d | 949 | // drawing the column status rectangle and *after* 'GuiLib_ShowScreen') |
jmitc91516 | 1:a5258871b33d | 950 | |
jmitc91516 | 1:a5258871b33d | 951 | if(getGCStatusLoop != NULL) { |
jmitc91516 | 1:a5258871b33d | 952 | getGCStatusLoop->DisplayColumnTempProfilePageGraph(CONVENTIONAL_COLUMN); |
jmitc91516 | 1:a5258871b33d | 953 | } |
jmitc91516 | 1:a5258871b33d | 954 | |
jmitc91516 | 1:a5258871b33d | 955 | //Also in GetGCStatusLoop::DisplayColumnTempProfilePageData |
jmitc91516 | 1:a5258871b33d | 956 | //#define SWIM_TEST |
jmitc91516 | 1:a5258871b33d | 957 | #ifdef SWIM_TEST |
jmitc91516 | 1:a5258871b33d | 958 | SwimDraw* swimDrawInstance = SwimDraw::GetInstance(); |
jmitc91516 | 1:a5258871b33d | 959 | if(swimDrawInstance != NULL) { |
jmitc91516 | 1:a5258871b33d | 960 | // two horizontal boxes |
jmitc91516 | 1:a5258871b33d | 961 | swimDrawInstance->DrawRectangle(SixteenBitColorValue(0xFF, 0, 0), 50, 200, 650, 250); |
jmitc91516 | 1:a5258871b33d | 962 | swimDrawInstance->DrawRectangle(SixteenBitColorValue(0, 0, 0xFF), 50, 350, 650, 400); |
jmitc91516 | 1:a5258871b33d | 963 | |
jmitc91516 | 1:a5258871b33d | 964 | // two vertical boxes |
jmitc91516 | 1:a5258871b33d | 965 | swimDrawInstance->DrawRectangle(SixteenBitColorValue(0xFF, 0, 0), 100, 50, 150, 350); |
jmitc91516 | 1:a5258871b33d | 966 | swimDrawInstance->DrawRectangle(SixteenBitColorValue(0, 0, 0xFF), 500, 50, 550, 350); |
jmitc91516 | 1:a5258871b33d | 967 | } |
jmitc91516 | 1:a5258871b33d | 968 | #else // Draw the same boxes with easyGUI |
jmitc91516 | 1:a5258871b33d | 969 | // GuiLib_FillBox(50, 200, 650, 250, SixteenBitColorValue(0xFF, 0, 0)); |
jmitc91516 | 1:a5258871b33d | 970 | // GuiLib_FillBox(50, 350, 650, 400, SixteenBitColorValue(0, 0, 0xFF)); |
jmitc91516 | 1:a5258871b33d | 971 | |
jmitc91516 | 1:a5258871b33d | 972 | // GuiLib_FillBox(100, 50, 150, 350, SixteenBitColorValue(0xFF, 0, 0)); |
jmitc91516 | 1:a5258871b33d | 973 | // GuiLib_FillBox(500, 50, 550, 350, SixteenBitColorValue(0, 0, 0xFF)); |
jmitc91516 | 1:a5258871b33d | 974 | |
jmitc91516 | 1:a5258871b33d | 975 | // No - draw a dummy profile section |
jmitc91516 | 1:a5258871b33d | 976 | // DrawProfileSectionUsingGuiLibVLine(SixteenBitColorValue(0xFF, 0, 0), 300, 500, 350, 200, 125); |
jmitc91516 | 1:a5258871b33d | 977 | #endif // SWIM_TEST |
jmitc91516 | 1:a5258871b33d | 978 | } |
jmitc91516 | 1:a5258871b33d | 979 | |
jmitc91516 | 1:a5258871b33d | 980 | // Column page - must draw Lock/Release buttons if required |
jmitc91516 | 7:f0e645cf73a2 | 981 | #ifdef WANT_DOOR_ACTUATOR_BUTTONS_ON_COLUMN_PAGES |
jmitc91516 | 1:a5258871b33d | 982 | if((structureIndex == GuiStruct_ColumnDHAutoCalibrationPage_Def) || |
jmitc91516 | 1:a5258871b33d | 983 | (structureIndex == GuiStruct_ColumnPage1_2) || |
jmitc91516 | 1:a5258871b33d | 984 | (structureIndex == GuiStruct_ColumnPage2_9) || |
jmitc91516 | 5:aceac1035d71 | 985 | (structureIndex == GuiStruct_ColumnMethodPage_Def) || |
jmitc91516 | 1:a5258871b33d | 986 | (structureIndex == GuiStruct_ColumnTempProfilePage_60)) { |
jmitc91516 | 7:f0e645cf73a2 | 987 | #else |
jmitc91516 | 7:f0e645cf73a2 | 988 | if(structureIndex == GuiStruct_ColumnDHAutoCalibrationPage_Def) { |
jmitc91516 | 7:f0e645cf73a2 | 989 | #endif |
jmitc91516 | 1:a5258871b33d | 990 | SetupDoorActuatorCommandUserInterface(usbDevice, usbHostGC, false); |
jmitc91516 | 6:dba3fbdfd5da | 991 | } |
jmitc91516 | 7:f0e645cf73a2 | 992 | |
jmitc91516 | 6:dba3fbdfd5da | 993 | if(structureIndex == GuiStruct_ColumnMethodPage_Def) { |
jmitc91516 | 6:dba3fbdfd5da | 994 | if(getGCStatusLoop != NULL) { |
jmitc91516 | 6:dba3fbdfd5da | 995 | getGCStatusLoop->ShowColumnMethodPageScrollButtonsIfNecessary(); |
jmitc91516 | 6:dba3fbdfd5da | 996 | } |
jmitc91516 | 6:dba3fbdfd5da | 997 | } |
jmitc91516 | 6:dba3fbdfd5da | 998 | |
jmitc91516 | 6:dba3fbdfd5da | 999 | if(structureIndex == GuiStruct_InjectorMethodPage_Def) { |
jmitc91516 | 6:dba3fbdfd5da | 1000 | if(getGCStatusLoop != NULL) { |
jmitc91516 | 6:dba3fbdfd5da | 1001 | getGCStatusLoop->ShowInjectorMethodPageScrollButtonsIfNecessary(); |
jmitc91516 | 6:dba3fbdfd5da | 1002 | } |
jmitc91516 | 6:dba3fbdfd5da | 1003 | } |
jmitc91516 | 6:dba3fbdfd5da | 1004 | |
jmitc91516 | 6:dba3fbdfd5da | 1005 | if(structureIndex == GuiStruct_GasMethodPage_Def) { |
jmitc91516 | 6:dba3fbdfd5da | 1006 | if(getGCStatusLoop != NULL) { |
jmitc91516 | 6:dba3fbdfd5da | 1007 | getGCStatusLoop->ShowGasMethodPageScrollButtonsIfNecessary(); |
jmitc91516 | 6:dba3fbdfd5da | 1008 | } |
jmitc91516 | 6:dba3fbdfd5da | 1009 | } |
jmitc91516 | 6:dba3fbdfd5da | 1010 | |
jmitc91516 | 1:a5258871b33d | 1011 | if(structureIndex == GuiStruct_RunningPage1_7) { |
jmitc91516 | 1:a5258871b33d | 1012 | if(getGCStatusLoop != NULL) { |
jmitc91516 | 1:a5258871b33d | 1013 | getGCStatusLoop->UpdateAndDisplayRunningPage1ProgressBar(false); |
jmitc91516 | 1:a5258871b33d | 1014 | } |
jmitc91516 | 1:a5258871b33d | 1015 | } |
jmitc91516 | 1:a5258871b33d | 1016 | |
jmitc91516 | 0:47c880c1463d | 1017 | GuiLib_Refresh(); |
jmitc91516 | 0:47c880c1463d | 1018 | #define DEBUG_HERE |
jmitc91516 | 0:47c880c1463d | 1019 | #ifdef DEBUG_HERE |
jmitc91516 | 1:a5258871b33d | 1020 | char dbg2[100]; |
jmitc91516 | 1:a5258871b33d | 1021 | sprintf(dbg2, "After GuiLib_Refresh main 1"); |
jmitc91516 | 1:a5258871b33d | 1022 | EasyGUIDebugPrint(dbg2, 0, 40); |
jmitc91516 | 0:47c880c1463d | 1023 | #undef DEBUG_HERE |
jmitc91516 | 0:47c880c1463d | 1024 | #endif |
jmitc91516 | 0:47c880c1463d | 1025 | |
jmitc91516 | 0:47c880c1463d | 1026 | if(getGCStatusLoop != NULL) { |
jmitc91516 | 0:47c880c1463d | 1027 | getGCStatusLoop->SetCurrentPage(structureIndex); |
jmitc91516 | 0:47c880c1463d | 1028 | } |
jmitc91516 | 1:a5258871b33d | 1029 | } // End of "DisplayEasyGUIStructure" |
jmitc91516 | 0:47c880c1463d | 1030 | |
jmitc91516 | 1:a5258871b33d | 1031 | /* |
jmitc91516 | 1:a5258871b33d | 1032 | Draws the specified error message in a standard position (X = 90, Y = 240), |
jmitc91516 | 1:a5258871b33d | 1033 | blue text on a green background. |
jmitc91516 | 1:a5258871b33d | 1034 | |
jmitc91516 | 1:a5258871b33d | 1035 | The argument is a pointer to the (null-terminated) message text. |
jmitc91516 | 1:a5258871b33d | 1036 | */ |
jmitc91516 | 0:47c880c1463d | 1037 | void DrawErrorMessage(char *msg) |
jmitc91516 | 0:47c880c1463d | 1038 | { |
jmitc91516 | 0:47c880c1463d | 1039 | const GuiConst_INT16U fontNo = GuiFont_Helv1; |
jmitc91516 | 0:47c880c1463d | 1040 | |
jmitc91516 | 0:47c880c1463d | 1041 | GuiLib_DrawStr( |
jmitc91516 | 0:47c880c1463d | 1042 | 90, //GuiConst_INT16S X, |
jmitc91516 | 0:47c880c1463d | 1043 | 240, //GuiConst_INT16S Y, |
jmitc91516 | 0:47c880c1463d | 1044 | fontNo, //GuiConst_INT16U FontNo, |
jmitc91516 | 0:47c880c1463d | 1045 | msg, //GuiConst_TEXT PrefixLocate *String, |
jmitc91516 | 0:47c880c1463d | 1046 | GuiLib_ALIGN_LEFT, //GuiConst_INT8U Alignment, |
jmitc91516 | 0:47c880c1463d | 1047 | GuiLib_PS_ON, //GuiConst_INT8U PsWriting, |
jmitc91516 | 0:47c880c1463d | 1048 | GuiLib_TRANSPARENT_OFF, //GuiConst_INT8U Transparent, |
jmitc91516 | 0:47c880c1463d | 1049 | GuiLib_UNDERLINE_OFF, //GuiConst_INT8U Underlining, |
jmitc91516 | 0:47c880c1463d | 1050 | 0, //GuiConst_INT16S BackBoxSizeX, |
jmitc91516 | 0:47c880c1463d | 1051 | 0, //GuiConst_INT16S BackBoxSizeY1, |
jmitc91516 | 0:47c880c1463d | 1052 | 0, //GuiConst_INT16S BackBoxSizeY2, |
jmitc91516 | 0:47c880c1463d | 1053 | GuiLib_BBP_NONE, //GuiConst_INT8U BackBorderPixels, |
jmitc91516 | 0:47c880c1463d | 1054 | SixteenBitColorValue(0, 0, 0xFF), //GuiConst_INTCOLOR ForeColor, |
jmitc91516 | 0:47c880c1463d | 1055 | SixteenBitColorValue(0, 0xFF, 0) //GuiConst_INTCOLOR BackColor |
jmitc91516 | 0:47c880c1463d | 1056 | ); |
jmitc91516 | 0:47c880c1463d | 1057 | } |
jmitc91516 | 0:47c880c1463d | 1058 | |
jmitc91516 | 1:a5258871b33d | 1059 | /* |
jmitc91516 | 1:a5258871b33d | 1060 | Update the easyGUI variable that displays the command to turn the GC heat on or off, |
jmitc91516 | 1:a5258871b33d | 1061 | so that it matches the GC's current state. |
jmitc91516 | 1:a5258871b33d | 1062 | */ |
jmitc91516 | 0:47c880c1463d | 1063 | void UpdateHeatOnOffEasyGuiVariable(void) |
jmitc91516 | 0:47c880c1463d | 1064 | { |
jmitc91516 | 0:47c880c1463d | 1065 | // Note that the easyGUI variable is not the current status of the heat on the GC, |
jmitc91516 | 0:47c880c1463d | 1066 | // but the command to toggle its current state |
jmitc91516 | 0:47c880c1463d | 1067 | if(theGCHeatControl != NULL) { |
jmitc91516 | 0:47c880c1463d | 1068 | if(theGCHeatControl->IsHeatOn()) { |
jmitc91516 | 0:47c880c1463d | 1069 | strcpy(GuiVar_heatOnOffCommand, "Heat Off"); |
jmitc91516 | 0:47c880c1463d | 1070 | } else { |
jmitc91516 | 0:47c880c1463d | 1071 | strcpy(GuiVar_heatOnOffCommand, "Heat On"); |
jmitc91516 | 0:47c880c1463d | 1072 | } |
jmitc91516 | 0:47c880c1463d | 1073 | } |
jmitc91516 | 0:47c880c1463d | 1074 | } |
jmitc91516 | 0:47c880c1463d | 1075 | |
jmitc91516 | 1:a5258871b33d | 1076 | void DrawHeatOnOffButton(void) |
jmitc91516 | 0:47c880c1463d | 1077 | { |
jmitc91516 | 1:a5258871b33d | 1078 | // Note that the text on the button is not the current status of the heat on the GC, |
jmitc91516 | 1:a5258871b33d | 1079 | // but the command to toggle its current state |
jmitc91516 | 1:a5258871b33d | 1080 | GuiConst_INT8U bitmapIndex = GuiStruct_Bitmap_HeatOn; |
jmitc91516 | 1:a5258871b33d | 1081 | if(theGCHeatControl != NULL) { |
jmitc91516 | 1:a5258871b33d | 1082 | if(theGCHeatControl->IsHeatOn()) { |
jmitc91516 | 1:a5258871b33d | 1083 | bitmapIndex = GuiStruct_Bitmap_HeatOff; |
jmitc91516 | 1:a5258871b33d | 1084 | } |
jmitc91516 | 1:a5258871b33d | 1085 | } |
jmitc91516 | 0:47c880c1463d | 1086 | |
jmitc91516 | 0:47c880c1463d | 1087 | #define DEBUG_HERE |
jmitc91516 | 0:47c880c1463d | 1088 | #ifdef DEBUG_HERE |
jmitc91516 | 0:47c880c1463d | 1089 | char dbg[100]; |
jmitc91516 | 1:a5258871b33d | 1090 | sprintf(dbg, "DHOOB - bitmapIndex is %d", bitmapIndex); |
jmitc91516 | 1:a5258871b33d | 1091 | EasyGUIDebugPrint(dbg, 0, 440); |
jmitc91516 | 0:47c880c1463d | 1092 | #endif |
jmitc91516 | 0:47c880c1463d | 1093 | #undef DEBUG_HERE |
jmitc91516 | 0:47c880c1463d | 1094 | |
jmitc91516 | 1:a5258871b33d | 1095 | // Hard coded coordinates copied from easyGUI (I have not found |
jmitc91516 | 1:a5258871b33d | 1096 | // a way of getting them from the easyGUI code at runtime) |
jmitc91516 | 1:a5258871b33d | 1097 | GuiLib_ShowBitmap(bitmapIndex, 0, 404, -1); // No transparent colour |
jmitc91516 | 0:47c880c1463d | 1098 | } |
jmitc91516 | 0:47c880c1463d | 1099 | |
jmitc91516 | 1:a5258871b33d | 1100 | |
jmitc91516 | 1:a5258871b33d | 1101 | /* |
jmitc91516 | 1:a5258871b33d | 1102 | General function to pass a command to the GC, and return success or failure to the caller. |
jmitc91516 | 1:a5258871b33d | 1103 | |
jmitc91516 | 1:a5258871b33d | 1104 | Args are: the command (null-terminated string) |
jmitc91516 | 1:a5258871b33d | 1105 | a pointer to the USBHostGC instance that corresponds to the GC, |
jmitc91516 | 1:a5258871b33d | 1106 | a pointer to the USBDeviceConnected instance that (also) corresponds to the GC |
jmitc91516 | 1:a5258871b33d | 1107 | |
jmitc91516 | 1:a5258871b33d | 1108 | Returns true if the GC returned "DACK" in response, false if it returned "DNAK" |
jmitc91516 | 1:a5258871b33d | 1109 | (or "EPKT", or anything other than "DACK"). |
jmitc91516 | 1:a5258871b33d | 1110 | */ |
jmitc91516 | 1:a5258871b33d | 1111 | bool ExecuteGCCommand(char *cmd, USBDeviceConnected* usbDevice, USBHostGC* usbHostGC) |
jmitc91516 | 0:47c880c1463d | 1112 | { |
jmitc91516 | 1:a5258871b33d | 1113 | #define USE_GC_UTILS // Testing new class |
jmitc91516 | 1:a5258871b33d | 1114 | #ifdef USE_GC_UTILS |
jmitc91516 | 1:a5258871b33d | 1115 | return USBHostGCUtilities::SendCommandToGCWithDACKResponse(usbDevice, usbHostGC, cmd); |
jmitc91516 | 1:a5258871b33d | 1116 | #else |
jmitc91516 | 0:47c880c1463d | 1117 | while(usbHostGC->ExecutingSetDeviceReport()) {} |
jmitc91516 | 0:47c880c1463d | 1118 | |
jmitc91516 | 0:47c880c1463d | 1119 | char response[50]; |
jmitc91516 | 0:47c880c1463d | 1120 | usbHostGC->SetDeviceReport(usbDevice, cmd, response); |
jmitc91516 | 0:47c880c1463d | 1121 | // We expect a response like this: "DACK" for success, "DNAK" for failure |
jmitc91516 | 0:47c880c1463d | 1122 | |
jmitc91516 | 0:47c880c1463d | 1123 | #define DEBUG_HERE |
jmitc91516 | 0:47c880c1463d | 1124 | #ifdef DEBUG_HERE |
jmitc91516 | 0:47c880c1463d | 1125 | char dbg[100]; |
jmitc91516 | 0:47c880c1463d | 1126 | sprintf(dbg, "%s returned %s", cmd, response); |
jmitc91516 | 1:a5258871b33d | 1127 | EasyGUIDebugPrint(dbg, 0, 20); |
jmitc91516 | 0:47c880c1463d | 1128 | #endif |
jmitc91516 | 0:47c880c1463d | 1129 | #undef DEBUG_HERE |
jmitc91516 | 1:a5258871b33d | 1130 | |
jmitc91516 | 1:a5258871b33d | 1131 | return (response[1] == 'A'); |
jmitc91516 | 1:a5258871b33d | 1132 | #endif // USE_GC_UTILS |
jmitc91516 | 1:a5258871b33d | 1133 | } |
jmitc91516 | 1:a5258871b33d | 1134 | |
jmitc91516 | 1:a5258871b33d | 1135 | /* |
jmitc91516 | 1:a5258871b33d | 1136 | Starts the GC running, by passing it the "CRUN" command. |
jmitc91516 | 0:47c880c1463d | 1137 | |
jmitc91516 | 1:a5258871b33d | 1138 | Args are: a pointer to the USBHostGC instance that corresponds to the GC, |
jmitc91516 | 1:a5258871b33d | 1139 | a pointer to the USBDeviceConnected instance that (also) corresponds to the GC |
jmitc91516 | 1:a5258871b33d | 1140 | |
jmitc91516 | 1:a5258871b33d | 1141 | Returns true if the GC returned "DACK" in response, false if it returned "DNAK". |
jmitc91516 | 1:a5258871b33d | 1142 | */ |
jmitc91516 | 1:a5258871b33d | 1143 | bool StartGCRun(USBDeviceConnected* usbDevice, USBHostGC* usbHostGC) |
jmitc91516 | 1:a5258871b33d | 1144 | { |
jmitc91516 | 1:a5258871b33d | 1145 | return ExecuteGCCommand("CRUN", usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1146 | } |
jmitc91516 | 1:a5258871b33d | 1147 | |
jmitc91516 | 1:a5258871b33d | 1148 | /* |
jmitc91516 | 1:a5258871b33d | 1149 | Stops the GC running, by passing it the "CSTP" or "CABT" command. |
jmitc91516 | 1:a5258871b33d | 1150 | |
jmitc91516 | 1:a5258871b33d | 1151 | Args are: a pointer to the USBHostGC instance that corresponds to the GC, |
jmitc91516 | 1:a5258871b33d | 1152 | a pointer to the USBDeviceConnected instance that (also) corresponds to the GC |
jmitc91516 | 1:a5258871b33d | 1153 | |
jmitc91516 | 1:a5258871b33d | 1154 | Returns true if the GC returned "DACK" in response, false if it returned "DNAK". |
jmitc91516 | 1:a5258871b33d | 1155 | */ |
jmitc91516 | 1:a5258871b33d | 1156 | bool StopGCRun(USBDeviceConnected* usbDevice, USBHostGC* usbHostGC) |
jmitc91516 | 1:a5258871b33d | 1157 | { |
jmitc91516 | 1:a5258871b33d | 1158 | // TODO: Find out which is the correct command here |
jmitc91516 | 1:a5258871b33d | 1159 | // char *cmd = "CSTP"; |
jmitc91516 | 1:a5258871b33d | 1160 | char *cmd = "CABT"; |
jmitc91516 | 1:a5258871b33d | 1161 | return ExecuteGCCommand(cmd, usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1162 | } |
jmitc91516 | 1:a5258871b33d | 1163 | |
jmitc91516 | 1:a5258871b33d | 1164 | /* |
jmitc91516 | 1:a5258871b33d | 1165 | Takes the GC out of standby mode, by passing it the "CDIS" command. |
jmitc91516 | 1:a5258871b33d | 1166 | |
jmitc91516 | 1:a5258871b33d | 1167 | Args are: a pointer to the USBHostGC instance that corresponds to the GC, |
jmitc91516 | 1:a5258871b33d | 1168 | a pointer to the USBDeviceConnected instance that (also) corresponds to the GC |
jmitc91516 | 1:a5258871b33d | 1169 | |
jmitc91516 | 1:a5258871b33d | 1170 | Returns true if the GC returned "DACK" in response, false if it returned "DNAK". |
jmitc91516 | 1:a5258871b33d | 1171 | */ |
jmitc91516 | 1:a5258871b33d | 1172 | bool ExitGCStandbyMode(USBDeviceConnected* usbDevice, USBHostGC* usbHostGC) |
jmitc91516 | 1:a5258871b33d | 1173 | { |
jmitc91516 | 1:a5258871b33d | 1174 | if( ExecuteGCCommand("CDIS", usbDevice, usbHostGC)) { |
jmitc91516 | 1:a5258871b33d | 1175 | if(getGCStatusLoop != NULL) { |
jmitc91516 | 1:a5258871b33d | 1176 | getGCStatusLoop->ExitedGCStandbyMode(); |
jmitc91516 | 1:a5258871b33d | 1177 | } |
jmitc91516 | 1:a5258871b33d | 1178 | |
jmitc91516 | 1:a5258871b33d | 1179 | return true; |
jmitc91516 | 1:a5258871b33d | 1180 | } |
jmitc91516 | 1:a5258871b33d | 1181 | |
jmitc91516 | 1:a5258871b33d | 1182 | // 'else' |
jmitc91516 | 1:a5258871b33d | 1183 | return false; |
jmitc91516 | 0:47c880c1463d | 1184 | } |
jmitc91516 | 0:47c880c1463d | 1185 | |
jmitc91516 | 1:a5258871b33d | 1186 | /* |
jmitc91516 | 1:a5258871b33d | 1187 | Takes the GC out of its error state, by passing it the "CCLR" command. |
jmitc91516 | 1:a5258871b33d | 1188 | |
jmitc91516 | 1:a5258871b33d | 1189 | Args are: a pointer to the USBHostGC instance that corresponds to the GC, |
jmitc91516 | 1:a5258871b33d | 1190 | a pointer to the USBDeviceConnected instance that (also) corresponds to the GC |
jmitc91516 | 1:a5258871b33d | 1191 | |
jmitc91516 | 1:a5258871b33d | 1192 | Returns true if the GC returned "DACK" in response, false if it returned "DNAK". |
jmitc91516 | 1:a5258871b33d | 1193 | */ |
jmitc91516 | 1:a5258871b33d | 1194 | bool ClearGCErrors(USBDeviceConnected* usbDevice, USBHostGC* usbHostGC) |
jmitc91516 | 1:a5258871b33d | 1195 | { |
jmitc91516 | 1:a5258871b33d | 1196 | return ExecuteGCCommand("CCLR", usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1197 | } |
jmitc91516 | 1:a5258871b33d | 1198 | |
jmitc91516 | 1:a5258871b33d | 1199 | |
jmitc91516 | 1:a5258871b33d | 1200 | /* |
jmitc91516 | 1:a5258871b33d | 1201 | Opens the (column) door on the GC, by passing it the "COPN" command. |
jmitc91516 | 1:a5258871b33d | 1202 | |
jmitc91516 | 1:a5258871b33d | 1203 | Args are: a pointer to the USBHostGC instance that corresponds to the GC, |
jmitc91516 | 1:a5258871b33d | 1204 | a pointer to the USBDeviceConnected instance that (also) corresponds to the GC |
jmitc91516 | 1:a5258871b33d | 1205 | |
jmitc91516 | 1:a5258871b33d | 1206 | Returns true if the GC returned "DACK" in response, false if it returned "DNAK". |
jmitc91516 | 1:a5258871b33d | 1207 | */ |
jmitc91516 | 1:a5258871b33d | 1208 | bool OpenDoor(USBDeviceConnected* usbDevice, USBHostGC* usbHostGC) |
jmitc91516 | 1:a5258871b33d | 1209 | { |
jmitc91516 | 1:a5258871b33d | 1210 | return ExecuteGCCommand("COPN", usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1211 | } |
jmitc91516 | 1:a5258871b33d | 1212 | |
jmitc91516 | 1:a5258871b33d | 1213 | |
jmitc91516 | 1:a5258871b33d | 1214 | /* |
jmitc91516 | 1:a5258871b33d | 1215 | Set up the variable "GuiVar_doorActuatorCommandFGColour", to show - depending on |
jmitc91516 | 1:a5258871b33d | 1216 | the current state of the GC - whether the Lock/Unlock facility is enabled or not, |
jmitc91516 | 1:a5258871b33d | 1217 | by displaying the command in black (enabled) or grey (disabled). |
jmitc91516 | 1:a5258871b33d | 1218 | |
jmitc91516 | 1:a5258871b33d | 1219 | Args are: a pointer to the USBHostGC instance that corresponds to the GC, |
jmitc91516 | 1:a5258871b33d | 1220 | a pointer to the USBDeviceConnected instance that (also) corresponds to the GC |
jmitc91516 | 1:a5258871b33d | 1221 | |
jmitc91516 | 1:a5258871b33d | 1222 | No return code. |
jmitc91516 | 1:a5258871b33d | 1223 | */ |
jmitc91516 | 1:a5258871b33d | 1224 | void SetupDoorActuatorCommandColour(USBDeviceConnected* usbDevice, USBHostGC* usbHostGC, bool actuatorsAreMoving) |
jmitc91516 | 1:a5258871b33d | 1225 | { |
jmitc91516 | 1:a5258871b33d | 1226 | // We allow the user to change the state of the actuators only if the GC is in the idle or fault states, |
jmitc91516 | 1:a5258871b33d | 1227 | // and if there is no other reason why they should be disabled (e.g. we are calibrating, and the oven is hot |
jmitc91516 | 1:a5258871b33d | 1228 | // even though the heat is not on. Show this to the user by setting the text colour to black (enabled) |
jmitc91516 | 1:a5258871b33d | 1229 | // or grey (disabled) |
jmitc91516 | 1:a5258871b33d | 1230 | bool enabled = false; |
jmitc91516 | 1:a5258871b33d | 1231 | if(!actuatorsAreMoving) { |
jmitc91516 | 1:a5258871b33d | 1232 | GCStateSimplified simplifiedGCState = GCStateOrFaultCode::GetSimplifiedGCState(GetGCStatus(usbDevice, usbHostGC)); |
jmitc91516 | 1:a5258871b33d | 1233 | if((simplifiedGCState == GC_IDLE) || (simplifiedGCState == GC_FAULTED)) { |
jmitc91516 | 1:a5258871b33d | 1234 | if(canUnlockDoorActuators) { |
jmitc91516 | 1:a5258871b33d | 1235 | enabled = true; |
jmitc91516 | 1:a5258871b33d | 1236 | } |
jmitc91516 | 1:a5258871b33d | 1237 | } |
jmitc91516 | 1:a5258871b33d | 1238 | } |
jmitc91516 | 1:a5258871b33d | 1239 | // All other situations - must be disabled |
jmitc91516 | 1:a5258871b33d | 1240 | |
jmitc91516 | 1:a5258871b33d | 1241 | if(enabled) { |
jmitc91516 | 1:a5258871b33d | 1242 | GuiVar_doorActuatorCommandFGColour = 0; // Black |
jmitc91516 | 1:a5258871b33d | 1243 | } else { |
jmitc91516 | 1:a5258871b33d | 1244 | GuiVar_doorActuatorCommandFGColour = SixteenBitColorValue(192, 192, 192); // Grey - but bright enough to show up against grey button colour |
jmitc91516 | 1:a5258871b33d | 1245 | } |
jmitc91516 | 1:a5258871b33d | 1246 | } |
jmitc91516 | 1:a5258871b33d | 1247 | |
jmitc91516 | 1:a5258871b33d | 1248 | |
jmitc91516 | 1:a5258871b33d | 1249 | typedef enum enumDoorActuatorStatus { LOCKED, UNLOCKED, CLOSED_BUT_NOT_LOCKED, INTERMEDIATE, MOVING } DoorActuatorStatus; |
jmitc91516 | 1:a5258871b33d | 1250 | static bool lockingActuators; // Do not display "Release" while we are doing this |
jmitc91516 | 1:a5258871b33d | 1251 | /* |
jmitc91516 | 1:a5258871b33d | 1252 | Finds out, and returns, the status of the door actuators. |
jmitc91516 | 1:a5258871b33d | 1253 | |
jmitc91516 | 1:a5258871b33d | 1254 | Args are: a pointer to the USBHostGC instance that corresponds to the GC, |
jmitc91516 | 1:a5258871b33d | 1255 | a pointer to the USBDeviceConnected instance that (also) corresponds to the GC |
jmitc91516 | 1:a5258871b33d | 1256 | |
jmitc91516 | 1:a5258871b33d | 1257 | Returns the status, as a value in the 'DoorActuatorStatus' enumeration defined above. |
jmitc91516 | 1:a5258871b33d | 1258 | */ |
jmitc91516 | 1:a5258871b33d | 1259 | DoorActuatorStatus GetDoorActuatorStatus(USBDeviceConnected* usbDevice, USBHostGC* usbHostGC) |
jmitc91516 | 0:47c880c1463d | 1260 | { |
jmitc91516 | 0:47c880c1463d | 1261 | while(usbHostGC->ExecutingSetDeviceReport()) {} |
jmitc91516 | 0:47c880c1463d | 1262 | |
jmitc91516 | 0:47c880c1463d | 1263 | char response[50]; |
jmitc91516 | 1:a5258871b33d | 1264 | usbHostGC->SetDeviceReport(usbDevice, "QACT1004", response); |
jmitc91516 | 1:a5258871b33d | 1265 | |
jmitc91516 | 1:a5258871b33d | 1266 | |
jmitc91516 | 1:a5258871b33d | 1267 | // We expect a response of the form "DACnnnnn", where "nnnnn" is the decimal value |
jmitc91516 | 1:a5258871b33d | 1268 | // of two bytes, the most significant of which contains the states of each of the three actuators, |
jmitc91516 | 1:a5258871b33d | 1269 | // while the least significant contains the software version (which we ignore). |
jmitc91516 | 1:a5258871b33d | 1270 | |
jmitc91516 | 1:a5258871b33d | 1271 | int actuatorStatus; |
jmitc91516 | 1:a5258871b33d | 1272 | sscanf(&response[3], "%d", &actuatorStatus); |
jmitc91516 | 1:a5258871b33d | 1273 | |
jmitc91516 | 1:a5258871b33d | 1274 | if(actuatorStatus & 0x8000) { // Top bit set |
jmitc91516 | 1:a5258871b33d | 1275 | return MOVING; |
jmitc91516 | 1:a5258871b33d | 1276 | } |
jmitc91516 | 1:a5258871b33d | 1277 | |
jmitc91516 | 1:a5258871b33d | 1278 | int actuator1Status = (actuatorStatus & 0x300) >> 8; |
jmitc91516 | 1:a5258871b33d | 1279 | int actuator2Status = (actuatorStatus & 0xC00) >> 10; |
jmitc91516 | 1:a5258871b33d | 1280 | int actuator3Status = (actuatorStatus & 0x3000) >> 12; |
jmitc91516 | 1:a5258871b33d | 1281 | |
jmitc91516 | 1:a5258871b33d | 1282 | // Status 1 means locked, 2 means unlocked, 3 means closed but not locked (actuators 1 and 2 only), |
jmitc91516 | 1:a5258871b33d | 1283 | // 0 means intermediate |
jmitc91516 | 1:a5258871b33d | 1284 | if ((actuator1Status == 1) && (actuator2Status == 1) && (actuator3Status == 1)) { |
jmitc91516 | 1:a5258871b33d | 1285 | return LOCKED; |
jmitc91516 | 1:a5258871b33d | 1286 | } |
jmitc91516 | 1:a5258871b33d | 1287 | // 'else' ... |
jmitc91516 | 1:a5258871b33d | 1288 | if((actuator1Status == 2) && (actuator2Status == 2) && (actuator3Status == 2)) { |
jmitc91516 | 1:a5258871b33d | 1289 | return UNLOCKED; |
jmitc91516 | 1:a5258871b33d | 1290 | } |
jmitc91516 | 1:a5258871b33d | 1291 | // 'else' ... |
jmitc91516 | 1:a5258871b33d | 1292 | if((actuator1Status == 3) && (actuator2Status == 3) && (actuator3Status == 2)) { |
jmitc91516 | 1:a5258871b33d | 1293 | return CLOSED_BUT_NOT_LOCKED; |
jmitc91516 | 1:a5258871b33d | 1294 | } |
jmitc91516 | 1:a5258871b33d | 1295 | // 'else' ... |
jmitc91516 | 1:a5258871b33d | 1296 | return INTERMEDIATE; |
jmitc91516 | 1:a5258871b33d | 1297 | } |
jmitc91516 | 1:a5258871b33d | 1298 | |
jmitc91516 | 1:a5258871b33d | 1299 | /* |
jmitc91516 | 1:a5258871b33d | 1300 | We have now replaced the "Open Door" button with a button to toggle |
jmitc91516 | 1:a5258871b33d | 1301 | the state of the door actuators - i.e. lock them if they are unlocked |
jmitc91516 | 1:a5258871b33d | 1302 | and vice versa. We display the corresponding command in the easyGUI variable |
jmitc91516 | 1:a5258871b33d | 1303 | "GuiVar_doorActuatorCommand". This function reads the current state |
jmitc91516 | 1:a5258871b33d | 1304 | of the actuators, and sets up that variable appropriately. It also sets up |
jmitc91516 | 1:a5258871b33d | 1305 | the variable "GuiVar_doorActuatorCommandFGColour", to show - depending on |
jmitc91516 | 1:a5258871b33d | 1306 | the current state of the GC - whether the facility is enabled or not, |
jmitc91516 | 1:a5258871b33d | 1307 | by displaying the command in black (enabled) or grey (disabled). |
jmitc91516 | 1:a5258871b33d | 1308 | |
jmitc91516 | 1:a5258871b33d | 1309 | It also now - since we have a separate state for "closed but not locked" - |
jmitc91516 | 1:a5258871b33d | 1310 | displays the two "Lock" and "Release" buttons if required. |
jmitc91516 | 1:a5258871b33d | 1311 | |
jmitc91516 | 1:a5258871b33d | 1312 | Args are: a pointer to the USBHostGC instance that corresponds to the GC, |
jmitc91516 | 1:a5258871b33d | 1313 | a pointer to the USBDeviceConnected instance that (also) corresponds to the GC |
jmitc91516 | 1:a5258871b33d | 1314 | a boolean set to true before displaying the easyGUI page (GuiLib_ShowScreen), false if afterwards |
jmitc91516 | 1:a5258871b33d | 1315 | |
jmitc91516 | 1:a5258871b33d | 1316 | No return code. |
jmitc91516 | 1:a5258871b33d | 1317 | */ |
jmitc91516 | 1:a5258871b33d | 1318 | void SetupDoorActuatorCommandUserInterface(USBDeviceConnected* usbDevice, USBHostGC* usbHostGC, bool beforePageDisplay) |
jmitc91516 | 1:a5258871b33d | 1319 | { |
jmitc91516 | 1:a5258871b33d | 1320 | //#define DEBUG_PRINT_HERE |
jmitc91516 | 1:a5258871b33d | 1321 | #ifdef DEBUG_PRINT_HERE |
jmitc91516 | 1:a5258871b33d | 1322 | char buff[100]; |
jmitc91516 | 1:a5258871b33d | 1323 | sprintf(buff, "%s", beforePageDisplay ? "Before page display" : "After page display"); |
jmitc91516 | 1:a5258871b33d | 1324 | SpecialDebugPrint(buff, 150, 430); |
jmitc91516 | 1:a5258871b33d | 1325 | #endif |
jmitc91516 | 1:a5258871b33d | 1326 | |
jmitc91516 | 1:a5258871b33d | 1327 | DoorActuatorStatus doorActuatorStatus = GetDoorActuatorStatus(usbDevice, usbHostGC); |
jmitc91516 | 0:47c880c1463d | 1328 | |
jmitc91516 | 1:a5258871b33d | 1329 | // SetupDoorActuatorCommandColour(usbDevice, usbHostGC, (doorActuatorStatus == MOVING)); |
jmitc91516 | 1:a5258871b33d | 1330 | SetupDoorActuatorCommandColour(usbDevice, usbHostGC, false); |
jmitc91516 | 1:a5258871b33d | 1331 | |
jmitc91516 | 1:a5258871b33d | 1332 | if(beforePageDisplay) { |
jmitc91516 | 1:a5258871b33d | 1333 | |
jmitc91516 | 1:a5258871b33d | 1334 | // Do nothing - do not change the button text, etc - if the actuators are moving |
jmitc91516 | 1:a5258871b33d | 1335 | if(doorActuatorStatus != MOVING) { |
jmitc91516 | 1:a5258871b33d | 1336 | if(doorActuatorStatus == UNLOCKED) { |
jmitc91516 | 1:a5258871b33d | 1337 | strcpy(GuiVar_doorActuatorCommand, "Close"); |
jmitc91516 | 1:a5258871b33d | 1338 | } else if (doorActuatorStatus == LOCKED) { |
jmitc91516 | 1:a5258871b33d | 1339 | strcpy(GuiVar_doorActuatorCommand, "Unlock"); |
jmitc91516 | 1:a5258871b33d | 1340 | lockingActuators = false; |
jmitc91516 | 1:a5258871b33d | 1341 | } else { // i.e. all other states, including INTERMEDIATE (possible emergency stop) |
jmitc91516 | 1:a5258871b33d | 1342 | if(!lockingActuators) { // Do not display this while we are locking - confusing |
jmitc91516 | 1:a5258871b33d | 1343 | strcpy(GuiVar_doorActuatorCommand, "Release"); |
jmitc91516 | 1:a5258871b33d | 1344 | } |
jmitc91516 | 1:a5258871b33d | 1345 | } |
jmitc91516 | 1:a5258871b33d | 1346 | } |
jmitc91516 | 1:a5258871b33d | 1347 | } else { |
jmitc91516 | 1:a5258871b33d | 1348 | if(doorActuatorStatus == CLOSED_BUT_NOT_LOCKED) { |
jmitc91516 | 1:a5258871b33d | 1349 | GetGCStatusLoop::DisplayColumnLockAndReleaseButtons(); |
jmitc91516 | 1:a5258871b33d | 1350 | #ifdef DEBUG_PRINT_HERE |
jmitc91516 | 1:a5258871b33d | 1351 | char buff2[100]; |
jmitc91516 | 1:a5258871b33d | 1352 | sprintf(buff2, "%s", "Drawing lock and release buttons"); |
jmitc91516 | 1:a5258871b33d | 1353 | SpecialDebugPrint(buff2, 150, 460); |
jmitc91516 | 1:a5258871b33d | 1354 | #endif |
jmitc91516 | 1:a5258871b33d | 1355 | } else { // Including MOVING |
jmitc91516 | 1:a5258871b33d | 1356 | DrawBackgroundBitmapOverDoorLockAndReleaseButtons(); |
jmitc91516 | 1:a5258871b33d | 1357 | #ifdef DEBUG_PRINT_HERE |
jmitc91516 | 1:a5258871b33d | 1358 | char buff2[100]; |
jmitc91516 | 1:a5258871b33d | 1359 | sprintf(buff2, "%s", "*** NOT *** drawing lock and release buttons"); |
jmitc91516 | 1:a5258871b33d | 1360 | SpecialDebugPrint(buff2, 150, 460); |
jmitc91516 | 1:a5258871b33d | 1361 | #undef DEBUG_PRINT_HERE |
jmitc91516 | 1:a5258871b33d | 1362 | #endif |
jmitc91516 | 1:a5258871b33d | 1363 | } |
jmitc91516 | 1:a5258871b33d | 1364 | } |
jmitc91516 | 1:a5258871b33d | 1365 | } |
jmitc91516 | 1:a5258871b33d | 1366 | |
jmitc91516 | 1:a5258871b33d | 1367 | |
jmitc91516 | 1:a5258871b33d | 1368 | /* |
jmitc91516 | 1:a5258871b33d | 1369 | Tells the caller whether or not the door actuator buttons have changed, |
jmitc91516 | 1:a5258871b33d | 1370 | from the single "Close"/"Unlock" button to the two "Lock" and "Release" buttons, |
jmitc91516 | 1:a5258871b33d | 1371 | or vice versa |
jmitc91516 | 1:a5258871b33d | 1372 | */ |
jmitc91516 | 1:a5258871b33d | 1373 | bool DoorActuatorButtonsHaveChanged(USBDeviceConnected* usbDevice, USBHostGC* usbHostGC) |
jmitc91516 | 1:a5258871b33d | 1374 | { |
jmitc91516 | 1:a5258871b33d | 1375 | bool doorActuatorButtonsHaveChanged = false; |
jmitc91516 | 0:47c880c1463d | 1376 | |
jmitc91516 | 1:a5258871b33d | 1377 | static DoorActuatorStatus previousDoorActuatorStatus = INTERMEDIATE; |
jmitc91516 | 1:a5258871b33d | 1378 | |
jmitc91516 | 1:a5258871b33d | 1379 | DoorActuatorStatus doorActuatorStatus = GetDoorActuatorStatus(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1380 | |
jmitc91516 | 1:a5258871b33d | 1381 | // Do not change buttons if actuators are moving |
jmitc91516 | 1:a5258871b33d | 1382 | if(doorActuatorStatus != MOVING) { |
jmitc91516 | 1:a5258871b33d | 1383 | if((doorActuatorStatus == LOCKED) || (doorActuatorStatus == UNLOCKED)) { |
jmitc91516 | 1:a5258871b33d | 1384 | if((previousDoorActuatorStatus == CLOSED_BUT_NOT_LOCKED) || (previousDoorActuatorStatus == INTERMEDIATE)) { |
jmitc91516 | 1:a5258871b33d | 1385 | doorActuatorButtonsHaveChanged = true; |
jmitc91516 | 1:a5258871b33d | 1386 | } |
jmitc91516 | 1:a5258871b33d | 1387 | } else if (doorActuatorStatus == CLOSED_BUT_NOT_LOCKED) { |
jmitc91516 | 1:a5258871b33d | 1388 | if(previousDoorActuatorStatus != CLOSED_BUT_NOT_LOCKED) { |
jmitc91516 | 1:a5258871b33d | 1389 | doorActuatorButtonsHaveChanged = true; |
jmitc91516 | 1:a5258871b33d | 1390 | } |
jmitc91516 | 1:a5258871b33d | 1391 | } |
jmitc91516 | 1:a5258871b33d | 1392 | |
jmitc91516 | 1:a5258871b33d | 1393 | // We ignore the 'moving' state |
jmitc91516 | 1:a5258871b33d | 1394 | previousDoorActuatorStatus = doorActuatorStatus; |
jmitc91516 | 1:a5258871b33d | 1395 | } |
jmitc91516 | 1:a5258871b33d | 1396 | |
jmitc91516 | 1:a5258871b33d | 1397 | return doorActuatorButtonsHaveChanged; |
jmitc91516 | 1:a5258871b33d | 1398 | } |
jmitc91516 | 1:a5258871b33d | 1399 | |
jmitc91516 | 1:a5258871b33d | 1400 | |
jmitc91516 | 1:a5258871b33d | 1401 | /* |
jmitc91516 | 1:a5258871b33d | 1402 | Toggles the state of the door actuator on the GC - i.e. if it is locked, |
jmitc91516 | 1:a5258871b33d | 1403 | unlocks it, and vice versa. |
jmitc91516 | 1:a5258871b33d | 1404 | |
jmitc91516 | 1:a5258871b33d | 1405 | Args are: the index of the touch area the user touched (note that we assume |
jmitc91516 | 1:a5258871b33d | 1406 | this must be one of the 'door actuator areas' (seeEasyGUITouchAreaIndices.h) |
jmitc91516 | 1:a5258871b33d | 1407 | a pointer to the USBHostGC instance that corresponds to the GC, |
jmitc91516 | 1:a5258871b33d | 1408 | a pointer to the USBDeviceConnected instance that (also) corresponds to the GC |
jmitc91516 | 1:a5258871b33d | 1409 | |
jmitc91516 | 1:a5258871b33d | 1410 | Returns true if the GC executed the operation successfully, false if not |
jmitc91516 | 1:a5258871b33d | 1411 | */ |
jmitc91516 | 1:a5258871b33d | 1412 | bool DealWithDoorActuatorButtons(int touchAreaIndex, USBDeviceConnected* usbDevice, USBHostGC* usbHostGC) |
jmitc91516 | 1:a5258871b33d | 1413 | { |
jmitc91516 | 1:a5258871b33d | 1414 | // Disallow movement unless GC is in idle or faulted states |
jmitc91516 | 1:a5258871b33d | 1415 | int gcStatus = GetGCStatus(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1416 | GCStateSimplified simplifiedGCState = GCStateOrFaultCode::GetSimplifiedGCState(gcStatus); |
jmitc91516 | 1:a5258871b33d | 1417 | if((simplifiedGCState != GC_IDLE) && (simplifiedGCState != GC_FAULTED)) { |
jmitc91516 | 1:a5258871b33d | 1418 | return false; |
jmitc91516 | 0:47c880c1463d | 1419 | } |
jmitc91516 | 0:47c880c1463d | 1420 | |
jmitc91516 | 1:a5258871b33d | 1421 | bool bOK = false; |
jmitc91516 | 1:a5258871b33d | 1422 | |
jmitc91516 | 1:a5258871b33d | 1423 | DoorActuatorStatus doorActuatorStatus = GetDoorActuatorStatus(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1424 | |
jmitc91516 | 1:a5258871b33d | 1425 | if(doorActuatorStatus != MOVING) { |
jmitc91516 | 1:a5258871b33d | 1426 | if(doorActuatorStatus == UNLOCKED) { |
jmitc91516 | 1:a5258871b33d | 1427 | // Two touch areas, but only one button - treat both the same |
jmitc91516 | 1:a5258871b33d | 1428 | // Close actuator, but do not lock it |
jmitc91516 | 1:a5258871b33d | 1429 | bOK = ExecuteGCCommand("CACT1005", usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1430 | } else if (doorActuatorStatus == LOCKED) { |
jmitc91516 | 1:a5258871b33d | 1431 | // Two touch areas, but only one button - treat both the same |
jmitc91516 | 1:a5258871b33d | 1432 | // Unlock actuator |
jmitc91516 | 1:a5258871b33d | 1433 | bOK = ExecuteGCCommand("CACT1006", usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1434 | } else if (doorActuatorStatus == CLOSED_BUT_NOT_LOCKED) { |
jmitc91516 | 1:a5258871b33d | 1435 | // Unlock or Lock, depending on the touch area |
jmitc91516 | 1:a5258871b33d | 1436 | if(touchAreaIndex == DOOR_ACTUATOR_AREA_1) { |
jmitc91516 | 1:a5258871b33d | 1437 | // Lock |
jmitc91516 | 1:a5258871b33d | 1438 | bOK = ExecuteGCCommand("CACT1007", usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1439 | if(bOK) { |
jmitc91516 | 1:a5258871b33d | 1440 | lockingActuators = true; |
jmitc91516 | 1:a5258871b33d | 1441 | // Get the text ready for the Close/Unlock button |
jmitc91516 | 1:a5258871b33d | 1442 | strcpy(GuiVar_doorActuatorCommand, "Unlock"); |
jmitc91516 | 1:a5258871b33d | 1443 | } |
jmitc91516 | 1:a5258871b33d | 1444 | } else { |
jmitc91516 | 1:a5258871b33d | 1445 | // Assume DOOR_ACTUATOR_AREA_2 - release, i.e. unlock |
jmitc91516 | 1:a5258871b33d | 1446 | bOK = ExecuteGCCommand("CACT1006", usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1447 | if(bOK) { |
jmitc91516 | 1:a5258871b33d | 1448 | // Get the text ready for the Close/Unlock button |
jmitc91516 | 1:a5258871b33d | 1449 | strcpy(GuiVar_doorActuatorCommand, "Close"); |
jmitc91516 | 1:a5258871b33d | 1450 | } |
jmitc91516 | 1:a5258871b33d | 1451 | } |
jmitc91516 | 1:a5258871b33d | 1452 | } else { // Assume INTERMEDIATE - for safety, always unlock |
jmitc91516 | 1:a5258871b33d | 1453 | bOK = ExecuteGCCommand("CACT1006", usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1454 | } |
jmitc91516 | 1:a5258871b33d | 1455 | } |
jmitc91516 | 1:a5258871b33d | 1456 | |
jmitc91516 | 1:a5258871b33d | 1457 | if(bOK) { |
jmitc91516 | 1:a5258871b33d | 1458 | SetupDoorActuatorCommandUserInterface(usbDevice, usbHostGC, false); |
jmitc91516 | 1:a5258871b33d | 1459 | } |
jmitc91516 | 1:a5258871b33d | 1460 | |
jmitc91516 | 1:a5258871b33d | 1461 | return bOK; |
jmitc91516 | 1:a5258871b33d | 1462 | } |
jmitc91516 | 1:a5258871b33d | 1463 | |
jmitc91516 | 1:a5258871b33d | 1464 | |
jmitc91516 | 1:a5258871b33d | 1465 | /* |
jmitc91516 | 1:a5258871b33d | 1466 | Tells the caller whether or not a specified GC command represents the start of a method, |
jmitc91516 | 1:a5258871b33d | 1467 | and that therefore a new method is now being sent to the GC. |
jmitc91516 | 1:a5258871b33d | 1468 | |
jmitc91516 | 1:a5258871b33d | 1469 | Params: pointer to a null-terminated string containing the command in question |
jmitc91516 | 1:a5258871b33d | 1470 | |
jmitc91516 | 1:a5258871b33d | 1471 | Returns true if the command is one that occurs at the start of a method (and nowhere else), |
jmitc91516 | 1:a5258871b33d | 1472 | false if not. |
jmitc91516 | 1:a5258871b33d | 1473 | |
jmitc91516 | 1:a5258871b33d | 1474 | This code is intended to be as efficient as possible. |
jmitc91516 | 1:a5258871b33d | 1475 | |
jmitc91516 | 1:a5258871b33d | 1476 | Currently, called from GetGCStatusLoop class and EthernetThread class |
jmitc91516 | 1:a5258871b33d | 1477 | */ |
jmitc91516 | 1:a5258871b33d | 1478 | bool IsStartOfMethodCommand(char *gcCommand) |
jmitc91516 | 1:a5258871b33d | 1479 | { |
jmitc91516 | 1:a5258871b33d | 1480 | // We are looking for "CLCK" - lock local keyboard. |
jmitc91516 | 1:a5258871b33d | 1481 | // Ellution only sends this at the start of a method. |
jmitc91516 | 1:a5258871b33d | 1482 | |
jmitc91516 | 1:a5258871b33d | 1483 | if((gcCommand[0] == 'C') && (gcCommand[1] == 'L') && (gcCommand[2] == 'C') && (gcCommand[3] == 'K')) { |
jmitc91516 | 1:a5258871b33d | 1484 | return true; |
jmitc91516 | 1:a5258871b33d | 1485 | } |
jmitc91516 | 1:a5258871b33d | 1486 | |
jmitc91516 | 1:a5258871b33d | 1487 | return false; // Not "CLCK" |
jmitc91516 | 1:a5258871b33d | 1488 | } |
jmitc91516 | 1:a5258871b33d | 1489 | |
jmitc91516 | 1:a5258871b33d | 1490 | /* |
jmitc91516 | 1:a5258871b33d | 1491 | Tells the caller whether or not a specified GC command represents the end of a method, |
jmitc91516 | 1:a5258871b33d | 1492 | and that therefore a new method has just been sent to the GC. |
jmitc91516 | 1:a5258871b33d | 1493 | |
jmitc91516 | 1:a5258871b33d | 1494 | Params: pointer to a null-terminated string containing the command in question |
jmitc91516 | 1:a5258871b33d | 1495 | |
jmitc91516 | 1:a5258871b33d | 1496 | Returns true if the command is one that occurs at the end of a method (and nowhere else), |
jmitc91516 | 1:a5258871b33d | 1497 | false if not. |
jmitc91516 | 1:a5258871b33d | 1498 | |
jmitc91516 | 1:a5258871b33d | 1499 | This code is intended to be as efficient as possible. |
jmitc91516 | 1:a5258871b33d | 1500 | |
jmitc91516 | 1:a5258871b33d | 1501 | Currently, called from GetGCStatusLoop class and EthernetThread class |
jmitc91516 | 1:a5258871b33d | 1502 | */ |
jmitc91516 | 1:a5258871b33d | 1503 | bool IsEndOfMethodCommand(char *gcCommand) |
jmitc91516 | 1:a5258871b33d | 1504 | { |
jmitc91516 | 1:a5258871b33d | 1505 | // We are looking for "CULK" - unlock local keyboard. |
jmitc91516 | 1:a5258871b33d | 1506 | // Ellution only sends this at the end of a method. |
jmitc91516 | 1:a5258871b33d | 1507 | |
jmitc91516 | 1:a5258871b33d | 1508 | if((gcCommand[0] == 'C') && (gcCommand[1] == 'U') && (gcCommand[2] == 'L') && (gcCommand[3] == 'K')) { |
jmitc91516 | 1:a5258871b33d | 1509 | return true; |
jmitc91516 | 1:a5258871b33d | 1510 | } |
jmitc91516 | 1:a5258871b33d | 1511 | |
jmitc91516 | 1:a5258871b33d | 1512 | return false; // Not "CULK" |
jmitc91516 | 0:47c880c1463d | 1513 | } |
jmitc91516 | 0:47c880c1463d | 1514 | |
jmitc91516 | 1:a5258871b33d | 1515 | |
jmitc91516 | 1:a5258871b33d | 1516 | /* |
jmitc91516 | 1:a5258871b33d | 1517 | Tells the caller whether or not a specified GC command is a control command, |
jmitc91516 | 1:a5258871b33d | 1518 | which received "DACK" in acknowledgement, and is therefore likely |
jmitc91516 | 1:a5258871b33d | 1519 | to have caused the GC to change its state. |
jmitc91516 | 1:a5258871b33d | 1520 | |
jmitc91516 | 1:a5258871b33d | 1521 | Params: pointer to a null-terminated string containing the command in question |
jmitc91516 | 1:a5258871b33d | 1522 | |
jmitc91516 | 1:a5258871b33d | 1523 | Returns true if the command is a control command and if it succeeded, false if not. |
jmitc91516 | 1:a5258871b33d | 1524 | |
jmitc91516 | 1:a5258871b33d | 1525 | This code is intended to be as efficient as possible. |
jmitc91516 | 1:a5258871b33d | 1526 | |
jmitc91516 | 1:a5258871b33d | 1527 | Currently, called from GetGCStatusLoop class and EthernetThread class |
jmitc91516 | 1:a5258871b33d | 1528 | */ |
jmitc91516 | 1:a5258871b33d | 1529 | bool IsSuccessfulControlCommand(char* gcCommand, char* gcResponse) |
jmitc91516 | 1:a5258871b33d | 1530 | { |
jmitc91516 | 1:a5258871b33d | 1531 | // Simple criteria - does the command start with 'C'? |
jmitc91516 | 1:a5258871b33d | 1532 | // - was the response "DACK"? |
jmitc91516 | 1:a5258871b33d | 1533 | |
jmitc91516 | 1:a5258871b33d | 1534 | if(gcCommand[0] != 'C') { |
jmitc91516 | 1:a5258871b33d | 1535 | return false; |
jmitc91516 | 1:a5258871b33d | 1536 | } |
jmitc91516 | 1:a5258871b33d | 1537 | |
jmitc91516 | 1:a5258871b33d | 1538 | |
jmitc91516 | 1:a5258871b33d | 1539 | if(gcResponse[0] != 'D') { |
jmitc91516 | 1:a5258871b33d | 1540 | return false; |
jmitc91516 | 1:a5258871b33d | 1541 | } |
jmitc91516 | 1:a5258871b33d | 1542 | |
jmitc91516 | 1:a5258871b33d | 1543 | if(gcResponse[1] != 'A') { |
jmitc91516 | 1:a5258871b33d | 1544 | return false; |
jmitc91516 | 1:a5258871b33d | 1545 | } |
jmitc91516 | 1:a5258871b33d | 1546 | |
jmitc91516 | 1:a5258871b33d | 1547 | if(gcResponse[2] != 'C') { |
jmitc91516 | 1:a5258871b33d | 1548 | return false; |
jmitc91516 | 1:a5258871b33d | 1549 | } |
jmitc91516 | 1:a5258871b33d | 1550 | |
jmitc91516 | 1:a5258871b33d | 1551 | if(gcResponse[3] != 'K') { |
jmitc91516 | 1:a5258871b33d | 1552 | return false; |
jmitc91516 | 1:a5258871b33d | 1553 | } |
jmitc91516 | 1:a5258871b33d | 1554 | |
jmitc91516 | 1:a5258871b33d | 1555 | // All the above were true |
jmitc91516 | 1:a5258871b33d | 1556 | return true; |
jmitc91516 | 1:a5258871b33d | 1557 | } |
jmitc91516 | 1:a5258871b33d | 1558 | |
jmitc91516 | 1:a5258871b33d | 1559 | |
jmitc91516 | 1:a5258871b33d | 1560 | /* |
jmitc91516 | 1:a5258871b33d | 1561 | Increment the run count recorded in the QSPI settings. |
jmitc91516 | 1:a5258871b33d | 1562 | |
jmitc91516 | 1:a5258871b33d | 1563 | This would be called (for example) after the Run button has been pressed. |
jmitc91516 | 1:a5258871b33d | 1564 | */ |
jmitc91516 | 1:a5258871b33d | 1565 | void IncrementRunCountInQSPISettings(void) |
jmitc91516 | 0:47c880c1463d | 1566 | { |
jmitc91516 | 1:a5258871b33d | 1567 | int runCount = SettingsHandler::GetIntegerValueFromQSPISettings("RunCount", 0); |
jmitc91516 | 1:a5258871b33d | 1568 | |
jmitc91516 | 1:a5258871b33d | 1569 | // Debug prints |
jmitc91516 | 1:a5258871b33d | 1570 | char dbg[100]; |
jmitc91516 | 1:a5258871b33d | 1571 | sprintf(dbg, "Run count read: %d", runCount); |
jmitc91516 | 1:a5258871b33d | 1572 | EasyGUIDebugPrint(dbg, 500, 460); |
jmitc91516 | 1:a5258871b33d | 1573 | |
jmitc91516 | 1:a5258871b33d | 1574 | SettingsHandler::DisplayQSPIDirectory(600, 250); |
jmitc91516 | 1:a5258871b33d | 1575 | // End of debug prints |
jmitc91516 | 1:a5258871b33d | 1576 | |
jmitc91516 | 1:a5258871b33d | 1577 | ++runCount; |
jmitc91516 | 1:a5258871b33d | 1578 | |
jmitc91516 | 1:a5258871b33d | 1579 | SettingsHandler::PutIntegerValueToQSPISettings("RunCount", runCount); |
jmitc91516 | 1:a5258871b33d | 1580 | } |
jmitc91516 | 1:a5258871b33d | 1581 | |
jmitc91516 | 1:a5258871b33d | 1582 | /* |
jmitc91516 | 1:a5258871b33d | 1583 | Update the values of all the easyGUI variables whose values are derived |
jmitc91516 | 1:a5258871b33d | 1584 | from the run count. This should be called (for example) after |
jmitc91516 | 1:a5258871b33d | 1585 | the Run button has been pressed. |
jmitc91516 | 1:a5258871b33d | 1586 | */ |
jmitc91516 | 1:a5258871b33d | 1587 | void UpdateAllEasyGUIVariablesThatDependOnRunCount(void) |
jmitc91516 | 1:a5258871b33d | 1588 | { |
jmitc91516 | 1:a5258871b33d | 1589 | int runCount = SettingsHandler::GetIntegerValueFromQSPISettings("RunCount", 0); |
jmitc91516 | 1:a5258871b33d | 1590 | |
jmitc91516 | 1:a5258871b33d | 1591 | int linerChangedRunCount = SettingsHandler::GetIntegerValueFromQSPISettings("RunCountWhenLinerChanged", 0); |
jmitc91516 | 1:a5258871b33d | 1592 | sprintf(GuiVar_injectionCountSinceLinerChanged, "%d", (runCount - linerChangedRunCount)); |
jmitc91516 | 1:a5258871b33d | 1593 | |
jmitc91516 | 1:a5258871b33d | 1594 | int septaChangedRunCount = SettingsHandler::GetIntegerValueFromQSPISettings("RunCountWhenSeptaChanged", 0); |
jmitc91516 | 1:a5258871b33d | 1595 | sprintf(GuiVar_injectionCountSinceSeptaChanged, "%d", (runCount - septaChangedRunCount)); |
jmitc91516 | 1:a5258871b33d | 1596 | |
jmitc91516 | 1:a5258871b33d | 1597 | int oRingChangedRunCount = SettingsHandler::GetIntegerValueFromQSPISettings("RunCountWhenOringChanged", 0); |
jmitc91516 | 1:a5258871b33d | 1598 | sprintf(GuiVar_injectionCountSinceOringChanged, "%d", (runCount - oRingChangedRunCount)); |
jmitc91516 | 1:a5258871b33d | 1599 | } |
jmitc91516 | 1:a5258871b33d | 1600 | |
jmitc91516 | 1:a5258871b33d | 1601 | |
jmitc91516 | 1:a5258871b33d | 1602 | /* |
jmitc91516 | 1:a5258871b33d | 1603 | Sends the specified command to the GC. |
jmitc91516 | 1:a5258871b33d | 1604 | |
jmitc91516 | 1:a5258871b33d | 1605 | This must be a "Sxxx" command, that only expects "DACK" or "DNAK" back, |
jmitc91516 | 1:a5258871b33d | 1606 | not actual data. |
jmitc91516 | 1:a5258871b33d | 1607 | |
jmitc91516 | 1:a5258871b33d | 1608 | Args are: a pointer to the USBHostGC instance that corresponds to the GC, |
jmitc91516 | 1:a5258871b33d | 1609 | a pointer to the USBDeviceConnected instance that (also) corresponds to the GC |
jmitc91516 | 1:a5258871b33d | 1610 | |
jmitc91516 | 1:a5258871b33d | 1611 | Returns true if the GC returned "DACK" in response, false if it returned "DNAK". |
jmitc91516 | 1:a5258871b33d | 1612 | */ |
jmitc91516 | 1:a5258871b33d | 1613 | bool SendAnyCommandToGC(char *cmd, USBDeviceConnected* usbDevice, USBHostGC* usbHostGC) |
jmitc91516 | 1:a5258871b33d | 1614 | { |
jmitc91516 | 1:a5258871b33d | 1615 | #define USE_GC_UTILS // Testing new class |
jmitc91516 | 1:a5258871b33d | 1616 | #ifdef USE_GC_UTILS |
jmitc91516 | 1:a5258871b33d | 1617 | return USBHostGCUtilities::SendCommandToGCWithDACKResponse(usbDevice, usbHostGC, cmd); |
jmitc91516 | 1:a5258871b33d | 1618 | #else |
jmitc91516 | 0:47c880c1463d | 1619 | while(usbHostGC->ExecutingSetDeviceReport()) {} |
jmitc91516 | 0:47c880c1463d | 1620 | |
jmitc91516 | 0:47c880c1463d | 1621 | char response[50]; |
jmitc91516 | 1:a5258871b33d | 1622 | usbHostGC->SetDeviceReport(usbDevice, cmd, response); |
jmitc91516 | 0:47c880c1463d | 1623 | // We expect a response like this: "DACK" for success, "DNAK" for failure |
jmitc91516 | 0:47c880c1463d | 1624 | |
jmitc91516 | 0:47c880c1463d | 1625 | return (response[1] == 'A'); |
jmitc91516 | 1:a5258871b33d | 1626 | #endif // USE_GC_UTILS |
jmitc91516 | 1:a5258871b33d | 1627 | } |
jmitc91516 | 1:a5258871b33d | 1628 | |
jmitc91516 | 1:a5258871b33d | 1629 | |
jmitc91516 | 1:a5258871b33d | 1630 | /* |
jmitc91516 | 1:a5258871b33d | 1631 | This function performs the "set up" operations required |
jmitc91516 | 1:a5258871b33d | 1632 | when the GC starts running. It is intended to be called |
jmitc91516 | 1:a5258871b33d | 1633 | whenever the GC starts running - note that this may happen |
jmitc91516 | 1:a5258871b33d | 1634 | not only when the user presses our "Run" button, but if |
jmitc91516 | 1:a5258871b33d | 1635 | he sends a "CRUN" command to the GC from the PC (e.g. using |
jmitc91516 | 1:a5258871b33d | 1636 | Ellution), or if something triggers the "Run" pin |
jmitc91516 | 1:a5258871b33d | 1637 | on the GC board itself (and that does not pass through |
jmitc91516 | 1:a5258871b33d | 1638 | the LPC4088, so it cannot be detected directly by this software). |
jmitc91516 | 1:a5258871b33d | 1639 | |
jmitc91516 | 1:a5258871b33d | 1640 | Args are: a pointer to the USBHostGC instance that corresponds to the GC, |
jmitc91516 | 1:a5258871b33d | 1641 | a pointer to the USBDeviceConnected instance that (also) corresponds to the GC |
jmitc91516 | 1:a5258871b33d | 1642 | |
jmitc91516 | 1:a5258871b33d | 1643 | No return code |
jmitc91516 | 1:a5258871b33d | 1644 | */ |
jmitc91516 | 1:a5258871b33d | 1645 | void SetupForStartOfRun(USBDeviceConnected* usbDevice, USBHostGC* usbHostGC) |
jmitc91516 | 1:a5258871b33d | 1646 | { |
jmitc91516 | 1:a5258871b33d | 1647 | if(getGCStatusLoop != NULL) { |
jmitc91516 | 1:a5258871b33d | 1648 | getGCStatusLoop->SetGCIsRunning(); |
jmitc91516 | 1:a5258871b33d | 1649 | IncrementRunCountInQSPISettings(); |
jmitc91516 | 1:a5258871b33d | 1650 | UpdateAllEasyGUIVariablesThatDependOnRunCount(); |
jmitc91516 | 1:a5258871b33d | 1651 | getGCStatusLoop->UpdateGCMethodRunningProfiles(); |
jmitc91516 | 1:a5258871b33d | 1652 | getGCStatusLoop->SetRunningPage1ProgressBarToZero(); |
jmitc91516 | 1:a5258871b33d | 1653 | getGCStatusLoop->SetupTemperatureWhileRunningEasyGUIVariables(); |
jmitc91516 | 1:a5258871b33d | 1654 | DisplayEasyGuiStructure(GuiStruct_RunningPage1_7, usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1655 | } |
jmitc91516 | 0:47c880c1463d | 1656 | } |
jmitc91516 | 0:47c880c1463d | 1657 | |
jmitc91516 | 1:a5258871b33d | 1658 | |
jmitc91516 | 6:dba3fbdfd5da | 1659 | static void RemoveUnitsFromEasyGUIStringIfFound(char* destination, GuiConst_TEXT* easyGUIString, const char* units) |
jmitc91516 | 1:a5258871b33d | 1660 | { |
jmitc91516 | 1:a5258871b33d | 1661 | strcpy(destination, easyGUIString); |
jmitc91516 | 1:a5258871b33d | 1662 | |
jmitc91516 | 1:a5258871b33d | 1663 | int unitsLength = strlen(units); |
jmitc91516 | 1:a5258871b33d | 1664 | int stringLength = strlen(destination); |
jmitc91516 | 1:a5258871b33d | 1665 | |
jmitc91516 | 1:a5258871b33d | 1666 | if(strcmp(units, &destination[stringLength - unitsLength]) == 0) { |
jmitc91516 | 1:a5258871b33d | 1667 | destination[stringLength - unitsLength] = '\0'; |
jmitc91516 | 1:a5258871b33d | 1668 | } |
jmitc91516 | 1:a5258871b33d | 1669 | } |
jmitc91516 | 1:a5258871b33d | 1670 | |
jmitc91516 | 1:a5258871b33d | 1671 | |
jmitc91516 | 1:a5258871b33d | 1672 | /* |
jmitc91516 | 1:a5258871b33d | 1673 | This is the main function dealing with user interaction via the LPC4088 touch panel. |
jmitc91516 | 1:a5258871b33d | 1674 | ************************************************************************************ |
jmitc91516 | 1:a5258871b33d | 1675 | |
jmitc91516 | 1:a5258871b33d | 1676 | It is (currently, until we rationalise this code) called by the GetGCStatusLoop code |
jmitc91516 | 1:a5258871b33d | 1677 | that deals with touch events. (Ideally, we should move it into the GetGCStatusLoop class |
jmitc91516 | 1:a5258871b33d | 1678 | at some point.) |
jmitc91516 | 1:a5258871b33d | 1679 | |
jmitc91516 | 1:a5258871b33d | 1680 | Args are: the touch coordinates (x, y and z - we do not use the z coordinate) |
jmitc91516 | 1:a5258871b33d | 1681 | a pointer to the USBHostGC instance that corresponds to the GC, |
jmitc91516 | 1:a5258871b33d | 1682 | a pointer to the USBDeviceConnected instance that (also) corresponds to the GC |
jmitc91516 | 1:a5258871b33d | 1683 | a count of timer ticks |
jmitc91516 | 1:a5258871b33d | 1684 | a boolean set to true if the touch is 'new', false if not (a touch is 'new' |
jmitc91516 | 1:a5258871b33d | 1685 | if it occurs after a period when the user appears not to have touched the screen). |
jmitc91516 | 1:a5258871b33d | 1686 | |
jmitc91516 | 1:a5258871b33d | 1687 | Looks to see if the user has touched a defined easyGUI touch area, and responds accordingly. |
jmitc91516 | 1:a5258871b33d | 1688 | |
jmitc91516 | 1:a5258871b33d | 1689 | No return code. |
jmitc91516 | 1:a5258871b33d | 1690 | |
jmitc91516 | 1:a5258871b33d | 1691 | See EasyGUITouchAreaIndices.h for the touch area index values. |
jmitc91516 | 1:a5258871b33d | 1692 | */ |
jmitc91516 | 0:47c880c1463d | 1693 | void TouchCallback(touch_coordinate_t touchCoords, USBDeviceConnected* usbDevice, USBHostGC* usbHostGC, int tickCount, bool newTouch) |
jmitc91516 | 0:47c880c1463d | 1694 | { |
jmitc91516 | 1:a5258871b33d | 1695 | EasyGUIDebugPrintWithCounter("TouchCallback 0 ", 500, 440); |
jmitc91516 | 1:a5258871b33d | 1696 | |
jmitc91516 | 0:47c880c1463d | 1697 | GuiConst_INT32S touchAreaIndex = GuiLib_TouchCheck((GuiConst_INT16S)touchCoords.x, (GuiConst_INT16S)touchCoords.y); |
jmitc91516 | 0:47c880c1463d | 1698 | |
jmitc91516 | 1:a5258871b33d | 1699 | EasyGUIDebugPrintWithCounter("TouchCallback 1 ", 500, 440); |
jmitc91516 | 1:a5258871b33d | 1700 | |
jmitc91516 | 0:47c880c1463d | 1701 | if(touchAreaIndex >= 0) { |
jmitc91516 | 1:a5258871b33d | 1702 | |
jmitc91516 | 1:a5258871b33d | 1703 | //#define ALLOW_DEBUG_PRINTS_HERE |
jmitc91516 | 1:a5258871b33d | 1704 | #ifdef ALLOW_DEBUG_PRINTS_HERE |
jmitc91516 | 1:a5258871b33d | 1705 | char buff[300]; |
jmitc91516 | 1:a5258871b33d | 1706 | sprintf(buff, "tAI: %d", touchAreaIndex); |
jmitc91516 | 1:a5258871b33d | 1707 | SpecialDebugPrint(buff, 150, 410); |
jmitc91516 | 1:a5258871b33d | 1708 | #undef ALLOW_DEBUG_PRINTS_HERE |
jmitc91516 | 1:a5258871b33d | 1709 | #endif // ALLOW_DEBUG_PRINTS_HERE |
jmitc91516 | 1:a5258871b33d | 1710 | |
jmitc91516 | 0:47c880c1463d | 1711 | bool dealtWithTouch = false; |
jmitc91516 | 0:47c880c1463d | 1712 | |
jmitc91516 | 0:47c880c1463d | 1713 | // page selector? |
jmitc91516 | 0:47c880c1463d | 1714 | TouchPanelPageSelector* touchPanelPageSelector = touchPanelPageSelectors.GetTouchPanelPageSelector(touchAreaIndex); |
jmitc91516 | 0:47c880c1463d | 1715 | |
jmitc91516 | 0:47c880c1463d | 1716 | if( touchPanelPageSelector != NULL) { |
jmitc91516 | 1:a5258871b33d | 1717 | |
jmitc91516 | 1:a5258871b33d | 1718 | // User has touched a page selector |
jmitc91516 | 1:a5258871b33d | 1719 | // ******************************** |
jmitc91516 | 1:a5258871b33d | 1720 | |
jmitc91516 | 0:47c880c1463d | 1721 | // Do not keep switching pages if the user keeps 'touching' - |
jmitc91516 | 0:47c880c1463d | 1722 | // switch only if he 'lets go', then presses again |
jmitc91516 | 0:47c880c1463d | 1723 | if(newTouch) { |
jmitc91516 | 1:a5258871b33d | 1724 | |
jmitc91516 | 1:a5258871b33d | 1725 | // Depending on the touch area, we may need to do extra stuff here |
jmitc91516 | 1:a5258871b33d | 1726 | // before displaying the appropriate page |
jmitc91516 | 0:47c880c1463d | 1727 | |
jmitc91516 | 1:a5258871b33d | 1728 | if(touchAreaIndex == GAS_SAVER_RETURN_TO_READY) { |
jmitc91516 | 0:47c880c1463d | 1729 | // Take GC out of standby mode |
jmitc91516 | 0:47c880c1463d | 1730 | ExitGCStandbyMode(usbDevice, usbHostGC); |
jmitc91516 | 0:47c880c1463d | 1731 | } |
jmitc91516 | 0:47c880c1463d | 1732 | |
jmitc91516 | 1:a5258871b33d | 1733 | if(touchAreaIndex == CLEAR_ERRORS_BUTTON) { |
jmitc91516 | 0:47c880c1463d | 1734 | // Take GC out of error state |
jmitc91516 | 0:47c880c1463d | 1735 | ClearGCErrors(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1736 | |
jmitc91516 | 1:a5258871b33d | 1737 | // Make sure the component status rectangles change colour immediately, |
jmitc91516 | 1:a5258871b33d | 1738 | // not after ~10 seconds |
jmitc91516 | 1:a5258871b33d | 1739 | if(getGCStatusLoop != NULL) { |
jmitc91516 | 1:a5258871b33d | 1740 | getGCStatusLoop->UpdateHomePageGCComponentStatusColorAreas(); |
jmitc91516 | 1:a5258871b33d | 1741 | |
jmitc91516 | 1:a5258871b33d | 1742 | getGCStatusLoop->UpdateSingleGCComponentPageStatusColorArea(COLUMN); |
jmitc91516 | 1:a5258871b33d | 1743 | getGCStatusLoop->UpdateSingleGCComponentPageStatusColorArea(INJECTOR); |
jmitc91516 | 1:a5258871b33d | 1744 | getGCStatusLoop->UpdateSingleGCComponentPageStatusColorArea(DETECTOR); |
jmitc91516 | 1:a5258871b33d | 1745 | getGCStatusLoop->UpdateSingleGCComponentPageStatusColorArea(GAS); |
jmitc91516 | 1:a5258871b33d | 1746 | } |
jmitc91516 | 0:47c880c1463d | 1747 | } |
jmitc91516 | 0:47c880c1463d | 1748 | |
jmitc91516 | 1:a5258871b33d | 1749 | if(touchAreaIndex == ABORT_RUN_YES) { |
jmitc91516 | 1:a5258871b33d | 1750 | |
jmitc91516 | 1:a5258871b33d | 1751 | // Abort Run request confirmed |
jmitc91516 | 1:a5258871b33d | 1752 | |
jmitc91516 | 1:a5258871b33d | 1753 | //#define DEBUG_PRINT_ON_FAILURE |
jmitc91516 | 1:a5258871b33d | 1754 | #ifdef DEBUG_PRINT_ON_FAILURE |
jmitc91516 | 1:a5258871b33d | 1755 | if(!StopGCRun(usbDevice, usbHostGC)) { |
jmitc91516 | 1:a5258871b33d | 1756 | SpecialDebugPrint("*** StopGCRun failed ***", 150, 430); |
jmitc91516 | 1:a5258871b33d | 1757 | } |
jmitc91516 | 1:a5258871b33d | 1758 | #undef DEBUG_PRINT_ON_FAILURE |
jmitc91516 | 1:a5258871b33d | 1759 | #else |
jmitc91516 | 1:a5258871b33d | 1760 | StopGCRun(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1761 | #endif // DEBUG_PRINT_ON_FAILURE |
jmitc91516 | 1:a5258871b33d | 1762 | |
jmitc91516 | 1:a5258871b33d | 1763 | getGCStatusLoop->ClearGCIsRunning(); |
jmitc91516 | 1:a5258871b33d | 1764 | |
jmitc91516 | 1:a5258871b33d | 1765 | #ifdef SERVICE_INTERVALS_ACTIVE |
jmitc91516 | 1:a5258871b33d | 1766 | ServiceInterval::TellAllServiceIntervalsInstrumentHasCycled(); |
jmitc91516 | 1:a5258871b33d | 1767 | #endif // SERVICE_INTERVALS_ACTIVE |
jmitc91516 | 1:a5258871b33d | 1768 | |
jmitc91516 | 1:a5258871b33d | 1769 | #ifdef TURN_HEAT_OFF_ON_ABORT |
jmitc91516 | 1:a5258871b33d | 1770 | // Turn heat off |
jmitc91516 | 1:a5258871b33d | 1771 | if(heatOnOffAvailable) { |
jmitc91516 | 1:a5258871b33d | 1772 | if(theGCHeatControl != NULL) { |
jmitc91516 | 1:a5258871b33d | 1773 | if(theGCHeatControl->IsHeatOn()) { |
jmitc91516 | 1:a5258871b33d | 1774 | theGCHeatControl->TurnHeatOff(); |
jmitc91516 | 1:a5258871b33d | 1775 | #ifdef USE_HEAT_ONOFF_BUTTON_BITMAPS |
jmitc91516 | 1:a5258871b33d | 1776 | DrawHeatOnOffButton(); |
jmitc91516 | 1:a5258871b33d | 1777 | #else |
jmitc91516 | 1:a5258871b33d | 1778 | UpdateHeatOnOffEasyGuiVariable(); |
jmitc91516 | 1:a5258871b33d | 1779 | #endif // USE_HEAT_ONOFF_BUTTON_BITMAPS |
jmitc91516 | 1:a5258871b33d | 1780 | } |
jmitc91516 | 1:a5258871b33d | 1781 | |
jmitc91516 | 1:a5258871b33d | 1782 | StartHeatOnOffTimeout(); |
jmitc91516 | 1:a5258871b33d | 1783 | } |
jmitc91516 | 1:a5258871b33d | 1784 | } |
jmitc91516 | 1:a5258871b33d | 1785 | #endif // TURN_HEAT_OFF_ON_ABORT |
jmitc91516 | 1:a5258871b33d | 1786 | } |
jmitc91516 | 1:a5258871b33d | 1787 | |
jmitc91516 | 1:a5258871b33d | 1788 | if(touchAreaIndex == SETTINGS_TO_NETWORK_PARAMS_BUTTON) { |
jmitc91516 | 1:a5258871b33d | 1789 | // We are about to display the Network Parameters page - so tell the class |
jmitc91516 | 1:a5258871b33d | 1790 | // to display the real IP address, etc - i.e. the values we are actually using |
jmitc91516 | 1:a5258871b33d | 1791 | NetworkParameters *networkParameters = NetworkParameters::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1792 | if(networkParameters != NULL) { |
jmitc91516 | 1:a5258871b33d | 1793 | networkParameters->RestoreRealValues(); |
jmitc91516 | 1:a5258871b33d | 1794 | } |
jmitc91516 | 1:a5258871b33d | 1795 | } |
jmitc91516 | 1:a5258871b33d | 1796 | |
jmitc91516 | 1:a5258871b33d | 1797 | if(touchAreaIndex == SETTINGS_TO_SERVICING_PAGE_BUTTON) { |
jmitc91516 | 1:a5258871b33d | 1798 | strcpy(GuiVar_engineersLockCodeMessage, "No lock code entered"); |
jmitc91516 | 1:a5258871b33d | 1799 | } |
jmitc91516 | 1:a5258871b33d | 1800 | |
jmitc91516 | 1:a5258871b33d | 1801 | if(touchAreaIndex == SERVICING_PAGE_GC_CMDS_BUTTON ) { |
jmitc91516 | 1:a5258871b33d | 1802 | // Clear the easyGUI variables that display the command and the response |
jmitc91516 | 1:a5258871b33d | 1803 | GuiVar_debugCommandTx[0] = '\0'; |
jmitc91516 | 1:a5258871b33d | 1804 | GuiVar_debugCommandRx[0] = '\0'; |
jmitc91516 | 1:a5258871b33d | 1805 | } |
jmitc91516 | 1:a5258871b33d | 1806 | |
jmitc91516 | 1:a5258871b33d | 1807 | if(touchPanelPageSelector->CanChangePage()) { |
jmitc91516 | 1:a5258871b33d | 1808 | DisplayEasyGuiStructure(touchPanelPageSelector->GetPageNumber(usbDevice, usbHostGC), usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1809 | } |
jmitc91516 | 0:47c880c1463d | 1810 | } |
jmitc91516 | 1:a5258871b33d | 1811 | |
jmitc91516 | 0:47c880c1463d | 1812 | dealtWithTouch = true; // The user touched a page selector, so we have still 'dealt' with this, |
jmitc91516 | 0:47c880c1463d | 1813 | // whether we had a 'new touch' or not |
jmitc91516 | 1:a5258871b33d | 1814 | } // TouchPanelPageSelector |
jmitc91516 | 0:47c880c1463d | 1815 | |
jmitc91516 | 0:47c880c1463d | 1816 | if(!dealtWithTouch) { |
jmitc91516 | 1:a5258871b33d | 1817 | |
jmitc91516 | 1:a5258871b33d | 1818 | if(touchAreaIndex == RUN_BUTTON) { |
jmitc91516 | 0:47c880c1463d | 1819 | if(newTouch) { // As above - do not do this repeatedly - GC does not like it... |
jmitc91516 | 1:a5258871b33d | 1820 | |
jmitc91516 | 1:a5258871b33d | 1821 | EasyGUIDebugPrintWithCounter("TouchCallback 4.1 ", 500, 440); |
jmitc91516 | 1:a5258871b33d | 1822 | |
jmitc91516 | 0:47c880c1463d | 1823 | if(GCIsReadyToRun(usbDevice, usbHostGC)) { |
jmitc91516 | 1:a5258871b33d | 1824 | // Start run - if this works, display the 'Run' page, etc, else do nothing |
jmitc91516 | 0:47c880c1463d | 1825 | if(StartGCRun(usbDevice, usbHostGC)) { |
jmitc91516 | 1:a5258871b33d | 1826 | SetupForStartOfRun(usbDevice, usbHostGC); |
jmitc91516 | 0:47c880c1463d | 1827 | } else { |
jmitc91516 | 0:47c880c1463d | 1828 | DrawErrorMessage("*** Run failed to start ***"); |
jmitc91516 | 0:47c880c1463d | 1829 | |
jmitc91516 | 0:47c880c1463d | 1830 | // Give user time to read error, then erase it |
jmitc91516 | 0:47c880c1463d | 1831 | Thread::wait(2000); |
jmitc91516 | 0:47c880c1463d | 1832 | |
jmitc91516 | 0:47c880c1463d | 1833 | DisplayEasyGuiStructure(GuiStruct_HomePage_1, usbDevice, usbHostGC); |
jmitc91516 | 0:47c880c1463d | 1834 | } |
jmitc91516 | 1:a5258871b33d | 1835 | } else { |
jmitc91516 | 1:a5258871b33d | 1836 | // GC is not ready to run - tell the user why |
jmitc91516 | 1:a5258871b33d | 1837 | getGCStatusLoop->SetupGCNotReadyStateEasyGUIVariable(); |
jmitc91516 | 1:a5258871b33d | 1838 | |
jmitc91516 | 1:a5258871b33d | 1839 | DisplayEasyGuiStructure(GuiStruct_GCNotReadyToRunPage_Def, usbDevice, usbHostGC); |
jmitc91516 | 0:47c880c1463d | 1840 | } |
jmitc91516 | 0:47c880c1463d | 1841 | } |
jmitc91516 | 0:47c880c1463d | 1842 | |
jmitc91516 | 0:47c880c1463d | 1843 | dealtWithTouch = true; |
jmitc91516 | 0:47c880c1463d | 1844 | } |
jmitc91516 | 1:a5258871b33d | 1845 | } // Run button |
jmitc91516 | 0:47c880c1463d | 1846 | |
jmitc91516 | 0:47c880c1463d | 1847 | if(!dealtWithTouch) { |
jmitc91516 | 1:a5258871b33d | 1848 | |
jmitc91516 | 1:a5258871b33d | 1849 | if(touchAreaIndex == HEAT_ON_BUTTON) { // Heat on/off button |
jmitc91516 | 0:47c880c1463d | 1850 | if(newTouch) { // As above - do not do this repeatedly - GC does not like it... |
jmitc91516 | 0:47c880c1463d | 1851 | if(heatOnOffAvailable) { |
jmitc91516 | 0:47c880c1463d | 1852 | if(theGCHeatControl != NULL) { |
jmitc91516 | 0:47c880c1463d | 1853 | if(theGCHeatControl->IsHeatOn()) { |
jmitc91516 | 0:47c880c1463d | 1854 | theGCHeatControl->TurnHeatOff(); |
jmitc91516 | 0:47c880c1463d | 1855 | } else { |
jmitc91516 | 0:47c880c1463d | 1856 | theGCHeatControl->TurnHeatOn(); |
jmitc91516 | 0:47c880c1463d | 1857 | } |
jmitc91516 | 1:a5258871b33d | 1858 | #ifdef USE_HEAT_ONOFF_BUTTON_BITMAPS |
jmitc91516 | 1:a5258871b33d | 1859 | // If we do not do this first, we do not see the bitmap change on the button |
jmitc91516 | 1:a5258871b33d | 1860 | // (I don't understand why...) |
jmitc91516 | 1:a5258871b33d | 1861 | DisplayEasyGuiStructure(GuiStruct_HomePage_1, usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1862 | DrawHeatOnOffButton(); |
jmitc91516 | 1:a5258871b33d | 1863 | #else |
jmitc91516 | 0:47c880c1463d | 1864 | UpdateHeatOnOffEasyGuiVariable(); |
jmitc91516 | 0:47c880c1463d | 1865 | // Make GuiVar_heatOnOffCommand update visible on screen |
jmitc91516 | 0:47c880c1463d | 1866 | DisplayEasyGuiStructure(GuiStruct_HomePage_1, usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1867 | #endif // USE_HEAT_ONOFF_BUTTON_BITMAPS |
jmitc91516 | 0:47c880c1463d | 1868 | |
jmitc91516 | 0:47c880c1463d | 1869 | StartHeatOnOffTimeout(); |
jmitc91516 | 1:a5258871b33d | 1870 | |
jmitc91516 | 1:a5258871b33d | 1871 | // Update the door lock/unlock command colour |
jmitc91516 | 1:a5258871b33d | 1872 | // *before* we display the column page(s) |
jmitc91516 | 1:a5258871b33d | 1873 | SetupDoorActuatorCommandColour(usbDevice, usbHostGC, false); |
jmitc91516 | 0:47c880c1463d | 1874 | } |
jmitc91516 | 0:47c880c1463d | 1875 | } |
jmitc91516 | 0:47c880c1463d | 1876 | } |
jmitc91516 | 0:47c880c1463d | 1877 | |
jmitc91516 | 0:47c880c1463d | 1878 | // Whether we changed the heat or not, the user still 'touched' our area, |
jmitc91516 | 0:47c880c1463d | 1879 | // so no-one else should try and deal with this touch |
jmitc91516 | 0:47c880c1463d | 1880 | dealtWithTouch = true; |
jmitc91516 | 0:47c880c1463d | 1881 | } |
jmitc91516 | 1:a5258871b33d | 1882 | } // Heat ON/Off button |
jmitc91516 | 1:a5258871b33d | 1883 | |
jmitc91516 | 1:a5258871b33d | 1884 | if(!dealtWithTouch) { |
jmitc91516 | 1:a5258871b33d | 1885 | |
jmitc91516 | 1:a5258871b33d | 1886 | if((touchAreaIndex == COLUMN_PAGE1_EDIT_COLUMN_MAX_TEMP) || |
jmitc91516 | 4:6840cf2b153a | 1887 | (touchAreaIndex == COLUMN_DH_PAGE1_EDIT_COLUMN_MAX_TEMP) || |
jmitc91516 | 4:6840cf2b153a | 1888 | (touchAreaIndex == COLUMN_PAGE2_EDIT_COLUMN_MAX_TEMP)) { |
jmitc91516 | 1:a5258871b33d | 1889 | |
jmitc91516 | 1:a5258871b33d | 1890 | NumericKeypadPageHandler* numericKeypadPageHandler = NumericKeypadPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1891 | if(numericKeypadPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 1892 | |
jmitc91516 | 6:dba3fbdfd5da | 1893 | // Remove units from the initial value to be displayed in the keypad |
jmitc91516 | 1:a5258871b33d | 1894 | char temp[50]; |
jmitc91516 | 6:dba3fbdfd5da | 1895 | RemoveUnitsFromEasyGUIStringIfFound(temp, GuiVar_columnMaxTemp2, GetGCStatusLoop::GetDegCUnitsWithSpace()); |
jmitc91516 | 4:6840cf2b153a | 1896 | int easyGUICallingPage = GuiStruct_ColumnPage1_2; |
jmitc91516 | 5:aceac1035d71 | 1897 | if (touchAreaIndex == COLUMN_PAGE2_EDIT_COLUMN_MAX_TEMP) { |
jmitc91516 | 4:6840cf2b153a | 1898 | easyGUICallingPage = GuiStruct_ColumnPage2_9; |
jmitc91516 | 4:6840cf2b153a | 1899 | } |
jmitc91516 | 4:6840cf2b153a | 1900 | |
jmitc91516 | 1:a5258871b33d | 1901 | numericKeypadPageHandler->StartEditing(temp); |
jmitc91516 | 1:a5258871b33d | 1902 | numericKeypadPageHandler->SetEasyGUIVariableToEdit(GuiVar_columnMaxTemp2); |
jmitc91516 | 4:6840cf2b153a | 1903 | numericKeypadPageHandler->SetEasyGUICallingPage(easyGUICallingPage); |
jmitc91516 | 1:a5258871b33d | 1904 | numericKeypadPageHandler->SetEditVariableRange(0, 500); |
jmitc91516 | 1:a5258871b33d | 1905 | numericKeypadPageHandler->SetEditVariableName("Col. Max Temp"); |
jmitc91516 | 6:dba3fbdfd5da | 1906 | numericKeypadPageHandler->SetEditVariableUnits(GetGCStatusLoop::GetDegCUnitsWithoutSpace()); |
jmitc91516 | 1:a5258871b33d | 1907 | numericKeypadPageHandler->SetApplyFunctionPtr(&SetColumnMaxTempFromEasyGuiVariable); |
jmitc91516 | 1:a5258871b33d | 1908 | numericKeypadPageHandler->DisplayEasyGUIPage(); |
jmitc91516 | 1:a5258871b33d | 1909 | } |
jmitc91516 | 1:a5258871b33d | 1910 | |
jmitc91516 | 1:a5258871b33d | 1911 | dealtWithTouch = true; |
jmitc91516 | 1:a5258871b33d | 1912 | } |
jmitc91516 | 0:47c880c1463d | 1913 | } |
jmitc91516 | 1:a5258871b33d | 1914 | |
jmitc91516 | 1:a5258871b33d | 1915 | if(!dealtWithTouch) { |
jmitc91516 | 1:a5258871b33d | 1916 | |
jmitc91516 | 1:a5258871b33d | 1917 | if(touchAreaIndex == ENTER_ENGINEERS_LOCK_CODE) { |
jmitc91516 | 1:a5258871b33d | 1918 | |
jmitc91516 | 1:a5258871b33d | 1919 | NumericKeypadPageHandler* numericKeypadPageHandler = NumericKeypadPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1920 | if(numericKeypadPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 1921 | numericKeypadPageHandler->StartEditingInLockMode(842, GuiStruct_ServicingHomePage_Def, GuiVar_engineersLockCodeMessage, "Invalid lock code"); |
jmitc91516 | 1:a5258871b33d | 1922 | numericKeypadPageHandler->SetEasyGUICallingPage(GuiStruct_EngineersLockPage_Def); |
jmitc91516 | 1:a5258871b33d | 1923 | numericKeypadPageHandler->SetEditVariableRange(0, 32767); |
jmitc91516 | 1:a5258871b33d | 1924 | numericKeypadPageHandler->SetEditVariableName("Lock Code"); |
jmitc91516 | 1:a5258871b33d | 1925 | numericKeypadPageHandler->DisplayEasyGUIPage(); |
jmitc91516 | 1:a5258871b33d | 1926 | } |
jmitc91516 | 1:a5258871b33d | 1927 | |
jmitc91516 | 1:a5258871b33d | 1928 | dealtWithTouch = true; |
jmitc91516 | 1:a5258871b33d | 1929 | } |
jmitc91516 | 1:a5258871b33d | 1930 | } |
jmitc91516 | 1:a5258871b33d | 1931 | |
jmitc91516 | 1:a5258871b33d | 1932 | if(!dealtWithTouch) { |
jmitc91516 | 1:a5258871b33d | 1933 | |
jmitc91516 | 1:a5258871b33d | 1934 | if((touchAreaIndex == DOOR_ACTUATOR_AREA_1) || (touchAreaIndex == DOOR_ACTUATOR_AREA_2)) { |
jmitc91516 | 1:a5258871b33d | 1935 | DealWithDoorActuatorButtons(touchAreaIndex, usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1936 | |
jmitc91516 | 1:a5258871b33d | 1937 | dealtWithTouch = true; |
jmitc91516 | 1:a5258871b33d | 1938 | } |
jmitc91516 | 1:a5258871b33d | 1939 | } // Open door |
jmitc91516 | 1:a5258871b33d | 1940 | |
jmitc91516 | 1:a5258871b33d | 1941 | if(!dealtWithTouch) { |
jmitc91516 | 1:a5258871b33d | 1942 | NetworkParameters *networkParameters = NetworkParameters::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1943 | |
jmitc91516 | 1:a5258871b33d | 1944 | if(networkParameters != NULL) { |
jmitc91516 | 1:a5258871b33d | 1945 | |
jmitc91516 | 1:a5258871b33d | 1946 | if(networkParameters->TouchAreaIsNetworkParameter(touchAreaIndex)) { |
jmitc91516 | 1:a5258871b33d | 1947 | |
jmitc91516 | 1:a5258871b33d | 1948 | networkParameters->DealWithTouch(touchAreaIndex); |
jmitc91516 | 1:a5258871b33d | 1949 | |
jmitc91516 | 1:a5258871b33d | 1950 | dealtWithTouch = true; |
jmitc91516 | 1:a5258871b33d | 1951 | } |
jmitc91516 | 1:a5258871b33d | 1952 | } |
jmitc91516 | 1:a5258871b33d | 1953 | } // Network parameter |
jmitc91516 | 1:a5258871b33d | 1954 | |
jmitc91516 | 1:a5258871b33d | 1955 | #define USE_GAS_CALIBRATION_PAGE_HANDLER |
jmitc91516 | 1:a5258871b33d | 1956 | #ifdef USE_GAS_CALIBRATION_PAGE_HANDLER |
jmitc91516 | 1:a5258871b33d | 1957 | if(!dealtWithTouch) { |
jmitc91516 | 1:a5258871b33d | 1958 | GasCalibrationPageHandler *gasCalibrationPageHandler = GasCalibrationPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1959 | |
jmitc91516 | 1:a5258871b33d | 1960 | if(gasCalibrationPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 1961 | |
jmitc91516 | 1:a5258871b33d | 1962 | if(gasCalibrationPageHandler->TouchAreaIsOnCalibrationPage(touchAreaIndex)) { |
jmitc91516 | 1:a5258871b33d | 1963 | |
jmitc91516 | 1:a5258871b33d | 1964 | dealtWithTouch = gasCalibrationPageHandler->DealWithTouch(touchAreaIndex); |
jmitc91516 | 1:a5258871b33d | 1965 | } |
jmitc91516 | 1:a5258871b33d | 1966 | } |
jmitc91516 | 1:a5258871b33d | 1967 | } // Touch area on Gas Calibration page |
jmitc91516 | 1:a5258871b33d | 1968 | #undef USE_GAS_CALIBRATION_PAGE_HANDLER |
jmitc91516 | 1:a5258871b33d | 1969 | #endif // USE_GAS_CALIBRATION_PAGE_HANDLER |
jmitc91516 | 1:a5258871b33d | 1970 | |
jmitc91516 | 1:a5258871b33d | 1971 | if(!dealtWithTouch) { |
jmitc91516 | 1:a5258871b33d | 1972 | ColumnDHAutoCalibrationPageHandler *columnDHAutoCalibrationPageHandler = ColumnDHAutoCalibrationPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1973 | |
jmitc91516 | 1:a5258871b33d | 1974 | if(columnDHAutoCalibrationPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 1975 | |
jmitc91516 | 1:a5258871b33d | 1976 | if(columnDHAutoCalibrationPageHandler->TouchAreaIsOnCalibrationPage(touchAreaIndex)) { |
jmitc91516 | 1:a5258871b33d | 1977 | |
jmitc91516 | 1:a5258871b33d | 1978 | dealtWithTouch = columnDHAutoCalibrationPageHandler->DealWithTouch(touchAreaIndex); |
jmitc91516 | 1:a5258871b33d | 1979 | } |
jmitc91516 | 1:a5258871b33d | 1980 | } |
jmitc91516 | 1:a5258871b33d | 1981 | } // Touch area on DH Column Auto Calibration page |
jmitc91516 | 1:a5258871b33d | 1982 | |
jmitc91516 | 1:a5258871b33d | 1983 | if(!dealtWithTouch) { |
jmitc91516 | 1:a5258871b33d | 1984 | ColumnDHManualCalibrationPageHandler *columnDHManualCalibrationPageHandler = ColumnDHManualCalibrationPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1985 | |
jmitc91516 | 1:a5258871b33d | 1986 | if(columnDHManualCalibrationPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 1987 | |
jmitc91516 | 1:a5258871b33d | 1988 | if(columnDHManualCalibrationPageHandler->TouchAreaIsOnCalibrationPage(touchAreaIndex)) { |
jmitc91516 | 1:a5258871b33d | 1989 | |
jmitc91516 | 1:a5258871b33d | 1990 | dealtWithTouch = columnDHManualCalibrationPageHandler->DealWithTouch(touchAreaIndex); |
jmitc91516 | 1:a5258871b33d | 1991 | } |
jmitc91516 | 1:a5258871b33d | 1992 | } |
jmitc91516 | 1:a5258871b33d | 1993 | } // Touch area on DH Column Manual Calibration page |
jmitc91516 | 1:a5258871b33d | 1994 | |
jmitc91516 | 1:a5258871b33d | 1995 | if(!dealtWithTouch) { |
jmitc91516 | 1:a5258871b33d | 1996 | ColumnDHSensorCalibrationPageHandler *columnDHSensorCalibrationPageHandler = ColumnDHSensorCalibrationPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 1997 | |
jmitc91516 | 1:a5258871b33d | 1998 | if(columnDHSensorCalibrationPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 1999 | |
jmitc91516 | 1:a5258871b33d | 2000 | if(columnDHSensorCalibrationPageHandler->TouchAreaIsOnCalibrationPage(touchAreaIndex)) { |
jmitc91516 | 1:a5258871b33d | 2001 | |
jmitc91516 | 1:a5258871b33d | 2002 | dealtWithTouch = columnDHSensorCalibrationPageHandler->DealWithTouch(touchAreaIndex); |
jmitc91516 | 1:a5258871b33d | 2003 | } |
jmitc91516 | 1:a5258871b33d | 2004 | } |
jmitc91516 | 1:a5258871b33d | 2005 | } // Touch area on DH Column Sensor Calibration page |
jmitc91516 | 1:a5258871b33d | 2006 | |
jmitc91516 | 1:a5258871b33d | 2007 | if(!dealtWithTouch) { |
jmitc91516 | 1:a5258871b33d | 2008 | ColumnDHPSUDACPageHandler *columnDHPSUDACPageHandler = ColumnDHPSUDACPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 2009 | |
jmitc91516 | 1:a5258871b33d | 2010 | if(columnDHPSUDACPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 2011 | |
jmitc91516 | 1:a5258871b33d | 2012 | if(columnDHPSUDACPageHandler->TouchAreaIsOnPSUDACPage(touchAreaIndex)) { |
jmitc91516 | 1:a5258871b33d | 2013 | |
jmitc91516 | 1:a5258871b33d | 2014 | dealtWithTouch = columnDHPSUDACPageHandler->DealWithTouch(touchAreaIndex); |
jmitc91516 | 1:a5258871b33d | 2015 | } |
jmitc91516 | 1:a5258871b33d | 2016 | } |
jmitc91516 | 1:a5258871b33d | 2017 | } // Touch area on DH PSU DAC page |
jmitc91516 | 1:a5258871b33d | 2018 | |
jmitc91516 | 1:a5258871b33d | 2019 | if(!dealtWithTouch) { |
jmitc91516 | 1:a5258871b33d | 2020 | NudgeAndDampPageHandler *nudgeAndDampPageHandler = NudgeAndDampPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 2021 | |
jmitc91516 | 1:a5258871b33d | 2022 | if(nudgeAndDampPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 2023 | |
jmitc91516 | 1:a5258871b33d | 2024 | if(nudgeAndDampPageHandler->TouchAreaIsOnNudgeAndDampPage(touchAreaIndex)) { |
jmitc91516 | 1:a5258871b33d | 2025 | |
jmitc91516 | 1:a5258871b33d | 2026 | dealtWithTouch = nudgeAndDampPageHandler->DealWithTouch(touchAreaIndex); |
jmitc91516 | 1:a5258871b33d | 2027 | } |
jmitc91516 | 1:a5258871b33d | 2028 | } |
jmitc91516 | 1:a5258871b33d | 2029 | } // Touch area on one of the Nudge and Damp pages |
jmitc91516 | 1:a5258871b33d | 2030 | |
jmitc91516 | 1:a5258871b33d | 2031 | if(!dealtWithTouch) { |
jmitc91516 | 1:a5258871b33d | 2032 | DebugCommandsPageHandler *debugCommandsPageHandler = DebugCommandsPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 2033 | |
jmitc91516 | 1:a5258871b33d | 2034 | if(debugCommandsPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 2035 | |
jmitc91516 | 1:a5258871b33d | 2036 | if(debugCommandsPageHandler->TouchAreaIsOnDebugCommandsPage(touchAreaIndex)) { |
jmitc91516 | 1:a5258871b33d | 2037 | |
jmitc91516 | 1:a5258871b33d | 2038 | dealtWithTouch = debugCommandsPageHandler->DealWithTouch(touchAreaIndex); |
jmitc91516 | 1:a5258871b33d | 2039 | } |
jmitc91516 | 1:a5258871b33d | 2040 | } |
jmitc91516 | 1:a5258871b33d | 2041 | } // Touch area on the GC (Debug) Commands page |
jmitc91516 | 1:a5258871b33d | 2042 | |
jmitc91516 | 1:a5258871b33d | 2043 | if(!dealtWithTouch) { // Try Column Oven Fan page - no 'PageHandler' class for this - |
jmitc91516 | 1:a5258871b33d | 2044 | // trivial - only two touch areas/buttons, each of which simply sends |
jmitc91516 | 1:a5258871b33d | 2045 | // a command (without arguments) to the GC - no values displayed |
jmitc91516 | 1:a5258871b33d | 2046 | if(touchAreaIndex == COLUMN_OVEN_FAN_NORMAL) { |
jmitc91516 | 1:a5258871b33d | 2047 | ExecuteGCCommand("CFNO",usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 2048 | dealtWithTouch = true; |
jmitc91516 | 1:a5258871b33d | 2049 | } else if(touchAreaIndex == COLUMN_OVEN_FAN_COOLING) { |
jmitc91516 | 1:a5258871b33d | 2050 | ExecuteGCCommand("CFCO",usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 2051 | dealtWithTouch = true; |
jmitc91516 | 1:a5258871b33d | 2052 | } |
jmitc91516 | 1:a5258871b33d | 2053 | } |
jmitc91516 | 1:a5258871b33d | 2054 | |
jmitc91516 | 1:a5258871b33d | 2055 | if(!dealtWithTouch) { |
jmitc91516 | 1:a5258871b33d | 2056 | GasBackPressureDACPageHandler *gasBackPressureDACPageHandler = GasBackPressureDACPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 2057 | |
jmitc91516 | 1:a5258871b33d | 2058 | if(gasBackPressureDACPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 2059 | |
jmitc91516 | 1:a5258871b33d | 2060 | if(gasBackPressureDACPageHandler->TouchAreaIsOnGasBackPressureDACPage(touchAreaIndex)) { |
jmitc91516 | 1:a5258871b33d | 2061 | |
jmitc91516 | 1:a5258871b33d | 2062 | dealtWithTouch = gasBackPressureDACPageHandler->DealWithTouch(touchAreaIndex); |
jmitc91516 | 1:a5258871b33d | 2063 | } |
jmitc91516 | 1:a5258871b33d | 2064 | } |
jmitc91516 | 1:a5258871b33d | 2065 | } // Touch area on Gas Backpressure DAC page |
jmitc91516 | 1:a5258871b33d | 2066 | |
jmitc91516 | 1:a5258871b33d | 2067 | if(!dealtWithTouch) { |
jmitc91516 | 1:a5258871b33d | 2068 | GasChannelDACAndADCPageHandler *gasChannelDACAndADCPageHandler = GasChannelDACAndADCPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 2069 | |
jmitc91516 | 1:a5258871b33d | 2070 | if(gasChannelDACAndADCPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 2071 | |
jmitc91516 | 1:a5258871b33d | 2072 | if(gasChannelDACAndADCPageHandler->TouchAreaIsOnGasChannelDACAndADCPage(touchAreaIndex)) { |
jmitc91516 | 1:a5258871b33d | 2073 | |
jmitc91516 | 1:a5258871b33d | 2074 | dealtWithTouch = gasChannelDACAndADCPageHandler->DealWithTouch(touchAreaIndex); |
jmitc91516 | 1:a5258871b33d | 2075 | } |
jmitc91516 | 1:a5258871b33d | 2076 | } |
jmitc91516 | 1:a5258871b33d | 2077 | } // Touch area on Gas channel DAC and ADC page |
jmitc91516 | 1:a5258871b33d | 2078 | |
jmitc91516 | 1:a5258871b33d | 2079 | if(!dealtWithTouch) { |
jmitc91516 | 1:a5258871b33d | 2080 | NumericKeypadPageHandler *numericKeypadPageHandler = NumericKeypadPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 2081 | |
jmitc91516 | 1:a5258871b33d | 2082 | if(numericKeypadPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 2083 | |
jmitc91516 | 1:a5258871b33d | 2084 | if(numericKeypadPageHandler->TouchAreaIsOnNumericKeypadPage(touchAreaIndex)) { |
jmitc91516 | 1:a5258871b33d | 2085 | |
jmitc91516 | 1:a5258871b33d | 2086 | dealtWithTouch = numericKeypadPageHandler->DealWithTouch(touchAreaIndex); |
jmitc91516 | 1:a5258871b33d | 2087 | } |
jmitc91516 | 1:a5258871b33d | 2088 | } |
jmitc91516 | 1:a5258871b33d | 2089 | } // Touch area on numeric keypad page |
jmitc91516 | 1:a5258871b33d | 2090 | |
jmitc91516 | 1:a5258871b33d | 2091 | if(!dealtWithTouch) { |
jmitc91516 | 1:a5258871b33d | 2092 | EthernetKeypadPageHandler *ethernetKeypadPageHandler = EthernetKeypadPageHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 2093 | |
jmitc91516 | 1:a5258871b33d | 2094 | if(ethernetKeypadPageHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 2095 | |
jmitc91516 | 1:a5258871b33d | 2096 | if(ethernetKeypadPageHandler->TouchAreaIsOnEthernetKeypadPage(touchAreaIndex)) { |
jmitc91516 | 1:a5258871b33d | 2097 | |
jmitc91516 | 1:a5258871b33d | 2098 | dealtWithTouch = ethernetKeypadPageHandler->DealWithTouch(touchAreaIndex); |
jmitc91516 | 1:a5258871b33d | 2099 | } |
jmitc91516 | 1:a5258871b33d | 2100 | } |
jmitc91516 | 1:a5258871b33d | 2101 | } // Touch area on numeric keypad page |
jmitc91516 | 1:a5258871b33d | 2102 | |
jmitc91516 | 1:a5258871b33d | 2103 | if(!dealtWithTouch) { |
jmitc91516 | 1:a5258871b33d | 2104 | |
jmitc91516 | 1:a5258871b33d | 2105 | DetectorIgnitionHandler *detectorIgnitionHandler = DetectorIgnitionHandler::GetInstance(usbDevice, usbHostGC); |
jmitc91516 | 1:a5258871b33d | 2106 | |
jmitc91516 | 1:a5258871b33d | 2107 | if(detectorIgnitionHandler != NULL) { |
jmitc91516 | 1:a5258871b33d | 2108 | |
jmitc91516 | 1:a5258871b33d | 2109 | if(detectorIgnitionHandler->TouchAreaIsDetectorIgniteButton(touchAreaIndex)) { |
jmitc91516 | 1:a5258871b33d | 2110 | |
jmitc91516 | 1:a5258871b33d | 2111 | dealtWithTouch = detectorIgnitionHandler->DealWithTouch(touchAreaIndex); |
jmitc91516 | 1:a5258871b33d | 2112 | } |
jmitc91516 | 1:a5258871b33d | 2113 | } |
jmitc91516 | 1:a5258871b33d | 2114 | } // Handling detector ignition |
jmitc91516 | 1:a5258871b33d | 2115 | |
jmitc91516 | 1:a5258871b33d | 2116 | if(!dealtWithTouch) { |
jmitc91516 | 1:a5258871b33d | 2117 | #ifdef SERVICE_INTERVALS_ACTIVE |
jmitc91516 | 1:a5258871b33d | 2118 | if(ServiceInterval::IsServicedTouchArea(touchAreaIndex)) { |
jmitc91516 | 1:a5258871b33d | 2119 | |
jmitc91516 | 1:a5258871b33d | 2120 | ServiceInterval::DealWithServicedTouchArea(touchAreaIndex); |
jmitc91516 | 1:a5258871b33d | 2121 | |
jmitc91516 | 1:a5258871b33d | 2122 | // This is a ServiceInterval touch area - |
jmitc91516 | 1:a5258871b33d | 2123 | // nothing else can deal with it, |
jmitc91516 | 1:a5258871b33d | 2124 | // whether we actually did anything or not |
jmitc91516 | 1:a5258871b33d | 2125 | dealtWithTouch = true; |
jmitc91516 | 1:a5258871b33d | 2126 | } |
jmitc91516 | 1:a5258871b33d | 2127 | #endif // SERVICE_INTERVALS_ACTIVE |
jmitc91516 | 1:a5258871b33d | 2128 | } // Service interval |
jmitc91516 | 6:dba3fbdfd5da | 2129 | |
jmitc91516 | 6:dba3fbdfd5da | 2130 | if(!dealtWithTouch) { |
jmitc91516 | 6:dba3fbdfd5da | 2131 | if(touchAreaIndex == COLUMN_METHOD_SCROLL_UP) { |
jmitc91516 | 6:dba3fbdfd5da | 2132 | getGCStatusLoop->ScrollColumnMethodRampsUpIfPossible(); |
jmitc91516 | 6:dba3fbdfd5da | 2133 | dealtWithTouch = true; |
jmitc91516 | 6:dba3fbdfd5da | 2134 | } else if(touchAreaIndex == COLUMN_METHOD_SCROLL_DOWN) { |
jmitc91516 | 6:dba3fbdfd5da | 2135 | getGCStatusLoop->ScrollColumnMethodRampsDownIfPossible(); |
jmitc91516 | 6:dba3fbdfd5da | 2136 | dealtWithTouch = true; |
jmitc91516 | 6:dba3fbdfd5da | 2137 | } else if(touchAreaIndex == INJECTOR_METHOD_SCROLL_UP) { |
jmitc91516 | 6:dba3fbdfd5da | 2138 | getGCStatusLoop->ScrollInjectorMethodRampsUpIfPossible(); |
jmitc91516 | 6:dba3fbdfd5da | 2139 | dealtWithTouch = true; |
jmitc91516 | 6:dba3fbdfd5da | 2140 | } else if(touchAreaIndex == INJECTOR_METHOD_SCROLL_DOWN) { |
jmitc91516 | 6:dba3fbdfd5da | 2141 | getGCStatusLoop->ScrollInjectorMethodRampsDownIfPossible(); |
jmitc91516 | 6:dba3fbdfd5da | 2142 | dealtWithTouch = true; |
jmitc91516 | 7:f0e645cf73a2 | 2143 | } else if(touchAreaIndex == GAS_METHOD_SCROLL_UP) { |
jmitc91516 | 7:f0e645cf73a2 | 2144 | getGCStatusLoop->ScrollGasMethodRampsUpIfPossible(); |
jmitc91516 | 7:f0e645cf73a2 | 2145 | dealtWithTouch = true; |
jmitc91516 | 7:f0e645cf73a2 | 2146 | } else if(touchAreaIndex == GAS_METHOD_SCROLL_DOWN) { |
jmitc91516 | 7:f0e645cf73a2 | 2147 | getGCStatusLoop->ScrollGasMethodRampsDownIfPossible(); |
jmitc91516 | 7:f0e645cf73a2 | 2148 | dealtWithTouch = true; |
jmitc91516 | 6:dba3fbdfd5da | 2149 | } |
jmitc91516 | 6:dba3fbdfd5da | 2150 | } |
jmitc91516 | 0:47c880c1463d | 2151 | } |
jmitc91516 | 0:47c880c1463d | 2152 | } |
jmitc91516 | 0:47c880c1463d | 2153 | |
jmitc91516 | 1:a5258871b33d | 2154 | |
jmitc91516 | 1:a5258871b33d | 2155 | /* |
jmitc91516 | 1:a5258871b33d | 2156 | Waits (indefinitely) for a USB device to be connected - |
jmitc91516 | 1:a5258871b33d | 2157 | note that, if there is no USB device, we will hang at this point - |
jmitc91516 | 1:a5258871b33d | 2158 | there is no timeout. |
jmitc91516 | 0:47c880c1463d | 2159 | |
jmitc91516 | 1:a5258871b33d | 2160 | Args are: a pointer to the USBHost instance on which we are to look for the USB device |
jmitc91516 | 1:a5258871b33d | 2161 | |
jmitc91516 | 1:a5258871b33d | 2162 | Returns a pointer to the USB device |
jmitc91516 | 1:a5258871b33d | 2163 | */ |
jmitc91516 | 1:a5258871b33d | 2164 | USBDeviceConnected* GetUSBDevice(USBHost* usbHost) |
jmitc91516 | 1:a5258871b33d | 2165 | { |
jmitc91516 | 1:a5258871b33d | 2166 | USBDeviceConnected* usbDevice = NULL; |
jmitc91516 | 0:47c880c1463d | 2167 | |
jmitc91516 | 1:a5258871b33d | 2168 | while(usbDevice == NULL) { |
jmitc91516 | 1:a5258871b33d | 2169 | for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; ++i) { |
jmitc91516 | 1:a5258871b33d | 2170 | usbDevice = usbHost->getDevice(i); |
jmitc91516 | 1:a5258871b33d | 2171 | |
jmitc91516 | 1:a5258871b33d | 2172 | if (usbDevice) { |
jmitc91516 | 1:a5258871b33d | 2173 | return usbDevice; |
jmitc91516 | 1:a5258871b33d | 2174 | } |
jmitc91516 | 1:a5258871b33d | 2175 | } |
jmitc91516 | 0:47c880c1463d | 2176 | } |
jmitc91516 | 1:a5258871b33d | 2177 | |
jmitc91516 | 1:a5258871b33d | 2178 | return NULL; |
jmitc91516 | 0:47c880c1463d | 2179 | } |
jmitc91516 | 0:47c880c1463d | 2180 | |
jmitc91516 | 1:a5258871b33d | 2181 | /* |
jmitc91516 | 1:a5258871b33d | 2182 | Function that executes the easyGUI code in VarInit.c, to initialise all the easyGUI variables |
jmitc91516 | 1:a5258871b33d | 2183 | to the values we have specified in the easyGUI application. |
jmitc91516 | 1:a5258871b33d | 2184 | */ |
jmitc91516 | 1:a5258871b33d | 2185 | static void InitialiseAllEasyGUIVariables(void) |
jmitc91516 | 0:47c880c1463d | 2186 | { |
jmitc91516 | 1:a5258871b33d | 2187 | #include "VarInit.h" // Renamed from the easyGUI file "VarInit.c", so as not to confuse the mbed compiler |
jmitc91516 | 1:a5258871b33d | 2188 | } |
jmitc91516 | 0:47c880c1463d | 2189 | |
jmitc91516 | 1:a5258871b33d | 2190 | |
jmitc91516 | 1:a5258871b33d | 2191 | /* |
jmitc91516 | 1:a5258871b33d | 2192 | Sets up the easyGUI user interface in an acceptable initial state. |
jmitc91516 | 0:47c880c1463d | 2193 | |
jmitc91516 | 1:a5258871b33d | 2194 | No return code. |
jmitc91516 | 1:a5258871b33d | 2195 | */ |
jmitc91516 | 1:a5258871b33d | 2196 | void InitEasyGUIDisplay(int initialEasyGUIPage) |
jmitc91516 | 1:a5258871b33d | 2197 | { |
jmitc91516 | 1:a5258871b33d | 2198 | // easyGUI stuff - note function calls require 'extern "C"' in relevant header |
jmitc91516 | 0:47c880c1463d | 2199 | |
jmitc91516 | 0:47c880c1463d | 2200 | // Need to set up heat on/off command easyGUI variable |
jmitc91516 | 0:47c880c1463d | 2201 | // before we display the home page for the first time - |
jmitc91516 | 0:47c880c1463d | 2202 | // but we do not have a heat control object at this point - |
jmitc91516 | 0:47c880c1463d | 2203 | // default to 'Heat On' |
jmitc91516 | 0:47c880c1463d | 2204 | strcpy(GuiVar_heatOnOffCommand, "Heat On"); |
jmitc91516 | 1:a5258871b33d | 2205 | #ifdef USE_HEAT_ONOFF_BUTTON_BITMAPS |
jmitc91516 | 1:a5258871b33d | 2206 | DrawHeatOnOffButton(); |
jmitc91516 | 1:a5258871b33d | 2207 | #endif |
jmitc91516 | 0:47c880c1463d | 2208 | |
jmitc91516 | 0:47c880c1463d | 2209 | GuiDisplay_Lock(); |
jmitc91516 | 0:47c880c1463d | 2210 | |
jmitc91516 | 0:47c880c1463d | 2211 | GuiLib_Init(); |
jmitc91516 | 0:47c880c1463d | 2212 | |
jmitc91516 | 1:a5258871b33d | 2213 | DisplayEasyGuiStructure(initialEasyGUIPage, NULL, NULL); |
jmitc91516 | 0:47c880c1463d | 2214 | |
jmitc91516 | 0:47c880c1463d | 2215 | GuiDisplay_Unlock(); |
jmitc91516 | 1:a5258871b33d | 2216 | |
jmitc91516 | 1:a5258871b33d | 2217 | #ifdef USE_QSPI_BITMAPS |
jmitc91516 | 1:a5258871b33d | 2218 | qspiBitmaps.SetupArray(); |
jmitc91516 | 1:a5258871b33d | 2219 | #endif |
jmitc91516 | 1:a5258871b33d | 2220 | } |
jmitc91516 | 1:a5258871b33d | 2221 | |
jmitc91516 | 1:a5258871b33d | 2222 | void InitialiseLPC4088(DMBoard* board, void **frameBufferAddress1, void **frameBufferAddress2) |
jmitc91516 | 1:a5258871b33d | 2223 | { |
jmitc91516 | 1:a5258871b33d | 2224 | RtosLog* log = board->logger(); |
jmitc91516 | 1:a5258871b33d | 2225 | Display* disp = board->display(); |
jmitc91516 | 0:47c880c1463d | 2226 | |
jmitc91516 | 1:a5258871b33d | 2227 | DMBoard::BoardError err; |
jmitc91516 | 1:a5258871b33d | 2228 | |
jmitc91516 | 1:a5258871b33d | 2229 | do { |
jmitc91516 | 1:a5258871b33d | 2230 | err = board->init(); |
jmitc91516 | 1:a5258871b33d | 2231 | if (err != DMBoard::Ok) { |
jmitc91516 | 1:a5258871b33d | 2232 | log->printf("Failed to initialize the board, got error %d\r\n", err); |
jmitc91516 | 1:a5258871b33d | 2233 | break; |
jmitc91516 | 1:a5258871b33d | 2234 | } |
jmitc91516 | 1:a5258871b33d | 2235 | |
jmitc91516 | 1:a5258871b33d | 2236 | #ifdef MEMORY_TEST_OCT_2016 |
jmitc91516 | 1:a5258871b33d | 2237 | for (int ind = 0; ind < clogLength; ++ind) { |
jmitc91516 | 1:a5258871b33d | 2238 | clogUpMemory[ind] = 'A'; |
jmitc91516 | 1:a5258871b33d | 2239 | } |
jmitc91516 | 1:a5258871b33d | 2240 | #endif // MEMORY_TEST_OCT_2016 |
jmitc91516 | 1:a5258871b33d | 2241 | |
jmitc91516 | 1:a5258871b33d | 2242 | |
jmitc91516 | 1:a5258871b33d | 2243 | #define COLOR_FLICKERING_FIX_1 |
jmitc91516 | 1:a5258871b33d | 2244 | #ifdef COLOR_FLICKERING_FIX_1 |
jmitc91516 | 1:a5258871b33d | 2245 | // Possible fix for display flickering on LPC4088 |
jmitc91516 | 1:a5258871b33d | 2246 | uint32_t* reg = ((uint32_t*)0x400fc188); |
jmitc91516 | 1:a5258871b33d | 2247 | *reg |= (3<<10); |
jmitc91516 | 1:a5258871b33d | 2248 | #undef COLOR_FLICKERING_FIX_1 |
jmitc91516 | 1:a5258871b33d | 2249 | #endif |
jmitc91516 | 1:a5258871b33d | 2250 | log->printf("\n\nHello World!\n\n"); |
jmitc91516 | 1:a5258871b33d | 2251 | |
jmitc91516 | 1:a5258871b33d | 2252 | void* fb = disp->allocateFramebuffer(); |
jmitc91516 | 1:a5258871b33d | 2253 | if (fb == NULL) { |
jmitc91516 | 1:a5258871b33d | 2254 | log->printf("Failed to allocate memory for a frame buffer\r\n"); |
jmitc91516 | 1:a5258871b33d | 2255 | err = DMBoard::MemoryError; |
jmitc91516 | 1:a5258871b33d | 2256 | break; |
jmitc91516 | 1:a5258871b33d | 2257 | } |
jmitc91516 | 1:a5258871b33d | 2258 | |
jmitc91516 | 1:a5258871b33d | 2259 | *frameBufferAddress1 = fb; |
jmitc91516 | 1:a5258871b33d | 2260 | |
jmitc91516 | 1:a5258871b33d | 2261 | // Allocate a second frame buffer - what will its address be? |
jmitc91516 | 1:a5258871b33d | 2262 | void* fb2 = disp->allocateFramebuffer(); |
jmitc91516 | 1:a5258871b33d | 2263 | *frameBufferAddress2 = fb2; |
jmitc91516 | 1:a5258871b33d | 2264 | |
jmitc91516 | 1:a5258871b33d | 2265 | Display::DisplayError disperr; |
jmitc91516 | 1:a5258871b33d | 2266 | // disperr = disp->powerUp(fb, Display::Resolution_24bit_rgb888); |
jmitc91516 | 1:a5258871b33d | 2267 | // Start display in default mode (16-bit) (24-bit uses too much memory) |
jmitc91516 | 1:a5258871b33d | 2268 | #define COLOR_FLICKERING_FIX_2 |
jmitc91516 | 1:a5258871b33d | 2269 | #ifdef COLOR_FLICKERING_FIX_2 |
jmitc91516 | 1:a5258871b33d | 2270 | // Second possible fix for colour flickering problem, |
jmitc91516 | 1:a5258871b33d | 2271 | // suggested by Embedded Artists - specify low frame rate |
jmitc91516 | 1:a5258871b33d | 2272 | disp->powerDown(); |
jmitc91516 | 1:a5258871b33d | 2273 | disperr = disp->powerUp(fb, Display::Resolution_16bit_rgb565, FrameRate_Low); |
jmitc91516 | 1:a5258871b33d | 2274 | #undef COLOR_FLICKERING_FIX_2 |
jmitc91516 | 1:a5258871b33d | 2275 | #else |
jmitc91516 | 1:a5258871b33d | 2276 | disperr = disp->powerUp(fb); |
jmitc91516 | 1:a5258871b33d | 2277 | #endif |
jmitc91516 | 1:a5258871b33d | 2278 | if (disperr != Display::DisplayError_Ok) { |
jmitc91516 | 1:a5258871b33d | 2279 | log->printf("Failed to initialize the display, got error %d\r\n", disperr); |
jmitc91516 | 1:a5258871b33d | 2280 | break; |
jmitc91516 | 1:a5258871b33d | 2281 | } |
jmitc91516 | 2:6e94a7fd1e37 | 2282 | |
jmitc91516 | 2:6e94a7fd1e37 | 2283 | #define TEST_BACKLIGHT |
jmitc91516 | 2:6e94a7fd1e37 | 2284 | #ifdef TEST_BACKLIGHT |
jmitc91516 | 2:6e94a7fd1e37 | 2285 | disp->backlight(100); |
jmitc91516 | 2:6e94a7fd1e37 | 2286 | #endif // TEST_BACKLIGHT |
jmitc91516 | 1:a5258871b33d | 2287 | |
jmitc91516 | 1:a5258871b33d | 2288 | } while(false); |
jmitc91516 | 1:a5258871b33d | 2289 | |
jmitc91516 | 1:a5258871b33d | 2290 | if (err != DMBoard::Ok) { |
jmitc91516 | 1:a5258871b33d | 2291 | log->printf("\nTERMINATING\n"); |
jmitc91516 | 1:a5258871b33d | 2292 | wait_ms(2000); // allow RtosLog to flush messages |
jmitc91516 | 1:a5258871b33d | 2293 | mbed_die(); |
jmitc91516 | 1:a5258871b33d | 2294 | } |
jmitc91516 | 1:a5258871b33d | 2295 | } |
jmitc91516 | 1:a5258871b33d | 2296 | |
jmitc91516 | 1:a5258871b33d | 2297 | int main() |
jmitc91516 | 1:a5258871b33d | 2298 | { |
jmitc91516 | 1:a5258871b33d | 2299 | DMBoard* board = &DMBoard::instance(); |
jmitc91516 | 1:a5258871b33d | 2300 | void *frameBuffer1; |
jmitc91516 | 1:a5258871b33d | 2301 | void *frameBuffer2; |
jmitc91516 | 1:a5258871b33d | 2302 | InitialiseLPC4088(board, &frameBuffer1, &frameBuffer2); |
jmitc91516 | 1:a5258871b33d | 2303 | GuiDisplay_SetFrameAddress(frameBuffer1); |
jmitc91516 | 1:a5258871b33d | 2304 | |
jmitc91516 | 1:a5258871b33d | 2305 | SwimDraw* swimDrawInstance = SwimDraw::GetInstance(); |
jmitc91516 | 1:a5258871b33d | 2306 | if(swimDrawInstance != NULL) { |
jmitc91516 | 1:a5258871b33d | 2307 | swimDrawInstance->Initialise(board, frameBuffer1); |
jmitc91516 | 1:a5258871b33d | 2308 | } |
jmitc91516 | 1:a5258871b33d | 2309 | |
jmitc91516 | 1:a5258871b33d | 2310 | InitialiseAllEasyGUIVariables(); |
jmitc91516 | 1:a5258871b33d | 2311 | |
jmitc91516 | 1:a5258871b33d | 2312 | // The first thing we do is try to connect to the GC - |
jmitc91516 | 1:a5258871b33d | 2313 | // so tell the user this first of all... |
jmitc91516 | 1:a5258871b33d | 2314 | InitEasyGUIDisplay(GuiStruct_GCConnectionPage_Def); |
jmitc91516 | 1:a5258871b33d | 2315 | |
jmitc91516 | 1:a5258871b33d | 2316 | |
jmitc91516 | 1:a5258871b33d | 2317 | SetupEasyGUIBuildDateVariable(); |
jmitc91516 | 1:a5258871b33d | 2318 | |
jmitc91516 | 1:a5258871b33d | 2319 | |
jmitc91516 | 1:a5258871b33d | 2320 | char dbgBuff[100]; |
jmitc91516 | 1:a5258871b33d | 2321 | sprintf(dbgBuff, "FrameBuffers are: %X, %X", frameBuffer1, frameBuffer2); |
jmitc91516 | 1:a5258871b33d | 2322 | EasyGUIDebugPrint(dbgBuff, 100, 100); |
jmitc91516 | 0:47c880c1463d | 2323 | |
jmitc91516 | 0:47c880c1463d | 2324 | // Now the USB 'stuff' |
jmitc91516 | 0:47c880c1463d | 2325 | |
jmitc91516 | 0:47c880c1463d | 2326 | USBHost* usbHost = USBHost::getHostInst(); |
jmitc91516 | 0:47c880c1463d | 2327 | USBHostGC usbHostGC; |
jmitc91516 | 0:47c880c1463d | 2328 | |
jmitc91516 | 0:47c880c1463d | 2329 | DrawErrorMessage("Waiting for USB device..."); |
jmitc91516 | 1:a5258871b33d | 2330 | // Note that 'GetUSBDevice' will not return until it finds a USB device - |
jmitc91516 | 1:a5258871b33d | 2331 | // it does *not* timeout |
jmitc91516 | 1:a5258871b33d | 2332 | USBDeviceConnected* usbDevice = GetUSBDevice(usbHost); |
jmitc91516 | 0:47c880c1463d | 2333 | |
jmitc91516 | 0:47c880c1463d | 2334 | DrawErrorMessage(" "); |
jmitc91516 | 0:47c880c1463d | 2335 | |
jmitc91516 | 0:47c880c1463d | 2336 | if(usbDevice != NULL) { |
jmitc91516 | 0:47c880c1463d | 2337 | USB_TYPE enumerateRetVal = usbHost->enumerate(usbDevice, &usbHostGC); |
jmitc91516 | 0:47c880c1463d | 2338 | |
jmitc91516 | 0:47c880c1463d | 2339 | if (usbHostGC.DeviceIsGC()) { |
jmitc91516 | 0:47c880c1463d | 2340 | if (usbHostGC.AttachGCDevice(usbDevice)) { |
jmitc91516 | 0:47c880c1463d | 2341 | |
jmitc91516 | 0:47c880c1463d | 2342 | DrawErrorMessage("Found GC device "); |
jmitc91516 | 0:47c880c1463d | 2343 | |
jmitc91516 | 0:47c880c1463d | 2344 | |
jmitc91516 | 1:a5258871b33d | 2345 | #ifdef OLD_TOUCH_LISTENER |
jmitc91516 | 0:47c880c1463d | 2346 | SetupUSBGCTouchListener(board, usbDevice, &usbHostGC); |
jmitc91516 | 0:47c880c1463d | 2347 | |
jmitc91516 | 0:47c880c1463d | 2348 | DrawErrorMessage("After call to SetupUSBGCTouchListener "); |
jmitc91516 | 1:a5258871b33d | 2349 | #endif |
jmitc91516 | 0:47c880c1463d | 2350 | |
jmitc91516 | 0:47c880c1463d | 2351 | getGCStatusLoop = GetGCStatusLoop::GetInstance(usbDevice, &usbHostGC); |
jmitc91516 | 0:47c880c1463d | 2352 | |
jmitc91516 | 0:47c880c1463d | 2353 | DrawErrorMessage("After creation of GetGCStatusLoop instance "); |
jmitc91516 | 0:47c880c1463d | 2354 | |
jmitc91516 | 0:47c880c1463d | 2355 | |
jmitc91516 | 0:47c880c1463d | 2356 | theGCHeatControl = new GCHeatControl(usbDevice, &usbHostGC); |
jmitc91516 | 0:47c880c1463d | 2357 | |
jmitc91516 | 1:a5258871b33d | 2358 | #ifdef USE_HEAT_ONOFF_BUTTON_BITMAPS |
jmitc91516 | 1:a5258871b33d | 2359 | DrawHeatOnOffButton(); |
jmitc91516 | 1:a5258871b33d | 2360 | #else |
jmitc91516 | 0:47c880c1463d | 2361 | UpdateHeatOnOffEasyGuiVariable(); |
jmitc91516 | 1:a5258871b33d | 2362 | #endif // USE_HEAT_ONOFF_BUTTON_BITMAPS |
jmitc91516 | 1:a5258871b33d | 2363 | |
jmitc91516 | 0:47c880c1463d | 2364 | DrawErrorMessage("After UpdateHeatOnOffEasyGuiVariable "); |
jmitc91516 | 0:47c880c1463d | 2365 | |
jmitc91516 | 1:a5258871b33d | 2366 | |
jmitc91516 | 0:47c880c1463d | 2367 | getGCStatusLoop->SetHomePageGCComponentStatusColorAreas(&homePageGCComponentStatusColorAreas); |
jmitc91516 | 0:47c880c1463d | 2368 | getGCStatusLoop->SetSingleGCComponentPageStatusColorAreas(&singleGCComponentPageStatusColorAreas); |
jmitc91516 | 0:47c880c1463d | 2369 | |
jmitc91516 | 0:47c880c1463d | 2370 | DrawErrorMessage("Point 1 "); |
jmitc91516 | 0:47c880c1463d | 2371 | |
jmitc91516 | 1:a5258871b33d | 2372 | #ifdef SERVICE_INTERVALS_ACTIVE |
jmitc91516 | 1:a5258871b33d | 2373 | ServiceInterval::SetupAllServiceIntervals(); |
jmitc91516 | 1:a5258871b33d | 2374 | // Note these two functions *** have different names *** |
jmitc91516 | 1:a5258871b33d | 2375 | ServiceInterval::StartAllServiceIntervals(); |
jmitc91516 | 1:a5258871b33d | 2376 | #endif // SERVICE_INTERVALS_ACTIVE |
jmitc91516 | 1:a5258871b33d | 2377 | |
jmitc91516 | 1:a5258871b33d | 2378 | DrawErrorMessage("Point 2 "); |
jmitc91516 | 1:a5258871b33d | 2379 | |
jmitc91516 | 0:47c880c1463d | 2380 | getGCStatusLoop->SetupAllEasyGUIVariables(); |
jmitc91516 | 1:a5258871b33d | 2381 | SetupDoorActuatorCommandUserInterface(usbDevice, &usbHostGC, true); |
jmitc91516 | 1:a5258871b33d | 2382 | |
jmitc91516 | 1:a5258871b33d | 2383 | DrawErrorMessage("Point 3 "); |
jmitc91516 | 1:a5258871b33d | 2384 | #ifdef USE_QSPI_BITMAPS |
jmitc91516 | 1:a5258871b33d | 2385 | getGCStatusLoop->SetQSPIBitmaps(&qspiBitmaps); |
jmitc91516 | 1:a5258871b33d | 2386 | // Test - what does it do if it cannot find the bitmaps?? |
jmitc91516 | 1:a5258871b33d | 2387 | #endif |
jmitc91516 | 1:a5258871b33d | 2388 | DrawErrorMessage("Point 4 "); |
jmitc91516 | 0:47c880c1463d | 2389 | |
jmitc91516 | 0:47c880c1463d | 2390 | getGCStatusLoop->SetCurrentPage(GuiStruct_HomePage_1); |
jmitc91516 | 0:47c880c1463d | 2391 | |
jmitc91516 | 1:a5258871b33d | 2392 | DrawErrorMessage("Point 5 "); |
jmitc91516 | 0:47c880c1463d | 2393 | |
jmitc91516 | 1:a5258871b33d | 2394 | //DisplayEasyGuiStructure(GuiStruct_HomePage_1, usbDevice, &usbHostGC); |
jmitc91516 | 1:a5258871b33d | 2395 | |
jmitc91516 | 1:a5258871b33d | 2396 | DebugPrint("Before MainLoopWithEthernet", 100, 450); |
jmitc91516 | 1:a5258871b33d | 2397 | |
jmitc91516 | 1:a5258871b33d | 2398 | // Currently, this never returns - but it allows time for the TouchCallback function to be invoked |
jmitc91516 | 1:a5258871b33d | 2399 | //getGCStatusLoop->MainLoop(board); |
jmitc91516 | 1:a5258871b33d | 2400 | getGCStatusLoop->MainLoopWithEthernet(board); |
jmitc91516 | 0:47c880c1463d | 2401 | |
jmitc91516 | 0:47c880c1463d | 2402 | // Should never reach this code - but just in case... |
jmitc91516 | 0:47c880c1463d | 2403 | delete theGCHeatControl; |
jmitc91516 | 0:47c880c1463d | 2404 | |
jmitc91516 | 0:47c880c1463d | 2405 | } else { |
jmitc91516 | 0:47c880c1463d | 2406 | DrawErrorMessage("Failed to attach GC device to host "); |
jmitc91516 | 0:47c880c1463d | 2407 | } |
jmitc91516 | 0:47c880c1463d | 2408 | } else { |
jmitc91516 | 0:47c880c1463d | 2409 | DrawErrorMessage(" *** USB device found, is *not* a GC *** "); |
jmitc91516 | 0:47c880c1463d | 2410 | } |
jmitc91516 | 0:47c880c1463d | 2411 | } else { |
jmitc91516 | 0:47c880c1463d | 2412 | DrawErrorMessage(" *** No USB device found *** "); |
jmitc91516 | 0:47c880c1463d | 2413 | } |
jmitc91516 | 0:47c880c1463d | 2414 | |
jmitc91516 | 0:47c880c1463d | 2415 | while(true) {} |
jmitc91516 | 0:47c880c1463d | 2416 | } |
jmitc91516 | 0:47c880c1463d | 2417 | |
jmitc91516 | 0:47c880c1463d | 2418 |