1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef CHRE_CORE_NANOAPP_H_ 18 #define CHRE_CORE_NANOAPP_H_ 19 20 #include <cinttypes> 21 22 #include "chre/core/event.h" 23 #include "chre/core/event_ref_queue.h" 24 #include "chre/platform/platform_nanoapp.h" 25 #include "chre/util/dynamic_vector.h" 26 27 namespace chre { 28 29 /** 30 * A class that tracks the state of a Nanoapp including incoming events and 31 * event registrations. 32 * 33 * Inheritance is used to separate the common interface with common 34 * implementation part (chre::Nanoapp) from the common interface with 35 * platform-specific implementation part (chre::PlatformNanoapp) from the purely 36 * platform-specific part (chre::PlatformNanoappBase). However, this inheritance 37 * relationship does *not* imply polymorphism, and this object must only be 38 * referred to via the most-derived type, i.e. chre::Nanoapp. 39 */ 40 class Nanoapp : public PlatformNanoapp { 41 public: 42 /** 43 * @return The unique identifier for this Nanoapp instance 44 */ getInstanceId()45 uint32_t getInstanceId() const { 46 return mInstanceId; 47 } 48 49 /** 50 * Assigns an instance ID to this Nanoapp. This must be called prior to 51 * starting this Nanoapp. 52 */ setInstanceId(uint32_t instanceId)53 void setInstanceId(uint32_t instanceId) { 54 mInstanceId = instanceId; 55 } 56 57 /** 58 * @return true if the nanoapp should receive broadcast events with the given 59 * type 60 */ 61 bool isRegisteredForBroadcastEvent(uint16_t eventType) const; 62 63 /** 64 * Updates the Nanoapp's registration so that it will receive broadcast events 65 * with the given event ID. 66 * 67 * @return true if the event is newly registered 68 */ 69 bool registerForBroadcastEvent(uint16_t eventId); 70 71 /** 72 * Updates the Nanoapp's registration so that it will not receive broadcast 73 * events with the given event ID. 74 * 75 * @return true if the event was previously registered 76 */ 77 bool unregisterForBroadcastEvent(uint16_t eventId); 78 79 /** 80 * Adds an event to this nanoapp's queue of pending events. 81 * 82 * @param event 83 */ 84 void postEvent(Event *event); 85 86 /** 87 * Indicates whether there are any pending events in this apps queue. 88 * 89 * @return true if there are events waiting to be processed 90 */ 91 bool hasPendingEvent(); 92 93 /** 94 * Configures whether nanoapp info events will be sent to the nanoapp. 95 * Nanoapps are not sent nanoapp start/stop events by default. 96 * 97 * @param enable true if events are to be sent, false otherwise. 98 */ 99 void configureNanoappInfoEvents(bool enable); 100 101 /** 102 * Sends the next event in the queue to the nanoapp and returns the processed 103 * event. The hasPendingEvent() method should be tested before invoking this. 104 * 105 * @return A pointer to the processed event 106 */ 107 Event *processNextEvent(); 108 109 /** 110 * Prints state in a string buffer. Must only be called from the context of 111 * the main CHRE thread. 112 * 113 * @param buffer Pointer to the start of the buffer. 114 * @param bufferPos Pointer to buffer position to start the print (in-out). 115 * @param size Size of the buffer in bytes. 116 * 117 * @return true if entire log printed, false if overflow or error. 118 */ 119 bool logStateToBuffer(char *buffer, size_t *bufferPos, 120 size_t bufferSize) const; 121 122 private: 123 uint32_t mInstanceId = kInvalidInstanceId; 124 125 //! The set of broadcast events that this app is registered for. 126 // TODO: Implement a set container and replace DynamicVector here. There may 127 // also be a better way of handling this (perhaps we map event type to apps 128 // who care about them). 129 DynamicVector<uint16_t> mRegisteredEvents; 130 131 EventRefQueue mEventQueue; 132 }; 133 134 } 135 136 #endif // CHRE_CORE_NANOAPP_H_ 137