TEST

Dependencies:   max32630fthr Adafruit_FeatherOLED USBDevice

Revision:
1:f60eafbf009a
Child:
3:2fe2ff1ca0dc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/WatchInterface.cpp	Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,1133 @@
+/*
+ * WatchInterface.cpp
+ *
+ *  Created on: Aug 28, 2018
+ *      Author: Gokhan.Bektas
+ */
+
+
+
+#include "WatchInterface.h"
+#include "Peripherals.h"
+#include "LS013B7DH03.h"
+#include "mbed_logo.h"
+
+#include "UbuntuCondensed38x47.h"
+#include "ubuntucondensed20x26.h"
+#include "ubuntucondensed16x21.h"
+#include "Arial10x10.h"
+#include "Neu44x36.h"
+#include "mxm_assert.h"
+#include "utils.h"
+#include "../version.h"
+
+//Non-const static members must be both declared in the class definition and defined with global scope to properly give the linker something to reference.
+bool WatchInterface::refreshed = true;
+
+
+WatchInterface::WatchInterface(PinName buttonUp, PinName buttonDown, PinName buttonPower, PinName displayCS, PinName displayEXTCOM, PinName displayDISP, SPI* displaySPI):
+	btnUp(buttonUp), btnDown(buttonDown), btnPower(buttonPower), dispCS(displayCS), dispEXTCOM(displayEXTCOM), dispDISP(displayDISP), display(displaySPI, &dispCS), DisplayPWM(displayEXTCOM)
+{
+	dispDISP = 0;
+
+
+	buttonEvent_up   = BUTTONEVENT_NONE;
+	buttonEvent_down = BUTTONEVENT_NONE;
+
+
+	btnUp.fall(callback(this, &WatchInterface::isr_buttonup));
+	btnUp.mode(PullUp);
+	btnUp.enable_irq();
+
+	btnDown.fall(callback(this, &WatchInterface::isr_buttondown));
+	btnDown.mode(PullUp);
+	btnDown.enable_irq();
+
+	displaySPI->frequency(1000000);
+
+	DisplayPWM.period_ms(16);
+	DisplayPWM.pulsewidth_ms(8);
+
+	//updateDisplay(4);
+
+	recording_old 	  = false;
+	recording    	  = false;
+	recordingStopFlag = false;
+	isDisplayOff      = false;
+
+	interfaceTimer.start();
+
+	displayMode_old = DISPLAYMODE_AFTERBOOT;
+	displayMode     = DISPLAYMODE_TIME;
+
+
+
+}
+
+void WatchInterface::isr_buttonup()
+{
+	if (buttonEvent_up == BUTTONEVENT_NONE) {
+		buttonEvent_up = BUTTONEVENT_UP_PRE;
+	}
+}
+
+void WatchInterface::isr_buttondown()
+{
+	if (buttonEvent_down == BUTTONEVENT_NONE) {
+		buttonEvent_down = BUTTONEVENT_DOWN_PRE;
+	}
+}
+
+WatchInterface::ButtonStatus	WatchInterface::getButtonStatus(WatchInterface::hspButton button)
+{
+
+	switch (button) {
+
+		// TODO: fill button power status
+		case WatchInterface::BUTTON_POWER :
+			return (BUTTON_RELEASED);
+			break;
+		case WatchInterface::BUTTON_UP:
+			if (btnUp.read()) {
+				return (WatchInterface::BUTTON_PRESSED);
+			} else {
+				return (WatchInterface::BUTTON_RELEASED);
+			}
+			break;
+
+		case WatchInterface::BUTTON_DOWN:
+			if (btnDown.read()) {
+				return (WatchInterface::BUTTON_PRESSED);
+			} else {
+				return (WatchInterface::BUTTON_RELEASED);
+			}
+			break;
+
+	}
+
+}
+
+
+void WatchInterface::refreshCallback(void)
+{
+	refreshed = true;
+}
+
+
+
+void WatchInterface::execute(void)
+{
+	unsigned int current_timer;
+	static int tickCount;
+	static char tickCount_battery;
+	static int firstDetect_up;
+	static int firstDetect_down;
+
+
+	// Display is OFF in ECG Mode
+	if (ecg_enabled) {
+		if (recording & (buttonEvent_down == BUTTONEVENT_DOWN_PRE)) {
+			dispDISP = 1;
+			if (isDisplayOff) {
+				displayOff(false);
+			}
+			displayMode = DISPLAYMODE_RECORDING_STOP;
+		} else {
+			displayOff(true);
+		}
+	} else {
+		dispDISP = 1;
+		if (isDisplayOff) {
+			displayOff(false);
+			displayMode = DISPLAYMODE_RECORDING_STOP;
+		}
+	}
+
+
+	if (isDisplayOff != true) {
+		display.executeOnceLCD();
+
+		if (USB_Interface_MSD) {
+			return;
+		}
+
+		current_timer = interfaceTimer.read_ms();
+
+		// Button Debouncing
+		if (current_timer > 50) {
+
+			interfaceTimer.reset();
+			interfaceTimer.start();
+
+			// Increase tick counter in every 50ms
+			tickCount++;
+
+			// tick counter reset will occur in every 15x50 = 750ms. This is used for display updates
+			if (tickCount == 15) {
+				tickCount = 0;
+			}
+
+			if (buttonEvent_up == BUTTONEVENT_UP_PRE) {
+
+				if (firstDetect_up < 2) {
+					firstDetect_up++;
+				} else {
+					firstDetect_up = 0;
+					if (btnUp.read() == 0) {
+						buttonEvent_up = BUTTONEVENT_UP;
+					} else {
+						buttonEvent_up = BUTTONEVENT_NONE;
+					}
+				}
+
+			} else {
+				firstDetect_up = 0;
+			}
+
+			if (buttonEvent_down == BUTTONEVENT_DOWN_PRE) {
+
+				if (firstDetect_down < 2) {
+					firstDetect_down++;
+				} else {
+
+					firstDetect_down = 0;
+
+					if (btnDown.read() == 0) {
+						buttonEvent_down = BUTTONEVENT_DOWN;
+
+					} else {
+						buttonEvent_down = BUTTONEVENT_NONE;
+					}
+				}
+
+			} else {
+				firstDetect_down = 0;
+			}
+
+		}
+
+
+		switch (displayMode) {
+
+
+			case DISPLAYMODE_TIME:
+
+				// Detect BLE Connected Event
+				if (BLE_Interface_Exists) {
+
+					BLE_Interface_Exists_old = true;
+					display_BLEMode_Active   = false;
+					displayMode = DISPLAYMODE_TETHERED;
+
+					tickCount = 8;
+
+				} else
+					// Detect USB Connected Event
+					if (USB_Interface_Exists) {
+
+						USB_Interface_Exists_old = true;
+						display_USBMode_Active   = false;
+						displayMode = DISPLAYMODE_TETHERED_USB;
+
+						tickCount = 8;
+
+					} else
+						// Next menu item
+						if (buttonEvent_up == BUTTONEVENT_UP) {
+
+							buttonEvent_up = BUTTONEVENT_NONE;
+							displayMode = DISPLAYMODE_PPG;
+							modeUpdated = true;
+							tickCount = 8;
+
+						} else
+							// Next menu item
+							if (buttonEvent_down == BUTTONEVENT_DOWN) {
+
+								buttonEvent_down = BUTTONEVENT_NONE;
+								displayMode = DISPLAYMODE_INFO;
+								modeUpdated = true;
+								tickCount = 8;
+
+							} else {
+
+
+							}
+				break;
+
+#ifdef ENABLE_SPO2
+			case DISPLAYMODE_PPG:		// Handle both PPG and ECG
+			case DISPLAYMODE_ECG:
+
+				// Detect BLE Connected Event
+				if (BLE_Interface_Exists) {
+
+					BLE_Interface_Exists_old = true;
+					display_BLEMode_Active   = false;
+					displayMode = DISPLAYMODE_TETHERED;
+
+					tickCount = 8;
+
+				} else
+					// Detect USB Connected Event
+					if (USB_Interface_Exists) {
+
+						USB_Interface_Exists_old = true;
+						display_USBMode_Active   = false;
+						displayMode = DISPLAYMODE_TETHERED_USB;
+
+						tickCount = 8;
+
+					} else
+						// Next menu item
+						if (buttonEvent_up == BUTTONEVENT_UP) {
+
+							buttonEvent_up = BUTTONEVENT_NONE;
+							displayMode = DISPLAYMODE_SPO2_ONESHOT;
+							modeUpdated = true;
+							tickCount = 8;
+
+						} else
+							// Next menu item
+							if (buttonEvent_down == BUTTONEVENT_DOWN) {
+
+								buttonEvent_down = BUTTONEVENT_NONE;
+								displayMode = DISPLAYMODE_TIME;
+								modeUpdated = true;
+								tickCount = 8;
+
+							}
+				break;
+
+			case DISPLAYMODE_SPO2_ONESHOT:
+
+				// Detect BLE Connected Event
+				if (BLE_Interface_Exists) {
+
+					BLE_Interface_Exists_old = true;
+					display_BLEMode_Active   = false;
+					displayMode = DISPLAYMODE_TETHERED;
+
+					tickCount = 8;
+
+				} else
+					// Detect USB Connected Event
+					if (USB_Interface_Exists) {
+
+						USB_Interface_Exists_old = true;
+						display_USBMode_Active   = false;
+						displayMode = DISPLAYMODE_TETHERED_USB;
+
+						tickCount = 8;
+
+					} else
+						// Next menu item
+						if (buttonEvent_up == BUTTONEVENT_UP) {
+
+							buttonEvent_up = BUTTONEVENT_NONE;
+							displayMode = DISPLAYMODE_SPO2_CONTINUOUS;
+							modeUpdated = true;
+							tickCount = 8;
+
+						} else
+							// Next menu item
+							if (buttonEvent_down == BUTTONEVENT_DOWN) {
+
+								buttonEvent_down = BUTTONEVENT_NONE;
+								displayMode = DISPLAYMODE_PPG;
+								modeUpdated = true;
+								tickCount = 8;
+
+							}
+
+				break;
+
+			case DISPLAYMODE_SPO2_CONTINUOUS:
+
+				// Detect BLE Connected Event
+				if (BLE_Interface_Exists) {
+
+					BLE_Interface_Exists_old = true;
+					display_BLEMode_Active   = false;
+					displayMode = DISPLAYMODE_TETHERED;
+
+					tickCount = 8;
+
+				} else
+					// Detect USB Connected Event
+					if (USB_Interface_Exists) {
+
+						USB_Interface_Exists_old = true;
+						display_USBMode_Active   = false;
+						displayMode = DISPLAYMODE_TETHERED_USB;
+
+						tickCount = 8;
+
+					} else
+						// Next menu item
+						if (buttonEvent_up == BUTTONEVENT_UP) {
+
+							buttonEvent_up = BUTTONEVENT_NONE;
+							displayMode = DISPLAYMODE_INFO;
+							modeUpdated = true;
+							tickCount = 8;
+
+						} else
+							// Next menu item
+							if (buttonEvent_down == BUTTONEVENT_DOWN) {
+
+								buttonEvent_down = BUTTONEVENT_NONE;
+								displayMode = DISPLAYMODE_SPO2_ONESHOT;
+								modeUpdated = true;
+								tickCount = 8;
+
+							}
+
+				break;
+#else
+			case DISPLAYMODE_PPG:		// Handle both PPG and ECG
+			case DISPLAYMODE_ECG:
+
+				// Detect BLE Connected Event
+				if (BLE_Interface_Exists) {
+
+					BLE_Interface_Exists_old = true;
+					display_BLEMode_Active   = false;
+					displayMode = DISPLAYMODE_TETHERED;
+
+					tickCount = 8;
+
+				} else
+					// Detect USB Connected Event
+					if (USB_Interface_Exists) {
+
+						USB_Interface_Exists_old = true;
+						display_USBMode_Active   = false;
+						displayMode = DISPLAYMODE_TETHERED_USB;
+
+						tickCount = 8;
+
+					} else
+						// Next menu item
+						if (buttonEvent_up == BUTTONEVENT_UP) {
+
+							buttonEvent_up = BUTTONEVENT_NONE;
+							displayMode = DISPLAYMODE_TEMP;
+							modeUpdated = true;
+							tickCount = 8;
+
+						} else
+							// Next menu item
+							if (buttonEvent_down == BUTTONEVENT_DOWN) {
+
+								buttonEvent_down = BUTTONEVENT_NONE;
+								displayMode = DISPLAYMODE_TIME;
+								modeUpdated = true;
+								tickCount = 8;
+
+							}
+				break;
+
+			case DISPLAYMODE_TEMP:
+
+				// Detect BLE Connected Event
+				if (BLE_Interface_Exists) {
+
+					BLE_Interface_Exists_old = true;
+					display_BLEMode_Active   = false;
+					displayMode = DISPLAYMODE_TETHERED;
+
+					tickCount = 8;
+
+				} else
+					// Detect USB Connected Event
+					if (USB_Interface_Exists) {
+
+						USB_Interface_Exists_old = true;
+						display_USBMode_Active   = false;
+						displayMode = DISPLAYMODE_TETHERED_USB;
+
+						tickCount = 8;
+
+					} else
+						// Next menu item
+						if (buttonEvent_up == BUTTONEVENT_UP) {
+
+							buttonEvent_up = BUTTONEVENT_NONE;
+							displayMode = DISPLAYMODE_INFO;
+							modeUpdated = true;
+							tickCount = 8;
+
+						} else
+							// Next menu item
+							if (buttonEvent_down == BUTTONEVENT_DOWN) {
+
+								buttonEvent_down = BUTTONEVENT_NONE;
+								displayMode = DISPLAYMODE_PPG;
+								modeUpdated = true;
+								tickCount = 8;
+
+							}
+				break;
+#endif
+			case DISPLAYMODE_INFO:
+
+				// Detect BLE Connected Event
+				if (BLE_Interface_Exists) {
+
+					BLE_Interface_Exists_old = true;
+					display_BLEMode_Active   = false;
+					displayMode = DISPLAYMODE_TETHERED;
+
+					tickCount = 8;
+
+				} else
+					// Detect USB Connected Event
+					if (USB_Interface_Exists) {
+
+						USB_Interface_Exists_old = true;
+						display_USBMode_Active   = false;
+						displayMode = DISPLAYMODE_TETHERED_USB;
+
+						tickCount = 8;
+
+					} else
+						// Next menu item
+						if (buttonEvent_up == BUTTONEVENT_UP) {
+
+							buttonEvent_up = BUTTONEVENT_NONE;
+							displayMode = DISPLAYMODE_TIME;
+							modeUpdated = true;
+							tickCount = 8;
+
+						} else
+							// Next menu item
+							if (buttonEvent_down == BUTTONEVENT_DOWN) {
+
+								buttonEvent_down = BUTTONEVENT_NONE;
+#ifdef ENABLE_SPO2
+								displayMode = DISPLAYMODE_SPO2_CONTINUOUS;
+#else
+	                            displayMode = DISPLAYMODE_TEMP;
+#endif
+								modeUpdated = true;
+								tickCount = 8;
+
+							}
+				break;
+			case DISPLAYMODE_TETHERED:
+
+				// Detect Recording start event
+				if ((recording)  && (!recording_old)) {
+
+					recording_old = true;
+					displayMode = DISPLAYMODE_RECORDING;
+
+					tickCount = 8;
+
+				} else
+					// Detect BLE Disconnected Event
+					if (!BLE_Interface_Exists) {
+
+						BLE_Interface_Exists_old = false;
+						display_BLEMode_Active  = false;
+						displayMode = DISPLAYMODE_TIME;
+
+						tickCount = 8;
+
+					}
+
+				break;
+
+			case DISPLAYMODE_TETHERED_USB:
+
+				// Detect Recording start event
+				if ((recording)  && (!recording_old)) {
+
+					printf("START EVENT");
+					recording_old = recording;
+					displayMode = DISPLAYMODE_RECORDING;
+
+					tickCount = 8;
+
+				} else
+					// Detect USB Disconnected Event
+					if (!USB_Interface_Exists) {
+
+						USB_Interface_Exists_old = false;
+						display_USBMode_Active   = false;
+						displayMode = DISPLAYMODE_TIME;
+
+						tickCount = 8;
+
+					}
+
+
+				break;
+
+			case DISPLAYMODE_RECORDING: {
+				// Detect stop recording
+				if ((!recording) && (recording_old)) {
+					printf("STOP EVENT");
+					recording_old = recording;
+					displayMode = DISPLAYMODE_TIME;
+					tickCount = 8;
+				} else {
+					if (buttonEvent_down == BUTTONEVENT_DOWN) {
+						buttonEvent_down = BUTTONEVENT_NONE;
+						displayMode = DISPLAYMODE_RECORDING_STOP;
+						tickCount = 8;
+					}
+				}
+			}
+			break;
+
+			case DISPLAYMODE_RECORDING_STOP: {
+				recordingStopFlag = true;
+				recording         = false;
+				recording_old     = false;
+				displayMode = DISPLAYMODE_TIME;
+			}
+			break;
+		}
+
+
+
+		/*
+		 if ( recording ) {
+
+		  if ( ( buttonEvent_down == BUTTONEVENT_DOWN ) &&  ( !BLE_Interface_Exists ) &&  ( !USB_Interface_Exists ) ) {
+
+
+			  buttonEvent_down = BUTTONEVENT_NONE;
+
+			  if ( displayMode == DISPLAYMODE_RECORDING )
+					displayMode = DISPLAYMODE_RECORDING_STOP;
+
+			  tickCount = 8;
+		  }
+		 }
+		 else {
+
+		 // Handle Up/Down Button press Events
+
+			  // Process DOWN Button Press Event
+			  if ( ( buttonEvent_down == BUTTONEVENT_DOWN ) &&  ( !BLE_Interface_Exists ) &&  ( !USB_Interface_Exists ) ) {
+
+
+				  buttonEvent_down = BUTTONEVENT_NONE;
+
+				  if ( displayMode > 0)
+						displayMode--;
+				  else
+						displayMode = 3;
+
+				  tickCount = 8;
+			  }
+			  else
+				  // Process UP Button Press Event
+			  if ( ( buttonEvent_up == BUTTONEVENT_UP ) &&  ( !BLE_Interface_Exists ) &&  ( !USB_Interface_Exists ) ) {
+
+				  if ( displayMode < 3)
+						displayMode++;
+				  else
+						displayMode = 0;
+
+				  buttonEvent_up = BUTTONEVENT_NONE;
+
+				  tickCount = 8;
+			  }
+
+
+
+
+
+				// Detect BLE Connected Event
+				if ( ( BLEWasActive == false )  &&  ( BLE_Interface_Exists ) ) {
+
+					BLEWasActive = true;
+					display_BLEMode_Active = false;
+					displayMode = DISPLAYMODE_TETHERED;
+					modeUpdated = true;
+
+					tickCount = 8;
+
+				}
+				else
+				// Detect BLE Disconnected Event
+				if ( ( BLEWasActive == true )  &&  ( !BLE_Interface_Exists ) ) {
+
+					BLEWasActive = false;
+					display_BLEMode_Active = false;
+					displayMode = DISPLAYMODE_TIME;
+					//should_stop = true;
+					modeUpdated = true;
+
+					tickCount = 8;
+
+				}
+				else
+				// Detect USB Connected Event
+				if ( ( USBWasActive == false )  &&  ( USB_Interface_Exists ) ) {
+
+					USBWasActive = true;
+					display_USBMode_Active = false;
+					displayMode = DISPLAYMODE_TETHERED_USB;
+					modeUpdated = true;
+
+					tickCount = 8;
+
+				}
+				else
+				// Detect USB Disconnected Event
+				if ( ( USBWasActive == true )  &&  ( !USB_Interface_Exists ) ) {
+
+					USBWasActive = false;
+					display_USBMode_Active = false;
+					displayMode = DISPLAYMODE_TIME;
+					//should_stop = true;
+					modeUpdated = true;
+
+					tickCount = 8;
+
+				}
+
+		 }
+		*/
+
+		// Update the display in every 500ms (if necessary)
+		if (tickCount == 0) {
+
+			tickCount = 1;
+
+			if (displayMode_old != displayMode) {
+
+				modeUpdated = true;
+#ifdef ENABLE_SPO2
+				if((displayMode == DISPLAYMODE_SPO2_ONESHOT) || (displayMode == DISPLAYMODE_SPO2_CONTINUOUS))
+				{
+					instant_spo2_percentage=0;
+				}
+#endif
+			}
+
+			//if ( (!display_BLEMode_Active) &&  (!display_USBMode_Active) ) {
+			btnDown.disable_irq();
+			btnUp.disable_irq(); // Disable Interrupts
+
+
+			if (tickCount_battery <= 0) {
+				m_max20303_->Max20303_BatteryGauge(&batteryLevel);
+				tickCount_battery = BATTERY_GAUGE_COUNT;
+			}
+			tickCount_battery--;
+
+			updateDisplay(batteryLevel);
+
+			btnDown.enable_irq();
+			btnUp.enable_irq(); // Enable Interrupts
+			//}
+
+			displayMode_old = displayMode;
+		}
+
+	}
+}
+
+void WatchInterface::displayOff(bool off)
+{
+	if (off) {
+		// Display Turned Off
+		DisplayPWM.pulsewidth_ms(0);
+		dispDISP = 0;
+		isDisplayOff = true;
+	} else {
+		// Display Turned on
+		DisplayPWM.pulsewidth_ms(8);
+		dispDISP = 1;
+		isDisplayOff = false;
+	}
+}
+
+void  WatchInterface::DisplayModeUpdated(){
+	ppg_lcd_count = 0;
+}
+
+void WatchInterface::updateDisplay(int batteryLevelToBeScaled) {
+	char buffer[32];
+	time_t seconds;
+	int hrDisplay_confidenceThreshold;
+	static int hr_timeout;
+
+	// Clear Entire Screen
+	display.cls();
+	display.fill(0, 0, 128, 128, Black);
+
+	// Draw Maxim Integrated Logo
+	display.showBMP((uint8_t*)maxim128Bitmaps, 120, 36, 8, 90);
+
+	if (!bootComplete) {
+		return;
+	}
+
+	// Show BLE logo if it is connected
+
+
+	if (displayMode != DISPLAYMODE_TETHERED_USB) {
+		// Draw battery outline
+		display.fillrect(94,  6, 27, 12, White);
+		display.fillrect(97,  9, 21, 6, Black);
+		display.fillrect(122, 9, 2,  6, White);
+
+		if (batteryLevelToBeScaled < 10) {
+			batteryLevelToBeScaled = 0;
+		} else if (batteryLevelToBeScaled <= 25) {
+			batteryLevelToBeScaled = 1;
+		} else if (batteryLevelToBeScaled <= 50) {
+			batteryLevelToBeScaled = 2;
+		} else if (batteryLevelToBeScaled <= 75) {
+			batteryLevelToBeScaled = 3;
+		} else {
+			batteryLevelToBeScaled = 4;
+		}
+
+		// Draw battery level ticks
+		for (int i = 0 ; i < batteryLevelToBeScaled ; i++) {
+			display.fillrect(99 + (i * 5),  10, 3, 4, White);
+		}
+	}
+
+	// Show BLE logo if it is connected
+	if (BLE_Interface_Exists) {
+		display.showBMP((uint8_t*)BLELogoBitmap, 16, 15, 72, 13);
+		//displayMode = DISPLAYMODE_TETHERED;
+		//BLEWasActive = true;
+	} else {
+		// Show USB logo if it is connected
+		if (USB_Interface_Exists) {
+			display.showBMP((uint8_t*)USBLogoBitmap, 16, 15, 72, 13);
+			//displayMode = DISPLAYMODE_TETHERED_USB;
+			//USBWasActive = true;
+		}
+	}
+
+	display.set_font(UbuntuCondensed20x26);
+	display.locate(3, 10);
+	display.foreground((uint16_t)Black);
+	display.background((uint16_t)White);
+
+	switch (displayMode) {
+
+		case DISPLAYMODE_RECORDING:
+
+			display.fillrect(8,  46, 27,  23, White);
+			display.fillrect(9,  45, 25,  25, White);
+			display.fillrect(10, 44, 23,  27, White);
+
+			if (ppg_lcd_count == 0) {
+				display.fillellipse(21, 57, 8, 8, (uint16_t) Black);
+			}
+
+			snprintf(buffer, 32, "REC");
+			display.set_font(UbuntuCondensed38x47);
+			display.locate(40, 36);
+			display.foreground((uint16_t)Black);
+			display.background((uint16_t)White);
+			display.printf(buffer);
+
+
+			ppg_lcd_count++;
+			if (ppg_lcd_count > 1) {
+				ppg_lcd_count = 0;
+			}
+
+			break;
+
+
+		case DISPLAYMODE_RECORDING_STOP:
+			display.printf("CONFIRM");
+			snprintf(buffer, 32, "STOP");
+			display.set_font(UbuntuCondensed38x47);
+			display.locate(5, 36);
+			display.foreground((uint16_t)Black);
+			display.background((uint16_t)White);
+			display.printf(buffer);
+
+			break;
+
+		case DISPLAYMODE_INFO:
+			display.printf("INFO");
+
+
+			display.set_font(Arial10x10);
+
+			display.foreground((uint16_t)Black);
+			display.background((uint16_t)White);
+			snprintf(buffer, 32, "BLE MAC:");
+			display.locate(4, 40);
+			display.printf(buffer);
+			snprintf(buffer, 32, "%02X:%02X:%02X:%02X:%02X:%02X", m_mac_addr_[0],  m_mac_addr_[1], m_mac_addr_[2],  m_mac_addr_[3], m_mac_addr_[4],  m_mac_addr_[5]);
+			display.locate(4, 50);
+			display.printf(buffer);
+
+			snprintf(buffer, 32, "FW Version:");
+			display.locate(4, 66);
+			display.printf(buffer);
+
+			snprintf(buffer, 32, "%s", FIRMWARE_VERSION);
+			display.locate(4, 76);
+			display.printf(buffer);
+
+			break;
+
+		case DISPLAYMODE_TIME:
+			display.printf("TIME");
+			seconds = time(NULL);
+			strftime(buffer, 32, "%I:%M", localtime(&seconds));
+			display.set_font(UbuntuCondensed38x47);
+			display.locate(6, 40);
+			display.foreground((uint16_t)Black);
+			display.background((uint16_t)White);
+			display.printf(buffer);
+			snprintf(buffer, 32, "MAC:%02X:%02X", m_mac_addr_[4],  m_mac_addr_[5]);
+			display.set_font(Arial10x10);
+			display.locate(60, 20);
+			display.foreground((uint16_t)Black);
+			display.background((uint16_t)White);
+			display.printf(buffer);
+
+			while (1) {
+				if (seconds >= 86400) {
+					seconds = seconds % 86400;
+				} else {
+					break;
+				}
+			}
+
+			if (seconds < 43200) {
+				display.showBMP((uint8_t*)AM_Bitmap, 16, 9, 104, 45);
+			} else {
+				display.showBMP((uint8_t*)PM_Bitmap, 16, 9, 104, 45);
+			}
+
+
+			break;
+
+		case DISPLAYMODE_PPG:
+			display.printf("PPG");
+
+			//Blink "MEASURING" for the first 13 seconds (settling time of ppg)
+
+			display.set_font(UbuntuCondensed16x21);
+			display.locate(12, 52);
+			display.foreground((uint16_t)Black);
+			display.background((uint16_t)White);
+
+			if(ppg_lcd_count<25)
+			{
+				if(ppg_lcd_count & 0x01)
+				{
+					display.printf("         ");
+				}
+				else
+				{
+					display.printf("MEASURING");
+				}
+			}
+
+			//print the heart rate (it is settled now)
+			else {
+				if (ppg_lcd_count > 80) {
+					ppg_lcd_count = 70;
+				}
+
+				display.set_font(UbuntuCondensed38x47);
+				display.locate(8, 40);
+				display.foreground((uint16_t)Black);
+				display.background((uint16_t)White);
+
+				if (instant_hr_activityClass == ACTD_REST_ACTIVITY) {
+					hrDisplay_confidenceThreshold = ConfThresLevelRest;
+				} else {
+					hrDisplay_confidenceThreshold = ConfThresLevelOther;
+				}
+				if ((instant_hr_conf > hrDisplay_confidenceThreshold) && (instant_hr > kHeartRateLowerLimit) && (instant_hr < kHeartRateUpperLimit)) {
+					display.printf("%d", instant_hr);
+					last_good_hr = instant_hr;
+					hr_timeout = 0;
+				} else {
+					if (hr_timeout < 200) {
+						hr_timeout++;
+					}
+					if (hr_timeout < 12) {
+						display.printf("%d", last_good_hr);
+					} else {
+						display.printf("--");
+					}
+
+				}
+
+				display.set_font(UbuntuCondensed20x26);
+				display.locate(72, 57);
+				display.foreground((uint16_t)Black);
+				display.background((uint16_t)White);
+				display.printf("BPM");
+			}
+
+			ppg_lcd_count++;
+
+			break;
+#ifdef ENABLE_SPO2
+		case DISPLAYMODE_SPO2_ONESHOT:
+
+			display.printf("SPO2");
+			display.set_font(Arial10x10);
+			display.locate(60,23);
+			display.printf("ONE-SHOT");
+			display.set_font(UbuntuCondensed16x21);
+			display.locate(12,52);
+			display.foreground(Black);
+			display.background(White);
+			if (instant_spo2_percentage != 100 ) {
+				if(ppg_lcd_count & 0x01) {
+					display.printf("         ");
+				} else {
+					if(instant_lowSignalQualityFlag)
+						display.printf("LOWSIGNAL");
+					else
+						display.printf("MEASURING");
+				}
+			} else {
+				if(instant_lowSignalQualityFlag){
+					display.printf("LOWSIGNAL");
+				} else {
+					display.set_font(UbuntuCondensed38x47);
+					display.locate(8,40);
+					display.foreground(Black);
+					display.background(White);
+					display.printf("%d", instant_spo2);
+					display.set_font(UbuntuCondensed20x26);
+					display.locate(72,57);
+					display.foreground(Black);
+					display.background(White);
+					display.printf("%%");
+				}
+			}
+			ppg_lcd_count++;
+
+			break;
+		case DISPLAYMODE_SPO2_CONTINUOUS:
+
+			display.printf("SPO2");
+			display.set_font(Arial10x10);
+			display.locate(60,23);
+			display.printf("NON-STOP");
+			display.set_font(UbuntuCondensed16x21);
+			display.locate(12,52);
+			display.foreground(Black);
+			display.background(White);
+			if (instant_spo2 == 0 ) {
+				if(ppg_lcd_count & 0x01) {
+					display.printf("         ");
+				} else {
+					if(instant_lowSignalQualityFlag)
+						display.printf("LOWSIGNAL");
+					else
+						display.printf("MEASURING");
+				}
+			} else {
+				if(instant_lowSignalQualityFlag){
+					display.printf("LOWSIGNAL");
+				} else {
+					display.set_font(UbuntuCondensed38x47);
+					display.locate(8,40);
+					display.foreground(Black);
+					display.background(White);
+					display.printf("%d", instant_spo2);
+					display.set_font(UbuntuCondensed20x26);
+					display.locate(72,57);
+					display.foreground(Black);
+					display.background(White);
+					display.printf("%%");
+				}
+			}
+			ppg_lcd_count++;
+
+			break;
+#endif
+		case DISPLAYMODE_ECG:
+			display.printf("ECG");
+			display.set_font(UbuntuCondensed38x47);
+			display.locate(8, 40);
+			display.foreground((uint16_t)Black);
+			display.background((uint16_t)White);
+			display.printf("%d", 70);
+
+			display.set_font(UbuntuCondensed20x26);
+			display.locate(72, 57);
+			display.foreground((uint16_t)Black);
+			display.background((uint16_t)White);
+			display.printf("BPM");
+
+			break;
+#ifndef ENABLE_SPO2
+		case DISPLAYMODE_TEMP:
+			display.printf("TEMP");
+			display.set_font(UbuntuCondensed38x47);
+			display.locate(8, 40);
+			display.foreground((uint16_t)Black);
+			display.background((uint16_t)White);
+			display.printf("%2.1f", instant_temp_celsius);
+
+			display.set_font(UbuntuCondensed20x26);
+			display.locate(92, 55);
+			display.foreground((uint16_t)Black);
+			display.background((uint16_t)White);
+			display.printf("%cC", 127);
+
+
+			break;
+#endif
+		case DISPLAYMODE_TETHERED:
+			display.printf("CONN");
+			display.set_font(UbuntuCondensed38x47);
+			display.locate(30, 40);
+			display.foreground((uint16_t)Black);
+			display.background((uint16_t)White);
+			display.printf("BLE", 24);
+
+			display_BLEMode_Active = true;
+
+			break;
+
+		case DISPLAYMODE_TETHERED_USB:
+			if (USB_Interface_MSD) {
+				display.printf("MSD");
+			} else {
+				display.printf("CONN");
+			}
+			display.set_font(UbuntuCondensed38x47);
+			display.locate(30, 40);
+			display.foreground((uint16_t)Black);
+			display.background((uint16_t)White);
+			display.printf("USB", 24);
+
+			display_USBMode_Active = true;
+
+			break;
+
+	}
+
+
+	display.showBMP((uint8_t*)maxim128Bitmaps, 120, 36, 8, 90);
+
+
+	if (refreshed) {
+		refreshed = false;
+		display.update(this->refreshCallback);
+	}
+
+
+}
+
+