diff options
Diffstat (limited to 'applications/message_handler/test/message_client.cpp')
-rw-r--r-- | applications/message_handler/test/message_client.cpp | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/applications/message_handler/test/message_client.cpp b/applications/message_handler/test/message_client.cpp new file mode 100644 index 0000000..4209564 --- /dev/null +++ b/applications/message_handler/test/message_client.cpp @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2022 Arm Limited. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "FreeRTOS.h" +#include "task.h" + +#include "ethosu_core_interface.h" +#include "message_client.hpp" + +using namespace EthosU; + +namespace MessageHandler { + +MessageClient::MessageClient(EthosU::ethosu_core_queue &_inputMessageQueue, + EthosU::ethosu_core_queue &_outputMessageQueue, + Mailbox::Mailbox &_mailbox) : + input(_inputMessageQueue), + output(_outputMessageQueue), mailbox(_mailbox) {} + +bool MessageClient::sendInputMessage(const uint32_t type, const void *src, uint32_t length) { + if (!input.write(type, src, length)) { + printf("ERROR: Msg: Failed to write ping request. No mailbox message sent\n"); + return false; + } + + mailbox.sendMessage(); + mailbox.handleMessage(); + return true; +} + +bool MessageClient::waitAndReadOutputMessage(const uint32_t expected_type, uint8_t *dst, uint32_t length) { + constexpr TickType_t delay = pdMS_TO_TICKS(2); + constexpr TickType_t deadline = pdMS_TO_TICKS(/* 1 minute */ 60 * 1000 * 1000); + struct ethosu_core_msg msg; + + TickType_t totalDelay = 0; + while (output.available() == 0) { + vTaskDelay(delay); + totalDelay += delay; + if (totalDelay >= deadline) { + return false; + } + } + + if (!output.read(msg)) { + printf("ERROR: Failed to read msg header\n"); + return false; + } + + if (msg.magic != ETHOSU_CORE_MSG_MAGIC) { + printf("ERROR: Invalid Magic\n"); + return false; + } + + if (msg.type != expected_type) { + printf("ERROR: Wrong message type\n"); + return false; + } + + if (msg.length != length) { + printf("ERROR: Wrong message size\n"); + return false; + } + + if (length == 0) { + return true; + } + + if (!output.read(dst, length)) { + printf("ERROR: Failed to read msg payload\n"); + return false; + } + + return true; +} +} // namespace MessageHandler |