/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "chre/core/init.h" #include "chre/core/event.h" #include "chre/core/event_loop.h" #include "chre/core/event_loop_manager.h" #include "chre/core/nanoapp.h" #include "chre/core/static_nanoapps.h" #ifdef CHRE_AUDIO_SUPPORT_ENABLED #include "chre/platform/platform_audio.h" #endif // CHRE_AUDIO_SUPPORT_ENABLED #include "chre/platform/context.h" #include "chre/platform/fatal_error.h" #include "chre/platform/linux/platform_log.h" #include "chre/platform/linux/task_util/task_manager.h" #include "chre/platform/log.h" #include "chre/platform/system_timer.h" #include "chre/util/time.h" #include #include #include using chre::EventLoopManagerSingleton; using chre::Milliseconds; //! A description of the simulator. constexpr char kSimDescription[] = "A simulation environment for the Context Hub Runtime Environment (CHRE)"; //! The version of the simulator. This is not super important but is assigned by //! rules of semantic versioning. constexpr char kSimVersion[] = "0.1.0"; namespace { extern "C" void signalHandler(int sig) { (void)sig; LOGI("Stop request received"); EventLoopManagerSingleton::get()->getEventLoop().stop(); } } // namespace int main(int argc, char **argv) { try { // Parse command-line arguments. TCLAP::CmdLine cmd(kSimDescription, ' ', kSimVersion); TCLAP::SwitchArg noStaticNanoappsArg("", "no_static_nanoapps", "disable running static nanoapps", cmd, false); TCLAP::MultiArg nanoappsArg( "", "nanoapp", "nanoapp shared object to load and execute", false, "path", cmd); #ifdef CHRE_AUDIO_SUPPORT_ENABLED TCLAP::ValueArg audioFileArg( "", "audio_file", "WAV file to open for audio simulation", false, "", "path", cmd); TCLAP::ValueArg minAudioBufSizeArg( "", "min_audio_buf_size", "min buffer size for audio simulation", false, 1.0, "seconds", cmd); TCLAP::ValueArg maxAudioBufSizeArg( "", "max_audio_buf_size", "max buffer size for audio simulation", false, 10.0, "seconds", cmd); #endif // CHRE_AUDIO_SUPPORT_ENABLED cmd.parse(argc, argv); // Initialize logging. chre::PlatformLogSingleton::init(); #ifdef CHRE_AUDIO_SUPPORT_ENABLED // Initialize audio sources. if (!audioFileArg.getValue().empty()) { auto audioSource = chre::MakeUnique( audioFileArg.getValue(), minAudioBufSizeArg.getValue(), maxAudioBufSizeArg.getValue()); chre::PlatformAudio::addAudioSource(audioSource); } // TODO(P1-d24c82): Add another command line argument that takes a json // configuration to support multiple sources. #endif // CHRE_AUDIO_SUPPORT_ENABLED // Initialize the TaskManager. chre::TaskManagerSingleton::init(); // Initialize the system. chre::init(); // Register a signal handler. std::signal(SIGINT, signalHandler); // Load any static nanoapps and start the event loop. std::thread chreThread([&]() { EventLoopManagerSingleton::get()->lateInit(); // Load static nanoapps unless they are disabled by a command-line flag. if (!noStaticNanoappsArg.getValue()) { chre::loadStaticNanoapps(); } // Load dynamic nanoapps specified on the command-line. chre::DynamicVector> dynamicNanoapps; for (const auto &nanoapp : nanoappsArg.getValue()) { dynamicNanoapps.push_back(chre::MakeUnique()); dynamicNanoapps.back()->loadFromFile(nanoapp); EventLoopManagerSingleton::get()->getEventLoop().startNanoapp( dynamicNanoapps.back()); } EventLoopManagerSingleton::get()->getEventLoop().run(); }); chreThread.join(); chre::TaskManagerSingleton::deinit(); chre::deinit(); chre::PlatformLogSingleton::deinit(); } catch (TCLAP::ExitException) { } return 0; }