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

Dependencies:   mbed

Revision:
16:c63a5d084db0
Parent:
15:0cd78b44ea83
Child:
17:793f819e1df6
--- a/main.cpp	Mon Jan 24 20:34:48 2022 +0000
+++ b/main.cpp	Thu Jan 27 08:00:52 2022 +0000
@@ -13,32 +13,32 @@
 * Paul Staron, Piezo Buzzer utility, April 2019
 */ 
 
-#include "mbed.h"                                                               // include the library header, ensure the library has been imported into the project
-#include "TMP102.h"
-#include "N5110.h"
-#include "Joystick.h"
-#include "Bitmap.h"
-#include "SDFileSystem.h"
-
+#include "mbed.h"                                                               // Include the library header, ensure the library has been imported into the project
+#include "TMP102.h"                                                             //
+#include "N5110.h"                                                              //
+#include "Joystick.h"                                                           //
+#include "Bitmap.h"                                                             //
+#include "SDFileSystem.h"                                                       //
+                                                                                //
 TMP102 tmp102(I2C_SDA,I2C_SCL);                                                 // Create TMP102 object  
-
-//        VCC,SCE,RST,D/C,MOSI,SCLK,LED 
+                                                                                //
+//        VCC,SCE,RST,D/C,MOSI,SCLK,LED                                         //    
 N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);                                      // Create Screen Object - K64F - pwr from 3V3, GND Pin also needs connecting
-
-//                  y     x     button
+                                                                                //
+//                  y     x     button                                          //    
 Joystick joystick(PTB10,PTB11,PTC16);                                           // Define Joystick Object 
-
+                                                                                //        
 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd");                                  // MOSI, MISO, SCK, CS - Connections to SD card holder on K64F (SPI interface)
-
+                                                                                //
 Serial pc(USBTX,USBRX);                                                         // UART connection for PC
-
+                                                                                //
 struct State {                                                                  // Struct for state
     int output;                                                                 // output value
     float time;                                                                 // time in state
     int nextState[9];                                                           // array of next states
-};
-
-State fsm[11] = {
+};                                                                              //
+                                                                                //
+State fsm[11] = {                                                               //
     {15,0.5,{0,1,0,0,0,10,0,0,0}},                                              // State 0 - 15 Degrees
     {16,0.5,{1,2,1,1,1,0,1,1,1}},                                               // State 1 - 16 Degrees
     {17,0.5,{2,3,2,2,2,1,2,2,2}},                                               // State 2 - 17 Degrees
@@ -50,29 +50,29 @@
     {23,0.5,{8,9,8,8,8,7,8,8,8}},                                               // State 8 - 23 Degrees
     {24,0.5,{9,10,9,9,9,8,9,9,9}},                                              // State 9 - 24 Degrees
     {25,0.5,{10,1,10,10,10,9,10,10,10}}                                         // State 10 - 25 Degrees   
-};
-
+};                                                                              //
+                                                                                //
 Ticker ticker_menu;                                                             // Create Menu ticker object
-
+                                                                                //        
 DigitalOut r_led(LED_RED);                                                      // K64F on-board LEDs 
 DigitalOut g_led(LED_GREEN);                                                    // K64F on-board LEDs 
 DigitalOut b_led(LED_BLUE);                                                     // K64F on-board LEDs 
-
+                                                                                //
 PwmOut LED01 (PTA1);                                                            // PCB Surface Mounted LED's - LED1
 PwmOut LED02 (PTA2);                                                            // PCB Surface Mounted LED's - LED2
 PwmOut LED03 (PTC2);                                                            // PCB Surface Mounted LED's - LED3
 PwmOut LED04 (PTC3);                                                            // PCB Surface Mounted LED's - LED4
 PwmOut LED05 (PTC4);                                                            // PCB Surface Mounted LED's - LED5
 PwmOut LED06 (PTD3);                                                            // PCB Surface Mounted LED's - LED6
-
+                                                                                //    
 PwmOut Buzzer (PTC10);                                                          // PCB Surface Mounted Piezo Buzzer
-
+                                                                                //
 InterruptIn sw2(SW2);                                                           // K64F on-board switches
 InterruptIn sw3(SW3);                                                           // K64F on-board switches
 InterruptIn ButtonA (PTB9);                                                     // PCB Button - A
 InterruptIn ButtonB (PTD0);                                                     // PCB Button - B
 InterruptIn ButtonBack (PTB10);                                                 // PCB Button - Back
