From adadc176905b6e82bafc20818ecda74d94c4a8a4 Mon Sep 17 00:00:00 2001
From: Rene Stange <rsta2@o2online.de>
Date: Wed, 2 Mar 2022 11:00:01 +0100
Subject: [PATCH] Support headless operation on Raspberry Pi 4

Some code cleanup for src/kernel.*
---
 src/circle_stdlib_app.h | 10 +++++-----
 src/kernel.cpp          | 18 +++++++++++++-----
 src/kernel.h            |  6 +++---
 3 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/src/circle_stdlib_app.h b/src/circle_stdlib_app.h
index 170a39d..75cbde2 100644
--- a/src/circle_stdlib_app.h
+++ b/src/circle_stdlib_app.h
@@ -97,6 +97,7 @@ public:
                 : CStdlibApp (kernel),
                   mScreenUnbuffered (mOptions.GetWidth (), mOptions.GetHeight ()),
                   mScreen (&mScreenUnbuffered),
+                  mbScreenAvailable (false),
                   mTimer (&mInterrupt),
                   mLogger (mOptions.GetLogLevel (), &mTimer)
         {
@@ -109,10 +110,7 @@ public:
                         return false;
                 }
 
-                if (!mScreenUnbuffered.Initialize ())
-                {
-                        return false;
-                }
+                mbScreenAvailable = mScreenUnbuffered.Initialize ();
 #if 0
                 if (!mSerial.Initialize (115200))
                 {
@@ -138,6 +136,7 @@ protected:
         CScreenDevice   mScreenUnbuffered;
         //CSerialDevice   mSerial;
         CWriteBufferDevice mScreen;
+        bool            mbScreenAvailable;
         CTimer          mTimer;
         CLogger         mLogger;
 };
@@ -164,7 +163,8 @@ public:
                   mUSBHCI (&mInterrupt, &mTimer, TRUE),
                   mEMMC (&mInterrupt, &mTimer, &mActLED),
 #if !defined(__aarch64__) || !defined(LEAVE_QEMU_ON_HALT)
-                  mConsole (&mScreen, TRUE)
+                  //mConsole (&mScreen, TRUE)
+                  mConsole (&mNullDevice, &mScreen)
 #else
                   mConsole (&mScreen)
 #endif
diff --git a/src/kernel.cpp b/src/kernel.cpp
index 84aeba8..c658854 100644
--- a/src/kernel.cpp
+++ b/src/kernel.cpp
@@ -18,10 +18,10 @@
 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 //
 #include "kernel.h"
-#include <iostream>
 #include <string.h>
 #include <circle/logger.h>
 #include <circle/synchronize.h>
+#include <assert.h>
 
 LOGMODULE ("kernel");
 
@@ -75,6 +75,8 @@ bool CKernel::Initialize (void)
 		m_pDexed = new CMiniDexedPWM (&m_Config, &mInterrupt);
 	}
 
+	assert (m_pDexed);
+
 	if (!m_pDexed->Initialize ())
 	{
 		return FALSE;
@@ -85,15 +87,18 @@ bool CKernel::Initialize (void)
 
 CStdlibApp::TShutdownMode CKernel::Run (void)
 {
-	std::cout << "Hello MiniDexed!\n";
+	assert (m_pDexed);
 
-	while(42==42)
+	while (42 == 42)
 	{
 		boolean bUpdated = mUSBHCI.UpdatePlugAndPlay ();
 
 		m_pDexed->Process(bUpdated);
 
-		mScreen.Update ();
+		if (mbScreenAvailable)
+		{
+			mScreen.Update ();
+		}
 	}
 
 	return ShutdownHalt;
@@ -103,5 +108,8 @@ void CKernel::PanicHandler (void)
 {
 	EnableIRQs ();
 
-	s_pThis->mScreen.Update (4096);
+	if (s_pThis->mbScreenAvailable)
+	{
+		s_pThis->mScreen.Update (4096);
+	}
 }
diff --git a/src/kernel.h b/src/kernel.h
index 6195110..5d626f9 100644
--- a/src/kernel.h
+++ b/src/kernel.h
@@ -47,9 +47,9 @@ private:
 
 private:
 	// do not change this order
-	CConfig			m_Config;
-	CI2CMaster		m_I2CMaster;
-	CMiniDexed		*m_pDexed;
+	CConfig		m_Config;
+	CI2CMaster	m_I2CMaster;
+	CMiniDexed	*m_pDexed;
 
 	static CKernel *s_pThis;
 };