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

Dependencies:   mbed

Committer:
legstar85
Date:
Thu Jan 20 22:57:14 2022 +0000
Revision:
12:5046b7515d5c
Parent:
11:a6eec09b546e
Child:
13:5ad65a688f3f
Updated following fixing of Joystick 'Bounce'. Also insertion of a Starting Temp to be compared against following user selection.

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