Libraries and Example of mbed parallel bus using I2C port expanders

Dependencies:   HDSP253X mbed PCF8574_Bus

Committer:
wim
Date:
Fri Aug 26 20:35:11 2011 +0000
Revision:
5:38b853bb1afa
Parent:
4:745fbbd5e4e5
Child:
6:aaefa04f06be
Included Messages to Host

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wim 2:1dab1089c332 1 /* LF28A Simulator - Main
wim 2:1dab1089c332 2 * Copyright (c) 2011 Wim Huiskamp
wim 2:1dab1089c332 3 *
wim 2:1dab1089c332 4 * Released under the MIT License: http://mbed.org/license/mit
wim 2:1dab1089c332 5 *
wim 2:1dab1089c332 6 * version 0.2 Initial Release
wim 2:1dab1089c332 7 */
wim 2:1dab1089c332 8 #include "mbed.h"
wim 2:1dab1089c332 9 #include "BusDefines.h"
wim 2:1dab1089c332 10 #include "PCF8574_DataBus.h"
wim 2:1dab1089c332 11 #include "PCF8574_AddressBus.h"
wim 2:1dab1089c332 12 #include "PCF8574_EnableBus.h"
wim 2:1dab1089c332 13 #include "MBED_ControlBus.h"
wim 2:1dab1089c332 14 #include "HDSP253X_Display.h"
wim 2:1dab1089c332 15 #include "Status_Display.h"
wim 2:1dab1089c332 16 #include "Keyboard.h"
wim 2:1dab1089c332 17 #include "STANAG_Codes.h"
wim 5:38b853bb1afa 18 #include "Host_Coms.h"
wim 2:1dab1089c332 19
wim 2:1dab1089c332 20 // Debug stuff
wim 2:1dab1089c332 21 #define __DEBUG
wim 2:1dab1089c332 22 #include "Dbg.h"
wim 2:1dab1089c332 23
wim 5:38b853bb1afa 24 //#define __TESTCODE
wim 2:1dab1089c332 25
wim 2:1dab1089c332 26
wim 2:1dab1089c332 27 // Software version
wim 2:1dab1089c332 28 #define LF28A_SOFTWARE_DESCRIPTOR "LF28A Testsoftware"
wim 2:1dab1089c332 29 #define LF28A_SW_VERSION_MAJOR 0
wim 2:1dab1089c332 30 #define LF28A_SW_VERSION_MINOR 2
wim 2:1dab1089c332 31 #define LF28A_COPYRIGHT_DESCRIPTOR "(C)TNO 2011"
wim 2:1dab1089c332 32
wim 5:38b853bb1afa 33 // Laser Time-out in Seconds
wim 5:38b853bb1afa 34 //#define LF28A_RANGE_TIME_OUT_S 1
wim 5:38b853bb1afa 35 //#define LF28A_DESIG_TIME_OUT_S (3*60 + 20)
wim 5:38b853bb1afa 36 //Test only:
wim 5:38b853bb1afa 37 #define LF28A_RANGE_TIME_OUT_S 5
wim 5:38b853bb1afa 38 #define LF28A_DESIG_TIME_OUT_S 10
wim 5:38b853bb1afa 39
wim 2:1dab1089c332 40 // mbed Interface Hardware definitions
wim 2:1dab1089c332 41 DigitalOut myled1(LED1);
wim 2:1dab1089c332 42 DigitalOut myled2(LED2);
wim 2:1dab1089c332 43 DigitalOut myled3(LED3);
wim 2:1dab1089c332 44 DigitalOut heartbeatLED(LED4);
wim 2:1dab1089c332 45
wim 5:38b853bb1afa 46 // Host PC Communication channels
wim 2:1dab1089c332 47 Serial pc(USBTX, USBRX);
wim 5:38b853bb1afa 48 Host_Coms host_coms(pc);
wim 2:1dab1089c332 49
wim 5:38b853bb1afa 50 //I2C Bus
wim 2:1dab1089c332 51 I2C i2c(D_SDA, D_SCL);
wim 2:1dab1089c332 52
wim 2:1dab1089c332 53 // CDA Interface Hardware definitions
wim 2:1dab1089c332 54 PCF8574_DataBus databus = PCF8574_DataBus(i2c, D_I2C_DATA_BUS); //Copy constructors..
wim 2:1dab1089c332 55 PCF8574_AddressBus addressbus = PCF8574_AddressBus(i2c, D_I2C_ADDR_BUS);
wim 2:1dab1089c332 56 PCF8574_EnableBus enablebus = PCF8574_EnableBus(i2c, D_I2C_ENA_BUS);
wim 2:1dab1089c332 57 MBED_ControlBus controlbus = MBED_ControlBus(D_WR, D_RD, D_DTR, D_CDBUF, D_CDINT, D_FIRE);
wim 2:1dab1089c332 58
wim 2:1dab1089c332 59 // CDA Hardware definitions
wim 2:1dab1089c332 60 HDSP253X_Display LF28A_display = HDSP253X_Display(databus, addressbus, enablebus, controlbus);
wim 2:1dab1089c332 61 Status_Display LF28A_status = Status_Display(databus, enablebus, controlbus);
wim 2:1dab1089c332 62 Keyboard LF28A_keyboard = Keyboard(databus, enablebus, controlbus);
wim 2:1dab1089c332 63
wim 2:1dab1089c332 64
wim 2:1dab1089c332 65 //Enums for LF28A Statemachines
wim 2:1dab1089c332 66 enum Mode { IDLE,
wim 2:1dab1089c332 67 INIT_ENTRY, INIT, INIT_EXIT,
wim 2:1dab1089c332 68 DESIG_ENTRY, DESIG_DISP, DESIG_LASER, DESIG_EXIT,
wim 2:1dab1089c332 69 RANGE_ENTRY, RANGE_DISP, RANGE_FIRE, RANGE_EXIT,
wim 2:1dab1089c332 70 CODE_ENTRY, CODE_DISP, CODE_EDIT, CODE_EXIT,
wim 2:1dab1089c332 71 ADDR_ENTRY, ADDR, ADDR_EXIT,
wim 2:1dab1089c332 72 FREQ_ENTRY, FREQ, FREQ_EXIT,
wim 2:1dab1089c332 73 PATH_ENTRY, PATH, PATH_EXIT };
wim 2:1dab1089c332 74
wim 2:1dab1089c332 75 enum RangeSelect { RNG_F, RNG_L };
wim 2:1dab1089c332 76
wim 5:38b853bb1afa 77 enum MessageToHost { LFPON, LFRDY_0, LFRDY_1, LFSTA_D, LFSTA_R, LFSTA_C, LFSTA_A, LFSTA_F, LFSTA_P, LFIDL };
wim 5:38b853bb1afa 78 //enum MessageToHost { LFPON, LFRDY_0, LFRDY_1, LFSTA, LFIDL };
wim 2:1dab1089c332 79 enum MessageFromHost { LFRES, LFRNG };
wim 2:1dab1089c332 80
wim 2:1dab1089c332 81 //Typedef for Laser Range finder data
wim 2:1dab1089c332 82 typedef struct {
wim 2:1dab1089c332 83 uint16_t first;
wim 2:1dab1089c332 84 uint16_t last;
wim 2:1dab1089c332 85 RangeSelect select;
wim 2:1dab1089c332 86 } Range_t;
wim 2:1dab1089c332 87
wim 2:1dab1089c332 88 // Variables for Statemachine
wim 2:1dab1089c332 89 Mode mode;
wim 2:1dab1089c332 90 Brightness brightness, graticule;
wim 2:1dab1089c332 91 Key_Code keycode;
wim 2:1dab1089c332 92 Range_t range;
wim 5:38b853bb1afa 93 bool laser; // Laser On/Off
wim 2:1dab1089c332 94 bool hostResetCmd;
wim 2:1dab1089c332 95 MessageToHost messageToHost;
wim 2:1dab1089c332 96 STANAG_Codes STANAG_codes;
wim 2:1dab1089c332 97
wim 2:1dab1089c332 98 // Variables for Heartbeat and Status monitoring
wim 2:1dab1089c332 99 Ticker heartbeat;
wim 2:1dab1089c332 100 bool heartbeatflag=false;
wim 2:1dab1089c332 101
wim 5:38b853bb1afa 102 // Laser Time-out
wim 5:38b853bb1afa 103 Timer timer;
wim 5:38b853bb1afa 104
wim 5:38b853bb1afa 105 // Cycle Timer
wim 5:38b853bb1afa 106 Timer cycletimer;
wim 5:38b853bb1afa 107 int cyclecount = 0;
wim 5:38b853bb1afa 108 const int maxcount = 1000000;
wim 2:1dab1089c332 109
wim 2:1dab1089c332 110 // Local functions
wim 2:1dab1089c332 111 void clear_screen() {
wim 2:1dab1089c332 112 //ANSI Terminal Commands
wim 2:1dab1089c332 113 pc.printf("\x1B[2J");
wim 2:1dab1089c332 114 pc.printf("\x1B[H");
wim 2:1dab1089c332 115 }
wim 2:1dab1089c332 116
wim 2:1dab1089c332 117 void version_string() {
wim 2:1dab1089c332 118 pc.printf("\r\r");
wim 2:1dab1089c332 119 pc.printf("%s\r", LF28A_SOFTWARE_DESCRIPTOR);
wim 2:1dab1089c332 120 pc.printf("Version v%1d.%1d\r", LF28A_SW_VERSION_MAJOR, LF28A_SW_VERSION_MINOR);
wim 2:1dab1089c332 121 pc.printf("Build on %s at %s\r", __DATE__, __TIME__);
wim 2:1dab1089c332 122 pc.printf("%s\r", LF28A_COPYRIGHT_DESCRIPTOR);
wim 2:1dab1089c332 123 pc.printf("\r\n");
wim 2:1dab1089c332 124 }
wim 2:1dab1089c332 125
wim 2:1dab1089c332 126 void init_interfaces() {
wim 2:1dab1089c332 127 // Init Host PC communication, default is 9600
wim 2:1dab1089c332 128 pc.baud(D_BAUDRATE);
wim 2:1dab1089c332 129
wim 2:1dab1089c332 130 // Init LF28A CDA I/F hardware
wim 2:1dab1089c332 131 i2c.frequency(100000);
wim 2:1dab1089c332 132 // pc.printf("SCL0 H, L = 0x%x, 0x%x\r", LPC_I2C0->I2SCLH, LPC_I2C0->I2SCLL);
wim 2:1dab1089c332 133 // pc.printf("SCL1 H, L = 0x%x, 0x%x\r", LPC_I2C1->I2SCLH, LPC_I2C1->I2SCLL);
wim 2:1dab1089c332 134 // pc.printf("SCL2 H, L = 0x%x, 0x%x\r", LPC_I2C2->I2SCLH, LPC_I2C2->I2SCLL);
wim 2:1dab1089c332 135
wim 2:1dab1089c332 136 // Reset LF28A CDA
wim 2:1dab1089c332 137 // NOTE: On LF28A CDA the Reset* pin is connected to the Display and to the Latches.
wim 2:1dab1089c332 138 // That implies they are all reset when the Reset* pin is used !
wim 2:1dab1089c332 139 enablebus.reset(LOW);
wim 2:1dab1089c332 140 wait_ms(50);
wim 2:1dab1089c332 141 enablebus.reset(HIGH);
wim 2:1dab1089c332 142
wim 2:1dab1089c332 143 //Done, Tell me about it
wim 2:1dab1089c332 144 myled1 = 1;
wim 2:1dab1089c332 145 DBG("Init Interfaces Done, Main, Step = %d\r", 10);
wim 2:1dab1089c332 146 }
wim 5:38b853bb1afa 147
wim 5:38b853bb1afa 148 void BITE() {
wim 5:38b853bb1afa 149 int count;
wim 5:38b853bb1afa 150
wim 5:38b853bb1afa 151 LF28A_status.set_brightness(BRT_MED);
wim 5:38b853bb1afa 152 LF28A_status.NoGo(LED_ON);
wim 5:38b853bb1afa 153
wim 5:38b853bb1afa 154 for (count=0; count<5; count++) {
wim 5:38b853bb1afa 155 LF28A_display.locate(0);
wim 5:38b853bb1afa 156 LF28A_display.printf("BITE - ");
wim 5:38b853bb1afa 157 LF28A_display.locate(0);
wim 5:38b853bb1afa 158 LF28A_display.printf("BITE \ ");
wim 5:38b853bb1afa 159 LF28A_display.locate(0);
wim 5:38b853bb1afa 160 LF28A_display.printf("BITE | ");
wim 5:38b853bb1afa 161 LF28A_display.locate(0);
wim 5:38b853bb1afa 162 LF28A_display.printf("BITE / ");
wim 5:38b853bb1afa 163 LF28A_display.locate(0);
wim 5:38b853bb1afa 164 LF28A_display.printf("BITE - ");
wim 5:38b853bb1afa 165 };
wim 2:1dab1089c332 166
wim 5:38b853bb1afa 167 LF28A_display.locate(0);
wim 5:38b853bb1afa 168 LF28A_display.printf("BITE OK");
wim 5:38b853bb1afa 169 LF28A_status.NoGo(LED_OFF);
wim 5:38b853bb1afa 170
wim 5:38b853bb1afa 171 wait(2.0);
wim 5:38b853bb1afa 172
wim 5:38b853bb1afa 173 LF28A_display.cls();
wim 5:38b853bb1afa 174 // LF28A_status.set_brightness(D_STATUS_LED_BRIGHT_OFF);
wim 5:38b853bb1afa 175
wim 5:38b853bb1afa 176 //Done, Tell me about it
wim 5:38b853bb1afa 177 DBG("BITE Done, Main, Step = %d\r", 30);
wim 5:38b853bb1afa 178 }
wim 2:1dab1089c332 179
wim 2:1dab1089c332 180 void lamp_test() {
wim 2:1dab1089c332 181 LF28A_status.set_brightness(BRT_LOW);
wim 2:1dab1089c332 182 LF28A_status.lamptest(LED_ON); // All LEDs On, including Backlight and NoGo
wim 2:1dab1089c332 183
wim 2:1dab1089c332 184 LF28A_display.locate(0);
wim 2:1dab1089c332 185 LF28A_display.printf("XXXXXXXX");
wim 2:1dab1089c332 186
wim 2:1dab1089c332 187 wait(2.0);
wim 2:1dab1089c332 188
wim 2:1dab1089c332 189 LF28A_status.lamptest(LED_OFF); // All LEDs Off, including Backlight and NoGo
wim 2:1dab1089c332 190
wim 2:1dab1089c332 191 LF28A_display.cls();
wim 2:1dab1089c332 192 // LF28A_status.set_brightness(D_STATUS_LED_BRIGHT_OFF);
wim 2:1dab1089c332 193
wim 2:1dab1089c332 194 //Done, Tell me about it
wim 5:38b853bb1afa 195 //DBG("Lamp Test Done, Main, Step = %d\r", 20);
wim 2:1dab1089c332 196 }
wim 2:1dab1089c332 197
wim 2:1dab1089c332 198
wim 2:1dab1089c332 199 void init_state() {
wim 2:1dab1089c332 200 // Default modes and settings after Power On or Host Reset
wim 2:1dab1089c332 201 brightness = BRT_LOW; // Should be BRT_OFF, but then you dont see anything..
wim 2:1dab1089c332 202 graticule = BRT_LOW; // Should be BRT_OFF, but then you dont see anything..
wim 2:1dab1089c332 203
wim 2:1dab1089c332 204 range.last = 0;
wim 2:1dab1089c332 205 range.first = 0;
wim 2:1dab1089c332 206 range.select = RNG_F;
wim 2:1dab1089c332 207
wim 4:745fbbd5e4e5 208 laser = false;
wim 5:38b853bb1afa 209 timer.stop();
wim 5:38b853bb1afa 210 timer.reset();
wim 4:745fbbd5e4e5 211
wim 2:1dab1089c332 212 // Read Config File if needed..
wim 2:1dab1089c332 213 // Reload STANAG Codes ?
wim 2:1dab1089c332 214 STANAG_codes.setCodeIdx(0);
wim 2:1dab1089c332 215 STANAG_codes.setDigitIdx(0);
wim 2:1dab1089c332 216
wim 2:1dab1089c332 217 // Init Status LEDs
wim 2:1dab1089c332 218 LF28A_status.lamptest(LED_OFF); // All LEDs off
wim 2:1dab1089c332 219 LF28A_status.backlight(LED_ON);
wim 2:1dab1089c332 220 LF28A_status.set_brightness(brightness);
wim 2:1dab1089c332 221
wim 2:1dab1089c332 222 // Init Alphanumeric Display
wim 3:3fbfdec782f4 223 LF28A_display.cls(); // Clear display and Cursor home
wim 5:38b853bb1afa 224 LF28A_display.set_flash_mode(false); // Disable flashing digits
wim 2:1dab1089c332 225
wim 2:1dab1089c332 226 //Done, Tell me about it
wim 5:38b853bb1afa 227 //DBG("Init Done, Originator = %d\r", hostResetCmd);
wim 2:1dab1089c332 228 }
wim 2:1dab1089c332 229
wim 2:1dab1089c332 230
wim 2:1dab1089c332 231 void grat_bright_selector() {
wim 2:1dab1089c332 232 int result;
wim 2:1dab1089c332 233
wim 2:1dab1089c332 234 switch (graticule) {
wim 2:1dab1089c332 235 case BRT_OFF : graticule = BRT_LOW;
wim 2:1dab1089c332 236 break;
wim 2:1dab1089c332 237 case BRT_LOW : graticule = BRT_MED;
wim 2:1dab1089c332 238 break;
wim 2:1dab1089c332 239 case BRT_MED : graticule = BRT_HIGH;
wim 2:1dab1089c332 240 break;
wim 2:1dab1089c332 241 case BRT_HIGH : graticule = BRT_OFF;
wim 2:1dab1089c332 242 break;
wim 2:1dab1089c332 243 default: // Oops, we should never end up here....
wim 2:1dab1089c332 244 graticule = BRT_LOW;
wim 2:1dab1089c332 245 result = -1;
wim 2:1dab1089c332 246 break;
wim 2:1dab1089c332 247 } //end switch
wim 2:1dab1089c332 248
wim 2:1dab1089c332 249 //Done, Tell me about it
wim 5:38b853bb1afa 250 //DBG("Grat Bright Chnge, val = %d\r", graticule);
wim 2:1dab1089c332 251 }
wim 2:1dab1089c332 252
wim 2:1dab1089c332 253 void disp_bright_selector() {
wim 2:1dab1089c332 254 int result;
wim 2:1dab1089c332 255
wim 2:1dab1089c332 256 switch (brightness) {
wim 2:1dab1089c332 257 case BRT_OFF : brightness = BRT_LOW;
wim 2:1dab1089c332 258 LF28A_status.set_brightness(BRT_LOW);
wim 2:1dab1089c332 259 break;
wim 2:1dab1089c332 260 case BRT_LOW : brightness = BRT_MED;
wim 2:1dab1089c332 261 LF28A_status.set_brightness(BRT_MED);
wim 2:1dab1089c332 262 break;
wim 2:1dab1089c332 263 case BRT_MED : brightness = BRT_HIGH;
wim 2:1dab1089c332 264 LF28A_status.set_brightness(BRT_HIGH);
wim 2:1dab1089c332 265 break;
wim 2:1dab1089c332 266 case BRT_HIGH : brightness = BRT_OFF;
wim 2:1dab1089c332 267 LF28A_status.set_brightness(BRT_OFF);
wim 2:1dab1089c332 268 break;
wim 2:1dab1089c332 269 default: // Oops, we should never end up here....
wim 2:1dab1089c332 270 brightness = BRT_LOW;
wim 2:1dab1089c332 271 LF28A_status.set_brightness(BRT_LOW);
wim 2:1dab1089c332 272 result = -1;
wim 2:1dab1089c332 273 break;
wim 2:1dab1089c332 274 } //end switch
wim 2:1dab1089c332 275
wim 2:1dab1089c332 276 //Done, Tell me about it
wim 5:38b853bb1afa 277 //DBG("Disp Bright Chng, val = %d\r", brightness);
wim 2:1dab1089c332 278 }
wim 2:1dab1089c332 279
wim 2:1dab1089c332 280 void range_selector() {
wim 2:1dab1089c332 281 int result;
wim 2:1dab1089c332 282
wim 2:1dab1089c332 283 switch (range.select) {
wim 2:1dab1089c332 284 case RNG_F : range.select = RNG_L;
wim 2:1dab1089c332 285 break;
wim 2:1dab1089c332 286 case RNG_L : range.select = RNG_F;
wim 2:1dab1089c332 287 break;
wim 2:1dab1089c332 288 default: // Oops, we should never end up here....
wim 2:1dab1089c332 289 range.select = RNG_F;
wim 2:1dab1089c332 290 result = -1;
wim 2:1dab1089c332 291 break;
wim 2:1dab1089c332 292 } //end switch
wim 2:1dab1089c332 293
wim 2:1dab1089c332 294 //Done, Tell me about it
wim 5:38b853bb1afa 295 //DBG("Rng Chng, val = %d\r", range.select);
wim 2:1dab1089c332 296 }
wim 2:1dab1089c332 297
wim 2:1dab1089c332 298 // Heartbeat monitor
wim 2:1dab1089c332 299 void pulse() {
wim 2:1dab1089c332 300 heartbeatLED = !heartbeatLED;
wim 2:1dab1089c332 301 }
wim 2:1dab1089c332 302
wim 2:1dab1089c332 303 void heartbeat_start() {
wim 2:1dab1089c332 304 heartbeat.attach(&pulse, 0.5);
wim 2:1dab1089c332 305 heartbeatflag = true;
wim 2:1dab1089c332 306 }
wim 2:1dab1089c332 307
wim 2:1dab1089c332 308 void heartbeat_stop() {
wim 2:1dab1089c332 309 heartbeat.detach();
wim 2:1dab1089c332 310 heartbeatflag = false;
wim 2:1dab1089c332 311 }
wim 2:1dab1089c332 312
wim 5:38b853bb1afa 313 // Construct and Send messages to Host PC. Need to complete this !!
wim 5:38b853bb1afa 314 void SendHostMessage(MessageToHost messageToHost) {
wim 5:38b853bb1afa 315 int result;
wim 5:38b853bb1afa 316
wim 5:38b853bb1afa 317 switch (messageToHost) {
wim 5:38b853bb1afa 318 case LFPON: host_coms.sendMessage("$LFPON");
wim 5:38b853bb1afa 319 break;
wim 5:38b853bb1afa 320
wim 5:38b853bb1afa 321 case LFRDY_0: // No hostResetCmd
wim 5:38b853bb1afa 322 host_coms.sendMessage("$LFRDY,0");
wim 5:38b853bb1afa 323 //pc.printf("$LFRDY,0*00\r\n");
wim 5:38b853bb1afa 324 break;
wim 5:38b853bb1afa 325
wim 5:38b853bb1afa 326 case LFRDY_1: // hostResetCmd
wim 5:38b853bb1afa 327 host_coms.sendMessage("$LFRDY,1");
wim 5:38b853bb1afa 328 // pc.printf("$LFRDY,1*00\r\n");
wim 5:38b853bb1afa 329 break;
wim 5:38b853bb1afa 330
wim 5:38b853bb1afa 331 case LFSTA_D: // Designate
wim 5:38b853bb1afa 332 host_coms.sendMessage("$LFSTA,D,%1d,%04d,%1d", laser, STANAG_codes.getCode(), graticule);
wim 5:38b853bb1afa 333 // pc.printf("$LFSTA,D,0,1234,1*00\r\n");
wim 5:38b853bb1afa 334 break;
wim 5:38b853bb1afa 335
wim 5:38b853bb1afa 336 case LFSTA_R: // Range
wim 5:38b853bb1afa 337 host_coms.sendMessage("$LFSTA,R,%1d,%04d,%1d", laser, STANAG_codes.getCode(), graticule);
wim 5:38b853bb1afa 338 // pc.printf("$LFSTA,D,0,1234,1*00\r\n");
wim 5:38b853bb1afa 339 break;
wim 5:38b853bb1afa 340
wim 5:38b853bb1afa 341 case LFSTA_C: // Code
wim 5:38b853bb1afa 342 host_coms.sendMessage("$LFSTA,C,%1d,%04d,%1d", laser, STANAG_codes.getCode(), graticule);
wim 5:38b853bb1afa 343 // pc.printf("$LFSTA,D,0,1234,1*00\r\n");
wim 5:38b853bb1afa 344 break;
wim 5:38b853bb1afa 345
wim 5:38b853bb1afa 346 case LFSTA_A:
wim 5:38b853bb1afa 347 case LFSTA_F:
wim 5:38b853bb1afa 348 case LFSTA_P:
wim 5:38b853bb1afa 349 case LFIDL: // No Message
wim 5:38b853bb1afa 350 break;
wim 5:38b853bb1afa 351
wim 5:38b853bb1afa 352 default: // Oops, we should never end up here....
wim 5:38b853bb1afa 353
wim 5:38b853bb1afa 354 result = -1;
wim 5:38b853bb1afa 355 break;
wim 5:38b853bb1afa 356 } //end switch
wim 5:38b853bb1afa 357
wim 5:38b853bb1afa 358 //Done, Tell me about it
wim 5:38b853bb1afa 359 //DBG("To Host Msg, type = %d\r", messageToHost);
wim 5:38b853bb1afa 360 }
wim 5:38b853bb1afa 361
wim 5:38b853bb1afa 362
wim 2:1dab1089c332 363 //------------------------------------------------------------//
wim 2:1dab1089c332 364 // Testing Stuff //
wim 2:1dab1089c332 365 //------------------------------------------------------------//
wim 2:1dab1089c332 366 #ifdef __TESTCODE
wim 2:1dab1089c332 367 #include "Testloop.h"
wim 2:1dab1089c332 368 #endif
wim 2:1dab1089c332 369 //------------------------------------------------------------//
wim 2:1dab1089c332 370 // End Testing Stuff //
wim 2:1dab1089c332 371 //------------------------------------------------------------//
wim 2:1dab1089c332 372
wim 2:1dab1089c332 373
wim 2:1dab1089c332 374 int main() {
wim 2:1dab1089c332 375 int address, result;
wim 2:1dab1089c332 376
wim 2:1dab1089c332 377 init_interfaces();
wim 2:1dab1089c332 378
wim 2:1dab1089c332 379 heartbeat_start();
wim 2:1dab1089c332 380
wim 2:1dab1089c332 381 clear_screen();
wim 5:38b853bb1afa 382 version_string();
wim 2:1dab1089c332 383
wim 3:3fbfdec782f4 384 #ifndef __TESTCODE
wim 2:1dab1089c332 385 lamp_test();
wim 2:1dab1089c332 386
wim 2:1dab1089c332 387 BITE();
wim 2:1dab1089c332 388
wim 2:1dab1089c332 389 DBG("Start Main Loop, Step = %d\r", 50);
wim 2:1dab1089c332 390
wim 2:1dab1089c332 391 // Prepare main State Machine
wim 2:1dab1089c332 392 mode = INIT_ENTRY; // Start with Init
wim 2:1dab1089c332 393 hostResetCmd = false; // Start with regular PowerOn reset
wim 3:3fbfdec782f4 394
wim 5:38b853bb1afa 395 //Test cycletime
wim 5:38b853bb1afa 396 cycletimer.start();
wim 5:38b853bb1afa 397 cycletimer.reset();
wim 5:38b853bb1afa 398
wim 2:1dab1089c332 399 // Main Controlloop:
wim 2:1dab1089c332 400 // Check keyboard input and respond as required in the current device mode
wim 2:1dab1089c332 401 // Check Host commands and respond as required
wim 2:1dab1089c332 402 while(1) {
wim 2:1dab1089c332 403
wim 2:1dab1089c332 404 // Handle mode statemachine
wim 2:1dab1089c332 405 switch (mode) {
wim 2:1dab1089c332 406
wim 2:1dab1089c332 407 // INIT MODEs - Init LF28A after Power On or Host Reset
wim 2:1dab1089c332 408 case INIT_ENTRY: // Transitional state
wim 2:1dab1089c332 409 mode = INIT;
wim 2:1dab1089c332 410 break;
wim 2:1dab1089c332 411
wim 2:1dab1089c332 412 case INIT: // Init LF28A after Power On or Host Reset
wim 2:1dab1089c332 413 init_state();
wim 2:1dab1089c332 414
wim 2:1dab1089c332 415 // Inform Host that Init has completed
wim 5:38b853bb1afa 416 if (hostResetCmd) {
wim 5:38b853bb1afa 417 // Host initiated a Reset
wim 5:38b853bb1afa 418 SendHostMessage(LFRDY_1);
wim 5:38b853bb1afa 419 hostResetCmd = false;
wim 3:3fbfdec782f4 420 }
wim 3:3fbfdec782f4 421 else {
wim 5:38b853bb1afa 422 // Regular PowerOn Reset
wim 5:38b853bb1afa 423 SendHostMessage(LFRDY_0);
wim 3:3fbfdec782f4 424 }
wim 3:3fbfdec782f4 425
wim 2:1dab1089c332 426 mode = INIT_EXIT;
wim 2:1dab1089c332 427 break;
wim 2:1dab1089c332 428
wim 2:1dab1089c332 429 case INIT_EXIT: // Transitional state
wim 2:1dab1089c332 430 mode = DESIG_ENTRY;
wim 2:1dab1089c332 431 break;
wim 2:1dab1089c332 432
wim 2:1dab1089c332 433 // DESIG MODEs - Laser Designator
wim 2:1dab1089c332 434 case DESIG_ENTRY: // Transitional state
wim 2:1dab1089c332 435
wim 3:3fbfdec782f4 436 // Status LEDs
wim 3:3fbfdec782f4 437 LF28A_status.LED(LED_DESIG, LED_ON);
wim 3:3fbfdec782f4 438
wim 2:1dab1089c332 439 //Display current STANAG Code
wim 4:745fbbd5e4e5 440 LF28A_display.locate (0);
wim 4:745fbbd5e4e5 441 LF28A_display.printf (" %04d",STANAG_codes.getCode() );
wim 2:1dab1089c332 442
wim 2:1dab1089c332 443 // Inform Host of change
wim 5:38b853bb1afa 444 SendHostMessage(LFSTA_D);
wim 2:1dab1089c332 445
wim 2:1dab1089c332 446 mode = DESIG_DISP;
wim 2:1dab1089c332 447 break;
wim 2:1dab1089c332 448
wim 2:1dab1089c332 449 case DESIG_DISP:
wim 2:1dab1089c332 450 // Check and handle Keyboard
wim 2:1dab1089c332 451 if (LF28A_keyboard.readable()) {
wim 2:1dab1089c332 452 keycode = LF28A_keyboard.getkey();
wim 2:1dab1089c332 453
wim 2:1dab1089c332 454 switch (keycode) {
wim 2:1dab1089c332 455 case KEY_GRAT_RT: grat_bright_selector();
wim 2:1dab1089c332 456 // Inform Host of change
wim 5:38b853bb1afa 457 SendHostMessage(LFSTA_D);
wim 2:1dab1089c332 458 break;
wim 2:1dab1089c332 459
wim 2:1dab1089c332 460 case KEY_BRIGHT: disp_bright_selector();
wim 2:1dab1089c332 461 break;
wim 2:1dab1089c332 462
wim 2:1dab1089c332 463 case KEY_MODE: mode = DESIG_EXIT;
wim 5:38b853bb1afa 464 break;
wim 5:38b853bb1afa 465
wim 5:38b853bb1afa 466 case KEY_FIRE: // Check and handle Fire key
wim 5:38b853bb1afa 467
wim 5:38b853bb1afa 468 // Toggle Laser On/Off
wim 5:38b853bb1afa 469 if (laser) {
wim 5:38b853bb1afa 470 // Laser is On, Switch Off
wim 5:38b853bb1afa 471 laser=false;
wim 5:38b853bb1afa 472 timer.stop(); // Stop time-out timer
wim 5:38b853bb1afa 473 timer.reset();
wim 5:38b853bb1afa 474
wim 5:38b853bb1afa 475 // Status LEDs
wim 5:38b853bb1afa 476 LF28A_status.LED(LED_LASER, LED_OFF);
wim 5:38b853bb1afa 477 }
wim 5:38b853bb1afa 478 else {
wim 5:38b853bb1afa 479 // Laser is Off, Switch On
wim 5:38b853bb1afa 480 laser=true;
wim 5:38b853bb1afa 481 timer.start(); // Start time-out timer
wim 5:38b853bb1afa 482
wim 5:38b853bb1afa 483 // Status LEDs
wim 5:38b853bb1afa 484 LF28A_status.LED(LED_LASER, LED_ON);
wim 5:38b853bb1afa 485 };
wim 5:38b853bb1afa 486
wim 5:38b853bb1afa 487 // Inform Host of change (laser on/off)
wim 5:38b853bb1afa 488 SendHostMessage(LFSTA_D);
wim 5:38b853bb1afa 489
wim 2:1dab1089c332 490 break;
wim 5:38b853bb1afa 491
wim 2:1dab1089c332 492
wim 2:1dab1089c332 493 default: // Ignore other keys
wim 2:1dab1089c332 494 break;
wim 2:1dab1089c332 495 }; //End Keyswitch
wim 2:1dab1089c332 496 }; // End Keyread
wim 2:1dab1089c332 497
wim 5:38b853bb1afa 498 // Check Automatic Time-out for Laser
wim 5:38b853bb1afa 499 if (laser) {
wim 5:38b853bb1afa 500 // Laser is On, Test Time-out to Switch Off
wim 5:38b853bb1afa 501 if (timer.read() > LF28A_DESIG_TIME_OUT_S) {
wim 5:38b853bb1afa 502 laser=false; // Laser Off
wim 5:38b853bb1afa 503 timer.stop(); // Stop time-out timer
wim 5:38b853bb1afa 504 timer.reset();
wim 2:1dab1089c332 505
wim 5:38b853bb1afa 506 // Status LEDs
wim 5:38b853bb1afa 507 LF28A_status.LED(LED_LASER, LED_OFF);
wim 5:38b853bb1afa 508
wim 5:38b853bb1afa 509 // Inform Host of change (laser off)
wim 5:38b853bb1afa 510 SendHostMessage(LFSTA_D);
wim 5:38b853bb1afa 511 }
wim 5:38b853bb1afa 512 };
wim 5:38b853bb1afa 513
wim 2:1dab1089c332 514 break;
wim 2:1dab1089c332 515
wim 2:1dab1089c332 516 case DESIG_EXIT: // Transitional state
wim 5:38b853bb1afa 517
wim 5:38b853bb1afa 518 // Check Laser
wim 5:38b853bb1afa 519 if (laser) {
wim 5:38b853bb1afa 520 // Laser is On, Switch Off
wim 5:38b853bb1afa 521 laser=false; // Laser Off
wim 5:38b853bb1afa 522 timer.stop(); // Stop time-out timer
wim 5:38b853bb1afa 523 timer.reset();
wim 5:38b853bb1afa 524
wim 5:38b853bb1afa 525 // Status LEDs
wim 5:38b853bb1afa 526 LF28A_status.LED(LED_LASER, LED_OFF);
wim 5:38b853bb1afa 527 };
wim 2:1dab1089c332 528
wim 3:3fbfdec782f4 529 // Status LEDs
wim 3:3fbfdec782f4 530 LF28A_status.LED(LED_DESIG, LED_OFF);
wim 3:3fbfdec782f4 531
wim 2:1dab1089c332 532 mode = RANGE_ENTRY;
wim 2:1dab1089c332 533 break;
wim 2:1dab1089c332 534
wim 2:1dab1089c332 535 // RANGE MODEs
wim 2:1dab1089c332 536 case RANGE_ENTRY: // Transitional state
wim 2:1dab1089c332 537
wim 3:3fbfdec782f4 538 // Status LEDs
wim 3:3fbfdec782f4 539 LF28A_status.LED(LED_RANGE, LED_ON);
wim 3:3fbfdec782f4 540
wim 4:745fbbd5e4e5 541 //Display current STANAG Code ...Is this correct on entry ??
wim 4:745fbbd5e4e5 542 LF28A_display.locate (0);
wim 4:745fbbd5e4e5 543 LF28A_display.printf (" %04d",STANAG_codes.getCode() );
wim 2:1dab1089c332 544
wim 2:1dab1089c332 545 // Inform Host of change
wim 5:38b853bb1afa 546 SendHostMessage(LFSTA_R);
wim 2:1dab1089c332 547
wim 2:1dab1089c332 548 mode = RANGE_DISP;
wim 2:1dab1089c332 549 break;
wim 2:1dab1089c332 550
wim 2:1dab1089c332 551 case RANGE_DISP:
wim 2:1dab1089c332 552 // Check and handle Keyboard
wim 2:1dab1089c332 553 if (LF28A_keyboard.readable()) {
wim 2:1dab1089c332 554 keycode = LF28A_keyboard.getkey();
wim 2:1dab1089c332 555
wim 2:1dab1089c332 556 switch (keycode) {
wim 2:1dab1089c332 557 case KEY_GRAT_RT: grat_bright_selector();
wim 2:1dab1089c332 558
wim 2:1dab1089c332 559 // Inform Host of change
wim 5:38b853bb1afa 560 SendHostMessage(LFSTA_R);
wim 2:1dab1089c332 561
wim 2:1dab1089c332 562 break;
wim 2:1dab1089c332 563
wim 2:1dab1089c332 564 case KEY_BRIGHT: disp_bright_selector();
wim 2:1dab1089c332 565 break;
wim 2:1dab1089c332 566
wim 2:1dab1089c332 567 case KEY_MODE: mode = RANGE_EXIT;
wim 2:1dab1089c332 568 break;
wim 4:745fbbd5e4e5 569
wim 4:745fbbd5e4e5 570 case KEY_F_L_UP : //Toggle First/Last
wim 4:745fbbd5e4e5 571 range_selector();
wim 4:745fbbd5e4e5 572
wim 4:745fbbd5e4e5 573 //Display current Range
wim 4:745fbbd5e4e5 574 if (range.select == RNG_F) {
wim 4:745fbbd5e4e5 575 LF28A_display.locate (0);
wim 4:745fbbd5e4e5 576 LF28A_display.printf ("F %04d", range.first );
wim 4:745fbbd5e4e5 577 }
wim 4:745fbbd5e4e5 578 else {
wim 4:745fbbd5e4e5 579 LF28A_display.locate (0);
wim 5:38b853bb1afa 580 LF28A_display.printf ("L %04d", range.last);
wim 4:745fbbd5e4e5 581 };
wim 4:745fbbd5e4e5 582
wim 4:745fbbd5e4e5 583 // Inform Host of change ??
wim 4:745fbbd5e4e5 584 //SendHostMessage(LFSTA);
wim 4:745fbbd5e4e5 585
wim 4:745fbbd5e4e5 586 break;
wim 4:745fbbd5e4e5 587
wim 4:745fbbd5e4e5 588 case KEY_FIRE: // Check and handle Fire key
wim 4:745fbbd5e4e5 589
wim 4:745fbbd5e4e5 590 // Toggle Laser On/Off
wim 4:745fbbd5e4e5 591 if (laser) {
wim 4:745fbbd5e4e5 592 // Laser is On, Switch Off
wim 5:38b853bb1afa 593 laser=false;
wim 5:38b853bb1afa 594 timer.stop(); // Stop time-out timer
wim 5:38b853bb1afa 595 timer.reset();
wim 4:745fbbd5e4e5 596
wim 4:745fbbd5e4e5 597 // Status LEDs
wim 5:38b853bb1afa 598 LF28A_status.LED(LED_LASER, LED_OFF);
wim 4:745fbbd5e4e5 599 }
wim 4:745fbbd5e4e5 600 else {
wim 5:38b853bb1afa 601 // Laser is Off, Switch On
wim 5:38b853bb1afa 602 laser=true;
wim 5:38b853bb1afa 603 timer.start(); // Start time-out timer
wim 4:745fbbd5e4e5 604
wim 4:745fbbd5e4e5 605 // Status LEDs
wim 5:38b853bb1afa 606 LF28A_status.LED(LED_LASER, LED_ON);
wim 4:745fbbd5e4e5 607 };
wim 4:745fbbd5e4e5 608
wim 4:745fbbd5e4e5 609 // Inform Host of change (laser on/off)
wim 5:38b853bb1afa 610 SendHostMessage(LFSTA_R);
wim 4:745fbbd5e4e5 611
wim 4:745fbbd5e4e5 612 break;
wim 2:1dab1089c332 613
wim 2:1dab1089c332 614 default: // Ignore other keys
wim 2:1dab1089c332 615 break;
wim 2:1dab1089c332 616 }; //End Keyswitch
wim 2:1dab1089c332 617 }; // End Keyread
wim 2:1dab1089c332 618
wim 5:38b853bb1afa 619 // Check Automatic Time-out for Laser
wim 5:38b853bb1afa 620 if (laser) {
wim 5:38b853bb1afa 621 // Laser is On, Test Time-out to Switch Off
wim 5:38b853bb1afa 622 if (timer.read() > LF28A_RANGE_TIME_OUT_S) {
wim 5:38b853bb1afa 623 laser=false; // Laser Off
wim 5:38b853bb1afa 624 timer.stop(); // Stop time-out timer
wim 5:38b853bb1afa 625 timer.reset();
wim 5:38b853bb1afa 626
wim 5:38b853bb1afa 627 // Status LEDs
wim 5:38b853bb1afa 628 LF28A_status.LED(LED_LASER, LED_OFF);
wim 5:38b853bb1afa 629
wim 5:38b853bb1afa 630 // Inform Host of change (laser off)
wim 5:38b853bb1afa 631 SendHostMessage(LFSTA_R);
wim 5:38b853bb1afa 632 }
wim 5:38b853bb1afa 633 };
wim 2:1dab1089c332 634
wim 2:1dab1089c332 635 break;
wim 2:1dab1089c332 636
wim 2:1dab1089c332 637 case RANGE_EXIT: // Transitional state
wim 4:745fbbd5e4e5 638
wim 5:38b853bb1afa 639 // Check Laser
wim 5:38b853bb1afa 640 if (laser) {
wim 5:38b853bb1afa 641 // Laser is On, Switch Off
wim 5:38b853bb1afa 642 laser=false; // Laser Off
wim 5:38b853bb1afa 643 timer.stop(); // Stop time-out timer
wim 5:38b853bb1afa 644 timer.reset();
wim 5:38b853bb1afa 645
wim 5:38b853bb1afa 646 // Status LEDs
wim 5:38b853bb1afa 647 LF28A_status.LED(LED_LASER, LED_OFF);
wim 5:38b853bb1afa 648 };
wim 5:38b853bb1afa 649
wim 3:3fbfdec782f4 650 // Status LEDs
wim 3:3fbfdec782f4 651 LF28A_status.LED(LED_RANGE, LED_OFF);
wim 2:1dab1089c332 652
wim 2:1dab1089c332 653 mode = CODE_ENTRY;
wim 2:1dab1089c332 654 break;
wim 2:1dab1089c332 655
wim 2:1dab1089c332 656
wim 2:1dab1089c332 657 // CODE MODEs
wim 2:1dab1089c332 658 case CODE_ENTRY: // Transitional state
wim 3:3fbfdec782f4 659
wim 3:3fbfdec782f4 660 // Status LEDs
wim 3:3fbfdec782f4 661 LF28A_status.LED(LED_CODE, LED_ON);
wim 4:745fbbd5e4e5 662
wim 4:745fbbd5e4e5 663 //Enable flashing Code
wim 4:745fbbd5e4e5 664 LF28A_display.set_flash_mode(true);
wim 4:745fbbd5e4e5 665
wim 2:1dab1089c332 666 //Display current STANAG Code
wim 4:745fbbd5e4e5 667 LF28A_display.locate (0);
wim 4:745fbbd5e4e5 668 LF28A_display.printf (" %04d",STANAG_codes.getCode() );
wim 4:745fbbd5e4e5 669
wim 2:1dab1089c332 670 // Inform Host of change
wim 5:38b853bb1afa 671 SendHostMessage(LFSTA_C);
wim 2:1dab1089c332 672
wim 2:1dab1089c332 673 mode = CODE_DISP;
wim 2:1dab1089c332 674 break;
wim 2:1dab1089c332 675
wim 2:1dab1089c332 676 case CODE_DISP:
wim 2:1dab1089c332 677 // Check and handle Keyboard
wim 2:1dab1089c332 678 if (LF28A_keyboard.readable()) {
wim 2:1dab1089c332 679 keycode = LF28A_keyboard.getkey();
wim 2:1dab1089c332 680
wim 2:1dab1089c332 681 switch (keycode) {
wim 2:1dab1089c332 682 case KEY_GRAT_RT: grat_bright_selector();
wim 2:1dab1089c332 683
wim 2:1dab1089c332 684 // Inform Host of change
wim 5:38b853bb1afa 685 SendHostMessage(LFSTA_C);
wim 2:1dab1089c332 686
wim 2:1dab1089c332 687 break;
wim 2:1dab1089c332 688
wim 2:1dab1089c332 689 case KEY_BRIGHT: disp_bright_selector();
wim 2:1dab1089c332 690 break;
wim 2:1dab1089c332 691
wim 2:1dab1089c332 692 case KEY_MODE: mode = CODE_EXIT;
wim 2:1dab1089c332 693 break;
wim 2:1dab1089c332 694
wim 4:745fbbd5e4e5 695 case KEY_EDIT_PATH:
wim 4:745fbbd5e4e5 696 mode = CODE_EDIT;
wim 4:745fbbd5e4e5 697
wim 4:745fbbd5e4e5 698 // Enable current flashing digit
wim 4:745fbbd5e4e5 699 LF28A_display.set_char_flash_state(true, 4 + STANAG_codes.getDigitIdx());
wim 4:745fbbd5e4e5 700
wim 2:1dab1089c332 701 break;
wim 2:1dab1089c332 702
wim 2:1dab1089c332 703 case KEY_F_L_UP : //Incr STANAG code idx
wim 4:745fbbd5e4e5 704 STANAG_codes.incCodeIdx();
wim 2:1dab1089c332 705
wim 4:745fbbd5e4e5 706 //Display current STANAG Code
wim 4:745fbbd5e4e5 707 LF28A_display.locate (0);
wim 4:745fbbd5e4e5 708 LF28A_display.printf (" %04d",STANAG_codes.getCode() );
wim 4:745fbbd5e4e5 709
wim 2:1dab1089c332 710
wim 2:1dab1089c332 711 // Inform Host of change ??
wim 2:1dab1089c332 712 //SendHostMessage(LFSTA);
wim 2:1dab1089c332 713
wim 2:1dab1089c332 714 break;
wim 2:1dab1089c332 715
wim 2:1dab1089c332 716 default: // Ignore other keys
wim 2:1dab1089c332 717 break;
wim 2:1dab1089c332 718 }; //End Keyswitch
wim 2:1dab1089c332 719 }; //End Keyread
wim 2:1dab1089c332 720
wim 2:1dab1089c332 721 break;
wim 2:1dab1089c332 722
wim 2:1dab1089c332 723 case CODE_EDIT:
wim 2:1dab1089c332 724 // Check and handle Keyboard
wim 2:1dab1089c332 725 if (LF28A_keyboard.readable()) {
wim 2:1dab1089c332 726 keycode = LF28A_keyboard.getkey();
wim 2:1dab1089c332 727
wim 2:1dab1089c332 728 switch (keycode) {
wim 2:1dab1089c332 729 case KEY_GRAT_RT: //Cursor Right;
wim 4:745fbbd5e4e5 730 // Disable current flashing digit
wim 4:745fbbd5e4e5 731 LF28A_display.set_char_flash_state(false, 4 + STANAG_codes.getDigitIdx());
wim 4:745fbbd5e4e5 732
wim 4:745fbbd5e4e5 733 // Incr selected digit
wim 4:745fbbd5e4e5 734 STANAG_codes.incDigitIdx();
wim 4:745fbbd5e4e5 735
wim 4:745fbbd5e4e5 736 // Enable current flashing digit
wim 4:745fbbd5e4e5 737 LF28A_display.set_char_flash_state(true, 4 + STANAG_codes.getDigitIdx());
wim 4:745fbbd5e4e5 738
wim 2:1dab1089c332 739 break;
wim 2:1dab1089c332 740
wim 2:1dab1089c332 741 case KEY_BRIGHT: disp_bright_selector();
wim 2:1dab1089c332 742 break;
wim 2:1dab1089c332 743
wim 4:745fbbd5e4e5 744 case KEY_MODE: // Done, exit Code mode
wim 4:745fbbd5e4e5 745
wim 4:745fbbd5e4e5 746 // Disable current flashing digit
wim 4:745fbbd5e4e5 747 LF28A_display.set_char_flash_state(false, 4 + STANAG_codes.getDigitIdx());
wim 4:745fbbd5e4e5 748
wim 2:1dab1089c332 749 // Inform Host of change
wim 5:38b853bb1afa 750 SendHostMessage(LFSTA_C);
wim 2:1dab1089c332 751
wim 2:1dab1089c332 752 mode = CODE_EXIT;
wim 2:1dab1089c332 753
wim 2:1dab1089c332 754 break;
wim 2:1dab1089c332 755
wim 4:745fbbd5e4e5 756 case KEY_EDIT_PATH: // Done, return to Code display mode
wim 4:745fbbd5e4e5 757
wim 4:745fbbd5e4e5 758 // Disable current flashing digit
wim 4:745fbbd5e4e5 759 LF28A_display.set_char_flash_state(false, 4 + STANAG_codes.getDigitIdx());
wim 4:745fbbd5e4e5 760
wim 2:1dab1089c332 761 // Inform Host of change
wim 5:38b853bb1afa 762 SendHostMessage(LFSTA_C);
wim 2:1dab1089c332 763
wim 2:1dab1089c332 764 mode = CODE_DISP;
wim 2:1dab1089c332 765
wim 2:1dab1089c332 766 break;
wim 2:1dab1089c332 767
wim 2:1dab1089c332 768 case KEY_F_L_UP : //Incr current digit
wim 5:38b853bb1afa 769 STANAG_codes.incDigit();
wim 4:745fbbd5e4e5 770
wim 4:745fbbd5e4e5 771 // Display Current STANAG Code
wim 4:745fbbd5e4e5 772 LF28A_display.locate (0);
wim 4:745fbbd5e4e5 773 LF28A_display.printf (" %04d",STANAG_codes.getCode() );
wim 2:1dab1089c332 774
wim 3:3fbfdec782f4 775 // Inform Host of change or wait until done editing ??
wim 2:1dab1089c332 776 //SendHostMessage(LFSTA);
wim 2:1dab1089c332 777
wim 2:1dab1089c332 778 break;
wim 2:1dab1089c332 779
wim 2:1dab1089c332 780 default: // Ignore other keys
wim 2:1dab1089c332 781 break;
wim 2:1dab1089c332 782 }; //End Keyswitch
wim 2:1dab1089c332 783 }; //End Keyread
wim 2:1dab1089c332 784
wim 2:1dab1089c332 785 break;
wim 2:1dab1089c332 786
wim 2:1dab1089c332 787 case CODE_EXIT: // Transitional state
wim 3:3fbfdec782f4 788
wim 3:3fbfdec782f4 789 // Status LEDs
wim 4:745fbbd5e4e5 790 LF28A_status.LED(LED_CODE, LED_OFF);
wim 4:745fbbd5e4e5 791
wim 4:745fbbd5e4e5 792 //Disable flashing Code
wim 4:745fbbd5e4e5 793 LF28A_display.set_flash_mode(false);
wim 4:745fbbd5e4e5 794
wim 2:1dab1089c332 795 mode = DESIG_ENTRY;
wim 2:1dab1089c332 796 break;
wim 2:1dab1089c332 797
wim 2:1dab1089c332 798 // ADDR MODEs
wim 2:1dab1089c332 799 case ADDR_ENTRY: // Transitional state
wim 2:1dab1089c332 800 case ADDR: // Transitional state
wim 2:1dab1089c332 801 case ADDR_EXIT: // Transitional state
wim 2:1dab1089c332 802 // FREQ MODEs
wim 2:1dab1089c332 803 case FREQ_ENTRY: // Transitional state
wim 2:1dab1089c332 804 case FREQ: // Transitional state
wim 2:1dab1089c332 805 case FREQ_EXIT: // Transitional state
wim 2:1dab1089c332 806 // PATH MODEs
wim 2:1dab1089c332 807 case PATH_ENTRY: // Transitional state
wim 2:1dab1089c332 808 case PATH: // Transitional state
wim 2:1dab1089c332 809 case PATH_EXIT: // Transitional state
wim 2:1dab1089c332 810
wim 2:1dab1089c332 811 default: // Oops, we should never end up here....try to recover
wim 2:1dab1089c332 812 mode = INIT_ENTRY;
wim 2:1dab1089c332 813 hostResetCmd = false;
wim 2:1dab1089c332 814
wim 2:1dab1089c332 815 result = -1;
wim 2:1dab1089c332 816 DBG("Error - Result = %d\r", result);
wim 2:1dab1089c332 817 break;
wim 2:1dab1089c332 818 }; //End mode statemachine switch
wim 2:1dab1089c332 819
wim 2:1dab1089c332 820
wim 2:1dab1089c332 821 // Handle Host commands
wim 2:1dab1089c332 822 // Reset command
wim 2:1dab1089c332 823 // Range data
wim 2:1dab1089c332 824
wim 5:38b853bb1afa 825 #if(0)
wim 5:38b853bb1afa 826 // Just for Info, lets see how fast this cycle is...
wim 5:38b853bb1afa 827 cyclecount++;
wim 5:38b853bb1afa 828 if (cyclecount == maxcount) {
wim 5:38b853bb1afa 829 pc.printf("Freq = %d Hz\r", (cyclecount * 1000) / cycletimer.read_ms());
wim 5:38b853bb1afa 830 cyclecount = 0;
wim 5:38b853bb1afa 831 cycletimer.reset();
wim 5:38b853bb1afa 832 }
wim 5:38b853bb1afa 833 #endif
wim 5:38b853bb1afa 834
wim 2:1dab1089c332 835 } // end while(1)
wim 2:1dab1089c332 836
wim 2:1dab1089c332 837
wim 2:1dab1089c332 838 #else
wim 2:1dab1089c332 839 //testing stuff
wim 2:1dab1089c332 840 testloop();
wim 2:1dab1089c332 841
wim 2:1dab1089c332 842 #endif
wim 2:1dab1089c332 843
wim 2:1dab1089c332 844 DBG("I'll be back...\r\r");
wim 2:1dab1089c332 845 }