xref: /ide/tools/previewer/ThinPreviewer.cpp (revision 7c804472)
1/*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include <VirtualScreen.h>
17#include <cstdint>
18#include <cstdlib>
19#include <fstream>
20#include <vector>
21#include <new>
22#include "CommandLineFactory.h"
23#include "CommandLineInterface.h"
24#include "CommandParser.h"
25#include "CppTimerManager.h"
26#include "CrashHandler.h"
27#include "Interrupter.h"
28#include "JsAppImpl.h"
29#include "ModelManager.h"
30#include "PreviewerEngineLog.h"
31#include "SharedData.h"
32#include "TimerTaskHandler.h"
33#include "TraceTool.h"
34#include "VirtualScreenImpl.h"
35#include "jsi.h"
36
37static const int NOTIFY_INTERVAL_TIME = 1000; // Unit millisecond
38
39static void InitSettings()
40{
41    // Setting the Simulator Model
42    ModelManager::SetCurrentDevice(CommandParser::GetInstance().GetDeviceType());
43    VirtualScreenImpl::GetInstance().InitResolution();
44    VirtualScreenImpl::GetInstance().InitFrameCountTimer();
45}
46
47static void ApplyConfig()
48{
49    std::string liteConfigArgs = CommandParser::GetInstance().GetConfigPath();
50    if (liteConfigArgs.empty()) {
51        ELOG("No persistent properties path found.");
52    }
53    CommandLineInterface::GetInstance().ReadAndApplyConfig(liteConfigArgs);
54}
55
56static void DataChangeCheck()
57{
58    SharedDataManager::CheckTick();
59}
60
61static void InitSharedData()
62{
63    // The brightness ranges from 1 to 255. The default value is 255.
64    SharedData<uint8_t>(SharedDataType::BRIGHTNESS_VALUE, 255, 1, 255);
65    SharedData<uint8_t>(SharedDataType::BRIGHTNESS_MODE, (uint8_t)BrightnessMode::MANUAL,
66                        (uint8_t)BrightnessMode::MANUAL, (uint8_t)BrightnessMode::AUTO);
67    SharedData<bool>(SharedDataType::KEEP_SCREEN_ON, true);
68    SharedData<uint8_t>(SharedDataType::BATTERY_STATUS, (uint8_t)ChargeState::NOCHARGE,
69                        (uint8_t)ChargeState::NOCHARGE, (uint8_t)ChargeState::CHARGING);
70    // Battery level range: 0.0–1.0; default: 1.0
71    SharedData<double>(SharedDataType::BATTERY_LEVEL, 1.0, 0.0, 1.0);
72    // Heart rate range: 0 to 255. The default value is 80.
73    SharedData<uint8_t>(SharedDataType::HEARTBEAT_VALUE, 80, 0, 255);
74    // The value ranges from 0 to 999999. The default value is 0.
75    SharedData<uint32_t>(SharedDataType::SUMSTEP_VALUE, 0, 0, 999999);
76    // The volume ranges from 0.0 to 1.0. The default value is 1.0.
77    SharedData<double>(SharedDataType::VOLUME_VALUE, 1.0, 0.0, 1.0);
78    // The atmospheric pressure ranges from 0 to 999900. The default value is 101325.
79    SharedData<uint32_t>(SharedDataType::PRESSURE_VALUE, 101325, 0, 999900);
80    SharedData<bool>(SharedDataType::WEARING_STATE, true);
81    SharedData<std::string>(SharedDataType::LANGUAGE, "zh-CN");
82    // The value ranges from 180 to 180. The default value is 0.
83    SharedData<double>(SharedDataType::LONGITUDE, 0, -180, 180);
84    // The value ranges from -90 to 90. The default value is 0.
85    SharedData<double>(SharedDataType::LATITUDE, 0, -90, 90);
86}
87
88static void NewHandler()
89{
90    ELOG("Custom new handler: memory allocation failed.");
91}
92
93static void SendJsHeapData()
94{
95    OHOS::ACELite::JSHeapStatus status;
96    OHOS::ACELite::JSI::GetJSHeapStatus(status);
97    CommandLineInterface::GetInstance().SendJSHeapMemory(status.totalBytes, status.allocBytes, status.peakAllocBytes);
98}
99
100int main(int argc, char* argv[])
101{
102    ILOG("ThinPreviewer enter the main function.");
103    std::set_new_handler(NewHandler);
104    // thin device global exception handler
105    auto thinCrashHandler = std::make_unique<CrashHandler>();
106    thinCrashHandler->InitExceptionHandler();
107    // Creating a Main Thread Timer Manager
108    CppTimerManager& manager = CppTimerManager::GetTimerManager();
109    // Parsing User Commands
110    CommandParser& parser = CommandParser::GetInstance();
111    int ret = parser.ParseArgs(argc, argv);
112    if (ret >= 0) {
113        return ret;
114    }
115    InitSharedData();
116    InitSettings();
117    if (parser.IsSet("s")) {
118        CommandLineInterface::GetInstance().Init(parser.Value("s"));
119    }
120    ApplyConfig();
121    JsAppImpl::GetInstance().InitJsApp();
122    TraceTool::GetInstance().HandleTrace("Enter the main function");
123    CppTimer dataCheckTimer(DataChangeCheck);
124    manager.AddCppTimer(dataCheckTimer);
125    dataCheckTimer.Start(100); // 100ms Timer polling period
126    CppTimer jsHeapSendTimer(SendJsHeapData);
127    if (parser.IsSendJSHeap()) {
128        manager.AddCppTimer(jsHeapSendTimer);
129        jsHeapSendTimer.Start(NOTIFY_INTERVAL_TIME); // 1000ms Timer polling period
130    }
131    // Registering and monitoring the changes of the brightness and volume
132    std::thread::id curThreadId = std::this_thread::get_id();
133    SharedData<uint8_t>::AppendNotify(SharedDataType::BRIGHTNESS_VALUE,
134                                      TimerTaskHandler::CheckBrightnessValueChanged, curThreadId);
135    while (!Interrupter::IsInterrupt()) {
136        CommandLineInterface::GetInstance().ProcessCommand();
137        manager.RunTimerTick();
138        std::this_thread::sleep_for(std::chrono::milliseconds(1));
139    }
140    JsAppImpl::GetInstance().Stop();
141    std::this_thread::sleep_for(std::chrono::milliseconds(500)); // sleep 500 ms
142    return 0;
143}
144