init.cc revision fc4d354a2ad34172f508a9017b49747b9193eaf8
1e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie/* 2e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Copyright (C) 2016 The Android Open Source Project 3e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * 4e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Licensed under the Apache License, Version 2.0 (the "License"); 5e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * you may not use this file except in compliance with the License. 6e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * You may obtain a copy of the License at 7e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * 8e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * http://www.apache.org/licenses/LICENSE-2.0 9e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * 10e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Unless required by applicable law or agreed to in writing, software 11e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * distributed under the License is distributed on an "AS IS" BASIS, 12e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * See the License for the specific language governing permissions and 14e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * limitations under the License. 15e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie */ 16e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 17e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/core/event.h" 18e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/core/event_loop.h" 19b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol#include "chre/core/event_loop_manager.h" 20e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/core/init.h" 21e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/core/nanoapp.h" 22f53ddfb0683e210f9cf803d968c2d8c5d3b00a55Andrew Rossignol#include "chre/core/static_nanoapps.h" 23388d81b80425f66acb306c774e46d53221d36b33Andrew Rossignol#include "chre/platform/context.h" 24e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/platform/log.h" 252003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol#include "chre/platform/shared/platform_log.h" 26e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/platform/system_timer.h" 27e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/util/time.h" 28e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 29e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include <csignal> 30b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol#include <tclap/CmdLine.h> 31cc39d7566ed61c7127020228e1439a49e07074f9Brian Duddie#include <thread> 32e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 339526b7b52ed3e6cb198c649f582877acb27f1c56Andrew Rossignolusing chre::EventLoopManagerSingleton; 34e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddieusing chre::Milliseconds; 35e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 36b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol//! A description of the simulator. 37b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignolconstexpr char kSimDescription[] = "A simulation environment for the Context " 38b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol "Hub Runtime Environment (CHRE)"; 39b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol 40b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol//! The version of the simulator. This is not super important but is assigned by 41b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol//! rules of semantic versioning. 42b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignolconstexpr char kSimVersion[] = "0.1.0"; 43b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol 44e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddienamespace { 45e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 46e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddieextern "C" void signalHandler(int sig) { 47e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie (void) sig; 48e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie LOGI("Stop request received"); 499526b7b52ed3e6cb198c649f582877acb27f1c56Andrew Rossignol EventLoopManagerSingleton::get()->getEventLoop().stop(); 50e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie} 51e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 52e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie} 53e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 54b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignolint main(int argc, char **argv) { 55b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol try { 56fc4d354a2ad34172f508a9017b49747b9193eaf8Andrew Rossignol // Parse command-line arguments. 57b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol TCLAP::CmdLine cmd(kSimDescription, ' ', kSimVersion); 58fc4d354a2ad34172f508a9017b49747b9193eaf8Andrew Rossignol TCLAP::SwitchArg no_static_nanoapps_arg("", "no_static_nanoapps", 59fc4d354a2ad34172f508a9017b49747b9193eaf8Andrew Rossignol "disable running static nanoapps", cmd, false); 60fc4d354a2ad34172f508a9017b49747b9193eaf8Andrew Rossignol TCLAP::MultiArg<std::string> nanoapps_arg("", "nanoapp", 61fc4d354a2ad34172f508a9017b49747b9193eaf8Andrew Rossignol "a nanoapp shared object to load and execute", false, "path", cmd); 62b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol cmd.parse(argc, argv); 63b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol 64b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol // Initialize the system. 65b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol chre::PlatformLogSingleton::init(); 66b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol chre::init(); 67b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol 68b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol // Register a signal handler. 69b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol std::signal(SIGINT, signalHandler); 70e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 71b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol // Load any static nanoapps and start the event loop. 72b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol std::thread chreThread([&]() { 73fc4d354a2ad34172f508a9017b49747b9193eaf8Andrew Rossignol // Load static nanoapps unless they are disabled by a command-line flag. 74fc4d354a2ad34172f508a9017b49747b9193eaf8Andrew Rossignol if (!no_static_nanoapps_arg.getValue()) { 75fc4d354a2ad34172f508a9017b49747b9193eaf8Andrew Rossignol chre::loadStaticNanoapps(); 76fc4d354a2ad34172f508a9017b49747b9193eaf8Andrew Rossignol } 77fc4d354a2ad34172f508a9017b49747b9193eaf8Andrew Rossignol 78fc4d354a2ad34172f508a9017b49747b9193eaf8Andrew Rossignol // Load dynamic nanoapps specified on the command-line. 79fc4d354a2ad34172f508a9017b49747b9193eaf8Andrew Rossignol chre::DynamicVector<chre::UniquePtr<chre::Nanoapp>> dynamicNanoapps; 80fc4d354a2ad34172f508a9017b49747b9193eaf8Andrew Rossignol for (const auto& nanoapp : nanoapps_arg.getValue()) { 81fc4d354a2ad34172f508a9017b49747b9193eaf8Andrew Rossignol dynamicNanoapps.push_back(chre::MakeUnique<chre::Nanoapp>()); 82fc4d354a2ad34172f508a9017b49747b9193eaf8Andrew Rossignol dynamicNanoapps.back()->loadFromFile(nanoapp); 83fc4d354a2ad34172f508a9017b49747b9193eaf8Andrew Rossignol EventLoopManagerSingleton::get()->getEventLoop() 84fc4d354a2ad34172f508a9017b49747b9193eaf8Andrew Rossignol .startNanoapp(dynamicNanoapps.back()); 85fc4d354a2ad34172f508a9017b49747b9193eaf8Andrew Rossignol } 86fc4d354a2ad34172f508a9017b49747b9193eaf8Andrew Rossignol 87b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol EventLoopManagerSingleton::get()->getEventLoop().run(); 88b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol }); 89b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol chreThread.join(); 90e969b9be8eca27ffc875167879ab0ec093b3e313Andrew Rossignol 91b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol chre::deinit(); 92b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol chre::PlatformLogSingleton::deinit(); 93b70b2e230d5976533ea70dbb3077a5d28f4d8debAndrew Rossignol } catch (TCLAP::ExitException) {} 94e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 95e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie return 0; 96e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie} 97