-
+                                                                                //
 volatile int g_ButtonA_flag = 0;                                                // Flag - must be volatile as changes within ISR - g_ prefix makes it easier to distinguish it as global
 volatile int g_ButtonB_flag = 0;                                                // Flag - must be volatile as changes within ISR - g_ prefix makes it easier to distinguish it as global
 volatile int g_ButtonBack_flag = 0;                                             // Flag - must be volatile as changes within ISR - g_ prefix makes it easier to distinguish it as global
@@ -81,7 +81,8 @@
 volatile int option = 0;                                                        // Menu option selection based on joystick direction
 volatile int g_state = 0;                                                       // 
 volatile int g_StartTemp = 0;                                                   // 
-
+volatile float g_TempReading = 0.0f;                                            //
+                                                                                //
 void error();                                                                   // error function hangs flashing an LED
 void init_serial();                                                             // setup serial port
 void init_K64F();                                                               // set-up the on-board LEDs and switches
@@ -95,87 +96,86 @@
 void Run();                                                                     // 
 void StartTemp();                                                               //
 void delete_file(char filename[]);                                              //
-void WriteToFile();                                                             // Function to attempt to write temperature to file
-void OneOff();                                                                  // 
-
-int main()
-{
-    init_K64F();                                                                // initialise the board
+                                                                                //
+                                                                                //
+int main()                                                                      //
+{                                                                               //
+    init_K64F();                                                                // Initialise the board
     init_serial();                                                              // initialise the serial port
-    init_PCB();                                                                 // initialise the PCB
-        
-    tmp102.init();                                                              // call the sensor init method using dot syntax
-    lcd.init();                                                                 // initialise display
-    joystick.init();                                                            // initialise joystick
-    
+    init_PCB();                                                                 // Initialise the PCB
+                                                                                //
+    tmp102.init();                                                              // Call the sensor init method using dot syntax
+    lcd.init();                                                                 // Initialise display
+    joystick.init();                                                            // Initialise joystick
+                                                                                //        
     ticker_menu.attach(&menu_timer_isr,0.2);                                    // Attach ticker for the Joystick
-    
+                                                                                //
     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
     ButtonA.rise(&ButtonA_isr);                                                 // External push button, pin set to 0V by pull down command, means a rising edge is looked for
     ButtonB.rise(&ButtonB_isr);                                                 // External push button, pin set to 0V by pull down command, means a rising edge is looked for
-    
+                                                                                //
     lcd.setContrast(0.5);                                                       // change set contrast in range 0.0 to 1.0
-    
+                                                                                //
     OnStartup();                                                                // Call intro screen   
     Run();                                                                      // Call main-menu and functions
-}      
-
-void init_serial() {
+}                                                                               //
+                                                                                //
+void init_serial() {                                                            //
     pc.baud(115200);                                                            // set to highest baud - ensure terminal software matches
-}
-
-void init_K64F() 
-{
+}                                                                               //        
+                                                                                //
+void init_K64F()                                                                //
+{                                                                               // 
     r_led = 1;                                                                  // on-board LEDs are active-low, so set pin high to turn them off.
     g_led = 1;                                                                  // on-board LEDs are active-low, so set pin high to turn them off.
     b_led = 1;                                                                  // on-board LEDs are active-low, so set pin high to turn them off.
-    
+                                                                                //
     sw2.mode(PullNone);                                                         // since the on-board switches have external pull-ups, we should disable the internal pull-down
     sw3.mode(PullNone);                                                         // resistors that are enabled by default using InterruptIn
-}
-
-void init_PCB ()
-{
+}                                                                               //
+                                                                                //
+void init_PCB ()                                                                //        
+{                                                                               //        
     LED01 = 1;                                                                  // PCB surface mounted LED's are active low - write a 1 to turn them off initiallly
     LED02 = 1;                                                                  // PCB surface mounted LED's are active low - write a 1 to turn them off initiallly
     LED03 = 1;                                                                  // PCB surface mounted LED's are active low - write a 1 to turn them off initiallly
     LED04 = 1;                                                                  // PCB surface mounted LED's are active low - write a 1 to turn them off initiallly    
     LED05 = 1;                                                                  // PCB surface mounted LED's are active low - write a 1 to turn them off initiallly
     LED06 = 1;                                                                  // PCB surface mounted LED's are active low - write a 1 to turn them off initiallly    
-    
+                                                                                //
     Buzzer = 0;                                                                 // Ensure Piezo Buzzer is off
-    
+                                                                                //
     ButtonA.mode(PullDown);                                                     // Set pin to Pull Down to OV, meaning that a rising edge is looked for when button is pressed
     ButtonB.mode(PullDown);                                                     // Set pin to Pull Down to OV, meaning that a rising edge is looked for when button is pressed
-}
-
+}                                                                               //        
+                                                                                //
 void ButtonA_isr()                                                              // ButtonA event-triggered interrupt
