Final tidy of code following installation of new sensor, more comments added prior to submission

Dependencies:   mbed

Committer:
legstar85
Date:
Fri Jan 21 14:26:56 2022 +0000
Revision:
13:5ad65a688f3f
Parent:
12:5046b7515d5c
Child:
14:3e9991fe64e5
Updated due to issues with using Start Temp variable later in program now resolved. Doxygen completed and folders in place correctly

Who changed what in which revision?

UserRevisionLine numberNew contents of line
legstar85 4:0090145b3286 1 /*
legstar85 13:5ad65a688f3f 2 * Prints a string of characters to the screen buffer, string is cut off after the 83rd pixel.
legstar85 13:5ad65a688f3f 3 * @param x - the column number (0 to 83)
legstar85 13:5ad65a688f3f 4 * @param y - the row number (0-5) - the display is split into 6 banks - each bank can be considered a row
legstar85 13:5ad65a688f3f 5 *
legstar85 2:e0091b5311f1 6 * @ File main.cpp
legstar85 4:0090145b3286 7 * @ Author - David Leaming - 25574043
legstar85 9:d71b92c916f8 8 * @ Date - January 2022
legstar85 13:5ad65a688f3f 9 *
legstar85 2:e0091b5311f1 10 * Acknowledgements
legstar85 2:e0091b5311f1 11 * Craig A. Evans, University of Leeds, TMP102 Library ,Feb 2016
legstar85 2:e0091b5311f1 12 * Dr Edmond Nurellari, University of Lincoln, Joystick & N5110 Libraries
legstar85 13:5ad65a688f3f 13 * Paul Staron, Piezo Buzzer utility, April 2019
eencae 0:21a200b880d7 14 */
eencae 0:21a200b880d7 15
legstar85 2:e0091b5311f1 16 #include "mbed.h" // include the library header, ensure the library has been imported into the project
eencae 1:dd5fb735acf1 17 #include "TMP102.h"
legstar85 2:e0091b5311f1 18 #include "N5110.h"
legstar85 2:e0091b5311f1 19 #include "Joystick.h"
legstar85 2:e0091b5311f1 20 #include "Bitmap.h"
eencae 0:21a200b880d7 21
legstar85 2:e0091b5311f1 22 TMP102 tmp102(I2C_SDA,I2C_SCL); // Create TMP102 object
legstar85 2:e0091b5311f1 23
legstar85 2:e0091b5311f1 24 // VCC,SCE,RST,D/C,MOSI,SCLK,LED
legstar85 2:e0091b5311f1 25 N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11); // Create Screen Object - K64F - pwr from 3V3, GND Pin also needs connecting
legstar85 2:e0091b5311f1 26
legstar85 3:80c1eba78f9b 27 // y x button
legstar85 3:80c1eba78f9b 28 Joystick joystick(PTB10,PTB11,PTC16); // Define Joystick Object
eencae 0:21a200b880d7 29
legstar85 2:e0091b5311f1 30 Serial pc(USBTX,USBRX); // UART connection for PC
legstar85 2:e0091b5311f1 31
legstar85 11:a6eec09b546e 32 struct State { // Struct for state
legstar85 11:a6eec09b546e 33 int output; // output value
legstar85 11:a6eec09b546e 34 float time; // time in state
legstar85 11:a6eec09b546e 35 int nextState[9]; // array of next states
legstar85 11:a6eec09b546e 36 };
legstar85 11:a6eec09b546e 37
legstar85 11:a6eec09b546e 38 State fsm[11] = {
legstar85 12:5046b7515d5c 39 {15,0.5,{0,1,0,0,0,10,0,0,0}}, // State 0 - 15 Degrees
legstar85 12:5046b7515d5c 40 {16,0.5,{1,2,1,1,1,0,1,1,1}}, // State 1 - 16 Degrees
legstar85 12:5046b7515d5c 41 {17,0.5,{2,3,2,2,2,1,2,2,2}}, // State 2 - 17 Degrees
legstar85 12:5046b7515d5c 42 {18,0.5,{3,4,3,3,3,2,3,3,3}}, // State 3 - 18 Degrees
legstar85 12:5046b7515d5c 43 {19,0.5,{4,5,4,4,4,3,4,4,4}}, // State 4 - 19 Degrees
legstar85 12:5046b7515d5c 44 {20,0.5,{5,6,5,5,5,4,5,5,5}}, // State 5 - 20 Degrees
legstar85 12:5046b7515d5c 45 {21,0.5,{6,7,6,6,6,5,6,6,6}}, // State 6 - 21 Degrees
legstar85 12:5046b7515d5c 46 {22,0.5,{7,8,7,7,7,6,7,7,7}}, // State 7 - 22 Degrees
legstar85 12:5046b7515d5c 47 {23,0.5,{8,9,8,8,8,7,8,8,8}}, // State 8 - 23 Degrees
legstar85 12:5046b7515d5c 48 {24,0.5,{9,10,9,9,9,8,9,9,9}}, // State 9 - 24 Degrees
legstar85 13:5ad65a688f3f 49 {25,0.5,{10,1,10,10,10,9,10,10,10}} // State 10 - 25 Degrees
legstar85 11:a6eec09b546e 50 };
legstar85 11:a6eec09b546e 51
legstar85 5:eebd36a47049 52 Ticker ticker_menu; // Create Menu ticker object
legstar85 5:eebd36a47049 53
legstar85 2:e0091b5311f1 54 DigitalOut r_led(LED_RED); // K64F on-board LEDs
legstar85 2:e0091b5311f1 55 DigitalOut g_led(LED_GREEN); // K64F on-board LEDs
legstar85 2:e0091b5311f1 56 DigitalOut b_led(LED_BLUE); // K64F on-board LEDs
eencae 0:21a200b880d7 57
legstar85 8:07323fcab6d1 58 PwmOut LED01 (PTA1); // PCB Surface Mounted LED's - LED1
legstar85 8:07323fcab6d1 59 PwmOut LED02 (PTA2); // PCB Surface Mounted LED's - LED2
legstar85 8:07323fcab6d1 60 PwmOut LED03 (PTC2); // PCB Surface Mounted LED's - LED3
legstar85 8:07323fcab6d1 61 PwmOut LED04 (PTC3); // PCB Surface Mounted LED's - LED4
legstar85 8:07323fcab6d1 62 PwmOut LED05 (PTC4); // PCB Surface Mounted LED's - LED5
legstar85 8:07323fcab6d1 63 PwmOut LED06 (PTD3); // PCB Surface Mounted LED's - LED6
legstar85 8:07323fcab6d1 64
legstar85 8:07323fcab6d1 65 PwmOut Buzzer (PTC10); // PCB Surface Mounted Piezo Buzzer
legstar85 3:80c1eba78f9b 66
legstar85 2:e0091b5311f1 67 InterruptIn sw2(SW2); // K64F on-board switches
legstar85 2:e0091b5311f1 68 InterruptIn sw3(SW3); // K64F on-board switches
legstar85 3:80c1eba78f9b 69 InterruptIn ButtonA (PTB9); // PCB Button - A
legstar85 3:80c1eba78f9b 70 InterruptIn ButtonB (PTD0); // PCB Button - B
legstar85 7:d77e95505e43 71 InterruptIn ButtonBack (PTB10); // PCB Button - Back
legstar85 3:80c1eba78f9b 72
legstar85 12:5046b7515d5c 73 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 12:5046b7515d5c 74 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 12:5046b7515d5c 75 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 12:5046b7515d5c 76 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 12:5046b7515d5c 77 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 78 volatile int option = 0; // Menu option selection based on joystick direction
legstar85 11:a6eec09b546e 79 volatile int g_state = 0; //
legstar85 11:a6eec09b546e 80 volatile int g_StartTemp = 0; //
legstar85 2:e0091b5311f1 81
legstar85 2:e0091b5311f1 82 void error(); // error function hangs flashing an LED
legstar85 2:e0091b5311f1 83 void init_serial(); // setup serial port
legstar85 2:e0091b5311f1 84 void init_K64F(); // set-up the on-board LEDs and switches
legstar85 3:80c1eba78f9b 85 void init_PCB(); // set-up the PCB LEDs and buttons
legstar85 9:d71b92c916f8 86 void ButtonA_isr(); //
legstar85 9:d71b92c916f8 87 void ButtonB_isr(); //
legstar85 9:d71b92c916f8 88 void ButtonBack_isr(); //
legstar85 9:d71b92c916f8 89 void sw2_isr(); //
legstar85 9:d71b92c916f8 90 void menu_timer_isr(); //
legstar85 6:ebf4784ce92b 91 void OnStartup(); //
legstar85 6:ebf4784ce92b 92 void Run(); //
legstar85 11:a6eec09b546e 93 void StartTemp(); //
eencae 0:21a200b880d7 94
eencae 0:21a200b880d7 95 int main()
eencae 0:21a200b880d7 96 {
legstar85 2:e0091b5311f1 97 init_K64F(); // initialise the board
legstar85 2:e0091b5311f1 98 init_serial(); // initialise the serial port
legstar85 3:80c1eba78f9b 99 init_PCB(); // initialise the PCB
legstar85 3:80c1eba78f9b 100
legstar85 2:e0091b5311f1 101 tmp102.init(); // call the sensor init method using dot syntax
legstar85 2:e0091b5311f1 102 lcd.init(); // initialise display
legstar85 3:80c1eba78f9b 103 joystick.init(); // initialise joystick
legstar85 3:80c1eba78f9b 104
legstar85 5:eebd36a47049 105 ticker_menu.attach(&menu_timer_isr,0.2); // Attach ticker for the Joystick
legstar85 5:eebd36a47049 106
legstar85 3:80c1eba78f9b 107 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 108 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 109 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 110
legstar85 2:e0091b5311f1 111 lcd.setContrast(0.5); // change set contrast in range 0.0 to 1.0
eencae 0:21a200b880d7 112
legstar85 11:a6eec09b546e 113 OnStartup(); // Call intro screen
legstar85 9:d71b92c916f8 114 Run(); // Call main-menu and functions
legstar85 5:eebd36a47049 115 }
eencae 0:21a200b880d7 116
eencae 0:21a200b880d7 117 void init_serial() {
legstar85 2:e0091b5311f1 118 pc.baud(115200); // set to highest baud - ensure terminal software matches
eencae 0:21a200b880d7 119 }
eencae 0:21a200b880d7 120
eencae 0:21a200b880d7 121 void init_K64F()
eencae 0:21a200b880d7 122 {
legstar85 2:e0091b5311f1 123 r_led = 1; // on-board LEDs are active-low, so set pin high to turn them off.
legstar85 2:e0091b5311f1 124 g_led = 1; // on-board LEDs are active-low, so set pin high to turn them off.
legstar85 2:e0091b5311f1 125 b_led = 1; // on-board LEDs are active-low, so set pin high to turn them off.
eencae 0:21a200b880d7 126
legstar85 2:e0091b5311f1 127 sw2.mode(PullNone); // since the on-board switches have external pull-ups, we should disable the internal pull-down
legstar85 2:e0091b5311f1 128 sw3.mode(PullNone); // resistors that are enabled by default using InterruptIn
eencae 0:21a200b880d7 129 }
legstar85 3:80c1eba78f9b 130
legstar85 3:80c1eba78f9b 131 void init_PCB ()
legstar85 3:80c1eba78f9b 132 {
legstar85 3:80c1eba78f9b 133 LED01 = 1; // PCB surface mounted LED's are active low - write a 1 to turn them off initiallly
legstar85 9:d71b92c916f8 134 LED02 = 1; // PCB surface mounted LED's are active low - write a 1 to turn them off initiallly
legstar85 9:d71b92c916f8 135 LED03 = 1; // PCB surface mounted LED's are active low - write a 1 to turn them off initiallly
legstar85 9:d71b92c916f8 136 LED04 = 1; // PCB surface mounted LED's are active low - write a 1 to turn them off initiallly
legstar85 9:d71b92c916f8 137 LED05 = 1; // PCB surface mounted LED's are active low - write a 1 to turn them off initiallly
legstar85 9:d71b92c916f8 138 LED06 = 1; // PCB surface mounted LED's are active low - write a 1 to turn them off initiallly
legstar85 9:d71b92c916f8 139
legstar85 9:d71b92c916f8 140 Buzzer = 0; // Ensure Piezo Buzzer is off
legstar85 3:80c1eba78f9b 141
legstar85 3:80c1eba78f9b 142 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 143 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 144 }
legstar85 3:80c1eba78f9b 145
legstar85 3:80c1eba78f9b 146 void ButtonA_isr() // ButtonA event-triggered interrupt
legstar85 3:80c1eba78f9b 147 {
legstar85 3:80c1eba78f9b 148 g_ButtonA_flag = 1; // set flag in ISR
legstar85 3:80c1eba78f9b 149 }
legstar85 3:80c1eba78f9b 150
legstar85 3:80c1eba78f9b 151 void ButtonB_isr() // ButtonB event-triggered interrupt
legstar85 3:80c1eba78f9b 152 {
legstar85 3:80c1eba78f9b 153 g_ButtonB_flag = 1; // set flag in ISR
legstar85 3:80c1eba78f9b 154 }
legstar85 3:80c1eba78f9b 155
legstar85 7:d77e95505e43 156 void ButtonBack_isr() // ButtonB event-triggered interrupt
legstar85 7:d77e95505e43 157 {
legstar85 7:d77e95505e43 158 g_ButtonBack_flag = 1; // set flag in ISR
legstar85 7:d77e95505e43 159 }
legstar85 7:d77e95505e43 160
legstar85 3:80c1eba78f9b 161 void sw2_isr() // SW2 event-triggered interrupt
legstar85 3:80c1eba78f9b 162 {
legstar85 3:80c1eba78f9b 163 g_sw2_flag = 1; // set flag in ISR
legstar85 5:eebd36a47049 164 }
legstar85 5:eebd36a47049 165
legstar85 5:eebd36a47049 166 void menu_timer_isr()
legstar85 5:eebd36a47049 167 {
legstar85 6:ebf4784ce92b 168 g_menu_timer_flag = 1; // set flag in ISR
legstar85 6:ebf4784ce92b 169 }
legstar85 6:ebf4784ce92b 170
legstar85 9:d71b92c916f8 171 void OnStartup() // Run some start up display
legstar85 6:ebf4784ce92b 172 {
legstar85 12:5046b7515d5c 173 Buzzer.period(1.0/659.0); // Welcome sounds from Piezo
legstar85 12:5046b7515d5c 174 Buzzer = 0.5; //
legstar85 12:5046b7515d5c 175 wait(0.5); //
legstar85 12:5046b7515d5c 176 Buzzer.period(1.0/494.0); //
legstar85 12:5046b7515d5c 177 Buzzer = 0.5; //
legstar85 12:5046b7515d5c 178 wait(0.5); //
legstar85 12:5046b7515d5c 179 Buzzer.period(1.0/554.0); //
legstar85 12:5046b7515d5c 180 Buzzer = 0.5; //
legstar85 12:5046b7515d5c 181 wait(0.5); //
legstar85 12:5046b7515d5c 182 Buzzer = 0; // Turn off welcome sounds
legstar85 9:d71b92c916f8 183 lcd.clear(); // Clear buffer at start of every loop
legstar85 9:d71b92c916f8 184 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 185 lcd.printString(" Smart Cold",0,1); // Just a welcome message before auto moving to main menu
legstar85 7:d77e95505e43 186 lcd.printString(" Storage",0,2); //
legstar85 7:d77e95505e43 187 lcd.printString(" Monitoring",0,3); //
legstar85 13:5ad65a688f3f 188 lcd.printString("V13 - Jan 2022",0,4); //
legstar85 7:d77e95505e43 189 lcd.printString("--------------",0,5); //
legstar85 9:d71b92c916f8 190 lcd.refresh(); // Need to refresh display after setting pixels or writing strings
legstar85 9:d71b92c916f8 191 wait(5.0); // Leave welcome screen on for designated amount of time
legstar85 9:d71b92c916f8 192 lcd.clear(); // Clear buffer at start of every loop
legstar85 9:d71b92c916f8 193 lcd.refresh(); // Need to refresh display after setting pixels or writing strings
legstar85 8:07323fcab6d1 194 lcd.printString("--------------",0,0); //
legstar85 8:07323fcab6d1 195 lcd.printString(" Use Joystick",0,1); // Instruction for use of menu
legstar85 8:07323fcab6d1 196 lcd.printString(" To Navigate",0,2); //
legstar85 8:07323fcab6d1 197 lcd.printString("",0,3); // Blank Line
legstar85 8:07323fcab6d1 198 lcd.printString(" A = Select",0,4); //
legstar85 8:07323fcab6d1 199 lcd.printString("--------------",0,5); //
legstar85 9:d71b92c916f8 200 lcd.refresh(); // Need to refresh display after setting pixels or writing strings
legstar85 7:d77e95505e43 201 wait(5.0); //
legstar85 9:d71b92c916f8 202 init_PCB(); // Ran again to ensure all LED's etc are turned off
legstar85 13:5ad65a688f3f 203 printf("Transition to Temp Selection %i\n",StartTemp); // Observe on serial port - ensure transition to correct screen
legstar85 5:eebd36a47049 204 }
legstar85 5:eebd36a47049 205
legstar85 9:d71b92c916f8 206 enum EMenuState // An enum controlling the current state of the display.
legstar85 6:ebf4784ce92b 207 {
legstar85 12:5046b7515d5c 208 MENUSTATE_StartTemp, // Defining each menu state to be called upon later
legstar85 9:d71b92c916f8 209 MENUSTATE_Main, // Defining each menu state to be called upon later
legstar85 9:d71b92c916f8 210 MENUSTATE_Monitor, // Defining each menu state to be called upon later
legstar85 9:d71b92c916f8 211 MENUSTATE_OneOff, // Defining each menu state to be called upon later
legstar85 9:d71b92c916f8 212 MENUSTATE_About, // Defining each menu state to be called upon later
legstar85 9:d71b92c916f8 213 MENUSTATE_Author, // Defining each menu state to be called upon later
legstar85 6:ebf4784ce92b 214
legstar85 6:ebf4784ce92b 215 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 216 };
legstar85 6:ebf4784ce92b 217
legstar85 6:ebf4784ce92b 218 void Run()
legstar85 5:eebd36a47049 219 {
legstar85 13:5ad65a688f3f 220 int MenuState = MENUSTATE_StartTemp; //
legstar85 9:d71b92c916f8 221 int SelectedItem = 0; //
legstar85 9:d71b92c916f8 222 int NumMenuItems = 1; //
legstar85 6:ebf4784ce92b 223
legstar85 7:d77e95505e43 224 char buffer[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
legstar85 7:d77e95505e43 225
legstar85 6:ebf4784ce92b 226 while(1){
legstar85 9:d71b92c916f8 227 if (g_menu_timer_flag){ //
legstar85 9:d71b92c916f8 228 g_menu_timer_flag = 0; //
legstar85 5:eebd36a47049 229
legstar85 6:ebf4784ce92b 230 bool bAButtonWasPressed = g_ButtonA_flag; // Get the value of the input flags and reset them
legstar85 9:d71b92c916f8 231 bool bBButtonWasPressed = g_ButtonB_flag; // Get the value of the input flags and reset them
legstar85 9:d71b92c916f8 232 g_ButtonA_flag = 0; //
legstar85 9:d71b92c916f8 233 g_ButtonB_flag = 0; //
legstar85 6:ebf4784ce92b 234
legstar85 5:eebd36a47049 235 lcd.clear(); // clear buffer at start of every loop
legstar85 6:ebf4784ce92b 236
legstar85 6:ebf4784ce92b 237 int NewMenuState = MENUSTATTE_Num; // The new menu we want to transition to, if any.
legstar85 6:ebf4784ce92b 238
legstar85 6:ebf4784ce92b 239 switch(MenuState) // Update and Draw whichever menu we're on.
legstar85 11:a6eec09b546e 240 {
legstar85 12:5046b7515d5c 241 case MENUSTATE_StartTemp: //
legstar85 13:5ad65a688f3f 242 {
legstar85 11:a6eec09b546e 243 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 11:a6eec09b546e 244 if(SelectedItem >= NumMenuItems) //
legstar85 11:a6eec09b546e 245 {
legstar85 11:a6eec09b546e 246 SelectedItem = 0; // Something has gone wrong, reset selected item.
legstar85 11:a6eec09b546e 247 }
legstar85 12:5046b7515d5c 248 Direction d = joystick.get_direction();
legstar85 11:a6eec09b546e 249
legstar85 11:a6eec09b546e 250 StartTemp();
legstar85 11:a6eec09b546e 251
legstar85 11:a6eec09b546e 252 float g_StartTemp = fsm[g_state].output; // read temperature and print to lcd
legstar85 12:5046b7515d5c 253 pc.printf("T = %f C\n",g_StartTemp); // Print to serial - allows testing without device attached
legstar85 11:a6eec09b546e 254 printf ("Joystick Direction Points = %i\n",d); //
legstar85 12:5046b7515d5c 255 printf ("State selected = %i\n", g_state); //
legstar85 11:a6eec09b546e 256 int length = sprintf(buffer," T = %.2f C",g_StartTemp); // print formatted data to buffer - it is important the format specifier ensures the length will fit in the buffer
legstar85 13:5ad65a688f3f 257 if (length <= 14){ // if string will fit on display (assuming printing at x=0)
legstar85 13:5ad65a688f3f 258 lcd.printString("- Set Target -",0,0); //
legstar85 13:5ad65a688f3f 259 lcd.printString("---- Temp ----",0,1); //
legstar85 13:5ad65a688f3f 260 lcd.printString(buffer,0,3); // display on screen
legstar85 13:5ad65a688f3f 261 lcd.printString("'A' to Select",0,5); //
legstar85 13:5ad65a688f3f 262 lcd.refresh();
legstar85 13:5ad65a688f3f 263 } // need to refresh display after setting pixels or writing strings
legstar85 12:5046b7515d5c 264
legstar85 11:a6eec09b546e 265 if(bAButtonWasPressed) // If A was pressed then we transition to the selected screen.
legstar85 11:a6eec09b546e 266 {
legstar85 11:a6eec09b546e 267 if(SelectedItem == 0) // If 0 line is selected, move to detailed menu
legstar85 11:a6eec09b546e 268 { // Actually 0 line + 1, see circle draw and selection below
legstar85 11:a6eec09b546e 269 NewMenuState = MENUSTATE_Main; //
legstar85 11:a6eec09b546e 270 }
legstar85 11:a6eec09b546e 271 }
legstar85 11:a6eec09b546e 272 }
legstar85 11:a6eec09b546e 273 break; //
legstar85 9:d71b92c916f8 274 case MENUSTATE_Main: //
legstar85 6:ebf4784ce92b 275 {
legstar85 7:d77e95505e43 276 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 9:d71b92c916f8 277 if(SelectedItem >= NumMenuItems) //
legstar85 6:ebf4784ce92b 278 {
legstar85 6:ebf4784ce92b 279 SelectedItem = 0; // Something has gone wrong, reset selected item.
legstar85 6:ebf4784ce92b 280 }
legstar85 9:d71b92c916f8 281 lcd.printString("---- MENU ----",0,0); // Menu title and selectable options
legstar85 9:d71b92c916f8 282 lcd.printString("M1 - Monitor",0,1); // Printed to the LCD screen
legstar85 9:d71b92c916f8 283 lcd.printString("M2 - One-off",0,2); //
legstar85 9:d71b92c916f8 284 lcd.printString("About",0,3); //
legstar85 9:d71b92c916f8 285 lcd.printString("Author",0,4); //
legstar85 6:ebf4784ce92b 286
legstar85 6:ebf4784ce92b 287 if(bAButtonWasPressed) // If A was pressed then we transition to the selected screen.
legstar85 6:ebf4784ce92b 288 {
legstar85 8:07323fcab6d1 289 if(SelectedItem == 0) // If 0 line is selected, move to detailed menu
legstar85 8:07323fcab6d1 290 { // Actually 0 line + 1, see circle draw and selection below
legstar85 9:d71b92c916f8 291 NewMenuState = MENUSTATE_Monitor; //
legstar85 6:ebf4784ce92b 292 }
legstar85 8:07323fcab6d1 293 else if(SelectedItem == 1) // If 1 line is selected, move to detailed menu
legstar85 8:07323fcab6d1 294 { // Actually 1 line + 1, see circle draw and selection below
legstar85 9:d71b92c916f8 295 NewMenuState = MENUSTATE_OneOff; //
legstar85 6:ebf4784ce92b 296 }
legstar85 8:07323fcab6d1 297 else if(SelectedItem == 2) // If 2 line is selected, move to detailed menu
legstar85 8:07323fcab6d1 298 { // Actually 2 line + 1, see circle draw and selection below
legstar85 9:d71b92c916f8 299 NewMenuState = MENUSTATE_About; //
legstar85 6:ebf4784ce92b 300 }
legstar85 8:07323fcab6d1 301 else if(SelectedItem == 3) // If 3 line is selected, move to detailed menu
legstar85 8:07323fcab6d1 302 { // Actually 3 line + 1, see circle draw and selection below
legstar85 9:d71b92c916f8 303 NewMenuState = MENUSTATE_Author; //
legstar85 7:d77e95505e43 304 }
legstar85 6:ebf4784ce92b 305 }
legstar85 6:ebf4784ce92b 306 }
legstar85 9:d71b92c916f8 307 break; //
legstar85 9:d71b92c916f8 308 case MENUSTATE_Monitor: // Call constant measurement menu following top menu selection
legstar85 6:ebf4784ce92b 309 {
legstar85 8:07323fcab6d1 310 NumMenuItems = 1; // Detail the number of items in Menu - need this to wrap the selection around properly etc.
legstar85 6:ebf4784ce92b 311
legstar85 9:d71b92c916f8 312 if(SelectedItem >= NumMenuItems) //
legstar85 6:ebf4784ce92b 313 {
legstar85 6:ebf4784ce92b 314 NewMenuState = MENUSTATE_Main; // Something has gone wrong, drop back to the main menu.
legstar85 6:ebf4784ce92b 315 }
legstar85 6:ebf4784ce92b 316
legstar85 7:d77e95505e43 317 float T = tmp102.get_temperature(); // read temperature and print to lcd
legstar85 9:d71b92c916f8 318 pc.printf("T = %f K\n",T); // Print to serial - allows testing without device attached
legstar85 7:d77e95505e43 319 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 320 if (length <= 14) // if string will fit on display (assuming printing at x=0)
legstar85 9:d71b92c916f8 321 lcd.printString("-- Constant --",0,0); //
legstar85 9:d71b92c916f8 322 lcd.printString("- Monitoring -",0,1); //
legstar85 7:d77e95505e43 323 lcd.printString(buffer,0,3); // display on screen
legstar85 9:d71b92c916f8 324 lcd.printString(" 'A' to Menu",0,5); //
legstar85 7:d77e95505e43 325 lcd.refresh(); // need to refresh display after setting pixels or writing strings
legstar85 9:d71b92c916f8 326 wait(0.5); //
legstar85 8:07323fcab6d1 327
legstar85 13:5ad65a688f3f 328 if (T >= g_StartTemp + 2) { // High temp alarm condition - in real world would be lot lower!!
legstar85 13:5ad65a688f3f 329 LED01 = !LED01; // Flash LED01 if temperature is over specified - Simulated starting of cold blowers
legstar85 13:5ad65a688f3f 330 LED02 = !LED02; // Flash LED02 if temperature is over specified - Simulated starting of cold blowers
legstar85 13:5ad65a688f3f 331 LED03 = !LED03; // Flash LED03 if temperature is over specified - Simulated starting of cold blowers
legstar85 13:5ad65a688f3f 332 printf("WARNING - High Temp!! \n"); //
legstar85 13:5ad65a688f3f 333 Buzzer.period(1.0/554.0); // Warning Buzzer to extremely high
legstar85 13:5ad65a688f3f 334 Buzzer = 0.5; //
legstar85 13:5ad65a688f3f 335 wait(0.5); //
legstar85 13:5ad65a688f3f 336 Buzzer = 0; //
legstar85 8:07323fcab6d1 337 }
legstar85 13:5ad65a688f3f 338 else {
legstar85 9:d71b92c916f8 339 LED01 = 1; // LED01 off if temperature is below specified - Simulated stopping of cold blowers
legstar85 9:d71b92c916f8 340 LED02 = 1; // LED01 off if temperature is below specified - Simulated stopping of cold blowers
legstar85 9:d71b92c916f8 341 LED03 = 1; // LED01 off if temperature is below specified - Simulated stopping of cold blowers
legstar85 13:5ad65a688f3f 342 Buzzer = 0; // Buzzer off if temperature is below specified - Simulated stopping of cold blowers
legstar85 9:d71b92c916f8 343 }
legstar85 9:d71b92c916f8 344
legstar85 13:5ad65a688f3f 345 if (T <= g_StartTemp - 2) { // High temp alarm condition - in real world would be lot lower!!
legstar85 13:5ad65a688f3f 346 LED04 = !LED04; // Flash LED01 if temperature is over specified - Simulated starting of cold blowers
legstar85 13:5ad65a688f3f 347 LED05 = !LED05; // Flash LED02 if temperature is over specified - Simulated starting of cold blowers
legstar85 13:5ad65a688f3f 348 LED06 = !LED06; // Flash LED03 if temperature is over specified - Simulated starting of cold blowers
legstar85 13:5ad65a688f3f 349 printf("WARNING - Low Temp!! \n"); //
legstar85 13:5ad65a688f3f 350 Buzzer.period(1.0/554.0); // Warning Buzzer to extremely high
legstar85 13:5ad65a688f3f 351 Buzzer = 0.5; //
legstar85 13:5ad65a688f3f 352 wait(0.5); //
legstar85 13:5ad65a688f3f 353 Buzzer = 0; //
legstar85 9:d71b92c916f8 354 }
legstar85 13:5ad65a688f3f 355 else {
legstar85 13:5ad65a688f3f 356 LED04 = 1; // LED01 off if temperature is below specified - Simulated stopping of cold blowers
legstar85 13:5ad65a688f3f 357 LED05 = 1; // LED01 off if temperature is below specified - Simulated stopping of cold blowers
legstar85 13:5ad65a688f3f 358 LED06 = 1; // LED01 off if temperature is below specified - Simulated stopping of cold blowers
legstar85 13:5ad65a688f3f 359 Buzzer = 0; // Buzzer off if temperature is below specified - Simulated stopping of cold blowers
legstar85 8:07323fcab6d1 360 }
legstar85 9:d71b92c916f8 361 if(bAButtonWasPressed) // Check if button was pressed
legstar85 6:ebf4784ce92b 362 {
legstar85 9:d71b92c916f8 363 if(SelectedItem == 0) //
legstar85 6:ebf4784ce92b 364 {
legstar85 9:d71b92c916f8 365 NewMenuState = MENUSTATE_Main; // Transition back to the main menu
legstar85 9:d71b92c916f8 366 LED01 = 1; // Turn off LED upon transition back to main menu
legstar85 9:d71b92c916f8 367 LED02 = 1; // Turn off LED upon transition back to main menu
legstar85 9:d71b92c916f8 368 LED03 = 1; // Turn off LED upon transition back to main menu
legstar85 9:d71b92c916f8 369 LED04 = 1; // Turn off LED upon transition back to main menu
legstar85 9:d71b92c916f8 370 LED05 = 1; // Turn off LED upon transition back to main menu
legstar85 9:d71b92c916f8 371 LED06 = 1; // Turn off LED upon transition back to main menu
legstar85 6:ebf4784ce92b 372 }
legstar85 6:ebf4784ce92b 373 }
legstar85 6:ebf4784ce92b 374 }
legstar85 6:ebf4784ce92b 375 break;
legstar85 11:a6eec09b546e 376 case MENUSTATE_OneOff: // Call a one off measurement menu following top menu selection
legstar85 6:ebf4784ce92b 377 {
legstar85 8:07323fcab6d1 378 NumMenuItems = 1; // Detail the number of items in Menu - need this to wrap the selection around properly etc.
legstar85 9:d71b92c916f8 379 if(SelectedItem >= NumMenuItems) //
legstar85 6:ebf4784ce92b 380 {
legstar85 7:d77e95505e43 381 NewMenuState = MENUSTATE_Main; // Something has gone wrong, drop back to the main menu.
legstar85 6:ebf4784ce92b 382 }
legstar85 6:ebf4784ce92b 383
legstar85 8:07323fcab6d1 384 float T = tmp102.get_temperature(); // read temperature and print to lcd
legstar85 9:d71b92c916f8 385 pc.printf("T = %f K\n",T); // Print to serial - allows testing without device attached
legstar85 8:07323fcab6d1 386 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 13:5ad65a688f3f 387 if (length <= 14){ // if string will fit on display (assuming printing at x=0)
legstar85 13:5ad65a688f3f 388 lcd.printString("-- One-Off --",0,0); //
legstar85 13:5ad65a688f3f 389 lcd.printString("-- Measure --",0,1); //
legstar85 13:5ad65a688f3f 390 lcd.printString(buffer,0,3); // display on screen
legstar85 13:5ad65a688f3f 391 lcd.printString(" 'A' to Menu",0,5); //
legstar85 13:5ad65a688f3f 392 }
legstar85 6:ebf4784ce92b 393
legstar85 9:d71b92c916f8 394 if(bAButtonWasPressed) // Check if button was pressed
legstar85 6:ebf4784ce92b 395 {
legstar85 9:d71b92c916f8 396 if(SelectedItem == 0) //
legstar85 6:ebf4784ce92b 397 {
legstar85 8:07323fcab6d1 398 NewMenuState = MENUSTATE_Main; // Take us back to top menu
legstar85 6:ebf4784ce92b 399 }
legstar85 6:ebf4784ce92b 400 }
legstar85 6:ebf4784ce92b 401
legstar85 6:ebf4784ce92b 402 }
legstar85 6:ebf4784ce92b 403 break;
legstar85 9:d71b92c916f8 404 case MENUSTATE_About: // Call About menu following top menu selection
legstar85 6:ebf4784ce92b 405 {
legstar85 8:07323fcab6d1 406 NumMenuItems = 1; // Detail the number of items in Menu - need this to wrap the selection around properly etc.
legstar85 9:d71b92c916f8 407 if(SelectedItem >= NumMenuItems) //
legstar85 6:ebf4784ce92b 408 {
legstar85 6:ebf4784ce92b 409 NewMenuState = MENUSTATE_Main; // Something has gone wrong, drop back to the main menu.
legstar85 6:ebf4784ce92b 410 }
legstar85 6:ebf4784ce92b 411
legstar85 9:d71b92c916f8 412 lcd.printString("--- About ---",0,0); //
legstar85 9:d71b92c916f8 413 lcd.printString("ELE3006M - IoT",0,1); //
legstar85 9:d71b92c916f8 414 lcd.printString(" Project",0,2); //
legstar85 9:d71b92c916f8 415 lcd.printString("Uni of Lincoln",0,3); //
legstar85 9:d71b92c916f8 416 lcd.printString(" 'A' to Menu",0,5); //
legstar85 9:d71b92c916f8 417 lcd.refresh(); //
legstar85 6:ebf4784ce92b 418
legstar85 9:d71b92c916f8 419 if(bAButtonWasPressed) // Check if button was pressed
legstar85 6:ebf4784ce92b 420 {
legstar85 9:d71b92c916f8 421 if(SelectedItem == 0) //
legstar85 6:ebf4784ce92b 422 {
legstar85 9:d71b92c916f8 423 NewMenuState = MENUSTATE_Main; // Transition back to Main Menu
legstar85 6:ebf4784ce92b 424 }
legstar85 6:ebf4784ce92b 425 }
legstar85 6:ebf4784ce92b 426 }
legstar85 6:ebf4784ce92b 427 break;
legstar85 9:d71b92c916f8 428 case MENUSTATE_Author: // Call Author menu following top menu selection
legstar85 7:d77e95505e43 429 {
legstar85 7:d77e95505e43 430
legstar85 8:07323fcab6d1 431 NumMenuItems = 1; // Detail the number of items in Menu - need this to wrap the selection around properly etc.
legstar85 9:d71b92c916f8 432 if(SelectedItem >= NumMenuItems) //
legstar85 7:d77e95505e43 433 {
legstar85 7:d77e95505e43 434 NewMenuState = MENUSTATE_Main; // Something has gone wrong, drop back to the main menu.
legstar85 7:d77e95505e43 435 }
legstar85 7:d77e95505e43 436
legstar85 9:d71b92c916f8 437 lcd.printString("--- Author ---",0,0); //
legstar85 9:d71b92c916f8 438 lcd.printString("David Leaming ",0,1); //
legstar85 9:d71b92c916f8 439 lcd.printString(" 25574043 ",0,2); //
legstar85 9:d71b92c916f8 440 lcd.printString(" VolkerRail",0,3); //
legstar85 9:d71b92c916f8 441 lcd.printString(" 'A' to Menu",0,5); //
legstar85 7:d77e95505e43 442
legstar85 9:d71b92c916f8 443 if(bAButtonWasPressed) // Check if button was pressed
legstar85 7:d77e95505e43 444 {
legstar85 9:d71b92c916f8 445 if(SelectedItem == 0) //
legstar85 7:d77e95505e43 446 {
legstar85 8:07323fcab6d1 447 NewMenuState = MENUSTATE_Main; // Take us back to top menu
legstar85 7:d77e95505e43 448 }
legstar85 7:d77e95505e43 449 }
legstar85 7:d77e95505e43 450 }
legstar85 7:d77e95505e43 451 break;
legstar85 7:d77e95505e43 452
legstar85 6:ebf4784ce92b 453 default:
legstar85 6:ebf4784ce92b 454 {
legstar85 6:ebf4784ce92b 455 NewMenuState = MENUSTATE_Main; // Something has gone wrong, drop back to the main menu.
legstar85 6:ebf4784ce92b 456 }
legstar85 6:ebf4784ce92b 457 };
legstar85 5:eebd36a47049 458
legstar85 6:ebf4784ce92b 459 if(NewMenuState != MENUSTATTE_Num) // If we have requested a new menu state.
legstar85 6:ebf4784ce92b 460 {
legstar85 8:07323fcab6d1 461 printf("Transitioning to MenuState: %i\n", NewMenuState); // Observe on serial port - ensure transition to correct screen
legstar85 6:ebf4784ce92b 462
legstar85 6:ebf4784ce92b 463 MenuState = NewMenuState; // We want to transition the menu to a new state.
legstar85 6:ebf4784ce92b 464
legstar85 6:ebf4784ce92b 465 // Do any bookkeeping needed when moving to new state.
legstar85 6:ebf4784ce92b 466 SelectedItem = 0; // Reset the selected item.
legstar85 6:ebf4784ce92b 467
legstar85 6:ebf4784ce92b 468 lcd.clear(); // Clear the display for one frame on state transition.
legstar85 11:a6eec09b546e 469 }
legstar85 6:ebf4784ce92b 470 else
legstar85 6:ebf4784ce92b 471 {
legstar85 13:5ad65a688f3f 472 unsigned int SelectionMarkerRadius = 4; // If we have not selected to move to a new menu.
legstar85 13:5ad65a688f3f 473 unsigned int SelectionMarkerX = WIDTH - (2 * SelectionMarkerRadius); // Draw a marker circle at end of line to show which is the currently selected item.
legstar85 13:5ad65a688f3f 474 unsigned int SelectionMarkerY = (HEIGHT / 5) * (SelectedItem + 1); // +1 because of the menu title being on first row
legstar85 13:5ad65a688f3f 475 lcd.drawCircle(SelectionMarkerX, SelectionMarkerY, SelectionMarkerRadius, FILL_BLACK); // Fill the circle black so it can be seen easily
legstar85 6:ebf4784ce92b 476
legstar85 6:ebf4784ce92b 477 // Handle Joystick Input
legstar85 13:5ad65a688f3f 478 Direction d = joystick.get_direction();
legstar85 13:5ad65a688f3f 479 printf("Direction = %i\n");
legstar85 13:5ad65a688f3f 480 switch (joystick.get_direction()) { // Call to check direction joystick is pointing
legstar85 13:5ad65a688f3f 481 case N:
legstar85 13:5ad65a688f3f 482 {
legstar85 13:5ad65a688f3f 483 SelectedItem--;
legstar85 13:5ad65a688f3f 484 printf("Selection decremented to %i\n", SelectedItem);
legstar85 13:5ad65a688f3f 485 }
legstar85 6:ebf4784ce92b 486 break; //
legstar85 13:5ad65a688f3f 487 case S:
legstar85 13:5ad65a688f3f 488 {
legstar85 13:5ad65a688f3f 489 SelectedItem++;
legstar85 13:5ad65a688f3f 490 printf("Selection incremented to %i\n", SelectedItem);
legstar85 13:5ad65a688f3f 491 }
legstar85 6:ebf4784ce92b 492 break; //
legstar85 6:ebf4784ce92b 493 }
legstar85 6:ebf4784ce92b 494
legstar85 9:d71b92c916f8 495 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 496 {
legstar85 9:d71b92c916f8 497 SelectedItem = NumMenuItems - 1; //
legstar85 6:ebf4784ce92b 498 }
legstar85 9:d71b92c916f8 499 else if(SelectedItem >= NumMenuItems) //
legstar85 6:ebf4784ce92b 500 {
legstar85 9:d71b92c916f8 501 SelectedItem = 0; //
legstar85 6:ebf4784ce92b 502 }
legstar85 5:eebd36a47049 503 }
legstar85 5:eebd36a47049 504
legstar85 6:ebf4784ce92b 505 lcd.refresh(); //Finally update the display.
legstar85 6:ebf4784ce92b 506 }
legstar85 6:ebf4784ce92b 507 }
legstar85 5:eebd36a47049 508 }
legstar85 5:eebd36a47049 509
legstar85 11:a6eec09b546e 510 void StartTemp() //
legstar85 11:a6eec09b546e 511 {
legstar85 11:a6eec09b546e 512 Direction d = joystick.get_direction(); //
legstar85 12:5046b7515d5c 513
legstar85 11:a6eec09b546e 514 g_StartTemp = fsm[g_state].output; // set ouput depending on current state
legstar85 11:a6eec09b546e 515 wait(fsm[g_state].time); // wait in that state for desired time
legstar85 11:a6eec09b546e 516 g_state = fsm[g_state].nextState[d]; // read input and update curent state
legstar85 11:a6eec09b546e 517 }
legstar85 13:5ad65a688f3f 518
legstar85 13:5ad65a688f3f 519