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