-{
+{                                                                               //
     g_ButtonA_flag = 1;                                                         // set flag in ISR
-}
-
+}                                                                               //        
+                                                                                //
 void ButtonB_isr()                                                              // ButtonB event-triggered interrupt
-{
+{                                                                               //
     g_ButtonB_flag = 1;                                                         // set flag in ISR
-}
-
+}                                                                               //
+                                                                                //
 void ButtonBack_isr()                                                           // ButtonB event-triggered interrupt
-{
+{                                                                               //
     g_ButtonBack_flag = 1;                                                      // set flag in ISR
-}
-
+}                                                                               //
+                                                                                //
 void sw2_isr()                                                                  // SW2 event-triggered interrupt
-{
+{                                                                               //
     g_sw2_flag = 1;                                                             // set flag in ISR
-}
-
-void menu_timer_isr()
-{
+}                                                                               //
+                                                                                //    
+void menu_timer_isr()                                                           //
+{                                                                               //
     g_menu_timer_flag = 1;                                                      // set flag in ISR
-}
-
+}                                                                               //
+                                                                                //        
 void OnStartup()                                                                // Run some start up display 
-{
+{                                                                               //
     Buzzer.period(1.0/659.0);                                                   // Welcome sounds from Piezo
     Buzzer = 0.5;                                                               //                   
     wait(0.5);                                                                  // 
@@ -191,7 +191,7 @@
     lcd.printString("  Smart Cold",0,1);                                        // Just a welcome message before auto moving to main menu
     lcd.printString("   Storage",0,2);                                          //
     lcd.printString("  Monitoring",0,3);                                        // 
-    lcd.printString("V16 - Jan 2022",0,4);                                      //
+    lcd.printString("V17 - Jan 2022",0,4);                                      //
     lcd.printString("--------------",0,5);                                      //
     lcd.refresh();                                                              // Need to refresh display after setting pixels or writing strings 
     wait(5.0);                                                                  // Leave welcome screen on for designated amount of time
@@ -207,125 +207,128 @@
     wait(5.0);                                                                  //
     init_PCB();                                                                 // Ran again to ensure all LED's etc are turned off
     printf("Transition to Temp Selection %i\n",StartTemp);                      // Observe on serial port - ensure transition to correct screen
-}
-
+}                                                                               //
+                                                                                //
 enum EMenuState                                                                 // An enum controlling the current state of the display.
