diff Discovery/Src/base.c @ 221:486dddfba7ce

Merged in Ideenmodellierer/ostc4/Improve_IPC_Sync (pull request #12) Improve IPC Sync
author heinrichsweikamp <bitbucket@heinrichsweikamp.com>
date Mon, 01 Apr 2019 09:01:09 +0000
parents ce05c801b002
children 5f535ef6a3db
line wrap: on
line diff
--- a/Discovery/Src/base.c	Thu Mar 28 13:05:29 2019 +0000
+++ b/Discovery/Src/base.c	Mon Apr 01 09:01:09 2019 +0000
@@ -292,6 +292,8 @@
 uint8_t	updateButtonsToDefault = 0;
 uint8_t	wasFirmwareUpdateCheckBattery = 0;
 
+static DoDisplayRefresh = 0;	/* trigger to refresh display data */
+
 /* Private function prototypes -----------------------------------------------*/
 static void SystemClock_Config(void);
 static void Error_Handler(void);
@@ -304,7 +306,9 @@
 static void gotoSleep(void);
 static void deco_loop(void);
 static void resetToFirmwareUpdate(void);
-void EvaluateButton(void);
+static void TriggerButtonAction(void);
+static void EvaluateButton(void);
+static void RefreshDisplay(void);
 
 /* ITM Trace-------- ---------------------------------------------------------*/
 /*
@@ -495,6 +499,12 @@
             ext_flash_write_settings();
         }
         deco_loop();
+        TriggerButtonAction();
+        if(DoDisplayRefresh)
+        {
+	        DoDisplayRefresh = 0;
+        	RefreshDisplay();
+        }
 
 #ifdef DEBUG_RUNTIME
         translateTime(stateUsed->lifeData.timeBinaryFormat, &Stime);
@@ -756,26 +766,13 @@
 
     get_globalStateList(&status);
 
-    switch(status.base)
+    if(status.base == BaseComm) /* main loop not serviced in com mode */
     {
-    case BaseHome:
-        tHome_refresh();
-        tM_check_content();
-        break;
-    case BaseMenu:
-        tM_refresh_live_content();
-        tMenuEdit_refresh_live_content();
-        break;
-    case BaseInfo:
-        tInfo_refresh(); ///< only compass at the moment 23.Feb.2015 hw
-        break;
-    case BaseComm:
-         tComm_refresh();
-        break;
-    default:
-        if(get_globalState() == StStop)
-            tHome_sleepmode_fun();
-        break;
+    	tComm_refresh();
+    }
+    else
+    {
+    	DoDisplayRefresh = 1;
     }
 }
 
@@ -830,6 +827,114 @@
 #endif
 }
 
