Improve mailbox msg handling for MessageProcess

Send/verify 32b message magic
Add version response support

In case an error occurs with the messaging, send an error
response and effectively reset/empty the queue.

Add support for error response

Fix a couple of bugs where mailbox interrupts were sent even
when a previous error occured.

Change-Id: I6a1fdefd0d6eb68c9b22123c156ff820ce9c0399
diff --git a/applications/message_process/include/message_process.hpp b/applications/message_process/include/message_process.hpp
index 96da30e..62788b8 100644
--- a/applications/message_process/include/message_process.hpp
+++ b/applications/message_process/include/message_process.hpp
@@ -53,30 +53,20 @@
     bool empty() const;
     size_t available() const;
     size_t capacity() const;
+    void reset();
     bool read(uint8_t *dst, uint32_t length);
     bool write(const Vec *vec, size_t length);
     bool write(const uint32_t type, const void *src = nullptr, uint32_t length = 0);
-    bool skip(uint32_t length);
+    template <typename T>
+    bool write(const uint32_t type, const T &src) {
+        return write(type, reinterpret_cast<const void *>(&src), sizeof(src));
+    }
 
     template <typename T>
     bool read(T &dst) {
         return read(reinterpret_cast<uint8_t *>(&dst), sizeof(dst));
     }
 
-    template <typename T>
-    bool readOrSkip(T &dst, uint32_t expectedLength) {
-        if (expectedLength == sizeof(dst)) {
-            return read(reinterpret_cast<uint8_t *>(&dst), sizeof(dst));
-        } else {
-            return skip(expectedLength);
-        }
-    }
-
-    template <typename T>
-    bool write(const uint32_t type, const T &src) {
-        return write(type, reinterpret_cast<const void *>(&src), sizeof(src));
-    }
-
 private:
     void cleanHeader() const;
     void cleanHeaderData() const;
@@ -96,6 +86,8 @@
     void run();
     bool handleMessage();
     void sendPong();
+    void sndErrorRspAndResetQueue(ethosu_core_msg_err_type type, const char *message);
+    void sendVersionRsp();
     void sendInferenceRsp(uint64_t userArg,
                           std::vector<InferenceProcess::DataPtr> &ofm,
                           bool failed,