-{
-    MENUSTATE_StartTemp,                                                        // Defining each menu state to be called upon later
-    MENUSTATE_Main,                                                             // Defining each menu state to be called upon later
-    MENUSTATE_Monitor,                                                          // Defining each menu state to be called upon later
-    MENUSTATE_OneOff,                                                           // Defining each menu state to be called upon later
-    MENUSTATE_Results,                                                          // Defining each menu state to be called upon later
-    MENUSTATE_About,                                                            // Defining each menu state to be called upon later
-    MENUSTATE_Author,                                                           // Defining each menu state to be called upon later
-    
-    MENUSTATTE_Num,                                                             // This is a special enum value that just gives is a way to get the number of elements in the enum.
-};
-
-void Run()
-{
+{                                                                               //
+    MENUSTATE_StartTemp,                                                        // Defining each menu state to be called upon later (Integer Value of 0)
+    MENUSTATE_Main,                                                             // Defining each menu state to be called upon later (Integer Value of 1)
+    MENUSTATE_Monitor,                                                          // Defining each menu state to be called upon later (Integer Value of 2)
+    MENUSTATE_OneOff,                                                           // Defining each menu state to be called upon later (Integer Value of 3)
+    MENUSTATE_Results,                                                          // Defining each menu state to be called upon later (Integer Value of 4)
+    MENUSTATE_About,                                                            // Defining each menu state to be called upon later (Integer Value of 5)
+    MENUSTATE_Author,                                                           // Defining each menu state to be called upon later (Integer Value of 6)
+                                                                                //    
+    MENUSTATTE_Num,                                                             // This is a special enum value that allows us to check and see how many menus we have, +1 of menu integer value
+};                                                                              //
+                                                                                //
+void Run()                                                                      //
+{                                                                               //    
     int MenuState = MENUSTATE_StartTemp;                                        // Ensuring that the first Menu State to be brought up is the Temperature Selection Page 
     int SelectedItem = 0;                                                       // 
     int NumMenuItems = 1;                                                       // 
-    
+    int NumFramesInState = 0;                                                   // How many frames have we been in the current menu state.
+                                                                                //    
     char buffer[14];                                                            // Each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
-    
-    while(1){
+                                                                                //
+    FILE *fp = NULL;                                                            // This is our file pointer
+                                                                                //
+    while(1){                                                                   // Project infinite while loop       
         if (g_menu_timer_flag){                                                 //        
             g_menu_timer_flag = 0;                                              // 
-            
+                                                                                //
             bool bAButtonWasPressed = g_ButtonA_flag;                           // Get the value of the input flags and reset them
             bool bBButtonWasPressed = g_ButtonB_flag;                           // Get the value of the input flags and reset them
             g_ButtonA_flag = 0;                                                 // 
             g_ButtonB_flag = 0;                                                 // 
-            
-            lcd.clear();                                                        // clear buffer at start of every loop
-                        
+                                                                                //
+            lcd.clear();                                                        // Clear buffer at start of every loop
+                                                                                //
             int NewMenuState = MENUSTATTE_Num;                                  // The new menu we want to transition to, if any.
-        
+                                                                                //
             switch(MenuState)                                                   // Update and Draw whichever menu we're on.
-            {      
+            {                                                                   //
                 case MENUSTATE_StartTemp:                                       //
-                {                    
+                {                                                               //
                     NumMenuItems = 1;                                           // Details number of items in the menu. We need this to wrap the selection around properly etc.
                     if(SelectedItem >= NumMenuItems)                            // 
-                    {
+                    {                                                           //
                         SelectedItem = 0;                                       // Something has gone wrong, reset selected item.
-                    }
-                    Direction d = joystick.get_direction();                               
-                    
-                    StartTemp();
-                    
-                    float g_StartTemp = fsm[g_state].output;                    // read temperature and print to lcd
+                    }                                                           //
+                    Direction d = joystick.get_direction();                     //          
+                                                                                //    
+                    StartTemp();                                                //
+                                                                                //
+                    float g_StartTemp = fsm[g_state].output;                    // Read temperature from FSM and print selection to LCD
                     pc.printf("T = %f C\n",g_StartTemp);                        // Print to serial - allows testing without device attached
                     printf ("Joystick Direction Points = %i\n",d);              //
                     printf ("State selected = %i\n", g_state);                  //
-                    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
-                    if (length <= 14){                                          // if string will fit on display (assuming printing at x=0)
+                    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
+                    if (length <= 14){                                          // If string will fit on display (assuming printing at x=0)
                         lcd.printString("- Set Target -",0,0);                  // 
                         lcd.printString("---- Temp ----",0,1);                  // 
-                        lcd.printString(buffer,0,3);                            // display on screen
+                        lcd.printString(buffer,0,3);                            // Display on screen
                         lcd.printString("'A' to Select",0,5);                   //                      
-                        lcd.refresh();      
+                        lcd.refresh();                                          //
                     }                                                           // need to refresh display after setting pixels or writing strings 
- 
+                                                                                //
                     if(bAButtonWasPressed)                                      // If A was pressed then we transition to the selected screen.
-                    {
+                    {                                                           //    
                         if(SelectedItem == 0)                                   // If 0 line is selected, move to detailed menu 
                         {                                                       // Actually 0 line + 1, see circle draw and selection below
                             NewMenuState = MENUSTATE_Main;                      // 
-                        }
-                    }
-                }
+                        }                                                       //
+                    }                                                           //
+                }                                                               //
                 break;                                                          //         
                 case MENUSTATE_Main:                                            //
-                {
+                {                                                               //    
                     NumMenuItems = 5;                                           // Details number of items in the menu. We need this to wrap the selection around properly etc.
                     if(SelectedItem >= NumMenuItems)                            // 
-                    {
+                    {                                                           //
                         SelectedItem = 0;                                       // Something has gone wrong, reset selected item.
-                    }
+                    }                                                           // 
                     lcd.printString("---- MENU ----",0,0);                      // Menu title and selectable options    
                     lcd.printString("M1 - Monitor",0,1);                        // Printed to the LCD screen
                     lcd.printString("M2 - One-off",0,2);                        // 
                     lcd.printString("Results",0,3);                             //
                     lcd.printString("About",0,4);                               //
                     lcd.printString("Author",0,5);                              // 
-                    
+                                                                                // 
                     if(bAButtonWasPressed)                                      // If A was pressed then we transition to the selected screen.
-                    {
+                    {                                                           // 
                         if(SelectedItem == 0)                                   // If 0 line is selected, move to detailed menu 
                         {                                                       // Actually 0 line + 1, see circle draw and selection below
                             NewMenuState = MENUSTATE_Monitor;                   // 
-                        }
+                        }                                                       // 
                         else if(SelectedItem == 1)                              // If 1 line is selected, move to detailed menu 
                         {                                                       // Actually 1 line + 1, see circle draw and selection below
                             NewMenuState = MENUSTATE_OneOff;                    // 
-                        }
+                        }                                                       // 
                         else if(SelectedItem == 2)                              // If 2 line is selected, move to detailed menu 
                         {                                                       // Actually 2 line + 1, see circle draw and selection below
                             NewMenuState = MENUSTATE_Results;                   // 
-                        }
+                        }                                                       //
                         else if(SelectedItem == 3)                              // If 3 line is selected, move to detailed menu 
                         {                                                       // Actually 3 line + 1, see circle draw and selection below
                             NewMenuState = MENUSTATE_About;                     // 
-                        }
+                        }                                                       //        
                         else if(SelectedItem == 4)                              // If 4 line is selected, move to detailed menu 
                         {                                                       // Actually 4 line + 1, see circle draw and selection below
                             NewMenuState = MENUSTATE_Author;                    // 
-                        }
-                    }
-                }
+                        }                                                       //
+                    }                                                           //
+                }                                                               //
                 break;                                                          // 
                 case MENUSTATE_Monitor:                                         // Call constant measurement menu following top menu selection
-                {
+                {                                                               //
                     NumMenuItems = 1;                                           // Detail the number of items in Menu -  need this to wrap the selection around properly etc.
-                    
+                                                                                //
                     if(SelectedItem >= NumMenuItems)                            // 
-                    {
+                    {                                                           //
                         NewMenuState = MENUSTATE_Main;                          // Something has gone wrong, drop back to the main menu.
-                    }
-                    
+                    }                                                           //        
+                                                                                //
                     float T = tmp102.get_temperature();                         // read temperature and print to lcd
                     pc.printf("T = %f K\n",T);                                  // Print to serial - allows testing without device attached
                     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
@@ -336,7 +339,7 @@
                     lcd.printString(" 'A' to Menu",0,5);                        // 
                     lcd.refresh();                                              // need to refresh display after setting pixels or writing strings 
                     wait(0.5);                                                  // 
-                    
+                                                                                //
                     if (T >= g_StartTemp + 2) {                                 // High temp alarm condition - in real world would be lot lower!!
                         LED01 = !LED01;                                         // Flash LED01 if temperature is over specified - Simulated starting of cold blowers
                         LED02 = !LED02;                                         // Flash LED02 if temperature is over specified - Simulated starting of cold blowers
@@ -346,34 +349,33 @@
                         Buzzer = 0.5;                                           // 
                         wait(0.5);                                              // 
                         Buzzer = 0;                                             //
-                    } 
-                    else  {
+                    }                                                           //
+                    else  {                                                     //
                         LED01 = 1;                                              // LED01 off if temperature is below specified - Simulated stopping of cold blowers
                         LED02 = 1;                                              // LED01 off if temperature is below specified - Simulated stopping of cold blowers
                         LED03 = 1;                                              // LED01 off if temperature is below specified - Simulated stopping of cold blowers
                         Buzzer = 0;                                             // Buzzer off if temperature is below specified - Simulated stopping of cold blowers
-                    } 
-                    
+                    }                                                           //
+                                                                                //
                     if (T <= g_StartTemp - 2) {                                 // High temp alarm condition - in real world would be lot lower!!
                         LED04 = !LED04;                                         // Flash LED01 if temperature is over specified - Simulated starting of heaters
                         LED05 = !LED05;                                         // Flash LED02 if temperature is over specified - Simulated starting of heaters
                         LED06 = !LED06;                                         // Flash LED03 if temperature is over specified - Simulated starting of heaters
                         printf("WARNING - Low Temp!! \n");                      //
-                        Buzzer.period(1.0/554.0);                               // Warning Buzzer to extremely high 
-                        Buzzer = 0.5;                                           // 
+                        Buzzer.period(1.0/554.0);                               // Warning Buzzer to extremely low
                         wait(0.5);                                              // 
                         Buzzer = 0;                                             //
-                    } 
-                    else  {
+                    }                                                           //
+                    else  {                                                     //    
                         LED04 = 1;                                              // LED01 off if temperature is below specified - Simulated stopping of heaters
                         LED05 = 1;                                              // LED01 off if temperature is below specified - Simulated stopping of heaters
                         LED06 = 1;                                              // LED01 off if temperature is below specified - Simulated stopping of heaters
                         Buzzer = 0;                                             // Buzzer off if temperature is below specified - Simulated stopping of heaters
-                    } 
+                    }                                                           //
                     if(bAButtonWasPressed)                                      // Check if button was pressed
-                    {
+                    {                                                           //
                         if(SelectedItem == 0)                                   // 
-                        {
+                        {                                                       //
                             NewMenuState = MENUSTATE_Main;                      // Transition back to the main menu
                             LED01 = 1;                                          // Turn off LED upon transition back to main menu
                             LED02 = 1;                                          // Turn off LED upon transition back to main menu
@@ -381,211 +383,200 @@
                             LED04 = 1;                                          // Turn off LED upon transition back to main menu
                             LED05 = 1;                                          // Turn off LED upon transition back to main menu
                             LED06 = 1;                                          // Turn off LED upon transition back to main menu
-                        }
-                    }
-                }
-                break;      
+                        }                                                       //
+                    }                                                           //
+                }                                                               //
+                break;                                                          //
                 case MENUSTATE_OneOff:                                          // Call a one off measurement menu following top menu selection
