Updated following fixing of Joystick 'Bounce'. Also insertion of a Starting Temp to be compared against following user selection.

Dependencies:   mbed N5110v02 TMP102 JoystickIoT

Committer:
legstar85
Date:
Fri Jan 14 15:27:19 2022 +0000
Revision:
7:d77e95505e43
Parent:
6:ebf4784ce92b
Child:
8:07323fcab6d1
Update to menu, selection process, insertion of Temp monitoring into correct menu

Who changed what in which revision?

UserRevisionLine numberNew contents of line
legstar85 4:0090145b3286 1 /*
legstar85 2:e0091b5311f1 2 * @ File main.cpp
legstar85 4:0090145b3286 3 * @ Author - David Leaming - 25574043
legstar85 2:e0091b5311f1 4 * @ Date - December 2021
legstar85 2:e0091b5311f1 5 *
legstar85 2:e0091b5311f1 6 * Acknowledgements
legstar85 2:e0091b5311f1 7 * Craig A. Evans, University of Leeds, TMP102 Library ,Feb 2016
legstar85 2:e0091b5311f1 8 * Dr Edmond Nurellari, University of Lincoln, Joystick & N5110 Libraries
legstar85 2:e0091b5311f1 9 *
eencae 0:21a200b880d7 10 */
eencae 0:21a200b880d7 11
legstar85 2:e0091b5311f1 12 #include "mbed.h" // include the library header, ensure the library has been imported into the project
eencae 1:dd5fb735acf1 13 #include "TMP102.h"
legstar85 2:e0091b5311f1 14 #include "N5110.h"
legstar85 2:e0091b5311f1 15 #include "Joystick.h"
legstar85 2:e0091b5311f1 16 #include "Bitmap.h"
eencae 0:21a200b880d7 17
legstar85 2:e0091b5311f1 18 TMP102 tmp102(I2C_SDA,I2C_SCL); // Create TMP102 object
legstar85 2:e0091b5311f1 19
legstar85 2:e0091b5311f1 20 // VCC,SCE,RST,D/C,MOSI,SCLK,LED
legstar85 2:e0091b5311f1 21 N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11); // Create Screen Object - K64F - pwr from 3V3, GND Pin also needs connecting
legstar85 2:e0091b5311f1 22
legstar85 3:80c1eba78f9b 23 // y x button
legstar85 3:80c1eba78f9b 24 Joystick joystick(PTB10,PTB11,PTC16); // Define Joystick Object
eencae 0:21a200b880d7 25
legstar85 2:e0091b5311f1 26 Serial pc(USBTX,USBRX); // UART connection for PC
legstar85 2:e0091b5311f1 27
legstar85 5:eebd36a47049 28 Ticker ticker_menu; // Create Menu ticker object
legstar85 5:eebd36a47049 29
legstar85 2:e0091b5311f1 30 DigitalOut r_led(LED_RED); // K64F on-board LEDs
legstar85 2:e0091b5311f1 31 DigitalOut g_led(LED_GREEN); // K64F on-board LEDs
legstar85 2:e0091b5311f1 32 DigitalOut b_led(LED_BLUE); // K64F on-board LEDs
eencae 0:21a200b880d7 33
legstar85 3:80c1eba78f9b 34 DigitalOut LED01 (PTA1); // PCB Surface Mounted LED's - LED1
legstar85 3:80c1eba78f9b 35 DigitalOut LED02 (PTA2); // PCB Surface Mounted LED's - LED2
legstar85 3:80c1eba78f9b 36 DigitalOut LED03 (PTC2); // PCB Surface Mounted LED's - LED3
legstar85 3:80c1eba78f9b 37 DigitalOut LED04 (PTC3); // PCB Surface Mounted LED's - LED4
legstar85 3:80c1eba78f9b 38 DigitalOut LED05 (PTC4); // PCB Surface Mounted LED's - LED5
legstar85 3:80c1eba78f9b 39 DigitalOut LED06 (PTD3); // PCB Surface Mounted LED's - LED6
legstar85 3:80c1eba78f9b 40
legstar85 2:e0091b5311f1 41 InterruptIn sw2(SW2); // K64F on-board switches
legstar85 2:e0091b5311f1 42 InterruptIn sw3(SW3); // K64F on-board switches
legstar85 3:80c1eba78f9b 43 InterruptIn ButtonA (PTB9); // PCB Button - A
legstar85 3:80c1eba78f9b 44 InterruptIn ButtonB (PTD0); // PCB Button - B
legstar85 7:d77e95505e43 45 InterruptIn ButtonBack (PTB10); // PCB Button - Back
legstar85 3:80c1eba78f9b 46
legstar85 5:eebd36a47049 47 volatile int g_ButtonA_flag = 0; // flag - must be volatile as changes within ISR - g_ prefix makes it easier to distinguish it as global
legstar85 5:eebd36a47049 48 volatile int g_ButtonB_flag = 0; // flag - must be volatile as changes within ISR - g_ prefix makes it easier to distinguish it as global
legstar85 7:d77e95505e43 49 volatile int g_ButtonBack_flag = 0; // flag - must be volatile as changes within ISR - g_ prefix makes it easier to distinguish it as global
legstar85 5:eebd36a47049 50 volatile int g_sw2_flag = 0; // flag - must be volatile as changes within ISR - g_ prefix makes it easier to distinguish it as global
legstar85 5:eebd36a47049 51 volatile int g_menu_timer_flag = 0; // flag - must be volatile as changes within ISR - g_ prefix makes it easier to distinguish it as global
legstar85 5:eebd36a47049 52 volatile int option = 0; // Menu option selection based on joystick direction
legstar85 2:e0091b5311f1 53
legstar85 2:e0091b5311f1 54 void error(); // error function hangs flashing an LED
legstar85 2:e0091b5311f1 55 void init_serial(); // setup serial port
legstar85 2:e0091b5311f1 56 void init_K64F(); // set-up the on-board LEDs and switches
legstar85 3:80c1eba78f9b 57 void init_PCB(); // set-up the PCB LEDs and buttons
legstar85 5:eebd36a47049 58 void ButtonA_isr(); //
legstar85 5:eebd36a47049 59 void ButtonB_isr(); //
legstar85 7:d77e95505e43 60 void ButtonBack_isr(); //
legstar85 5:eebd36a47049 61 void sw2_isr(); //
legstar85 5:eebd36a47049 62 void menu_timer_isr(); //
legstar85 6:ebf4784ce92b 63 void OnStartup(); //
legstar85 6:ebf4784ce92b 64 void Run(); //
legstar85 6:ebf4784ce92b 65 void ConstantMonitoring(); //
eencae 0:21a200b880d7 66
eencae 0:21a200b880d7 67 int main()
eencae 0:21a200b880d7 68 {
legstar85 2:e0091b5311f1 69 init_K64F(); // initialise the board
legstar85 2:e0091b5311f1 70 init_serial(); // initialise the serial port
legstar85 3:80c1eba78f9b 71 init_PCB(); // initialise the PCB
legstar85 3:80c1eba78f9b 72
legstar85 2:e0091b5311f1 73 tmp102.init(); // call the sensor init method using dot syntax
legstar85 2:e0091b5311f1 74 lcd.init(); // initialise display
legstar85 3:80c1eba78f9b 75 joystick.init(); // initialise joystick
legstar85 3:80c1eba78f9b 76
legstar85 5:eebd36a47049 77 ticker_menu.attach(&menu_timer_isr,0.2); // Attach ticker for the Joystick
legstar85 5:eebd36a47049 78
legstar85 3:80c1eba78f9b 79 sw2.fall(&sw2_isr); // SW2 has a pull-up resistor, so the pin will be at 3.3 V by default and fall to 0 V when pressed. We therefore need to look for a falling edge on the pin to fire the interrupt
legstar85 3:80c1eba78f9b 80 ButtonA.rise(&ButtonA_isr); // External push button, pin set to 0V by pull down command, means a rising edge is looked for
legstar85 3:80c1eba78f9b 81 ButtonB.rise(&ButtonB_isr); // External push button, pin set to 0V by pull down command, means a rising edge is looked for
legstar85 2:e0091b5311f1 82
legstar85 2:e0091b5311f1 83 lcd.setContrast(0.5); // change set contrast in range 0.0 to 1.0
eencae 0:21a200b880d7 84
legstar85 6:ebf4784ce92b 85 OnStartup(); //
legstar85 6:ebf4784ce92b 86 Run(); //
legstar85 5:eebd36a47049 87
legstar85 5:eebd36a47049 88 }
eencae 0:21a200b880d7 89
eencae 0:21a200b880d7 90 void init_serial() {
legstar85 2:e0091b5311f1 91 pc.baud(115200); // set to highest baud - ensure terminal software matches
eencae 0:21a200b880d7 92 }
eencae 0:21a200b880d7 93
eencae 0:21a200b880d7 94 void init_K64F()
eencae 0:21a200b880d7 95 {
legstar85 2:e0091b5311f1 96 r_led = 1; // on-board LEDs are active-low, so set pin high to turn them off.
legstar85 2:e0091b5311f1 97 g_led = 1; // on-board LEDs are active-low, so set pin high to turn them off.
legstar85 2:e0091b5311f1 98 b_led = 1; // on-board LEDs are active-low, so set pin high to turn them off.
eencae 0:21a200b880d7 99
legstar85 2:e0091b5311f1 100 sw2.mode(PullNone); // since the on-board switches have external pull-ups, we should disable the internal pull-down
legstar85 2:e0091b5311f1 101 sw3.mode(PullNone); // resistors that are enabled by default using InterruptIn
eencae 0:21a200b880d7 102
eencae 0:21a200b880d7 103 }
legstar85 3:80c1eba78f9b 104
legstar85 3:80c1eba78f9b 105 void init_PCB ()
legstar85 3:80c1eba78f9b 106 {
legstar85 3:80c1eba78f9b 107 LED01 = 1; // PCB surface mounted LED's are active low - write a 1 to turn them off initiallly
legstar85 3:80c1eba78f9b 108 LED02 = 1;
legstar85 3:80c1eba78f9b 109 LED03 = 1;
legstar85 3:80c1eba78f9b 110 LED04 = 1;
legstar85 3:80c1eba78f9b 111 LED05 = 1;
legstar85 3:80c1eba78f9b 112 LED06 = 1;
legstar85 3:80c1eba78f9b 113
legstar85 3:80c1eba78f9b 114 ButtonA.mode(PullDown); // Set pin to Pull Down to OV, meaning that a rising edge is looked for when button is pressed
legstar85 3:80c1eba78f9b 115 ButtonB.mode(PullDown); // Set pin to Pull Down to OV, meaning that a rising edge is looked for when button is pressed
legstar85 3:80c1eba78f9b 116
legstar85 3:80c1eba78f9b 117 }
legstar85 3:80c1eba78f9b 118
legstar85 3:80c1eba78f9b 119 void ButtonA_isr() // ButtonA event-triggered interrupt
legstar85 3:80c1eba78f9b 120 {
legstar85 3:80c1eba78f9b 121 g_ButtonA_flag = 1; // set flag in ISR
legstar85 3:80c1eba78f9b 122 }
legstar85 3:80c1eba78f9b 123
legstar85 3:80c1eba78f9b 124 void ButtonB_isr() // ButtonB event-triggered interrupt
legstar85 3:80c1eba78f9b 125 {
legstar85 3:80c1eba78f9b 126 g_ButtonB_flag = 1; // set flag in ISR
legstar85 3:80c1eba78f9b 127 }
legstar85 3:80c1eba78f9b 128
legstar85 7:d77e95505e43 129 void ButtonBack_isr() // ButtonB event-triggered interrupt
legstar85 7:d77e95505e43 130 {
legstar85 7:d77e95505e43 131 g_ButtonBack_flag = 1; // set flag in ISR
legstar85 7:d77e95505e43 132 }
legstar85 7:d77e95505e43 133
legstar85 3:80c1eba78f9b 134 void sw2_isr() // SW2 event-triggered interrupt
legstar85 3:80c1eba78f9b 135 {
legstar85 3:80c1eba78f9b 136 g_sw2_flag = 1; // set flag in ISR
legstar85 5:eebd36a47049 137 }
legstar85 5:eebd36a47049 138
legstar85 5:eebd36a47049 139 void menu_timer_isr()
legstar85 5:eebd36a47049 140 {
legstar85 6:ebf4784ce92b 141 g_menu_timer_flag = 1; // set flag in ISR
legstar85 6:ebf4784ce92b 142 }
legstar85 6:ebf4784ce92b 143
legstar85 6:ebf4784ce92b 144 void OnStartup() //Run some start up display
legstar85 6:ebf4784ce92b 145 {
legstar85 6:ebf4784ce92b 146 lcd.clear(); // clear buffer at start of every loop
legstar85 7:d77e95505e43 147 lcd.printString("--------------",0,0); // can directly print strings at specified co-ordinates (must be less than 84 pixels to fit on display)
legstar85 7:d77e95505e43 148 lcd.printString(" Smart Cold",0,1); // Just a welcome message before auto moving to main menu
legstar85 7:d77e95505e43 149 lcd.printString(" Storage",0,2); //
legstar85 7:d77e95505e43 150 lcd.printString(" Monitoring",0,3); //
legstar85 7:d77e95505e43 151 lcd.printString("V07 - Jan 2022",0,4); //
legstar85 7:d77e95505e43 152 lcd.printString("--------------",0,5); //
legstar85 6:ebf4784ce92b 153 lcd.refresh(); // need to refresh display after setting pixels or writing strings
legstar85 6:ebf4784ce92b 154 wait(5.0); // leave welcome screen on for designated amount of time
legstar85 6:ebf4784ce92b 155 lcd.clear(); // clear buffer at start of every loop
legstar85 6:ebf4784ce92b 156 lcd.refresh(); // need to refresh display after setting pixels or writing strings
legstar85 7:d77e95505e43 157 lcd.printString(" Use Joystick",0,0); // Instruction for use of menu
legstar85 7:d77e95505e43 158 lcd.printString(" To Navigate",0,1); //
legstar85 6:ebf4784ce92b 159 lcd.printString("",0,2); // Blank Line
legstar85 7:d77e95505e43 160 lcd.printString(" A = Select",0,3); //
legstar85 6:ebf4784ce92b 161 lcd.refresh(); // need to refresh display after setting pixels or writing strings
legstar85 7:d77e95505e43 162 wait(5.0); //
legstar85 5:eebd36a47049 163 }
legstar85 5:eebd36a47049 164
legstar85 6:ebf4784ce92b 165 enum EMenuState //An enum controlling the current state of the display.
legstar85 6:ebf4784ce92b 166 {
legstar85 6:ebf4784ce92b 167 MENUSTATE_Main,
legstar85 6:ebf4784ce92b 168 MENUSTATE_Monitor,
legstar85 6:ebf4784ce92b 169 MENUSTATE_OneOff,
legstar85 6:ebf4784ce92b 170 MENUSTATE_About,
legstar85 7:d77e95505e43 171 MENUSTATE_Author,
legstar85 6:ebf4784ce92b 172
legstar85 6:ebf4784ce92b 173 MENUSTATTE_Num, // This is a special enum value that just gives is a way to get the number of elements in the enum.
legstar85 6:ebf4784ce92b 174 };
legstar85 6:ebf4784ce92b 175
legstar85 6:ebf4784ce92b 176 void Run()
legstar85 5:eebd36a47049 177 {
legstar85 6:ebf4784ce92b 178 int MenuState;
legstar85 6:ebf4784ce92b 179 int SelectedItem = 0;
legstar85 6:ebf4784ce92b 180 int NumMenuItems = 1;
legstar85 6:ebf4784ce92b 181
legstar85 7:d77e95505e43 182 char buffer[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
legstar85 7:d77e95505e43 183
legstar85 6:ebf4784ce92b 184 while(1){
legstar85 6:ebf4784ce92b 185 if (g_menu_timer_flag){
legstar85 5:eebd36a47049 186 g_menu_timer_flag = 0;
legstar85 5:eebd36a47049 187
legstar85 6:ebf4784ce92b 188 bool bAButtonWasPressed = g_ButtonA_flag; // Get the value of the input flags and reset them
legstar85 6:ebf4784ce92b 189 bool bBButtonWasPressed = g_ButtonB_flag;
legstar85 6:ebf4784ce92b 190 g_ButtonA_flag = 0;
legstar85 6:ebf4784ce92b 191 g_ButtonB_flag = 0;
legstar85 6:ebf4784ce92b 192
legstar85 5:eebd36a47049 193 lcd.clear(); // clear buffer at start of every loop
legstar85 6:ebf4784ce92b 194
legstar85 6:ebf4784ce92b 195 int NewMenuState = MENUSTATTE_Num; // The new menu we want to transition to, if any.
legstar85 6:ebf4784ce92b 196
legstar85 6:ebf4784ce92b 197 switch(MenuState) // Update and Draw whichever menu we're on.
legstar85 6:ebf4784ce92b 198 {
legstar85 6:ebf4784ce92b 199 case MENUSTATE_Main:
legstar85 6:ebf4784ce92b 200 {
legstar85 6:ebf4784ce92b 201
legstar85 7:d77e95505e43 202 NumMenuItems = 4; // Dont for get to set this when changing number of items in the menu. We need this to wrap the selection around properly etc.
legstar85 6:ebf4784ce92b 203 if(SelectedItem >= NumMenuItems)
legstar85 6:ebf4784ce92b 204 {
legstar85 6:ebf4784ce92b 205
legstar85 6:ebf4784ce92b 206 SelectedItem = 0; // Something has gone wrong, reset selected item.
legstar85 6:ebf4784ce92b 207 }
legstar85 6:ebf4784ce92b 208 lcd.printString("---- MENU ----",0,0);
legstar85 6:ebf4784ce92b 209 lcd.printString("M1 - Monitor",0,1);
legstar85 6:ebf4784ce92b 210 lcd.printString("M2 - One-off",0,2);
legstar85 6:ebf4784ce92b 211 lcd.printString("About",0,3);
legstar85 7:d77e95505e43 212 lcd.printString("Author",0,4);
legstar85 6:ebf4784ce92b 213
legstar85 6:ebf4784ce92b 214 if(bAButtonWasPressed) // If A was pressed then we transition to the selected screen.
legstar85 6:ebf4784ce92b 215 {
legstar85 6:ebf4784ce92b 216 if(SelectedItem == 0)
legstar85 6:ebf4784ce92b 217 {
legstar85 6:ebf4784ce92b 218 NewMenuState = MENUSTATE_Monitor;
legstar85 6:ebf4784ce92b 219 }
legstar85 6:ebf4784ce92b 220 else if(SelectedItem == 1)
legstar85 6:ebf4784ce92b 221 {
legstar85 6:ebf4784ce92b 222 NewMenuState = MENUSTATE_OneOff;
legstar85 6:ebf4784ce92b 223 }
legstar85 6:ebf4784ce92b 224 else if(SelectedItem == 2)
legstar85 6:ebf4784ce92b 225 {
legstar85 6:ebf4784ce92b 226 NewMenuState = MENUSTATE_About;
legstar85 6:ebf4784ce92b 227 }
legstar85 7:d77e95505e43 228 else if(SelectedItem == 3)
legstar85 7:d77e95505e43 229 {
legstar85 7:d77e95505e43 230 NewMenuState = MENUSTATE_Author;
legstar85 7:d77e95505e43 231 }
legstar85 6:ebf4784ce92b 232 }
legstar85 6:ebf4784ce92b 233 }
legstar85 6:ebf4784ce92b 234 break;
legstar85 6:ebf4784ce92b 235 case MENUSTATE_Monitor:
legstar85 6:ebf4784ce92b 236 {
legstar85 6:ebf4784ce92b 237
legstar85 6:ebf4784ce92b 238 NumMenuItems = 1; // Dont for get to set this when changing number of items in the menu. We need this to wrap the selection around properly etc.
legstar85 6:ebf4784ce92b 239
legstar85 6:ebf4784ce92b 240 if(SelectedItem >= NumMenuItems)
legstar85 6:ebf4784ce92b 241 {
legstar85 6:ebf4784ce92b 242 NewMenuState = MENUSTATE_Main; // Something has gone wrong, drop back to the main menu.
legstar85 6:ebf4784ce92b 243 }
legstar85 6:ebf4784ce92b 244
legstar85 7:d77e95505e43 245 float T = tmp102.get_temperature(); // read temperature and print to lcd
legstar85 7:d77e95505e43 246 int length = sprintf(buffer," T = %.2f C",T); // print formatted data to buffer - it is important the format specifier ensures the length will fit in the buffer
legstar85 7:d77e95505e43 247 if (length <= 14) // if string will fit on display (assuming printing at x=0)
legstar85 7:d77e95505e43 248 lcd.printString("-- Constant --",0,0);
legstar85 7:d77e95505e43 249 lcd.printString("- Monitoring -",0,1);
legstar85 7:d77e95505e43 250 lcd.printString(buffer,0,3); // display on screen
legstar85 7:d77e95505e43 251 lcd.printString(" 'A' to Menu",0,5);
legstar85 7:d77e95505e43 252 lcd.refresh(); // need to refresh display after setting pixels or writing strings
legstar85 7:d77e95505e43 253 wait(0.5);
legstar85 7:d77e95505e43 254
legstar85 6:ebf4784ce92b 255 if(bAButtonWasPressed)
legstar85 6:ebf4784ce92b 256 {
legstar85 6:ebf4784ce92b 257 if(SelectedItem == 0)
legstar85 6:ebf4784ce92b 258 {
legstar85 6:ebf4784ce92b 259 NewMenuState = MENUSTATE_Main;
legstar85 6:ebf4784ce92b 260 }
legstar85 6:ebf4784ce92b 261 }
legstar85 6:ebf4784ce92b 262 }
legstar85 6:ebf4784ce92b 263 break;
legstar85 6:ebf4784ce92b 264 case MENUSTATE_OneOff:
legstar85 6:ebf4784ce92b 265 {
legstar85 6:ebf4784ce92b 266
legstar85 7:d77e95505e43 267 NumMenuItems = 1; // Dont for get to set this when changing number of items in the menu. We need this to wrap the selection around properly etc.
legstar85 6:ebf4784ce92b 268 if(SelectedItem >= NumMenuItems)
legstar85 6:ebf4784ce92b 269 {
legstar85 7:d77e95505e43 270 NewMenuState = MENUSTATE_Main; // Something has gone wrong, drop back to the main menu.
legstar85 6:ebf4784ce92b 271 }
legstar85 6:ebf4784ce92b 272
legstar85 6:ebf4784ce92b 273 lcd.printString("-- One-off --",0,0);
legstar85 6:ebf4784ce92b 274 lcd.printString("Back",0,1);
legstar85 6:ebf4784ce92b 275
legstar85 6:ebf4784ce92b 276 //TODO: Whatever the One-off screen should display...
legstar85 6:ebf4784ce92b 277
legstar85 6:ebf4784ce92b 278 if(bAButtonWasPressed)
legstar85 6:ebf4784ce92b 279 {
legstar85 6:ebf4784ce92b 280 if(SelectedItem == 0)
legstar85 6:ebf4784ce92b 281 {
legstar85 6:ebf4784ce92b 282 NewMenuState = MENUSTATE_Main;
legstar85 6:ebf4784ce92b 283 }
legstar85 6:ebf4784ce92b 284 }
legstar85 6:ebf4784ce92b 285
legstar85 6:ebf4784ce92b 286 }
legstar85 6:ebf4784ce92b 287 break;
legstar85 6:ebf4784ce92b 288 case MENUSTATE_About:
legstar85 6:ebf4784ce92b 289 {
legstar85 6:ebf4784ce92b 290
legstar85 6:ebf4784ce92b 291 NumMenuItems = 1; // Dont for get to set this when changing number of items in the menu. We need this to wrap the selection around properly etc.
legstar85 6:ebf4784ce92b 292 if(SelectedItem >= NumMenuItems)
legstar85 6:ebf4784ce92b 293 {
legstar85 6:ebf4784ce92b 294 NewMenuState = MENUSTATE_Main; // Something has gone wrong, drop back to the main menu.
legstar85 6:ebf4784ce92b 295 }
legstar85 6:ebf4784ce92b 296
legstar85 7:d77e95505e43 297 lcd.printString("--- About ---",0,0);
legstar85 7:d77e95505e43 298 lcd.printString("ELE3006M - IoT",0,1);
legstar85 7:d77e95505e43 299 lcd.printString(" Project",0,2);
legstar85 7:d77e95505e43 300 lcd.printString("Uni of Lincoln",0,3);
legstar85 7:d77e95505e43 301 lcd.printString(" 'A' to Menu",0,5);
legstar85 6:ebf4784ce92b 302
legstar85 6:ebf4784ce92b 303 //TODO: Whatever the about screen should display...
legstar85 6:ebf4784ce92b 304
legstar85 6:ebf4784ce92b 305 if(bAButtonWasPressed)
legstar85 6:ebf4784ce92b 306 {
legstar85 6:ebf4784ce92b 307 if(SelectedItem == 0)
legstar85 6:ebf4784ce92b 308 {
legstar85 6:ebf4784ce92b 309 NewMenuState = MENUSTATE_Main;
legstar85 6:ebf4784ce92b 310 }
legstar85 6:ebf4784ce92b 311 }
legstar85 6:ebf4784ce92b 312 }
legstar85 6:ebf4784ce92b 313 break;
legstar85 7:d77e95505e43 314 case MENUSTATE_Author:
legstar85 7:d77e95505e43 315 {
legstar85 7:d77e95505e43 316
legstar85 7:d77e95505e43 317 NumMenuItems = 1; // Dont for get to set this when changing number of items in the menu. We need this to wrap the selection around properly etc.
legstar85 7:d77e95505e43 318 if(SelectedItem >= NumMenuItems)
legstar85 7:d77e95505e43 319 {
legstar85 7:d77e95505e43 320 NewMenuState = MENUSTATE_Main; // Something has gone wrong, drop back to the main menu.
legstar85 7:d77e95505e43 321 }
legstar85 7:d77e95505e43 322
legstar85 7:d77e95505e43 323 lcd.printString("--- Author ---",0,0);
legstar85 7:d77e95505e43 324 lcd.printString(" ",0,1);
legstar85 7:d77e95505e43 325 lcd.printString(" ",0,2);
legstar85 7:d77e95505e43 326 lcd.printString("",0,3);
legstar85 7:d77e95505e43 327 lcd.printString(" 'A' to Menu",0,5);
legstar85 7:d77e95505e43 328
legstar85 7:d77e95505e43 329 //TODO: Whatever the about screen should display...
legstar85 7:d77e95505e43 330
legstar85 7:d77e95505e43 331 if(bAButtonWasPressed)
legstar85 7:d77e95505e43 332 {
legstar85 7:d77e95505e43 333 if(SelectedItem == 0)
legstar85 7:d77e95505e43 334 {
legstar85 7:d77e95505e43 335 NewMenuState = MENUSTATE_Main;
legstar85 7:d77e95505e43 336 }
legstar85 7:d77e95505e43 337 }
legstar85 7:d77e95505e43 338 }
legstar85 7:d77e95505e43 339 break;
legstar85 7:d77e95505e43 340
legstar85 6:ebf4784ce92b 341 default:
legstar85 6:ebf4784ce92b 342 {
legstar85 6:ebf4784ce92b 343 NewMenuState = MENUSTATE_Main; // Something has gone wrong, drop back to the main menu.
legstar85 6:ebf4784ce92b 344 }
legstar85 6:ebf4784ce92b 345 };
legstar85 5:eebd36a47049 346
legstar85 6:ebf4784ce92b 347 if(NewMenuState != MENUSTATTE_Num) // If we have requested a new menu state.
legstar85 6:ebf4784ce92b 348 {
legstar85 6:ebf4784ce92b 349 printf("Transitioning to MenuState: %i\n", NewMenuState); //
legstar85 6:ebf4784ce92b 350
legstar85 6:ebf4784ce92b 351 MenuState = NewMenuState; // We want to transition the menu to a new state.
legstar85 6:ebf4784ce92b 352
legstar85 6:ebf4784ce92b 353 // Do any bookkeeping needed when moving to new state.
legstar85 6:ebf4784ce92b 354 SelectedItem = 0; // Reset the selected item.
legstar85 6:ebf4784ce92b 355
legstar85 6:ebf4784ce92b 356 lcd.clear(); // Clear the display for one frame on state transition.
legstar85 6:ebf4784ce92b 357 } // Could do something else like invert colour etc here.
legstar85 6:ebf4784ce92b 358 else
legstar85 6:ebf4784ce92b 359 {
legstar85 6:ebf4784ce92b 360
legstar85 7:d77e95505e43 361 // If we have not selected to move to a new menu.
legstar85 7:d77e95505e43 362 unsigned int SelectionMarkerRadius = 4 ; // Draw a marker circle at end of line to show which is the currently selected item.
legstar85 7:d77e95505e43 363 unsigned int SelectionMarkerX = WIDTH - (2 * SelectionMarkerRadius);
legstar85 7:d77e95505e43 364 unsigned int SelectionMarkerY = (HEIGHT / 5) * (SelectedItem + 1); //+1 because of the menu title.
legstar85 7:d77e95505e43 365 lcd.drawCircle(SelectionMarkerX, SelectionMarkerY, SelectionMarkerRadius, FILL_BLACK);
legstar85 6:ebf4784ce92b 366
legstar85 6:ebf4784ce92b 367 // Handle Joystick Input
legstar85 6:ebf4784ce92b 368 switch (joystick.get_direction()) { // Call to check direction joystick is pointing
legstar85 6:ebf4784ce92b 369 printf("Direction = %i\n"); //
legstar85 6:ebf4784ce92b 370 case N: //
legstar85 6:ebf4784ce92b 371 SelectedItem--; //
legstar85 6:ebf4784ce92b 372 break; //
legstar85 6:ebf4784ce92b 373 case S: //
legstar85 6:ebf4784ce92b 374 SelectedItem++; //
legstar85 6:ebf4784ce92b 375 break; //
legstar85 6:ebf4784ce92b 376 }
legstar85 6:ebf4784ce92b 377
legstar85 6:ebf4784ce92b 378 if(SelectedItem < 0) //Wrap the selection around to the start/end of the menu if it goes below 0 or above NumMenuItems.
legstar85 6:ebf4784ce92b 379 {
legstar85 6:ebf4784ce92b 380 SelectedItem = NumMenuItems - 1;
legstar85 6:ebf4784ce92b 381 }
legstar85 6:ebf4784ce92b 382 else if(SelectedItem >= NumMenuItems)
legstar85 6:ebf4784ce92b 383 {
legstar85 6:ebf4784ce92b 384 SelectedItem = 0;
legstar85 6:ebf4784ce92b 385 }
legstar85 5:eebd36a47049 386 }
legstar85 5:eebd36a47049 387
legstar85 6:ebf4784ce92b 388 lcd.refresh(); //Finally update the display.
legstar85 6:ebf4784ce92b 389 }
legstar85 6:ebf4784ce92b 390 }
legstar85 5:eebd36a47049 391 }
legstar85 6:ebf4784ce92b 392
legstar85 5:eebd36a47049 393
legstar85 5:eebd36a47049 394 void ConstantMonitoring()
legstar85 5:eebd36a47049 395 {
legstar85 6:ebf4784ce92b 396 char buffer[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
legstar85 5:eebd36a47049 397 while (1) {
legstar85 5:eebd36a47049 398
legstar85 5:eebd36a47049 399 lcd.normalMode(); // normal colour mode
legstar85 5:eebd36a47049 400 lcd.setBrightness(0.5); // put LED backlight on 50%
legstar85 5:eebd36a47049 401 lcd.clear(); // clear buffer at start of every loop
legstar85 5:eebd36a47049 402 lcd.refresh(); // need to refresh display after setting pixels or writing strings
legstar85 5:eebd36a47049 403
legstar85 5:eebd36a47049 404 float T = tmp102.get_temperature(); // read temperature and print to lcd
legstar85 7:d77e95505e43 405 int length = sprintf(buffer," T = %.2f C",T); // print formatted data to buffer - it is important the format specifier ensures the length will fit in the buffer
legstar85 5:eebd36a47049 406 if (length <= 14) // if string will fit on display (assuming printing at x=0)
legstar85 7:d77e95505e43 407 lcd.printString("-- Constant --",0,0);
legstar85 7:d77e95505e43 408 lcd.printString("- Monitoring -",0,1);
legstar85 7:d77e95505e43 409 lcd.printString(buffer,0,3); // display on screen
legstar85 7:d77e95505e43 410 lcd.printString(" 'B' to Menu",0,5);
legstar85 5:eebd36a47049 411 lcd.refresh(); // need to refresh display after setting pixels or writing strings
legstar85 7:d77e95505e43 412 wait(5.0);
legstar85 7:d77e95505e43 413
legstar85 5:eebd36a47049 414 if (g_ButtonA_flag) { // check if flag i.e. interrupt has occured
legstar85 5:eebd36a47049 415 g_ButtonA_flag = 0; // if it has, clear the flag
legstar85 5:eebd36a47049 416
legstar85 5:eebd36a47049 417 printf("Button A Press \n"); // send message over serial port - can observe in CoolTerm etc.
legstar85 5:eebd36a47049 418 LED01=0;
legstar85 5:eebd36a47049 419 wait(5.0);
legstar85 5:eebd36a47049 420 LED01=1;
legstar85 5:eebd36a47049 421 }
legstar85 5:eebd36a47049 422
legstar85 5:eebd36a47049 423 if (g_ButtonB_flag) { // check if flag i.e. interrupt has occured
legstar85 5:eebd36a47049 424 g_ButtonB_flag = 0; // if it has, clear the flag
legstar85 5:eebd36a47049 425
legstar85 5:eebd36a47049 426 printf("Button B Press \n"); // send message over serial port - can observe in CoolTerm etc.
legstar85 7:d77e95505e43 427 Run();
legstar85 7:d77e95505e43 428 }
legstar85 7:d77e95505e43 429
legstar85 7:d77e95505e43 430 if (g_ButtonBack_flag) { // check if flag i.e. interrupt has occured
legstar85 7:d77e95505e43 431 g_ButtonBack_flag = 0; // if it has, clear the flag
legstar85 7:d77e95505e43 432
legstar85 7:d77e95505e43 433 printf("Button Back Press \n"); // send message over serial port - can observe in CoolTerm etc.
legstar85 5:eebd36a47049 434 LED02=0;
legstar85 5:eebd36a47049 435 wait(5.0);
legstar85 5:eebd36a47049 436 LED02=1;
legstar85 5:eebd36a47049 437 }
legstar85 6:ebf4784ce92b 438 }
legstar85 6:ebf4784ce92b 439 }