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