-                {
+                {                                                               //
                     NumMenuItems = 1;                                           // Detail the number of items in Menu -  need this to wrap the selection around properly etc.
                     if(SelectedItem >= NumMenuItems)                            // 
-                    {
+                    {                                                           //
                         NewMenuState = MENUSTATE_Main;                          // Something has gone wrong, drop back to the main menu.
-                    }
-                    
-                    OneOff();                                                   // read temperature and print to lcd
-
-                                        
+                    }                                                           //
+                                                                                //        
+                    if(NumFramesInState == 0)                                   //
+                    {                                                           //
+                        g_TempReading = tmp102.get_temperature();               // Gather the temp readings only on the frame we enter this state and keep printing this same temp, not to refresh and read new temp.
+                    }                                                           //
+                                                                                //
+                    pc.printf("T = %f K\n",g_TempReading);                      // Print to serial - allows testing without device attached
+                    int length = sprintf(buffer," T = %.2f C",g_TempReading);   // print formatted data to buffer - it is important the format specifier ensures the length will fit in the buffer
+                    if (length <= 14){                                          // if string will fit on display (assuming printing at x=0)
+                        lcd.printString("-- One-Off --",0,0);                   // 
+                        lcd.printString("-- Measure --",0,1);                   // 
+                        lcd.printString(buffer,0,3);                            // display on screen
+                        lcd.printString(" 'A' to Menu",0,5);                    // 
+                    }                                                           //
+                                                                                //
                     if(bAButtonWasPressed)                                      // Check if button was pressed
-                    {
+                    {                                                           //
                         if(SelectedItem == 0)                                   // 
-                        {
+                        {                                                       //
                             NewMenuState = MENUSTATE_Main;                      // Take us back to top menu
-                        }
-                    }                   
-                    
-                }
-                break; 
+                        }                                                       //
+                    }                                                           //                                                                         
+                }                                                               //
+                break;                                                          //
                 case MENUSTATE_Results:                                         // Call results menu following top menu selection
