13807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie/*
23807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie * Copyright (C) 2016 The Android Open Source Project
33807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie *
43807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie * Licensed under the Apache License, Version 2.0 (the "License");
53807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie * you may not use this file except in compliance with the License.
63807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie * You may obtain a copy of the License at
73807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie *
83807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie *      http://www.apache.org/licenses/LICENSE-2.0
93807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie *
103807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie * Unless required by applicable law or agreed to in writing, software
113807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie * distributed under the License is distributed on an "AS IS" BASIS,
123807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie * See the License for the specific language governing permissions and
143807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie * limitations under the License.
153807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie */
163807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie
17a16406ba1a734f21f36a4b0f64b23b062644b6e2Andrew Rossignol#include <chre.h>
183807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie#include <cinttypes>
193807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie
20a16406ba1a734f21f36a4b0f64b23b062644b6e2Andrew Rossignol#include "chre/util/nanoapp/log.h"
21a16406ba1a734f21f36a4b0f64b23b062644b6e2Andrew Rossignol
22a16406ba1a734f21f36a4b0f64b23b062644b6e2Andrew Rossignol#define LOG_TAG "[MsgWorld]"
233807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie
24e969b9be8eca27ffc875167879ab0ec093b3e313Andrew Rossignol#ifdef CHRE_NANOAPP_INTERNAL
253807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddienamespace chre {
26e969b9be8eca27ffc875167879ab0ec093b3e313Andrew Rossignolnamespace {
27e969b9be8eca27ffc875167879ab0ec093b3e313Andrew Rossignol#endif  // CHRE_NANOAPP_INTERNAL
283807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie
293807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddienamespace {
303807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie
313d0e53bc6419ee6110ca75ab30f369856fe5b28dBrian Duddieconstexpr uint32_t kMessageType = 1234;
3226a76b2c0f8ed1c34833dedfc4915aa9602f545aBrian Duddieuint8_t gMessageData[CHRE_MESSAGE_TO_HOST_MAX_SIZE] = {1, 2, 3, 4, 5, 6, 7, 8};
333807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie
343807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddievoid messageFreeCallback(void *message, size_t messageSize) {
35a16406ba1a734f21f36a4b0f64b23b062644b6e2Andrew Rossignol  LOGI("Got message free callback for message @"
36303b8dc498a608773ceb293942f95e25ac1055f3Brian Duddie       " %p (match? %d) size %zu (match? %d)",
37a16406ba1a734f21f36a4b0f64b23b062644b6e2Andrew Rossignol       message, (message == gMessageData),
38a16406ba1a734f21f36a4b0f64b23b062644b6e2Andrew Rossignol       messageSize, (messageSize == sizeof(gMessageData)));
39303b8dc498a608773ceb293942f95e25ac1055f3Brian Duddie  if (!chreSendEvent(CHRE_EVENT_FIRST_USER_VALUE, nullptr, nullptr,
40303b8dc498a608773ceb293942f95e25ac1055f3Brian Duddie                     chreGetInstanceId())) {
41303b8dc498a608773ceb293942f95e25ac1055f3Brian Duddie    LOGE("Failed to send event");
42303b8dc498a608773ceb293942f95e25ac1055f3Brian Duddie  }
433807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie}
443807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie
453807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie}  // anonymous namespace
463807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie
47e969b9be8eca27ffc875167879ab0ec093b3e313Andrew Rossignolbool nanoappStart() {
48a16406ba1a734f21f36a4b0f64b23b062644b6e2Andrew Rossignol  LOGI("App started as instance %" PRIu32, chreGetInstanceId());
493807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie
503807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie  bool success = chreSendMessageToHostEndpoint(
513807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie      gMessageData, sizeof(gMessageData), kMessageType,
523807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie      CHRE_HOST_ENDPOINT_BROADCAST, messageFreeCallback);
53a16406ba1a734f21f36a4b0f64b23b062644b6e2Andrew Rossignol  LOGI("Sent message to host from start callback, result %d", success);
543807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie  return true;
553807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie}
563807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie
57e969b9be8eca27ffc875167879ab0ec093b3e313Andrew Rossignolvoid nanoappHandleEvent(uint32_t senderInstanceId,
58e969b9be8eca27ffc875167879ab0ec093b3e313Andrew Rossignol                        uint16_t eventType,
59e969b9be8eca27ffc875167879ab0ec093b3e313Andrew Rossignol                        const void *eventData) {
603807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie  if (eventType == CHRE_EVENT_MESSAGE_FROM_HOST) {
613807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie    auto *msg = static_cast<const chreMessageFromHostData *>(eventData);
62a16406ba1a734f21f36a4b0f64b23b062644b6e2Andrew Rossignol    LOGI("Got message from host with type %" PRIu32 " size %" PRIu32
63a16406ba1a734f21f36a4b0f64b23b062644b6e2Andrew Rossignol         " data @ %p hostEndpoint 0x%" PRIx16,
64a16406ba1a734f21f36a4b0f64b23b062644b6e2Andrew Rossignol         msg->messageType, msg->messageSize, msg->message, msg->hostEndpoint);
653807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie    if (senderInstanceId != CHRE_INSTANCE_ID) {
66a16406ba1a734f21f36a4b0f64b23b062644b6e2Andrew Rossignol      LOGE("Message from host came from unexpected instance ID %" PRIu32,
67a16406ba1a734f21f36a4b0f64b23b062644b6e2Andrew Rossignol           senderInstanceId);
683807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie    }
693d0e53bc6419ee6110ca75ab30f369856fe5b28dBrian Duddie
703d0e53bc6419ee6110ca75ab30f369856fe5b28dBrian Duddie    bool success = chreSendMessageToHostEndpoint(
713d0e53bc6419ee6110ca75ab30f369856fe5b28dBrian Duddie      gMessageData, sizeof(gMessageData), kMessageType,
723d0e53bc6419ee6110ca75ab30f369856fe5b28dBrian Duddie      CHRE_HOST_ENDPOINT_BROADCAST, messageFreeCallback);
73a16406ba1a734f21f36a4b0f64b23b062644b6e2Andrew Rossignol    LOGI("Result of sending reply: %d", success);
743807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie  }
753807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie}
763807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie
772b9d71a9f6a9e8cc0e787957d022154231f29962Brian Duddievoid nanoappEnd() {
78a16406ba1a734f21f36a4b0f64b23b062644b6e2Andrew Rossignol  LOGI("Stopped");
793807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie}
803807f5eba9d96cd143dfcedfef4974c5c77aa414Brian Duddie
81e969b9be8eca27ffc875167879ab0ec093b3e313Andrew Rossignol#ifdef CHRE_NANOAPP_INTERNAL
829d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie}  // anonymous namespace
839d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie}  // namespace chre
84e969b9be8eca27ffc875167879ab0ec093b3e313Andrew Rossignol
859d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie#include "chre/util/nanoapp/app_id.h"
869d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie#include "chre/platform/static_nanoapp_init.h"
87e969b9be8eca27ffc875167879ab0ec093b3e313Andrew Rossignol
889d5b500a223ef73560f0dce38f50b809bde5dd0dBrian DuddieCHRE_STATIC_NANOAPP_INIT(MessageWorld, chre::kMessageWorldAppId, 0);
89e969b9be8eca27ffc875167879ab0ec093b3e313Andrew Rossignol#endif  // CHRE_NANOAPP_INTERNAL
90