test export
Dependencies: DmTftLibrary mbed
Fork of dm_calc by
main.cpp@3:45df69ebc420, 2014-09-01 (annotated)
- Committer:
- displaymodule
- Date:
- Mon Sep 01 10:40:40 2014 +0000
- Revision:
- 3:45df69ebc420
- Parent:
- 2:b17b19212e5a
Removed dependency on mbed-src for LPC1549
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
displaymodule | 0:3713b01e72fe | 1 | /********************************************************************************************** |
displaymodule | 0:3713b01e72fe | 2 | Copyright (c) 2014 DisplayModule. All rights reserved. |
displaymodule | 0:3713b01e72fe | 3 | |
displaymodule | 0:3713b01e72fe | 4 | Redistribution and use of this source code, part of this source code or any compiled binary |
displaymodule | 0:3713b01e72fe | 5 | based on this source code is permitted as long as the above copyright notice and following |
displaymodule | 0:3713b01e72fe | 6 | disclaimer is retained. |
displaymodule | 0:3713b01e72fe | 7 | |
displaymodule | 0:3713b01e72fe | 8 | DISCLAIMER: |
displaymodule | 0:3713b01e72fe | 9 | THIS SOFTWARE IS SUPPLIED "AS IS" WITHOUT ANY WARRANTIES AND SUPPORT. DISPLAYMODULE ASSUMES |
displaymodule | 0:3713b01e72fe | 10 | NO RESPONSIBILITY OR LIABILITY FOR THE USE OF THE SOFTWARE. |
displaymodule | 0:3713b01e72fe | 11 | ********************************************************************************************/ |
displaymodule | 0:3713b01e72fe | 12 | |
displaymodule | 0:3713b01e72fe | 13 | /****************************************************************************** |
displaymodule | 0:3713b01e72fe | 14 | * Includes |
displaymodule | 0:3713b01e72fe | 15 | *****************************************************************************/ |
displaymodule | 0:3713b01e72fe | 16 | |
displaymodule | 0:3713b01e72fe | 17 | #include "mbed.h" |
displaymodule | 0:3713b01e72fe | 18 | |
displaymodule | 0:3713b01e72fe | 19 | #include "DmTftHX8353C.h" |
displaymodule | 0:3713b01e72fe | 20 | #include "DmTftS6D0164.h" |
displaymodule | 0:3713b01e72fe | 21 | #include "DmTftIli9325.h" |
displaymodule | 0:3713b01e72fe | 22 | #include "DmTftIli9341.h" |
displaymodule | 0:3713b01e72fe | 23 | #include "DmTftSsd2119.h" |
displaymodule | 0:3713b01e72fe | 24 | #include "DmTouch.h" |
displaymodule | 0:3713b01e72fe | 25 | |
displaymodule | 0:3713b01e72fe | 26 | #include "Button.h" |
displaymodule | 0:3713b01e72fe | 27 | |
displaymodule | 0:3713b01e72fe | 28 | /****************************************************************************** |
displaymodule | 0:3713b01e72fe | 29 | * Typedefs and defines |
displaymodule | 0:3713b01e72fe | 30 | *****************************************************************************/ |
displaymodule | 0:3713b01e72fe | 31 | |
displaymodule | 0:3713b01e72fe | 32 | typedef enum { |
displaymodule | 0:3713b01e72fe | 33 | MODE_WANT_ARG1, |
displaymodule | 0:3713b01e72fe | 34 | MODE_WANT_ARG1_OR_OP, |
displaymodule | 0:3713b01e72fe | 35 | MODE_WANT_ARG2, |
displaymodule | 0:3713b01e72fe | 36 | MODE_WANT_ARG2_OR_OP, |
displaymodule | 0:3713b01e72fe | 37 | } calc_mode_t; |
displaymodule | 0:3713b01e72fe | 38 | |
displaymodule | 0:3713b01e72fe | 39 | #define MARGIN 5 |
displaymodule | 0:3713b01e72fe | 40 | |
displaymodule | 0:3713b01e72fe | 41 | #define RESULT_MARGIN_X (MARGIN*3) |
displaymodule | 0:3713b01e72fe | 42 | #define RESULT_MARGIN_Y (MARGIN*3) |
displaymodule | 0:3713b01e72fe | 43 | |
displaymodule | 0:3713b01e72fe | 44 | #define NUM_BUTTONS (sizeof(captions)/sizeof(captions[0])) |
displaymodule | 0:3713b01e72fe | 45 | |
displaymodule | 1:9a3ae682a75e | 46 | #if 1 |
displaymodule | 1:9a3ae682a75e | 47 | /* Displays without adapter */ |
displaymodule | 1:9a3ae682a75e | 48 | #define DM_PIN_SPI_MOSI D11 |
displaymodule | 1:9a3ae682a75e | 49 | #define DM_PIN_SPI_MISO D12 |
displaymodule | 1:9a3ae682a75e | 50 | #define DM_PIN_SPI_SCLK D13 |
displaymodule | 1:9a3ae682a75e | 51 | #define DM_PIN_CS_TOUCH D4 |
displaymodule | 1:9a3ae682a75e | 52 | #define DM_PIN_CS_TFT D10 |
displaymodule | 1:9a3ae682a75e | 53 | #define DM_PIN_CS_SDCARD D8 |
displaymodule | 1:9a3ae682a75e | 54 | #define DM_PIN_CS_FLASH D6 |
displaymodule | 1:9a3ae682a75e | 55 | #else |
displaymodule | 1:9a3ae682a75e | 56 | /* Displays with adapter */ |
displaymodule | 1:9a3ae682a75e | 57 | #define DM_PIN_SPI_MOSI A0 |
displaymodule | 1:9a3ae682a75e | 58 | #define DM_PIN_SPI_MISO D9 |
displaymodule | 1:9a3ae682a75e | 59 | #define DM_PIN_SPI_SCLK A1 |
displaymodule | 1:9a3ae682a75e | 60 | #define DM_PIN_CS_TOUCH D8 |
displaymodule | 1:9a3ae682a75e | 61 | #define DM_PIN_CS_TFT A3 |
displaymodule | 1:9a3ae682a75e | 62 | #define DM_PIN_CS_SDCARD D10 |
displaymodule | 1:9a3ae682a75e | 63 | #endif |
displaymodule | 0:3713b01e72fe | 64 | |
displaymodule | 1:9a3ae682a75e | 65 | //#define LANDSCAPE |
displaymodule | 0:3713b01e72fe | 66 | |
displaymodule | 0:3713b01e72fe | 67 | /****************************************************************************** |
displaymodule | 0:3713b01e72fe | 68 | * Local variables |
displaymodule | 0:3713b01e72fe | 69 | *****************************************************************************/ |
displaymodule | 0:3713b01e72fe | 70 | |
displaymodule | 1:9a3ae682a75e | 71 | //DmTftIli9325 tft; /* DM_TFT28_103 and DM_TFT24_104 */ |
displaymodule | 1:9a3ae682a75e | 72 | DmTftIli9341 tft; /* DM_TFT28_105 */ |
displaymodule | 0:3713b01e72fe | 73 | //DmTftSsd2119 tft; /* DM_TFT35_107 */ |
displaymodule | 0:3713b01e72fe | 74 | |
displaymodule | 1:9a3ae682a75e | 75 | //DmTouch touch(DmTouch::DM_TFT28_103, DmTouch::Software); /* For LPC4088 QuickStart Board */ |
displaymodule | 0:3713b01e72fe | 76 | //DmTouch touch(DmTouch::DM_TFT28_103); |
displaymodule | 1:9a3ae682a75e | 77 | //DmTouch touch(DmTouch::DM_TFT24_104, DmTouch::Software); /* For LPC4088 QuickStart Board */ |
displaymodule | 1:9a3ae682a75e | 78 | //DmTouch touch(DmTouch::DM_TFT24_104); |
displaymodule | 1:9a3ae682a75e | 79 | DmTouch touch(DmTouch::DM_TFT28_105); |
displaymodule | 0:3713b01e72fe | 80 | //DmTouch touch(DmTouch::DM_TFT35_107); |
displaymodule | 0:3713b01e72fe | 81 | |
displaymodule | 0:3713b01e72fe | 82 | DigitalInOut csTouch(DM_PIN_CS_TOUCH, PIN_OUTPUT, PullUp, 1); |
displaymodule | 0:3713b01e72fe | 83 | DigitalInOut csDisplay(DM_PIN_CS_TFT, PIN_OUTPUT, PullUp, 1); |
displaymodule | 0:3713b01e72fe | 84 | DigitalInOut csSDCard(DM_PIN_CS_SDCARD, PIN_OUTPUT, PullUp, 1); |
displaymodule | 0:3713b01e72fe | 85 | #ifdef DM_PIN_CS_FLASH |
displaymodule | 0:3713b01e72fe | 86 | DigitalInOut csFlash(DM_PIN_CS_FLASH, PIN_OUTPUT, PullUp, 1); |
displaymodule | 0:3713b01e72fe | 87 | #endif |
displaymodule | 0:3713b01e72fe | 88 | |
displaymodule | 1:9a3ae682a75e | 89 | #ifdef LANDSCAPE |
displaymodule | 1:9a3ae682a75e | 90 | #define BUTTONS_PER_LINE 6 |
displaymodule | 1:9a3ae682a75e | 91 | #define BUTTONS_NUM_LINES 3 |
displaymodule | 1:9a3ae682a75e | 92 | /* |
displaymodule | 1:9a3ae682a75e | 93 | * 1 2 3 4 5 + |
displaymodule | 1:9a3ae682a75e | 94 | * 6 7 8 9 0 - |
displaymodule | 1:9a3ae682a75e | 95 | * * / = clr |
displaymodule | 1:9a3ae682a75e | 96 | */ |
displaymodule | 1:9a3ae682a75e | 97 | const char* captions[] = { |
displaymodule | 1:9a3ae682a75e | 98 | "1","2","3","4","5","+", |
displaymodule | 1:9a3ae682a75e | 99 | "6","7","8","9","0","-", |
displaymodule | 1:9a3ae682a75e | 100 | "*","/","=","clr", |
displaymodule | 1:9a3ae682a75e | 101 | }; |
displaymodule | 1:9a3ae682a75e | 102 | #else |
displaymodule | 1:9a3ae682a75e | 103 | #define BUTTONS_PER_LINE 4 |
displaymodule | 1:9a3ae682a75e | 104 | #define BUTTONS_NUM_LINES 4 |
displaymodule | 1:9a3ae682a75e | 105 | /* |
displaymodule | 1:9a3ae682a75e | 106 | * 1 2 3 + |
displaymodule | 1:9a3ae682a75e | 107 | * 4 5 6 - |
displaymodule | 1:9a3ae682a75e | 108 | * 7 8 9 * |
displaymodule | 1:9a3ae682a75e | 109 | * 0 = clr / |
displaymodule | 1:9a3ae682a75e | 110 | */ |
displaymodule | 1:9a3ae682a75e | 111 | const char* captions[] = { |
displaymodule | 1:9a3ae682a75e | 112 | "1","2","3","+", |
displaymodule | 1:9a3ae682a75e | 113 | "4","5","6","-", |
displaymodule | 1:9a3ae682a75e | 114 | "7","8","9","*", |
displaymodule | 1:9a3ae682a75e | 115 | "0","=","clr","/", |
displaymodule | 1:9a3ae682a75e | 116 | }; |
displaymodule | 1:9a3ae682a75e | 117 | #endif |
displaymodule | 1:9a3ae682a75e | 118 | |
displaymodule | 0:3713b01e72fe | 119 | Button* buttons[NUM_BUTTONS]; |
displaymodule | 0:3713b01e72fe | 120 | |
displaymodule | 0:3713b01e72fe | 121 | static char buff[25] = {0}; |
displaymodule | 0:3713b01e72fe | 122 | static bool redrawResult = true; |
displaymodule | 0:3713b01e72fe | 123 | static bool clearResult = true; |
displaymodule | 0:3713b01e72fe | 124 | |
displaymodule | 0:3713b01e72fe | 125 | /****************************************************************************** |
displaymodule | 0:3713b01e72fe | 126 | * Global variables |
displaymodule | 0:3713b01e72fe | 127 | *****************************************************************************/ |
displaymodule | 0:3713b01e72fe | 128 | |
displaymodule | 0:3713b01e72fe | 129 | |
displaymodule | 0:3713b01e72fe | 130 | /****************************************************************************** |
displaymodule | 0:3713b01e72fe | 131 | * Local functions |
displaymodule | 0:3713b01e72fe | 132 | *****************************************************************************/ |
displaymodule | 0:3713b01e72fe | 133 | |
displaymodule | 0:3713b01e72fe | 134 | void handleClick(uint32_t arg) |
displaymodule | 0:3713b01e72fe | 135 | { |
displaymodule | 0:3713b01e72fe | 136 | static int val1 = 0; |
displaymodule | 0:3713b01e72fe | 137 | static int val2 = 0; |
displaymodule | 0:3713b01e72fe | 138 | static int op = 0; |
displaymodule | 0:3713b01e72fe | 139 | static calc_mode_t mode = MODE_WANT_ARG1; |
displaymodule | 0:3713b01e72fe | 140 | static int strpos = 0; |
displaymodule | 0:3713b01e72fe | 141 | |
displaymodule | 0:3713b01e72fe | 142 | switch (arg) |
displaymodule | 0:3713b01e72fe | 143 | { |
displaymodule | 0:3713b01e72fe | 144 | case '0': |
displaymodule | 0:3713b01e72fe | 145 | case '1': |
displaymodule | 0:3713b01e72fe | 146 | case '2': |
displaymodule | 0:3713b01e72fe | 147 | case '3': |
displaymodule | 0:3713b01e72fe | 148 | case '4': |
displaymodule | 0:3713b01e72fe | 149 | case '5': |
displaymodule | 0:3713b01e72fe | 150 | case '6': |
displaymodule | 0:3713b01e72fe | 151 | case '7': |
displaymodule | 0:3713b01e72fe | 152 | case '8': |
displaymodule | 0:3713b01e72fe | 153 | case '9': |
displaymodule | 0:3713b01e72fe | 154 | if ((mode == MODE_WANT_ARG1) || (mode == MODE_WANT_ARG1_OR_OP)) { |
displaymodule | 0:3713b01e72fe | 155 | val1 = val1*10 + (arg - '0'); |
displaymodule | 0:3713b01e72fe | 156 | mode = MODE_WANT_ARG1_OR_OP; |
displaymodule | 0:3713b01e72fe | 157 | buff[strpos++] = arg; |
displaymodule | 0:3713b01e72fe | 158 | } else if ((mode == MODE_WANT_ARG2) || (mode == MODE_WANT_ARG2_OR_OP)) { |
displaymodule | 0:3713b01e72fe | 159 | val2 = val2*10 + (arg - '0'); |
displaymodule | 0:3713b01e72fe | 160 | mode = MODE_WANT_ARG2_OR_OP; |
displaymodule | 0:3713b01e72fe | 161 | buff[strpos++] = arg; |
displaymodule | 0:3713b01e72fe | 162 | } |
displaymodule | 0:3713b01e72fe | 163 | break; |
displaymodule | 0:3713b01e72fe | 164 | case '+': |
displaymodule | 0:3713b01e72fe | 165 | case '-': |
displaymodule | 0:3713b01e72fe | 166 | case '*': |
displaymodule | 0:3713b01e72fe | 167 | case '/': |
displaymodule | 0:3713b01e72fe | 168 | if (mode == MODE_WANT_ARG1_OR_OP) { |
displaymodule | 0:3713b01e72fe | 169 | op = arg; |
displaymodule | 0:3713b01e72fe | 170 | mode = MODE_WANT_ARG2; |
displaymodule | 0:3713b01e72fe | 171 | buff[strpos++] = arg; |
displaymodule | 0:3713b01e72fe | 172 | } else if (mode == MODE_WANT_ARG2_OR_OP) { |
displaymodule | 0:3713b01e72fe | 173 | // already have "a op b", calculate it and go to "c op" |
displaymodule | 0:3713b01e72fe | 174 | switch (op) { |
displaymodule | 0:3713b01e72fe | 175 | case '+': val1 = val1 + val2; break; |
displaymodule | 0:3713b01e72fe | 176 | case '-': val1 = val1 - val2; break; |
displaymodule | 0:3713b01e72fe | 177 | case '*': val1 = val1 * val2; break; |
displaymodule | 0:3713b01e72fe | 178 | case '/': val1 = val1 / val2; break; |
displaymodule | 0:3713b01e72fe | 179 | } |
displaymodule | 0:3713b01e72fe | 180 | op = arg; |
displaymodule | 0:3713b01e72fe | 181 | val2 = 0; |
displaymodule | 0:3713b01e72fe | 182 | mode = MODE_WANT_ARG2; |
displaymodule | 0:3713b01e72fe | 183 | strpos = sprintf(buff, "%d%c", val1, op); |
displaymodule | 0:3713b01e72fe | 184 | clearResult = true; |
displaymodule | 0:3713b01e72fe | 185 | } |
displaymodule | 0:3713b01e72fe | 186 | break; |
displaymodule | 0:3713b01e72fe | 187 | case 'c': |
displaymodule | 0:3713b01e72fe | 188 | val1 = val2 = op = 0; |
displaymodule | 0:3713b01e72fe | 189 | mode = MODE_WANT_ARG1; |
displaymodule | 0:3713b01e72fe | 190 | strpos = 0; |
displaymodule | 0:3713b01e72fe | 191 | clearResult = true; |
displaymodule | 0:3713b01e72fe | 192 | break; |
displaymodule | 0:3713b01e72fe | 193 | case '=': |
displaymodule | 0:3713b01e72fe | 194 | default: |
displaymodule | 0:3713b01e72fe | 195 | if (mode == MODE_WANT_ARG2_OR_OP) { |
displaymodule | 0:3713b01e72fe | 196 | // already have "a op b", calculate it and go to "c" |
displaymodule | 0:3713b01e72fe | 197 | switch (op) { |
displaymodule | 0:3713b01e72fe | 198 | case '+': val1 = val1 + val2; break; |
displaymodule | 0:3713b01e72fe | 199 | case '-': val1 = val1 - val2; break; |
displaymodule | 0:3713b01e72fe | 200 | case '*': val1 = val1 * val2; break; |
displaymodule | 0:3713b01e72fe | 201 | case '/': val1 = val1 / val2; break; |
displaymodule | 0:3713b01e72fe | 202 | } |
displaymodule | 0:3713b01e72fe | 203 | mode = MODE_WANT_ARG1_OR_OP; |
displaymodule | 0:3713b01e72fe | 204 | val2 = 0; |
displaymodule | 0:3713b01e72fe | 205 | strpos = sprintf(buff, "%d", val1); |
displaymodule | 0:3713b01e72fe | 206 | clearResult = true; |
displaymodule | 0:3713b01e72fe | 207 | } |
displaymodule | 0:3713b01e72fe | 208 | break; |
displaymodule | 0:3713b01e72fe | 209 | } |
displaymodule | 0:3713b01e72fe | 210 | buff[strpos] = '\0'; |
displaymodule | 0:3713b01e72fe | 211 | redrawResult = true; |
displaymodule | 0:3713b01e72fe | 212 | } |
displaymodule | 0:3713b01e72fe | 213 | |
displaymodule | 0:3713b01e72fe | 214 | /****************************************************************************** |
displaymodule | 0:3713b01e72fe | 215 | * Main |
displaymodule | 0:3713b01e72fe | 216 | *****************************************************************************/ |
displaymodule | 0:3713b01e72fe | 217 | |
displaymodule | 0:3713b01e72fe | 218 | int main() { |
displaymodule | 0:3713b01e72fe | 219 | uint16_t x = 0; |
displaymodule | 0:3713b01e72fe | 220 | uint16_t y = 0; |
displaymodule | 0:3713b01e72fe | 221 | uint16_t w = tft.width(); |
displaymodule | 0:3713b01e72fe | 222 | uint16_t h = tft.height(); |
displaymodule | 1:9a3ae682a75e | 223 | uint16_t size = (w - (BUTTONS_PER_LINE + 1)*MARGIN)/BUTTONS_PER_LINE; |
displaymodule | 1:9a3ae682a75e | 224 | uint16_t yoff = h - (size + MARGIN)*BUTTONS_NUM_LINES; |
displaymodule | 0:3713b01e72fe | 225 | bool down = false; |
displaymodule | 0:3713b01e72fe | 226 | |
displaymodule | 0:3713b01e72fe | 227 | for (int i = 0; i < NUM_BUTTONS;i++) { |
displaymodule | 1:9a3ae682a75e | 228 | x = MARGIN + (size + MARGIN) * (i % BUTTONS_PER_LINE); |
displaymodule | 1:9a3ae682a75e | 229 | y = yoff + (size + MARGIN) * (i / BUTTONS_PER_LINE); |
displaymodule | 0:3713b01e72fe | 230 | buttons[i] = new Button(captions[i], x, y, size, size); |
displaymodule | 0:3713b01e72fe | 231 | buttons[i]->setAction(handleClick, captions[i][0]); |
displaymodule | 0:3713b01e72fe | 232 | } |
displaymodule | 0:3713b01e72fe | 233 | |
displaymodule | 0:3713b01e72fe | 234 | tft.init(); |
displaymodule | 0:3713b01e72fe | 235 | tft.clearScreen(BRIGHT_RED); |
displaymodule | 0:3713b01e72fe | 236 | tft.fillRectangle(RESULT_MARGIN_X, RESULT_MARGIN_Y, w-RESULT_MARGIN_X, yoff-RESULT_MARGIN_Y, BLACK); |
displaymodule | 0:3713b01e72fe | 237 | touch.init(); |
displaymodule | 0:3713b01e72fe | 238 | |
displaymodule | 0:3713b01e72fe | 239 | for (int i = 0; i < NUM_BUTTONS; i++) { |
displaymodule | 0:3713b01e72fe | 240 | buttons[i]->draw(&tft); |
displaymodule | 0:3713b01e72fe | 241 | } |
displaymodule | 0:3713b01e72fe | 242 | |
displaymodule | 0:3713b01e72fe | 243 | while(true) { |
displaymodule | 0:3713b01e72fe | 244 | touch.readTouchData(x, y, down); |
displaymodule | 0:3713b01e72fe | 245 | |
displaymodule | 2:b17b19212e5a | 246 | /* The following printouts are for some unexplainable reason needed |
displaymodule | 2:b17b19212e5a | 247 | on the LPC4088 QuickStart Board in combination with the MBED online compiler. |
displaymodule | 2:b17b19212e5a | 248 | The printouts are not needed when using an external compiler, e.g. Keil uVision |
displaymodule | 2:b17b19212e5a | 249 | or LPCXpresso IDE. */ |
displaymodule | 2:b17b19212e5a | 250 | #if defined(__LPC407x_8x_177x_8x_H__) |
displaymodule | 2:b17b19212e5a | 251 | if (down) { |
displaymodule | 2:b17b19212e5a | 252 | printf("DOWN %4d, %4d\n", x, y); |
displaymodule | 2:b17b19212e5a | 253 | } else { |
displaymodule | 2:b17b19212e5a | 254 | printf("UP %4d, %4d\n", x, y); |
displaymodule | 2:b17b19212e5a | 255 | } |
displaymodule | 2:b17b19212e5a | 256 | #endif |
displaymodule | 2:b17b19212e5a | 257 | |
displaymodule | 0:3713b01e72fe | 258 | for (int i = 0; i < NUM_BUTTONS; i++) { |
displaymodule | 0:3713b01e72fe | 259 | if (buttons[i]->handle(x, y, down)) { |
displaymodule | 0:3713b01e72fe | 260 | buttons[i]->draw(&tft); |
displaymodule | 0:3713b01e72fe | 261 | } |
displaymodule | 0:3713b01e72fe | 262 | } |
displaymodule | 0:3713b01e72fe | 263 | if (clearResult) { |
displaymodule | 0:3713b01e72fe | 264 | clearResult = false; |
displaymodule | 0:3713b01e72fe | 265 | tft.fillRectangle(RESULT_MARGIN_X, RESULT_MARGIN_Y, w-RESULT_MARGIN_X, yoff-RESULT_MARGIN_Y, BLACK); |
displaymodule | 0:3713b01e72fe | 266 | } |
displaymodule | 0:3713b01e72fe | 267 | if (redrawResult) { |
displaymodule | 0:3713b01e72fe | 268 | redrawResult = false; |
displaymodule | 0:3713b01e72fe | 269 | tft.drawStringCentered(RESULT_MARGIN_X, RESULT_MARGIN_Y, w-RESULT_MARGIN_X, yoff-RESULT_MARGIN_Y, &buff[0]); |
displaymodule | 0:3713b01e72fe | 270 | } |
displaymodule | 0:3713b01e72fe | 271 | wait(0.02); |
displaymodule | 0:3713b01e72fe | 272 | } |
displaymodule | 0:3713b01e72fe | 273 | } |