-                {
-
+                {                                                               //
                     NumMenuItems = 1;                                           // Detail the number of items in Menu -  need this to wrap the selection around properly etc.
                     if(SelectedItem >= NumMenuItems)                            // 
-                    {
+                    {                                                           //
+                        NewMenuState = MENUSTATE_Main;                          // Something has gone wrong, drop back to the main menu.
+                    }                                                           //
+                                                                                //
+                    if(NumFramesInState == 0)                                   //
+                    {                                                           //
+                        if(fp != NULL){                                         //        
+                            printf("Error! File already open!\n");              //
+                            fclose(fp);                                         //
+                        }                                                       //
+                                                                                //
+                        fp = fopen("/sd/overnighttemp.csv", "w");               // Open our file handle on the first frame.  
+                    }                                                           //                                    
+                                                                                //
+                    if (fp == NULL) {                                           // if it can't open the file then print error message
+                        printf("Error! Unable to open file! Returning to main menu.\n");                    //                        
                         NewMenuState = MENUSTATE_Main;                          // Something has gone wrong, drop back to the main menu.
-                    }
-                    
-                    WriteToFile();                                              //
-                    
-                    lcd.printString("--- Results ---",0,0);                     // 
-                    lcd.printString(" ",0,1);                                   // 
-                    lcd.printString(" ",0,2);                                   // 
-                    lcd.printString(" ",0,3);                                   // 
-                    lcd.printString(" ",0,4);                                   // 
-                    lcd.printString(" 'A' to Menu",0,5);                        // 
-                                        
+                    }                                                           //
+                    else                                                        //
+                    {                                                           //
+                        float T = tmp102.get_temperature();                     // Read temperature and print to lcd
+                        pc.printf("T = %f K\n",T);                              // Print to serial - allows testing without device attached
+                        fprintf(fp, "%d,%f\n",NumFramesInState,T);              // Print formatted string to file (CSV)
+                                                                                //
+                        lcd.printString("-- Results --",0,0);                   // 
+                        lcd.printString(" Writing",0,1);                        // 
+                        lcd.printString(" results to ",0,2);                    // 
+                        lcd.printString(" file...",0,3);                        // 
+                        lcd.printString(" ",0,4);                               // 
+                        lcd.printString(" 'A' to Menu",0,5);                    // 
+                    }                                                           //
+                                                                                //
                     if(bAButtonWasPressed)                                      // Check if button was pressed
-                    {
+                    {                                                           //            
                         if(SelectedItem == 0)                                   // 
-                        {
+                        {                                                       //
                             NewMenuState = MENUSTATE_Main;                      // Take us back to top menu 
-                        }
-                    }
-                }
-                break;     
+                        }                                                       //
+                    }                                                           //
+                }                                                               //
+                break;                                                          //
                 case MENUSTATE_About:                                           // Call About menu following top menu selection
