• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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