12301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro/* 22301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro * Copyright (C) 2018 The Android Open Source Project 32301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro * 42301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro * Licensed under the Apache License, Version 2.0 (the "License"); 52301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro * you may not use this file except in compliance with the License. 62301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro * You may obtain a copy of the License at 72301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro * 82301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro * http://www.apache.org/licenses/LICENSE-2.0 92301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro * 102301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro * Unless required by applicable law or agreed to in writing, software 112301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro * distributed under the License is distributed on an "AS IS" BASIS, 122301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro * See the License for the specific language governing permissions and 142301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro * limitations under the License. 152301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro */ 162301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro 172301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro#include <chre.h> 182301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro 192301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro#include "chre/util/nanoapp/log.h" 202301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro 212301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro#define LOG_TAG "[HostAwakeWorld]" 222301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro 232301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro/** 242301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro * A nanoapp that sets a periodic timer to send broadcast messages to the host 252301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro * only if it is awake. 262301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro */ 272301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro 282301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro#ifdef CHRE_NANOAPP_INTERNAL 292301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguronamespace chre { 302301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguronamespace { 312301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro#endif // CHRE_NANOAPP_INTERNAL 322301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro 332301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishigurouint8_t gMessageBuffer[] = {0, 1, 2, 3, 4}; 342301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro 352301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishigurouint32_t gMessageTimerHandle; 362301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro 372301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishigurobool nanoappStart() { 382301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro LOGI("Host awake world start"); 392301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro gMessageTimerHandle = chreTimerSet(5000000 /* 5 ms */, 402301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro &gMessageTimerHandle, 412301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro false /* oneShot */); 422301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro chreConfigureHostSleepStateEvents(true /* enable */); 432301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro 442301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro return (gMessageTimerHandle != CHRE_TIMER_INVALID); 452301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro} 462301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro 472301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishigurovoid handleTimerEvent(const void *eventData) { 482301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro const uint32_t *timerHandle = static_cast<const uint32_t *>(eventData); 492301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro if (*timerHandle == gMessageTimerHandle) { 502301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro if (chreIsHostAwake()) { 512301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro chreSendMessageToHostEndpoint( 522301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro gMessageBuffer, sizeof(gMessageBuffer), 1234 /* messageType */, 532301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro CHRE_HOST_ENDPOINT_BROADCAST, nullptr /* freeCallback */); 542301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro } 552301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro } else { 562301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro LOGE("Received unexpected timer event"); 572301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro } 582301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro} 592301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro 602301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishigurovoid nanoappHandleEvent(uint32_t senderInstanceId, 612301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro uint16_t eventType, 622301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro const void *eventData) { 632301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro switch (eventType) { 642301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro case CHRE_EVENT_TIMER: 652301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro handleTimerEvent(eventData); 662301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro break; 672301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro case CHRE_EVENT_HOST_AWAKE: 682301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro LOGI("Received host awake event"); 692301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro break; 702301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro case CHRE_EVENT_HOST_ASLEEP: 712301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro LOGI("Received host asleep event"); 722301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro break; 732301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro default: 742301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro LOGW("Unknown event received"); 752301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro break; 762301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro } 772301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro} 782301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro 792301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishigurovoid nanoappEnd() { 802301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro LOGI("Host awake world end"); 812301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro} 822301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro 832301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro#ifdef CHRE_NANOAPP_INTERNAL 842301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro} // anonymous namespace 852301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro} // namespace chre 862301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro 872301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro#include "chre/util/nanoapp/app_id.h" 882301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro#include "chre/platform/static_nanoapp_init.h" 892301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro 902301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur IshiguroCHRE_STATIC_NANOAPP_INIT(HostAwakeWorld, chre::kHostAwakeWorldAppId, 0); 912301c93ed1f430baeb841aab5c14fa65ca6e18ccArthur Ishiguro#endif // CHRE_NANOAPP_INTERNAL 92