-                {
+                {                                                               //
                     NumMenuItems = 1;                                           // Detail the number of items in Menu -  need this to wrap the selection around properly etc.
                     if(SelectedItem >= NumMenuItems)                            // 
-                    {
+                    {                                                           //
                         NewMenuState = MENUSTATE_Main;                          // Something has gone wrong, drop back to the main menu.
-                    }
-                    
+                    }                                                           //  
+                                                                                //    
                     lcd.printString("--- About ---",0,0);                       // 
                     lcd.printString("ELE3006M - IoT",0,1);                      // 
                     lcd.printString("    Project",0,2);                         // 
                     lcd.printString("Uni of Lincoln",0,3);                      // 
                     lcd.printString(" 'A' to Menu",0,5);                        // 
                     lcd.refresh();                                              // 
-                                        
+                                                                                //
                     if(bAButtonWasPressed)                                      // Check if button was pressed
-                    {
+                    {                                                           //
                         if(SelectedItem == 0)                                   // 
-                        {
+                        {                                                       //
                             NewMenuState = MENUSTATE_Main;                      // Transition back to Main Menu
-                        }
-                    }
-                }
-                break;
+                        }                                                       //
+                    }                                                           //    
+                }                                                               //    
+                break;                                                          //
                 case MENUSTATE_Author:                                          // Call Author menu following top menu selection
-                {
-
+                {                                                               //
                     NumMenuItems = 1;                                           // Detail the number of items in Menu -  need this to wrap the selection around properly etc.
                     if(SelectedItem >= NumMenuItems)                            // 
-                    {
+                    {                                                           //
                         NewMenuState = MENUSTATE_Main;                          // Something has gone wrong, drop back to the main menu.
-                    }
-                    
+                    }                                                           //
+                                                                                //
                     lcd.printString("--- Author ---",0,0);                      // 
                     lcd.printString("David Leaming ",0,1);                      // 
                     lcd.printString("   25574043 ",0,2);                        // 
                     lcd.printString("  VolkerRail",0,3);                        // 
                     lcd.printString(" 'A' to Menu",0,5);                        // 
-                                        
+                                                                                //
                     if(bAButtonWasPressed)                                      // Check if button was pressed
-                    {
+                    {                                                           //
                         if(SelectedItem == 0)                                   // 
-                        {
+                        {                                                       //
                             NewMenuState = MENUSTATE_Main;                      // Take us back to top menu 
-                        }
-                    }
-                }
-                break;
-                
-                default:
-                {
+                        }                                                       //    
+                    }                                                           // 
+                }                                                               //
+                break;                                                          //        
+                default:                                                        //
+                {                                                               //
                     NewMenuState = MENUSTATE_Main;                              // Something has gone wrong, drop back to the main menu.
-                }
-            };
-            
+                }                                                               //
+            };                                                                  //
+                                                                                //
             if(NewMenuState != MENUSTATTE_Num)                                  // If we have requested a new menu state.