+static void RefreshDisplay()
+{
+	SStateList status;
+	get_globalStateList(&status);
+	switch(status.base)
+	{
+	case BaseHome:
+		tHome_refresh();
+		tM_check_content();
+		break;
+	case BaseMenu:
+		tM_refresh_live_content();
+		tMenuEdit_refresh_live_content();
+		break;
+	case BaseInfo:
+		tInfo_refresh(); ///< only compass at the moment 23.Feb.2015 hw
+		break;
+	case BaseComm: 		/* refresh already done in tim callback */
+		break;
+	default:
+		if(get_globalState() == StStop)
+			tHome_sleepmode_fun();
+		break;
+	}
+}
+static uint8_t ButtonAction = ACTION_END;
+
+static void StoreButtonAction(uint8_t action)
+{
+	ButtonAction = action;
+}
+
+static void TriggerButtonAction()
+{
+	uint8_t action = ButtonAction;
+	SStateList status;
+
+	if(ButtonAction != ACTION_END)
+	{
+		get_globalStateList(&status);
+
+		if (action == ACTION_BUTTON_CUSTOM) {
+			GFX_screenshot();
+		}
+
+		switch (status.base) {
+		case BaseStop:
+			if (action == ACTION_BUTTON_BACK)
+				resetToFirmwareUpdate();
+			break;
+		case BaseComm:		/* already handled in tim callback */
+			break;
+		case BaseHome:
+			if (action == ACTION_BUTTON_NEXT) {
+				if (status.page == PageSurface)
+					openMenu(1);
+				else
+					tHomeDiveMenuControl(action);
+			} else if (action == ACTION_BUTTON_BACK) {
+				if (get_globalState() == StS)
+					openInfo(StILOGLIST);
+				else if ((status.page == PageDive)
+						&& (settingsGetPointer()->design < 7)) {
+					settingsGetPointer()->design = 7; // auto switch to 9 if necessary
+				} else if ((status.page == PageDive) && (status.line != 0)) {
+					if (settingsGetPointer()->extraDisplay == EXTRADISPLAY_BIGFONT)
+						settingsGetPointer()->design = 3;
+					else if (settingsGetPointer()->extraDisplay
+							== EXTRADISPLAY_DECOGAME)
+						settingsGetPointer()->design = 4;
+
+					set_globalState(StD);
+				} else
+					tHome_change_field_button_pressed();
+			} else if (action == ACTION_BUTTON_ENTER) {
+				if ((status.page == PageDive) && (status.line == 0))
+					tHome_change_customview_button_pressed();
+				else if (status.page == PageSurface)
+					tHome_change_customview_button_pressed();
+				else
+					tHomeDiveMenuControl(action);
+			}
+			break;
+
+		case BaseMenu:
+			if (status.line == 0)
+				sendActionToMenu(action);
+			else
+				sendActionToMenuEdit(action);
+			break;
+
+		case BaseInfo:
+			if (status.page == InfoPageLogList)
+				sendActionToInfoLogList(action);
+			else if (status.page == InfoPageLogShow)
+				sendActionToInfoLogShow(action);
+			else
+				sendActionToInfo(action);
+			break;
+
+		default:
+			break;
+		}
+		ButtonAction = ACTION_END;
+	}
+}
+
+
 void EvaluateButton()
 {
 	uint8_t action = 0;
@@ -894,73 +999,17 @@
 	#endif
 
 		get_globalStateList(&status);
-
-		if (action == ACTION_BUTTON_CUSTOM) {
-			GFX_screenshot();
-		}
-
-		switch (status.base) {
-		case BaseStop:
-			if (action == ACTION_BUTTON_BACK)
-				resetToFirmwareUpdate();
-			break;
-		case BaseComm:
+		if(status.base == BaseComm) /* main loop is not serviced in comm mode => react immediately */
+		{
 			if (action == ACTION_BUTTON_BACK) {
 				settingsGetPointer()->bluetoothActive = 0;
 				MX_Bluetooth_PowerOff();
 				tComm_exit();
 			}
-			break;
-		case BaseHome:
-			if (action == ACTION_BUTTON_NEXT) {
-				if (status.page == PageSurface)
-					openMenu(1);
-				else
-					tHomeDiveMenuControl(action);
-			} else if (action == ACTION_BUTTON_BACK) {
-				if (get_globalState() == StS)
-					openInfo(StILOGLIST);
-				else if ((status.page == PageDive)
-						&& (settingsGetPointer()->design < 7)) {
-					settingsGetPointer()->design = 7; // auto switch to 9 if necessary
-				} else if ((status.page == PageDive) && (status.line != 0)) {
-					if (settingsGetPointer()->extraDisplay == EXTRADISPLAY_BIGFONT)
-						settingsGetPointer()->design = 3;
-					else if (settingsGetPointer()->extraDisplay
-							== EXTRADISPLAY_DECOGAME)
-						settingsGetPointer()->design = 4;
-
-					set_globalState(StD);
-				} else
-					tHome_change_field_button_pressed();
-			} else if (action == ACTION_BUTTON_ENTER) {
-				if ((status.page == PageDive) && (status.line == 0))
-					tHome_change_customview_button_pressed();
-				else if (status.page == PageSurface)
-					tHome_change_customview_button_pressed();
-				else
-					tHomeDiveMenuControl(action);
-			}
-			break;
-
-		case BaseMenu:
-			if (status.line == 0)
-				sendActionToMenu(action);
-			else
-				sendActionToMenuEdit(action);
-			break;
-
-		case BaseInfo:
-			if (status.page == InfoPageLogList)
-				sendActionToInfoLogList(action);
-			else if (status.page == InfoPageLogShow)
-				sendActionToInfoLogShow(action);
-			else
-				sendActionToInfo(action);
-			break;
-
-		default:
-			break;
+		}
+		else
+		{
+			StoreButtonAction(action);	/* Handle action in main loop */
 		}
 		LastButtonPressed = INVALID_BUTTON;
 	}