-            {
+            {                                                                   //
                 printf("Transitioning to MenuState: %i\n", NewMenuState);       // Observe on serial port - ensure transition to correct screen
-                
+                                                                                //    
                 MenuState = NewMenuState;                                       // We want to transition the menu to a new state.
-                
+                                                                                //
                                                                                 // Do any bookkeeping needed when moving to new state.
-                SelectedItem = 0;                                               // Reset the selected item.   
-                
+                SelectedItem = 0;                                               // Reset the selected item.
+                NumFramesInState = 0;                                           // Reset the frames in current state count.
+                                                                                //
+                if(fp){                                                         //
+                    fclose(fp);                                                 // Ensure we close the file if the current state had one open.
+                    fp = NULL;                                                  //
+                }                                                               //
                 lcd.clear();                                                    // Clear the display for one frame on state transition.
-            }                                                                   
-            else
-            {
+            }                                                                   //
+            else                                                                //
+            {                                                                   //    
+                ++NumFramesInState;                                             //            
+                                                                                
                 unsigned int SelectionMarkerRadius = 4;                                                         // If we have not selected to move to a new menu.
                 unsigned int SelectionMarkerX = WIDTH - (2 * SelectionMarkerRadius);                            // Draw a marker circle at end of line to show which is the currently selected item.
                 unsigned int SelectionMarkerY = (HEIGHT / 5) * (SelectedItem + 1);                              // +1 because of the menu title being on first row
                 lcd.drawCircle(SelectionMarkerX, SelectionMarkerY, SelectionMarkerRadius, FILL_BLACK);          // Fill the circle black so it can be seen easily                                                   
                             
                                                                                 // Handle Joystick Input
-                Direction d = joystick.get_direction();                                                                 
-                printf("Direction = %i\n"); 
+                Direction d = joystick.get_direction();                         //                                        
+                printf("Direction = %i\n", d);                                  //
                 switch (joystick.get_direction())  {                            // Call to check direction joystick is pointing                                     
-                    case N:        
-                    {   
-                        SelectedItem--;                                           
-                        printf("Selection decremented to %i\n", SelectedItem); 
-                    }
+                    case N:                                                     //
+                    {                                                           //        
+                        SelectedItem--;                                         //  
+                        printf("Selection decremented to %i\n", SelectedItem);  //
+                    }                                                           //
                     break;                                                      //
-                    case S:   
-                    {
-                        SelectedItem++;
-                        printf("Selection incremented to %i\n", SelectedItem); 
-                    }
+                    case S:                                                     //
+                    {                                                           //
+                        SelectedItem++;                                         //    
+                        printf("Selection incremented to %i\n", SelectedItem);  //
+                    }                                                           //
                     break;                                                      //
-                }
-                
+                }                                                               //
                 if(SelectedItem < 0)                                            // Wrap the selection around to the start/end of the menu if it goes below 0 or above NumMenuItems.
-                {                   
+                {                                                               //
                     SelectedItem = NumMenuItems - 1;                            // 
-                }
+                }                                                               //
                 else if(SelectedItem >= NumMenuItems)                           //
-                {
+                {                                                               //
                     SelectedItem = 0;                                           // 
-                }
-            }
-            
+                }                                                               //
+            }                                                                   //
             lcd.refresh();                                                      // Finally update the display.
-        }
-    }       
-}  
-
+        }                                                                       //    
+    }                                                                           //
+}                                                                               //
+                                                                                //
 void StartTemp()                                                                //
-{
+{                                                                               //
     Direction d = joystick.get_direction();                                     //
-             
+                                                                                //
         g_StartTemp = fsm[g_state].output;                                      // set ouput depending on current state
         wait(fsm[g_state].time);                                                // wait in that state for desired time           
         g_state = fsm[g_state].nextState[d];                                    // read input and update curent state 
-}
-
-void WriteToFile()                                                              // Function to attempt to write temperature to file
-{
-    printf("#### SD Card Example #####\n");
-    FILE *fp;                                                                   // this is our file pointer
-    
-    float T = tmp102.get_temperature();                                         // read temperature and print to lcd
-    pc.printf("T = %f K\n",T);                                                  // Print to serial - allows testing without device attached
-    
-    fp = fopen("/sd/overnighttemp", "w");                                       // 
-    int ONight_Temp = T;                                                        // 
-    
-    if (fp == NULL) {                                                           // if it can't open the file then print error message
-    printf("Error! Unable to open file!\n");
-    } 
-    else {                                                                      // opened file so can write
-        printf("Writing to file....");
-        for(int i = T; i <= 50; i++) {
-            float T = 1000.0F/i;                                                // dummy variable
-            fprintf(fp, "%d,%f\n",i,T);                                         // print formatted string to file (CSV)
-        }
-        printf("Done.\n");
-        fclose(fp);                                                             // ensure you close the file after writing
-    }
-}
-
-void OneOff()                                                                   // 
-{
-    char buffer[14];                                                            // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
-    
-    lcd.clear();                                                                // 
-    
-    float T = tmp102.get_temperature();                                         // read temperature and print to lcd
-    pc.printf("T = %f K\n",T);                                                  // Print to serial - allows testing without device attached
-    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
-    if (length <= 14){                                                          // if string will fit on display (assuming printing at x=0)
-    lcd.printString("-- One-Off --",0,0);                                       // 
-    lcd.printString("-- Measure --",0,1);                                       // 
-    lcd.printString(buffer,0,3);                                                // display on screen
-    lcd.printString(" 'A' to Menu",0,5);                                        // 
-    }                                                                           //
-}                                                                               //
\ No newline at end of file
+}                                                                               //